// 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 }