<<<    Index    >>>
3-310
INSTRUCTION SET REFERENCE
INT n/INTO/INT 3—Call to Interrupt Procedure (Continued)
IF segment selector is not within its descriptor table limits 
THEN #GP(selector + EXT);
FI;
Read trap or interrupt handler descriptor;
IF descriptor does not indicate a code segment 
OR code segment descriptor DPL
 >
 CPL
THEN #GP(selector + EXT);
FI;
IF trap or interrupt gate segment is not present, 
THEN #NP(selector + EXT);
FI;
IF code segment is non-conforming AND DPL 
<
 CPL
THEN IF VM=0
THEN 
GOTO INTER-PRIVILEGE-LEVEL-INTERRUPT; 
(* PE=1, interrupt or trap gate, nonconforming *)
(* code segment, DPL
<
CPL, VM=0 *)
ELSE (* VM=1 *)
IF code segment DPL 
?
 0 THEN #GP(new code segment selector); FI;
GOTO INTERRUPT-FROM-VIRTUAL-8086-MODE; 
(* PE=1, interrupt or trap gate, DPL
<
CPL, VM=1 *)
FI;
ELSE (* PE=1, interrupt or trap gate, DPL 
?
 CPL *)
IF VM=1 THEN #GP(new code segment selector); FI;
IF code segment is conforming OR code segment DPL = CPL
THEN 
GOTO INTRA-PRIVILEGE-LEVEL-INTERRUPT; 
ELSE 
#GP(CodeSegmentSelector + EXT);  
(* PE=1, interrupt or trap gate, nonconforming *)
(* code segment, DPL>CPL *)
FI;
FI;
END;
INTER-PREVILEGE-LEVEL-INTERRUPT
(* PE=1, interrupt or trap gate, non-conforming code segment, DPL
<
CPL *)
(* Check segment selector and descriptor for stack of new privilege level in current TSS *)
IF current TSS is 32-bit TSS
THEN 
TSSstackAddress 
<
 (new code segment DPL 
?
 8) + 4
IF (TSSstackAddress + 7) 
>
 TSS limit
THEN #TS(current TSS selector); FI;
NewSS 
<
 TSSstackAddress + 4;
NewESP 
<
 stack address;
<<<    Index    >>>