Diff for /np2/i386c/ia32/exception.c between versions 1.6 and 1.7

version 1.6, 2004/01/27 15:56:57 version 1.7, 2004/02/04 13:24:35
Line 103  exception(int num, int error_code) Line 103  exception(int num, int error_code)
                 error_code = 0;                  error_code = 0;
                 break;                  break;
   
   #if CPU_FAMILY >= 4
         case AC_EXCEPTION:      /* (F) アラインメントチェック (errcode: 0) */          case AC_EXCEPTION:      /* (F) アラインメントチェック (errcode: 0) */
                 error_code = 0;                  error_code = 0;
                 /*FALLTHROUGH*/                  /*FALLTHROUGH*/
   #endif
         case TS_EXCEPTION:      /* (F) 無効 TSS (errcode) */          case TS_EXCEPTION:      /* (F) 無効 TSS (errcode) */
         case NP_EXCEPTION:      /* (F) セグメント不在 (errcode) */          case NP_EXCEPTION:      /* (F) セグメント不在 (errcode) */
         case SS_EXCEPTION:      /* (F) スタックセグメントフォルト (errcode) */          case SS_EXCEPTION:      /* (F) スタックセグメントフォルト (errcode) */
Line 120  exception(int num, int error_code) Line 122  exception(int num, int error_code)
                 errorp = 0;                  errorp = 0;
                 break;                  break;
   
   #if CPU_FAMILY >= 5
         case MC_EXCEPTION:      /* (A) マシンチェック */          case MC_EXCEPTION:      /* (A) マシンチェック */
                 CPU_EIP = CPU_PREV_EIP;                  CPU_EIP = CPU_PREV_EIP;
                 errorp = 0;                  errorp = 0;
                 break;                  break;
   #endif
   
   #if CPU_FAMILY >= 6
         case XF_EXCEPTION:      /* (F) ストリーミング SIMD 拡張命令 */          case XF_EXCEPTION:      /* (F) ストリーミング SIMD 拡張命令 */
                 CPU_EIP = CPU_PREV_EIP;                  CPU_EIP = CPU_PREV_EIP;
                 errorp = 0;                  errorp = 0;
                 break;                  break;
   #endif
   
         default:          default:
                 ia32_panic("exception: unknown exception (%d)", num);                  ia32_panic("exception: unknown exception (%d)", num);
Line 258  interrupt(int num, int softintp, int err Line 264  interrupt(int num, int softintp, int err
                 }                  }
   
                 memset(&gd, 0, sizeof(gd));                  memset(&gd, 0, sizeof(gd));
                 CPU_SET_GATEDESC(&gd, CPU_IDTR_BASE + idt_idx);                  CPU_SET_GATEDESC(&gd, CPU_IDTR_BASE + idt_idx, CPU_MODE_SUPERVISER);
                 if (!gd.valid || !gd.p) {                  if (!gd.valid || !gd.p) {
                         VERBOSE(("interrupt: gate descripter is invalid."));                          VERBOSE(("interrupt: gate descripter is invalid."));
                         EXCEPTION(GP_EXCEPTION, num * 8 | 2 | !softintp);                          EXCEPTION(GP_EXCEPTION, num * 8 | 2 | !softintp);
Line 313  interrupt_task(descriptor_t *gdp, int so Line 319  interrupt_task(descriptor_t *gdp, int so
   
         (void)softintp;          (void)softintp;
   
         rv = parse_selector(&task_sel, gdp->u.gate.selector);          rv = parse_selector_sv(&task_sel, gdp->u.gate.selector);
         if (rv < 0 || task_sel.ldt) {          if (rv < 0 || task_sel.ldt) {
                 VERBOSE(("interrupt: parse_selector (selector = %04x, rv = %d, %cDT)", gdp->u.gate.selector, rv, task_sel.ldt ? 'L' : 'G'));                  VERBOSE(("interrupt: parse_selector (selector = %04x, rv = %d, %cDT)", gdp->u.gate.selector, rv, task_sel.ldt ? 'L' : 'G'));
                 EXCEPTION(TS_EXCEPTION, task_sel.idx);                  EXCEPTION(TS_EXCEPTION, task_sel.idx);
Line 391  interrupt_intr_or_trap(descriptor_t *gdp Line 397  interrupt_intr_or_trap(descriptor_t *gdp
         flags &= ~(T_FLAG|RF_FLAG|NT_FLAG|VM_FLAG);          flags &= ~(T_FLAG|RF_FLAG|NT_FLAG|VM_FLAG);
         mask |= T_FLAG|RF_FLAG|NT_FLAG|VM_FLAG;          mask |= T_FLAG|RF_FLAG|NT_FLAG|VM_FLAG;
   
         rv = parse_selector(&intr_sel, gdp->u.gate.selector);          rv = parse_selector_sv(&intr_sel, gdp->u.gate.selector);
         if (rv < 0) {          if (rv < 0) {
                 VERBOSE(("interrupt: parse_selector (selector = %04x, rv = %d)", gdp->u.gate.selector, rv));                  VERBOSE(("interrupt: parse_selector (selector = %04x, rv = %d)", gdp->u.gate.selector, rv));
                 EXCEPTION(GP_EXCEPTION, intr_sel.idx | !softintp);                  EXCEPTION(GP_EXCEPTION, intr_sel.idx | !softintp);
Line 443  interrupt_intr_or_trap(descriptor_t *gdp Line 449  interrupt_intr_or_trap(descriptor_t *gdp
   
                 get_stack_from_tss(intr_sel.desc.dpl, &new_ss, &new_sp);                  get_stack_from_tss(intr_sel.desc.dpl, &new_ss, &new_sp);
   
                 rv = parse_selector(&ss_sel, new_ss);                  rv = parse_selector_sv(&ss_sel, new_ss);
                 if (rv < 0) {                  if (rv < 0) {
                         VERBOSE(("interrupt: parse_selector (selector = %04x, rv = %d)", new_ss, rv));                          VERBOSE(("interrupt: parse_selector (selector = %04x, rv = %d)", new_ss, rv));
                         EXCEPTION(TS_EXCEPTION, ss_sel.idx | !softintp);                          EXCEPTION(TS_EXCEPTION, ss_sel.idx | !softintp);

Removed from v.1.6  
changed lines
  Added in v.1.7


RetroPC.NET-CVS <cvs@retropc.net>