Intel 253666-024US User Manual

Page 560

Advertising
background image

3-514 Vol. 2A

JMP—Jump

INSTRUCTION SET REFERENCE, A-M

THEN #GP(0); FI;

IF call gate code-segment selector index outside descriptor table limits

THEN #GP(code segment selector); FI;

Read code segment descriptor;
IF code-segment segment descriptor does not indicate a code segment
or code-segment segment descriptor is conforming and DPL > CPL

or code-segment segment descriptor is non-conforming and DPL

CPL

THEN #GP(code segment selector); FI;

IF IA32_EFER.LMA

=

1 and (code-segment descriptor is not a 64-bit code segment

or code-segment segment descriptor has both L-Bit and D-bit set)

THEN #GP(code segment selector); FI;

IF code segment is not present

THEN #NP(code-segment selector); FI;

IF instruction pointer is not within code-segment limit

THEN #GP(0); FI;

tempEIP ← DEST(Offset);

IF GateSize

=

16

THEN tempEIP ← tempEIP AND 0000FFFFH; FI;

IF (IA32_EFER.LMA

=

0 OR target mode

=

Compatibility mode) AND tempEIP

outside code segment limit

THEN #GP(0); FI

CS ← DEST[SegmentSelector); (* Segment descriptor information also loaded *)

CS(RPL) ← CPL;

EIP ← tempEIP;

END;
TASK-GATE:

IF task gate DPL < CPL

or task gate DPL < task gate segment-selector RPL

THEN #GP(task gate selector); FI;

IF task gate not present

THEN #NP(gate selector); FI;

Read the TSS segment selector in the task-gate descriptor;
IF TSS segment selector local/global bit is set to local
or index not within GDT limits
or TSS descriptor specifies that the TSS is busy

THEN #GP(TSS selector); FI;

IF TSS not present

THEN #NP(TSS selector); FI;

SWITCH-TASKS to TSS;
IF EIP not within code segment limit

THEN #GP(0); FI;

END;
TASK-STATE-SEGMENT:

IF TSS DPL < CPL

Advertising