Skip to content

Commit c0a9559

Browse files
committed
cpu: add crypto extensions detection for riscv64
This CL adds RISC-V cryptography extensions detection. Direct detection of the extensions zvkned, zvknhb, zvksed and zvksh is not supported, since the crypto spec requires these extensions implemented with data independent timing (zkt). However, their presence may be inferred by checking for the shorthand extensions: zvkn, zvknc, zvkng, zvks, zvksc, zvksg. Change-Id: Ic00038cebf1b9f77426876b06b08f206473ad6fb Reviewed-on: https://go-review.googlesource.com/c/sys/+/664375 LUCI-TryBot-Result: Go LUCI <[email protected]> Reviewed-by: Junyang Shao <[email protected]> Reviewed-by: Mark Ryan <[email protected]> Reviewed-by: Carlos Amedee <[email protected]> Reviewed-by: Pengcheng Wang <[email protected]> Reviewed-by: Dmitri Shuralyov <[email protected]>
1 parent 8e9e046 commit c0a9559

File tree

3 files changed

+46
-0
lines changed

3 files changed

+46
-0
lines changed

cpu/cpu.go

+11
Original file line numberDiff line numberDiff line change
@@ -232,6 +232,17 @@ var RISCV64 struct {
232232
HasZba bool // Address generation instructions extension
233233
HasZbb bool // Basic bit-manipulation extension
234234
HasZbs bool // Single-bit instructions extension
235+
HasZvbb bool // Vector Basic Bit-manipulation
236+
HasZvbc bool // Vector Carryless Multiplication
237+
HasZvkb bool // Vector Cryptography Bit-manipulation
238+
HasZvkt bool // Vector Data-Independent Execution Latency
239+
HasZvkg bool // Vector GCM/GMAC
240+
HasZvkn bool // NIST Algorithm Suite (AES/SHA256/SHA512)
241+
HasZvknc bool // NIST Algorithm Suite with carryless multiply
242+
HasZvkng bool // NIST Algorithm Suite with GCM
243+
HasZvks bool // ShangMi Algorithm Suite
244+
HasZvksc bool // ShangMi Algorithm Suite with carryless multiplication
245+
HasZvksg bool // ShangMi Algorithm Suite with GCM
235246
_ CacheLinePad
236247
}
237248

cpu/cpu_linux_riscv64.go

+23
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,15 @@ const (
5858
riscv_HWPROBE_EXT_ZBA = 0x8
5959
riscv_HWPROBE_EXT_ZBB = 0x10
6060
riscv_HWPROBE_EXT_ZBS = 0x20
61+
riscv_HWPROBE_EXT_ZVBB = 0x20000
62+
riscv_HWPROBE_EXT_ZVBC = 0x40000
63+
riscv_HWPROBE_EXT_ZVKB = 0x80000
64+
riscv_HWPROBE_EXT_ZVKG = 0x100000
65+
riscv_HWPROBE_EXT_ZVKNED = 0x200000
66+
riscv_HWPROBE_EXT_ZVKNHB = 0x800000
67+
riscv_HWPROBE_EXT_ZVKSED = 0x1000000
68+
riscv_HWPROBE_EXT_ZVKSH = 0x2000000
69+
riscv_HWPROBE_EXT_ZVKT = 0x4000000
6170
riscv_HWPROBE_KEY_CPUPERF_0 = 0x5
6271
riscv_HWPROBE_MISALIGNED_FAST = 0x3
6372
riscv_HWPROBE_MISALIGNED_MASK = 0x7
@@ -99,6 +108,20 @@ func doinit() {
99108
RISCV64.HasZba = isSet(v, riscv_HWPROBE_EXT_ZBA)
100109
RISCV64.HasZbb = isSet(v, riscv_HWPROBE_EXT_ZBB)
101110
RISCV64.HasZbs = isSet(v, riscv_HWPROBE_EXT_ZBS)
111+
RISCV64.HasZvbb = isSet(v, riscv_HWPROBE_EXT_ZVBB)
112+
RISCV64.HasZvbc = isSet(v, riscv_HWPROBE_EXT_ZVBC)
113+
RISCV64.HasZvkb = isSet(v, riscv_HWPROBE_EXT_ZVKB)
114+
RISCV64.HasZvkg = isSet(v, riscv_HWPROBE_EXT_ZVKG)
115+
RISCV64.HasZvkt = isSet(v, riscv_HWPROBE_EXT_ZVKT)
116+
// Cryptography shorthand extensions
117+
RISCV64.HasZvkn = isSet(v, riscv_HWPROBE_EXT_ZVKNED) &&
118+
isSet(v, riscv_HWPROBE_EXT_ZVKNHB) && RISCV64.HasZvkb && RISCV64.HasZvkt
119+
RISCV64.HasZvknc = RISCV64.HasZvkn && RISCV64.HasZvbc
120+
RISCV64.HasZvkng = RISCV64.HasZvkn && RISCV64.HasZvkg
121+
RISCV64.HasZvks = isSet(v, riscv_HWPROBE_EXT_ZVKSED) &&
122+
isSet(v, riscv_HWPROBE_EXT_ZVKSH) && RISCV64.HasZvkb && RISCV64.HasZvkt
123+
RISCV64.HasZvksc = RISCV64.HasZvks && RISCV64.HasZvbc
124+
RISCV64.HasZvksg = RISCV64.HasZvks && RISCV64.HasZvkg
102125
}
103126
if pairs[1].key != -1 {
104127
v := pairs[1].value & riscv_HWPROBE_MISALIGNED_MASK

cpu/cpu_riscv64.go

+12
Original file line numberDiff line numberDiff line change
@@ -16,5 +16,17 @@ func initOptions() {
1616
{Name: "zba", Feature: &RISCV64.HasZba},
1717
{Name: "zbb", Feature: &RISCV64.HasZbb},
1818
{Name: "zbs", Feature: &RISCV64.HasZbs},
19+
// RISC-V Cryptography Extensions
20+
{Name: "zvbb", Feature: &RISCV64.HasZvbb},
21+
{Name: "zvbc", Feature: &RISCV64.HasZvbc},
22+
{Name: "zvkb", Feature: &RISCV64.HasZvkb},
23+
{Name: "zvkg", Feature: &RISCV64.HasZvkg},
24+
{Name: "zvkt", Feature: &RISCV64.HasZvkt},
25+
{Name: "zvkn", Feature: &RISCV64.HasZvkn},
26+
{Name: "zvknc", Feature: &RISCV64.HasZvknc},
27+
{Name: "zvkng", Feature: &RISCV64.HasZvkng},
28+
{Name: "zvks", Feature: &RISCV64.HasZvks},
29+
{Name: "zvksc", Feature: &RISCV64.HasZvksc},
30+
{Name: "zvksg", Feature: &RISCV64.HasZvksg},
1931
}
2032
}

0 commit comments

Comments
 (0)