go-randomx/flags.go
DataHoarder c41d6c8080
Some checks failed
continuous-integration/drone/push Build is failing
Support large pages, implement aligned / paged / large paged allocators
2024-05-02 16:18:50 +02:00

69 lines
1.7 KiB
Go

package randomx
import (
"git.gammaspectra.live/P2Pool/go-randomx/v3/internal/aes"
"golang.org/x/sys/cpu"
"runtime"
)
type Flags uint64
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
const (
// RANDOMX_FLAG_LARGE_PAGES Select large page allocation for dataset
RANDOMX_FLAG_LARGE_PAGES = Flags(1 << iota)
// RANDOMX_FLAG_HARD_AES Selects between hardware or software AES
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
RANDOMX_FLAG_ARGON2 = RANDOMX_FLAG_ARGON2_AVX2 | RANDOMX_FLAG_ARGON2_SSSE3
)
// 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) {
flags = RANDOMX_FLAG_DEFAULT
if runtime.GOARCH == "amd64" {
flags |= RANDOMX_FLAG_JIT
if aes.HasHardAESImplementation && cpu.X86.HasAES {
flags |= RANDOMX_FLAG_HARD_AES
}
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
}
return flags
}