Intel 253666-024US User Manual

Page 542

Advertising
background image

3-496 Vol. 2A

IRET/IRETD—Interrupt Return

INSTRUCTION SET REFERENCE, A-M

EFLAGS(IOPL) ← tempEFLAGS;

IF OperandSize = 32 or OperandSize = 64

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

FI;
END;

RETURN-TO-OUTER-PRIVILEGE-LEVEL:

IF OperandSize

=

32

THEN

IF top 8 bytes on stack are not within limits

THEN #SS(0); FI;

ELSE (* OperandSize

=

16 *)

IF top 4 bytes on stack are not within limits

THEN #SS(0); FI;

FI;
Read return segment selector;
IF stack segment selector is NULL

THEN #GP(0); FI;

IF return stack segment selector index is not within its descriptor table limits

THEN #GP(SSselector); FI;

Read segment descriptor pointed to by return segment selector;
IF stack segment selector RPL

RPL of the return code segment selector

or the stack segment descriptor does not indicate a a writable data segment;
or the stack segment DPL

RPL of the return code segment selector

THEN #GP(SS selector); FI;

IF stack segment is not present

THEN #SS(SS selector); FI;

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;

EFLAGS (CF, PF, AF, ZF, SF, TF, DF, OF, NT) ← tempEFLAGS;

IF OperandSize

=

32

THEN EFLAGS(RF, AC, ID) ← tempEFLAGS; FI;

IF CPL ≤ IOPL

THEN EFLAGS(IF) ← tempEFLAGS; FI;

Advertising