scause

Supervisor Cause

Reports the cause of the latest exception.

Attributes

Defining Extension

  • S, version >= 0

CSR Address

0x142

Length

32 when CSR[mstatus].SXL == 0 64 when CSR[mstatus].SXL == 1

Privilege Mode

S

Format

This CSR format changes dynamically.

scause Format when CSR[mstatus].SXL == 0
Figure 1. scause Format when CSR[mstatus].SXL == 0
scause Format when CSR[mstatus].SXL == 1
Figure 2. scause Format when CSR[mstatus].SXL == 1

Field Summary

Name Location Type Reset Value

scause.INT

* 31 when CSR[mstatus].SXL == 0 * 63 when CSR[mstatus].SXL == 1

RW-RH

UNDEFINED_LEGAL

scause.CODE

* 30:0 when CSR[mstatus].SXL == 0 * 62:0 when CSR[mstatus].SXL == 1

RW-RH

UNDEFINED_LEGAL

Fields

INT

Location
  • 31 when CSR[mstatus].SXL == 0

  • 63 when CSR[mstatus].SXL == 1

Description

Written by hardware when a trap is taken into S-mode.

When set, the last exception was caused by an asynchronous Interrupt.

scause.INT is writeable.

If scause is written with an undefined cause (combination of scause.INT and scause.CODE), an Illegal Instruction exception occurs.
If scause is written with an undefined cause (combination of scause.INT and scause.CODE), neither scause.INT nor scause.CODE are modified.
Type

RW-RH

Reset value

UNDEFINED_LEGAL

CODE

Location
  • 30:0 when CSR[mstatus].SXL == 0

  • 62:0 when CSR[mstatus].SXL == 1

Description

Written by hardware when a trap is taken into S-mode.

Holds the interrupt or exception code for the last taken trap.

scause.CODE is writeable.

If scause is written with an undefined cause (combination of scause.INT and scause.CODE), an Illegal Instruction exception occurs.
If scause is written with an undefined cause (combination of scause.INT and scause.CODE), neither scause.INT nor scause.CODE are modified.

Valid interrupt codes are:

<%- interrupt_codes.sort_by { |code| code.num }.each do |code| -%>

<%= code.num %>

<%= code.name %> <%- end -%>

Valid exception codes are:

<%- exception_codes.sort_by { |code| code.num }.each do |code| -%>

<%= code.num %>

<%= code.name %> <%- end -%>

Type

RW-RH

Reset value

UNDEFINED_LEGAL

Software write

This CSR may store a value that is different from what software attempts to write.

When a software write occurs (e.g., through csrrw), the following determines the written value:

INT = # the write only holds if the INT/CODE combination is valid
# otherwise, the old value is retained
if (csr_value.INT == 1) {
  if (valid_interrupt_code?(csr_value.CODE)) {
    return 1;
  }
  return ILLEGAL_WLRL;
} else {
  if (valid_exception_code?(csr_value.CODE)) {
    return 1;
  }
  return ILLEGAL_WLRL;
}

CODE = # the write only holds if the INT/CODE combination is valid
# otherwise, the old value is retained
if (csr_value.INT == 1) {
  if (valid_interrupt_code?(csr_value.CODE)) {
    return csr_value.CODE;
  }
  return ILLEGAL_WLRL;
} else {
  if (valid_exception_code?(csr_value.CODE)) {
    return csr_value.CODE;
  }
  return ILLEGAL_WLRL;
}