void dis_push_segreg ( UCodeBlock* cb, UInt sreg, Int sz )
{
Int t1 = newTemp(cb), t2 = newTemp(cb);
- vg_assert(sz == 4);
+ vg_assert(sz == 2 || sz == 4);
uInstr2(cb, GETSEG, 2, ArchRegS, sreg, TempReg, t1);
uInstr2(cb, GET, 4, ArchReg, R_ESP, TempReg, t2);
uInstr2(cb, SUB, 4, Literal, 0, TempReg, t2);
- uLiteral(cb, 4);
+ uLiteral(cb, sz);
uInstr2(cb, PUT, 4, TempReg, t2, ArchReg, R_ESP);
uInstr2(cb, STORE, 2, TempReg, t1, TempReg, t2);
DIP("push %s\n", VG_(name_of_seg_reg)(sreg));
void dis_pop_segreg ( UCodeBlock* cb, UInt sreg, Int sz )
{
Int t1 = newTemp(cb), t2 = newTemp(cb);
- vg_assert(sz == 4);
+ vg_assert(sz == 2 || sz == 4);
uInstr2(cb, GET, 4, ArchReg, R_ESP, TempReg, t2);
uInstr2(cb, LOAD, 2, TempReg, t2, TempReg, t1);
uInstr2(cb, ADD, 4, Literal, 0, TempReg, t2);
munmap_exe.stderr.exp munmap_exe.vgtest \
pth_blockedsig.stderr.exp \
pth_blockedsig.stdout.exp pth_blockedsig.vgtest \
+ pushpopseg.stderr.exp pushpopseg.stdout.exp pushpopseg.vgtest \
rcl_assert.stderr.exp rcl_assert.vgtest \
rcrl.stderr.exp rcrl.stdout.exp rcrl.vgtest \
readline1.stderr.exp readline1.stdout.exp \
fucomip insn_basic insn_cmov insn_mmx insn_mmxext insn_sse insn_sse2 \
munmap_exe map_unmap mremap rcl_assert \
rcrl readline1 resolv seg_override sha1_test shortpush shorts smc1 \
- pth_blockedsig \
+ pth_blockedsig pushpopseg \
syscall-restart1 syscall-restart2 system \
coolo_sigaction gxx304 yield
map_unmap_SOURCES = map_unmap.c
mremap_SOURCES = mremap.c
munmap_exe_SOURCES = munmap_exe.c
+pushpopseg_SOURCES = pushpopseg.c
rcl_assert_SOURCES = rcl_assert.S
rcrl_SOURCES = rcrl.c
readline1_SOURCES = readline1.c
--- /dev/null
+#include <stdio.h>
+#include <stdlib.h>
+
+int main(int argc, char **argv)
+{
+ unsigned long sp1;
+ unsigned long sp2;
+ unsigned long sp3;
+ unsigned short fs1;
+ unsigned short fs2;
+
+ fs1 = 0x0003;
+
+ asm("movw %4, %%fs\n"
+ "movl %%esp, %0\n"
+ "pushw %%fs\n"
+ "movl %%esp, %1\n"
+ "popw %%fs\n"
+ "movl %%esp, %2\n"
+ "movw %%fs, %3\n"
+ : "=m" (sp1), "=m" (sp2), "=m" (sp3), "=m" (fs2)
+ : "m" (fs1)
+ : "ax"
+ );
+
+ printf("sp change after push = %d\n", sp2 - sp1);
+ printf("sp change after pop = %d\n", sp3 - sp2);
+ printf("fs after push and pop = %04x\n", fs1);
+
+ asm("movw %4, %%fs\n"
+ "movl %%esp, %0\n"
+ "pushl %%fs\n"
+ "movl %%esp, %1\n"
+ "popl %%fs\n"
+ "movl %%esp, %2\n"
+ "movw %%fs, %3\n"
+ : "=m" (sp1), "=m" (sp2), "=m" (sp3), "=m" (fs2)
+ : "m" (fs1)
+ : "ax"
+ );
+
+ printf("sp change after push = %d\n", sp2 - sp1);
+ printf("sp change after pop = %d\n", sp3 - sp2);
+ printf("fs after push and pop = %04x\n", fs1);
+
+ exit(0);
+}