beautypg.com

Intel 253666-024US User Manual

Page 543

background image

Vol. 2A 3-497

INSTRUCTION SET REFERENCE, A-M

IRET/IRETD—Interrupt Return

IF CPL

=

0

THEN

EFLAGS(IOPL) ← tempEFLAGS;

IF OperandSize

=

32

THEN EFLAGS(VM, VIF, VIP) ← tempEFLAGS; FI;

IF OperandSize = 64

THEN EFLAGS(VIF, VIP)

← tempEFLAGS; FI;

FI;
CPL ← RPL of the return code segment selector;

FOR each of segment register (ES, FS, GS, and DS)

DO

IF segment register points to data or non-conforming code segment
and CPL > segment descriptor DPL (* Stored in hidden part of segment register *)

THEN (* Segment register invalid *)

SegmentSelector ← 0; (* NULL segment selector *)

FI;

OD;

END;

IA-32e-MODE-RETURN: (* IA32_EFER.LMA = 1, PE

=

1 *)

IF ( (return code segment selector is NULL) or (return RIP is non-canonical) or

(SS selector is NULL going back to compatibility mode) or
(SS selector is NULL going back to CPL3 64-bit mode) or
(RPL <> CPL going back to non-CPL3 64-bit mode for a NULL SS selector) )

THEN GP(0); FI;

IF return code segment selector addresses descriptor beyond descriptor table limit

THEN GP(selector); FI;

Read segment descriptor pointed to by the return code segment selector;
IF return code segment descriptor is not a code segment

THEN #GP(selector); FI;

IF return code segment selector RPL

< CPL

THEN #GP(selector); FI;

IF return code segment descriptor is conforming
and return code segment DPL

> return code segment selector RPL

THEN #GP(selector); FI;

IF return code segment descriptor is not present

THEN #NP(selector); FI;

IF return code segment selector RPL

> CPL

THEN GOTO RETURN-OUTER-PRIVILEGE-LEVEL;
ELSE GOTO RETURN-TO-SAME-PRIVILEGE-LEVEL; FI;

END;