2024-04-23 12:36:43 +00:00
|
|
|
package randomx
|
|
|
|
|
|
|
|
import (
|
2024-05-01 14:25:35 +00:00
|
|
|
"git.gammaspectra.live/P2Pool/go-randomx/v3/internal/aes"
|
2024-04-23 12:36:43 +00:00
|
|
|
"golang.org/x/sys/cpu"
|
|
|
|
"runtime"
|
|
|
|
)
|
|
|
|
|
2024-05-01 20:43:52 +00:00
|
|
|
type Flags uint64
|
2024-05-01 14:25:35 +00:00
|
|
|
|
2024-05-01 20:43:52 +00:00
|
|
|
func (f Flags) Has(flags Flags) bool {
|
|
|
|
return f&flags == flags
|
|
|
|
}
|
|
|
|
|
|
|
|
func (f Flags) HasJIT() bool {
|
|
|
|
return f.Has(RANDOMX_FLAG_JIT) && supportsJIT
|
|
|
|
}
|
|
|
|
|
|
|
|
const RANDOMX_FLAG_DEFAULT Flags = 0
|
2024-04-23 12:36:43 +00:00
|
|
|
|
|
|
|
const (
|
2024-05-02 14:11:08 +00:00
|
|
|
// RANDOMX_FLAG_LARGE_PAGES Select large page allocation for dataset
|
2024-05-01 20:43:52 +00:00
|
|
|
RANDOMX_FLAG_LARGE_PAGES = Flags(1 << iota)
|
|
|
|
// RANDOMX_FLAG_HARD_AES Selects between hardware or software AES
|
2024-04-23 12:36:43 +00:00
|
|
|
RANDOMX_FLAG_HARD_AES
|
|
|
|
// RANDOMX_FLAG_FULL_MEM Selects between full or light mode dataset
|
|
|
|
RANDOMX_FLAG_FULL_MEM
|
|
|
|
// RANDOMX_FLAG_JIT Enables JIT features
|
|
|
|
RANDOMX_FLAG_JIT
|
|
|
|
// RANDOMX_FLAG_SECURE Enables W^X for JIT code
|
|
|
|
RANDOMX_FLAG_SECURE
|
|
|
|
RANDOMX_FLAG_ARGON2_SSSE3
|
|
|
|
RANDOMX_FLAG_ARGON2_AVX2
|
2024-05-01 14:25:35 +00:00
|
|
|
RANDOMX_FLAG_ARGON2 = RANDOMX_FLAG_ARGON2_AVX2 | RANDOMX_FLAG_ARGON2_SSSE3
|
2024-04-23 12:36:43 +00:00
|
|
|
)
|
|
|
|
|
2024-05-01 20:43:52 +00:00
|
|
|
// GetFlags The recommended flags to be used on the current machine.
|
|
|
|
// Does not include:
|
|
|
|
// * RANDOMX_FLAG_LARGE_PAGES
|
|
|
|
// * RANDOMX_FLAG_FULL_MEM
|
|
|
|
// * RANDOMX_FLAG_SECURE
|
|
|
|
// These flags must be added manually if desired.
|
|
|
|
//
|
|
|
|
// On OpenBSD RANDOMX_FLAG_SECURE is enabled by default in JIT mode as W^X is enforced by the OS.
|
|
|
|
func GetFlags() (flags Flags) {
|
2024-04-23 12:36:43 +00:00
|
|
|
flags = RANDOMX_FLAG_DEFAULT
|
|
|
|
if runtime.GOARCH == "amd64" {
|
|
|
|
flags |= RANDOMX_FLAG_JIT
|
|
|
|
|
2024-05-01 14:25:35 +00:00
|
|
|
if aes.HasHardAESImplementation && cpu.X86.HasAES {
|
2024-04-23 12:36:43 +00:00
|
|
|
flags |= RANDOMX_FLAG_HARD_AES
|
|
|
|
}
|
2024-05-01 14:25:35 +00:00
|
|
|
|
|
|
|
if cpu.X86.HasSSSE3 {
|
|
|
|
flags |= RANDOMX_FLAG_ARGON2_SSSE3
|
|
|
|
}
|
|
|
|
|
|
|
|
if cpu.X86.HasAVX2 {
|
|
|
|
flags |= RANDOMX_FLAG_ARGON2_AVX2
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if runtime.GOOS == "openbsd" || runtime.GOOS == "netbsd" || ((runtime.GOOS == "darwin" || runtime.GOOS == "ios") && runtime.GOARCH == "arm64") {
|
|
|
|
flags |= RANDOMX_FLAG_SECURE
|
2024-04-23 12:36:43 +00:00
|
|
|
}
|
2024-05-01 14:25:35 +00:00
|
|
|
|
2024-04-23 12:36:43 +00:00
|
|
|
return flags
|
|
|
|
}
|