@ -34,6 +34,7 @@
# include <stdio.h>
# include <stdio.h>
# include <stdlib.h>
# include <stdlib.h>
# include <unistd.h>
# include <unistd.h>
# include <limits.h>
# include "randomx.h"
# include "randomx.h"
# include "c_threads.h"
# include "c_threads.h"
@ -74,84 +75,41 @@ static void local_abort(const char *msg)
# endif
# endif
}
}
/**
static inline int disabled_flags ( void ) {
* @ brief uses cpuid to determine if the CPU supports the AES instructions
static int flags = - 1 ;
* @ return true if the CPU supports AES , false otherwise
*/
static inline int force_software_aes ( void )
if ( flags ! = - 1 ) {
{
return flags ;
static int use = - 1 ;
}
if ( use ! = - 1 )
return use ;
const char * env = getenv ( " MONERO_ USE_SOFTWARE_AES " ) ;
const char * env = getenv ( " MONERO_RANDOMX_UMASK " ) ;
if ( ! env ) {
if ( ! env ) {
use = 0 ;
flags = 0 ;
}
else if ( ! strcmp ( env , " 0 " ) | | ! strcmp ( env , " no " ) ) {
use = 0 ;
}
}
else {
else {
use = 1 ;
char * endptr ;
long int value = strtol ( env , & endptr , 0 ) ;
if ( endptr ! = env & & value > = 0 & & value < INT_MAX ) {
flags = value ;
}
else {
flags = 0 ;
}
}
}
return use ;
}
static void cpuid ( int CPUInfo [ 4 ] , int InfoType )
return flags ;
{
# if defined(__x86_64__)
__asm __volatile__
(
" cpuid " :
" =a " ( CPUInfo [ 0 ] ) ,
" =b " ( CPUInfo [ 1 ] ) ,
" =c " ( CPUInfo [ 2 ] ) ,
" =d " ( CPUInfo [ 3 ] ) :
" a " ( InfoType ) , " c " ( 0 )
) ;
# endif
}
}
static inline int check_aes_hw ( void )
{
# if defined(__x86_64__)
int cpuid_results [ 4 ] ;
static int supported = - 1 ;
if ( supported > = 0 )
static inline int enabled_flags ( void ) {
return supported ;
static int flags = - 1 ;
cpuid ( cpuid_results , 1 ) ;
if ( flags ! = - 1 ) {
return supported = cpuid_results [ 2 ] & ( 1 < < 25 ) ;
return flags ;
# else
}
return 0 ;
# endif
}
static volatile int use_rx_jit_flag = - 1 ;
static inline int use_rx_jit ( void )
{
# if defined(__x86_64__)
if ( use_rx_jit_flag ! = - 1 )
flags = randomx_get_flags ( ) ;
return use_rx_jit_flag ;
const char * env = getenv ( " MONERO_USE_RX_JIT " ) ;
return flags ;
if ( ! env ) {
use_rx_jit_flag = 1 ;
}
else if ( ! strcmp ( env , " 0 " ) | | ! strcmp ( env , " no " ) ) {
use_rx_jit_flag = 0 ;
}
else {
use_rx_jit_flag = 1 ;
}
return use_rx_jit_flag ;
# else
return 0 ;
# endif
}
}
# define SEEDHASH_EPOCH_BLOCKS 2048 /* Must be same as BLOCKS_SYNCHRONIZING_MAX_COUNT in cryptonote_config.h */
# define SEEDHASH_EPOCH_BLOCKS 2048 /* Must be same as BLOCKS_SYNCHRONIZING_MAX_COUNT in cryptonote_config.h */
@ -236,7 +194,7 @@ void rx_slow_hash(const uint64_t mainheight, const uint64_t seedheight, const ch
char * hash , int miners , int is_alt ) {
char * hash , int miners , int is_alt ) {
uint64_t s_height = rx_seedheight ( mainheight ) ;
uint64_t s_height = rx_seedheight ( mainheight ) ;
int toggle = ( s_height & SEEDHASH_EPOCH_BLOCKS ) ! = 0 ;
int toggle = ( s_height & SEEDHASH_EPOCH_BLOCKS ) ! = 0 ;
randomx_flags flags = RANDOMX_FLAG_DEFAULT ;
randomx_flags flags = enabled_flags ( ) & ~ disabled_flags ( ) ;
rx_state * rx_sp ;
rx_state * rx_sp ;
randomx_cache * cache ;
randomx_cache * cache ;
@ -263,8 +221,6 @@ void rx_slow_hash(const uint64_t mainheight, const uint64_t seedheight, const ch
cache = rx_sp - > rs_cache ;
cache = rx_sp - > rs_cache ;
if ( cache = = NULL ) {
if ( cache = = NULL ) {
if ( use_rx_jit ( ) )
flags | = RANDOMX_FLAG_JIT ;
if ( cache = = NULL ) {
if ( cache = = NULL ) {
cache = randomx_alloc_cache ( flags | RANDOMX_FLAG_LARGE_PAGES ) ;
cache = randomx_alloc_cache ( flags | RANDOMX_FLAG_LARGE_PAGES ) ;
if ( cache = = NULL ) {
if ( cache = = NULL ) {
@ -282,14 +238,12 @@ void rx_slow_hash(const uint64_t mainheight, const uint64_t seedheight, const ch
memcpy ( rx_sp - > rs_hash , seedhash , HASH_SIZE ) ;
memcpy ( rx_sp - > rs_hash , seedhash , HASH_SIZE ) ;
}
}
if ( rx_vm = = NULL ) {
if ( rx_vm = = NULL ) {
randomx_flags flags = RANDOMX_FLAG_DEFAULT ;
if ( ( flags & RANDOMX_FLAG_JIT ) & & ! miners ) {
if ( use_rx_jit ( ) ) {
flags | = RANDOMX_FLAG_SECURE & ~ disabled_flags ( ) ;
flags | = RANDOMX_FLAG_JIT ;
}
if ( ! miners )
if ( miners & & ( disabled_flags ( ) & RANDOMX_FLAG_FULL_MEM ) ) {
flags | = RANDOMX_FLAG_SECURE ;
miners = 0 ;
}
}
if ( ! force_software_aes ( ) & & check_aes_hw ( ) )
flags | = RANDOMX_FLAG_HARD_AES ;
if ( miners ) {
if ( miners ) {
CTHR_MUTEX_LOCK ( rx_dataset_mutex ) ;
CTHR_MUTEX_LOCK ( rx_dataset_mutex ) ;
if ( rx_dataset = = NULL ) {
if ( rx_dataset = = NULL ) {