Vol. 2A 3-479
INSTRUCTION SET REFERENCE, A-M
INT n/INTO/INT 3—Call to Interrupt Procedure
NewESP ← stack address;
ELSE (* TSS is 16-bit *)
TSSstackAddress ← (new code segment DPL ∗ 4) + 2;
IF (TSSstackAddress + 4) > TSS limit
THEN #TS(current TSS selector); FI;
NewESP ← TSSstackAddress;
NewSS ← TSSstackAddress + 2;
FI;
IF segment selector is NULL
THEN #TS(EXT); FI;
IF segment selector index is not within its descriptor table limits
or segment selector's RPL
≠ DPL of code segment
THEN #TS(SS selector + EXT); FI;
Access segment descriptor for stack segment in GDT or LDT;
IF stack segment DPL
≠ DPL of code segment,
or stack segment does not indicate writable data segment
THEN #TS(SS selector + EXT); FI;
IF stack segment not present
THEN #SS(SS selector + EXT); FI;
IF 32-bit gate
THEN
IF new stack does not have room for 40 bytes (error code pushed)
or 36 bytes (no error code pushed)
THEN #SS(segment selector + EXT); FI;
ELSE IF 16-bit gate
THEN
IF new stack does not have room for 20 bytes (error code pushed)
or 18 bytes (no error code pushed)
THEN #SS(segment selector + EXT); FI;
ELSE (* 64-bit gate*)
IF StackAddress is non-canonical
THEN #SS(0);
FI;
FI;
IF instruction pointer is not within code segment limits
THEN #GP(0); FI;
tempEFLAGS ← EFLAGS;
VM ← 0;
TF ← 0;
RF ← 0;
NT ← 0;
IF service through interrupt gate
THEN IF
= 0; FI;