ld/testsuite/
2076-02-05 H.J. Lu <hongjiu.lu@intel.com> * ld-i386/pcrel16.d: Undo the last change. * ld-x86-64/pcrel16.d: Likewise. opcodes/ 2076-02-05 H.J. Lu <hongjiu.lu@intel.com> * i386-dis.c (OP_J): Undo the last change. Properly handle 64K wrap around within the same segment in 16bit mode.
This commit is contained in:
parent
f1ab23406b
commit
65ca155d27
|
@ -1,3 +1,8 @@
|
||||||
|
2076-02-05 H.J. Lu <hongjiu.lu@intel.com>
|
||||||
|
|
||||||
|
* ld-i386/pcrel16.d: Undo the last change.
|
||||||
|
* ld-x86-64/pcrel16.d: Likewise.
|
||||||
|
|
||||||
2076-02-02 H.J. Lu <hongjiu.lu@intel.com>
|
2076-02-02 H.J. Lu <hongjiu.lu@intel.com>
|
||||||
|
|
||||||
* ld-i386/pcrel16.d: Updated.
|
* ld-i386/pcrel16.d: Updated.
|
||||||
|
|
|
@ -12,4 +12,4 @@ Disassembly of section .text:
|
||||||
420: cd 42[ ]+int \$0x42
|
420: cd 42[ ]+int \$0x42
|
||||||
422: ca 02 00[ ]+lret \$0x2
|
422: ca 02 00[ ]+lret \$0x2
|
||||||
...
|
...
|
||||||
f065: e9 b8 13[ ]+jmp 10420 <__bss_start\+0x3b8>
|
f065: e9 b8 13[ ]+jmp 420 <_start\+0x420>
|
||||||
|
|
|
@ -12,4 +12,4 @@ Disassembly of section .text:
|
||||||
420: cd 42[ ]+int \$0x42
|
420: cd 42[ ]+int \$0x42
|
||||||
422: ca 02 00[ ]+lret \$0x2
|
422: ca 02 00[ ]+lret \$0x2
|
||||||
...
|
...
|
||||||
f065: e9 b8 13[ ]+jmp 10420 <_start\+0x10420>
|
f065: e9 b8 13[ ]+jmp 420 <_start\+0x420>
|
||||||
|
|
|
@ -1,3 +1,8 @@
|
||||||
|
2076-02-05 H.J. Lu <hongjiu.lu@intel.com>
|
||||||
|
|
||||||
|
* i386-dis.c (OP_J): Undo the last change. Properly handle 64K
|
||||||
|
wrap around within the same segment in 16bit mode.
|
||||||
|
|
||||||
2076-02-02 H.J. Lu <hongjiu.lu@intel.com>
|
2076-02-02 H.J. Lu <hongjiu.lu@intel.com>
|
||||||
|
|
||||||
* i386-dis.c (OP_J): Mask to 16bit only if there is a data16
|
* i386-dis.c (OP_J): Mask to 16bit only if there is a data16
|
||||||
|
|
|
@ -4901,6 +4901,7 @@ OP_J (int bytemode, int sizeflag)
|
||||||
{
|
{
|
||||||
bfd_vma disp;
|
bfd_vma disp;
|
||||||
bfd_vma mask = -1;
|
bfd_vma mask = -1;
|
||||||
|
bfd_vma segment = 0;
|
||||||
|
|
||||||
switch (bytemode)
|
switch (bytemode)
|
||||||
{
|
{
|
||||||
|
@ -4918,11 +4919,14 @@ OP_J (int bytemode, int sizeflag)
|
||||||
disp = get16 ();
|
disp = get16 ();
|
||||||
if ((disp & 0x8000) != 0)
|
if ((disp & 0x8000) != 0)
|
||||||
disp -= 0x10000;
|
disp -= 0x10000;
|
||||||
/* For some reason, a data16 prefix on a jump instruction
|
/* In 16bit mode, address is wrapped around at 64k within
|
||||||
means that the pc is masked to 16 bits after the
|
the same segment. Otherwise, a data16 prefix on a jump
|
||||||
displacement is added! */
|
instruction means that the pc is masked to 16 bits after
|
||||||
if ((prefixes & PREFIX_DATA) != 0)
|
the displacement is added! */
|
||||||
mask = 0xffff;
|
mask = 0xffff;
|
||||||
|
if ((prefixes & PREFIX_DATA) == 0)
|
||||||
|
segment = ((start_pc + codep - start_codep)
|
||||||
|
& ~((bfd_vma) 0xffff));
|
||||||
}
|
}
|
||||||
used_prefixes |= (prefixes & PREFIX_DATA);
|
used_prefixes |= (prefixes & PREFIX_DATA);
|
||||||
break;
|
break;
|
||||||
|
@ -4930,7 +4934,7 @@ OP_J (int bytemode, int sizeflag)
|
||||||
oappend (INTERNAL_DISASSEMBLER_ERROR);
|
oappend (INTERNAL_DISASSEMBLER_ERROR);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
disp = (start_pc + codep - start_codep + disp) & mask;
|
disp = ((start_pc + codep - start_codep + disp) & mask) | segment;
|
||||||
set_op (disp, 0);
|
set_op (disp, 0);
|
||||||
print_operand_value (scratchbuf, 1, disp);
|
print_operand_value (scratchbuf, 1, disp);
|
||||||
oappend (scratchbuf);
|
oappend (scratchbuf);
|
||||||
|
|
Loading…
Reference in New Issue