| // Copyright 2019 The Go Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style |
| // license that can be found in the LICENSE file. |
| |
| package runtime |
| |
| import ( |
| "internal/runtime/syscall" |
| "unsafe" |
| ) |
| |
| func osArchInit() {} |
| |
| type riscvHWProbePairs = struct { |
| key int64 |
| value uint64 |
| } |
| |
| // TODO: Consider whether to use the VDSO entry for riscv_hwprobe. |
| // There is a VDSO entry for riscv_hwprobe that should allow us to avoid the syscall |
| // entirely as it can handle the case where the caller only requests extensions that are |
| // supported on all cores, which is what we're doing here. However, as we're only calling |
| // this syscall once, it may not be worth the added effort to implement the VDSO call. |
| |
| //go:linkname internal_cpu_riscvHWProbe internal/cpu.riscvHWProbe |
| func internal_cpu_riscvHWProbe(pairs []riscvHWProbePairs, flags uint) bool { |
| // sys_RISCV_HWPROBE is copied from golang.org/x/sys/unix/zsysnum_linux_riscv64.go. |
| const sys_RISCV_HWPROBE uintptr = 258 |
| |
| if len(pairs) == 0 { |
| return false |
| } |
| // Passing in a cpuCount of 0 and a cpu of nil ensures that only extensions supported by all the |
| // cores are returned, which is the behaviour we want in internal/cpu. |
| _, _, e1 := syscall.Syscall6(sys_RISCV_HWPROBE, uintptr(unsafe.Pointer(&pairs[0])), uintptr(len(pairs)), uintptr(0), uintptr(unsafe.Pointer(nil)), uintptr(flags), 0) |
| return e1 == 0 |
| } |