ssp

Shadow Stack Pointer

The ssp CSR is an unprivileged read-write (URW) CSR that reads and writes XLEN low order bits of the shadow stack pointer. The ssp is always as wide as the XLEN of the current privilege mode. The bits 1:0 of ssp are read-only zero. If the UXLEN or SXLEN may never be 32, then the bit 2 is also read-only zero.

Attributes

Requirement

Defining extensions

Zicfiss

Shadow Stack

CSR Address

0x11

Length

* 32 when (priv_mode() == PrivilegeMode::M && CSR[misa].MXL == 0) || (priv_mode() == PrivilegeMode::S && CSR[mstatus].SXL == %%) || (priv_mode() == PrivilegeMode::VS && CSR[hstatus].VSXL == %%) * 64 when (priv_mode() == PrivilegeMode::M && CSR[misa].MXL == 1) || (priv_mode() == PrivilegeMode::S && CSR[mstatus].SXL == %%) || (priv_mode() == PrivilegeMode::VS && CSR[hstatus].VSXL == %%)

Privilege Mode

U

Format

This CSR format changes dynamically.

ssp Format when (priv_mode() == PrivilegeMode::M && CSR[misa].MXL == 0) || (priv_mode() == PrivilegeMode::S && CSR[mstatus].SXL == 0) || (priv_mode() == PrivilegeMode::VS && CSR[hstatus].VSXL == 0)
Figure 1. ssp Format when (priv_mode() == PrivilegeMode::M && CSR[misa].MXL == 0) || (priv_mode() == PrivilegeMode::S && CSR[mstatus].SXL == 0) || (priv_mode() == PrivilegeMode::VS && CSR[hstatus].VSXL == 0)
ssp Format when (priv_mode() == PrivilegeMode::M && CSR[misa].MXL == 1) || (priv_mode() == PrivilegeMode::S && CSR[mstatus].SXL == 1) || (priv_mode() == PrivilegeMode::VS && CSR[hstatus].VSXL == 1)
Figure 2. ssp Format when (priv_mode() == PrivilegeMode::M && CSR[misa].MXL == 1) || (priv_mode() == PrivilegeMode::S && CSR[mstatus].SXL == 1) || (priv_mode() == PrivilegeMode::VS && CSR[hstatus].VSXL == 1)

Field Summary

Name Location Type Reset Value

ssp.VALUE

* 31:2 when CSR[mstatus].UXL == 0 * 63:3 when CSR[mstatus].UXL == 1

RW

UNDEFINED_LEGAL

Fields

VALUE

Location
  • 31:2 when CSR[mstatus].UXL == 0

  • 63:3 when CSR[mstatus].UXL == 1

Description

The value in ssp points to the top of the shadow stack, which is the address of the last element stored on the shadow stack.

Type

RW

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:

VALUE = if ((mode() < PrivilegeMode::M && CSR[menvcfg].SSE == 0) ||
    (mode() == PrivilegeMode::U && CSR[senvcfg].SSE == 0)) {
  raise(ExceptionCode::IllegalInstruction, mode(), $encoding);
} else if ((mode() == PrivilegeMode::VS && CSR[henvcfg].SSE == 0) ||
           (mode() == PrivilegeMode::VU && (CSR[henvcfg].SSE == 0 || CSR[senvcfg].SSE == 0))) {
  raise(ExceptionCode::VirtualInstruction, mode(), $encoding);
} else {
  return csr_value.VALUE;
}

Software read

This CSR may return a value that is different from what is stored in hardware.

if ((mode() < PrivilegeMode::M && CSR[menvcfg].SSE == 0) || (mode() == PrivilegeMode::U && CSR[senvcfg].SSE == 0)) {
  raise(ExceptionCode::IllegalInstruction, mode(), $encoding);
} else if ((mode() == PrivilegeMode::VS && CSR[henvcfg].SSE == 0) || (mode() == PrivilegeMode::VU && (CSR[henvcfg].SSE == 0 || CSR[senvcfg].SSE == 0))) {
  raise(ExceptionCode::VirtualInstruction, mode(), $encoding);
} else if (xlen() == 32) {
  return ($bits(CSR[CSR[ssp]]) & ~MXLEN'3);
}
return ($bits(CSR[CSR[ssp]]) & ~MXLEN'7);