--- dyngen.c 11 Jul 2003 15:16:56 -0000 1.26 +++ dyngen.c 9 Aug 2003 02:52:25 -0000 @@ -687,7 +687,11 @@ if (val >= start_offset && val < start_offset + copy_size) { n = strtol(p, NULL, 10); +#if ( __GNUC__ == 3) && defined(__powerpc__) + fprintf(outfile, " label_offsets[%d] = %d + (gen_code_ptr - gen_code_buf);\n", n, val - start_offset + 4); +#else fprintf(outfile, " label_offsets[%d] = %d + (gen_code_ptr - gen_code_buf);\n", n, val - start_offset); +#endif } } } --- exec.h 26 Jul 2003 12:06:08 -0000 1.13 +++ exec.h 9 Aug 2003 02:52:26 -0000 @@ -210,6 +210,7 @@ label ## n:\ T0 = (long)(tbparam) + (n);\ EIP = eip;\ + EXIT_TB();\ } while (0) #else --- helper-i386.c 29 Jul 2003 20:53:01 -0000 1.11 +++ helper-i386.c 9 Aug 2003 02:52:27 -0000 @@ -285,13 +285,13 @@ /* XXX: check that enough room is available */ if (new_stack) { - old_esp = env->regs[R_ESP]; + old_esp = ESP; old_ss = env->segs[R_SS].selector; load_seg(R_SS, ss, env->eip); } else { old_esp = 0; old_ss = 0; - esp = env->regs[R_ESP]; + esp = ESP; } if (is_int) old_eip = next_eip; @@ -300,7 +300,7 @@ old_cs = env->segs[R_CS].selector; load_seg(R_CS, selector, env->eip); env->eip = offset; - env->regs[R_ESP] = esp - push_size; + ESP = esp - push_size; ssp = env->segs[R_SS].base + esp; if (shift == 1) { int old_eflags; @@ -374,7 +374,7 @@ ptr = dt->base + intno * 4; offset = lduw(ptr); selector = lduw(ptr + 2); - esp = env->regs[R_ESP]; + esp = ESP; ssp = env->segs[R_SS].base; if (is_int) old_eip = next_eip; @@ -389,7 +389,7 @@ stw(ssp + (esp & 0xffff), old_eip); /* update processor state */ - env->regs[R_ESP] = (env->regs[R_ESP] & ~0xffff) | (esp & 0xffff); + ESP = (ESP & ~0xffff) | (esp & 0xffff); env->eip = offset; env->segs[R_CS].selector = selector; env->segs[R_CS].base = (uint8_t *)(selector << 4); @@ -784,7 +784,7 @@ new_cs = T0; new_eip = T1; - esp = env->regs[R_ESP]; + esp = ESP; esp_mask = 0xffffffff; if (!(env->segs[R_SS].flags & DESC_B_MASK)) esp_mask = 0xffff; @@ -802,9 +802,9 @@ } if (!(env->segs[R_SS].flags & DESC_B_MASK)) - env->regs[R_ESP] = (env->regs[R_ESP] & ~0xffff) | (esp & 0xffff); + ESP = (ESP & ~0xffff) | (esp & 0xffff); else - env->regs[R_ESP] = esp; + ESP = esp; env->eip = new_eip; env->segs[R_CS].selector = new_cs; env->segs[R_CS].base = (uint8_t *)(new_cs << 4); @@ -846,7 +846,7 @@ if (!(e2 & DESC_P_MASK)) raise_exception_err(EXCP0B_NOSEG, new_cs & 0xfffc); - sp = env->regs[R_ESP]; + sp = ESP; if (!(env->segs[R_SS].flags & DESC_B_MASK)) sp &= 0xffff; ssp = env->segs[R_SS].base + sp; @@ -868,9 +868,9 @@ raise_exception_err(EXCP0D_GPF, new_cs & 0xfffc); /* from this point, not restartable */ if (!(env->segs[R_SS].flags & DESC_B_MASK)) - env->regs[R_ESP] = (env->regs[R_ESP] & 0xffff0000) | (sp & 0xffff); + ESP = (ESP & 0xffff0000) | (sp & 0xffff); else - env->regs[R_ESP] = sp; + ESP = sp; env->segs[R_CS].base = sc1.base; env->segs[R_CS].limit = sc1.limit; env->segs[R_CS].flags = sc1.flags; @@ -938,7 +938,7 @@ param_count = e2 & 0x1f; push_size = ((param_count * 2) + 8) << shift; - old_esp = env->regs[R_ESP]; + old_esp = ESP; old_ss = env->segs[R_SS].selector; if (!(env->segs[R_SS].flags & DESC_B_MASK)) old_esp &= 0xffff; @@ -995,11 +995,12 @@ load_seg(R_CS, selector, env->eip); /* from this point, not restartable if same priviledge */ if (!(env->segs[R_SS].flags & DESC_B_MASK)) - env->regs[R_ESP] = (env->regs[R_ESP] & 0xffff0000) | (sp & 0xffff); + ESP = (ESP & 0xffff0000) | (sp & 0xffff); else - env->regs[R_ESP] = sp; + ESP = sp; EIP = offset; } + } /* init the segment cache in vm86 mode */ @@ -1020,7 +1021,7 @@ uint8_t *ssp; int eflags_mask; - sp = env->regs[R_ESP] & 0xffff; + sp = ESP & 0xffff; ssp = env->segs[R_SS].base + sp; if (shift == 1) { /* 32 bits */ @@ -1034,7 +1035,7 @@ new_eip = lduw(ssp); } new_esp = sp + (6 << shift); - env->regs[R_ESP] = (env->regs[R_ESP] & 0xffff0000) | + ESP = (ESP & 0xffff0000) | (new_esp & 0xffff); load_seg_vm(R_CS, new_cs); env->eip = new_eip; @@ -1053,7 +1054,7 @@ int cpl, dpl, rpl, eflags_mask; uint8_t *ssp; - sp = env->regs[R_ESP]; + sp = ESP; if (!(env->segs[R_SS].flags & DESC_B_MASK)) sp &= 0xffff; ssp = env->segs[R_SS].base + sp; @@ -1129,9 +1130,9 @@ load_seg(R_SS, new_ss, env->eip); } if (env->segs[R_SS].flags & DESC_B_MASK) - env->regs[R_ESP] = new_esp; + ESP = new_esp; else - env->regs[R_ESP] = (env->regs[R_ESP] & 0xffff0000) | + ESP = (ESP & 0xffff0000) | (new_esp & 0xffff); env->eip = new_eip; if (is_iret) { @@ -1164,7 +1165,7 @@ load_seg_vm(R_GS, new_gs); env->eip = new_eip; - env->regs[R_ESP] = new_esp; + ESP = new_esp; } void helper_iret_protected(int shift)