| |||
| Home > Handling Processor Exceptions > System mode | |||
The ARM Architecture defines a User mode that has 15 general
purpose registers, a PC, and a CPSR. In addition
to this mode there are other privileged processor modes, each of which has
an SPSR and a number of registers that replace
some of the 15 User mode general purpose registers.
This section only applies to processors that implement architectures ARMv4, ARMv4T, and later.
When a processor exception occurs, the current PC is copied
into the link register for the exception mode, and the CPSR is
copied into the SPSR for the exception mode.
The CPSR is then altered in an exception-dependent
way, and the PC is set to an exception-defined address to start
the exception handler.
The ARM subroutine call instruction (BL) copies
the return address into r14 before changing the
PC, so the subroutine return instruction moves r14 to
PC (MOV pc,lr).
Together these actions imply that ARM modes that handle exceptions must ensure that another exception of the same type cannot occur if they call subroutines, because the subroutine return address is overwritten with the exception return address.
In earlier versions of the ARM architecture, this problem has been solved by either carefully avoiding subroutine calls in exception code, or changing from the privileged mode to User mode. The first solution is often too restrictive, and the second means the task might not have the privileged access it requires to run correctly.
ARMv4 and later provide a processor mode called System mode, to overcome this problem. System mode is a privileged processor mode that shares the User mode registers. Privileged mode tasks can run in this mode, and exceptions no longer overwrite the link register.
System mode cannot be entered by an exception. The exception
handlers modify the CPSR to enter System mode.
See Reentrant interrupt handlers for an example.