Interrupts
Machine Interrupt (mip
and mie
) Registers
The mip
register is an MXLEN-bit read/write register containing
information on pending interrupts, while mie
is the corresponding
MXLEN-bit read/write register containing interrupt enable bits.
Interrupt cause number i (as reported in CSR mcause
) corresponds with bit i in both mip
and
mie
. Bits 15:0 are allocated to standard interrupt causes only, while
bits 16 and above are designated for platform use.
Interrupts designated for platform use may be designated for custom use at the platform’s discretion. |
mip
) register.Unresolved include directive in modules/prose/pages/interrupts.adoc - include::images/bytefield/mideleg.adoc[]
mie
) registerUnresolved include directive in modules/prose/pages/interrupts.adoc - include::images/bytefield/mideleg.adoc[]
An interrupt i will trap to M-mode (causing the privilege mode to
change to M-mode) if all of the following are true: (a) either the
current privilege mode is M and the MIE bit in the mstatus
register is
set, or the current privilege mode has less privilege than M-mode;
(b) bit i is set in both mip
and mie
; and (c) if register
mideleg
exists, bit i is not set in mideleg
.
These conditions for an interrupt trap to occur must be evaluated in a
bounded amount of time from when an interrupt becomes, or ceases to be,
pending in mip
, and must also be evaluated immediately following the
execution of an xRET instruction or an explicit write to a CSR on
which these interrupt trap conditions expressly depend (including mip
,
mie
, mstatus
, and mideleg
).
Interrupts to M-mode take priority over any interrupts to lower privilege modes.
Each individual bit in register mip
may be writable or may be
read-only. When bit i in mip
is writable, a pending interrupt i
can be cleared by writing 0 to this bit. If interrupt i can become
pending but bit i in mip
is read-only, the implementation must
provide some other mechanism for clearing the pending interrupt.
A bit in mie
must be writable if the corresponding interrupt can ever
become pending. Bits of mie
that are not writable must be read-only
zero.
The standard portions (bits 15:0) of the mip
and mie
registers are
formatted as shown in Standard portion (bits 15:0) of mip
. and Standard portion (bits 15:0) of mie
. respectively.
mip
.Unresolved include directive in modules/prose/pages/interrupts.adoc - include::images/bytefield/mipreg-standard.adoc[]
mie
.Unresolved include directive in modules/prose/pages/interrupts.adoc - include::images/bytefield/miereg-standard.adoc[]
The machine-level interrupt registers handle a few root interrupt sources which are assigned a fixed service priority for simplicity, while separate external interrupt controllers can implement a more complex prioritization scheme over a much larger set of interrupts that are then muxed into the machine-level interrupt sources. The non-maskable interrupt is not made visible via the |
Bits mip
.MEIP and mie
.MEIE are the interrupt-pending and
interrupt-enable bits for machine-level external interrupts. MEIP is
read-only in mip
, and is set and cleared by a platform-specific
interrupt controller.
Bits mip
.MTIP and mie
.MTIE are the interrupt-pending and
interrupt-enable bits for machine timer interrupts. MTIP is read-only in
the mip
register, and is cleared by writing to the memory-mapped machine-mode timer
compare register.
Bits mip
.MSIP and mie
.MSIE are the interrupt-pending and
interrupt-enable bits for machine-level software interrupts. MSIP is
read-only in mip
, and is written by accesses to memory-mapped control
registers, which are used by remote harts to provide machine-level
interprocessor interrupts. A hart can write its own MSIP bit using the
same memory-mapped control register. If a system has only one hart, or
if a platform standard supports the delivery of machine-level
interprocessor interrupts through external interrupts (MEI) instead,
then mip
.MSIP and mie
.MSIE may both be read-only zeros.
If supervisor mode is not implemented, bits SEIP, STIP, and SSIP of
mip
and SEIE, STIE, and SSIE of mie
are read-only zeros.
If supervisor mode is implemented, bits mip
.SEIP and mie
.SEIE are
the interrupt-pending and interrupt-enable bits for supervisor-level
external interrupts. SEIP is writable in mip
, and may be written by
M-mode software to indicate to S-mode that an external interrupt is
pending. Additionally, the platform-level interrupt controller may
generate supervisor-level external interrupts. Supervisor-level external
interrupts are made pending based on the logical-OR of the
software-writable SEIP bit and the signal from the external interrupt
controller. When mip
is read with a CSR instruction, the value of the
SEIP bit returned in the rd
destination register is the logical-OR of
the software-writable bit and the interrupt signal from the interrupt
controller, but the signal from the interrupt controller is not used to
calculate the value written to SEIP. Only the software-writable SEIP bit
participates in the read-modify-write sequence of a CSRRS or CSRRC
instruction.
For example, if we name the software-writable SEIP bit The SEIP field behavior is designed to allow a higher privilege layer to mimic external interrupts cleanly, without losing any real external interrupts. The behavior of the CSR instructions is slightly modified from regular CSR accesses as a result. |
If supervisor mode is implemented, bits mip
.STIP and mie
.STIE are
the interrupt-pending and interrupt-enable bits for supervisor-level
timer interrupts. STIP is writable in mip
, and may be written by
M-mode software to deliver timer interrupts to S-mode.
If supervisor mode is implemented, bits mip
.SSIP and mie
.SSIE are
the interrupt-pending and interrupt-enable bits for supervisor-level
software interrupts. SSIP is writable in mip
and may also be set to 1
by a platform-specific interrupt controller.
If the Sscofpmf extension is implemented, bits mip
.LCOFIP and mie
.LCOFIE
are the interrupt-pending and interrupt-enable bits for local counter-overflow
interrupts.
LCOFIP is read-write in mip
and reflects the occurrence of a local
counter-overflow overflow interrupt request resulting from any of the
mhpmeventn
.OF bits being set.
If the Sscofpmf extension is not implemented, mip
.LCOFIP and mie
.LCOFIE are
read-only zeros.
Multiple simultaneous interrupts destined for M-mode are handled in the following decreasing priority order: MEI, MSI, MTI, SEI, SSI, STI, LCOFI.
The machine-level interrupt fixed-priority ordering rules were developed with the following rationale. Interrupts for higher privilege modes must be serviced before interrupts for lower privilege modes to support preemption. The platform-specific machine-level interrupt sources in bits 16 and above have platform-specific priority, but are typically chosen to have the highest service priority to support very fast local vectored interrupts. External interrupts are handled before internal (timer/software) interrupts as external interrupts are usually generated by devices that might require low interrupt service times. Software interrupts are handled before internal timer interrupts,
because internal timer interrupts are usually intended for time slicing,
where time precision is less important, whereas software interrupts are
used for inter-processor messaging. Software interrupts can be avoided
when high-precision timing is required, or high-precision timer
interrupts can be routed via a different interrupt path. Software
interrupts are located in the lowest four bits of |
Restricted views of the mip
and mie
registers appear as the sip
and sie
registers for supervisor level. If an interrupt is delegated
to S-mode by setting a bit in the mideleg
register, it becomes visible
in the sip
register and is maskable using the sie
register.
Otherwise, the corresponding bits in sip
and sie
are read-only zero.