Intel 253666-024US User Manual

Page 541

Advertising
background image

Vol. 2A 3-495

INSTRUCTION SET REFERENCE, A-M

IRET/IRETD—Interrupt Return

IF EIP is not within code segment limit

THEN #GP(0); FI;

END;

PROTECTED-MODE-RETURN: (* PE

=

1 *)

IF return code segment selector is NULL

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;

RETURN-TO-SAME-PRIVILEGE-LEVEL: (* PE

=

1, RPL

=

CPL *)

IF new mode

64-Bit Mode

THEN

IF tempEIP is not within code segment limits

THEN #GP(0); FI;

EIP ← tempEIP;

ELSE (* new mode = 64-bit mode *)

IF tempRIP is non-canonical

THEN #GP(0); FI;

RIP ← tempRIP;

FI;
CS ← tempCS; (* Segment descriptor information also loaded *)
EFLAGS (CF, PF, AF, ZF, SF, TF, DF, OF, NT)

← tempEFLAGS;

IF OperandSize =

32 or OperandSize = 64

THEN EFLAGS(RF, AC, ID)

← tempEFLAGS; FI;

IF CPL

≤ IOPL

THEN EFLAGS(IF)

← tempEFLAGS; FI;

IF CPL = 0

THEN (* VM = 0 in flags image *)

Advertising