mideleg
Machine Interrupt Delegation
Controls exception delegation from M-mode to HS/S-mode
By default, all traps at any privilege level are handled in machine
mode, though a machine-mode handler can redirect traps back to the
appropriate level with the MRET
instruction. To increase performance,
implementations can provide individual read/write bits within mideleg
to indicate that certain exceptions and interrupts should
be processed directly by a lower privilege level.
In harts with S-mode, the mideleg register must exist, and setting a bit mideleg will delegate the corresponding trap, when occurring in S-mode or U-mode, to the S-mode trap handler <%- if ext?(:H) -%> (which could further be delegated to VS-mode through hideleg) <%- end -%> . <%- if ext?(:S, "> 1.9.1") -%> In harts without S-mode, the mideleg register should not exist.
In versions 1.9.1 and earlier , this register existed but was hardwired to zero in M-mode only, or M/U without N harts. There is no reason to require they return zero in those cases, as the misa register indicates whether they exist. |
<%- else -%> In harts without S-mode, the mideleg register is read-only zero. <%- end -%>
An implementation can choose to subset the delegatable traps, with the supported delegatable bits found by writing one to every bit location, then reading back the value in mideleg to see which bit positions hold a one.
Version 1.11 and earlier prohibited having any bits of mideleg be read-only one. Platform standards may always add such restrictions. |
Traps never transition from a more-privileged mode to a less-privileged mode. For example, if M-mode has delegated illegal-instruction exceptions to S-mode, and M-mode software later executes an illegal instruction, the trap is taken in M-mode, rather than being delegated to S-mode. By contrast, traps may be taken horizontally. Using the same example, if M-mode has delegated illegal-instruction exceptions to S-mode, and S-mode software later executes an illegal instruction, the trap is taken in S-mode.
Delegated interrupts result in the interrupt being masked at the delegator privilege level. For example, if the supervisor timer interrupt (STI) is delegated to S-mode by setting mideleg[5], STIs will not be taken when executing in M-mode. By contrast, if mideleg[5] is clear, STIs can be taken in any mode and regardless of current mode will transfer control to M-mode.
mideleg holds trap delegation bits for individual interrupts, with the layout of bits matching those in the mip register (i.e., STIP interrupt delegation control is located in bit 5).
For exceptions that cannot occur in less privileged modes, the corresponding medeleg bits should be read-only zero. In particular, medeleg[11] is read-only zero.
The medeleg[16] is read-only zero as double trap is not delegatable. |
Attributes
Defining Extension |
|
---|---|
CSR Address |
0x303 |
Length |
#<ConfiguredArchitecture:0x00007f75efbd67c8>-bit |
Privilege Mode |
M |
Format
This CSR format changes dynamically.