diff options
author | Andrew Waterman <andrew@sifive.com> | 2019-06-19 17:43:27 -0700 |
---|---|---|
committer | Andrew Waterman <andrew@sifive.com> | 2019-06-19 21:12:07 -0700 |
commit | 2151617320bc7d27d3ce8415be306ab51c362508 (patch) | |
tree | 836e16eda65fa62ef60fdc1ce7258259a6b152a5 | |
parent | 6568b54f83d8a1c390f2f47a29b294d2f9ba270d (diff) | |
download | riscv-isa-manual-2151617320bc7d27d3ce8415be306ab51c362508.zip riscv-isa-manual-2151617320bc7d27d3ce8415be306ab51c362508.tar.gz riscv-isa-manual-2151617320bc7d27d3ce8415be306ab51c362508.tar.bz2 |
Add endianness control proposal to priv spec
Contributed by @jhauser-us
-rw-r--r-- | src/machine.tex | 176 | ||||
-rw-r--r-- | src/priv-csrs.tex | 1 | ||||
-rw-r--r-- | src/priv-preface.tex | 1 | ||||
-rw-r--r-- | src/supervisor.tex | 57 |
4 files changed, 198 insertions, 37 deletions
diff --git a/src/machine.tex b/src/machine.tex index 3f3d956..014beb8 100644 --- a/src/machine.tex +++ b/src/machine.tex @@ -1,4 +1,4 @@ -\chapter{Machine-Level ISA, Version 1.11} +\chapter{Machine-Level ISA, Version 1.12} \label{machine} This chapter describes the machine-level operations available in @@ -355,11 +355,11 @@ For efficiency, system implementers should aim to reduce the magnitude of the largest hart ID used in a system. \end{commentary} -\subsection{Machine Status Register ({\tt mstatus})} +\subsection{Machine Status Registers ({\tt mstatus} and {\tt mstatush})} The {\tt mstatus} register is an MXLEN-bit read/write register -formatted as shown in Figure~\ref{mstatusreg-rv32} for RV32 and -Figure~\ref{mstatusreg} for RV64. The {\tt mstatus} +formatted as shown in Figure~\ref{mstatusreg} for RV64 and +Figure~\ref{mstatusreg-rv32} for RV32. The {\tt mstatus} register keeps track of and controls the hart's current operating state. Restricted views of the {\tt mstatus} register appear as the {\tt sstatus} and {\tt ustatus} registers in the S-level and U-level @@ -369,33 +369,42 @@ ISAs respectively. {\footnotesize \begin{center} \setlength{\tabcolsep}{4pt} -\begin{tabular}{cKccccccc} +\begin{tabular}{cRccccYcccccc} \\ -\instbit{31} & -\instbitrange{30}{23} & +\instbit{MXLEN-1} & +\instbitrange{MXLEN-2}{38} & +\instbit{37} & +\instbit{36} & +\instbitrange{35}{34} & +\instbitrange{33}{32} & +\instbitrange{31}{23} & \instbit{22} & \instbit{21} & \instbit{20} & \instbit{19} & \instbit{18} & -\instbit{17} & \\ \hline \multicolumn{1}{|c|}{SD} & \multicolumn{1}{c|}{\wpri} & +\multicolumn{1}{c|}{MBE} & +\multicolumn{1}{c|}{SBE} & +\multicolumn{1}{c|}{SXL[1:0]} & +\multicolumn{1}{c|}{UXL[1:0]} & +\multicolumn{1}{c|}{\wpri} & \multicolumn{1}{c|}{TSR} & \multicolumn{1}{c|}{TW} & \multicolumn{1}{c|}{TVM} & \multicolumn{1}{c|}{MXR} & \multicolumn{1}{c|}{SUM} & -\multicolumn{1}{c|}{MPRV} & \\ \hline -1 & 8 & 1 & 1 & 1 & 1 & 1 & 1 & \\ +1 & MXLEN-39 & 1 & 1 & 2 & 2 & 9 & 1 & 1 & 1 & 1 & 1 & \\ \end{tabular} -\begin{tabular}{cccccccccccccc} +\begin{tabular}{ccccccccccccccc} \\ & +\instbit{17} & \instbitrange{16}{15} & \instbitrange{14}{13} & \instbitrange{12}{11} & @@ -411,13 +420,14 @@ ISAs respectively. \instbit{0} \\ \hline & -\multicolumn{1}{|c|}{XS[1:0]} & +\multicolumn{1}{|c|}{MPRV} & +\multicolumn{1}{c|}{XS[1:0]} & \multicolumn{1}{c|}{FS[1:0]} & \multicolumn{1}{c|}{MPP[1:0]} & \multicolumn{1}{c|}{\wpri} & \multicolumn{1}{c|}{SPP} & \multicolumn{1}{c|}{MPIE} & -\multicolumn{1}{c|}{\wpri} & +\multicolumn{1}{c|}{UBE} & \multicolumn{1}{c|}{SPIE} & \multicolumn{1}{c|}{UPIE} & \multicolumn{1}{c|}{MIE} & @@ -425,26 +435,23 @@ ISAs respectively. \multicolumn{1}{c|}{SIE} & \multicolumn{1}{c|}{UIE} \\ \hline - & 2 & 2 & 2 & 2 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 \\ + & 1 & 2 & 2 & 2 & 2 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 \\ \end{tabular} \end{center} } \vspace{-0.1in} -\caption{Machine-mode status register ({\tt mstatus}) for RV32.} -\label{mstatusreg-rv32} +\caption{Machine-mode status register ({\tt mstatus}) for RV64.} +\label{mstatusreg} \end{figure*} \begin{figure*}[h!] {\footnotesize \begin{center} \setlength{\tabcolsep}{4pt} -\begin{tabular}{cRccYccccccc} +\begin{tabular}{cKccccccc} \\ -\instbit{MXLEN-1} & -\instbitrange{MXLEN-2}{36} & -\instbitrange{35}{34} & -\instbitrange{33}{32} & -\instbitrange{31}{23} & +\instbit{31} & +\instbitrange{30}{23} & \instbit{22} & \instbit{21} & \instbit{20} & @@ -455,9 +462,6 @@ ISAs respectively. \hline \multicolumn{1}{|c|}{SD} & \multicolumn{1}{c|}{\wpri} & -\multicolumn{1}{c|}{SXL[1:0]} & -\multicolumn{1}{c|}{UXL[1:0]} & -\multicolumn{1}{c|}{\wpri} & \multicolumn{1}{c|}{TSR} & \multicolumn{1}{c|}{TW} & \multicolumn{1}{c|}{TVM} & @@ -466,7 +470,7 @@ ISAs respectively. \multicolumn{1}{c|}{MPRV} & \\ \hline -1 & MXLEN-37 & 2 & 2 & 9 & 1 & 1 & 1 & 1 & 1 & 1 & \\ +1 & 8 & 1 & 1 & 1 & 1 & 1 & 1 & \\ \end{tabular} \begin{tabular}{cccccccccccccc} \\ @@ -492,7 +496,7 @@ ISAs respectively. \multicolumn{1}{c|}{\wpri} & \multicolumn{1}{c|}{SPP} & \multicolumn{1}{c|}{MPIE} & -\multicolumn{1}{c|}{\wpri} & +\multicolumn{1}{c|}{UBE} & \multicolumn{1}{c|}{SPIE} & \multicolumn{1}{c|}{UPIE} & \multicolumn{1}{c|}{MIE} & @@ -505,8 +509,42 @@ ISAs respectively. \end{center} } \vspace{-0.1in} -\caption{Machine-mode status register ({\tt mstatus}) for RV64.} -\label{mstatusreg} +\caption{Machine-mode status register ({\tt mstatus}) for RV32.} +\label{mstatusreg-rv32} +\end{figure*} + +For RV32 only, {\tt mstatush} is a 32-bit read/write register formatted +as shown in Figure~\ref{mstatushreg}. +Bits 30:4 of {\tt mstatush} generally contain the same fields found in +bits 62:36 of {\tt mstatus} for RV64. +Fields SD, SXL, and UXL do not exist in {\tt mstatush}. + +The {\tt mstatush} register is not required to be implemented if every field +would be hardwired to zero. + +\begin{figure*}[h!] +{\footnotesize +\begin{center} +\setlength{\tabcolsep}{4pt} +\begin{tabular}{JccF} +\\ +\instbitrange{31}{6} & +\instbit{5} & +\instbit{4} & +\instbitrange{3}{0} \\ +\hline +\multicolumn{1}{|c|}{\wpri} & +\multicolumn{1}{c|}{MBE} & +\multicolumn{1}{c|}{SBE} & +\multicolumn{1}{c|}{\wpri} \\ +\hline +26 & 1 & 1 & 4 \\ +\end{tabular} +\end{center} +} +\vspace{-0.1in} +\caption{Additional machine-mode status register ({\tt mstatush}) for RV32.} +\label{mstatushreg} \end{figure*} @@ -684,6 +722,86 @@ encoded in page-table entries. In particular, they have no impact on whether access exceptions are raised due to PMAs or PMP. \end{commentary} +\subsubsection{Endianness Control in {\tt mstatus} and {\tt mstatush} Registers} + +The MBE, SBE, and UBE bits in {\tt mstatus} and {\tt mstatush} are +\warl\ fields that control the endianness of memory accesses other than +instruction fetches. +Instruction fetches are always little-endian. + +MBE controls whether non-instruction-fetch memory accesses made from +M-mode (assuming {\tt mstatus}.MPRV=0) are little-endian (MBE=0) or +big-endian (MBE=1). + +If S-mode is not supported, SBE is hardwired to~0. +Otherwise, when address translation is not active, SBE controls whether +explicit load and store memory accesses made from S-mode are +little-endian (SBE=0) or big-endian (SBE=1). +When page-based address translation is active, SBE controls whether +explicit memory accesses to non-U-mode-accessible pages (U=0 in +Figure~\ref{sv32pte}) are little-endian or big-endian. + +If U-mode is not supported, UBE is hardwired to~0. +Otherwise, when address translation is not active, UBE controls whether +explicit load and store memory accesses made from U-mode are +little-endian (UBE=0) or big-endian (UBE=1). +When page-based address translation is active, UBE controls whether +explicit memory accesses to U-mode-accessible pages (U=1 in +Figure~\ref{sv32pte}) are little-endian or big-endian, including explicit +accesses to such pages made from S-mode with {\tt sstatus}.SUM=1. + +For {\em implicit} accesses to supervisor-level memory management data +structures, such as page tables, endianness is always controled by SBE. + +If S-mode is supported, an implementation may hardwire SBE so that +SBE=MBE. +If U-mode is supported, an implementation may hardwire UBE so that +UBE=MBE or UBE=SBE. + +\begin{commentary} +An implementation supports only little-endian memory accesses if fields +MBE, SBE, and UBE are all hardwired to~0. +An implementation supports only big-endian memory accesses (aside from +instruction fetches) if MBE is hardwired to 1 and SBE and UBE are each +hardwired to 1 when S-mode and U-mode are supported. +\end{commentary} + +\begin{commentary} +Standard RISC-V ABIs are expected to be purely little-endian-only or +big-endian-only, with no accommodation for mixing endianness. +Nevertheless, endianness control has been defined so as to permit, for +instance, an OS of one endianness to execute user-mode programs of the +opposite endianness. +Consideration has been given also to the possibility of nonstandard +usages whereby software flips the endianness of memory accesses as +needed. + +When page-based address translation is active, pages that are accessible +to user mode have endianness determined by UBE, even if the access is +made from S-mode (with {\tt sstatus}.SUM=1). +Pages that are not accessible to user mode have endianness determined by +SBE. +\end{commentary} + +\begin{commentary} +RISC-V instructions are uniformly little-endian to decouple instruction +encoding from the current endianness settings, for the benefit of both +hardware and software. +Otherwise, for instance, a RISC-V assembler or disassembler would always +need to know the intended active endianness, despite that the endianness +mode might change dynamically during execution. +In contrast, by giving instructions a fixed endianness, it is sometimes +possible for carefully written software to be endianness-agnostic even in +binary form, much like position-independent code. + +The choice to have instructions be only little-endian does have +consequences, however, for RISC-V software that encodes or decodes +machine instructions. +In big-endian mode, such software must account for the fact that explicit +loads and stores have endianness opposite that of instructions, for +example by swapping byte order after loads and before stores. +\end{commentary} + \subsubsection{Virtualization Support in {\tt mstatus} Register} \label{virt-control} diff --git a/src/priv-csrs.tex b/src/priv-csrs.tex index 445a2b7..dad890b 100644 --- a/src/priv-csrs.tex +++ b/src/priv-csrs.tex @@ -281,6 +281,7 @@ Number & Privilege & Name & Description \\ \tt 0x304 & MRW &\tt mie & Machine interrupt-enable register. \\ \tt 0x305 & MRW &\tt mtvec & Machine trap-handler base address. \\ \tt 0x306 & MRW &\tt mcounteren & Machine counter enable. \\ +\tt 0x310 & MRW &\tt mstatush & Additional machine status register, RV32 only. \\ \hline \multicolumn{4}{|c|}{Machine Trap Handling} \\ \hline diff --git a/src/priv-preface.tex b/src/priv-preface.tex index 1ed7b39..1ce8d4e 100644 --- a/src/priv-preface.tex +++ b/src/priv-preface.tex @@ -31,6 +31,7 @@ Changes from version 1.11 include: \itemsep 1pt \item A revised hypervisor architecture proposal that represents VS-mode CSR state more simply. +\item Added optional big-endian and bi-endian support. \end{itemize} \newpage diff --git a/src/supervisor.tex b/src/supervisor.tex index 503c8bd..28e27b4 100644 --- a/src/supervisor.tex +++ b/src/supervisor.tex @@ -1,4 +1,4 @@ -\chapter{Supervisor-Level ISA, Version 1.11} +\chapter{Supervisor-Level ISA, Version 1.12} \label{supervisor} This chapter describes the RISC-V supervisor-level architecture, which @@ -46,7 +46,8 @@ register keeps track of the processor's current operating state. {\footnotesize \begin{center} \setlength{\tabcolsep}{4pt} -\begin{tabular}{cWcccccWcWccWcc} +\scalebox{0.95}{ +\begin{tabular}{cWcccccWcccccWcc} \\ \instbit{31} & \instbitrange{30}{20} & @@ -57,7 +58,8 @@ register keeps track of the processor's current operating state. \instbitrange{14}{13} & \instbitrange{12}{9} & \instbit{8} & -\instbitrange{7}{6} & +\instbit{7} & +\instbit{6} & \instbit{5} & \instbit{4} & \instbitrange{3}{2} & @@ -74,6 +76,7 @@ register keeps track of the processor's current operating state. \multicolumn{1}{c|}{\wpri} & \multicolumn{1}{c|}{SPP} & \multicolumn{1}{c|}{\wpri} & +\multicolumn{1}{c|}{UBE} & \multicolumn{1}{c|}{SPIE} & \multicolumn{1}{c|}{UPIE} & \multicolumn{1}{c|}{\wpri} & @@ -81,8 +84,8 @@ register keeps track of the processor's current operating state. \multicolumn{1}{c|}{UIE} \\ \hline -1 & 11 & 1 & 1 & 1 & 2 & 2 & 4 & 1 & 2 & 1 & 1 & 2 & 1 & 1 \\ -\end{tabular} +1 & 11 & 1 & 1 & 1 & 2 & 2 & 4 & 1 & 1 & 1 & 1 & 1 & 2 & 1 & 1 \\ +\end{tabular}} \end{center} } \vspace{-0.1in} @@ -116,14 +119,15 @@ register keeps track of the processor's current operating state. \hline 1 & SXLEN-35 & 2 & 12 & 1 & 1 & 1 & \\ \end{tabular} -\begin{tabular}{ccccccccccc} +\begin{tabular}{cccccccccccc} \\ & \instbitrange{16}{15} & \instbitrange{14}{13} & \instbitrange{12}{9} & \instbit{8} & -\instbitrange{7}{6} & +\instbit{7} & +\instbit{6} & \instbit{5} & \instbit{4} & \instbitrange{3}{2} & @@ -136,13 +140,14 @@ register keeps track of the processor's current operating state. \multicolumn{1}{c|}{\wpri} & \multicolumn{1}{c|}{SPP} & \multicolumn{1}{c|}{\wpri} & +\multicolumn{1}{c|}{UBE} & \multicolumn{1}{c|}{SPIE} & \multicolumn{1}{c|}{UPIE} & \multicolumn{1}{c|}{\wpri} & \multicolumn{1}{c|}{SIE} & \multicolumn{1}{c|}{UIE} \\ \hline - & 2 & 2 & 4 & 1 & 2 & 1 & 1 & 2 & 1 & 1 \\ + & 2 & 2 & 4 & 1 & 1 & 1 & 1 & 1 & 2 & 1 & 1 \\ \end{tabular} \end{center} } @@ -242,6 +247,42 @@ instruction page-fault handler to direct supervisor software to use the alternate mapping. \end{commentary} +\subsection{Endianness Control in {\tt sstatus} Register} + +The UBE bit is a \warl\ field that controls the endianness of explicit +memory accesses for U-mode, which may differ from the endianness of +memory accesses in S-mode. +An implementation may hardwire UBE to specify always the same endianness +as for S-mode. + +UBE has no effect on instruction fetches, which are {\em implicit} memory +accesses that are always little-endian. + +When address translation is not active, UBE controls whether explicit +load and store memory accesses made from U-mode are little-endian (UBE=0) +or big-endian (UBE=1). +When page-based address translation is active, UBE controls whether +explicit memory accesses to U-mode-accessible pages (U=1 in +Figure~\ref{sv32pte}) are little-endian or big-endian, including explicit +accesses to such pages made from S-mode with SUM=1. + +For {\em implicit} accesses to supervisor-level memory management data +structures, such as page tables, S-mode endianness always applies and UBE +is ignored. + +\begin{commentary} +Standard RISC-V ABIs are expected to be purely little-endian-only or +big-endian-only, with no accommodation for mixing endianness. +Nevertheless, endianness control has been defined so as to permit an +OS of one endianness to execute user-mode programs of the opposite +endianness. + +When page-based address translation is active, pages that are accessible +to user mode have endianness determined by UBE, even if the access is +made from S-mode (with SUM=1). +For pages that are not accessible to user mode, UBE is ignored. +\end{commentary} + \subsection{Supervisor Trap Vector Base Address Register ({\tt stvec})} The {\tt stvec} register is an SXLEN-bit read/write register that holds |