Revision 3b22c470 helper-i386.c
b/helper-i386.c | ||
---|---|---|
285 | 285 |
|
286 | 286 |
/* XXX: check that enough room is available */ |
287 | 287 |
if (new_stack) { |
288 |
old_esp = env->regs[R_ESP];
|
|
288 |
old_esp = ESP;
|
|
289 | 289 |
old_ss = env->segs[R_SS].selector; |
290 | 290 |
load_seg(R_SS, ss, env->eip); |
291 | 291 |
} else { |
292 | 292 |
old_esp = 0; |
293 | 293 |
old_ss = 0; |
294 |
esp = env->regs[R_ESP];
|
|
294 |
esp = ESP;
|
|
295 | 295 |
} |
296 | 296 |
if (is_int) |
297 | 297 |
old_eip = next_eip; |
... | ... | |
300 | 300 |
old_cs = env->segs[R_CS].selector; |
301 | 301 |
load_seg(R_CS, selector, env->eip); |
302 | 302 |
env->eip = offset; |
303 |
env->regs[R_ESP] = esp - push_size;
|
|
303 |
ESP = esp - push_size;
|
|
304 | 304 |
ssp = env->segs[R_SS].base + esp; |
305 | 305 |
if (shift == 1) { |
306 | 306 |
int old_eflags; |
... | ... | |
374 | 374 |
ptr = dt->base + intno * 4; |
375 | 375 |
offset = lduw(ptr); |
376 | 376 |
selector = lduw(ptr + 2); |
377 |
esp = env->regs[R_ESP];
|
|
377 |
esp = ESP;
|
|
378 | 378 |
ssp = env->segs[R_SS].base; |
379 | 379 |
if (is_int) |
380 | 380 |
old_eip = next_eip; |
... | ... | |
389 | 389 |
stw(ssp + (esp & 0xffff), old_eip); |
390 | 390 |
|
391 | 391 |
/* update processor state */ |
392 |
env->regs[R_ESP] = (env->regs[R_ESP] & ~0xffff) | (esp & 0xffff);
|
|
392 |
ESP = (ESP & ~0xffff) | (esp & 0xffff);
|
|
393 | 393 |
env->eip = offset; |
394 | 394 |
env->segs[R_CS].selector = selector; |
395 | 395 |
env->segs[R_CS].base = (uint8_t *)(selector << 4); |
... | ... | |
784 | 784 |
|
785 | 785 |
new_cs = T0; |
786 | 786 |
new_eip = T1; |
787 |
esp = env->regs[R_ESP];
|
|
787 |
esp = ESP;
|
|
788 | 788 |
esp_mask = 0xffffffff; |
789 | 789 |
if (!(env->segs[R_SS].flags & DESC_B_MASK)) |
790 | 790 |
esp_mask = 0xffff; |
... | ... | |
802 | 802 |
} |
803 | 803 |
|
804 | 804 |
if (!(env->segs[R_SS].flags & DESC_B_MASK)) |
805 |
env->regs[R_ESP] = (env->regs[R_ESP] & ~0xffff) | (esp & 0xffff);
|
|
805 |
ESP = (ESP & ~0xffff) | (esp & 0xffff);
|
|
806 | 806 |
else |
807 |
env->regs[R_ESP] = esp;
|
|
807 |
ESP = esp;
|
|
808 | 808 |
env->eip = new_eip; |
809 | 809 |
env->segs[R_CS].selector = new_cs; |
810 | 810 |
env->segs[R_CS].base = (uint8_t *)(new_cs << 4); |
... | ... | |
846 | 846 |
if (!(e2 & DESC_P_MASK)) |
847 | 847 |
raise_exception_err(EXCP0B_NOSEG, new_cs & 0xfffc); |
848 | 848 |
|
849 |
sp = env->regs[R_ESP];
|
|
849 |
sp = ESP;
|
|
850 | 850 |
if (!(env->segs[R_SS].flags & DESC_B_MASK)) |
851 | 851 |
sp &= 0xffff; |
852 | 852 |
ssp = env->segs[R_SS].base + sp; |
... | ... | |
868 | 868 |
raise_exception_err(EXCP0D_GPF, new_cs & 0xfffc); |
869 | 869 |
/* from this point, not restartable */ |
870 | 870 |
if (!(env->segs[R_SS].flags & DESC_B_MASK)) |
871 |
env->regs[R_ESP] = (env->regs[R_ESP] & 0xffff0000) | (sp & 0xffff);
|
|
871 |
ESP = (ESP & 0xffff0000) | (sp & 0xffff);
|
|
872 | 872 |
else |
873 |
env->regs[R_ESP] = sp;
|
|
873 |
ESP = sp;
|
|
874 | 874 |
env->segs[R_CS].base = sc1.base; |
875 | 875 |
env->segs[R_CS].limit = sc1.limit; |
876 | 876 |
env->segs[R_CS].flags = sc1.flags; |
... | ... | |
938 | 938 |
param_count = e2 & 0x1f; |
939 | 939 |
push_size = ((param_count * 2) + 8) << shift; |
940 | 940 |
|
941 |
old_esp = env->regs[R_ESP];
|
|
941 |
old_esp = ESP;
|
|
942 | 942 |
old_ss = env->segs[R_SS].selector; |
943 | 943 |
if (!(env->segs[R_SS].flags & DESC_B_MASK)) |
944 | 944 |
old_esp &= 0xffff; |
... | ... | |
995 | 995 |
load_seg(R_CS, selector, env->eip); |
996 | 996 |
/* from this point, not restartable if same priviledge */ |
997 | 997 |
if (!(env->segs[R_SS].flags & DESC_B_MASK)) |
998 |
env->regs[R_ESP] = (env->regs[R_ESP] & 0xffff0000) | (sp & 0xffff);
|
|
998 |
ESP = (ESP & 0xffff0000) | (sp & 0xffff);
|
|
999 | 999 |
else |
1000 |
env->regs[R_ESP] = sp;
|
|
1000 |
ESP = sp;
|
|
1001 | 1001 |
EIP = offset; |
1002 | 1002 |
} |
1003 | 1003 |
} |
... | ... | |
1020 | 1020 |
uint8_t *ssp; |
1021 | 1021 |
int eflags_mask; |
1022 | 1022 |
|
1023 |
sp = env->regs[R_ESP] & 0xffff;
|
|
1023 |
sp = ESP & 0xffff;
|
|
1024 | 1024 |
ssp = env->segs[R_SS].base + sp; |
1025 | 1025 |
if (shift == 1) { |
1026 | 1026 |
/* 32 bits */ |
... | ... | |
1034 | 1034 |
new_eip = lduw(ssp); |
1035 | 1035 |
} |
1036 | 1036 |
new_esp = sp + (6 << shift); |
1037 |
env->regs[R_ESP] = (env->regs[R_ESP] & 0xffff0000) |
|
|
1037 |
ESP = (ESP & 0xffff0000) |
|
|
1038 | 1038 |
(new_esp & 0xffff); |
1039 | 1039 |
load_seg_vm(R_CS, new_cs); |
1040 | 1040 |
env->eip = new_eip; |
... | ... | |
1053 | 1053 |
int cpl, dpl, rpl, eflags_mask; |
1054 | 1054 |
uint8_t *ssp; |
1055 | 1055 |
|
1056 |
sp = env->regs[R_ESP];
|
|
1056 |
sp = ESP;
|
|
1057 | 1057 |
if (!(env->segs[R_SS].flags & DESC_B_MASK)) |
1058 | 1058 |
sp &= 0xffff; |
1059 | 1059 |
ssp = env->segs[R_SS].base + sp; |
... | ... | |
1129 | 1129 |
load_seg(R_SS, new_ss, env->eip); |
1130 | 1130 |
} |
1131 | 1131 |
if (env->segs[R_SS].flags & DESC_B_MASK) |
1132 |
env->regs[R_ESP] = new_esp;
|
|
1132 |
ESP = new_esp;
|
|
1133 | 1133 |
else |
1134 |
env->regs[R_ESP] = (env->regs[R_ESP] & 0xffff0000) |
|
|
1134 |
ESP = (ESP & 0xffff0000) |
|
|
1135 | 1135 |
(new_esp & 0xffff); |
1136 | 1136 |
env->eip = new_eip; |
1137 | 1137 |
if (is_iret) { |
... | ... | |
1164 | 1164 |
load_seg_vm(R_GS, new_gs); |
1165 | 1165 |
|
1166 | 1166 |
env->eip = new_eip; |
1167 |
env->regs[R_ESP] = new_esp;
|
|
1167 |
ESP = new_esp;
|
|
1168 | 1168 |
} |
1169 | 1169 |
|
1170 | 1170 |
void helper_iret_protected(int shift) |
Also available in: Unified diff