Monero
common.hpp
Go to the documentation of this file.
1 /*
2 Copyright (c) 2018-2019, tevador <tevador@gmail.com>
3 
4 All rights reserved.
5 
6 Redistribution and use in source and binary forms, with or without
7 modification, are permitted provided that the following conditions are met:
8  * Redistributions of source code must retain the above copyright
9  notice, this list of conditions and the following disclaimer.
10  * Redistributions in binary form must reproduce the above copyright
11  notice, this list of conditions and the following disclaimer in the
12  documentation and/or other materials provided with the distribution.
13  * Neither the name of the copyright holder nor the
14  names of its contributors may be used to endorse or promote products
15  derived from this software without specific prior written permission.
16 
17 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
18 ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
19 WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
20 DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
21 FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
22 DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
23 SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
24 CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
25 OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
26 OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27 */
28 
29 #pragma once
30 
31 #include <cstdint>
32 #include <iostream>
33 #include <climits>
34 #include "blake2/endian.h"
35 #include "configuration.h"
36 #include "randomx.h"
37 
38 namespace randomx {
39 
40  static_assert(RANDOMX_ARGON_MEMORY >= 8, "RANDOMX_ARGON_MEMORY must be at least 8.");
41  static_assert(RANDOMX_ARGON_MEMORY <= 2097152, "RANDOMX_ARGON_MEMORY must not exceed 2097152.");
42  static_assert((RANDOMX_ARGON_MEMORY & (RANDOMX_ARGON_MEMORY - 1)) == 0, "RANDOMX_ARGON_MEMORY must be a power of 2.");
43  static_assert(RANDOMX_ARGON_ITERATIONS > 0 && RANDOMX_ARGON_ITERATIONS < UINT32_MAX, "RANDOMX_ARGON_ITERATIONS must be a positive 32-bit integer.");
44  static_assert(RANDOMX_ARGON_LANES > 0 && RANDOMX_ARGON_LANES <= 16777215, "RANDOMX_ARGON_LANES out of range");
45  static_assert(RANDOMX_DATASET_BASE_SIZE >= 64, "RANDOMX_DATASET_BASE_SIZE must be at least 64.");
46  static_assert((RANDOMX_DATASET_BASE_SIZE & (RANDOMX_DATASET_BASE_SIZE - 1)) == 0, "RANDOMX_DATASET_BASE_SIZE must be a power of 2.");
47  static_assert(RANDOMX_DATASET_BASE_SIZE <= 4294967296ULL, "RANDOMX_DATASET_BASE_SIZE must not exceed 4294967296.");
48  static_assert(RANDOMX_DATASET_EXTRA_SIZE % 64 == 0, "RANDOMX_DATASET_EXTRA_SIZE must be divisible by 64.");
49  static_assert((uint64_t)RANDOMX_DATASET_BASE_SIZE + RANDOMX_DATASET_EXTRA_SIZE <= 17179869184, "Dataset size must not exceed 16 GiB.");
50  static_assert(RANDOMX_PROGRAM_SIZE > 0, "RANDOMX_PROGRAM_SIZE must be greater than 0");
51  static_assert(RANDOMX_PROGRAM_SIZE <= 32768, "RANDOMX_PROGRAM_SIZE must not exceed 32768");
52  static_assert(RANDOMX_PROGRAM_ITERATIONS > 0, "RANDOMX_PROGRAM_ITERATIONS must be greater than 0");
53  static_assert(RANDOMX_PROGRAM_COUNT > 0, "RANDOMX_PROGRAM_COUNT must be greater than 0");
54  static_assert((RANDOMX_SCRATCHPAD_L3 & (RANDOMX_SCRATCHPAD_L3 - 1)) == 0, "RANDOMX_SCRATCHPAD_L3 must be a power of 2.");
55  static_assert(RANDOMX_SCRATCHPAD_L3 >= RANDOMX_SCRATCHPAD_L2, "RANDOMX_SCRATCHPAD_L3 must be greater than or equal to RANDOMX_SCRATCHPAD_L2.");
56  static_assert((RANDOMX_SCRATCHPAD_L2 & (RANDOMX_SCRATCHPAD_L2 - 1)) == 0, "RANDOMX_SCRATCHPAD_L2 must be a power of 2.");
57  static_assert(RANDOMX_SCRATCHPAD_L2 >= RANDOMX_SCRATCHPAD_L1, "RANDOMX_SCRATCHPAD_L2 must be greater than or equal to RANDOMX_SCRATCHPAD_L1.");
58  static_assert(RANDOMX_SCRATCHPAD_L1 >= 64, "RANDOMX_SCRATCHPAD_L1 must be at least 64.");
59  static_assert((RANDOMX_SCRATCHPAD_L1 & (RANDOMX_SCRATCHPAD_L1 - 1)) == 0, "RANDOMX_SCRATCHPAD_L1 must be a power of 2.");
60  static_assert(RANDOMX_CACHE_ACCESSES > 1, "RANDOMX_CACHE_ACCESSES must be greater than 1");
61  static_assert(RANDOMX_SUPERSCALAR_LATENCY > 0, "RANDOMX_SUPERSCALAR_LATENCY must be greater than 0");
62  static_assert(RANDOMX_SUPERSCALAR_LATENCY <= 10000, "RANDOMX_SUPERSCALAR_LATENCY must not exceed 10000");
63  static_assert(RANDOMX_JUMP_BITS > 0, "RANDOMX_JUMP_BITS must be greater than 0.");
64  static_assert(RANDOMX_JUMP_OFFSET >= 0, "RANDOMX_JUMP_OFFSET must be greater than or equal to 0.");
65  static_assert(RANDOMX_JUMP_BITS + RANDOMX_JUMP_OFFSET <= 16, "RANDOMX_JUMP_BITS + RANDOMX_JUMP_OFFSET must not exceed 16.");
66 
73  RANDOMX_FREQ_CFROUND + RANDOMX_FREQ_ISTORE + RANDOMX_FREQ_NOP;
74 
75  static_assert(wtSum == 256, "Sum of instruction frequencies must be 256.");
76 
77 
78  constexpr uint32_t ArgonBlockSize = 1024;
79  constexpr int ArgonSaltSize = sizeof("" RANDOMX_ARGON_SALT) - 1;
80  static_assert(ArgonSaltSize >= 8, "RANDOMX_ARGON_SALT must be at least 8 characters long");
88  constexpr uint32_t ConditionMask = ((1 << RANDOMX_JUMP_BITS) - 1);
90  constexpr int StoreL3Condition = 14;
91 
92  //Prevent some unsafe configurations.
93 #ifndef RANDOMX_UNSAFE
94  static_assert((uint64_t)ArgonBlockSize * RANDOMX_CACHE_ACCESSES * RANDOMX_ARGON_MEMORY + 33554432 >= (uint64_t)RANDOMX_DATASET_BASE_SIZE + RANDOMX_DATASET_EXTRA_SIZE, "Unsafe configuration: Memory-time tradeoffs");
95  static_assert((128 + RANDOMX_PROGRAM_SIZE * RANDOMX_FREQ_ISTORE / 256) * (RANDOMX_PROGRAM_COUNT * RANDOMX_PROGRAM_ITERATIONS) >= RANDOMX_SCRATCHPAD_L3, "Unsafe configuration: Insufficient Scratchpad writes");
96  static_assert(RANDOMX_PROGRAM_COUNT > 1, "Unsafe configuration: Program filtering strategies");
97  static_assert(RANDOMX_PROGRAM_SIZE >= 64, "Unsafe configuration: Low program entropy");
98  static_assert(RANDOMX_PROGRAM_ITERATIONS >= 400, "Unsafe configuration: High compilation overhead");
99 #endif
100 
101 #ifdef TRACE
102  constexpr bool trace = true;
103 #else
104  constexpr bool trace = false;
105 #endif
106 
107 #ifndef UNREACHABLE
108 #ifdef __GNUC__
109 #define UNREACHABLE __builtin_unreachable()
110 #elif _MSC_VER
111 #define UNREACHABLE __assume(false)
112 #else
113 #define UNREACHABLE
114 #endif
115 #endif
116 
117 #if defined(_M_X64) || defined(__x86_64__)
118  #define RANDOMX_HAVE_COMPILER 1
119  #define RANDOMX_COMPILER_X86
120  class JitCompilerX86;
121  using JitCompiler = JitCompilerX86;
122 #elif defined(__aarch64__)
123  #define RANDOMX_HAVE_COMPILER 1
124  #define RANDOMX_COMPILER_A64
125  class JitCompilerA64;
126  using JitCompiler = JitCompilerA64;
127 #elif defined(__riscv) && __riscv_xlen == 64
128  #define RANDOMX_HAVE_COMPILER 1
129  #define RANDOMX_COMPILER_RV64
130  class JitCompilerRV64;
131  using JitCompiler = JitCompilerRV64;
132 #else
133  #define RANDOMX_HAVE_COMPILER 0
134  class JitCompilerFallback;
136 #endif
137 
138  using addr_t = uint32_t;
139 
141 
142  struct fpu_reg_t {
143  double lo;
144  double hi;
145  };
146 
150  constexpr int ScratchpadL1Mask = (ScratchpadL1 - 1) * 8;
151  constexpr int ScratchpadL2Mask = (ScratchpadL2 - 1) * 8;
152  constexpr int ScratchpadL1Mask16 = (ScratchpadL1 / 2 - 1) * 16;
153  constexpr int ScratchpadL2Mask16 = (ScratchpadL2 / 2 - 1) * 16;
154  constexpr int ScratchpadL3Mask = (ScratchpadL3 - 1) * 8;
155  constexpr int ScratchpadL3Mask64 = (ScratchpadL3 / 8 - 1) * 64;
156  constexpr int RegistersCount = 8;
157  constexpr int RegisterCountFlt = RegistersCount / 2;
158  constexpr int RegisterNeedsDisplacement = 5; //x86 r13 register
159  constexpr int RegisterNeedsSib = 4; //x86 r12 register
160 
161  inline bool isZeroOrPowerOf2(uint64_t x) {
162  return (x & (x - 1)) == 0;
163  }
164 
165  constexpr int mantissaSize = 52;
166  constexpr int exponentSize = 11;
167  constexpr uint64_t mantissaMask = (1ULL << mantissaSize) - 1;
168  constexpr uint64_t exponentMask = (1ULL << exponentSize) - 1;
169  constexpr int exponentBias = 1023;
170  constexpr int dynamicExponentBits = 4;
171  constexpr int staticExponentBits = 4;
172  constexpr uint64_t constExponentBits = 0x300;
174 
177  uint8_t* memory = nullptr;
178  };
179 
180  //register file in little-endian byte order
181  struct RegisterFile {
186  };
187 
188  typedef void(ProgramFunc)(RegisterFile&, MemoryRegisters&, uint8_t* /* scratchpad */, uint64_t);
189  typedef void(DatasetInitFunc)(randomx_cache* cache, uint8_t* dataset, uint32_t startBlock, uint32_t endBlock);
190 
193  typedef void(CacheInitializeFunc)(randomx_cache*, const void*, size_t);
194 }
Definition: dataset.hpp:46
double hi
Definition: common.hpp:144
#define RANDOMX_FREQ_ISMULH_R
Definition: configuration.h:93
constexpr uint32_t ScratchpadL3
Definition: common.hpp:149
void() DatasetDeallocFunc(randomx_dataset *)
Definition: common.hpp:191
Definition: allocator.cpp:35
JitCompilerFallback JitCompiler
Definition: common.hpp:135
constexpr int ScratchpadL3Mask
Definition: common.hpp:154
#define RANDOMX_CACHE_ACCESSES
Definition: configuration.h:44
void() ProgramFunc(RegisterFile &, MemoryRegisters &, uint8_t *, uint64_t)
Definition: common.hpp:188
void() DatasetInitFunc(randomx_cache *cache, uint8_t *dataset, uint32_t startBlock, uint32_t endBlock)
Definition: common.hpp:189
#define RANDOMX_FREQ_FADD_R
Definition: configuration.h:105
constexpr int mantissaSize
Definition: common.hpp:165
#define RANDOMX_FREQ_FSUB_R
Definition: configuration.h:107
#define RANDOMX_PROGRAM_ITERATIONS
Definition: configuration.h:59
Definition: dataset.hpp:40
constexpr int RegisterNeedsSib
Definition: common.hpp:159
#define RANDOMX_FREQ_FSUB_M
Definition: configuration.h:108
constexpr uint64_t mantissaMask
Definition: common.hpp:167
constexpr uint32_t ArgonBlockSize
Definition: common.hpp:78
Definition: jit_compiler_fallback.hpp:42
constexpr uint64_t constExponentBits
Definition: common.hpp:172
#define RANDOMX_FREQ_NOP
Definition: configuration.h:122
#define RANDOMX_JUMP_OFFSET
Definition: configuration.h:77
#define RANDOMX_FREQ_IXOR_R
Definition: configuration.h:97
constexpr uint64_t dynamicMantissaMask
Definition: common.hpp:173
#define RANDOMX_FREQ_IXOR_M
Definition: configuration.h:98
#define RANDOMX_FREQ_IADD_M
Definition: configuration.h:86
constexpr int ConditionOffset
Definition: common.hpp:89
constexpr int ScratchpadL2Mask
Definition: common.hpp:151
constexpr uint32_t DatasetExtraItems
Definition: common.hpp:87
addr_t ma
Definition: common.hpp:176
addr_t mx
Definition: common.hpp:176
#define RANDOMX_FREQ_FDIV_M
Definition: configuration.h:111
constexpr int ScratchpadL2Mask16
Definition: common.hpp:153
uint32_t addr_t
Definition: common.hpp:138
uint8_t * memory
Definition: common.hpp:177
double lo
Definition: common.hpp:143
unsigned char uint8_t
Definition: stdint.h:124
constexpr size_t CacheLineSize
Definition: common.hpp:82
#define RANDOMX_ARGON_ITERATIONS
Definition: configuration.h:35
#define RANDOMX_FREQ_ISUB_R
Definition: configuration.h:87
constexpr int wtSum
Definition: common.hpp:67
Definition: common.hpp:175
constexpr uint64_t exponentMask
Definition: common.hpp:168
#define RANDOMX_FREQ_FMUL_R
Definition: configuration.h:110
#define RANDOMX_ARGON_LANES
Definition: configuration.h:38
constexpr int ScratchpadL1Mask
Definition: common.hpp:150
int_reg_t r[RegistersCount]
Definition: common.hpp:182
#define RANDOMX_FREQ_ISTORE
Definition: configuration.h:119
#define RANDOMX_FREQ_FADD_M
Definition: configuration.h:106
#define RANDOMX_FREQ_IROR_R
Definition: configuration.h:99
constexpr int ScratchpadSize
Definition: common.hpp:83
unsigned int uint32_t
Definition: stdint.h:126
fpu_reg_t f[RegisterCountFlt]
Definition: common.hpp:183
#define RANDOMX_FREQ_IROL_R
Definition: configuration.h:100
#define RANDOMX_FREQ_CBRANCH
Definition: configuration.h:115
constexpr int ArgonSaltSize
Definition: common.hpp:79
#define RANDOMX_PROGRAM_SIZE
Definition: configuration.h:56
#define RANDOMX_FREQ_ISWAP_R
Definition: configuration.h:101
#define RANDOMX_DATASET_ITEM_SIZE
Definition: randomx.h:36
#define RANDOMX_DATASET_BASE_SIZE
Definition: configuration.h:50
unsigned __int64 uint64_t
Definition: stdint.h:136
constexpr int exponentBias
Definition: common.hpp:169
constexpr int SuperscalarMaxSize
Definition: common.hpp:81
#define RANDOMX_FREQ_IADD_RS
Definition: configuration.h:85
constexpr int RegisterCountFlt
Definition: common.hpp:157
#define RANDOMX_PROGRAM_COUNT
Definition: configuration.h:62
constexpr int ScratchpadL1Mask16
Definition: common.hpp:152
constexpr int RegisterNeedsDisplacement
Definition: common.hpp:158
void() CacheInitializeFunc(randomx_cache *, const void *, size_t)
Definition: common.hpp:193
#define RANDOMX_SUPERSCALAR_LATENCY
Definition: configuration.h:47
bool isZeroOrPowerOf2(uint64_t x)
Definition: common.hpp:161
Definition: common.hpp:142
#define RANDOMX_FREQ_FSQRT_R
Definition: configuration.h:112
constexpr uint32_t ScratchpadL1
Definition: common.hpp:147
uint64_t int_reg_t
Definition: common.hpp:140
constexpr uint32_t CacheLineAlignMask
Definition: common.hpp:84
constexpr uint64_t DatasetSize
Definition: common.hpp:86
#define UINT32_MAX
Definition: stdint.h:188
#define RANDOMX_DATASET_EXTRA_SIZE
Definition: configuration.h:53
randomx_cache * cache
Definition: tests.cpp:19
#define RANDOMX_SCRATCHPAD_L3
Definition: configuration.h:65
#define RANDOMX_FREQ_ISMULH_M
Definition: configuration.h:94
fpu_reg_t e[RegisterCountFlt]
Definition: common.hpp:184
constexpr uint32_t ConditionMask
Definition: common.hpp:88
constexpr int RegistersCount
Definition: common.hpp:156
Definition: common.hpp:181
constexpr int dynamicExponentBits
Definition: common.hpp:170
#define RANDOMX_FREQ_IMUL_RCP
Definition: configuration.h:95
#define RANDOMX_FREQ_IMUL_R
Definition: configuration.h:89
#define RANDOMX_SCRATCHPAD_L2
Definition: configuration.h:68
constexpr uint32_t ScratchpadL2
Definition: common.hpp:148
constexpr int exponentSize
Definition: common.hpp:166
#define RANDOMX_ARGON_MEMORY
Definition: configuration.h:32
#define RANDOMX_FREQ_IMUL_M
Definition: configuration.h:90
constexpr int staticExponentBits
Definition: common.hpp:171
#define RANDOMX_ARGON_SALT
Definition: configuration.h:41
constexpr bool trace
Definition: common.hpp:104
constexpr int ScratchpadL3Mask64
Definition: common.hpp:155
fpu_reg_t a[RegisterCountFlt]
Definition: common.hpp:185
constexpr uint32_t CacheSize
Definition: common.hpp:85
void() CacheDeallocFunc(randomx_cache *)
Definition: common.hpp:192
constexpr int StoreL3Condition
Definition: common.hpp:90
#define RANDOMX_JUMP_BITS
Definition: configuration.h:74
#define RANDOMX_FREQ_IMULH_R
Definition: configuration.h:91
#define RANDOMX_SCRATCHPAD_L1
Definition: configuration.h:71