mirror of
https://github.com/openhwgroup/cva6.git
synced 2025-06-28 09:16:22 -04:00
update riscv-isa-manual to riscv-isa-release-ebf2e3a0b-2024-07-03 (#2323)
since last riscv-isa-manual update (CVA6 commit 105d3601b
):
- minor documentation changes
- use of docs-resources submodule inside riscv-isa-manual
- requires asciidoctor-lists
This commit is contained in:
parent
2616d5e649
commit
0bd8b8693a
13 changed files with 485 additions and 420 deletions
File diff suppressed because one or more lines are too long
|
@ -5,7 +5,7 @@
|
||||||
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||||
<meta name="generator" content="Asciidoctor 2.0.22">
|
<meta name="generator" content="Asciidoctor 2.0.22">
|
||||||
<meta name="description" content="Volume I - Unprivileged Architecture">
|
<meta name="description" content="Unprivileged Architecture">
|
||||||
<title>The RISC-V Instruction Set Manual for CV32A65X: Volume I - Unprivileged Architecture</title>
|
<title>The RISC-V Instruction Set Manual for CV32A65X: Volume I - Unprivileged Architecture</title>
|
||||||
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Open+Sans:300,300italic,400,400italic,600,600italic%7CNoto+Serif:400,400italic,700,700italic%7CDroid+Sans+Mono:400,700">
|
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Open+Sans:300,300italic,400,400italic,600,600italic%7CNoto+Serif:400,400italic,700,700italic%7CDroid+Sans+Mono:400,700">
|
||||||
<style>
|
<style>
|
||||||
|
@ -440,7 +440,7 @@ body.book #toc,body.book #preamble,body.book h1.sect0,body.book .sect1>h2{page-b
|
||||||
<div id="header">
|
<div id="header">
|
||||||
<h1>The RISC-V Instruction Set Manual for CV32A65X: Volume I - Unprivileged Architecture</h1>
|
<h1>The RISC-V Instruction Set Manual for CV32A65X: Volume I - Unprivileged Architecture</h1>
|
||||||
<div class="details">
|
<div class="details">
|
||||||
<span id="revnumber">version 20240612</span>
|
<span id="revnumber">version 20240703</span>
|
||||||
</div>
|
</div>
|
||||||
<div id="toc" class="toc2">
|
<div id="toc" class="toc2">
|
||||||
<div id="toctitle">Table of Contents</div>
|
<div id="toctitle">Table of Contents</div>
|
||||||
|
@ -1019,7 +1019,7 @@ Jean-Roch Coulon, André Sintzoff.</em></p>
|
||||||
OpenHW Group CV32A65X.</p>
|
OpenHW Group CV32A65X.</p>
|
||||||
</div>
|
</div>
|
||||||
<div class="paragraph">
|
<div class="paragraph">
|
||||||
<p><strong class="big"><em>Preface to Document Version 20240612</em></strong></p>
|
<p><strong class="big"><em>Preface to Document Version 20240703</em></strong></p>
|
||||||
</div>
|
</div>
|
||||||
<div class="paragraph">
|
<div class="paragraph">
|
||||||
<p>This document describes the RISC-V unprivileged architecture.</p>
|
<p>This document describes the RISC-V unprivileged architecture.</p>
|
||||||
|
@ -1138,6 +1138,11 @@ to change before ratification.</p>
|
||||||
<td class="tableblock halign-center valign-top"><p class="tableblock"><strong>Ratifed</strong></p></td>
|
<td class="tableblock halign-center valign-top"><p class="tableblock"><strong>Ratifed</strong></p></td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
|
<td class="tableblock halign-center valign-top"><p class="tableblock"><strong>Zabha</strong></p></td>
|
||||||
|
<td class="tableblock halign-left valign-top"><p class="tableblock"><strong>1.0</strong></p></td>
|
||||||
|
<td class="tableblock halign-center valign-top"><p class="tableblock"><strong>Ratifed</strong></p></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
<td class="tableblock halign-center valign-top"><p class="tableblock"><strong>RVWMO</strong></p></td>
|
<td class="tableblock halign-center valign-top"><p class="tableblock"><strong>RVWMO</strong></p></td>
|
||||||
<td class="tableblock halign-left valign-top"><p class="tableblock"><strong>2.0</strong></p></td>
|
<td class="tableblock halign-left valign-top"><p class="tableblock"><strong>2.0</strong></p></td>
|
||||||
<td class="tableblock halign-center valign-top"><p class="tableblock"><strong>Ratified</strong></p></td>
|
<td class="tableblock halign-center valign-top"><p class="tableblock"><strong>Ratified</strong></p></td>
|
||||||
|
@ -1292,6 +1297,16 @@ to change before ratification.</p>
|
||||||
<td class="tableblock halign-left valign-top"><p class="tableblock"><strong>1.0</strong></p></td>
|
<td class="tableblock halign-left valign-top"><p class="tableblock"><strong>1.0</strong></p></td>
|
||||||
<td class="tableblock halign-center valign-top"><p class="tableblock"><strong>Ratified</strong></p></td>
|
<td class="tableblock halign-center valign-top"><p class="tableblock"><strong>Ratified</strong></p></td>
|
||||||
</tr>
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td class="tableblock halign-center valign-top"><p class="tableblock"><strong>Zicfiss</strong></p></td>
|
||||||
|
<td class="tableblock halign-left valign-top"><p class="tableblock"><strong>1.0</strong></p></td>
|
||||||
|
<td class="tableblock halign-center valign-top"><p class="tableblock"><strong>Ratified</strong></p></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td class="tableblock halign-center valign-top"><p class="tableblock"><strong>Zicfilp</strong></p></td>
|
||||||
|
<td class="tableblock halign-left valign-top"><p class="tableblock"><strong>1.0</strong></p></td>
|
||||||
|
<td class="tableblock halign-center valign-top"><p class="tableblock"><strong>Ratified</strong></p></td>
|
||||||
|
</tr>
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
<div class="paragraph">
|
<div class="paragraph">
|
||||||
|
@ -10047,7 +10062,7 @@ Zcb can be implemented on <em>any</em> CPU as the instructions are 16-bit versio
|
||||||
<i class="fa icon-note" title="Note"></i>
|
<i class="fa icon-note" title="Note"></i>
|
||||||
</td>
|
</td>
|
||||||
<td class="content">
|
<td class="content">
|
||||||
<em>c.sext.w</em> is a pseudo-instruction for <em>c.addiw rd, 0</em> (RV64)
|
<em>c.sext.w</em> is a pseudoinstruction for <em>c.addiw rd, 0</em> (RV64)
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
</table>
|
</table>
|
||||||
|
@ -10503,7 +10518,7 @@ Zcmt is primarily targeted at embedded class CPUs due to implementation complexi
|
||||||
</div>
|
</div>
|
||||||
<div class="listingblock">
|
<div class="listingblock">
|
||||||
<div class="content">
|
<div class="content">
|
||||||
<pre class="pygments highlight"><code data-lang="sail">//This is not SAIL, it's pseudo-code. The SAIL hasn't been written yet.
|
<pre class="pygments highlight"><code data-lang="sail">//This is not SAIL, it's pseudocode. The SAIL hasn't been written yet.
|
||||||
|
|
||||||
X(rdc) = EXTZ(mem[X(rs1c)+EXTZ(uimm)][7..0]);</code></pre>
|
X(rdc) = EXTZ(mem[X(rs1c)+EXTZ(uimm)][7..0]);</code></pre>
|
||||||
</div>
|
</div>
|
||||||
|
@ -10573,7 +10588,7 @@ X(rdc) = EXTZ(mem[X(rs1c)+EXTZ(uimm)][7..0]);</code></pre>
|
||||||
</div>
|
</div>
|
||||||
<div class="listingblock">
|
<div class="listingblock">
|
||||||
<div class="content">
|
<div class="content">
|
||||||
<pre class="pygments highlight"><code data-lang="sail">//This is not SAIL, it's pseudo-code. The SAIL hasn't been written yet.
|
<pre class="pygments highlight"><code data-lang="sail">//This is not SAIL, it's pseudocode. The SAIL hasn't been written yet.
|
||||||
|
|
||||||
X(rdc) = EXTZ(load_mem[X(rs1c)+EXTZ(uimm)][15..0]);</code></pre>
|
X(rdc) = EXTZ(load_mem[X(rs1c)+EXTZ(uimm)][15..0]);</code></pre>
|
||||||
</div>
|
</div>
|
||||||
|
@ -10643,7 +10658,7 @@ X(rdc) = EXTZ(load_mem[X(rs1c)+EXTZ(uimm)][15..0]);</code></pre>
|
||||||
</div>
|
</div>
|
||||||
<div class="listingblock">
|
<div class="listingblock">
|
||||||
<div class="content">
|
<div class="content">
|
||||||
<pre class="pygments highlight"><code data-lang="sail">//This is not SAIL, it's pseudo-code. The SAIL hasn't been written yet.
|
<pre class="pygments highlight"><code data-lang="sail">//This is not SAIL, it's pseudocode. The SAIL hasn't been written yet.
|
||||||
|
|
||||||
X(rdc) = EXTS(load_mem[X(rs1c)+EXTZ(uimm)][15..0]);</code></pre>
|
X(rdc) = EXTS(load_mem[X(rs1c)+EXTZ(uimm)][15..0]);</code></pre>
|
||||||
</div>
|
</div>
|
||||||
|
@ -10713,7 +10728,7 @@ X(rdc) = EXTS(load_mem[X(rs1c)+EXTZ(uimm)][15..0]);</code></pre>
|
||||||
</div>
|
</div>
|
||||||
<div class="listingblock">
|
<div class="listingblock">
|
||||||
<div class="content">
|
<div class="content">
|
||||||
<pre class="pygments highlight"><code data-lang="sail">//This is not SAIL, it's pseudo-code. The SAIL hasn't been written yet.
|
<pre class="pygments highlight"><code data-lang="sail">//This is not SAIL, it's pseudocode. The SAIL hasn't been written yet.
|
||||||
|
|
||||||
mem[X(rs1c)+EXTZ(uimm)][7..0] = X(rs2c)</code></pre>
|
mem[X(rs1c)+EXTZ(uimm)][7..0] = X(rs2c)</code></pre>
|
||||||
</div>
|
</div>
|
||||||
|
@ -10783,7 +10798,7 @@ mem[X(rs1c)+EXTZ(uimm)][7..0] = X(rs2c)</code></pre>
|
||||||
</div>
|
</div>
|
||||||
<div class="listingblock">
|
<div class="listingblock">
|
||||||
<div class="content">
|
<div class="content">
|
||||||
<pre class="pygments highlight"><code data-lang="sail">//This is not SAIL, it's pseudo-code. The SAIL hasn't been written yet.
|
<pre class="pygments highlight"><code data-lang="sail">//This is not SAIL, it's pseudocode. The SAIL hasn't been written yet.
|
||||||
|
|
||||||
mem[X(rs1c)+EXTZ(uimm)][15..0] = X(rs2c)</code></pre>
|
mem[X(rs1c)+EXTZ(uimm)][15..0] = X(rs2c)</code></pre>
|
||||||
</div>
|
</div>
|
||||||
|
@ -11572,7 +11587,7 @@ It is implementation defined whether interrupts can also be taken during the seq
|
||||||
<div class="ulist">
|
<div class="ulist">
|
||||||
<ul>
|
<ul>
|
||||||
<li>
|
<li>
|
||||||
<p>A sequence of stores writing the bytes required by the pseudo-code</p>
|
<p>A sequence of stores writing the bytes required by the pseudocode</p>
|
||||||
<div class="ulist">
|
<div class="ulist">
|
||||||
<ul>
|
<ul>
|
||||||
<li>
|
<li>
|
||||||
|
@ -11654,7 +11669,7 @@ addi sp, sp, -64</code></pre>
|
||||||
<div class="ulist">
|
<div class="ulist">
|
||||||
<ul>
|
<ul>
|
||||||
<li>
|
<li>
|
||||||
<p>A sequence of loads reading the bytes required by the pseudo-code.</p>
|
<p>A sequence of loads reading the bytes required by the pseudocode.</p>
|
||||||
<div class="ulist">
|
<div class="ulist">
|
||||||
<ul>
|
<ul>
|
||||||
<li>
|
<li>
|
||||||
|
@ -12040,11 +12055,11 @@ as defined above.</p>
|
||||||
<p>Operation:</p>
|
<p>Operation:</p>
|
||||||
</div>
|
</div>
|
||||||
<div class="paragraph">
|
<div class="paragraph">
|
||||||
<p>The first section of pseudo-code may be executed multiple times before the instruction successfully completes.</p>
|
<p>The first section of pseudocode may be executed multiple times before the instruction successfully completes.</p>
|
||||||
</div>
|
</div>
|
||||||
<div class="listingblock">
|
<div class="listingblock">
|
||||||
<div class="content">
|
<div class="content">
|
||||||
<pre class="pygments highlight"><code data-lang="sail">//This is not SAIL, it's pseudo-code. The SAIL hasn't been written yet.
|
<pre class="pygments highlight"><code data-lang="sail">//This is not SAIL, it's pseudocode. The SAIL hasn't been written yet.
|
||||||
|
|
||||||
if (XLEN==32) bytes=4; else bytes=8;
|
if (XLEN==32) bytes=4; else bytes=8;
|
||||||
|
|
||||||
|
@ -12062,11 +12077,11 @@ for(i in 27,26,25,24,23,22,21,20,19,18,9,8,1) {
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="paragraph">
|
<div class="paragraph">
|
||||||
<p>The final section of pseudo-code executes atomically, and only executes if the section above completes without any exceptions or interrupts.</p>
|
<p>The final section of pseudocode executes atomically, and only executes if the section above completes without any exceptions or interrupts.</p>
|
||||||
</div>
|
</div>
|
||||||
<div class="listingblock">
|
<div class="listingblock">
|
||||||
<div class="content">
|
<div class="content">
|
||||||
<pre class="pygments highlight"><code data-lang="sail">//This is not SAIL, it's pseudo-code. The SAIL hasn't been written yet.
|
<pre class="pygments highlight"><code data-lang="sail">//This is not SAIL, it's pseudocode. The SAIL hasn't been written yet.
|
||||||
|
|
||||||
sp-=stack_adj;</code></pre>
|
sp-=stack_adj;</code></pre>
|
||||||
</div>
|
</div>
|
||||||
|
@ -12266,11 +12281,11 @@ as defined above.</p>
|
||||||
<p>Operation:</p>
|
<p>Operation:</p>
|
||||||
</div>
|
</div>
|
||||||
<div class="paragraph">
|
<div class="paragraph">
|
||||||
<p>The first section of pseudo-code may be executed multiple times before the instruction successfully completes.</p>
|
<p>The first section of pseudocode may be executed multiple times before the instruction successfully completes.</p>
|
||||||
</div>
|
</div>
|
||||||
<div class="listingblock">
|
<div class="listingblock">
|
||||||
<div class="content">
|
<div class="content">
|
||||||
<pre class="pygments highlight"><code data-lang="sail">//This is not SAIL, it's pseudo-code. The SAIL hasn't been written yet.
|
<pre class="pygments highlight"><code data-lang="sail">//This is not SAIL, it's pseudocode. The SAIL hasn't been written yet.
|
||||||
|
|
||||||
if (XLEN==32) bytes=4; else bytes=8;
|
if (XLEN==32) bytes=4; else bytes=8;
|
||||||
|
|
||||||
|
@ -12288,11 +12303,11 @@ for(i in 27,26,25,24,23,22,21,20,19,18,9,8,1) {
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="paragraph">
|
<div class="paragraph">
|
||||||
<p>The final section of pseudo-code executes atomically, and only executes if the section above completes without any exceptions or interrupts.</p>
|
<p>The final section of pseudocode executes atomically, and only executes if the section above completes without any exceptions or interrupts.</p>
|
||||||
</div>
|
</div>
|
||||||
<div class="listingblock">
|
<div class="listingblock">
|
||||||
<div class="content">
|
<div class="content">
|
||||||
<pre class="pygments highlight"><code data-lang="sail">//This is not SAIL, it's pseudo-code. The SAIL hasn't been written yet.
|
<pre class="pygments highlight"><code data-lang="sail">//This is not SAIL, it's pseudocode. The SAIL hasn't been written yet.
|
||||||
|
|
||||||
sp+=stack_adj;</code></pre>
|
sp+=stack_adj;</code></pre>
|
||||||
</div>
|
</div>
|
||||||
|
@ -12487,11 +12502,11 @@ switch (rlist) {
|
||||||
<p>Operation:</p>
|
<p>Operation:</p>
|
||||||
</div>
|
</div>
|
||||||
<div class="paragraph">
|
<div class="paragraph">
|
||||||
<p>The first section of pseudo-code may be executed multiple times before the instruction successfully completes.</p>
|
<p>The first section of pseudocode may be executed multiple times before the instruction successfully completes.</p>
|
||||||
</div>
|
</div>
|
||||||
<div class="listingblock">
|
<div class="listingblock">
|
||||||
<div class="content">
|
<div class="content">
|
||||||
<pre class="pygments highlight"><code data-lang="sail">//This is not SAIL, it's pseudo-code. The SAIL hasn't been written yet.
|
<pre class="pygments highlight"><code data-lang="sail">//This is not SAIL, it's pseudocode. The SAIL hasn't been written yet.
|
||||||
|
|
||||||
if (XLEN==32) bytes=4; else bytes=8;
|
if (XLEN==32) bytes=4; else bytes=8;
|
||||||
|
|
||||||
|
@ -12509,7 +12524,7 @@ for(i in 27,26,25,24,23,22,21,20,19,18,9,8,1) {
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="paragraph">
|
<div class="paragraph">
|
||||||
<p>The final section of pseudo-code executes atomically, and only executes if the section above completes without any exceptions or interrupts.</p>
|
<p>The final section of pseudocode executes atomically, and only executes if the section above completes without any exceptions or interrupts.</p>
|
||||||
</div>
|
</div>
|
||||||
<div class="admonitionblock note">
|
<div class="admonitionblock note">
|
||||||
<table>
|
<table>
|
||||||
|
@ -12527,7 +12542,7 @@ for(i in 27,26,25,24,23,22,21,20,19,18,9,8,1) {
|
||||||
</div>
|
</div>
|
||||||
<div class="listingblock">
|
<div class="listingblock">
|
||||||
<div class="content">
|
<div class="content">
|
||||||
<pre class="pygments highlight"><code data-lang="sail">//This is not SAIL, it's pseudo-code. The SAIL hasn't been written yet.
|
<pre class="pygments highlight"><code data-lang="sail">//This is not SAIL, it's pseudocode. The SAIL hasn't been written yet.
|
||||||
|
|
||||||
asm("li a0, 0");
|
asm("li a0, 0");
|
||||||
sp+=stack_adj;
|
sp+=stack_adj;
|
||||||
|
@ -12727,11 +12742,11 @@ switch (rlist) {
|
||||||
<p>Operation:</p>
|
<p>Operation:</p>
|
||||||
</div>
|
</div>
|
||||||
<div class="paragraph">
|
<div class="paragraph">
|
||||||
<p>The first section of pseudo-code may be executed multiple times before the instruction successfully completes.</p>
|
<p>The first section of pseudocode may be executed multiple times before the instruction successfully completes.</p>
|
||||||
</div>
|
</div>
|
||||||
<div class="listingblock">
|
<div class="listingblock">
|
||||||
<div class="content">
|
<div class="content">
|
||||||
<pre class="pygments highlight"><code data-lang="sail">//This is not SAIL, it's pseudo-code. The SAIL hasn't been written yet.
|
<pre class="pygments highlight"><code data-lang="sail">//This is not SAIL, it's pseudocode. The SAIL hasn't been written yet.
|
||||||
|
|
||||||
if (XLEN==32) bytes=4; else bytes=8;
|
if (XLEN==32) bytes=4; else bytes=8;
|
||||||
|
|
||||||
|
@ -12749,11 +12764,11 @@ for(i in 27,26,25,24,23,22,21,20,19,18,9,8,1) {
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="paragraph">
|
<div class="paragraph">
|
||||||
<p>The final section of pseudo-code executes atomically, and only executes if the section above completes without any exceptions or interrupts.</p>
|
<p>The final section of pseudocode executes atomically, and only executes if the section above completes without any exceptions or interrupts.</p>
|
||||||
</div>
|
</div>
|
||||||
<div class="listingblock">
|
<div class="listingblock">
|
||||||
<div class="content">
|
<div class="content">
|
||||||
<pre class="pygments highlight"><code data-lang="sail">//This is not SAIL, it's pseudo-code. The SAIL hasn't been written yet.
|
<pre class="pygments highlight"><code data-lang="sail">//This is not SAIL, it's pseudocode. The SAIL hasn't been written yet.
|
||||||
|
|
||||||
sp+=stack_adj;
|
sp+=stack_adj;
|
||||||
asm("ret");</code></pre>
|
asm("ret");</code></pre>
|
||||||
|
@ -12812,7 +12827,7 @@ The execution is atomic, so it is not possible to observe state where only one o
|
||||||
</div>
|
</div>
|
||||||
<div class="paragraph">
|
<div class="paragraph">
|
||||||
<p>The encoding uses <em>sreg</em> number specifiers instead of <em>xreg</em> number specifiers to save encoding space.
|
<p>The encoding uses <em>sreg</em> number specifiers instead of <em>xreg</em> number specifiers to save encoding space.
|
||||||
The mapping between them is specified in the pseudo-code below.</p>
|
The mapping between them is specified in the pseudocode below.</p>
|
||||||
</div>
|
</div>
|
||||||
<div class="admonitionblock note">
|
<div class="admonitionblock note">
|
||||||
<table>
|
<table>
|
||||||
|
@ -12845,7 +12860,7 @@ The mapping between them is specified in the pseudo-code below.</p>
|
||||||
</div>
|
</div>
|
||||||
<div class="listingblock">
|
<div class="listingblock">
|
||||||
<div class="content">
|
<div class="content">
|
||||||
<pre class="pygments highlight"><code data-lang="sail">//This is not SAIL, it's pseudo-code. The SAIL hasn't been written yet.
|
<pre class="pygments highlight"><code data-lang="sail">//This is not SAIL, it's pseudocode. The SAIL hasn't been written yet.
|
||||||
if (RV32E && (r1sc>1 || r2sc>1)) {
|
if (RV32E && (r1sc>1 || r2sc>1)) {
|
||||||
reserved();
|
reserved();
|
||||||
}
|
}
|
||||||
|
@ -12894,7 +12909,7 @@ The execution is atomic, so it is not possible to observe state where only one o
|
||||||
</div>
|
</div>
|
||||||
<div class="paragraph">
|
<div class="paragraph">
|
||||||
<p>The encoding uses <em>sreg</em> number specifiers instead of <em>xreg</em> number specifiers to save encoding space.
|
<p>The encoding uses <em>sreg</em> number specifiers instead of <em>xreg</em> number specifiers to save encoding space.
|
||||||
The mapping between them is specified in the pseudo-code below.</p>
|
The mapping between them is specified in the pseudocode below.</p>
|
||||||
</div>
|
</div>
|
||||||
<div class="admonitionblock note">
|
<div class="admonitionblock note">
|
||||||
<table>
|
<table>
|
||||||
|
@ -12927,7 +12942,7 @@ The mapping between them is specified in the pseudo-code below.</p>
|
||||||
</div>
|
</div>
|
||||||
<div class="listingblock">
|
<div class="listingblock">
|
||||||
<div class="content">
|
<div class="content">
|
||||||
<pre class="pygments highlight"><code data-lang="sail">//This is not SAIL, it's pseudo-code. The SAIL hasn't been written yet.
|
<pre class="pygments highlight"><code data-lang="sail">//This is not SAIL, it's pseudocode. The SAIL hasn't been written yet.
|
||||||
if (RV32E && (r1sc>1 || r2sc>1)) {
|
if (RV32E && (r1sc>1 || r2sc>1)) {
|
||||||
reserved();
|
reserved();
|
||||||
}
|
}
|
||||||
|
@ -13208,7 +13223,7 @@ attempt to program different modes and read back the values to see which are ava
|
||||||
</div>
|
</div>
|
||||||
<div class="listingblock">
|
<div class="listingblock">
|
||||||
<div class="content">
|
<div class="content">
|
||||||
<pre class="pygments highlight"><code data-lang="sail">//This is not SAIL, it's pseudo-code. The SAIL hasn't been written yet.
|
<pre class="pygments highlight"><code data-lang="sail">//This is not SAIL, it's pseudocode. The SAIL hasn't been written yet.
|
||||||
|
|
||||||
# target_address is temporary internal state, it doesn't represent a real register
|
# target_address is temporary internal state, it doesn't represent a real register
|
||||||
# InstMemory is byte indexed
|
# InstMemory is byte indexed
|
||||||
|
@ -13311,7 +13326,7 @@ j target_address[XLEN-1:0]&~0x1;</code></pre>
|
||||||
</div>
|
</div>
|
||||||
<div class="listingblock">
|
<div class="listingblock">
|
||||||
<div class="content">
|
<div class="content">
|
||||||
<pre class="pygments highlight"><code data-lang="sail">//This is not SAIL, it's pseudo-code. The SAIL hasn't been written yet.
|
<pre class="pygments highlight"><code data-lang="sail">//This is not SAIL, it's pseudocode. The SAIL hasn't been written yet.
|
||||||
|
|
||||||
# target_address is temporary internal state, it doesn't represent a real register
|
# target_address is temporary internal state, it doesn't represent a real register
|
||||||
# InstMemory is byte indexed
|
# InstMemory is byte indexed
|
||||||
|
@ -19545,7 +19560,7 @@ categories: <em>standard</em> versus <em>non-standard</em>.</p>
|
||||||
<li>
|
<li>
|
||||||
<p>A standard extension is one that is generally useful and that is
|
<p>A standard extension is one that is generally useful and that is
|
||||||
designed to not conflict with any other standard extension. Currently,
|
designed to not conflict with any other standard extension. Currently,
|
||||||
"MAFDQLCBTPV", described in other chapters of this manual, are either
|
"MAFDQCBTPV", described in other chapters of this manual, are either
|
||||||
complete or planned standard extensions.</p>
|
complete or planned standard extensions.</p>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
|
@ -24636,7 +24651,7 @@ sizes. Misaligned accesses are broken up into single-byte accesses.</p>
|
||||||
semantics (RV64I and A), are integrated into the <code>rmem</code> exploration tool
|
semantics (RV64I and A), are integrated into the <code>rmem</code> exploration tool
|
||||||
(<a href="https://github.com/rems-project/rmem" class="bare">github.com/rems-project/rmem</a>). <code>rmem</code> can explore litmus tests
|
(<a href="https://github.com/rems-project/rmem" class="bare">github.com/rems-project/rmem</a>). <code>rmem</code> can explore litmus tests
|
||||||
(see <a href="#litmustests">Section A.2</a>) and small ELF binaries
|
(see <a href="#litmustests">Section A.2</a>) and small ELF binaries
|
||||||
exhaustively, pseudo-randomly and interactively. In <code>rmem</code>, the ISA
|
exhaustively, pseudorandomly and interactively. In <code>rmem</code>, the ISA
|
||||||
semantics is expressed explicitly in Sail (see
|
semantics is expressed explicitly in Sail (see
|
||||||
<a href="https://github.com/rems-project/sail" class="bare">github.com/rems-project/sail</a> for the Sail language, and
|
<a href="https://github.com/rems-project/sail" class="bare">github.com/rems-project/sail</a> for the Sail language, and
|
||||||
<a href="https://github.com/rems-project/sail-riscv" class="bare">github.com/rems-project/sail-riscv</a> for the RISC-V ISA model),
|
<a href="https://github.com/rems-project/sail-riscv" class="bare">github.com/rems-project/sail-riscv</a> for the RISC-V ISA model),
|
||||||
|
@ -26330,7 +26345,7 @@ not supported.</p>
|
||||||
</div>
|
</div>
|
||||||
<div id="footer">
|
<div id="footer">
|
||||||
<div id="footer-text">
|
<div id="footer-text">
|
||||||
Version 20240612<br>
|
Version 20240703<br>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</body>
|
</body>
|
||||||
|
|
File diff suppressed because one or more lines are too long
|
@ -4,26 +4,24 @@
|
||||||
<meta charset="UTF-8">
|
<meta charset="UTF-8">
|
||||||
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||||
<meta name="generator" content="Asciidoctor 2.0.15">
|
<meta name="generator" content="Asciidoctor 2.0.22">
|
||||||
<meta name="description" content="Volume I - Unprivileged Architecture">
|
<meta name="description" content="Unprivileged Architecture">
|
||||||
<title>The RISC-V Instruction Set Manual for CV64A6_MMU: Volume I - Unprivileged Architecture</title>
|
<title>The RISC-V Instruction Set Manual for CV64A6_MMU: Volume I - Unprivileged Architecture</title>
|
||||||
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Open+Sans:300,300italic,400,400italic,600,600italic%7CNoto+Serif:400,400italic,700,700italic%7CDroid+Sans+Mono:400,700">
|
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Open+Sans:300,300italic,400,400italic,600,600italic%7CNoto+Serif:400,400italic,700,700italic%7CDroid+Sans+Mono:400,700">
|
||||||
<style>
|
<style>
|
||||||
/* Asciidoctor default stylesheet | MIT License | https://asciidoctor.org */
|
/*! Asciidoctor default stylesheet | MIT License | https://asciidoctor.org */
|
||||||
/* Uncomment @import statement to use as custom stylesheet */
|
/* Uncomment the following line when using as a custom stylesheet */
|
||||||
/*@import "https://fonts.googleapis.com/css?family=Open+Sans:300,300italic,400,400italic,600,600italic%7CNoto+Serif:400,400italic,700,700italic%7CDroid+Sans+Mono:400,700";*/
|
/* @import "https://fonts.googleapis.com/css?family=Open+Sans:300,300italic,400,400italic,600,600italic%7CNoto+Serif:400,400italic,700,700italic%7CDroid+Sans+Mono:400,700"; */
|
||||||
article,aside,details,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}
|
html{font-family:sans-serif;-webkit-text-size-adjust:100%}
|
||||||
audio,video{display:inline-block}
|
|
||||||
audio:not([controls]){display:none;height:0}
|
|
||||||
html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}
|
|
||||||
a{background:none}
|
a{background:none}
|
||||||
a:focus{outline:thin dotted}
|
a:focus{outline:thin dotted}
|
||||||
a:active,a:hover{outline:0}
|
a:active,a:hover{outline:0}
|
||||||
h1{font-size:2em;margin:.67em 0}
|
h1{font-size:2em;margin:.67em 0}
|
||||||
abbr[title]{border-bottom:1px dotted}
|
|
||||||
b,strong{font-weight:bold}
|
b,strong{font-weight:bold}
|
||||||
|
abbr{font-size:.9em}
|
||||||
|
abbr[title]{cursor:help;border-bottom:1px dotted #dddddf;text-decoration:none}
|
||||||
dfn{font-style:italic}
|
dfn{font-style:italic}
|
||||||
hr{-moz-box-sizing:content-box;box-sizing:content-box;height:0}
|
hr{height:0}
|
||||||
mark{background:#ff0;color:#000}
|
mark{background:#ff0;color:#000}
|
||||||
code,kbd,pre,samp{font-family:monospace;font-size:1em}
|
code,kbd,pre,samp{font-family:monospace;font-size:1em}
|
||||||
pre{white-space:pre-wrap}
|
pre{white-space:pre-wrap}
|
||||||
|
@ -35,20 +33,22 @@ sub{bottom:-.25em}
|
||||||
img{border:0}
|
img{border:0}
|
||||||
svg:not(:root){overflow:hidden}
|
svg:not(:root){overflow:hidden}
|
||||||
figure{margin:0}
|
figure{margin:0}
|
||||||
|
audio,video{display:inline-block}
|
||||||
|
audio:not([controls]){display:none;height:0}
|
||||||
fieldset{border:1px solid silver;margin:0 2px;padding:.35em .625em .75em}
|
fieldset{border:1px solid silver;margin:0 2px;padding:.35em .625em .75em}
|
||||||
legend{border:0;padding:0}
|
legend{border:0;padding:0}
|
||||||
button,input,select,textarea{font-family:inherit;font-size:100%;margin:0}
|
button,input,select,textarea{font-family:inherit;font-size:100%;margin:0}
|
||||||
button,input{line-height:normal}
|
button,input{line-height:normal}
|
||||||
button,select{text-transform:none}
|
button,select{text-transform:none}
|
||||||
button,html input[type="button"],input[type="reset"],input[type="submit"]{-webkit-appearance:button;cursor:pointer}
|
button,html input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer}
|
||||||
button[disabled],html input[disabled]{cursor:default}
|
button[disabled],html input[disabled]{cursor:default}
|
||||||
input[type="checkbox"],input[type="radio"]{box-sizing:border-box;padding:0}
|
input[type=checkbox],input[type=radio]{padding:0}
|
||||||
button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}
|
button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}
|
||||||
textarea{overflow:auto;vertical-align:top}
|
textarea{overflow:auto;vertical-align:top}
|
||||||
table{border-collapse:collapse;border-spacing:0}
|
table{border-collapse:collapse;border-spacing:0}
|
||||||
*,*::before,*::after{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}
|
*,::before,::after{box-sizing:border-box}
|
||||||
html,body{font-size:100%}
|
html,body{font-size:100%}
|
||||||
body{background:#fff;color:rgba(0,0,0,.8);padding:0;margin:0;font-family:"Noto Serif","DejaVu Serif",serif;font-weight:400;font-style:normal;line-height:1;position:relative;cursor:auto;tab-size:4;word-wrap:anywhere;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased}
|
body{background:#fff;color:rgba(0,0,0,.8);padding:0;margin:0;font-family:"Noto Serif","DejaVu Serif",serif;line-height:1;position:relative;cursor:auto;-moz-tab-size:4;-o-tab-size:4;tab-size:4;word-wrap:anywhere;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased}
|
||||||
a:hover{cursor:pointer}
|
a:hover{cursor:pointer}
|
||||||
img,object,embed{max-width:100%;height:auto}
|
img,object,embed{max-width:100%;height:auto}
|
||||||
object,embed{height:100%}
|
object,embed{height:100%}
|
||||||
|
@ -68,7 +68,7 @@ div,dl,dt,dd,ul,ol,li,h1,h2,h3,#toctitle,.sidebarblock>.content>.title,h4,h5,h6,
|
||||||
a{color:#2156a5;text-decoration:underline;line-height:inherit}
|
a{color:#2156a5;text-decoration:underline;line-height:inherit}
|
||||||
a:hover,a:focus{color:#1d4b8f}
|
a:hover,a:focus{color:#1d4b8f}
|
||||||
a img{border:0}
|
a img{border:0}
|
||||||
p{font-family:inherit;font-weight:400;font-size:1em;line-height:1.6;margin-bottom:1.25em;text-rendering:optimizeLegibility}
|
p{line-height:1.6;margin-bottom:1.25em;text-rendering:optimizeLegibility}
|
||||||
p aside{font-size:.875em;line-height:1.35;font-style:italic}
|
p aside{font-size:.875em;line-height:1.35;font-style:italic}
|
||||||
h1,h2,h3,#toctitle,.sidebarblock>.content>.title,h4,h5,h6{font-family:"Open Sans","DejaVu Sans",sans-serif;font-weight:300;font-style:normal;color:#ba3925;text-rendering:optimizeLegibility;margin-top:1em;margin-bottom:.5em;line-height:1.0125em}
|
h1,h2,h3,#toctitle,.sidebarblock>.content>.title,h4,h5,h6{font-family:"Open Sans","DejaVu Sans",sans-serif;font-weight:300;font-style:normal;color:#ba3925;text-rendering:optimizeLegibility;margin-top:1em;margin-bottom:.5em;line-height:1.0125em}
|
||||||
h1 small,h2 small,h3 small,#toctitle small,.sidebarblock>.content>.title small,h4 small,h5 small,h6 small{font-size:60%;color:#e99b8f;line-height:0}
|
h1 small,h2 small,h3 small,#toctitle small,.sidebarblock>.content>.title small,h4 small,h5 small,h6 small{font-size:60%;color:#e99b8f;line-height:0}
|
||||||
|
@ -77,23 +77,21 @@ h2{font-size:1.6875em}
|
||||||
h3,#toctitle,.sidebarblock>.content>.title{font-size:1.375em}
|
h3,#toctitle,.sidebarblock>.content>.title{font-size:1.375em}
|
||||||
h4,h5{font-size:1.125em}
|
h4,h5{font-size:1.125em}
|
||||||
h6{font-size:1em}
|
h6{font-size:1em}
|
||||||
hr{border:solid #dddddf;border-width:1px 0 0;clear:both;margin:1.25em 0 1.1875em;height:0}
|
hr{border:solid #dddddf;border-width:1px 0 0;clear:both;margin:1.25em 0 1.1875em}
|
||||||
em,i{font-style:italic;line-height:inherit}
|
em,i{font-style:italic;line-height:inherit}
|
||||||
strong,b{font-weight:bold;line-height:inherit}
|
strong,b{font-weight:bold;line-height:inherit}
|
||||||
small{font-size:60%;line-height:inherit}
|
small{font-size:60%;line-height:inherit}
|
||||||
code{font-family:"Droid Sans Mono","DejaVu Sans Mono",monospace;font-weight:400;color:rgba(0,0,0,.9)}
|
code{font-family:"Droid Sans Mono","DejaVu Sans Mono",monospace;font-weight:400;color:rgba(0,0,0,.9)}
|
||||||
ul,ol,dl{font-size:1em;line-height:1.6;margin-bottom:1.25em;list-style-position:outside;font-family:inherit}
|
ul,ol,dl{line-height:1.6;margin-bottom:1.25em;list-style-position:outside;font-family:inherit}
|
||||||
ul,ol{margin-left:1.5em}
|
ul,ol{margin-left:1.5em}
|
||||||
ul li ul,ul li ol{margin-left:1.25em;margin-bottom:0;font-size:1em}
|
ul li ul,ul li ol{margin-left:1.25em;margin-bottom:0}
|
||||||
ul.square li ul,ul.circle li ul,ul.disc li ul{list-style:inherit}
|
|
||||||
ul.square{list-style-type:square}
|
|
||||||
ul.circle{list-style-type:circle}
|
ul.circle{list-style-type:circle}
|
||||||
ul.disc{list-style-type:disc}
|
ul.disc{list-style-type:disc}
|
||||||
|
ul.square{list-style-type:square}
|
||||||
|
ul.circle ul:not([class]),ul.disc ul:not([class]),ul.square ul:not([class]){list-style:inherit}
|
||||||
ol li ul,ol li ol{margin-left:1.25em;margin-bottom:0}
|
ol li ul,ol li ol{margin-left:1.25em;margin-bottom:0}
|
||||||
dl dt{margin-bottom:.3125em;font-weight:bold}
|
dl dt{margin-bottom:.3125em;font-weight:bold}
|
||||||
dl dd{margin-bottom:1.25em}
|
dl dd{margin-bottom:1.25em}
|
||||||
abbr,acronym{text-transform:uppercase;font-size:90%;color:rgba(0,0,0,.8);border-bottom:1px dotted #ddd;cursor:help}
|
|
||||||
abbr{text-transform:none}
|
|
||||||
blockquote{margin:0 0 1.25em;padding:.5625em 1.25em 0 1.1875em;border-left:1px solid #ddd}
|
blockquote{margin:0 0 1.25em;padding:.5625em 1.25em 0 1.1875em;border-left:1px solid #ddd}
|
||||||
blockquote,blockquote p{line-height:1.6;color:rgba(0,0,0,.85)}
|
blockquote,blockquote p{line-height:1.6;color:rgba(0,0,0,.85)}
|
||||||
@media screen and (min-width:768px){h1,h2,h3,#toctitle,.sidebarblock>.content>.title,h4,h5,h6{line-height:1.2}
|
@media screen and (min-width:768px){h1,h2,h3,#toctitle,.sidebarblock>.content>.title,h4,h5,h6{line-height:1.2}
|
||||||
|
@ -101,7 +99,7 @@ h1{font-size:2.75em}
|
||||||
h2{font-size:2.3125em}
|
h2{font-size:2.3125em}
|
||||||
h3,#toctitle,.sidebarblock>.content>.title{font-size:1.6875em}
|
h3,#toctitle,.sidebarblock>.content>.title{font-size:1.6875em}
|
||||||
h4{font-size:1.4375em}}
|
h4{font-size:1.4375em}}
|
||||||
table{background:#fff;margin-bottom:1.25em;border:solid 1px #dedede;word-wrap:normal}
|
table{background:#fff;margin-bottom:1.25em;border:1px solid #dedede;word-wrap:normal}
|
||||||
table thead,table tfoot{background:#f7f8f7}
|
table thead,table tfoot{background:#f7f8f7}
|
||||||
table thead tr th,table thead tr td,table tfoot tr th,table tfoot tr td{padding:.5em .625em .625em;font-size:inherit;color:rgba(0,0,0,.8);text-align:left}
|
table thead tr th,table thead tr td,table tfoot tr th,table tfoot tr td{padding:.5em .625em .625em;font-size:inherit;color:rgba(0,0,0,.8);text-align:left}
|
||||||
table tr th,table tr td{padding:.5625em .625em;font-size:inherit;color:rgba(0,0,0,.8)}
|
table tr th,table tr td{padding:.5625em .625em;font-size:inherit;color:rgba(0,0,0,.8)}
|
||||||
|
@ -116,7 +114,7 @@ h1 strong,h2 strong,h3 strong,#toctitle strong,.sidebarblock>.content>.title str
|
||||||
:not(pre).nobreak{word-wrap:normal}
|
:not(pre).nobreak{word-wrap:normal}
|
||||||
:not(pre).nowrap{white-space:nowrap}
|
:not(pre).nowrap{white-space:nowrap}
|
||||||
:not(pre).pre-wrap{white-space:pre-wrap}
|
:not(pre).pre-wrap{white-space:pre-wrap}
|
||||||
:not(pre):not([class^=L])>code{font-size:.9375em;font-style:normal!important;letter-spacing:0;padding:.1em .5ex;word-spacing:-.15em;background:#f7f7f8;-webkit-border-radius:4px;border-radius:4px;line-height:1.45;text-rendering:optimizeSpeed}
|
:not(pre):not([class^=L])>code{font-size:.9375em;font-style:normal!important;letter-spacing:0;padding:.1em .5ex;word-spacing:-.15em;background:#f7f7f8;border-radius:4px;line-height:1.45;text-rendering:optimizeSpeed}
|
||||||
pre{color:rgba(0,0,0,.9);font-family:"Droid Sans Mono","DejaVu Sans Mono",monospace;line-height:1.45;text-rendering:optimizeSpeed}
|
pre{color:rgba(0,0,0,.9);font-family:"Droid Sans Mono","DejaVu Sans Mono",monospace;line-height:1.45;text-rendering:optimizeSpeed}
|
||||||
pre code,pre pre{color:inherit;font-size:inherit;line-height:inherit}
|
pre code,pre pre{color:inherit;font-size:inherit;line-height:inherit}
|
||||||
pre>code{display:block}
|
pre>code{display:block}
|
||||||
|
@ -124,7 +122,7 @@ pre.nowrap,pre.nowrap pre{white-space:pre;word-wrap:normal}
|
||||||
em em{font-style:normal}
|
em em{font-style:normal}
|
||||||
strong strong{font-weight:400}
|
strong strong{font-weight:400}
|
||||||
.keyseq{color:rgba(51,51,51,.8)}
|
.keyseq{color:rgba(51,51,51,.8)}
|
||||||
kbd{font-family:"Droid Sans Mono","DejaVu Sans Mono",monospace;display:inline-block;color:rgba(0,0,0,.8);font-size:.65em;line-height:1.45;background:#f7f7f7;border:1px solid #ccc;-webkit-border-radius:3px;border-radius:3px;-webkit-box-shadow:0 1px 0 rgba(0,0,0,.2),0 0 0 .1em white inset;box-shadow:0 1px 0 rgba(0,0,0,.2),0 0 0 .1em #fff inset;margin:0 .15em;padding:.2em .5em;vertical-align:middle;position:relative;top:-.1em;white-space:nowrap}
|
kbd{font-family:"Droid Sans Mono","DejaVu Sans Mono",monospace;display:inline-block;color:rgba(0,0,0,.8);font-size:.65em;line-height:1.45;background:#f7f7f7;border:1px solid #ccc;border-radius:3px;box-shadow:0 1px 0 rgba(0,0,0,.2),inset 0 0 0 .1em #fff;margin:0 .15em;padding:.2em .5em;vertical-align:middle;position:relative;top:-.1em;white-space:nowrap}
|
||||||
.keyseq kbd:first-child{margin-left:0}
|
.keyseq kbd:first-child{margin-left:0}
|
||||||
.keyseq kbd:last-child{margin-right:0}
|
.keyseq kbd:last-child{margin-right:0}
|
||||||
.menuseq,.menuref{color:#000}
|
.menuseq,.menuref{color:#000}
|
||||||
|
@ -136,15 +134,15 @@ b.button::before,b.button::after{position:relative;top:-1px;font-weight:400}
|
||||||
b.button::before{content:"[";padding:0 3px 0 2px}
|
b.button::before{content:"[";padding:0 3px 0 2px}
|
||||||
b.button::after{content:"]";padding:0 2px 0 3px}
|
b.button::after{content:"]";padding:0 2px 0 3px}
|
||||||
p a>code:hover{color:rgba(0,0,0,.9)}
|
p a>code:hover{color:rgba(0,0,0,.9)}
|
||||||
#header,#content,#footnotes,#footer{width:100%;margin-left:auto;margin-right:auto;margin-top:0;margin-bottom:0;max-width:62.5em;*zoom:1;position:relative;padding-left:.9375em;padding-right:.9375em}
|
#header,#content,#footnotes,#footer{width:100%;margin:0 auto;max-width:62.5em;*zoom:1;position:relative;padding-left:.9375em;padding-right:.9375em}
|
||||||
#header::before,#header::after,#content::before,#content::after,#footnotes::before,#footnotes::after,#footer::before,#footer::after{content:" ";display:table}
|
#header::before,#header::after,#content::before,#content::after,#footnotes::before,#footnotes::after,#footer::before,#footer::after{content:" ";display:table}
|
||||||
#header::after,#content::after,#footnotes::after,#footer::after{clear:both}
|
#header::after,#content::after,#footnotes::after,#footer::after{clear:both}
|
||||||
#content{margin-top:1.25em}
|
#content{margin-top:1.25em}
|
||||||
#content::before{content:none}
|
#content::before{content:none}
|
||||||
#header>h1:first-child{color:rgba(0,0,0,.85);margin-top:2.25rem;margin-bottom:0}
|
#header>h1:first-child{color:rgba(0,0,0,.85);margin-top:2.25rem;margin-bottom:0}
|
||||||
#header>h1:first-child+#toc{margin-top:8px;border-top:1px solid #dddddf}
|
#header>h1:first-child+#toc{margin-top:8px;border-top:1px solid #dddddf}
|
||||||
#header>h1:only-child,body.toc2 #header>h1:nth-last-child(2){border-bottom:1px solid #dddddf;padding-bottom:8px}
|
#header>h1:only-child{border-bottom:1px solid #dddddf;padding-bottom:8px}
|
||||||
#header .details{border-bottom:1px solid #dddddf;line-height:1.45;padding-top:.25em;padding-bottom:.25em;padding-left:.25em;color:rgba(0,0,0,.6);display:-ms-flexbox;display:-webkit-flex;display:flex;-ms-flex-flow:row wrap;-webkit-flex-flow:row wrap;flex-flow:row wrap}
|
#header .details{border-bottom:1px solid #dddddf;line-height:1.45;padding-top:.25em;padding-bottom:.25em;padding-left:.25em;color:rgba(0,0,0,.6);display:flex;flex-flow:row wrap}
|
||||||
#header .details span:first-child{margin-left:-.125em}
|
#header .details span:first-child{margin-left:-.125em}
|
||||||
#header .details span.email a{color:rgba(0,0,0,.85)}
|
#header .details span.email a{color:rgba(0,0,0,.85)}
|
||||||
#header .details br{display:none}
|
#header .details br{display:none}
|
||||||
|
@ -165,6 +163,7 @@ p a>code:hover{color:rgba(0,0,0,.9)}
|
||||||
#toctitle{color:#7a2518;font-size:1.2em}
|
#toctitle{color:#7a2518;font-size:1.2em}
|
||||||
@media screen and (min-width:768px){#toctitle{font-size:1.375em}
|
@media screen and (min-width:768px){#toctitle{font-size:1.375em}
|
||||||
body.toc2{padding-left:15em;padding-right:0}
|
body.toc2{padding-left:15em;padding-right:0}
|
||||||
|
body.toc2 #header>h1:nth-last-child(2){border-bottom:1px solid #dddddf;padding-bottom:8px}
|
||||||
#toc.toc2{margin-top:0!important;background:#f8f8f7;position:fixed;width:15em;left:0;top:0;border-right:1px solid #e7e7e9;border-top-width:0!important;border-bottom-width:0!important;z-index:1000;padding:1.25em 1em;height:100%;overflow:auto}
|
#toc.toc2{margin-top:0!important;background:#f8f8f7;position:fixed;width:15em;left:0;top:0;border-right:1px solid #e7e7e9;border-top-width:0!important;border-bottom-width:0!important;z-index:1000;padding:1.25em 1em;height:100%;overflow:auto}
|
||||||
#toc.toc2 #toctitle{margin-top:0;margin-bottom:.8rem;font-size:1.2em}
|
#toc.toc2 #toctitle{margin-top:0;margin-bottom:.8rem;font-size:1.2em}
|
||||||
#toc.toc2>ul{font-size:.9em;margin-bottom:0}
|
#toc.toc2>ul{font-size:.9em;margin-bottom:0}
|
||||||
|
@ -178,11 +177,11 @@ body.toc2.toc-right #toc.toc2{border-right-width:0;border-left:1px solid #e7e7e9
|
||||||
#toc.toc2>ul{font-size:.95em}
|
#toc.toc2>ul{font-size:.95em}
|
||||||
#toc.toc2 ul ul{padding-left:1.25em}
|
#toc.toc2 ul ul{padding-left:1.25em}
|
||||||
body.toc2.toc-right{padding-left:0;padding-right:20em}}
|
body.toc2.toc-right{padding-left:0;padding-right:20em}}
|
||||||
#content #toc{border-style:solid;border-width:1px;border-color:#e0e0dc;margin-bottom:1.25em;padding:1.25em;background:#f8f8f7;-webkit-border-radius:4px;border-radius:4px}
|
#content #toc{border:1px solid #e0e0dc;margin-bottom:1.25em;padding:1.25em;background:#f8f8f7;border-radius:4px}
|
||||||
#content #toc>:first-child{margin-top:0}
|
#content #toc>:first-child{margin-top:0}
|
||||||
#content #toc>:last-child{margin-bottom:0}
|
#content #toc>:last-child{margin-bottom:0}
|
||||||
#footer{max-width:none;background:rgba(0,0,0,.8);padding:1.25em}
|
#footer{max-width:none;background:rgba(0,0,0,.8);padding:1.25em}
|
||||||
#footer-text{color:rgba(255,255,255,.8);line-height:1.44}
|
#footer-text{color:hsla(0,0%,100%,.8);line-height:1.44}
|
||||||
#content{margin-bottom:.625em}
|
#content{margin-bottom:.625em}
|
||||||
.sect1{padding-bottom:.625em}
|
.sect1{padding-bottom:.625em}
|
||||||
@media screen and (min-width:768px){#content{margin-bottom:1.25em}
|
@media screen and (min-width:768px){#content{margin-bottom:1.25em}
|
||||||
|
@ -195,29 +194,30 @@ body.toc2.toc-right{padding-left:0;padding-right:20em}}
|
||||||
#content h1>a.link,h2>a.link,h3>a.link,#toctitle>a.link,.sidebarblock>.content>.title>a.link,h4>a.link,h5>a.link,h6>a.link{color:#ba3925;text-decoration:none}
|
#content h1>a.link,h2>a.link,h3>a.link,#toctitle>a.link,.sidebarblock>.content>.title>a.link,h4>a.link,h5>a.link,h6>a.link{color:#ba3925;text-decoration:none}
|
||||||
#content h1>a.link:hover,h2>a.link:hover,h3>a.link:hover,#toctitle>a.link:hover,.sidebarblock>.content>.title>a.link:hover,h4>a.link:hover,h5>a.link:hover,h6>a.link:hover{color:#a53221}
|
#content h1>a.link:hover,h2>a.link:hover,h3>a.link:hover,#toctitle>a.link:hover,.sidebarblock>.content>.title>a.link:hover,h4>a.link:hover,h5>a.link:hover,h6>a.link:hover{color:#a53221}
|
||||||
details,.audioblock,.imageblock,.literalblock,.listingblock,.stemblock,.videoblock{margin-bottom:1.25em}
|
details,.audioblock,.imageblock,.literalblock,.listingblock,.stemblock,.videoblock{margin-bottom:1.25em}
|
||||||
details>summary:first-of-type{cursor:pointer;display:list-item;outline:none;margin-bottom:.75em}
|
details{margin-left:1.25rem}
|
||||||
|
details>summary{cursor:pointer;display:block;position:relative;line-height:1.6;margin-bottom:.625rem;outline:none;-webkit-tap-highlight-color:transparent}
|
||||||
|
details>summary::-webkit-details-marker{display:none}
|
||||||
|
details>summary::before{content:"";border:solid transparent;border-left:solid;border-width:.3em 0 .3em .5em;position:absolute;top:.5em;left:-1.25rem;transform:translateX(15%)}
|
||||||
|
details[open]>summary::before{border:solid transparent;border-top:solid;border-width:.5em .3em 0;transform:translateY(15%)}
|
||||||
|
details>summary::after{content:"";width:1.25rem;height:1em;position:absolute;top:.3em;left:-1.25rem}
|
||||||
.admonitionblock td.content>.title,.audioblock>.title,.exampleblock>.title,.imageblock>.title,.listingblock>.title,.literalblock>.title,.stemblock>.title,.openblock>.title,.paragraph>.title,.quoteblock>.title,table.tableblock>.title,.verseblock>.title,.videoblock>.title,.dlist>.title,.olist>.title,.ulist>.title,.qlist>.title,.hdlist>.title{text-rendering:optimizeLegibility;text-align:left;font-family:"Noto Serif","DejaVu Serif",serif;font-size:1rem;font-style:italic}
|
.admonitionblock td.content>.title,.audioblock>.title,.exampleblock>.title,.imageblock>.title,.listingblock>.title,.literalblock>.title,.stemblock>.title,.openblock>.title,.paragraph>.title,.quoteblock>.title,table.tableblock>.title,.verseblock>.title,.videoblock>.title,.dlist>.title,.olist>.title,.ulist>.title,.qlist>.title,.hdlist>.title{text-rendering:optimizeLegibility;text-align:left;font-family:"Noto Serif","DejaVu Serif",serif;font-size:1rem;font-style:italic}
|
||||||
table.tableblock.fit-content>caption.title{white-space:nowrap;width:0}
|
table.tableblock.fit-content>caption.title{white-space:nowrap;width:0}
|
||||||
.paragraph.lead>p,#preamble>.sectionbody>[class="paragraph"]:first-of-type p{font-size:1.21875em;line-height:1.6;color:rgba(0,0,0,.85)}
|
.paragraph.lead>p,#preamble>.sectionbody>[class=paragraph]:first-of-type p{font-size:1.21875em;line-height:1.6;color:rgba(0,0,0,.85)}
|
||||||
table.tableblock #preamble>.sectionbody>[class="paragraph"]:first-of-type p{font-size:inherit}
|
|
||||||
.admonitionblock>table{border-collapse:separate;border:0;background:none;width:100%}
|
.admonitionblock>table{border-collapse:separate;border:0;background:none;width:100%}
|
||||||
.admonitionblock>table td.icon{text-align:center;width:80px}
|
.admonitionblock>table td.icon{text-align:center;width:80px}
|
||||||
.admonitionblock>table td.icon img{max-width:none}
|
.admonitionblock>table td.icon img{max-width:none}
|
||||||
.admonitionblock>table td.icon .title{font-weight:bold;font-family:"Open Sans","DejaVu Sans",sans-serif;text-transform:uppercase}
|
.admonitionblock>table td.icon .title{font-weight:bold;font-family:"Open Sans","DejaVu Sans",sans-serif;text-transform:uppercase}
|
||||||
.admonitionblock>table td.content{padding-left:1.125em;padding-right:1.25em;border-left:1px solid #dddddf;color:rgba(0,0,0,.6);word-wrap:anywhere}
|
.admonitionblock>table td.content{padding-left:1.125em;padding-right:1.25em;border-left:1px solid #dddddf;color:rgba(0,0,0,.6);word-wrap:anywhere}
|
||||||
.admonitionblock>table td.content>:last-child>:last-child{margin-bottom:0}
|
.admonitionblock>table td.content>:last-child>:last-child{margin-bottom:0}
|
||||||
.exampleblock>.content{border-style:solid;border-width:1px;border-color:#e6e6e6;margin-bottom:1.25em;padding:1.25em;background:#fff;-webkit-border-radius:4px;border-radius:4px}
|
.exampleblock>.content{border:1px solid #e6e6e6;margin-bottom:1.25em;padding:1.25em;background:#fff;border-radius:4px}
|
||||||
.exampleblock>.content>:first-child{margin-top:0}
|
.sidebarblock{border:1px solid #dbdbd6;margin-bottom:1.25em;padding:1.25em;background:#f3f3f2;border-radius:4px}
|
||||||
.exampleblock>.content>:last-child{margin-bottom:0}
|
|
||||||
.sidebarblock{border-style:solid;border-width:1px;border-color:#dbdbd6;margin-bottom:1.25em;padding:1.25em;background:#f3f3f2;-webkit-border-radius:4px;border-radius:4px}
|
|
||||||
.sidebarblock>:first-child{margin-top:0}
|
|
||||||
.sidebarblock>:last-child{margin-bottom:0}
|
|
||||||
.sidebarblock>.content>.title{color:#7a2518;margin-top:0;text-align:center}
|
.sidebarblock>.content>.title{color:#7a2518;margin-top:0;text-align:center}
|
||||||
.exampleblock>.content>:last-child>:last-child,.exampleblock>.content .olist>ol>li:last-child>:last-child,.exampleblock>.content .ulist>ul>li:last-child>:last-child,.exampleblock>.content .qlist>ol>li:last-child>:last-child,.sidebarblock>.content>:last-child>:last-child,.sidebarblock>.content .olist>ol>li:last-child>:last-child,.sidebarblock>.content .ulist>ul>li:last-child>:last-child,.sidebarblock>.content .qlist>ol>li:last-child>:last-child{margin-bottom:0}
|
.exampleblock>.content>:first-child,.sidebarblock>.content>:first-child{margin-top:0}
|
||||||
.literalblock pre,.listingblock>.content>pre{-webkit-border-radius:4px;border-radius:4px;overflow-x:auto;padding:1em;font-size:.8125em}
|
.exampleblock>.content>:last-child,.exampleblock>.content>:last-child>:last-child,.exampleblock>.content .olist>ol>li:last-child>:last-child,.exampleblock>.content .ulist>ul>li:last-child>:last-child,.exampleblock>.content .qlist>ol>li:last-child>:last-child,.sidebarblock>.content>:last-child,.sidebarblock>.content>:last-child>:last-child,.sidebarblock>.content .olist>ol>li:last-child>:last-child,.sidebarblock>.content .ulist>ul>li:last-child>:last-child,.sidebarblock>.content .qlist>ol>li:last-child>:last-child{margin-bottom:0}
|
||||||
|
.literalblock pre,.listingblock>.content>pre{border-radius:4px;overflow-x:auto;padding:1em;font-size:.8125em}
|
||||||
@media screen and (min-width:768px){.literalblock pre,.listingblock>.content>pre{font-size:.90625em}}
|
@media screen and (min-width:768px){.literalblock pre,.listingblock>.content>pre{font-size:.90625em}}
|
||||||
@media screen and (min-width:1280px){.literalblock pre,.listingblock>.content>pre{font-size:1em}}
|
@media screen and (min-width:1280px){.literalblock pre,.listingblock>.content>pre{font-size:1em}}
|
||||||
.literalblock pre,.listingblock>.content>pre:not(.highlight),.listingblock>.content>pre[class="highlight"],.listingblock>.content>pre[class^="highlight "]{background:#f7f7f8}
|
.literalblock pre,.listingblock>.content>pre:not(.highlight),.listingblock>.content>pre[class=highlight],.listingblock>.content>pre[class^="highlight "]{background:#f7f7f8}
|
||||||
.literalblock.output pre{color:#f7f7f8;background:rgba(0,0,0,.9)}
|
.literalblock.output pre{color:#f7f7f8;background:rgba(0,0,0,.9)}
|
||||||
.listingblock>.content{position:relative}
|
.listingblock>.content{position:relative}
|
||||||
.listingblock code[data-lang]::before{display:none;content:attr(data-lang);position:absolute;font-size:.75em;top:.425rem;right:.5rem;line-height:1;text-transform:uppercase;color:inherit;opacity:.5}
|
.listingblock code[data-lang]::before{display:none;content:attr(data-lang);position:absolute;font-size:.75em;top:.425rem;right:.5rem;line-height:1;text-transform:uppercase;color:inherit;opacity:.5}
|
||||||
|
@ -225,7 +225,7 @@ table.tableblock #preamble>.sectionbody>[class="paragraph"]:first-of-type p{font
|
||||||
.listingblock.terminal pre .command::before{content:attr(data-prompt);padding-right:.5em;color:inherit;opacity:.5}
|
.listingblock.terminal pre .command::before{content:attr(data-prompt);padding-right:.5em;color:inherit;opacity:.5}
|
||||||
.listingblock.terminal pre .command:not([data-prompt])::before{content:"$"}
|
.listingblock.terminal pre .command:not([data-prompt])::before{content:"$"}
|
||||||
.listingblock pre.highlightjs{padding:0}
|
.listingblock pre.highlightjs{padding:0}
|
||||||
.listingblock pre.highlightjs>code{padding:1em;-webkit-border-radius:4px;border-radius:4px}
|
.listingblock pre.highlightjs>code{padding:1em;border-radius:4px}
|
||||||
.listingblock pre.prettyprint{border-width:0}
|
.listingblock pre.prettyprint{border-width:0}
|
||||||
.prettyprint{background:#f7f7f8}
|
.prettyprint{background:#f7f7f8}
|
||||||
pre.prettyprint .linenums{line-height:1.45;margin-left:2em}
|
pre.prettyprint .linenums{line-height:1.45;margin-left:2em}
|
||||||
|
@ -235,9 +235,8 @@ pre.prettyprint li:not(:first-child) code[data-lang]::before{display:none}
|
||||||
table.linenotable{border-collapse:separate;border:0;margin-bottom:0;background:none}
|
table.linenotable{border-collapse:separate;border:0;margin-bottom:0;background:none}
|
||||||
table.linenotable td[class]{color:inherit;vertical-align:top;padding:0;line-height:inherit;white-space:normal}
|
table.linenotable td[class]{color:inherit;vertical-align:top;padding:0;line-height:inherit;white-space:normal}
|
||||||
table.linenotable td.code{padding-left:.75em}
|
table.linenotable td.code{padding-left:.75em}
|
||||||
table.linenotable td.linenos{border-right:1px solid currentColor;opacity:.35;padding-right:.5em}
|
table.linenotable td.linenos,pre.pygments .linenos{border-right:1px solid;opacity:.35;padding-right:.5em;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}
|
||||||
pre.pygments .lineno{border-right:1px solid currentColor;opacity:.35;display:inline-block;margin-right:.75em}
|
pre.pygments span.linenos{display:inline-block;margin-right:.75em}
|
||||||
pre.pygments .lineno::before{content:"";margin-right:-.125em}
|
|
||||||
.quoteblock{margin:0 1em 1.25em 1.5em;display:table}
|
.quoteblock{margin:0 1em 1.25em 1.5em;display:table}
|
||||||
.quoteblock:not(.excerpt)>.title{margin-left:-1.5em;margin-bottom:.75em}
|
.quoteblock:not(.excerpt)>.title{margin-left:-1.5em;margin-bottom:.75em}
|
||||||
.quoteblock blockquote,.quoteblock p{color:rgba(0,0,0,.85);font-size:1.15rem;line-height:1.75;word-spacing:.1em;letter-spacing:0;font-style:italic;text-align:justify}
|
.quoteblock blockquote,.quoteblock p{color:rgba(0,0,0,.85);font-size:1.15rem;line-height:1.75;word-spacing:.1em;letter-spacing:0;font-style:italic;text-align:justify}
|
||||||
|
@ -246,7 +245,7 @@ pre.pygments .lineno::before{content:"";margin-right:-.125em}
|
||||||
.quoteblock blockquote>.paragraph:last-child p{margin-bottom:0}
|
.quoteblock blockquote>.paragraph:last-child p{margin-bottom:0}
|
||||||
.quoteblock .attribution{margin-top:.75em;margin-right:.5ex;text-align:right}
|
.quoteblock .attribution{margin-top:.75em;margin-right:.5ex;text-align:right}
|
||||||
.verseblock{margin:0 1em 1.25em}
|
.verseblock{margin:0 1em 1.25em}
|
||||||
.verseblock pre{font-family:"Open Sans","DejaVu Sans",sans;font-size:1.15rem;color:rgba(0,0,0,.85);font-weight:300;text-rendering:optimizeLegibility}
|
.verseblock pre{font-family:"Open Sans","DejaVu Sans",sans-serif;font-size:1.15rem;color:rgba(0,0,0,.85);font-weight:300;text-rendering:optimizeLegibility}
|
||||||
.verseblock pre strong{font-weight:400}
|
.verseblock pre strong{font-weight:400}
|
||||||
.verseblock .attribution{margin-top:1.25rem;margin-left:.5ex}
|
.verseblock .attribution{margin-top:1.25rem;margin-left:.5ex}
|
||||||
.quoteblock .attribution,.verseblock .attribution{font-size:.9375em;line-height:1.45;font-style:italic}
|
.quoteblock .attribution,.verseblock .attribution{font-size:.9375em;line-height:1.45;font-style:italic}
|
||||||
|
@ -274,7 +273,7 @@ table.frame-none>colgroup+*>:first-child>*,table.frame-sides>colgroup+*>:first-c
|
||||||
table.frame-none>:last-child>:last-child>*,table.frame-sides>:last-child>:last-child>*{border-bottom-width:0}
|
table.frame-none>:last-child>:last-child>*,table.frame-sides>:last-child>:last-child>*{border-bottom-width:0}
|
||||||
table.frame-none>*>tr>:first-child,table.frame-ends>*>tr>:first-child{border-left-width:0}
|
table.frame-none>*>tr>:first-child,table.frame-ends>*>tr>:first-child{border-left-width:0}
|
||||||
table.frame-none>*>tr>:last-child,table.frame-ends>*>tr>:last-child{border-right-width:0}
|
table.frame-none>*>tr>:last-child,table.frame-ends>*>tr>:last-child{border-right-width:0}
|
||||||
table.stripes-all tr,table.stripes-odd tr:nth-of-type(odd),table.stripes-even tr:nth-of-type(even),table.stripes-hover tr:hover{background:#f8f8f7}
|
table.stripes-all>*>tr,table.stripes-odd>*>tr:nth-of-type(odd),table.stripes-even>*>tr:nth-of-type(even),table.stripes-hover>*>tr:hover{background:#f8f8f7}
|
||||||
th.halign-left,td.halign-left{text-align:left}
|
th.halign-left,td.halign-left{text-align:left}
|
||||||
th.halign-right,td.halign-right{text-align:right}
|
th.halign-right,td.halign-right{text-align:right}
|
||||||
th.halign-center,td.halign-center{text-align:center}
|
th.halign-center,td.halign-center{text-align:center}
|
||||||
|
@ -290,14 +289,15 @@ ol{margin-left:1.75em}
|
||||||
ul li ol{margin-left:1.5em}
|
ul li ol{margin-left:1.5em}
|
||||||
dl dd{margin-left:1.125em}
|
dl dd{margin-left:1.125em}
|
||||||
dl dd:last-child,dl dd:last-child>:last-child{margin-bottom:0}
|
dl dd:last-child,dl dd:last-child>:last-child{margin-bottom:0}
|
||||||
ol>li p,ul>li p,ul dd,ol dd,.olist .olist,.ulist .ulist,.ulist .olist,.olist .ulist{margin-bottom:.625em}
|
li p,ul dd,ol dd,.olist .olist,.ulist .ulist,.ulist .olist,.olist .ulist{margin-bottom:.625em}
|
||||||
ul.checklist,ul.none,ol.none,ul.no-bullet,ol.no-bullet,ol.unnumbered,ul.unstyled,ol.unstyled{list-style-type:none}
|
ul.checklist,ul.none,ol.none,ul.no-bullet,ol.no-bullet,ol.unnumbered,ul.unstyled,ol.unstyled{list-style-type:none}
|
||||||
ul.no-bullet,ol.no-bullet,ol.unnumbered{margin-left:.625em}
|
ul.no-bullet,ol.no-bullet,ol.unnumbered{margin-left:.625em}
|
||||||
ul.unstyled,ol.unstyled{margin-left:0}
|
ul.unstyled,ol.unstyled{margin-left:0}
|
||||||
ul.checklist{margin-left:.625em}
|
li>p:empty:only-child::before{content:"";display:inline-block}
|
||||||
ul.checklist li>p:first-child>.fa-square-o:first-child,ul.checklist li>p:first-child>.fa-check-square-o:first-child{width:1.25em;font-size:.8em;position:relative;bottom:.125em}
|
ul.checklist>li>p:first-child{margin-left:-1em}
|
||||||
ul.checklist li>p:first-child>input[type="checkbox"]:first-child{margin-right:.25em}
|
ul.checklist>li>p:first-child>.fa-square-o:first-child,ul.checklist>li>p:first-child>.fa-check-square-o:first-child{width:1.25em;font-size:.8em;position:relative;bottom:.125em}
|
||||||
ul.inline{display:-ms-flexbox;display:-webkit-box;display:flex;-ms-flex-flow:row wrap;-webkit-flex-flow:row wrap;flex-flow:row wrap;list-style:none;margin:0 0 .625em -1.25em}
|
ul.checklist>li>p:first-child>input[type=checkbox]:first-child{margin-right:.25em}
|
||||||
|
ul.inline{display:flex;flex-flow:row wrap;list-style:none;margin:0 0 .625em -1.25em}
|
||||||
ul.inline>li{margin-left:1.25em}
|
ul.inline>li{margin-left:1.25em}
|
||||||
.unstyled dl dt{font-weight:400;font-style:normal}
|
.unstyled dl dt{font-weight:400;font-style:normal}
|
||||||
ol.arabic{list-style-type:decimal}
|
ol.arabic{list-style-type:decimal}
|
||||||
|
@ -316,7 +316,7 @@ td.hdlist2{word-wrap:anywhere}
|
||||||
.colist td:not([class]):first-child{padding:.4em .75em 0;line-height:1;vertical-align:top}
|
.colist td:not([class]):first-child{padding:.4em .75em 0;line-height:1;vertical-align:top}
|
||||||
.colist td:not([class]):first-child img{max-width:none}
|
.colist td:not([class]):first-child img{max-width:none}
|
||||||
.colist td:not([class]):last-child{padding:.25em 0}
|
.colist td:not([class]):last-child{padding:.25em 0}
|
||||||
.thumb,.th{line-height:0;display:inline-block;border:solid 4px #fff;-webkit-box-shadow:0 0 0 1px #ddd;box-shadow:0 0 0 1px #ddd}
|
.thumb,.th{line-height:0;display:inline-block;border:4px solid #fff;box-shadow:0 0 0 1px #ddd}
|
||||||
.imageblock.left{margin:.25em .625em 1.25em 0}
|
.imageblock.left{margin:.25em .625em 1.25em 0}
|
||||||
.imageblock.right{margin:.25em 0 1.25em .625em}
|
.imageblock.right{margin:.25em 0 1.25em .625em}
|
||||||
.imageblock>.title{margin-bottom:0}
|
.imageblock>.title{margin-bottom:0}
|
||||||
|
@ -329,15 +329,13 @@ a.image{text-decoration:none;display:inline-block}
|
||||||
a.image object{pointer-events:none}
|
a.image object{pointer-events:none}
|
||||||
sup.footnote,sup.footnoteref{font-size:.875em;position:static;vertical-align:super}
|
sup.footnote,sup.footnoteref{font-size:.875em;position:static;vertical-align:super}
|
||||||
sup.footnote a,sup.footnoteref a{text-decoration:none}
|
sup.footnote a,sup.footnoteref a{text-decoration:none}
|
||||||
sup.footnote a:active,sup.footnoteref a:active{text-decoration:underline}
|
sup.footnote a:active,sup.footnoteref a:active,#footnotes .footnote a:first-of-type:active{text-decoration:underline}
|
||||||
#footnotes{padding-top:.75em;padding-bottom:.75em;margin-bottom:.625em}
|
#footnotes{padding-top:.75em;padding-bottom:.75em;margin-bottom:.625em}
|
||||||
#footnotes hr{width:20%;min-width:6.25em;margin:-.25em 0 .75em;border-width:1px 0 0}
|
#footnotes hr{width:20%;min-width:6.25em;margin:-.25em 0 .75em;border-width:1px 0 0}
|
||||||
#footnotes .footnote{padding:0 .375em 0 .225em;line-height:1.3334;font-size:.875em;margin-left:1.2em;margin-bottom:.2em}
|
#footnotes .footnote{padding:0 .375em 0 .225em;line-height:1.3334;font-size:.875em;margin-left:1.2em;margin-bottom:.2em}
|
||||||
#footnotes .footnote a:first-of-type{font-weight:bold;text-decoration:none;margin-left:-1.05em}
|
#footnotes .footnote a:first-of-type{font-weight:bold;text-decoration:none;margin-left:-1.05em}
|
||||||
#footnotes .footnote:last-of-type{margin-bottom:0}
|
#footnotes .footnote:last-of-type{margin-bottom:0}
|
||||||
#content #footnotes{margin-top:-.625em;margin-bottom:0;padding:.75em 0}
|
#content #footnotes{margin-top:-.625em;margin-bottom:0;padding:.75em 0}
|
||||||
.gist .file-data>table{border:0;background:#fff;width:100%;margin-bottom:0}
|
|
||||||
.gist .file-data>table td.line-data{width:99%}
|
|
||||||
div.unbreakable{page-break-inside:avoid}
|
div.unbreakable{page-break-inside:avoid}
|
||||||
.big{font-size:larger}
|
.big{font-size:larger}
|
||||||
.small{font-size:smaller}
|
.small{font-size:smaller}
|
||||||
|
@ -384,7 +382,7 @@ a span.icon>.fa{cursor:inherit}
|
||||||
.admonitionblock td.icon .icon-warning::before{content:"\f071";color:#bf6900}
|
.admonitionblock td.icon .icon-warning::before{content:"\f071";color:#bf6900}
|
||||||
.admonitionblock td.icon .icon-caution::before{content:"\f06d";color:#bf3400}
|
.admonitionblock td.icon .icon-caution::before{content:"\f06d";color:#bf3400}
|
||||||
.admonitionblock td.icon .icon-important::before{content:"\f06a";color:#bf0000}
|
.admonitionblock td.icon .icon-important::before{content:"\f06a";color:#bf0000}
|
||||||
.conum[data-value]{display:inline-block;color:#fff!important;background:rgba(0,0,0,.8);-webkit-border-radius:50%;border-radius:50%;text-align:center;font-size:.75em;width:1.67em;height:1.67em;line-height:1.67em;font-family:"Open Sans","DejaVu Sans",sans-serif;font-style:normal;font-weight:bold}
|
.conum[data-value]{display:inline-block;color:#fff!important;background:rgba(0,0,0,.8);border-radius:50%;text-align:center;font-size:.75em;width:1.67em;height:1.67em;line-height:1.67em;font-family:"Open Sans","DejaVu Sans",sans-serif;font-style:normal;font-weight:bold}
|
||||||
.conum[data-value] *{color:#fff!important}
|
.conum[data-value] *{color:#fff!important}
|
||||||
.conum[data-value]+b{display:none}
|
.conum[data-value]+b{display:none}
|
||||||
.conum[data-value]::after{content:attr(data-value)}
|
.conum[data-value]::after{content:attr(data-value)}
|
||||||
|
@ -392,19 +390,20 @@ pre .conum[data-value]{position:relative;top:-.125em}
|
||||||
b.conum *{color:inherit!important}
|
b.conum *{color:inherit!important}
|
||||||
.conum:not([data-value]):empty{display:none}
|
.conum:not([data-value]):empty{display:none}
|
||||||
dt,th.tableblock,td.content,div.footnote{text-rendering:optimizeLegibility}
|
dt,th.tableblock,td.content,div.footnote{text-rendering:optimizeLegibility}
|
||||||
h1,h2,p,td.content,span.alt{letter-spacing:-.01em}
|
h1,h2,p,td.content,span.alt,summary{letter-spacing:-.01em}
|
||||||
p strong,td.content strong,div.footnote strong{letter-spacing:-.005em}
|
p strong,td.content strong,div.footnote strong{letter-spacing:-.005em}
|
||||||
p,blockquote,dt,td.content,span.alt{font-size:1.0625rem}
|
p,blockquote,dt,td.content,td.hdlist1,span.alt,summary{font-size:1.0625rem}
|
||||||
p{margin-bottom:1.25rem}
|
p{margin-bottom:1.25rem}
|
||||||
.sidebarblock p,.sidebarblock dt,.sidebarblock td.content,p.tableblock{font-size:1em}
|
.sidebarblock p,.sidebarblock dt,.sidebarblock td.content,p.tableblock{font-size:1em}
|
||||||
.exampleblock>.content{background:#fffef7;border-color:#e0e0dc;-webkit-box-shadow:0 1px 4px #e0e0dc;box-shadow:0 1px 4px #e0e0dc}
|
.exampleblock>.content{background:#fffef7;border-color:#e0e0dc;box-shadow:0 1px 4px #e0e0dc}
|
||||||
.print-only{display:none!important}
|
.print-only{display:none!important}
|
||||||
@page{margin:1.25cm .75cm}
|
@page{margin:1.25cm .75cm}
|
||||||
@media print{*{-webkit-box-shadow:none!important;box-shadow:none!important;text-shadow:none!important}
|
@media print{*{box-shadow:none!important;text-shadow:none!important}
|
||||||
html{font-size:80%}
|
html{font-size:80%}
|
||||||
a{color:inherit!important;text-decoration:underline!important}
|
a{color:inherit!important;text-decoration:underline!important}
|
||||||
a.bare,a[href^="#"],a[href^="mailto:"]{text-decoration:none!important}
|
a.bare,a[href^="#"],a[href^="mailto:"]{text-decoration:none!important}
|
||||||
a[href^="http:"]:not(.bare)::after,a[href^="https:"]:not(.bare)::after{content:"(" attr(href) ")";display:inline-block;font-size:.875em;padding-left:.25em}
|
a[href^="http:"]:not(.bare)::after,a[href^="https:"]:not(.bare)::after{content:"(" attr(href) ")";display:inline-block;font-size:.875em;padding-left:.25em}
|
||||||
|
abbr[title]{border-bottom:1px dotted}
|
||||||
abbr[title]::after{content:" (" attr(title) ")"}
|
abbr[title]::after{content:" (" attr(title) ")"}
|
||||||
pre,blockquote,tr,img,object,svg{page-break-inside:avoid}
|
pre,blockquote,tr,img,object,svg{page-break-inside:avoid}
|
||||||
thead{display:table-header-group}
|
thead{display:table-header-group}
|
||||||
|
@ -428,7 +427,7 @@ body.book #toc,body.book #preamble,body.book h1.sect0,body.book .sect1>h2{page-b
|
||||||
.print-only{display:block!important}
|
.print-only{display:block!important}
|
||||||
.hide-for-print{display:none!important}
|
.hide-for-print{display:none!important}
|
||||||
.show-for-print{display:inherit!important}}
|
.show-for-print{display:inherit!important}}
|
||||||
@media print,amzn-kf8{#header>h1:first-child{margin-top:1.25rem}
|
@media amzn-kf8,print{#header>h1:first-child{margin-top:1.25rem}
|
||||||
.sect1{padding:0!important}
|
.sect1{padding:0!important}
|
||||||
.sect1+.sect1{border:0}
|
.sect1+.sect1{border:0}
|
||||||
#footer{background:none}
|
#footer{background:none}
|
||||||
|
@ -441,7 +440,7 @@ body.book #toc,body.book #preamble,body.book h1.sect0,body.book .sect1>h2{page-b
|
||||||
<div id="header">
|
<div id="header">
|
||||||
<h1>The RISC-V Instruction Set Manual for CV64A6_MMU: Volume I - Unprivileged Architecture</h1>
|
<h1>The RISC-V Instruction Set Manual for CV64A6_MMU: Volume I - Unprivileged Architecture</h1>
|
||||||
<div class="details">
|
<div class="details">
|
||||||
<span id="revnumber">version 20240612</span>
|
<span id="revnumber">version 20240703</span>
|
||||||
</div>
|
</div>
|
||||||
<div id="toc" class="toc2">
|
<div id="toc" class="toc2">
|
||||||
<div id="toctitle">Table of Contents</div>
|
<div id="toctitle">Table of Contents</div>
|
||||||
|
@ -1032,7 +1031,7 @@ Jean-Roch Coulon, André Sintzoff.</em></p>
|
||||||
OpenHW Group CV64A6_MMU.</p>
|
OpenHW Group CV64A6_MMU.</p>
|
||||||
</div>
|
</div>
|
||||||
<div class="paragraph">
|
<div class="paragraph">
|
||||||
<p><strong class="big"><em>Preface to Document Version 20240612</em></strong></p>
|
<p><strong class="big"><em>Preface to Document Version 20240703</em></strong></p>
|
||||||
</div>
|
</div>
|
||||||
<div class="paragraph">
|
<div class="paragraph">
|
||||||
<p>This document describes the RISC-V unprivileged architecture.</p>
|
<p>This document describes the RISC-V unprivileged architecture.</p>
|
||||||
|
@ -1151,6 +1150,11 @@ to change before ratification.</p>
|
||||||
<td class="tableblock halign-center valign-top"><p class="tableblock"><strong>Ratifed</strong></p></td>
|
<td class="tableblock halign-center valign-top"><p class="tableblock"><strong>Ratifed</strong></p></td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
|
<td class="tableblock halign-center valign-top"><p class="tableblock"><strong>Zabha</strong></p></td>
|
||||||
|
<td class="tableblock halign-left valign-top"><p class="tableblock"><strong>1.0</strong></p></td>
|
||||||
|
<td class="tableblock halign-center valign-top"><p class="tableblock"><strong>Ratifed</strong></p></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
<td class="tableblock halign-center valign-top"><p class="tableblock"><strong>RVWMO</strong></p></td>
|
<td class="tableblock halign-center valign-top"><p class="tableblock"><strong>RVWMO</strong></p></td>
|
||||||
<td class="tableblock halign-left valign-top"><p class="tableblock"><strong>2.0</strong></p></td>
|
<td class="tableblock halign-left valign-top"><p class="tableblock"><strong>2.0</strong></p></td>
|
||||||
<td class="tableblock halign-center valign-top"><p class="tableblock"><strong>Ratified</strong></p></td>
|
<td class="tableblock halign-center valign-top"><p class="tableblock"><strong>Ratified</strong></p></td>
|
||||||
|
@ -1305,6 +1309,16 @@ to change before ratification.</p>
|
||||||
<td class="tableblock halign-left valign-top"><p class="tableblock"><strong>1.0</strong></p></td>
|
<td class="tableblock halign-left valign-top"><p class="tableblock"><strong>1.0</strong></p></td>
|
||||||
<td class="tableblock halign-center valign-top"><p class="tableblock"><strong>Ratified</strong></p></td>
|
<td class="tableblock halign-center valign-top"><p class="tableblock"><strong>Ratified</strong></p></td>
|
||||||
</tr>
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td class="tableblock halign-center valign-top"><p class="tableblock"><strong>Zicfiss</strong></p></td>
|
||||||
|
<td class="tableblock halign-left valign-top"><p class="tableblock"><strong>1.0</strong></p></td>
|
||||||
|
<td class="tableblock halign-center valign-top"><p class="tableblock"><strong>Ratified</strong></p></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td class="tableblock halign-center valign-top"><p class="tableblock"><strong>Zicfilp</strong></p></td>
|
||||||
|
<td class="tableblock halign-left valign-top"><p class="tableblock"><strong>1.0</strong></p></td>
|
||||||
|
<td class="tableblock halign-center valign-top"><p class="tableblock"><strong>Ratified</strong></p></td>
|
||||||
|
</tr>
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
<div class="paragraph">
|
<div class="paragraph">
|
||||||
|
@ -10398,7 +10412,7 @@ Zcb can be implemented on <em>any</em> CPU as the instructions are 16-bit versio
|
||||||
<i class="fa icon-note" title="Note"></i>
|
<i class="fa icon-note" title="Note"></i>
|
||||||
</td>
|
</td>
|
||||||
<td class="content">
|
<td class="content">
|
||||||
<em>c.sext.w</em> is a pseudo-instruction for <em>c.addiw rd, 0</em> (RV64)
|
<em>c.sext.w</em> is a pseudoinstruction for <em>c.addiw rd, 0</em> (RV64)
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
</table>
|
</table>
|
||||||
|
@ -10854,7 +10868,7 @@ Zcmt is primarily targeted at embedded class CPUs due to implementation complexi
|
||||||
</div>
|
</div>
|
||||||
<div class="listingblock">
|
<div class="listingblock">
|
||||||
<div class="content">
|
<div class="content">
|
||||||
<pre class="pygments highlight"><code data-lang="sail">//This is not SAIL, it's pseudo-code. The SAIL hasn't been written yet.
|
<pre class="pygments highlight"><code data-lang="sail">//This is not SAIL, it's pseudocode. The SAIL hasn't been written yet.
|
||||||
|
|
||||||
X(rdc) = EXTZ(mem[X(rs1c)+EXTZ(uimm)][7..0]);</code></pre>
|
X(rdc) = EXTZ(mem[X(rs1c)+EXTZ(uimm)][7..0]);</code></pre>
|
||||||
</div>
|
</div>
|
||||||
|
@ -10924,7 +10938,7 @@ X(rdc) = EXTZ(mem[X(rs1c)+EXTZ(uimm)][7..0]);</code></pre>
|
||||||
</div>
|
</div>
|
||||||
<div class="listingblock">
|
<div class="listingblock">
|
||||||
<div class="content">
|
<div class="content">
|
||||||
<pre class="pygments highlight"><code data-lang="sail">//This is not SAIL, it's pseudo-code. The SAIL hasn't been written yet.
|
<pre class="pygments highlight"><code data-lang="sail">//This is not SAIL, it's pseudocode. The SAIL hasn't been written yet.
|
||||||
|
|
||||||
X(rdc) = EXTZ(load_mem[X(rs1c)+EXTZ(uimm)][15..0]);</code></pre>
|
X(rdc) = EXTZ(load_mem[X(rs1c)+EXTZ(uimm)][15..0]);</code></pre>
|
||||||
</div>
|
</div>
|
||||||
|
@ -10994,7 +11008,7 @@ X(rdc) = EXTZ(load_mem[X(rs1c)+EXTZ(uimm)][15..0]);</code></pre>
|
||||||
</div>
|
</div>
|
||||||
<div class="listingblock">
|
<div class="listingblock">
|
||||||
<div class="content">
|
<div class="content">
|
||||||
<pre class="pygments highlight"><code data-lang="sail">//This is not SAIL, it's pseudo-code. The SAIL hasn't been written yet.
|
<pre class="pygments highlight"><code data-lang="sail">//This is not SAIL, it's pseudocode. The SAIL hasn't been written yet.
|
||||||
|
|
||||||
X(rdc) = EXTS(load_mem[X(rs1c)+EXTZ(uimm)][15..0]);</code></pre>
|
X(rdc) = EXTS(load_mem[X(rs1c)+EXTZ(uimm)][15..0]);</code></pre>
|
||||||
</div>
|
</div>
|
||||||
|
@ -11064,7 +11078,7 @@ X(rdc) = EXTS(load_mem[X(rs1c)+EXTZ(uimm)][15..0]);</code></pre>
|
||||||
</div>
|
</div>
|
||||||
<div class="listingblock">
|
<div class="listingblock">
|
||||||
<div class="content">
|
<div class="content">
|
||||||
<pre class="pygments highlight"><code data-lang="sail">//This is not SAIL, it's pseudo-code. The SAIL hasn't been written yet.
|
<pre class="pygments highlight"><code data-lang="sail">//This is not SAIL, it's pseudocode. The SAIL hasn't been written yet.
|
||||||
|
|
||||||
mem[X(rs1c)+EXTZ(uimm)][7..0] = X(rs2c)</code></pre>
|
mem[X(rs1c)+EXTZ(uimm)][7..0] = X(rs2c)</code></pre>
|
||||||
</div>
|
</div>
|
||||||
|
@ -11134,7 +11148,7 @@ mem[X(rs1c)+EXTZ(uimm)][7..0] = X(rs2c)</code></pre>
|
||||||
</div>
|
</div>
|
||||||
<div class="listingblock">
|
<div class="listingblock">
|
||||||
<div class="content">
|
<div class="content">
|
||||||
<pre class="pygments highlight"><code data-lang="sail">//This is not SAIL, it's pseudo-code. The SAIL hasn't been written yet.
|
<pre class="pygments highlight"><code data-lang="sail">//This is not SAIL, it's pseudocode. The SAIL hasn't been written yet.
|
||||||
|
|
||||||
mem[X(rs1c)+EXTZ(uimm)][15..0] = X(rs2c)</code></pre>
|
mem[X(rs1c)+EXTZ(uimm)][15..0] = X(rs2c)</code></pre>
|
||||||
</div>
|
</div>
|
||||||
|
@ -11923,7 +11937,7 @@ It is implementation defined whether interrupts can also be taken during the seq
|
||||||
<div class="ulist">
|
<div class="ulist">
|
||||||
<ul>
|
<ul>
|
||||||
<li>
|
<li>
|
||||||
<p>A sequence of stores writing the bytes required by the pseudo-code</p>
|
<p>A sequence of stores writing the bytes required by the pseudocode</p>
|
||||||
<div class="ulist">
|
<div class="ulist">
|
||||||
<ul>
|
<ul>
|
||||||
<li>
|
<li>
|
||||||
|
@ -12005,7 +12019,7 @@ addi sp, sp, -64</code></pre>
|
||||||
<div class="ulist">
|
<div class="ulist">
|
||||||
<ul>
|
<ul>
|
||||||
<li>
|
<li>
|
||||||
<p>A sequence of loads reading the bytes required by the pseudo-code.</p>
|
<p>A sequence of loads reading the bytes required by the pseudocode.</p>
|
||||||
<div class="ulist">
|
<div class="ulist">
|
||||||
<ul>
|
<ul>
|
||||||
<li>
|
<li>
|
||||||
|
@ -12391,11 +12405,11 @@ as defined above.</p>
|
||||||
<p>Operation:</p>
|
<p>Operation:</p>
|
||||||
</div>
|
</div>
|
||||||
<div class="paragraph">
|
<div class="paragraph">
|
||||||
<p>The first section of pseudo-code may be executed multiple times before the instruction successfully completes.</p>
|
<p>The first section of pseudocode may be executed multiple times before the instruction successfully completes.</p>
|
||||||
</div>
|
</div>
|
||||||
<div class="listingblock">
|
<div class="listingblock">
|
||||||
<div class="content">
|
<div class="content">
|
||||||
<pre class="pygments highlight"><code data-lang="sail">//This is not SAIL, it's pseudo-code. The SAIL hasn't been written yet.
|
<pre class="pygments highlight"><code data-lang="sail">//This is not SAIL, it's pseudocode. The SAIL hasn't been written yet.
|
||||||
|
|
||||||
if (XLEN==32) bytes=4; else bytes=8;
|
if (XLEN==32) bytes=4; else bytes=8;
|
||||||
|
|
||||||
|
@ -12413,11 +12427,11 @@ for(i in 27,26,25,24,23,22,21,20,19,18,9,8,1) {
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="paragraph">
|
<div class="paragraph">
|
||||||
<p>The final section of pseudo-code executes atomically, and only executes if the section above completes without any exceptions or interrupts.</p>
|
<p>The final section of pseudocode executes atomically, and only executes if the section above completes without any exceptions or interrupts.</p>
|
||||||
</div>
|
</div>
|
||||||
<div class="listingblock">
|
<div class="listingblock">
|
||||||
<div class="content">
|
<div class="content">
|
||||||
<pre class="pygments highlight"><code data-lang="sail">//This is not SAIL, it's pseudo-code. The SAIL hasn't been written yet.
|
<pre class="pygments highlight"><code data-lang="sail">//This is not SAIL, it's pseudocode. The SAIL hasn't been written yet.
|
||||||
|
|
||||||
sp-=stack_adj;</code></pre>
|
sp-=stack_adj;</code></pre>
|
||||||
</div>
|
</div>
|
||||||
|
@ -12617,11 +12631,11 @@ as defined above.</p>
|
||||||
<p>Operation:</p>
|
<p>Operation:</p>
|
||||||
</div>
|
</div>
|
||||||
<div class="paragraph">
|
<div class="paragraph">
|
||||||
<p>The first section of pseudo-code may be executed multiple times before the instruction successfully completes.</p>
|
<p>The first section of pseudocode may be executed multiple times before the instruction successfully completes.</p>
|
||||||
</div>
|
</div>
|
||||||
<div class="listingblock">
|
<div class="listingblock">
|
||||||
<div class="content">
|
<div class="content">
|
||||||
<pre class="pygments highlight"><code data-lang="sail">//This is not SAIL, it's pseudo-code. The SAIL hasn't been written yet.
|
<pre class="pygments highlight"><code data-lang="sail">//This is not SAIL, it's pseudocode. The SAIL hasn't been written yet.
|
||||||
|
|
||||||
if (XLEN==32) bytes=4; else bytes=8;
|
if (XLEN==32) bytes=4; else bytes=8;
|
||||||
|
|
||||||
|
@ -12639,11 +12653,11 @@ for(i in 27,26,25,24,23,22,21,20,19,18,9,8,1) {
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="paragraph">
|
<div class="paragraph">
|
||||||
<p>The final section of pseudo-code executes atomically, and only executes if the section above completes without any exceptions or interrupts.</p>
|
<p>The final section of pseudocode executes atomically, and only executes if the section above completes without any exceptions or interrupts.</p>
|
||||||
</div>
|
</div>
|
||||||
<div class="listingblock">
|
<div class="listingblock">
|
||||||
<div class="content">
|
<div class="content">
|
||||||
<pre class="pygments highlight"><code data-lang="sail">//This is not SAIL, it's pseudo-code. The SAIL hasn't been written yet.
|
<pre class="pygments highlight"><code data-lang="sail">//This is not SAIL, it's pseudocode. The SAIL hasn't been written yet.
|
||||||
|
|
||||||
sp+=stack_adj;</code></pre>
|
sp+=stack_adj;</code></pre>
|
||||||
</div>
|
</div>
|
||||||
|
@ -12838,11 +12852,11 @@ switch (rlist) {
|
||||||
<p>Operation:</p>
|
<p>Operation:</p>
|
||||||
</div>
|
</div>
|
||||||
<div class="paragraph">
|
<div class="paragraph">
|
||||||
<p>The first section of pseudo-code may be executed multiple times before the instruction successfully completes.</p>
|
<p>The first section of pseudocode may be executed multiple times before the instruction successfully completes.</p>
|
||||||
</div>
|
</div>
|
||||||
<div class="listingblock">
|
<div class="listingblock">
|
||||||
<div class="content">
|
<div class="content">
|
||||||
<pre class="pygments highlight"><code data-lang="sail">//This is not SAIL, it's pseudo-code. The SAIL hasn't been written yet.
|
<pre class="pygments highlight"><code data-lang="sail">//This is not SAIL, it's pseudocode. The SAIL hasn't been written yet.
|
||||||
|
|
||||||
if (XLEN==32) bytes=4; else bytes=8;
|
if (XLEN==32) bytes=4; else bytes=8;
|
||||||
|
|
||||||
|
@ -12860,7 +12874,7 @@ for(i in 27,26,25,24,23,22,21,20,19,18,9,8,1) {
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="paragraph">
|
<div class="paragraph">
|
||||||
<p>The final section of pseudo-code executes atomically, and only executes if the section above completes without any exceptions or interrupts.</p>
|
<p>The final section of pseudocode executes atomically, and only executes if the section above completes without any exceptions or interrupts.</p>
|
||||||
</div>
|
</div>
|
||||||
<div class="admonitionblock note">
|
<div class="admonitionblock note">
|
||||||
<table>
|
<table>
|
||||||
|
@ -12878,7 +12892,7 @@ for(i in 27,26,25,24,23,22,21,20,19,18,9,8,1) {
|
||||||
</div>
|
</div>
|
||||||
<div class="listingblock">
|
<div class="listingblock">
|
||||||
<div class="content">
|
<div class="content">
|
||||||
<pre class="pygments highlight"><code data-lang="sail">//This is not SAIL, it's pseudo-code. The SAIL hasn't been written yet.
|
<pre class="pygments highlight"><code data-lang="sail">//This is not SAIL, it's pseudocode. The SAIL hasn't been written yet.
|
||||||
|
|
||||||
asm("li a0, 0");
|
asm("li a0, 0");
|
||||||
sp+=stack_adj;
|
sp+=stack_adj;
|
||||||
|
@ -13078,11 +13092,11 @@ switch (rlist) {
|
||||||
<p>Operation:</p>
|
<p>Operation:</p>
|
||||||
</div>
|
</div>
|
||||||
<div class="paragraph">
|
<div class="paragraph">
|
||||||
<p>The first section of pseudo-code may be executed multiple times before the instruction successfully completes.</p>
|
<p>The first section of pseudocode may be executed multiple times before the instruction successfully completes.</p>
|
||||||
</div>
|
</div>
|
||||||
<div class="listingblock">
|
<div class="listingblock">
|
||||||
<div class="content">
|
<div class="content">
|
||||||
<pre class="pygments highlight"><code data-lang="sail">//This is not SAIL, it's pseudo-code. The SAIL hasn't been written yet.
|
<pre class="pygments highlight"><code data-lang="sail">//This is not SAIL, it's pseudocode. The SAIL hasn't been written yet.
|
||||||
|
|
||||||
if (XLEN==32) bytes=4; else bytes=8;
|
if (XLEN==32) bytes=4; else bytes=8;
|
||||||
|
|
||||||
|
@ -13100,11 +13114,11 @@ for(i in 27,26,25,24,23,22,21,20,19,18,9,8,1) {
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="paragraph">
|
<div class="paragraph">
|
||||||
<p>The final section of pseudo-code executes atomically, and only executes if the section above completes without any exceptions or interrupts.</p>
|
<p>The final section of pseudocode executes atomically, and only executes if the section above completes without any exceptions or interrupts.</p>
|
||||||
</div>
|
</div>
|
||||||
<div class="listingblock">
|
<div class="listingblock">
|
||||||
<div class="content">
|
<div class="content">
|
||||||
<pre class="pygments highlight"><code data-lang="sail">//This is not SAIL, it's pseudo-code. The SAIL hasn't been written yet.
|
<pre class="pygments highlight"><code data-lang="sail">//This is not SAIL, it's pseudocode. The SAIL hasn't been written yet.
|
||||||
|
|
||||||
sp+=stack_adj;
|
sp+=stack_adj;
|
||||||
asm("ret");</code></pre>
|
asm("ret");</code></pre>
|
||||||
|
@ -13163,7 +13177,7 @@ The execution is atomic, so it is not possible to observe state where only one o
|
||||||
</div>
|
</div>
|
||||||
<div class="paragraph">
|
<div class="paragraph">
|
||||||
<p>The encoding uses <em>sreg</em> number specifiers instead of <em>xreg</em> number specifiers to save encoding space.
|
<p>The encoding uses <em>sreg</em> number specifiers instead of <em>xreg</em> number specifiers to save encoding space.
|
||||||
The mapping between them is specified in the pseudo-code below.</p>
|
The mapping between them is specified in the pseudocode below.</p>
|
||||||
</div>
|
</div>
|
||||||
<div class="admonitionblock note">
|
<div class="admonitionblock note">
|
||||||
<table>
|
<table>
|
||||||
|
@ -13196,7 +13210,7 @@ The mapping between them is specified in the pseudo-code below.</p>
|
||||||
</div>
|
</div>
|
||||||
<div class="listingblock">
|
<div class="listingblock">
|
||||||
<div class="content">
|
<div class="content">
|
||||||
<pre class="pygments highlight"><code data-lang="sail">//This is not SAIL, it's pseudo-code. The SAIL hasn't been written yet.
|
<pre class="pygments highlight"><code data-lang="sail">//This is not SAIL, it's pseudocode. The SAIL hasn't been written yet.
|
||||||
if (RV32E && (r1sc>1 || r2sc>1)) {
|
if (RV32E && (r1sc>1 || r2sc>1)) {
|
||||||
reserved();
|
reserved();
|
||||||
}
|
}
|
||||||
|
@ -13245,7 +13259,7 @@ The execution is atomic, so it is not possible to observe state where only one o
|
||||||
</div>
|
</div>
|
||||||
<div class="paragraph">
|
<div class="paragraph">
|
||||||
<p>The encoding uses <em>sreg</em> number specifiers instead of <em>xreg</em> number specifiers to save encoding space.
|
<p>The encoding uses <em>sreg</em> number specifiers instead of <em>xreg</em> number specifiers to save encoding space.
|
||||||
The mapping between them is specified in the pseudo-code below.</p>
|
The mapping between them is specified in the pseudocode below.</p>
|
||||||
</div>
|
</div>
|
||||||
<div class="admonitionblock note">
|
<div class="admonitionblock note">
|
||||||
<table>
|
<table>
|
||||||
|
@ -13278,7 +13292,7 @@ The mapping between them is specified in the pseudo-code below.</p>
|
||||||
</div>
|
</div>
|
||||||
<div class="listingblock">
|
<div class="listingblock">
|
||||||
<div class="content">
|
<div class="content">
|
||||||
<pre class="pygments highlight"><code data-lang="sail">//This is not SAIL, it's pseudo-code. The SAIL hasn't been written yet.
|
<pre class="pygments highlight"><code data-lang="sail">//This is not SAIL, it's pseudocode. The SAIL hasn't been written yet.
|
||||||
if (RV32E && (r1sc>1 || r2sc>1)) {
|
if (RV32E && (r1sc>1 || r2sc>1)) {
|
||||||
reserved();
|
reserved();
|
||||||
}
|
}
|
||||||
|
@ -13559,7 +13573,7 @@ attempt to program different modes and read back the values to see which are ava
|
||||||
</div>
|
</div>
|
||||||
<div class="listingblock">
|
<div class="listingblock">
|
||||||
<div class="content">
|
<div class="content">
|
||||||
<pre class="pygments highlight"><code data-lang="sail">//This is not SAIL, it's pseudo-code. The SAIL hasn't been written yet.
|
<pre class="pygments highlight"><code data-lang="sail">//This is not SAIL, it's pseudocode. The SAIL hasn't been written yet.
|
||||||
|
|
||||||
# target_address is temporary internal state, it doesn't represent a real register
|
# target_address is temporary internal state, it doesn't represent a real register
|
||||||
# InstMemory is byte indexed
|
# InstMemory is byte indexed
|
||||||
|
@ -13662,7 +13676,7 @@ j target_address[XLEN-1:0]&~0x1;</code></pre>
|
||||||
</div>
|
</div>
|
||||||
<div class="listingblock">
|
<div class="listingblock">
|
||||||
<div class="content">
|
<div class="content">
|
||||||
<pre class="pygments highlight"><code data-lang="sail">//This is not SAIL, it's pseudo-code. The SAIL hasn't been written yet.
|
<pre class="pygments highlight"><code data-lang="sail">//This is not SAIL, it's pseudocode. The SAIL hasn't been written yet.
|
||||||
|
|
||||||
# target_address is temporary internal state, it doesn't represent a real register
|
# target_address is temporary internal state, it doesn't represent a real register
|
||||||
# InstMemory is byte indexed
|
# InstMemory is byte indexed
|
||||||
|
@ -20117,7 +20131,7 @@ categories: <em>standard</em> versus <em>non-standard</em>.</p>
|
||||||
<li>
|
<li>
|
||||||
<p>A standard extension is one that is generally useful and that is
|
<p>A standard extension is one that is generally useful and that is
|
||||||
designed to not conflict with any other standard extension. Currently,
|
designed to not conflict with any other standard extension. Currently,
|
||||||
"MAFDQLCBTPV", described in other chapters of this manual, are either
|
"MAFDQCBTPV", described in other chapters of this manual, are either
|
||||||
complete or planned standard extensions.</p>
|
complete or planned standard extensions.</p>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
|
@ -25208,7 +25222,7 @@ sizes. Misaligned accesses are broken up into single-byte accesses.</p>
|
||||||
semantics (RV64I and A), are integrated into the <code>rmem</code> exploration tool
|
semantics (RV64I and A), are integrated into the <code>rmem</code> exploration tool
|
||||||
(<a href="https://github.com/rems-project/rmem" class="bare">github.com/rems-project/rmem</a>). <code>rmem</code> can explore litmus tests
|
(<a href="https://github.com/rems-project/rmem" class="bare">github.com/rems-project/rmem</a>). <code>rmem</code> can explore litmus tests
|
||||||
(see <a href="#litmustests">Section A.2</a>) and small ELF binaries
|
(see <a href="#litmustests">Section A.2</a>) and small ELF binaries
|
||||||
exhaustively, pseudo-randomly and interactively. In <code>rmem</code>, the ISA
|
exhaustively, pseudorandomly and interactively. In <code>rmem</code>, the ISA
|
||||||
semantics is expressed explicitly in Sail (see
|
semantics is expressed explicitly in Sail (see
|
||||||
<a href="https://github.com/rems-project/sail" class="bare">github.com/rems-project/sail</a> for the Sail language, and
|
<a href="https://github.com/rems-project/sail" class="bare">github.com/rems-project/sail</a> for the Sail language, and
|
||||||
<a href="https://github.com/rems-project/sail-riscv" class="bare">github.com/rems-project/sail-riscv</a> for the RISC-V ISA model),
|
<a href="https://github.com/rems-project/sail-riscv" class="bare">github.com/rems-project/sail-riscv</a> for the RISC-V ISA model),
|
||||||
|
@ -26896,7 +26910,7 @@ an external oracle that provides an opcode when given a memory location.</p>
|
||||||
</div>
|
</div>
|
||||||
<div id="footer">
|
<div id="footer">
|
||||||
<div id="footer-text">
|
<div id="footer-text">
|
||||||
Version 20240612<br>
|
Version 20240703<br>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</body>
|
</body>
|
||||||
|
|
|
@ -22,19 +22,19 @@ setup:
|
||||||
cp -r src build/riscv-isa-manual
|
cp -r src build/riscv-isa-manual
|
||||||
|
|
||||||
priv-pdf: setup
|
priv-pdf: setup
|
||||||
cd build/riscv-isa-manual/build; make priv-pdf
|
cd build/riscv-isa-manual; make SKIP_DOCKER=true build/riscv-privileged.pdf
|
||||||
cp ./build/riscv-isa-manual/build/riscv-privileged.pdf priv-isa-$(CONFIG).pdf
|
cp ./build/riscv-isa-manual/build/riscv-privileged.pdf priv-isa-$(CONFIG).pdf
|
||||||
|
|
||||||
priv-html: setup
|
priv-html: setup
|
||||||
cd build/riscv-isa-manual/build; make priv-html
|
cd build/riscv-isa-manual; make SKIP_DOCKER=true build/riscv-privileged.html
|
||||||
cp ./build/riscv-isa-manual/build/riscv-privileged.html priv-isa-$(CONFIG).html
|
cp ./build/riscv-isa-manual/build/riscv-privileged.html priv-isa-$(CONFIG).html
|
||||||
|
|
||||||
unpriv-pdf: setup
|
unpriv-pdf: setup
|
||||||
cd build/riscv-isa-manual/build; make unpriv-pdf
|
cd build/riscv-isa-manual; make SKIP_DOCKER=true build/riscv-unprivileged.pdf
|
||||||
cp ./build/riscv-isa-manual/build/riscv-unprivileged.pdf unpriv-isa-$(CONFIG).pdf
|
cp ./build/riscv-isa-manual/build/riscv-unprivileged.pdf unpriv-isa-$(CONFIG).pdf
|
||||||
|
|
||||||
unpriv-html: setup
|
unpriv-html: setup
|
||||||
cd build/riscv-isa-manual/build; make unpriv-html
|
cd build/riscv-isa-manual; make SKIP_DOCKER=true build/riscv-unprivileged.html
|
||||||
cp ./build/riscv-isa-manual/build/riscv-unprivileged.html unpriv-isa-$(CONFIG).html
|
cp ./build/riscv-isa-manual/build/riscv-unprivileged.html unpriv-isa-$(CONFIG).html
|
||||||
|
|
||||||
clean:
|
clean:
|
||||||
|
|
|
@ -1 +1 @@
|
||||||
Subproject commit c8c8075a6a71be67ac723528070e3e50ff7586b2
|
Subproject commit ebf2e3a0b402cd56fd4b571b705b31f3be62c2cc
|
|
@ -7,7 +7,7 @@
|
||||||
This document describes the RISC-V unprivileged architecture tailored for
|
This document describes the RISC-V unprivileged architecture tailored for
|
||||||
OpenHW Group {ohg-config}.
|
OpenHW Group {ohg-config}.
|
||||||
|
|
||||||
[.big]*_Preface to Document Version 20240612_*
|
[.big]*_Preface to Document Version 20240703_*
|
||||||
|
|
||||||
This document describes the RISC-V unprivileged architecture.
|
This document describes the RISC-V unprivileged architecture.
|
||||||
|
|
||||||
|
@ -41,6 +41,7 @@ h|Extension h|Version h|Status
|
||||||
|*A* |*2.1* |*Ratified*
|
|*A* |*2.1* |*Ratified*
|
||||||
|*Zawrs* |*1.01* |*Ratified*
|
|*Zawrs* |*1.01* |*Ratified*
|
||||||
|*Zacas* |*1.0* |*Ratifed*
|
|*Zacas* |*1.0* |*Ratifed*
|
||||||
|
|*Zabha* |*1.0* |*Ratifed*
|
||||||
|*RVWMO* |*2.0* |*Ratified*
|
|*RVWMO* |*2.0* |*Ratified*
|
||||||
|*Ztso* |*1.0* |*Ratified*
|
|*Ztso* |*1.0* |*Ratified*
|
||||||
|*CMO* |*1.0* |*Ratified*
|
|*CMO* |*1.0* |*Ratified*
|
||||||
|
@ -72,6 +73,8 @@ h|Extension h|Version h|Status
|
||||||
|*Zvksed* |*1.0* |*Ratified*
|
|*Zvksed* |*1.0* |*Ratified*
|
||||||
|*Zvksh* |*1.0* |*Ratified*
|
|*Zvksh* |*1.0* |*Ratified*
|
||||||
|*Zvkt* |*1.0* |*Ratified*
|
|*Zvkt* |*1.0* |*Ratified*
|
||||||
|
|*Zicfiss* |*1.0* |*Ratified*
|
||||||
|
|*Zicfilp* |*1.0* |*Ratified*
|
||||||
|===
|
|===
|
||||||
|
|
||||||
The changes in this version of the document include:
|
The changes in this version of the document include:
|
||||||
|
|
|
@ -63,6 +63,10 @@ ifeval::[{RVZsmdbltrp} == true]
|
||||||
:RVZsmdbltrp-true:
|
:RVZsmdbltrp-true:
|
||||||
endif::[]
|
endif::[]
|
||||||
|
|
||||||
|
ifeval::[{RVZssdbltrp} == true]
|
||||||
|
:RVZssdbltrp-true:
|
||||||
|
endif::[]
|
||||||
|
|
||||||
ifeval::[{RVZicfilp} == true]
|
ifeval::[{RVZicfilp} == true]
|
||||||
:RVZicfilp-true:
|
:RVZicfilp-true:
|
||||||
endif::[]
|
endif::[]
|
||||||
|
|
|
@ -487,75 +487,13 @@ endif::[]
|
||||||
ifdef::archi-default,XLEN-32[]
|
ifdef::archi-default,XLEN-32[]
|
||||||
[[mstatusreg-rv32]]
|
[[mstatusreg-rv32]]
|
||||||
.Machine-mode status (`mstatus`) register for RV32
|
.Machine-mode status (`mstatus`) register for RV32
|
||||||
[wavedrom, ,svg]
|
include::images/wavedrom/mstatusreg-rv321.adoc[]
|
||||||
....
|
|
||||||
{reg: [
|
|
||||||
{bits: 1, name: 'WPRI'},
|
|
||||||
{bits: 1, name: 'SIE'},
|
|
||||||
{bits: 1, name: 'WPRI'},
|
|
||||||
{bits: 1, name: 'MIE'},
|
|
||||||
{bits: 1, name: 'WPRI'},
|
|
||||||
{bits: 1, name: 'SPIE'},
|
|
||||||
{bits: 1, name: 'UBE'},
|
|
||||||
{bits: 1, name: 'MPIE'},
|
|
||||||
{bits: 1, name: 'SPP'},
|
|
||||||
{bits: 2, name: 'VS[1:0]'},
|
|
||||||
{bits: 2, name: 'MPP[1:0]'},
|
|
||||||
{bits: 2, name: 'FS[1:0]'},
|
|
||||||
{bits: 2, name: 'XS[1:0]'},
|
|
||||||
{bits: 1, name: 'MPRV'},
|
|
||||||
{bits: 1, name: 'SUM'},
|
|
||||||
{bits: 1, name: 'MXR'},
|
|
||||||
{bits: 1, name: 'TVM'},
|
|
||||||
{bits: 1, name: 'TW'},
|
|
||||||
{bits: 1, name: 'TSR'},
|
|
||||||
{bits: 1, name: 'SPELP'},
|
|
||||||
{bits: 7, name: 'WPRI'},
|
|
||||||
{bits: 1, name: 'SD'},
|
|
||||||
], config:{lanes: 2, hspace:1024}}
|
|
||||||
....
|
|
||||||
endif::[]
|
endif::[]
|
||||||
|
|
||||||
ifdef::archi-default,XLEN-64[]
|
ifdef::archi-default,XLEN-64[]
|
||||||
[[mstatusreg]]
|
[[mstatusreg]]
|
||||||
.Machine-mode status (`mstatus`) register for RV64
|
.Machine-mode status (`mstatus`) register for RV64
|
||||||
[wavedrom, ,svg]
|
include::images/wavedrom/mstatusreg.adoc[]
|
||||||
....
|
|
||||||
{reg: [
|
|
||||||
{bits: 1, name: 'WPRI'},
|
|
||||||
{bits: 1, name: 'SIE'},
|
|
||||||
{bits: 1, name: 'WPRI'},
|
|
||||||
{bits: 1, name: 'MIE'},
|
|
||||||
{bits: 1, name: 'WPRI'},
|
|
||||||
{bits: 1, name: 'SPIE'},
|
|
||||||
{bits: 1, name: 'UBE'},
|
|
||||||
{bits: 1, name: 'MPIE'},
|
|
||||||
{bits: 1, name: 'SPP'},
|
|
||||||
{bits: 2, name: 'VS[1:0]'},
|
|
||||||
{bits: 2, name: 'MPP[1:0]'},
|
|
||||||
{bits: 2, name: 'FS[1:0]'},
|
|
||||||
{bits: 2, name: 'XS[1:0]'},
|
|
||||||
{bits: 1, name: 'MPRV'},
|
|
||||||
{bits: 1, name: 'SUM'},
|
|
||||||
{bits: 1, name: 'MXR'},
|
|
||||||
{bits: 1, name: 'TVM'},
|
|
||||||
{bits: 1, name: 'TW'},
|
|
||||||
{bits: 1, name: 'TSR'},
|
|
||||||
{bits: 1, name: 'SPELP'},
|
|
||||||
{bits: 8, name: 'WPRI'},
|
|
||||||
{bits: 2, name: 'UXL[1:0]'},
|
|
||||||
{bits: 2, name: 'SXL[1:0]'},
|
|
||||||
{bits: 1, name: 'SBE'},
|
|
||||||
{bits: 1, name: 'MBE'},
|
|
||||||
{bits: 1, name: 'GVA'},
|
|
||||||
{bits: 1, name: 'MPV'},
|
|
||||||
{bits: 1, name: 'WPRI'},
|
|
||||||
{bits: 1, name: 'MPELP'},
|
|
||||||
{bits: 1, name: 'MDT'},
|
|
||||||
{bits: 20, name: 'WPRI'},
|
|
||||||
{bits: 1, name: 'SD'},
|
|
||||||
], config:{lanes: 4, hspace:1024}}
|
|
||||||
....
|
|
||||||
endif::[]
|
endif::[]
|
||||||
|
|
||||||
ifdef::archi-default[]
|
ifdef::archi-default[]
|
||||||
|
@ -571,20 +509,7 @@ endif::[]
|
||||||
ifdef::archi-default,XLEN-32[]
|
ifdef::archi-default,XLEN-32[]
|
||||||
[[mstatushreg]]
|
[[mstatushreg]]
|
||||||
.Additional machine-mode status (`mstatush`) register for RV32.
|
.Additional machine-mode status (`mstatush`) register for RV32.
|
||||||
[wavedrom, ,svg]
|
include::images/wavedrom/mstatushreg.adoc[]
|
||||||
....
|
|
||||||
{reg: [
|
|
||||||
{bits: 4, name: 'WPRI'},
|
|
||||||
{bits: 1, name: 'SBE'},
|
|
||||||
{bits: 1, name: 'MBE'},
|
|
||||||
{bits: 1, name: 'GVA'},
|
|
||||||
{bits: 1, name: 'MPV'},
|
|
||||||
{bits: 1, name: 'WPRI'},
|
|
||||||
{bits: 1, name: 'MPELP'},
|
|
||||||
{bits: 1, name: 'MDT'},
|
|
||||||
{bits: 21, name: 'WPRI'},
|
|
||||||
], config:{lanes: 2, hspace:1024}}
|
|
||||||
....
|
|
||||||
endif::[]
|
endif::[]
|
||||||
|
|
||||||
[[privstack]]
|
[[privstack]]
|
||||||
|
@ -769,8 +694,8 @@ ifeval::[{note} == true]
|
||||||
[NOTE]
|
[NOTE]
|
||||||
====
|
====
|
||||||
The consequence of this specification is that on occurrence of double trap the
|
The consequence of this specification is that on occurrence of double trap the
|
||||||
RNMI handler is not provided with information that a trap would report in the
|
RNMI handler is not provided with information that a trap reports in the
|
||||||
`mtval` and the `mtval2` registers. This information, if needed, may be obtained
|
`mtval` and the `mtval2` registers. This information, if needed, can be obtained
|
||||||
by the RNMI handler by decoding the instruction at the address in `mnepc` and
|
by the RNMI handler by decoding the instruction at the address in `mnepc` and
|
||||||
examining its source register contents.
|
examining its source register contents.
|
||||||
====
|
====
|
||||||
|
@ -779,7 +704,7 @@ endif::[]
|
||||||
ifdef::archi-default,RVZsmdbltrp-true[]
|
ifdef::archi-default,RVZsmdbltrp-true[]
|
||||||
* When the Smrnmi extension is not implemented, or if the Smrnmi extension is
|
* When the Smrnmi extension is not implemented, or if the Smrnmi extension is
|
||||||
implemented and `mnstatus.NMIE` is 0, the hart enters a critical-error state
|
implemented and `mnstatus.NMIE` is 0, the hart enters a critical-error state
|
||||||
without updating any architectural state including the `pc`. This state
|
without updating any architectural state, including the `pc`. This state
|
||||||
involves ceasing execution, disabling all interrupts (including NMIs), and
|
involves ceasing execution, disabling all interrupts (including NMIs), and
|
||||||
asserting a `critical-error` signal to the platform.
|
asserting a `critical-error` signal to the platform.
|
||||||
endif::[]
|
endif::[]
|
||||||
|
@ -787,14 +712,17 @@ endif::[]
|
||||||
ifeval::[{note} == true]
|
ifeval::[{note} == true]
|
||||||
[NOTE]
|
[NOTE]
|
||||||
====
|
====
|
||||||
The actions performed by the platform on assertion of a `critical-error` signal
|
The actions performed by the platform when a hart asserts a `critical-error` signal
|
||||||
by a hart are platform specific. The range of possible actions include restarting
|
are platform-specific. The range of possible actions include restarting
|
||||||
the affected hart or restarting the entire platform among others.
|
the affected hart or restarting the entire platform, among others.
|
||||||
====
|
====
|
||||||
endif::[]
|
endif::[]
|
||||||
|
|
||||||
ifdef::archi-default,RVZsmdbltrp-true[]
|
ifdef::archi-default,RVZsmdbltrp-true[]
|
||||||
An `MRET` instruction sets the `MDT` bit to 0.
|
The `MRET` and `SRET` instructions, when executed in M-mode, set the `MDT` bit
|
||||||
|
to 0. If the new privilege mode is U, VS, or VU, then `sstatus.SDT` is also set
|
||||||
|
to 0. Additionally, if it is VU, then `vsstatus.SDT` is also set to 0.
|
||||||
|
|
||||||
endif::[]
|
endif::[]
|
||||||
|
|
||||||
ifndef::archi-default,RVZsmdbltrp-true[]
|
ifndef::archi-default,RVZsmdbltrp-true[]
|
||||||
|
@ -862,6 +790,22 @@ ifndef::archi-default,RVS-true[]
|
||||||
[{ohg-config}] The SXL and UXL fields do not exist.
|
[{ohg-config}] The SXL and UXL fields do not exist.
|
||||||
endif::[]
|
endif::[]
|
||||||
|
|
||||||
|
ifdef::archi-default[]
|
||||||
|
Some HINT instructions are encoded as integer computational instructions that
|
||||||
|
overwrite their destination register with its current value, e.g.,
|
||||||
|
`c.addi x8, 0`.
|
||||||
|
When such a HINT is executed with XLEN < MXLEN and bits MXLEN..XLEN of the
|
||||||
|
destination register not all equal to bit XLEN-1, it is implementation-defined
|
||||||
|
whether bits MXLEN..XLEN of the destination register are unchanged or are
|
||||||
|
overwritten with copies of bit XLEN-1.
|
||||||
|
|
||||||
|
NOTE: This definition allows implementations to elide register writeback for
|
||||||
|
some HINTs, while allowing them to execute other HINTs in the same manner as
|
||||||
|
other integer computational instructions.
|
||||||
|
The implementation choice is observable only by privilege modes with an XLEN
|
||||||
|
setting greater than the current XLEN; it is invisible to the current
|
||||||
|
privilege mode.
|
||||||
|
endif::[]
|
||||||
|
|
||||||
===== Memory Privilege in `mstatus` Register
|
===== Memory Privilege in `mstatus` Register
|
||||||
|
|
||||||
|
@ -2912,28 +2856,10 @@ as shown in <<menvcfgreg>>, that controls
|
||||||
certain characteristics of the execution environment for modes less
|
certain characteristics of the execution environment for modes less
|
||||||
privileged than M.
|
privileged than M.
|
||||||
|
|
||||||
[#menvcfgreg]
|
[[menvcfgreg]]
|
||||||
.Machine environment configuration (`menvcfg`) register.
|
.Machine environment configuration (`menvcfg`) register.
|
||||||
[wavedrom, ,svg]
|
include::images/wavedrom/menvcfgreg.adoc[]
|
||||||
....
|
|
||||||
{reg: [
|
|
||||||
{bits: 1, name: 'FIOM'},
|
|
||||||
{bits: 1, name: 'WPRI'},
|
|
||||||
{bits: 1, name: 'LPE'},
|
|
||||||
{bits: 1, name: 'SSE'},
|
|
||||||
{bits: 2, name: 'CBIE'},
|
|
||||||
{bits: 1, name: 'CBCFE'},
|
|
||||||
{bits: 1, name: 'CBZE'},
|
|
||||||
{bits: 24, name: 'WPRI'},
|
|
||||||
{bits: 2, name: 'PMM'},
|
|
||||||
{bits: 25, name: 'WPRI'},
|
|
||||||
{bits: 1, name: 'DTE'},
|
|
||||||
{bits: 1, name: 'CDE'},
|
|
||||||
{bits: 1, name: 'ADUE'},
|
|
||||||
{bits: 1, name: 'PBMTE'},
|
|
||||||
{bits: 1, name: 'STCE'},
|
|
||||||
], config:{lanes: 4, hspace:1024}}
|
|
||||||
....
|
|
||||||
|
|
||||||
If bit FIOM (Fence of I/O implies Memory) is set to one in `menvcfg`,
|
If bit FIOM (Fence of I/O implies Memory) is set to one in `menvcfg`,
|
||||||
FENCE instructions executed in modes less privileged than M are modified
|
FENCE instructions executed in modes less privileged than M are modified
|
||||||
|
@ -3143,19 +3069,7 @@ shown in <<mseccfg>>, that controls security features.
|
||||||
|
|
||||||
[[mseccfg]]
|
[[mseccfg]]
|
||||||
.Machine security configuration (`mseccfg`) register.
|
.Machine security configuration (`mseccfg`) register.
|
||||||
[wavedrom, ,svg]
|
include::images/wavedrom/mseccfg.adoc[]
|
||||||
....
|
|
||||||
{reg: [
|
|
||||||
{bits: 1, name: 'MML'},
|
|
||||||
{bits: 1, name: 'MMWP'},
|
|
||||||
{bits: 1, name: 'RLB'},
|
|
||||||
{bits: 5, name: 'WPRI'},
|
|
||||||
{bits: 1, name: 'USEED'},
|
|
||||||
{bits: 1, name: 'SSEED'},
|
|
||||||
{bits: 1, name: 'MLPE'},
|
|
||||||
{bits: 53, name: 'WPRI'},
|
|
||||||
], config:{lanes: 4, hspace:1024}}
|
|
||||||
....
|
|
||||||
|
|
||||||
The definitions of the SSEED and USEED fields will be furnished by the
|
The definitions of the SSEED and USEED fields will be furnished by the
|
||||||
forthcoming entropy-source extension, Zkr. Their allocations within
|
forthcoming entropy-source extension, Zkr. Their allocations within
|
||||||
|
@ -3252,8 +3166,9 @@ counting and wall-clock time.
|
||||||
====
|
====
|
||||||
endif::[]
|
endif::[]
|
||||||
|
|
||||||
Writes to `mtime` and `mtimecmp` are guaranteed to be reflected in MTIP
|
If the result of the comparison between `mtime` and `mtimecmp` changes, it is
|
||||||
eventually, but not necessarily immediately.
|
guaranteed to be reflected in MTIP eventually, but not necessarily
|
||||||
|
immediately.
|
||||||
|
|
||||||
ifeval::[{note} == true]
|
ifeval::[{note} == true]
|
||||||
[NOTE]
|
[NOTE]
|
||||||
|
|
|
@ -6,10 +6,10 @@
|
||||||
This document describes the RISC-V privileged architecture tailored for
|
This document describes the RISC-V privileged architecture tailored for
|
||||||
OpenHW Group {ohg-config}.
|
OpenHW Group {ohg-config}.
|
||||||
|
|
||||||
[.big]*_Preface to Version 20240612_*
|
[.big]*_Preface to Version 20240703_*
|
||||||
|
|
||||||
This document describes the RISC-V privileged architecture. This
|
This document describes the RISC-V privileged architecture. This
|
||||||
release, version 20240612, contains the following versions of the RISC-V ISA
|
release, version 20240703, contains the following versions of the RISC-V ISA
|
||||||
modules:
|
modules:
|
||||||
|
|
||||||
[%autowidth,float="center",align="center",cols="^,<,^",options="header",]
|
[%autowidth,float="center",align="center",cols="^,<,^",options="header",]
|
||||||
|
@ -19,10 +19,10 @@ modules:
|
||||||
*Smstateen Extension* +
|
*Smstateen Extension* +
|
||||||
*Smcsrind/Sscsrind Extension* +
|
*Smcsrind/Sscsrind Extension* +
|
||||||
*Smepmp* +
|
*Smepmp* +
|
||||||
**Smcntrpmf* +
|
*Smcntrpmf* +
|
||||||
*Smrnmi Extension* +
|
*Smrnmi Extension* +
|
||||||
*Smcdeleg* +
|
*Smcdeleg* +
|
||||||
*Smdbltrp* +
|
_Smdbltrp_ +
|
||||||
_Supervisor ISA_ +
|
_Supervisor ISA_ +
|
||||||
*Svade Extension* +
|
*Svade Extension* +
|
||||||
*Svnapot Extension* +
|
*Svnapot Extension* +
|
||||||
|
@ -31,9 +31,10 @@ _Supervisor ISA_ +
|
||||||
*Svadu Extension* +
|
*Svadu Extension* +
|
||||||
*Sstc* +
|
*Sstc* +
|
||||||
*Sscofpmf* +
|
*Sscofpmf* +
|
||||||
*Ssdbltrp* +
|
_Ssdbltrp_ +
|
||||||
*Hypervisor ISA* +
|
*Hypervisor ISA* +
|
||||||
_Shlcofideleg_
|
_Shlcofideleg_ +
|
||||||
|
*Svvptc*
|
||||||
|
|
||||||
|_1.13_ +
|
|_1.13_ +
|
||||||
*1.0* +
|
*1.0* +
|
||||||
|
@ -42,7 +43,7 @@ _Shlcofideleg_
|
||||||
*1.0* +
|
*1.0* +
|
||||||
*1.0* +
|
*1.0* +
|
||||||
*1.0* +
|
*1.0* +
|
||||||
*1.0* +
|
_1.0_ +
|
||||||
_1.13_ +
|
_1.13_ +
|
||||||
*1.0* +
|
*1.0* +
|
||||||
*1.0* +
|
*1.0* +
|
||||||
|
@ -51,9 +52,10 @@ _1.13_ +
|
||||||
*1.0* +
|
*1.0* +
|
||||||
*1.0* +
|
*1.0* +
|
||||||
*1.0* +
|
*1.0* +
|
||||||
|
_1.0_ +
|
||||||
*1.0* +
|
*1.0* +
|
||||||
*1.0* +
|
_0.1_ +
|
||||||
_0.1_
|
*1.0*
|
||||||
|
|
||||||
|_Draft_ +
|
|_Draft_ +
|
||||||
*Ratified* +
|
*Ratified* +
|
||||||
|
@ -73,7 +75,8 @@ _Draft_ +
|
||||||
*Ratified* +
|
*Ratified* +
|
||||||
_Draft_ +
|
_Draft_ +
|
||||||
*Ratified* +
|
*Ratified* +
|
||||||
_Draft_
|
_Draft_ +
|
||||||
|
*Ratified*
|
||||||
|===
|
|===
|
||||||
|
|
||||||
The following changes have been made since version 1.12 of the Machine and
|
The following changes have been made since version 1.12 of the Machine and
|
||||||
|
@ -98,6 +101,7 @@ implemented.
|
||||||
* Specified synchronization requirements when changing the PBMTE fields
|
* Specified synchronization requirements when changing the PBMTE fields
|
||||||
in `menvcfg` and `henvcfg`.
|
in `menvcfg` and `henvcfg`.
|
||||||
* Exposed count-overflow interrups to VS-mode via the Shlcofideleg extension.
|
* Exposed count-overflow interrups to VS-mode via the Shlcofideleg extension.
|
||||||
|
* Relaxed behavior of some HINTs when MXLEN > XLEN.
|
||||||
|
|
||||||
Finally, the following clarifications and document improvments have been made
|
Finally, the following clarifications and document improvments have been made
|
||||||
since the last document release:
|
since the last document release:
|
||||||
|
@ -117,6 +121,8 @@ be set to a nonzero value but sometimes not.
|
||||||
* Clarified exception behavior of unimplemented or inaccessible CSRs.
|
* Clarified exception behavior of unimplemented or inaccessible CSRs.
|
||||||
* Clarified that Svpbmt allows implementations to override additional PMAs.
|
* Clarified that Svpbmt allows implementations to override additional PMAs.
|
||||||
* Replaced the concept of vacant memory regions with inaccessible memory or I/O regions.
|
* Replaced the concept of vacant memory regions with inaccessible memory or I/O regions.
|
||||||
|
* Clarified that timer and count-overflow interrupts' arrival in
|
||||||
|
interrupt-pending registers is not immediate.
|
||||||
|
|
||||||
[.big]*_Preface to Version 20211203_*
|
[.big]*_Preface to Version 20211203_*
|
||||||
|
|
||||||
|
|
|
@ -2,23 +2,19 @@ include::config.adoc[]
|
||||||
|
|
||||||
[[risc-v-isa]]
|
[[risc-v-isa]]
|
||||||
= The RISC-V Instruction Set Manual for {ohg-config}: Volume II: Privileged Architecture
|
= The RISC-V Instruction Set Manual for {ohg-config}: Volume II: Privileged Architecture
|
||||||
|
include::../docs-resources/global-config.adoc[]
|
||||||
:description: Volume II - Privileged Architecture
|
:description: Volume II - Privileged Architecture
|
||||||
:company: RISC-V.org
|
:revnumber: 20240703
|
||||||
:revnumber: 20240612
|
|
||||||
//:revremark: Pre-release version
|
//:revremark: Pre-release version
|
||||||
//development: assume everything can change
|
//development: assume everything can change
|
||||||
//stable: assume everything could change
|
//stable: assume everything could change
|
||||||
//frozen: of you implement this version you assume the risk that something might change because of the public review cycle but we expect little to no change.
|
//frozen: of you implement this version you assume the risk that something might change because of the public review cycle but we expect little to no change.
|
||||||
//ratified: you can implement this and be assured nothing will change. if something needs to change due to an errata or enhancement, it will come out in a new extension. we do not revise extensions.
|
//ratified: you can implement this and be assured nothing will change. if something needs to change due to an errata or enhancement, it will come out in a new extension. we do not revise extensions.
|
||||||
:url-riscv: http://riscv.org
|
|
||||||
:doctype: book
|
|
||||||
:colophon:
|
:colophon:
|
||||||
:pdf-theme: ../src/resources/themes/riscv-spec.yml
|
|
||||||
:pdf-fontsdir: ../src/resources/fonts/
|
|
||||||
:preface-title: Preamble
|
:preface-title: Preamble
|
||||||
:appendix-caption: Appendix
|
:appendix-caption: Appendix
|
||||||
:imagesdir: images
|
:imagesdir: ../docs-resources/images
|
||||||
:title-logo-image: image:risc-v_logo.png[pdfwidth=3.25in,align=center]
|
:title-logo-image: image:risc-v_logo.png["RISC-V International Logo",pdfwidth=3.25in,align=center]
|
||||||
:page-background-image: image:draft.png[opacity=20%]
|
:page-background-image: image:draft.png[opacity=20%]
|
||||||
:title-page-background-image: image:ohg_logo.png[fit=none,pdfwidth=3.25in,position=top]
|
:title-page-background-image: image:ohg_logo.png[fit=none,pdfwidth=3.25in,position=top]
|
||||||
//:title-page-background-image: none
|
//:title-page-background-image: none
|
||||||
|
@ -27,7 +23,7 @@ include::config.adoc[]
|
||||||
:experimental:
|
:experimental:
|
||||||
:reproducible:
|
:reproducible:
|
||||||
:imagesoutdir: images
|
:imagesoutdir: images
|
||||||
:bibtex-file: ../src/resources/riscv-spec.bib
|
:bibtex-file: src/resources/riscv-spec.bib
|
||||||
:bibtex-order: alphabetical
|
:bibtex-order: alphabetical
|
||||||
:bibtex-style: apa
|
:bibtex-style: apa
|
||||||
:bibtex-format: asciidoc
|
:bibtex-format: asciidoc
|
||||||
|
@ -61,6 +57,7 @@ endif::[]
|
||||||
:ne: ≠
|
:ne: ≠
|
||||||
:approx: ≈
|
:approx: ≈
|
||||||
:inf: ∞
|
:inf: ∞
|
||||||
|
:imagesdir: images
|
||||||
|
|
||||||
This document describes the RISC-V privileged architecture tailored for
|
This document describes the RISC-V privileged architecture tailored for
|
||||||
OpenHW Group {ohg-config}.
|
OpenHW Group {ohg-config}.
|
||||||
|
|
|
@ -2,19 +2,15 @@ include::config.adoc[]
|
||||||
|
|
||||||
[[risc-v-isa]]
|
[[risc-v-isa]]
|
||||||
= The RISC-V Instruction Set Manual for {ohg-config}: Volume I - Unprivileged Architecture
|
= The RISC-V Instruction Set Manual for {ohg-config}: Volume I - Unprivileged Architecture
|
||||||
:description: Volume I - Unprivileged Architecture
|
include::../docs-resources/global-config.adoc[]
|
||||||
:company: RISC-V.org
|
:description: Unprivileged Architecture
|
||||||
:revnumber: 20240612
|
:revnumber: 20240703
|
||||||
//:revremark: Pre-release version
|
//:revremark: Pre-release version
|
||||||
:url-riscv: http://riscv.org
|
|
||||||
:doctype: book
|
|
||||||
:colophon:
|
:colophon:
|
||||||
:pdf-theme: ../src/resources/themes/riscv-spec.yml
|
|
||||||
:pdf-fontsdir: ../src/resources/fonts/
|
|
||||||
:preface-title: Preamble
|
:preface-title: Preamble
|
||||||
:appendix-caption: Appendix
|
:appendix-caption: Appendix
|
||||||
:imagesdir: images
|
:imagesdir: ../docs-resources/images
|
||||||
:title-logo-image: image:risc-v_logo.png[pdfwidth=3.25in,align=center]
|
:title-logo-image: image:risc-v_logo.png["RISC-V International Logo",pdfwidth=3.25in,align=center]
|
||||||
:page-background-image: image:draft.png[opacity=20%]
|
:page-background-image: image:draft.png[opacity=20%]
|
||||||
:title-page-background-image: image:ohg_logo.png[fit=none,pdfwidth=3.25in,position=top]
|
:title-page-background-image: image:ohg_logo.png[fit=none,pdfwidth=3.25in,position=top]
|
||||||
//:title-page-background-image: none
|
//:title-page-background-image: none
|
||||||
|
@ -24,7 +20,7 @@ include::config.adoc[]
|
||||||
:experimental:
|
:experimental:
|
||||||
:reproducible:
|
:reproducible:
|
||||||
:imagesoutdir: images
|
:imagesoutdir: images
|
||||||
:bibtex-file: ../src/resources/riscv-spec.bib
|
:bibtex-file: src/resources/riscv-spec.bib
|
||||||
:bibtex-order: alphabetical
|
:bibtex-order: alphabetical
|
||||||
:bibtex-style: apa
|
:bibtex-style: apa
|
||||||
:bibtex-format: asciidoc
|
:bibtex-format: asciidoc
|
||||||
|
@ -58,6 +54,7 @@ endif::[]
|
||||||
:approx: ≈
|
:approx: ≈
|
||||||
:inf: ∞
|
:inf: ∞
|
||||||
:csrname: envcfg
|
:csrname: envcfg
|
||||||
|
:imagesdir: images
|
||||||
|
|
||||||
This document describes the RISC-V unprivileged architecture tailored for
|
This document describes the RISC-V unprivileged architecture tailored for
|
||||||
OpenHW Group {ohg-config}.
|
OpenHW Group {ohg-config}.
|
||||||
|
|
|
@ -88,7 +88,8 @@ ifdef::archi-default,XLEN-32[]
|
||||||
{bits: 1, name: 'MXR'},
|
{bits: 1, name: 'MXR'},
|
||||||
{bits: 3, name: 'WPRI'},
|
{bits: 3, name: 'WPRI'},
|
||||||
{bits: 1, name: 'SPELP'},
|
{bits: 1, name: 'SPELP'},
|
||||||
{bits: 7, name: 'WPRI'},
|
{bits: 1, name: 'SDT'},
|
||||||
|
{bits: 6, name: 'WPRI'},
|
||||||
{bits: 1, name: 'SD'},
|
{bits: 1, name: 'SD'},
|
||||||
], config:{lanes: 2, hspace:1024}}
|
], config:{lanes: 2, hspace:1024}}
|
||||||
....
|
....
|
||||||
|
@ -116,7 +117,8 @@ ifdef::archi-default,XLEN-64[]
|
||||||
{bits: 1, name: 'MXR'},
|
{bits: 1, name: 'MXR'},
|
||||||
{bits: 3, name: 'WPRI'},
|
{bits: 3, name: 'WPRI'},
|
||||||
{bits: 1, name: 'SPELP'},
|
{bits: 1, name: 'SPELP'},
|
||||||
{bits: 8, name: 'WPRI'},
|
{bits: 1, name: 'SDT'},
|
||||||
|
{bits: 7, name: 'WPRI'},
|
||||||
{bits: 2, name: 'UXL[1:0]'},
|
{bits: 2, name: 'UXL[1:0]'},
|
||||||
{bits: 29, name: 'WPRI'},
|
{bits: 29, name: 'WPRI'},
|
||||||
{bits: 1, name: 'SD'},
|
{bits: 1, name: 'SD'},
|
||||||
|
@ -186,6 +188,22 @@ The effective XLEN in S-mode is termed _SXLEN_.
|
||||||
Its value is set to SXLEN=MXLEN.
|
Its value is set to SXLEN=MXLEN.
|
||||||
endif::[]
|
endif::[]
|
||||||
|
|
||||||
|
ifdef::archi-default[]
|
||||||
|
Some HINT instructions are encoded as integer computational instructions that
|
||||||
|
overwrite their destination register with its current value, e.g.,
|
||||||
|
`c.addi x8, 0`.
|
||||||
|
When such a HINT is executed with XLEN < SXLEN and bits SXLEN..XLEN of the
|
||||||
|
destination register not all equal to bit XLEN-1, it is implementation-defined
|
||||||
|
whether bits SXLEN..XLEN of the destination register are unchanged or are
|
||||||
|
overwritten with copies of bit XLEN-1.
|
||||||
|
|
||||||
|
NOTE: This definition allows implementations to elide register writeback for
|
||||||
|
some HINTs, while allowing them to execute other HINTs in the same manner as
|
||||||
|
other integer computational instructions.
|
||||||
|
The implementation choice is observable only by S-mode with SXLEN > UXLEN; it
|
||||||
|
is invisible to U-mode.
|
||||||
|
endif::[]
|
||||||
|
|
||||||
[[sum]]
|
[[sum]]
|
||||||
===== Memory Privilege in `sstatus` Register
|
===== Memory Privilege in `sstatus` Register
|
||||||
|
|
||||||
|
@ -278,6 +296,70 @@ Access to the `SPELP` field, added by Zicfilp, accesses the homonymous
|
||||||
fields of `mstatus` when `V=0`, and the homonymous fields of `vsstatus`
|
fields of `mstatus` when `V=0`, and the homonymous fields of `vsstatus`
|
||||||
when `V=1`.
|
when `V=1`.
|
||||||
|
|
||||||
|
[[supv-double-trap]]
|
||||||
|
===== Double Trap Control in `sstatus` Register
|
||||||
|
|
||||||
|
ifdef::archi-default,RVZssdbltrp-true[]
|
||||||
|
The S-mode-disable-trap (`SDT`) bit is a WARL field introduced by the Ssdbltrp
|
||||||
|
extension to address double trap (See <<machine-double-trap>>) at privilege
|
||||||
|
modes lower than M.
|
||||||
|
|
||||||
|
When the `SDT` bit is set to 1 by an explicit CSR write, the `SIE` (Supervisor
|
||||||
|
Interrupt Enable) bit is cleared to 0. This clearing occurs regardless of the
|
||||||
|
value written, if any, to the `SIE` bit by the same write. The `SIE` bit can
|
||||||
|
only be set to 1 by an explicit CSR write if the `SDT` bit is being set to 0 by
|
||||||
|
the same write or is already 0.
|
||||||
|
|
||||||
|
When a trap is to be taken into S-mode, if the `SDT` bit is currently 0,
|
||||||
|
it is then set to 1, and the trap is delivered as expected. However, if `SDT` is
|
||||||
|
already set to 1, then this is an _unexpected trap_. In the event of an
|
||||||
|
_unexpected trap_, a double-trap exception trap is delivered into M-mode. To
|
||||||
|
deliver this trap, the hart writes registers, except `mcause` and `mtval2`, with
|
||||||
|
the same information that the _unexpected trap_ would have written if it was
|
||||||
|
taken into M-mode. The `mtval2` register is then set to what would be otherwise
|
||||||
|
written into the `mcause` register by the _unexpected trap_. The `mcause`
|
||||||
|
register is set to 16, the double-trap exception code.
|
||||||
|
|
||||||
|
An `SRET` instruction sets the `SDT` bit to 0.
|
||||||
|
|
||||||
|
[NOTE]
|
||||||
|
====
|
||||||
|
After a trap handler has saved the state, such as `scause`, `sepc`,
|
||||||
|
and `stval`, needed for resuming from the trap and is reentrant, it
|
||||||
|
should clear the `SDT` bit.
|
||||||
|
|
||||||
|
Resetting the `SDT` by an `SRET` enables the trap handler to detect a double
|
||||||
|
trap that may occur during the tail phase, where it restores critical state
|
||||||
|
to return from a trap.
|
||||||
|
|
||||||
|
The consequence of this specification is that if a critical error condition was
|
||||||
|
caused by a guest page-fault, then the GPA will not be available in `mtval2`
|
||||||
|
when the double trap is delivered to M-mode. This condition arises if the
|
||||||
|
HS-mode invokes a hypervisor virtual-machine load or store instruction when
|
||||||
|
`SDT` is 1 and the instruction raises a guest page-fault. The use of such an
|
||||||
|
instruction in this phase of trap handling is not common. However, not recording
|
||||||
|
the GPA is considered benign because, if required, it can still be obtained
|
||||||
|
-- albeit with added effort -- through the process of walking the page tables.
|
||||||
|
|
||||||
|
For a double trap that originates in VS-mode, M-mode should redirect the exception
|
||||||
|
to HS-mode by copying the values of M-mode CSRs updated by the trap to HS-mode
|
||||||
|
CSRs and should use an `MRET` to resume execution at the address in `stvec`.
|
||||||
|
|
||||||
|
Supervisor Software Events (SSE), an extension to the SBI, provide a
|
||||||
|
mechanism for supervisor software to register and service system events
|
||||||
|
emanating from an SBI implementation, such as firmware or a hypervisor. In the
|
||||||
|
event of a double trap, HS-mode and M-mode can utilize the SSE mechanism to
|
||||||
|
invoke a critical-error handler in VS-mode or S/HS-mode, respectively.
|
||||||
|
Additionally, the implementation of an SSE protocol can be considered as an
|
||||||
|
optional measure to aid in the recovery from such critical errors.
|
||||||
|
====
|
||||||
|
endif::[]
|
||||||
|
|
||||||
|
ifndef::archi-default,RVZssdbltrp-true[]
|
||||||
|
[{ohg-config}] As Double Trap Control (Ssdbltrp extension) is not implemented,
|
||||||
|
SDT field is read-only 0.
|
||||||
|
endif::[]
|
||||||
|
|
||||||
==== Supervisor Trap Vector Base Address (`stvec`) Register
|
==== Supervisor Trap Vector Base Address (`stvec`) Register
|
||||||
|
|
||||||
The `stvec` register is an SXLEN-bit read/write register that holds trap
|
The `stvec` register is an SXLEN-bit read/write register that holds trap
|
||||||
|
@ -2511,31 +2593,34 @@ exceptions when A/D bits need be set, instead takes effect.
|
||||||
The Svade extension is also defined in <<translation>>.
|
The Svade extension is also defined in <<translation>>.
|
||||||
|
|
||||||
[[sec:svvptc]]
|
[[sec:svvptc]]
|
||||||
== "Svvptc" Extension for Eliding Memory-Management Fences on Making PTEs Valid, Version 1.0
|
== "Svvptc" Extension for Obviating Memory-Management Instructions after Marking PTEs Valid, Version 1.0
|
||||||
|
|
||||||
When the Svvptc extension is implemented, explicit stores that update the Valid
|
When the Svvptc extension is implemented, explicit stores by a hart that update
|
||||||
bit of leaf and/or non-leaf PTEs from 0 to 1 and are visible to a hart will
|
the Valid bit of leaf and/or non-leaf PTEs from 0 to 1 and are visible to a hart
|
||||||
eventually become visible within a bounded timeframe to subsequent implicit
|
will eventually become visible within a bounded timeframe to subsequent implicit
|
||||||
accesses by that hart to such PTEs.
|
accesses by that hart to such PTEs.
|
||||||
endif::[]
|
endif::[]
|
||||||
|
|
||||||
ifeval::[{note} == true]
|
ifeval::[{note} == true]
|
||||||
[NOTE]
|
[NOTE]
|
||||||
====
|
====
|
||||||
Typically, PTEs are marked as Valid by the operating system following a
|
Svvptc relieves an operating system from executing certain memory-management
|
||||||
page-fault exception or during system calls for memory mapping. In such cases,
|
instructions, such as `SFENCE.VMA` or `SINVAL.VMA`, which would normally be used
|
||||||
the trap handler commonly employs an `SRET` instruction to return from the trap.
|
to synchronize the hart's address-translation caches when a memory-resident PTE
|
||||||
When Svvptc is implemented, the stores it executes to change the Valid bit
|
is changed from Invalid to Valid. Synchronizing the hart's address-translation
|
||||||
of the PTEs from 0 to 1 then become visible to implicit references to those PTEs
|
caches with other forms of updates to a memory-resident PTE, including when a
|
||||||
within a bounded timeframe. This visibility pertains to the instructions like
|
PTE is changed from Valid to Invalid, requires the use of suitable
|
||||||
the one causing the page fault or those accessing new memory regions. A
|
memory-management instructions. Svvptc guarantees that a change to a PTE from
|
||||||
memory-management fence can be used to force immediate visibility of these PTE
|
Invalid to Valid is made visible within a bounded time, thereby making the
|
||||||
updates to all implicit references associated with instructions following the
|
execution of these memory-management instructions redundant. The performance
|
||||||
memory-management fence. However, when Svvptc is implemented, visibility (in a
|
benefit of eliding these instructions outweighs the cost of an occasional
|
||||||
bounded amount of time) is guaranteed and use of a memory-management fence is
|
gratuitous additional page fault that may occur.
|
||||||
not required in these scenarios. While this approach might lead to an occasional
|
|
||||||
gratuitous page-fault, the performance benefit of omitting the memory-management
|
Depending on the microarchitecture, some possible ways to facilitate
|
||||||
fence instructions outweighs the occasional cost of a gratuitous page fault.
|
implementation of Svvptc include: not having any address-translation caches, not
|
||||||
|
storing Invalid PTEs in the address-translation caches, automatically evicting
|
||||||
|
Invalid PTEs using a bounded timer, or making address-translation caches
|
||||||
|
coherent with store instructions that modify PTEs.
|
||||||
====
|
====
|
||||||
endif::[]
|
endif::[]
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue