THE
80286
INSTRUCTION SET
2.
Call
gate-The
offset part of the destination pointer
is
ignored. After checking for validity, the
processor jumps
to
the location stored
in
the call gate descriptor.
3.
Task
gate-The
current task's state
is
saved
in
its Task State Segment (TSS), and the TSS named
in
the task gate
is
used
to
load a
new
context. The outgoing task
is
marked not busy, the new TSS
is
marked busy, and execution resumes at the point at which the
new
task
was
last suspended.
4.
TSS-
The current task
is
suspended and the
new
task
is
initiated
as
in
3 above except that there
is
no
intervening gate.
Following
is
the list of checks and actions taken for long jumps
in
protected mode:
JUMP FAR:
If indirect then check access
of
EA
doubleword #GP(O)
or
#SS(O) if limit violation
Destination selector is not
null else #GP(O)
Destination selector index is within its descriptor table limits else
#GP
(selector)
Examine AR byte
of
destination selector for legal values:
JUMP
CONFORMING CODE SEGMENT:
Descriptor DPL must be
:s CPL else
#GP
(selector)
Segment must be PRESENT else
#NP
(selector)
IP
must be
in
code segment limit else #GP(O)
Load
CS:IP from destination pOinter
Load CS-cache with new segment descriptor
JUMP
NONCONFORMING CODE SEGMENT:
RPL
of
destination selector must
be
:s CPL else
#GP
(selector)
Descriptor DPL must
= CPL else
#GP
(selector)
Segment must be PRESENT else
#NP
(selector)
IP
must be in code segment limit else #GP(O)
Load
CS:IP from destination pOinter
Load CS-cache with new segment descriptor
Set RPL field
of
CS register to CPL
JUMP
TO CALL GATE:
Descriptor DPL must be
::::
CPL else
#GP
(gate selector)
Descriptor DPL must be
::::
gate selector RPL else
#GP
(gate selector)
Gate must be PRESENT else
#NP
(gate selector)
Examine selector to code segment given
in
call gate descriptor:
Selector must not
be
null else #GP(O)
Selector must be within its descriptor table limits else
#GP
(CS
selector)
Descriptor AR byte must indicate code segment else
#GP
(CS
selector)
If non-conforming, code segment descriptor DPL must = CPL else
#GP
(CS
selector)
If conforming, then code segment descriptor DPL must be :s CPL else
#GP
(CS
selector)
Code Segment must be PRESENT else
#NP
(CS
selector)
IP
must be
in
code segment limit else #GP(O)
Load
CS:IP from call gate
Load CS-cache with new code segment
Set RPL
of
CS to CPL
JUMP TASK GATE:
Gate descriptor DPL must be
::::
CPL else
#GP
(gate selector)
Gate descriptor DPL must be
::::
gate selector RPL else
#GP
(gate selector)
Task Gate must be PRESENT else
#NP
(gate selector)
Examine selector to
TSS, given
in
Task Gate descriptor:
Must specify
global
in
the local/global bit else
#GP
(TSS selector)
Index must be within GDT limits else
#GP
(TSS selector)
Descriptor AR byte must specify available
TSS (bottom bits 00001) else
#GP
(TSS selector)
Task State Segment must be PRESENT else
#NP
(TSS selector)
SWITCH_TASKS without nesting
to
TSS
IP
must
be
in
code segment limit else #GP(O)
8-57