Diff for /np2/i386c/ia32/ctrlxfer.c between versions 1.20 and 1.23

version 1.20, 2008/03/22 04:03:07 version 1.23, 2011/12/21 18:07:57
Line 1 Line 1
 /*      $Id$    */  
   
 /*  /*
  * Copyright (c) 2003 NONAKA Kimihiro   * Copyright (c) 2003 NONAKA Kimihiro
  * All rights reserved.   * All rights reserved.
Line 112  JMPfar_pm_code_segment(const selector_t  Line 110  JMPfar_pm_code_segment(const selector_t 
         /* check privilege level */          /* check privilege level */
         if (!SEG_IS_CONFORMING_CODE(&cs_sel->desc)) {          if (!SEG_IS_CONFORMING_CODE(&cs_sel->desc)) {
                 VERBOSE(("JMPfar_pm: NON-CONFORMING-CODE-SEGMENT"));                  VERBOSE(("JMPfar_pm: NON-CONFORMING-CODE-SEGMENT"));
                 /* イシエャ p.119 4.8.1.1. */                  /* 荳句キサ p.119 4.8.1.1. */
                 if (cs_sel->rpl > CPU_STAT_CPL) {                  if (cs_sel->rpl > CPU_STAT_CPL) {
                         VERBOSE(("JMPfar_pm: RPL(%d) > CPL(%d)", cs_sel->rpl, CPU_STAT_CPL));                          VERBOSE(("JMPfar_pm: RPL(%d) > CPL(%d)", cs_sel->rpl, CPU_STAT_CPL));
                         EXCEPTION(GP_EXCEPTION, cs_sel->idx);                          EXCEPTION(GP_EXCEPTION, cs_sel->idx);
Line 123  JMPfar_pm_code_segment(const selector_t  Line 121  JMPfar_pm_code_segment(const selector_t 
                 }                  }
         } else {          } else {
                 VERBOSE(("JMPfar_pm: CONFORMING-CODE-SEGMENT"));                  VERBOSE(("JMPfar_pm: CONFORMING-CODE-SEGMENT"));
                 /* イシエャ p.120 4.8.1.2. */                  /* 荳句キサ p.120 4.8.1.2. */
                 if (cs_sel->desc.dpl > CPU_STAT_CPL) {                  if (cs_sel->desc.dpl > CPU_STAT_CPL) {
                         VERBOSE(("JMPfar_pm: DPL(%d) > CPL(%d)", cs_sel->desc.dpl, CPU_STAT_CPL));                          VERBOSE(("JMPfar_pm: DPL(%d) > CPL(%d)", cs_sel->desc.dpl, CPU_STAT_CPL));
                         EXCEPTION(GP_EXCEPTION, cs_sel->idx);                          EXCEPTION(GP_EXCEPTION, cs_sel->idx);
Line 192  JMPfar_pm_call_gate(const selector_t *ca Line 190  JMPfar_pm_call_gate(const selector_t *ca
   
         /* check privilege level */          /* check privilege level */
         if (!SEG_IS_CONFORMING_CODE(&cs_sel.desc)) {          if (!SEG_IS_CONFORMING_CODE(&cs_sel.desc)) {
                 /* イシエャ p.119 4.8.1.1. */                  /* 荳句キサ p.119 4.8.1.1. */
                 if (cs_sel.rpl > CPU_STAT_CPL) {                  if (cs_sel.rpl > CPU_STAT_CPL) {
                         VERBOSE(("JMPfar_pm: RPL(%d) > CPL(%d)", cs_sel.rpl, CPU_STAT_CPL));                          VERBOSE(("JMPfar_pm: RPL(%d) > CPL(%d)", cs_sel.rpl, CPU_STAT_CPL));
                         EXCEPTION(GP_EXCEPTION, cs_sel.idx);                          EXCEPTION(GP_EXCEPTION, cs_sel.idx);
Line 202  JMPfar_pm_call_gate(const selector_t *ca Line 200  JMPfar_pm_call_gate(const selector_t *ca
                         EXCEPTION(GP_EXCEPTION, cs_sel.idx);                          EXCEPTION(GP_EXCEPTION, cs_sel.idx);
                 }                  }
         } else {          } else {
                 /* イシエャ p.120 4.8.1.2. */                  /* 荳句キサ p.120 4.8.1.2. */
                 if (cs_sel.desc.dpl > CPU_STAT_CPL) {                  if (cs_sel.desc.dpl > CPU_STAT_CPL) {
                         VERBOSE(("JMPfar_pm: DPL(%d) > CPL(%d)", cs_sel.desc.dpl, CPU_STAT_CPL));                          VERBOSE(("JMPfar_pm: DPL(%d) > CPL(%d)", cs_sel.desc.dpl, CPU_STAT_CPL));
                         EXCEPTION(GP_EXCEPTION, cs_sel.idx);                          EXCEPTION(GP_EXCEPTION, cs_sel.idx);
Line 282  JMPfar_pm_task_gate(selector_t *taskgate Line 280  JMPfar_pm_task_gate(selector_t *taskgate
         }          }
   
         task_switch(&tss_sel, TASK_SWITCH_JMP);          task_switch(&tss_sel, TASK_SWITCH_JMP);
   
           /* out of range */
           if (CPU_EIP > CPU_STAT_CS_LIMIT) {
                   VERBOSE(("JMPfar_pm: new_ip is out of range. new_ip = %08x, limit = %08x", CPU_EIP, CPU_STAT_CS_LIMIT));
                   EXCEPTION(GP_EXCEPTION, 0);
           }
 }  }
   
 /*---  /*---
Line 310  JMPfar_pm_tss(selector_t *tss_sel) Line 314  JMPfar_pm_tss(selector_t *tss_sel)
         }          }
   
         task_switch(tss_sel, TASK_SWITCH_JMP);          task_switch(tss_sel, TASK_SWITCH_JMP);
   
           /* out of range */
           if (CPU_EIP > CPU_STAT_CS_LIMIT) {
                   VERBOSE(("JMPfar_pm: new_ip is out of range. new_ip = %08x, limit = %08x", CPU_EIP, CPU_STAT_CS_LIMIT));
                   EXCEPTION(GP_EXCEPTION, 0);
           }
 }  }
   
   
Line 394  CALLfar_pm_code_segment(const selector_t Line 404  CALLfar_pm_code_segment(const selector_t
         /* check privilege level */          /* check privilege level */
         if (!SEG_IS_CONFORMING_CODE(&cs_sel->desc)) {          if (!SEG_IS_CONFORMING_CODE(&cs_sel->desc)) {
                 VERBOSE(("CALLfar_pm: NON-CONFORMING-CODE-SEGMENT"));                  VERBOSE(("CALLfar_pm: NON-CONFORMING-CODE-SEGMENT"));
                 /* イシエャ p.119 4.8.1.1. */                  /* 荳句キサ p.119 4.8.1.1. */
                 if (cs_sel->rpl > CPU_STAT_CPL) {                  if (cs_sel->rpl > CPU_STAT_CPL) {
                         VERBOSE(("CALLfar_pm: RPL(%d) > CPL(%d)", cs_sel->rpl, CPU_STAT_CPL));                          VERBOSE(("CALLfar_pm: RPL(%d) > CPL(%d)", cs_sel->rpl, CPU_STAT_CPL));
                         EXCEPTION(GP_EXCEPTION, cs_sel->idx);                          EXCEPTION(GP_EXCEPTION, cs_sel->idx);
Line 405  CALLfar_pm_code_segment(const selector_t Line 415  CALLfar_pm_code_segment(const selector_t
                 }                  }
         } else {          } else {
                 VERBOSE(("CALLfar_pm: CONFORMING-CODE-SEGMENT"));                  VERBOSE(("CALLfar_pm: CONFORMING-CODE-SEGMENT"));
                 /* イシエャ p.120 4.8.1.2. */                  /* 荳句キサ p.120 4.8.1.2. */
                 if (cs_sel->desc.dpl > CPU_STAT_CPL) {                  if (cs_sel->desc.dpl > CPU_STAT_CPL) {
                         VERBOSE(("CALLfar_pm: DPL(%d) > CPL(%d)", cs_sel->desc.dpl, CPU_STAT_CPL));                          VERBOSE(("CALLfar_pm: DPL(%d) > CPL(%d)", cs_sel->desc.dpl, CPU_STAT_CPL));
                         EXCEPTION(GP_EXCEPTION, cs_sel->idx);                          EXCEPTION(GP_EXCEPTION, cs_sel->idx);
Line 754  CALLfar_pm_task_gate(selector_t *taskgat Line 764  CALLfar_pm_task_gate(selector_t *taskgat
         }          }
   
         task_switch(&tss_sel, TASK_SWITCH_CALL);          task_switch(&tss_sel, TASK_SWITCH_CALL);
   
           /* out of range */
           if (CPU_EIP > CPU_STAT_CS_LIMIT) {
                   VERBOSE(("JMPfar_pm: new_ip is out of range. new_ip = %08x, limit = %08x", CPU_EIP, CPU_STAT_CS_LIMIT));
                   EXCEPTION(GP_EXCEPTION, 0);
           }
 }  }
   
 /*---  /*---
Line 782  CALLfar_pm_tss(selector_t *tss_sel) Line 798  CALLfar_pm_tss(selector_t *tss_sel)
         }          }
   
         task_switch(tss_sel, TASK_SWITCH_CALL);          task_switch(tss_sel, TASK_SWITCH_CALL);
   
           /* out of range */
           if (CPU_EIP > CPU_STAT_CS_LIMIT) {
                   VERBOSE(("JMPfar_pm: new_ip is out of range. new_ip = %08x, limit = %08x", CPU_EIP, CPU_STAT_CS_LIMIT));
                   EXCEPTION(GP_EXCEPTION, 0);
           }
 }  }
   
   
Line 819  RETfar_pm(UINT nbytes) Line 841  RETfar_pm(UINT nbytes)
   
         rv = parse_selector(&cs_sel, new_cs);          rv = parse_selector(&cs_sel, new_cs);
         if (rv < 0) {          if (rv < 0) {
                 VERBOSE(("RETfar_pm: parse_selector (selector = %04x, rv = %d, %s)", cs_sel.selector, rv));                  VERBOSE(("RETfar_pm: parse_selector (selector = %04x, rv = %d)", cs_sel.selector, rv));
                 EXCEPTION(GP_EXCEPTION, cs_sel.idx);                  EXCEPTION(GP_EXCEPTION, cs_sel.idx);
         }          }
   
Line 1091  IRET_pm_nested_task(void) Line 1113  IRET_pm_nested_task(void)
         }          }
   
         task_switch(&tss_sel, TASK_SWITCH_IRET);          task_switch(&tss_sel, TASK_SWITCH_IRET);
   
           /* out of range */
           if (CPU_EIP > CPU_STAT_CS_LIMIT) {
                   VERBOSE(("JMPfar_pm: new_ip is out of range. new_ip = %08x, limit = %08x", CPU_EIP, CPU_STAT_CS_LIMIT));
                   EXCEPTION(GP_EXCEPTION, 0);
           }
 }  }
   
 /*---  /*---

Removed from v.1.20  
changed lines
  Added in v.1.23


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