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
|
#define ASM_MAPPING 1
#include "la64_mapping.h"
#undef ASM_MAPPING
//la64 update linker table for dynarec
//called with pointer to emu as 1st parameter
//and address of table to as 2nd parameter
//ip is at r12
.text
.align 4
.extern LinkNext
.global la64_next
.8byte 0 // NULL pointer before la64_next, for getDB
la64_next:
// move emu to a0
// move IP address to a1
addi.d $sp, $sp, -(8 * 11)
st.d RDI, $sp, 0
st.d RSI, $sp, 8
st.d RDX, $sp, 16
st.d RCX, $sp, 24
st.d R8, $sp, 32
st.d R9, $sp, 40
st.d RAX, $sp, 48
st.d RBX, $sp, 56
st.d RSP, $sp, 64
st.d RBP, $sp, 72
st.d RIP, $sp, 80 // also save r29(rip) to allow change in LinkNext
move $a0, Emu
move $a1, RIP
move $a2, $ra // "from" is in ra, so put in a2
addi.d $a3, $sp, 80 // a3 is address to change rip
// call the function
bl LinkNext
// preserve return value
move $r16, $a0
// pop regs
ld.d RDI, $sp, 0
ld.d RSI, $sp, 8
ld.d RDX, $sp, 16
ld.d RCX, $sp, 24
ld.d R8, $sp, 32
ld.d R9, $sp, 40
ld.d RAX, $sp, 48
ld.d RBX, $sp, 56
ld.d RSP, $sp, 64
ld.d RBP, $sp, 72
ld.d RIP, $sp, 80
addi.d $sp, $sp, (8 * 11)
// return offset is jump address
jr $r16
|