|
|
|
@ -4,6 +4,38 @@ import os
|
|
|
|
|
|
|
|
|
|
PROGRAM_SIZE = 512
|
|
|
|
|
INSTRUCTION_COUNT = 1024 * 1024
|
|
|
|
|
INSTRUCTION_WEIGHTS = [
|
|
|
|
|
("ADD_64", 16),
|
|
|
|
|
("ADD_32", 8),
|
|
|
|
|
("SUB_64", 16),
|
|
|
|
|
("SUB_32", 8),
|
|
|
|
|
("MUL_64", 7),
|
|
|
|
|
("MULH_64", 7),
|
|
|
|
|
("MUL_32", 7),
|
|
|
|
|
("IMUL_32", 7),
|
|
|
|
|
("IMULH_64", 7),
|
|
|
|
|
("DIV_64", 1),
|
|
|
|
|
("IDIV_64", 1),
|
|
|
|
|
("AND_64", 4),
|
|
|
|
|
("AND_32", 3),
|
|
|
|
|
("OR_64", 4),
|
|
|
|
|
("OR_32", 3),
|
|
|
|
|
("XOR_64", 4),
|
|
|
|
|
("XOR_32", 3),
|
|
|
|
|
("SHL_64", 6),
|
|
|
|
|
("SHR_64", 6),
|
|
|
|
|
("SAR_64", 6),
|
|
|
|
|
("ROL_64", 9),
|
|
|
|
|
("ROR_64", 9),
|
|
|
|
|
("FADD", 22),
|
|
|
|
|
("FSUB", 22),
|
|
|
|
|
("FMUL", 22),
|
|
|
|
|
("FDIV", 8),
|
|
|
|
|
("FSQRT", 6),
|
|
|
|
|
("FROUND", 2),
|
|
|
|
|
("CALL", 17),
|
|
|
|
|
("RET", 15),
|
|
|
|
|
]
|
|
|
|
|
|
|
|
|
|
def genBytes(count):
|
|
|
|
|
return ', '.join(str(random.getrandbits(8)) for i in range(count))
|
|
|
|
@ -114,8 +146,8 @@ def writeInitialValues(file):
|
|
|
|
|
file.write("\tr{0} = *(uint64_t*)(aesSeed + {1});\n".format(i, i * 8))
|
|
|
|
|
for i in range(8):
|
|
|
|
|
file.write("\tf{0} = *(int64_t*)(aesSeed + {1});\n".format(i, 64 + i * 8))
|
|
|
|
|
file.write("\tmmu.m0 = (aesKey[9] << 8) | (aesKey[10] << 16) | (aesKey[11] << 24);\n")
|
|
|
|
|
file.write("\taesInitialize((__m128i*)aesKey, (__m128i*)aesSeed, (__m128i*)scratchpad, SCRATCHPAD_SIZE);\n")
|
|
|
|
|
file.write("\tmmu.m0 = (aesKey[10] << 16) | (aesKey[11] << 24);\n")
|
|
|
|
|
file.write("\tmmu.mx = 0;\n")
|
|
|
|
|
file.write("\tsp = 0;\n")
|
|
|
|
|
file.write("\tic = {0};\n".format(INSTRUCTION_COUNT))
|
|
|
|
@ -365,264 +397,17 @@ def write_RET(file, i, symbol):
|
|
|
|
|
file.write("\t\t\tgoto *target;\n")
|
|
|
|
|
file.write("\t\t}}\n\t\t{0} = A; }}\n".format(writeC(symbol, type)))
|
|
|
|
|
|
|
|
|
|
opcodeMap = {
|
|
|
|
|
0: write_ADD_64,
|
|
|
|
|
1: write_ADD_64,
|
|
|
|
|
2: write_ADD_64,
|
|
|
|
|
3: write_ADD_64,
|
|
|
|
|
4: write_ADD_64,
|
|
|
|
|
5: write_ADD_64,
|
|
|
|
|
6: write_ADD_64,
|
|
|
|
|
7: write_ADD_64,
|
|
|
|
|
8: write_ADD_64,
|
|
|
|
|
9: write_ADD_64,
|
|
|
|
|
10: write_ADD_64,
|
|
|
|
|
11: write_ADD_64,
|
|
|
|
|
12: write_ADD_64,
|
|
|
|
|
13: write_ADD_64,
|
|
|
|
|
14: write_ADD_32,
|
|
|
|
|
15: write_ADD_32,
|
|
|
|
|
16: write_ADD_32,
|
|
|
|
|
17: write_ADD_32,
|
|
|
|
|
18: write_ADD_32,
|
|
|
|
|
19: write_ADD_32,
|
|
|
|
|
20: write_ADD_32,
|
|
|
|
|
21: write_SUB_64,
|
|
|
|
|
22: write_SUB_64,
|
|
|
|
|
23: write_SUB_64,
|
|
|
|
|
24: write_SUB_64,
|
|
|
|
|
25: write_SUB_64,
|
|
|
|
|
26: write_SUB_64,
|
|
|
|
|
27: write_SUB_64,
|
|
|
|
|
28: write_SUB_64,
|
|
|
|
|
29: write_SUB_64,
|
|
|
|
|
30: write_SUB_64,
|
|
|
|
|
31: write_SUB_64,
|
|
|
|
|
32: write_SUB_64,
|
|
|
|
|
33: write_SUB_64,
|
|
|
|
|
34: write_SUB_64,
|
|
|
|
|
35: write_SUB_32,
|
|
|
|
|
36: write_SUB_32,
|
|
|
|
|
37: write_SUB_32,
|
|
|
|
|
38: write_SUB_32,
|
|
|
|
|
39: write_SUB_32,
|
|
|
|
|
40: write_SUB_32,
|
|
|
|
|
41: write_SUB_32,
|
|
|
|
|
42: write_MUL_64,
|
|
|
|
|
43: write_MUL_64,
|
|
|
|
|
44: write_MUL_64,
|
|
|
|
|
45: write_MUL_64,
|
|
|
|
|
46: write_MULH_64,
|
|
|
|
|
47: write_MULH_64,
|
|
|
|
|
48: write_MULH_64,
|
|
|
|
|
49: write_MULH_64,
|
|
|
|
|
50: write_MUL_32,
|
|
|
|
|
51: write_MUL_32,
|
|
|
|
|
52: write_MUL_32,
|
|
|
|
|
53: write_MUL_32,
|
|
|
|
|
54: write_IMUL_32,
|
|
|
|
|
55: write_IMUL_32,
|
|
|
|
|
56: write_IMUL_32,
|
|
|
|
|
57: write_IMUL_32,
|
|
|
|
|
58: write_IMULH_64,
|
|
|
|
|
59: write_IMULH_64,
|
|
|
|
|
60: write_IMULH_64,
|
|
|
|
|
61: write_IMULH_64,
|
|
|
|
|
62: write_DIV_64,
|
|
|
|
|
63: write_IDIV_64,
|
|
|
|
|
64: write_AND_64,
|
|
|
|
|
65: write_AND_64,
|
|
|
|
|
66: write_AND_64,
|
|
|
|
|
67: write_AND_64,
|
|
|
|
|
68: write_AND_64,
|
|
|
|
|
69: write_AND_64,
|
|
|
|
|
70: write_AND_64,
|
|
|
|
|
71: write_AND_64,
|
|
|
|
|
72: write_AND_64,
|
|
|
|
|
73: write_AND_64,
|
|
|
|
|
74: write_AND_64,
|
|
|
|
|
75: write_AND_64,
|
|
|
|
|
76: write_AND_64,
|
|
|
|
|
77: write_AND_32,
|
|
|
|
|
78: write_AND_32,
|
|
|
|
|
79: write_AND_32,
|
|
|
|
|
80: write_AND_32,
|
|
|
|
|
81: write_AND_32,
|
|
|
|
|
82: write_AND_32,
|
|
|
|
|
83: write_OR_64,
|
|
|
|
|
84: write_OR_64,
|
|
|
|
|
85: write_OR_64,
|
|
|
|
|
86: write_OR_64,
|
|
|
|
|
87: write_OR_64,
|
|
|
|
|
88: write_OR_64,
|
|
|
|
|
89: write_OR_64,
|
|
|
|
|
90: write_OR_64,
|
|
|
|
|
91: write_OR_64,
|
|
|
|
|
92: write_OR_64,
|
|
|
|
|
93: write_OR_64,
|
|
|
|
|
94: write_OR_64,
|
|
|
|
|
95: write_OR_64,
|
|
|
|
|
96: write_OR_32,
|
|
|
|
|
97: write_OR_32,
|
|
|
|
|
98: write_OR_32,
|
|
|
|
|
99: write_OR_32,
|
|
|
|
|
100: write_OR_32,
|
|
|
|
|
101: write_OR_32,
|
|
|
|
|
102: write_XOR_64,
|
|
|
|
|
103: write_XOR_64,
|
|
|
|
|
104: write_XOR_64,
|
|
|
|
|
105: write_XOR_64,
|
|
|
|
|
106: write_XOR_64,
|
|
|
|
|
107: write_XOR_64,
|
|
|
|
|
108: write_XOR_64,
|
|
|
|
|
109: write_XOR_64,
|
|
|
|
|
110: write_XOR_64,
|
|
|
|
|
111: write_XOR_64,
|
|
|
|
|
112: write_XOR_64,
|
|
|
|
|
113: write_XOR_64,
|
|
|
|
|
114: write_XOR_64,
|
|
|
|
|
115: write_XOR_64,
|
|
|
|
|
116: write_XOR_32,
|
|
|
|
|
117: write_XOR_32,
|
|
|
|
|
118: write_XOR_32,
|
|
|
|
|
119: write_XOR_32,
|
|
|
|
|
120: write_XOR_32,
|
|
|
|
|
121: write_XOR_32,
|
|
|
|
|
122: write_SHL_64,
|
|
|
|
|
123: write_SHL_64,
|
|
|
|
|
124: write_SHL_64,
|
|
|
|
|
125: write_SHL_64,
|
|
|
|
|
126: write_SHL_64,
|
|
|
|
|
127: write_SHL_64,
|
|
|
|
|
128: write_SHL_64,
|
|
|
|
|
129: write_SHR_64,
|
|
|
|
|
130: write_SHR_64,
|
|
|
|
|
131: write_SHR_64,
|
|
|
|
|
132: write_SHR_64,
|
|
|
|
|
133: write_SAR_64,
|
|
|
|
|
134: write_SAR_64,
|
|
|
|
|
135: write_SAR_64,
|
|
|
|
|
136: write_ROL_64,
|
|
|
|
|
137: write_ROL_64,
|
|
|
|
|
138: write_ROL_64,
|
|
|
|
|
139: write_ROL_64,
|
|
|
|
|
140: write_ROL_64,
|
|
|
|
|
141: write_ROL_64,
|
|
|
|
|
142: write_ROL_64,
|
|
|
|
|
143: write_ROL_64,
|
|
|
|
|
144: write_ROL_64,
|
|
|
|
|
145: write_ROL_64,
|
|
|
|
|
146: write_ROL_64,
|
|
|
|
|
147: write_ROR_64,
|
|
|
|
|
148: write_ROR_64,
|
|
|
|
|
149: write_ROR_64,
|
|
|
|
|
150: write_ROR_64,
|
|
|
|
|
151: write_ROR_64,
|
|
|
|
|
152: write_ROR_64,
|
|
|
|
|
153: write_ROR_64,
|
|
|
|
|
154: write_ROR_64,
|
|
|
|
|
155: write_ROR_64,
|
|
|
|
|
156: write_ROR_64,
|
|
|
|
|
157: write_ROR_64,
|
|
|
|
|
158: write_FADD,
|
|
|
|
|
159: write_FADD,
|
|
|
|
|
160: write_FADD,
|
|
|
|
|
161: write_FADD,
|
|
|
|
|
162: write_FADD,
|
|
|
|
|
163: write_FADD,
|
|
|
|
|
164: write_FADD,
|
|
|
|
|
165: write_FADD,
|
|
|
|
|
166: write_FADD,
|
|
|
|
|
167: write_FADD,
|
|
|
|
|
168: write_FADD,
|
|
|
|
|
169: write_FADD,
|
|
|
|
|
170: write_FADD,
|
|
|
|
|
171: write_FADD,
|
|
|
|
|
172: write_FADD,
|
|
|
|
|
173: write_FADD,
|
|
|
|
|
174: write_FADD,
|
|
|
|
|
175: write_FADD,
|
|
|
|
|
176: write_FSUB,
|
|
|
|
|
177: write_FSUB,
|
|
|
|
|
178: write_FSUB,
|
|
|
|
|
179: write_FSUB,
|
|
|
|
|
180: write_FSUB,
|
|
|
|
|
181: write_FSUB,
|
|
|
|
|
182: write_FSUB,
|
|
|
|
|
183: write_FSUB,
|
|
|
|
|
184: write_FSUB,
|
|
|
|
|
185: write_FSUB,
|
|
|
|
|
186: write_FSUB,
|
|
|
|
|
187: write_FSUB,
|
|
|
|
|
188: write_FSUB,
|
|
|
|
|
189: write_FSUB,
|
|
|
|
|
190: write_FSUB,
|
|
|
|
|
191: write_FSUB,
|
|
|
|
|
192: write_FSUB,
|
|
|
|
|
193: write_FSUB,
|
|
|
|
|
194: write_FMUL,
|
|
|
|
|
195: write_FMUL,
|
|
|
|
|
196: write_FMUL,
|
|
|
|
|
197: write_FMUL,
|
|
|
|
|
198: write_FMUL,
|
|
|
|
|
199: write_FMUL,
|
|
|
|
|
200: write_FMUL,
|
|
|
|
|
201: write_FMUL,
|
|
|
|
|
202: write_FMUL,
|
|
|
|
|
203: write_FMUL,
|
|
|
|
|
204: write_FMUL,
|
|
|
|
|
205: write_FMUL,
|
|
|
|
|
206: write_FMUL,
|
|
|
|
|
207: write_FMUL,
|
|
|
|
|
208: write_FMUL,
|
|
|
|
|
209: write_FMUL,
|
|
|
|
|
210: write_FMUL,
|
|
|
|
|
211: write_FMUL,
|
|
|
|
|
212: write_FDIV,
|
|
|
|
|
213: write_FDIV,
|
|
|
|
|
214: write_FDIV,
|
|
|
|
|
215: write_FSQRT,
|
|
|
|
|
216: write_FSQRT,
|
|
|
|
|
217: write_FSQRT,
|
|
|
|
|
218: write_FSQRT,
|
|
|
|
|
219: write_FSQRT,
|
|
|
|
|
220: write_FSQRT,
|
|
|
|
|
221: write_FSQRT,
|
|
|
|
|
222: write_FROUND,
|
|
|
|
|
223: write_FROUND,
|
|
|
|
|
224: write_CALL,
|
|
|
|
|
225: write_CALL,
|
|
|
|
|
226: write_CALL,
|
|
|
|
|
227: write_CALL,
|
|
|
|
|
228: write_CALL,
|
|
|
|
|
229: write_CALL,
|
|
|
|
|
230: write_CALL,
|
|
|
|
|
231: write_CALL,
|
|
|
|
|
232: write_CALL,
|
|
|
|
|
233: write_CALL,
|
|
|
|
|
234: write_CALL,
|
|
|
|
|
235: write_CALL,
|
|
|
|
|
236: write_CALL,
|
|
|
|
|
237: write_CALL,
|
|
|
|
|
238: write_CALL,
|
|
|
|
|
239: write_CALL,
|
|
|
|
|
240: write_CALL,
|
|
|
|
|
241: write_RET,
|
|
|
|
|
242: write_RET,
|
|
|
|
|
243: write_RET,
|
|
|
|
|
244: write_RET,
|
|
|
|
|
245: write_RET,
|
|
|
|
|
246: write_RET,
|
|
|
|
|
247: write_RET,
|
|
|
|
|
248: write_RET,
|
|
|
|
|
249: write_RET,
|
|
|
|
|
250: write_RET,
|
|
|
|
|
251: write_RET,
|
|
|
|
|
252: write_RET,
|
|
|
|
|
253: write_RET,
|
|
|
|
|
254: write_RET,
|
|
|
|
|
255: write_RET,
|
|
|
|
|
}
|
|
|
|
|
opcodeMap = { }
|
|
|
|
|
|
|
|
|
|
def buildOpcodeMap():
|
|
|
|
|
functions = globals()
|
|
|
|
|
totalWeight = 0;
|
|
|
|
|
for instruction, weight in INSTRUCTION_WEIGHTS:
|
|
|
|
|
func = functions['write_' + instruction]
|
|
|
|
|
for i in range(weight):
|
|
|
|
|
opcodeMap[totalWeight] = func
|
|
|
|
|
totalWeight = totalWeight + 1
|
|
|
|
|
assert totalWeight == 256
|
|
|
|
|
|
|
|
|
|
def writeCode(file, i, symbol):
|
|
|
|
|
opcodeMap.get(symbol.opcode)(file, i, symbol)
|
|
|
|
@ -664,7 +449,6 @@ def writeProlog(file):
|
|
|
|
|
"} stack_t;\n"
|
|
|
|
|
"typedef struct {\n"
|
|
|
|
|
" addr_t m0;\n"
|
|
|
|
|
" addr_t m1;\n"
|
|
|
|
|
" addr_t mx;\n"
|
|
|
|
|
"#ifdef RAM\n"
|
|
|
|
|
" const char* buffer;\n"
|
|
|
|
@ -680,10 +464,10 @@ def writeProlog(file):
|
|
|
|
|
"#define STACK_LENGTH (128 * 1024)\n"
|
|
|
|
|
"#ifdef RAM\n"
|
|
|
|
|
"#define DRAM_READ(mmu) (convertible_t)*(uint64_t*)((mmu)->buffer + (mmu)->m0)\n"
|
|
|
|
|
"#define PREFETCH(mmu) _mm_prefetch(((mmu)->buffer + (mmu)->m1), _MM_HINT_T0)\n"
|
|
|
|
|
"#define PREFETCH(mmu) _mm_prefetch(((mmu)->buffer + (mmu)->m0), _MM_HINT_T0)\n"
|
|
|
|
|
"#else\n"
|
|
|
|
|
"#define DRAM_READ(mmu) (convertible_t)(uint64_t)__rolq(6364136223846793005ULL*((mmu)->m0)+1442695040888963407ULL,32)\n"
|
|
|
|
|
"#define PREFETCH(x)\n"
|
|
|
|
|
"#define PREFETCH(mmu)\n"
|
|
|
|
|
"#endif\n"
|
|
|
|
|
"#define PUSH_VALUE(x) stack[sp++].value = x\n"
|
|
|
|
|
"#define PUSH_ADDRESS(x) stack[sp++].address = x\n"
|
|
|
|
@ -695,12 +479,12 @@ def writeProlog(file):
|
|
|
|
|
" data = DRAM_READ(mmu);\n"
|
|
|
|
|
" mmu->m0 += 8;\n"
|
|
|
|
|
" mmu->mx ^= addr;\n"
|
|
|
|
|
" if((mmu->m0 & 255) == 128) {\n"
|
|
|
|
|
" mmu->m1 = mmu->mx & 0xFFFFFF00;\n"
|
|
|
|
|
" if((mmu->mx & 0xFFFF) == 0) {\n"
|
|
|
|
|
" mmu->m0 = mmu->mx;\n"
|
|
|
|
|
"#if defined(PREF)\n"
|
|
|
|
|
" PREFETCH(mmu);\n"
|
|
|
|
|
"#endif\n"
|
|
|
|
|
" }\n"
|
|
|
|
|
" if((mmu->m0 & 255) == 0)\n"
|
|
|
|
|
" mmu->m0 = mmu->m1;\n"
|
|
|
|
|
" return data;\n"
|
|
|
|
|
"}\n"
|
|
|
|
|
"static inline __m128i sl_xor(__m128i tmp1) {\n"
|
|
|
|
@ -792,6 +576,7 @@ def writeProlog(file):
|
|
|
|
|
"}\n"))
|
|
|
|
|
|
|
|
|
|
with sys.stdout as file:
|
|
|
|
|
buildOpcodeMap()
|
|
|
|
|
writeProlog(file)
|
|
|
|
|
file.write("const byte aesKey[32] = {{ {0} }};\n".format(genBytes(32)))
|
|
|
|
|
file.write("const byte aesSeed[128] = {{ {0} }};\n".format(genBytes(128)))
|
|
|
|
|