diff options
author | Marc Zyngier <marc.zyngier@arm.com> | 2012-12-17 12:07:52 -0500 |
---|---|---|
committer | Marc Zyngier <marc.zyngier@arm.com> | 2013-06-07 09:03:40 -0400 |
commit | 092bd143cbb481b4ce1d55247a2987eaaf61f967 (patch) | |
tree | 3e0c7352f932e5d6af7946e4cc41fb1995127907 /arch/arm64/kvm | |
parent | 2f4a07c5f9fe4a5cdb9867e1e2fcab3165846ea7 (diff) |
arm64: KVM: hypervisor initialization code
Provide EL2 with page tables and stack, and set the vectors
to point to the full blown world-switch code.
Signed-off-by: Marc Zyngier <marc.zyngier@arm.com>
Diffstat (limited to 'arch/arm64/kvm')
-rw-r--r-- | arch/arm64/kvm/hyp-init.S | 107 |
1 files changed, 107 insertions, 0 deletions
diff --git a/arch/arm64/kvm/hyp-init.S b/arch/arm64/kvm/hyp-init.S new file mode 100644 index 000000000000..ba84e6705e20 --- /dev/null +++ b/arch/arm64/kvm/hyp-init.S | |||
@@ -0,0 +1,107 @@ | |||
1 | /* | ||
2 | * Copyright (C) 2012,2013 - ARM Ltd | ||
3 | * Author: Marc Zyngier <marc.zyngier@arm.com> | ||
4 | * | ||
5 | * This program is free software; you can redistribute it and/or modify | ||
6 | * it under the terms of the GNU General Public License, version 2, as | ||
7 | * published by the Free Software Foundation. | ||
8 | * | ||
9 | * This program is distributed in the hope that it will be useful, | ||
10 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
11 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
12 | * GNU General Public License for more details. | ||
13 | * | ||
14 | * You should have received a copy of the GNU General Public License | ||
15 | * along with this program. If not, see <http://www.gnu.org/licenses/>. | ||
16 | */ | ||
17 | |||
18 | #include <linux/linkage.h> | ||
19 | |||
20 | #include <asm/assembler.h> | ||
21 | #include <asm/kvm_arm.h> | ||
22 | #include <asm/kvm_mmu.h> | ||
23 | |||
24 | .text | ||
25 | .pushsection .hyp.idmap.text, "ax" | ||
26 | |||
27 | .align 11 | ||
28 | |||
29 | ENTRY(__kvm_hyp_init) | ||
30 | ventry __invalid // Synchronous EL2t | ||
31 | ventry __invalid // IRQ EL2t | ||
32 | ventry __invalid // FIQ EL2t | ||
33 | ventry __invalid // Error EL2t | ||
34 | |||
35 | ventry __invalid // Synchronous EL2h | ||
36 | ventry __invalid // IRQ EL2h | ||
37 | ventry __invalid // FIQ EL2h | ||
38 | ventry __invalid // Error EL2h | ||
39 | |||
40 | ventry __do_hyp_init // Synchronous 64-bit EL1 | ||
41 | ventry __invalid // IRQ 64-bit EL1 | ||
42 | ventry __invalid // FIQ 64-bit EL1 | ||
43 | ventry __invalid // Error 64-bit EL1 | ||
44 | |||
45 | ventry __invalid // Synchronous 32-bit EL1 | ||
46 | ventry __invalid // IRQ 32-bit EL1 | ||
47 | ventry __invalid // FIQ 32-bit EL1 | ||
48 | ventry __invalid // Error 32-bit EL1 | ||
49 | |||
50 | __invalid: | ||
51 | b . | ||
52 | |||
53 | /* | ||
54 | * x0: HYP boot pgd | ||
55 | * x1: HYP pgd | ||
56 | * x2: HYP stack | ||
57 | * x3: HYP vectors | ||
58 | */ | ||
59 | __do_hyp_init: | ||
60 | |||
61 | msr ttbr0_el2, x0 | ||
62 | |||
63 | mrs x4, tcr_el1 | ||
64 | ldr x5, =TCR_EL2_MASK | ||
65 | and x4, x4, x5 | ||
66 | ldr x5, =TCR_EL2_FLAGS | ||
67 | orr x4, x4, x5 | ||
68 | msr tcr_el2, x4 | ||
69 | |||
70 | ldr x4, =VTCR_EL2_FLAGS | ||
71 | msr vtcr_el2, x4 | ||
72 | |||
73 | mrs x4, mair_el1 | ||
74 | msr mair_el2, x4 | ||
75 | isb | ||
76 | |||
77 | mov x4, #SCTLR_EL2_FLAGS | ||
78 | msr sctlr_el2, x4 | ||
79 | isb | ||
80 | |||
81 | /* MMU is now enabled. Get ready for the trampoline dance */ | ||
82 | ldr x4, =TRAMPOLINE_VA | ||
83 | adr x5, target | ||
84 | bfi x4, x5, #0, #PAGE_SHIFT | ||
85 | br x4 | ||
86 | |||
87 | target: /* We're now in the trampoline code, switch page tables */ | ||
88 | msr ttbr0_el2, x1 | ||
89 | isb | ||
90 | |||
91 | /* Invalidate the old TLBs */ | ||
92 | tlbi alle2 | ||
93 | dsb sy | ||
94 | |||
95 | /* Set the stack and new vectors */ | ||
96 | kern_hyp_va x2 | ||
97 | mov sp, x2 | ||
98 | kern_hyp_va x3 | ||
99 | msr vbar_el2, x3 | ||
100 | |||
101 | /* Hello, World! */ | ||
102 | eret | ||
103 | ENDPROC(__kvm_hyp_init) | ||
104 | |||
105 | .ltorg | ||
106 | |||
107 | .popsection | ||