mie

Machine Interrupt Enable

The mie and mip CSRs are MXLEN-bit read/write registers used when the CLINT or PLIC interrupt controllers are present. Note that the CLINT refers to an interrupt controller used by some RISC-V implementations but isn’t a ratified RISC-V International standard.

The mip CSR contains information on pending interrupts, while mie is the corresponding CSR containing interrupt enable bits. Interrupt cause number i (as reported in the mcause CSR) corresponds to 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.

An interrupt i will trap to M-mode (causing the privilege mode to change to M-mode) if all of the following are true:

  • 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;

  • bit i is set in both mip and mie

  • 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 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 mip register as its presence is implicitly known when executing the NMI trap handler.

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 B and the signal from the external interrupt controller E, then if csrrs t0, mip, t1 is executed, t0[9] is written with B || E, then B is written with B || t1[9]. If csrrw t0, mip, t1 is executed, then t0[9] is written with B || E, and B is simply written with t1[9]. In neither case does B depend upon E.

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.

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 mip as these are often written by software, and this position allows the use of a single CSR instruction with a five-bit immediate.

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.

Attributes

Defining Extension

  • Sm, version >= 0

CSR Address

0x304

Length

32-bit

64-bit

Privilege Mode

M

Format

This CSR format changes dynamically.

svg
svg

Field Summary

Name Location Type Reset Value

SSIE

1

RW

0

VSSIE

2

RW

0

MSIE

3

RW

0

STIE

5

RW

0

VSTIE

6

RW

0

MTIE

7

RW

0

SEIE

9

RW

0

VSEIE

10

RW

0

MEIE

11

RW

0

SGEIE

12

RW

0

LCOFIE

13

RW

0

Fields

SSIE

Location

1

Description

Enables Supervisor Software Interrupts.

Alias of sie.SSIE when mideleg.SSI is set. Otherwise, sie.SSIE is read-only 0.

Type

RW

Reset value

0

VSSIE

Location

2

Description

Enables Virtual Supervisor Software Interrupts.

Alias of hie.VSSIE.

Alias of vsie.SSIE when hideleg.VSSI is set. Otherwise, vseie.SSIE is read-only 0.

Alias of sie.SSIE when hideleg.VSSI is set and the current mode is VS or VU
(Because mie is inaccessible in VS or VU mode, this alias can never be observed by software).

Type

RW

Reset value

0

MSIE

Location

3

Description

Enables Machine Software Interrupts.

Type

RW

Reset value

0

STIE

Location

5

Description

Enables Supervisor Timer Interrupts.

Alias of sip when mideleg.STI is set. Otherwise, sip is read-only 0.

Type

RW

Reset value

0

VSTIE

Location

6

Description

Enables Virtual Supervisor Timer Interrupts.

Alias of hie.VSTIE.

Alias of vsie.STIE when hideleg.VSTI is set. Otherwise, vseie.STIE is read-only 0.

Alias of sie.STIE when hideleg.VSTI is set and the current mode is VS or VU
(Because mie is inaccessible in VS or VU mode, this alias can never be observed by software).

Type

RW

Reset value

0

MTIE

Location

7

Description

Enables Machine Timer Interrupts.

Type

RW

Reset value

0

SEIE

Location

9

Description

Enables Supervisor External Interrupts.

Alias of sie.SEIE when mideleg.SEI is set. Otherwise, sie.SEIE is read-only 0.

Type

RW

Reset value

0

VSEIE

Location

10

Description

Enables Virtual Supervisor External Interrupts.

Alias of hie.VSEIE.

Alias of vsie.SEIE when hideleg.VSEI is set. Otherwise, vseie.SEIE is read-only 0.

Alias of sie.SEIE when hideleg.VSEI is set and the current mode is VS or VU
(Because mie is inaccessible in VS or VU mode, this alias can never be observed by software).

Type

RW

Reset value

0

MEIE

Location

11

Description

Enables Machine External Interrupts.

Type

RW

Reset value

0

SGEIE

Location

12

Description

Enables Supervisor Guest External Interrupts

Alias of hie.SGEIE.

Type

RW

Reset value

0

LCOFIE

Location

13

Description

Enables Local Counter Overflow Interrupts.

Alias of sie.LCOFIE when mideleg.LCOFI is set. Otherwise, sie.LCOFIE is an independent writeable bit when mvien.LCOFI is set or is read-only 0.

Alias of vsip.LCOFIE when hideleg.LCOFI is set. Otherwise, vsip.LCOFIE is read-only 0.

Type

RW

Reset value

0