Commit 001ebaca authored by Peter Maydell's avatar Peter Maydell
Browse files

disas/cris: Avoid unintended sign extension



In the cris disassembler we were using 'unsigned long' to calculate
addresses which are supposed to be 32 bits.  This meant that we might
accidentally sign extend or calculate a value that was outside the 32
bit range of the guest CPU.  Use 'uint32_t' instead so we give the
right answers on 64-bit hosts.

(Spotted by Coverity, CID 1005402, 1005403.)

Signed-off-by: default avatarPeter Maydell <peter.maydell@linaro.org>
Reviewed-by: default avatarEdgar E. Iglesias <edgar.iglesias@xilinx.com>
Reviewed-by: default avatarPhilippe Mathieu-Daudé <f4bug@amsat.org>
Message-id: 1488556233-31246-6-git-send-email-peter.maydell@linaro.org
parent 1d153a33
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -2009,7 +2009,7 @@ print_with_operands (const struct cris_opcode *opcodep,
      case 'n':
	{
	  /* Like N but pc-relative to the start of the insn.  */
	  unsigned long number
	  uint32_t number
	    = (buffer[2] + buffer[3] * 256 + buffer[4] * 65536
	       + buffer[5] * 0x1000000 + addr);

@@ -2201,7 +2201,7 @@ print_with_operands (const struct cris_opcode *opcodep,
		      {
			/* It's [pc+].  This cannot possibly be anything
			   but an address.  */
			unsigned long number
			uint32_t number
			  = prefix_buffer[2] + prefix_buffer[3] * 256
			  + prefix_buffer[4] * 65536
			  + prefix_buffer[5] * 0x1000000;