summaryrefslogtreecommitdiff
path: root/src/vm/amd64/tizenasanenv.S
blob: 939b75abf2dd4ef5a65a2cd7ab8d22d1e603fa73 (plain)
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