4.5
Context Switching
This section discusses context switching at the user and kernel levels.
4.5.1
User-level Context Switching
4.5.1.1
Non-local Control Transfers (setjmp/longjmp)
A non-local control transfer such as the C language setjmp()/longjmp() pair requires
software to correctly handle the register stack and the RSE. The register stack provides
the BSP application register which always contains the backing store address of the
current GR32. This permits execution of a setjmp() without having to manipulate any
register stack or RSE state. All register stack and RSE manipulation is postponed to the
much less frequent longjmp().
In setjmp() only the RSC, PFS and BSP application registers have to be preserved. This
can be accomplished by reading these registers, and without having to disable the RSE.
The preserved values will be referred to as setjmp_rsc, setjmp_pfs, and setjmp_bsp
further on.
In longjmp() restoration of the appropriate register stack and RSE state is more
involved, and software needs to take the following steps:
1. Stop RSE by setting RSC.mode bits to zero.
2. Read current BSPSTORE (referred to as current_bspstore further down).
3. Find setjmp()'s RNAT collection (rnat_value).
a. Compute the backing store location of setjmp()'s RNAT collection as follows:
b. If (current_bspstore > rnat_collection_address), then the required
c.
d. Finally, load rnat_value from rnat_collection_address in memory.
4. Invalidate the contents of the register stack as follows:
a. Allocate a zero size register stack frame using the alloc instruction.
b. Write RSC.loadrs field with all zeros and execute a loadrs instruction.
c.
5. Restore setjmp()'s register stack and RSE state as follows:
a. Write BSPSTORE with setjmp_bsp.
b. Write RNAT with rnat_value.
Volume 2, Part 2: Context Management
rnat_collection_address{63:0} = setjmp_bsp{63:0} | 0x1F8
The RNAT location is computed by setting bits{8:3} of setjmp()'s BSP to all
ones. This is where setjmp()'s RNAT collection will have been spilled to
memory.
RNAT collection has already been spilled to the backing store.
Otherwise if (current_bspstore <= rnat_collection_address), the
required RNAT collection is incomplete and is still contained in the register
stack. To materialize the complete RNAT collection, flush the register stack to
the backing store using a flushrs instruction.
Invalidate the ALAT using the invala instruction.
2:557
Need help?
Do you have a question about the ITANIUM ARCHITECTURE - SOFTWARE DEVELOPERS MANUAL VOLUME 1 REV 2.3 and is the answer not in the manual?
Questions and answers