scause
Supervisor Cause
Reports the cause of the latest exception.
Attributes
Requirement |
|||
|---|---|---|---|
Defining extensions |
|
||
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.
Field Summary
| Name | Location | Type | Reset Value |
|---|---|---|---|
* 31 when CSR[mstatus].SXL == 0 * 63 when CSR[mstatus].SXL == 1 |
RW-RH |
UNDEFINED_LEGAL |
|
* 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 writable.
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 writable.
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:
<%- implemented_interrupt_codes.sort_by { |code| code.num }.each do |code| -%> |
<%= code.num %> |
<%= code.name %> <%- end -%> |
Valid exception codes are:
<%- implemented_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;
}