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
|
//arm prologue for dynarec
//Save stuff, prepare stack and register
//called with pointer to emu as 1st parameter
//and address to jump to as 2nd parameter
.text
.align 4
.global rv64_prolog
rv64_prolog:
//save all 18 used register
addi sp, sp, -(8 * 24) // 16 bytes aligned
sd ra, (sp) // save ra
sd x8, 8(sp) // save fp
sd x18, (2*8)(sp)
sd x19, (3*8)(sp)
sd x20, (4*8)(sp)
sd x21, (5*8)(sp)
sd x22, (6*8)(sp)
sd x23, (7*8)(sp)
sd x24, (8*8)(sp)
sd x25, (9*8)(sp)
sd x26, (10*8)(sp)
sd x27, (11*8)(sp)
sd x9, (12*8)(sp)
fsd f18, (13*8)(sp)
fsd f19, (14*8)(sp)
fsd f20, (15*8)(sp)
fsd f21, (16*8)(sp)
fsd f22, (17*8)(sp)
fsd f23, (18*8)(sp)
fsd f24, (19*8)(sp)
fsd f25, (20*8)(sp)
fsd f26, (21*8)(sp)
fsd f27, (22*8)(sp)
//setup emu -> register
ld x16, (a0)
ld x17, 8(a0)
ld x18, 16(a0)
ld x19, 24(a0)
ld x20, 32(a0)
ld x21, 40(a0)
ld x22, 48(a0)
ld x23, 56(a0)
ld x24, 64(a0)
ld x25, 72(a0)
ld x26, 80(a0)
ld x27, 88(a0)
ld x28, 96(a0)
ld x29, 104(a0)
ld x30, 112(a0)
ld x31, 120(a0)
ld x8, 128(a0) //xFlags
ld x7, 136(a0) // xRIP
// // adjust flags bit 11 -> bit 5
andi x8, x8, ~(1<<5) // probably not usefull?
srli x5, x8, 11-5
andi x5, x5, 1<<5
or x8, x8, x5
ld x5, 808(a0) // grab an old value of emu->xSPSave
sd sp, 808(a0) // save current sp to emu->xSPSave
// push sentinel onto the stack
sd x5, -16(sp)
sd zero, -8(sp)
addi sp, sp, -16
// setup xMASK
xori x5, x0, -1
srli x5, x5, 32
// jump to block
jalr a1
|