background image

Vol. 3A 6-37

INTERRUPT AND EXCEPTION HANDLING

Interrupt 13—General Protection Exception (#GP)

Exception Class

Fault.

Description

Indicates that the processor detected one of a class of protection violations called “general-protection violations.” 
The conditions that cause this exception to be generated comprise all the protection violations that do not cause 
other exceptions to be generated (such as, invalid-TSS, segment-not-present, stack-fault, or page-fault excep-
tions). The following conditions cause general-protection exceptions to be generated:

•

Exceeding the segment limit when accessing the CS, DS, ES, FS, or GS segments.

•

Exceeding the segment limit when referencing a descriptor table (except during a task switch or a stack 
switch).

•

Transferring execution to a segment that is not executable.

•

Writing to a code segment or a read-only data segment.

•

Reading from an execute-only code segment.

•

Loading the SS register with a segment selector for a read-only segment (unless the selector comes from a TSS 
during a task switch, in which case an invalid-TSS exception occurs).

•

Loading the SS, DS, ES, FS, or GS register with a segment selector for a system segment.

•

Loading the DS, ES, FS, or GS register with a segment selector for an execute-only code segment.

•

Loading the SS register with the segment selector of an executable segment or a null segment selector.

•

Loading the CS register with a segment selector for a data segment or a null segment selector.

•

Accessing memory using the DS, ES, FS, or GS register when it contains a null segment selector.

•

Switching to a busy task during a call or jump to a TSS.

•

Using a segment selector on a non-IRET task switch that points to a TSS descriptor in the current LDT. TSS 
descriptors can only reside in the GDT. This condition causes a #TS exception during an IRET task switch.

•

Violating any of the privilege rules described in Chapter 5, “Protection.”

•

Exceeding the instruction length limit of 15 bytes (this only can occur when redundant prefixes are placed 
before an instruction).

•

Loading the CR0 register with a set PG flag (paging enabled) and a clear PE flag (protection disabled).

•

Loading the CR0 register with a set NW flag and a clear CD flag.

•

Referencing an entry in the IDT (following an interrupt or exception) that is not an interrupt, trap, or task gate.

•

Attempting to access an interrupt or exception handler through an interrupt or trap gate from virtual-8086 
mode when the handler’s code segment DPL is greater than 0.

•

Attempting to write a 1 into a reserved bit of CR4.

•

Attempting to execute a privileged instruction when the CPL is not equal to 0 (see Section 5.9, “Privileged 
Instructions,” for a 
list of privileged instructions).

•

Attempting to execute SGDT, SIDT, SLDT, SMSW, or STR when CR4.UMIP = 1 and the CPL is not equal to 0.

•

Writing to a reserved bit in an MSR.

•

Accessing a gate that contains a null segment selector.

•

Executing the INT n instruction when the CPL is greater than the DPL of the referenced interrupt, trap, or task 
gate.

•

The segment selector in a call, interrupt, or trap gate does not point to a code segment.

•

The segment selector operand in the LLDT instruction is a local type (TI flag is set) or does not point to a 
segment descriptor of the LDT type.

•

The segment selector operand in the LTR instruction is local or points to a TSS that is not available.

•

The target code-segment selector for a call, jump, or return is null.