Commit c05bab779e16f39b78e133797937114512f3c132
1 parent
a52c757c
force IOPL=3
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@257 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
1 changed file
with
22 additions
and
20 deletions
linux-user/vm86.c
| ... | ... | @@ -73,17 +73,17 @@ void save_v86_state(CPUX86State *env) |
| 73 | 73 | ts->target_v86->regs.ebp = tswap32(env->regs[R_EBP]); |
| 74 | 74 | ts->target_v86->regs.esp = tswap32(env->regs[R_ESP]); |
| 75 | 75 | ts->target_v86->regs.eip = tswap32(env->eip); |
| 76 | - ts->target_v86->regs.cs = tswap16(env->segs[R_CS]); | |
| 77 | - ts->target_v86->regs.ss = tswap16(env->segs[R_SS]); | |
| 78 | - ts->target_v86->regs.ds = tswap16(env->segs[R_DS]); | |
| 79 | - ts->target_v86->regs.es = tswap16(env->segs[R_ES]); | |
| 80 | - ts->target_v86->regs.fs = tswap16(env->segs[R_FS]); | |
| 81 | - ts->target_v86->regs.gs = tswap16(env->segs[R_GS]); | |
| 76 | + ts->target_v86->regs.cs = tswap16(env->segs[R_CS].selector); | |
| 77 | + ts->target_v86->regs.ss = tswap16(env->segs[R_SS].selector); | |
| 78 | + ts->target_v86->regs.ds = tswap16(env->segs[R_DS].selector); | |
| 79 | + ts->target_v86->regs.es = tswap16(env->segs[R_ES].selector); | |
| 80 | + ts->target_v86->regs.fs = tswap16(env->segs[R_FS].selector); | |
| 81 | + ts->target_v86->regs.gs = tswap16(env->segs[R_GS].selector); | |
| 82 | 82 | set_flags(env->eflags, ts->v86flags, VIF_MASK | ts->v86mask); |
| 83 | 83 | ts->target_v86->regs.eflags = tswap32(env->eflags); |
| 84 | 84 | #ifdef DEBUG_VM86 |
| 85 | 85 | fprintf(logfile, "save_v86_state: eflags=%08x cs:ip=%04x:%04x\n", |
| 86 | - env->eflags, env->segs[R_CS], env->eip); | |
| 86 | + env->eflags, env->segs[R_CS].selector, env->eip); | |
| 87 | 87 | #endif |
| 88 | 88 | |
| 89 | 89 | /* restore 32 bit registers */ |
| ... | ... | @@ -180,6 +180,7 @@ static inline unsigned int get_vflags(CPUX86State *env) |
| 180 | 180 | flags = env->eflags & RETURN_MASK; |
| 181 | 181 | if (ts->v86flags & VIF_MASK) |
| 182 | 182 | flags |= IF_MASK; |
| 183 | + flags |= IOPL_MASK; | |
| 183 | 184 | return flags | (ts->v86flags & ts->v86mask); |
| 184 | 185 | } |
| 185 | 186 | |
| ... | ... | @@ -194,7 +195,7 @@ static void do_int(CPUX86State *env, int intno) |
| 194 | 195 | uint8_t *ssp; |
| 195 | 196 | unsigned int sp; |
| 196 | 197 | |
| 197 | - if (env->segs[R_CS] == TARGET_BIOSSEG) | |
| 198 | + if (env->segs[R_CS].selector == TARGET_BIOSSEG) | |
| 198 | 199 | goto cannot_handle; |
| 199 | 200 | if (is_revectored(intno, &ts->vm86plus.int_revectored)) |
| 200 | 201 | goto cannot_handle; |
| ... | ... | @@ -210,10 +211,10 @@ static void do_int(CPUX86State *env, int intno) |
| 210 | 211 | intno, segoffs >> 16, segoffs & 0xffff); |
| 211 | 212 | #endif |
| 212 | 213 | /* save old state */ |
| 213 | - ssp = (uint8_t *)(env->segs[R_SS] << 4); | |
| 214 | + ssp = (uint8_t *)(env->segs[R_SS].selector << 4); | |
| 214 | 215 | sp = env->regs[R_ESP] & 0xffff; |
| 215 | 216 | vm_putw(ssp, sp - 2, get_vflags(env)); |
| 216 | - vm_putw(ssp, sp - 4, env->segs[R_CS]); | |
| 217 | + vm_putw(ssp, sp - 4, env->segs[R_CS].selector); | |
| 217 | 218 | vm_putw(ssp, sp - 6, env->eip); |
| 218 | 219 | ADD16(env->regs[R_ESP], -6); |
| 219 | 220 | /* goto interrupt handler */ |
| ... | ... | @@ -257,16 +258,16 @@ void handle_vm86_fault(CPUX86State *env) |
| 257 | 258 | unsigned int ip, sp, newflags, newip, newcs, opcode, intno; |
| 258 | 259 | int data32, pref_done; |
| 259 | 260 | |
| 260 | - csp = (uint8_t *)(env->segs[R_CS] << 4); | |
| 261 | + csp = (uint8_t *)(env->segs[R_CS].selector << 4); | |
| 261 | 262 | ip = env->eip & 0xffff; |
| 262 | 263 | pc = csp + ip; |
| 263 | 264 | |
| 264 | - ssp = (uint8_t *)(env->segs[R_SS] << 4); | |
| 265 | + ssp = (uint8_t *)(env->segs[R_SS].selector << 4); | |
| 265 | 266 | sp = env->regs[R_ESP] & 0xffff; |
| 266 | 267 | |
| 267 | 268 | #if defined(DEBUG_VM86) |
| 268 | 269 | fprintf(logfile, "VM86 exception %04x:%08x %02x %02x\n", |
| 269 | - env->segs[R_CS], env->eip, pc[0], pc[1]); | |
| 270 | + env->segs[R_CS].selector, env->eip, pc[0], pc[1]); | |
| 270 | 271 | #endif |
| 271 | 272 | |
| 272 | 273 | data32 = 0; |
| ... | ... | @@ -413,12 +414,12 @@ int do_vm86(CPUX86State *env, long subfunction, |
| 413 | 414 | ts->vm86_saved_regs.esp = env->regs[R_ESP]; |
| 414 | 415 | ts->vm86_saved_regs.eflags = env->eflags; |
| 415 | 416 | ts->vm86_saved_regs.eip = env->eip; |
| 416 | - ts->vm86_saved_regs.cs = env->segs[R_CS]; | |
| 417 | - ts->vm86_saved_regs.ss = env->segs[R_SS]; | |
| 418 | - ts->vm86_saved_regs.ds = env->segs[R_DS]; | |
| 419 | - ts->vm86_saved_regs.es = env->segs[R_ES]; | |
| 420 | - ts->vm86_saved_regs.fs = env->segs[R_FS]; | |
| 421 | - ts->vm86_saved_regs.gs = env->segs[R_GS]; | |
| 417 | + ts->vm86_saved_regs.cs = env->segs[R_CS].selector; | |
| 418 | + ts->vm86_saved_regs.ss = env->segs[R_SS].selector; | |
| 419 | + ts->vm86_saved_regs.ds = env->segs[R_DS].selector; | |
| 420 | + ts->vm86_saved_regs.es = env->segs[R_ES].selector; | |
| 421 | + ts->vm86_saved_regs.fs = env->segs[R_FS].selector; | |
| 422 | + ts->vm86_saved_regs.gs = env->segs[R_GS].selector; | |
| 422 | 423 | |
| 423 | 424 | /* build vm86 CPU state */ |
| 424 | 425 | ts->v86flags = tswap32(target_v86->regs.eflags); |
| ... | ... | @@ -466,7 +467,8 @@ int do_vm86(CPUX86State *env, long subfunction, |
| 466 | 467 | target_v86->vm86plus.vm86dbg_intxxtab, 32); |
| 467 | 468 | |
| 468 | 469 | #ifdef DEBUG_VM86 |
| 469 | - fprintf(logfile, "do_vm86: cs:ip=%04x:%04x\n", env->segs[R_CS], env->eip); | |
| 470 | + fprintf(logfile, "do_vm86: cs:ip=%04x:%04x\n", | |
| 471 | + env->segs[R_CS].selector, env->eip); | |
| 470 | 472 | #endif |
| 471 | 473 | /* now the virtual CPU is ready for vm86 execution ! */ |
| 472 | 474 | out: | ... | ... |