Diff for /np2/i386c/ia32/exception.c between versions 1.11 and 1.12

version 1.11, 2004/02/19 03:04:01 version 1.12, 2004/02/20 16:09:04
Line 210  exception(int num, int error_code) Line 210  exception(int num, int error_code)
  * D          : ゲートのサイズ.0 = 16 bit, 1 = 32 bit   * D          : ゲートのサイズ.0 = 16 bit, 1 = 32 bit
  */   */
   
 static void interrupt_task_gate(descriptor_t *gdp, int softintp, int errorp, int error_code);  static void interrupt_task_gate(descriptor_t *gd, int softintp, int errorp, int error_code);
 static void interrupt_intr_or_trap(descriptor_t *gdp, int softintp, int errorp, int error_code);  static void interrupt_intr_or_trap(descriptor_t *gd, int softintp, int errorp, int error_code);
   
 void  void
 interrupt(int num, int softintp, int errorp, int error_code)  interrupt(int num, int softintp, int errorp, int error_code)
 {  {
         descriptor_t gd;          descriptor_t gd;
         DWORD idt_idx;          UINT idt_idx;
         DWORD new_ip;          UINT32 new_ip;
         WORD new_cs;          UINT16 new_cs;
   
         VERBOSE(("interrupt: num = 0x%02x, softintp = %s, errorp = %s, error_code = %08x", num, softintp ? "on" : "off", errorp ? "on" : "off", error_code));          VERBOSE(("interrupt: num = 0x%02x, softintp = %s, errorp = %s, error_code = %08x", num, softintp ? "on" : "off", errorp ? "on" : "off", error_code));
   
Line 327  interrupt(int num, int softintp, int err Line 327  interrupt(int num, int softintp, int err
 }  }
   
 static void  static void
 interrupt_task_gate(descriptor_t *gdp, int softintp, int errorp, int error_code)  interrupt_task_gate(descriptor_t *gd, int softintp, int errorp, int error_code)
 {  {
         selector_t task_sel;          selector_t task_sel;
         int rv;          int rv;
Line 336  interrupt_task_gate(descriptor_t *gdp, i Line 336  interrupt_task_gate(descriptor_t *gdp, i
   
         (void)softintp;          (void)softintp;
   
         rv = parse_selector(&task_sel, gdp->u.gate.selector);          rv = parse_selector(&task_sel, gd->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)", gd->u.gate.selector, rv, task_sel.ldt ? 'L' : 'G'));
                 EXCEPTION(TS_EXCEPTION, task_sel.idx);                  EXCEPTION(TS_EXCEPTION, task_sel.idx);
         }          }
   
Line 372  interrupt_task_gate(descriptor_t *gdp, i Line 372  interrupt_task_gate(descriptor_t *gdp, i
 }  }
   
 static void  static void
 interrupt_intr_or_trap(descriptor_t *gdp, int softintp, int errorp, int error_code)  interrupt_intr_or_trap(descriptor_t *gd, int softintp, int errorp, int error_code)
 {  {
         selector_t cs_sel, ss_sel;          selector_t cs_sel, ss_sel;
         DWORD old_flags;          UINT stacksize;
         DWORD new_flags;          UINT32 old_flags;
         DWORD mask;          UINT32 new_flags;
         DWORD stacksize;          UINT32 mask;
         DWORD sp;          UINT32 sp;
         DWORD new_ip, new_sp;          UINT32 new_ip, new_sp;
         DWORD old_ip, old_sp;          UINT32 old_ip, old_sp;
         WORD old_cs, old_ss, new_ss;          UINT16 old_cs, old_ss, new_ss;
         int rv;           int rv; 
   
         new_ip = gdp->u.gate.offset;          new_ip = gd->u.gate.offset;
         old_ss = CPU_SS;          old_ss = CPU_SS;
         old_cs = CPU_CS;          old_cs = CPU_CS;
         old_ip = CPU_EIP;          old_ip = CPU_EIP;
         old_sp = CPU_ESP;          old_sp = CPU_ESP;
         new_flags = old_flags = REAL_EFLAGREG;          new_flags = old_flags = REAL_EFLAGREG;
   
         switch (gdp->type) {          switch (gd->type) {
         case CPU_SYSDESC_TYPE_INTR_16:          case CPU_SYSDESC_TYPE_INTR_16:
         case CPU_SYSDESC_TYPE_INTR_32:          case CPU_SYSDESC_TYPE_INTR_32:
                 VERBOSE(("interrupt: INTERRUPT-GATE"));                  VERBOSE(("interrupt: INTERRUPT-GATE"));
Line 411  interrupt_intr_or_trap(descriptor_t *gdp Line 411  interrupt_intr_or_trap(descriptor_t *gdp
         new_flags &= ~(T_FLAG|RF_FLAG|NT_FLAG|VM_FLAG);          new_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(&cs_sel, gdp->u.gate.selector);          rv = parse_selector(&cs_sel, gd->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)", gd->u.gate.selector, rv));
                 EXCEPTION(GP_EXCEPTION, cs_sel.idx + !softintp);                  EXCEPTION(GP_EXCEPTION, cs_sel.idx + !softintp);
         }          }
   
Line 454  interrupt_intr_or_trap(descriptor_t *gdp Line 454  interrupt_intr_or_trap(descriptor_t *gdp
                         VERBOSE(("interrupt: INTERRUPT-FROM-VIRTUAL-8086-MODE"));                          VERBOSE(("interrupt: INTERRUPT-FROM-VIRTUAL-8086-MODE"));
                         stacksize = errorp ? 20 : 18;                          stacksize = errorp ? 20 : 18;
                 }                  }
                 switch (gdp->type) {                  switch (gd->type) {
                 case CPU_SYSDESC_TYPE_INTR_32:                  case CPU_SYSDESC_TYPE_INTR_32:
                 case CPU_SYSDESC_TYPE_TRAP_32:                  case CPU_SYSDESC_TYPE_TRAP_32:
                         stacksize *= 2;                          stacksize *= 2;
Line 514  interrupt_intr_or_trap(descriptor_t *gdp Line 514  interrupt_intr_or_trap(descriptor_t *gdp
                 load_cs(cs_sel.selector, &cs_sel.desc, cs_sel.desc.dpl);                  load_cs(cs_sel.selector, &cs_sel.desc, cs_sel.desc.dpl);
                 SET_EIP(new_ip);                  SET_EIP(new_ip);
   
                 switch (gdp->type) {                  switch (gd->type) {
                 case CPU_SYSDESC_TYPE_INTR_32:                  case CPU_SYSDESC_TYPE_INTR_32:
                 case CPU_SYSDESC_TYPE_TRAP_32:                  case CPU_SYSDESC_TYPE_TRAP_32:
                         if (CPU_STAT_VM86) {                          if (CPU_STAT_VM86) {
Line 571  interrupt_intr_or_trap(descriptor_t *gdp Line 571  interrupt_intr_or_trap(descriptor_t *gdp
                 VERBOSE(("interrupt: INTRA-PRIVILEGE-LEVEL-INTERRUPT"));                  VERBOSE(("interrupt: INTRA-PRIVILEGE-LEVEL-INTERRUPT"));
   
                 stacksize = errorp ? 8 : 6;                  stacksize = errorp ? 8 : 6;
                 switch (gdp->type) {                  switch (gd->type) {
                 case CPU_SYSDESC_TYPE_INTR_32:                  case CPU_SYSDESC_TYPE_INTR_32:
                 case CPU_SYSDESC_TYPE_TRAP_32:                  case CPU_SYSDESC_TYPE_TRAP_32:
                         stacksize *= 2;                          stacksize *= 2;
Line 594  interrupt_intr_or_trap(descriptor_t *gdp Line 594  interrupt_intr_or_trap(descriptor_t *gdp
                 load_cs(cs_sel.selector, &cs_sel.desc, CPU_STAT_CPL);                  load_cs(cs_sel.selector, &cs_sel.desc, CPU_STAT_CPL);
                 SET_EIP(new_ip);                  SET_EIP(new_ip);
   
                 switch (gdp->type) {                  switch (gd->type) {
                 case CPU_SYSDESC_TYPE_INTR_32:                  case CPU_SYSDESC_TYPE_INTR_32:
                 case CPU_SYSDESC_TYPE_TRAP_32:                  case CPU_SYSDESC_TYPE_TRAP_32:
                         PUSH0_32(old_flags);                          PUSH0_32(old_flags);

Removed from v.1.11  
changed lines
  Added in v.1.12


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