[Tizen] Implement ASan wrapper for Linux ARM32
[platform/upstream/dotnet/runtime.git] / src / coreclr / vm / arm / tizenasanenv.S
1 .macro PUSH_REGS
2         push     {r0-r12}
3         vpush.64 {d0-d7}
4 .endm
5
6 .macro POP_REGS
7         vpop.64 {d0-d7}
8         pop     {r0-r12}
9 .endm
10
11
12 // Export symbols
13 .global tizenASanWrapper
14 .global tizenASanWrapperSize
15 .global tizenASanWrapperEntryOffset
16
17 .text
18 .arm
19
20 tizenASanWrapper:
21 // !!! ATTENTION !!!
22 // Don't move this labels (target, pushAddr, popAddr)
23 // because they mapped to AuxiliaryCalls struct from src/coreclr/vm/tizenasanenv.cpp
24 target:                 .word 0xdeadc0de
25 pushAddr:               .word 0xdeadc0de        @ void pushAddr(LPVOID addr)
26 popAddr:                .word 0xdeadc0de        @ LPVOID popAddr()
27
28 entryPointer:
29         // Save context
30         PUSH_REGS
31
32         // Save the return address and call 'pre handler'
33         mov     r0, lr
34         ldr     r1, pushAddr
35         blx     r1
36
37         // Restore context
38         POP_REGS
39
40         // Change the return address
41         adr     lr, postLabel
42
43         // Call original function
44         ldr     pc, target
45 postLabel:
46         // Save context
47         PUSH_REGS
48
49         // Get the return address and call 'post handler'
50         ldr     r0, popAddr
51         blx     r0
52
53         // Restore the return address
54         mov     lr, r0
55
56         // Restore context
57         POP_REGS
58         bx      lr
59
60 tizenASanWrapperSize:           .word . - tizenASanWrapper
61 tizenASanWrapperEntryOffset:    .word entryPointer - tizenASanWrapper