Commit 970a87a6bb8dd0ac304a55aeed219e225fbbea38

Authored by bellard
1 parent d8bc1fd0

new segment access


git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@255 c046a42c-6fe2-441c-8c8c-71466251a162
cpu-exec.c
... ... @@ -178,21 +178,21 @@ int cpu_exec(CPUState *env1)
178 178 /* we compute the CPU state. We assume it will not
179 179 change during the whole generated block. */
180 180 #if defined(TARGET_I386)
181   - flags = env->seg_cache[R_CS].seg_32bit << GEN_FLAG_CODE32_SHIFT;
182   - flags |= env->seg_cache[R_SS].seg_32bit << GEN_FLAG_SS32_SHIFT;
183   - flags |= (((unsigned long)env->seg_cache[R_DS].base |
184   - (unsigned long)env->seg_cache[R_ES].base |
185   - (unsigned long)env->seg_cache[R_SS].base) != 0) <<
  181 + flags = env->segs[R_CS].seg_32bit << GEN_FLAG_CODE32_SHIFT;
  182 + flags |= env->segs[R_SS].seg_32bit << GEN_FLAG_SS32_SHIFT;
  183 + flags |= (((unsigned long)env->segs[R_DS].base |
  184 + (unsigned long)env->segs[R_ES].base |
  185 + (unsigned long)env->segs[R_SS].base) != 0) <<
186 186 GEN_FLAG_ADDSEG_SHIFT;
187 187 if (!(env->eflags & VM_MASK)) {
188   - flags |= (env->segs[R_CS] & 3) << GEN_FLAG_CPL_SHIFT;
  188 + flags |= (env->segs[R_CS].selector & 3) << GEN_FLAG_CPL_SHIFT;
189 189 } else {
190 190 /* NOTE: a dummy CPL is kept */
191 191 flags |= (1 << GEN_FLAG_VM_SHIFT);
192 192 flags |= (3 << GEN_FLAG_CPL_SHIFT);
193 193 }
194 194 flags |= (env->eflags & (IOPL_MASK | TF_MASK));
195   - cs_base = env->seg_cache[R_CS].base;
  195 + cs_base = env->segs[R_CS].base;
196 196 pc = cs_base + env->eip;
197 197 #elif defined(TARGET_ARM)
198 198 flags = 0;
... ... @@ -347,13 +347,13 @@ void cpu_x86_load_seg(CPUX86State *s, int seg_reg, int selector)
347 347 if (env->eflags & VM_MASK) {
348 348 SegmentCache *sc;
349 349 selector &= 0xffff;
350   - sc = &env->seg_cache[seg_reg];
  350 + sc = &env->segs[seg_reg];
351 351 /* NOTE: in VM86 mode, limit and seg_32bit are never reloaded,
352 352 so we must load them here */
353 353 sc->base = (void *)(selector << 4);
354 354 sc->limit = 0xffff;
355 355 sc->seg_32bit = 0;
356   - env->segs[seg_reg] = selector;
  356 + sc->selector = selector;
357 357 } else {
358 358 load_seg(seg_reg, selector, 0);
359 359 }
... ... @@ -426,7 +426,7 @@ static inline int handle_cpu_signal(unsigned long pc, unsigned long address,
426 426 return 0;
427 427 #if defined(TARGET_I386)
428 428 env->eip = found_pc - tb->cs_base;
429   - env->cr2 = address;
  429 + env->cr[2] = address;
430 430 /* we restore the process signal mask as the sigreturn should
431 431 do it (XXX: use sigsetjmp) */
432 432 sigprocmask(SIG_SETMASK, old_set, NULL);
... ...
linux-user/main.c
... ... @@ -176,7 +176,7 @@ void cpu_loop(CPUX86State *env)
176 176 info.si_code = TARGET_SEGV_MAPERR;
177 177 else
178 178 info.si_code = TARGET_SEGV_ACCERR;
179   - info._sifields._sigfault._addr = env->cr2;
  179 + info._sifields._sigfault._addr = env->cr[2];
180 180 queue_signal(info.si_signo, &info);
181 181 break;
182 182 case EXCP00_DIVZ:
... ... @@ -231,7 +231,7 @@ void cpu_loop(CPUX86State *env)
231 231 /* just indicate that signals should be handled asap */
232 232 break;
233 233 default:
234   - pc = env->seg_cache[R_CS].base + env->eip;
  234 + pc = env->segs[R_CS].base + env->eip;
235 235 fprintf(stderr, "qemu: 0x%08lx: unhandled CPU exception 0x%x - aborting\n",
236 236 (long)pc, trapnr);
237 237 abort();
... ...
ops_template.h
... ... @@ -828,7 +828,7 @@ void OPPROTO glue(glue(op_bsr, SUFFIX), _T0_cc)(void)
828 828  
829 829 #define STRING_SUFFIX _a32
830 830 #define SI_ADDR (uint8_t *)A0 + ESI
831   -#define DI_ADDR env->seg_cache[R_ES].base + EDI
  831 +#define DI_ADDR env->segs[R_ES].base + EDI
832 832 #define INC_SI() ESI += inc
833 833 #define INC_DI() EDI += inc
834 834 #define CX ECX
... ... @@ -837,7 +837,7 @@ void OPPROTO glue(glue(op_bsr, SUFFIX), _T0_cc)(void)
837 837  
838 838 #define STRING_SUFFIX _a16
839 839 #define SI_ADDR (uint8_t *)A0 + (ESI & 0xffff)
840   -#define DI_ADDR env->seg_cache[R_ES].base + (EDI & 0xffff)
  840 +#define DI_ADDR env->segs[R_ES].base + (EDI & 0xffff)
841 841 #define INC_SI() ESI = (ESI & ~0xffff) | ((ESI + inc) & 0xffff)
842 842 #define INC_DI() EDI = (EDI & ~0xffff) | ((EDI + inc) & 0xffff)
843 843 #define CX (ECX & 0xffff)
... ...