background image

Vol. 3A 7-13

TASK MANAGEMENT

7.4.1 

Use of Busy Flag To Prevent Recursive Task Switching

A TSS allows only one context to be saved for a task; therefore, once a task is called (dispatched), a recursive (or 
re-entrant) call to the task would cause the current state of the task to be lost. The busy flag in the TSS segment 
descriptor is provided to prevent re-entrant task switching and a subsequent loss of task state information. The 
processor manages the busy flag as follows:
1. When dispatching a task, the processor sets the busy flag of the new task.
2. If during a task switch, the current task is placed in a nested chain (the task switch is being generated by a 

CALL instruction, an interrupt, or an exception), the busy flag for the current task remains set. 

3. When switching to the new task (initiated by a CALL instruction, interrupt, or exception), the processor 

generates a general-protection exception (#GP) if the busy flag of the new task is already set. If the task switch 
is initiated with an IRET instruction, the exception is not raised because the processor expects the busy flag to 
be set.

4. When a task is terminated by a jump to a new task (initiated with a JMP instruction in the task code) or by an 

IRET instruction in the task code, the processor clears the busy flag, returning the task to the “not busy” state.

The processor prevents recursive task switching by preventing a task from switching to itself or to any task in a 
nested chain of tasks. The chain of nested suspended tasks may grow to any length, due to multiple calls, inter-
rupts, or exceptions. The busy flag prevents a task from being invoked if it is in this chain.
The busy flag may be used in multiprocessor configurations, because the processor follows a LOCK protocol (on the 
bus or in the cache) when it sets or clears the busy flag. This lock keeps two processors from invoking the same 
task at the same time. See Section 8.1.2.1, “Automatic Locking,” for more information about setting the busy flag 
in a multiprocessor applications.

7.4.2 Modifying 

Task 

Linkages

In a uniprocessor system, in situations where it is necessary to remove a task from a chain of linked tasks, use the 
following procedure to remove the task:
1. Disable interrupts.
2. Change the previous task link field in the TSS of the pre-empting task (the task that suspended the task to be 

removed). It is assumed that the pre-empting task is the next task (newer task) in the chain from the task to 
be removed. Change the previous task link field to point to the TSS of the next oldest task in the chain or to an 
even older task in the chain.

3. Clear the busy (B) flag in the TSS segment descriptor for the task being removed from the chain. If more than 

one task is being removed from the chain, the busy flag for each task being remove must be cleared.

Table 7-2.  Effect of a Task Switch on Busy Flag, NT Flag, Previous Task Link Field, and TS Flag

Flag or Field

Effect of JMP instruction

Effect of CALL Instruction or 

Interrupt

Effect of IRET

Instruction

Busy (B) flag of new task.

Flag is set. Must have been 

clear before.

Flag is set. Must have been 

clear before.

No change. Must have been set.

Busy flag of old task.

Flag is cleared.

No change. Flag is currently 

set.

Flag is cleared.

NT flag of new task.

Set to value from TSS of new 

task.

Flag is set.

Set to value from TSS of new 

task.

NT flag of old task.

No change.

No change.

Flag is cleared.

Previous task link field of new 

task.

No change.

Loaded with selector 

for old task’s TSS.

No change.

Previous task link field of old 

task.

No change.

No change.

No change.

TS flag in control register CR0.

Flag is set.

Flag is set.

Flag is set.