AArch64 EL2 hypervisor for QEMU virt that boots at EL2
1.section .text.vectors, "ax"
2.align 11
3.global __vectors_el2
4__vectors_el2:
5 b vector_current_sync
6 .org __vectors_el2 + 0x080
7 b vector_current_irq
8 .org __vectors_el2 + 0x100
9 b vector_current_fiq
10 .org __vectors_el2 + 0x180
11 b vector_current_serror
12 .org __vectors_el2 + 0x200
13 b vector_current_sync
14 .org __vectors_el2 + 0x280
15 b vector_current_irq
16 .org __vectors_el2 + 0x300
17 b vector_current_fiq
18 .org __vectors_el2 + 0x380
19 b vector_current_serror
20 .org __vectors_el2 + 0x400
21 b vector_lower_sync
22 .org __vectors_el2 + 0x480
23 b vector_lower_irq
24 .org __vectors_el2 + 0x500
25 b vector_lower_fiq
26 .org __vectors_el2 + 0x580
27 b vector_lower_serror
28 .org __vectors_el2 + 0x600
29 b vector_lower_sync
30 .org __vectors_el2 + 0x680
31 b vector_lower_irq
32 .org __vectors_el2 + 0x700
33 b vector_lower_fiq
34 .org __vectors_el2 + 0x780
35 b vector_lower_serror
36
37.macro SAVE_FRAME
38 sub sp, sp, #304
39 stp x0, x1, [sp, #0]
40 stp x2, x3, [sp, #16]
41 stp x4, x5, [sp, #32]
42 stp x6, x7, [sp, #48]
43 stp x8, x9, [sp, #64]
44 stp x10, x11, [sp, #80]
45 stp x12, x13, [sp, #96]
46 stp x14, x15, [sp, #112]
47 stp x16, x17, [sp, #128]
48 stp x18, x19, [sp, #144]
49 stp x20, x21, [sp, #160]
50 stp x22, x23, [sp, #176]
51 stp x24, x25, [sp, #192]
52 stp x26, x27, [sp, #208]
53 stp x28, x29, [sp, #224]
54 str x30, [sp, #240]
55 mrs x1, sp_el0
56 str x1, [sp, #248]
57 mrs x1, sp_el1
58 str x1, [sp, #256]
59 mrs x1, elr_el2
60 str x1, [sp, #264]
61 mrs x1, spsr_el2
62 str x1, [sp, #272]
63 mrs x1, esr_el2
64 str x1, [sp, #280]
65 mrs x1, far_el2
66 str x1, [sp, #288]
67 mrs x1, hpfar_el2
68 str x1, [sp, #296]
69.endm
70
71.macro RESTORE_FRAME
72 ldr x1, [sp, #248]
73 msr sp_el0, x1
74 ldr x1, [sp, #256]
75 msr sp_el1, x1
76 ldr x1, [sp, #264]
77 msr elr_el2, x1
78 ldr x1, [sp, #272]
79 msr spsr_el2, x1
80 ldp x0, x1, [sp, #0]
81 ldp x2, x3, [sp, #16]
82 ldp x4, x5, [sp, #32]
83 ldp x6, x7, [sp, #48]
84 ldp x8, x9, [sp, #64]
85 ldp x10, x11, [sp, #80]
86 ldp x12, x13, [sp, #96]
87 ldp x14, x15, [sp, #112]
88 ldp x16, x17, [sp, #128]
89 ldp x18, x19, [sp, #144]
90 ldp x20, x21, [sp, #160]
91 ldp x22, x23, [sp, #176]
92 ldp x24, x25, [sp, #192]
93 ldp x26, x27, [sp, #208]
94 ldp x28, x29, [sp, #224]
95 ldr x30, [sp, #240]
96 add sp, sp, #304
97.endm
98
99vector_lower_sync:
100 SAVE_FRAME
101 mov x0, sp
102 bl trap_handle_lower_sync
103 RESTORE_FRAME
104 eret
105
106vector_lower_irq:
107vector_lower_fiq:
108vector_lower_serror:
109vector_current_irq:
110vector_current_fiq:
111vector_current_serror:
112 SAVE_FRAME
113 mov x0, sp
114 bl trap_handle_irq
115 RESTORE_FRAME
116 eret
117
118vector_current_sync:
119 SAVE_FRAME
120 mov x0, sp
121 bl trap_handle_current_sync
122 RESTORE_FRAME
123 eret