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,8 +616,10 @@ void OPPROTO op_jmp_im(void)
616 616
617 void OPPROTO op_int_im(void) 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 void OPPROTO op_int3(void) 625 void OPPROTO op_int3(void)
@@ -633,18 +635,23 @@ void OPPROTO op_into(void) @@ -633,18 +635,23 @@ void OPPROTO op_into(void)
633 if (eflags & CC_O) { 635 if (eflags & CC_O) {
634 raise_exception(EXCP04_INTO); 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 raise_exception(EXCP0D_GPF); 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 void OPPROTO op_sti(void) 652 void OPPROTO op_sti(void)
646 { 653 {
647 - raise_exception(EXCP0D_GPF); 654 + env->eflags |= IF_MASK;
648 } 655 }
649 656
650 /* vm86plus instructions */ 657 /* vm86plus instructions */
@@ -1097,7 +1104,7 @@ void load_seg(int seg_reg, int selector) @@ -1097,7 +1104,7 @@ void load_seg(int seg_reg, int selector)
1097 dt = &env->gdt; 1104 dt = &env->gdt;
1098 index = selector & ~7; 1105 index = selector & ~7;
1099 if ((index + 7) > dt->limit) 1106 if ((index + 7) > dt->limit)
1100 - raise_exception(EXCP0D_GPF); 1107 + raise_exception_err(EXCP0D_GPF, selector);
1101 ptr = dt->base + index; 1108 ptr = dt->base + index;
1102 e1 = ldl(ptr); 1109 e1 = ldl(ptr);
1103 e2 = ldl(ptr + 4); 1110 e2 = ldl(ptr + 4);