Commit 504e56ebdca53bf8e8d379aa994e90a2e3b0d564

Authored by bellard
1 parent 455b7619

more accurate GPF generation


git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@128 c046a42c-6fe2-441c-8c8c-71466251a162
Showing 1 changed file with 14 additions and 7 deletions
op-i386.c
... ... @@ -616,8 +616,10 @@ void OPPROTO op_jmp_im(void)
616 616  
617 617 void OPPROTO op_int_im(void)
618 618 {
619   - EIP = PARAM1;
620   - raise_exception(EXCP0D_GPF);
  619 + int intno;
  620 + intno = PARAM1;
  621 + EIP = PARAM2;
  622 + raise_exception_err(EXCP0D_GPF, intno * 8 + 2);
621 623 }
622 624  
623 625 void OPPROTO op_int3(void)
... ... @@ -633,18 +635,23 @@ void OPPROTO op_into(void)
633 635 if (eflags & CC_O) {
634 636 raise_exception(EXCP04_INTO);
635 637 }
  638 + FORCE_RET();
636 639 }
637 640  
638   -/* XXX: add IOPL/CPL tests */
639   -void OPPROTO op_cli(void)
  641 +void OPPROTO op_gpf(void)
640 642 {
  643 + EIP = PARAM1;
641 644 raise_exception(EXCP0D_GPF);
642 645 }
643 646  
644   -/* XXX: add IOPL/CPL tests */
  647 +void OPPROTO op_cli(void)
  648 +{
  649 + env->eflags &= ~IF_MASK;
  650 +}
  651 +
645 652 void OPPROTO op_sti(void)
646 653 {
647   - raise_exception(EXCP0D_GPF);
  654 + env->eflags |= IF_MASK;
648 655 }
649 656  
650 657 /* vm86plus instructions */
... ... @@ -1097,7 +1104,7 @@ void load_seg(int seg_reg, int selector)
1097 1104 dt = &env->gdt;
1098 1105 index = selector & ~7;
1099 1106 if ((index + 7) > dt->limit)
1100   - raise_exception(EXCP0D_GPF);
  1107 + raise_exception_err(EXCP0D_GPF, selector);
1101 1108 ptr = dt->base + index;
1102 1109 e1 = ldl(ptr);
1103 1110 e2 = ldl(ptr + 4);
... ...