Modern microprocessors use operating systems in order to control and distribute system resources to application programs and processes. Application programs typically run in an unprivileged mode in which they only have restricted access to system resources. The operating system (OS) runs in a privileged mode, where all resources are available.
When application programs require intervention by the operating system, they pass control to the operating system by means of an operating system call, also referred to as a system call or a supervisor call (SCALL). As an example, an application may require access to a resource controlled by the operating system, such as a peripheral. In order to use the peripheral, the application must request that the operating system perform the access task on its behalf. This request is performed by the system call.
In some situations, the operating system may require use of the peripheral on its own behalf. Those skilled in the art will appreciate that it would be beneficial if the same mechanisms for calling the peripheral control routine could be used from the operating system itself. Use of these same mechanisms would enable both an application program and the operating system to use the same library functions to access peripherals and other privileged resources. Otherwise, different library functions would be required; for example, one for performing the access from the application program and one for performing the access from the operating system.
Many microprocessors provide mechanisms for calling system routines from an unprivileged mode and returning from the system routine back to the unprivileged mode. What is needed is a method allowing a system routine to be called from any context, both an unprivileged mode and a privileged mode, with execution resuming in the mode from which the system routine was called upon completion of the called system routine.