Monero
Loading...
Searching...
No Matches
common.hpp
Go to the documentation of this file.
1/*
2Copyright (c) 2018-2019, tevador <tevador@gmail.com>
3
4All rights reserved.
5
6Redistribution and use in source and binary forms, with or without
7modification, 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
17THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
18ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
19WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
20DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
21FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
22DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
23SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
24CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
25OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
26OF 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
38namespace 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
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
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
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 jit_compiler_fallback.hpp:42
#define RANDOMX_SCRATCHPAD_L2
Definition configuration.h:68
#define RANDOMX_SUPERSCALAR_LATENCY
Definition configuration.h:47
#define RANDOMX_ARGON_MEMORY
Definition configuration.h:32
#define RANDOMX_SCRATCHPAD_L1
Definition configuration.h:71
#define RANDOMX_FREQ_IADD_M
Definition configuration.h:86
#define RANDOMX_JUMP_OFFSET
Definition configuration.h:77
#define RANDOMX_CACHE_ACCESSES
Definition configuration.h:44
#define RANDOMX_FREQ_IROL_R
Definition configuration.h:100
#define RANDOMX_FREQ_FMUL_R
Definition configuration.h:110
#define RANDOMX_FREQ_IMUL_M
Definition configuration.h:90
#define RANDOMX_FREQ_IXOR_M
Definition configuration.h:98
#define RANDOMX_FREQ_IMULH_M
Definition configuration.h:92
#define RANDOMX_FREQ_IROR_R
Definition configuration.h:99
#define RANDOMX_ARGON_LANES
Definition configuration.h:38
#define RANDOMX_FREQ_CBRANCH
Definition configuration.h:115
#define RANDOMX_FREQ_IMUL_R
Definition configuration.h:89
#define RANDOMX_FREQ_ISTORE
Definition configuration.h:119
#define RANDOMX_FREQ_FSUB_R
Definition configuration.h:107
#define RANDOMX_FREQ_FSQRT_R
Definition configuration.h:112
#define RANDOMX_FREQ_ISWAP_R
Definition configuration.h:101
#define RANDOMX_SCRATCHPAD_L3
Definition configuration.h:65
#define RANDOMX_FREQ_ISUB_M
Definition configuration.h:88
#define RANDOMX_FREQ_FADD_M
Definition configuration.h:106
#define RANDOMX_FREQ_ISMULH_R
Definition configuration.h:93
#define RANDOMX_FREQ_FSWAP_R
Definition configuration.h:104
#define RANDOMX_ARGON_SALT
Definition configuration.h:41
#define RANDOMX_FREQ_IADD_RS
Definition configuration.h:85
#define RANDOMX_FREQ_CFROUND
Definition configuration.h:116
#define RANDOMX_PROGRAM_COUNT
Definition configuration.h:62
#define RANDOMX_FREQ_FSUB_M
Definition configuration.h:108
#define RANDOMX_ARGON_ITERATIONS
Definition configuration.h:35
#define RANDOMX_FREQ_ISMULH_M
Definition configuration.h:94
#define RANDOMX_FREQ_INEG_R
Definition configuration.h:96
#define RANDOMX_FREQ_ISUB_R
Definition configuration.h:87
#define RANDOMX_PROGRAM_SIZE
Definition configuration.h:56
#define RANDOMX_JUMP_BITS
Definition configuration.h:74
#define RANDOMX_DATASET_EXTRA_SIZE
Definition configuration.h:53
#define RANDOMX_FREQ_FSCAL_R
Definition configuration.h:109
#define RANDOMX_PROGRAM_ITERATIONS
Definition configuration.h:59
#define RANDOMX_FREQ_FADD_R
Definition configuration.h:105
#define RANDOMX_FREQ_IMUL_RCP
Definition configuration.h:95
#define RANDOMX_FREQ_FDIV_M
Definition configuration.h:111
#define RANDOMX_FREQ_NOP
Definition configuration.h:122
#define RANDOMX_FREQ_IMULH_R
Definition configuration.h:91
#define RANDOMX_DATASET_BASE_SIZE
Definition configuration.h:50
#define RANDOMX_FREQ_IXOR_R
Definition configuration.h:97
Definition allocator.cpp:35
constexpr int ConditionOffset
Definition common.hpp:89
void ProgramFunc(RegisterFile &, MemoryRegisters &, uint8_t *, uint64_t)
Definition common.hpp:188
uint64_t int_reg_t
Definition common.hpp:140
constexpr uint32_t ArgonBlockSize
Definition common.hpp:78
constexpr uint32_t DatasetExtraItems
Definition common.hpp:87
constexpr int StoreL3Condition
Definition common.hpp:90
constexpr int ScratchpadL1Mask
Definition common.hpp:150
constexpr uint64_t constExponentBits
Definition common.hpp:172
constexpr uint32_t CacheLineAlignMask
Definition common.hpp:84
constexpr int RegisterCountFlt
Definition common.hpp:157
constexpr int RegisterNeedsSib
Definition common.hpp:159
constexpr int ScratchpadL1Mask16
Definition common.hpp:152
constexpr int RegistersCount
Definition common.hpp:156
constexpr size_t CacheLineSize
Definition common.hpp:82
constexpr int exponentBias
Definition common.hpp:169
constexpr uint64_t dynamicMantissaMask
Definition common.hpp:173
constexpr int SuperscalarMaxSize
Definition common.hpp:81
constexpr uint64_t exponentMask
Definition common.hpp:168
constexpr uint32_t ScratchpadL2
Definition common.hpp:148
constexpr int wtSum
Definition common.hpp:67
constexpr int ScratchpadL3Mask64
Definition common.hpp:155
constexpr uint64_t DatasetSize
Definition common.hpp:86
constexpr uint32_t CacheSize
Definition common.hpp:85
JitCompilerFallback JitCompiler
Definition common.hpp:135
constexpr int ScratchpadL2Mask
Definition common.hpp:151
void DatasetDeallocFunc(randomx_dataset *)
Definition common.hpp:191
constexpr int RegisterNeedsDisplacement
Definition common.hpp:158
constexpr int exponentSize
Definition common.hpp:166
constexpr int ScratchpadL3Mask
Definition common.hpp:154
constexpr uint32_t ConditionMask
Definition common.hpp:88
void DatasetInitFunc(randomx_cache *cache, uint8_t *dataset, uint32_t startBlock, uint32_t endBlock)
Definition common.hpp:189
constexpr int ArgonSaltSize
Definition common.hpp:79
constexpr uint32_t ScratchpadL1
Definition common.hpp:147
void CacheDeallocFunc(randomx_cache *)
Definition common.hpp:192
constexpr int dynamicExponentBits
Definition common.hpp:170
constexpr uint64_t mantissaMask
Definition common.hpp:167
void CacheInitializeFunc(randomx_cache *, const void *, size_t)
Definition common.hpp:193
bool isZeroOrPowerOf2(uint64_t x)
Definition common.hpp:161
uint32_t addr_t
Definition common.hpp:138
constexpr int staticExponentBits
Definition common.hpp:171
constexpr bool trace
Definition common.hpp:104
constexpr uint32_t ScratchpadL3
Definition common.hpp:149
constexpr int ScratchpadL2Mask16
Definition common.hpp:153
constexpr int ScratchpadSize
Definition common.hpp:83
constexpr int mantissaSize
Definition common.hpp:165
#define RANDOMX_DATASET_ITEM_SIZE
Definition randomx.h:36
unsigned int uint32_t
Definition stdint.h:126
#define UINT32_MAX
Definition stdint.h:188
unsigned char uint8_t
Definition stdint.h:124
unsigned __int64 uint64_t
Definition stdint.h:136
Definition common.hpp:175
uint8_t * memory
Definition common.hpp:177
addr_t mx
Definition common.hpp:176
addr_t ma
Definition common.hpp:176
Definition common.hpp:181
fpu_reg_t a[RegisterCountFlt]
Definition common.hpp:185
fpu_reg_t f[RegisterCountFlt]
Definition common.hpp:183
fpu_reg_t e[RegisterCountFlt]
Definition common.hpp:184
int_reg_t r[RegistersCount]
Definition common.hpp:182
Definition common.hpp:142
double lo
Definition common.hpp:143
double hi
Definition common.hpp:144
Definition dataset.hpp:46
Definition dataset.hpp:40
randomx_cache * cache
Definition tests.cpp:19