|
From: Jeremy F. <je...@go...> - 2005-01-05 00:54:43
|
CVS commit by fitzhardinge:
The size of a GETSEG (mov %seg, %reg) matters. If it is 32-bits,
then the 16 MSB of the destination reg are cleared; otherwise they're
left untouched.
A none/tests/getseg.c 1.1 [no copyright]
A none/tests/getseg.stderr.exp 1.1
A none/tests/getseg.stdout.exp 1.1
A none/tests/getseg.vgtest 1.1
M +1 -2 coregrind/vg_from_ucode.c 1.85
M +9 -8 coregrind/vg_to_ucode.c 1.150
M +1 -1 coregrind/vg_translate.c 1.93
M +1 -1 memcheck/mc_translate.c 1.44
M +3 -1 none/tests/Makefile.am 1.53
--- valgrind/coregrind/vg_from_ucode.c #1.84:1.85
@@ -3688,7 +3688,6 @@ static void emitUInstr ( UCodeBlock* cb,
vg_assert(u->tag1 == ArchRegS);
vg_assert(u->tag2 == RealReg);
- vg_assert(u->size == 2);
synth_mov_offregmem_reg (
- 4,
+ u->size,
segRegOffset( u->val1 ),
R_EBP,
--- valgrind/coregrind/vg_to_ucode.c #1.149:1.150
@@ -3230,5 +3230,6 @@ static
Addr dis_mov_Sw_Ew ( UCodeBlock* cb,
UChar sorb,
- Addr eip0 )
+ Addr eip0,
+ Int sz )
{
UChar rm = getUChar(eip0);
@@ -3237,7 +3238,7 @@ Addr dis_mov_Sw_Ew ( UCodeBlock* cb,
if (epartIsReg(rm)) {
Int tmpv = newTemp(cb);
- uInstr2(cb, GETSEG, 2, ArchRegS, gregOfRM(rm), TempReg, tmpv);
- uInstr2(cb, PUT, 2, TempReg, tmpv, ArchReg, eregOfRM(rm));
- DIP("movw %s,%s\n", nameSReg(gregOfRM(rm)), nameIReg(2,eregOfRM(rm)));
+ uInstr2(cb, GETSEG, sz, ArchRegS, gregOfRM(rm), TempReg, tmpv);
+ uInstr2(cb, PUT, sz, TempReg, tmpv, ArchReg, eregOfRM(rm));
+ DIP("mov%c %s,%s\n", nameISize(sz), nameSReg(gregOfRM(rm)), nameIReg(sz,eregOfRM(rm)));
return 1+eip0;
}
@@ -3248,7 +3249,7 @@ Addr dis_mov_Sw_Ew ( UCodeBlock* cb,
Int tmpa = LOW24(pair);
Int tmpv = newTemp(cb);
- uInstr2(cb, GETSEG, 2, ArchRegS, gregOfRM(rm), TempReg, tmpv);
- uInstr2(cb, STORE, 2, TempReg, tmpv, TempReg, tmpa);
- DIP("mov %s,%s\n", nameSReg(gregOfRM(rm)), dis_buf);
+ uInstr2(cb, GETSEG, sz, ArchRegS, gregOfRM(rm), TempReg, tmpv);
+ uInstr2(cb, STORE, sz, TempReg, tmpv, TempReg, tmpa);
+ DIP("mov%c %s,%s\n", nameISize(sz), nameSReg(gregOfRM(rm)), dis_buf);
return HI8(pair)+eip0;
}
@@ -5635,5 +5636,5 @@ static Addr disInstr ( UCodeBlock* cb, A
case 0x8C: /* MOV Sw,Ew -- MOV from a SEGMENT REGISTER */
- eip = dis_mov_Sw_Ew(cb, sorb, eip);
+ eip = dis_mov_Sw_Ew(cb, sorb, eip, sz);
break;
--- valgrind/coregrind/vg_translate.c #1.92:1.93
@@ -548,5 +548,5 @@ static Bool is_sane_UInstr ( UInstr* u )
/* Fields checked: lit32 size flags_r/w tag1 tag2 tag3 (rest) */
case PUTSEG: return LIT0 && SZ2 && CC0 && TR1 && Se2 && N3 && XOTHER;
- case GETSEG: return LIT0 && SZ2 && CC0 && Se1 && TR2 && N3 && XOTHER;
+ case GETSEG: return LIT0 && SZ42 && CC0 && Se1 && TR2 && N3 && XOTHER;
case USESEG: return LIT0 && SZ0 && CC0 && TR1 && TR2 && N3 && XOTHER;
case NOP: return LIT0 && SZ0 && CC0 && N1 && N2 && N3 && XOTHER;
--- valgrind/memcheck/mc_translate.c #1.43:1.44
@@ -559,5 +559,5 @@ static UCodeBlock* memcheck_instrument (
case GETSEG:
sk_assert(u_in->tag2 == TempReg);
- uInstr1(cb, SETV, 2, TempReg, SHADOW(u_in->val2));
+ uInstr1(cb, SETV, u_in->size, TempReg, SHADOW(u_in->val2));
VG_(copy_UInstr)(cb, u_in);
break;
--- valgrind/none/tests/Makefile.am #1.52:1.53
@@ -26,4 +26,5 @@
fork.stderr.exp fork.stdout.exp fork.vgtest \
fucomip.stderr.exp fucomip.vgtest \
+ getseg.stdout.exp getseg.vgtest \
gxx304.stderr.exp gxx304.vgtest \
map_unaligned.stderr.exp map_unaligned.vgtest \
@@ -57,5 +58,5 @@
args bitfield1 closeall coolo_strlen \
discard exec-sigmask execve fcntl_setown floored fork \
- fucomip \
+ fucomip getseg \
munmap_exe map_unaligned map_unmap mq mremap rcrl readline1 \
resolv rlimit_nofile sem semlimit sha1_test \
@@ -81,4 +82,5 @@
floored_LDADD = -lm
fucomip_SOURCES = fucomip.c
+getseg_SOURCES = getseg.c
map_unaligned_SOURCES = map_unaligned.c
map_unmap_SOURCES = map_unmap.c
|