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
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
|
RETADDR_OFFSET=8*15
.macro PUSH_REGS
push %rdi # 0, arg0
push %rsi # 1, arg1
push %rdx # 2, arg2
push %rcx # 3, arg3
push %r8 # 4, arg4
push %r9 # 5, arg5
push %r10 # 6, ...
push %r11 # 7, temprory reg
push %rax # 8
push %rbp
push %rbx
push %r15
push %r14
push %r13
push %r12
.endm
.macro POP_REGS
pop %r12
pop %r13
pop %r14
pop %r15
pop %rbx
pop %rbp
pop %rax
pop %r11
pop %r10
pop %r9
pop %r8
pop %rcx
pop %rdx
pop %rsi
pop %rdi
.endm
// Export symbols
.global tizenASanWrapper
.global tizenASanWrapperSize
.global tizenASanWrapperEntryOffset
.text
.code64
tizenASanWrapper:
// !!! ATTENTION !!!
// Don't move this labels (target, pushAddr, popAddr)
// because they mapped to AuxiliaryCalls struct from src/vm/tizenasanenv.cpp
target: .quad 0xdeadbeef0badc0de
pushAddr: .quad 0xdeadbeef0badc0de // void pushAddr(LPVOID addr)
popAddr: .quad 0xdeadbeef0badc0de // LPVOID popAddr()
entryPointer:
// Save context
PUSH_REGS
// Save the return address and call 'pre handler'
mov RETADDR_OFFSET(%rsp), %rdi // rdi: get return address
call *pushAddr(%rip) // save the return address
// Change the return address
call next
next:
pop %rax // rax: get current rip
add $(postLabel - next), %rax // rax: add offset to 'postLabel'
mov %rax, RETADDR_OFFSET(%rsp) // change the return address
// Restore context
POP_REGS
// Call original function
jmp *target(%rip)
postLabel:
// Save context
PUSH_REGS
// Get the return address and call 'post handler'
add $8, %rsp // align stack
call *popAddr(%rip) // rax: get the return address
sub $8, %rsp // restore stack
mov %rax, RETADDR_OFFSET(%rsp) // restore the return address
// Restore context
POP_REGS
// Return
ret
tizenASanWrapperSize: .long . - tizenASanWrapper
tizenASanWrapperEntryOffset: .long entryPointer - tizenASanWrapper
// Export symbols
.global tizenASanWrapperJmp
.global tizenASanWrapperJmpSize
.global tizenASanWrapperJmpEntryOffset
tizenASanWrapperJmp:
// !!! ATTENTION !!!
// Don't move this labels (target, pushAddr, popAddr)
// because they mapped to AuxiliaryCalls struct from src/vm/tizenasanenv.cpp
targetJmp: .quad 0xdeadbeef0badc0de
pushAddrJmp: .quad 0xdeadbeef0badc0de // void pushAddr(LPVOID addr)
popAddrJmp: .quad 0xdeadbeef0badc0de // LPVOID popAddr()
entryPointerJmp:
// Save context
PUSH_REGS
// Save the return address and call 'pre handler'
mov RETADDR_OFFSET(%rsp), %rdi // rdi: get return address
call *pushAddrJmp(%rip) // save the return address
// Change the return address
call nextJmp
nextJmp:
pop %rax // rax: get current rip
add $(postLabelJmp - nextJmp), %rax // rax: add offset to 'postLabelJmp'
mov %rax, RETADDR_OFFSET(%rsp) // change the return address
// Restore context
POP_REGS
// Call original function
jmp *targetJmp(%rip)
postLabelJmp:
sub $8, %rsp // add space for the return addr
// Save context
PUSH_REGS
// Get the return address and call 'post handler'
call *popAddrJmp(%rip) // rax: get the return address
mov %rax, RETADDR_OFFSET(%rsp) // restore the return address
// Restore context
POP_REGS
// Return
ret
tizenASanWrapperJmpSize: .long . - tizenASanWrapperJmp
tizenASanWrapperJmpEntryOffset: .long entryPointerJmp - tizenASanWrapperJmp
|