1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
|
#ifndef __RV64_MAPPING_H__
#define __RV64_MAPPING_H__
// RV64 Register Mapping Scheme
/*****************************************************************************************
reg name mapping native description Box64 description saver
******************************************************************************************
x0 zero native zero Hard-wired zero N/A —
x1 ra native ra Return address N/A Caller
x2 sp native sp Stack pointer N/A Callee
x3 gp native gp Global pointer N/A —
x4 tp native tp Thread pointer N/A —
x5 t0 - Temporary X87 Precision Control Caller
x6 t1 x1 Temporary Scratch Caller
x7 t2 x2 Temporary Scratch Caller
x8 s0/fp RBP Saved register/frame pointer - Callee
x9 s1 RSP Saved register - Callee
x10 a0 RDI Function argument/return val. - Caller
x11 a1 RSI Function argument/return val. - Caller
x12 a2 RDX Function argument - Caller
x13 a3 RCX Function argument - Caller
x14 a4 R8 Function argument - Caller
x15 a5 R9 Function argument - Caller
x16 a6 RAX Function argument - Caller
x17 a7 x7 Function argument Scratch Caller
x18 s2 R12 Saved register - Callee
x19 s3 R13 Saved register - Callee
x20 s4 R14 Saved register - Callee
x21 s5 R15 Saved register - Callee
x22 s6 RIP Saved register - Callee
x23 s7 FLAGS Saved register - Callee
x24 s8 RBX Saved register - Callee
x25 s9 xEmu Saved register The Emu struct Callee
x26 s10 R10 Saved register - Callee
x27 s11 R11 Saved register - Callee
x28 t3 x3 Temporary Scratch Caller
x29 t4 x4 Temporary Scratch Caller
x30 t5 x5 Temporary Scratch Caller
x31 t6 x6 Temporary Scratch Caller
******************************************************************************************/
#ifndef ASM_MAPPING
#include <stdint.h>
// x86 Register mapping
#define xRAX 16
#define xRCX 13
#define xRDX 12
#define xRBX 24
#define xRSP 9
#define xRBP 8
#define xRSI 11
#define xRDI 10
#define xR8 14
#define xR9 15
#define xR10 26
#define xR11 27
#define xR12 18
#define xR13 19
#define xR14 20
#define xR15 21
#define xRIP 22
#define xFlags 23
// convert a x86 register to native according to the register mapping
#define TO_NAT(A) (((uint8_t[]) { 16, 13, 12, 24, 9, 8, 11, 10, 14, 15, 26, 27, 18, 19, 20, 21 })[(A)])
#define IS_GPR(A) (((uint8_t[]) { 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 0, 1, 0, 1, 1, 0, 0, 0, 0 })[(A)])
#define x1 6
#define x2 7
#define x3 28
#define x4 29
#define x5 30
#define x6 31
#define xEmu 25
#define x7 17
#define x87pc 5
#define xRA 1
#define xSP 2
#define A0 10
#define A1 11
#define A2 12
#define A3 13
#define A4 14
#define A5 15
#define A6 16
#define A7 17
#define xZR 0
#else
// x86 Register mapping
#define RAX x16
#define RCX x13
#define RDX x12
#define RBX x24
#define RSP x9
#define RBP x8
#define RSI x11
#define RDI x10
#define R8 x14
#define R9 x15
#define R10 x26
#define R11 x27
#define R12 x18
#define R13 x19
#define R14 x20
#define R15 x21
#define RIP x22
#define Flags x23
#define Emu x25
#endif
#endif // __RV64_MAPPING_H__
|