aboutsummaryrefslogtreecommitdiffstats
path: root/arch/arm/kvm/interrupts.S
diff options
context:
space:
mode:
authorChristoffer Dall <c.dall@virtualopensystems.com>2013-01-20 18:28:06 -0500
committerChristoffer Dall <c.dall@virtualopensystems.com>2013-01-23 13:29:10 -0500
commit342cd0ab0e6ca3fe7c88a78890352748b8e894a9 (patch)
tree90381be821d65fdb2fd2255752a124e9ad771a2d /arch/arm/kvm/interrupts.S
parent749cf76c5a363e1383108a914ea09530bfa0bd43 (diff)
KVM: ARM: Hypervisor initialization
Sets up KVM code to handle all exceptions taken to Hyp mode. When the kernel is booted in Hyp mode, calling an hvc instruction with r0 pointing to the new vectors, the HVBAR is changed to the the vector pointers. This allows subsystems (like KVM here) to execute code in Hyp-mode with the MMU disabled. We initialize other Hyp-mode registers and enables the MMU for Hyp-mode from the id-mapped hyp initialization code. Afterwards, the HVBAR is changed to point to KVM Hyp vectors used to catch guest faults and to switch to Hyp mode to perform a world-switch into a KVM guest. Also provides memory mapping code to map required code pages, data structures, and I/O regions accessed in Hyp mode at the same virtual address as the host kernel virtual addresses, but which conforms to the architectural requirements for translations in Hyp mode. This interface is added in arch/arm/kvm/arm_mmu.c and comprises: - create_hyp_mappings(from, to); - create_hyp_io_mappings(from, to, phys_addr); - free_hyp_pmds(); Reviewed-by: Will Deacon <will.deacon@arm.com> Reviewed-by: Marcelo Tosatti <mtosatti@redhat.com> Signed-off-by: Marc Zyngier <marc.zyngier@arm.com> Signed-off-by: Christoffer Dall <c.dall@virtualopensystems.com>
Diffstat (limited to 'arch/arm/kvm/interrupts.S')
-rw-r--r--arch/arm/kvm/interrupts.S62
1 files changed, 62 insertions, 0 deletions
diff --git a/arch/arm/kvm/interrupts.S b/arch/arm/kvm/interrupts.S
index 1dc8926e26d2..d10a8075409a 100644
--- a/arch/arm/kvm/interrupts.S
+++ b/arch/arm/kvm/interrupts.S
@@ -15,5 +15,67 @@
15 * along with this program; if not, write to the Free Software 15 * along with this program; if not, write to the Free Software
16 * Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. 16 * Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17 */ 17 */
18
19#include <linux/linkage.h>
20#include <linux/const.h>
21#include <asm/unified.h>
22#include <asm/page.h>
18#include <asm/asm-offsets.h> 23#include <asm/asm-offsets.h>
19#include <asm/kvm_asm.h> 24#include <asm/kvm_asm.h>
25#include <asm/kvm_arm.h>
26
27 .text
28
29__kvm_hyp_code_start:
30 .globl __kvm_hyp_code_start
31
32/********************************************************************
33 * Flush per-VMID TLBs
34 */
35ENTRY(__kvm_flush_vm_context)
36 bx lr
37ENDPROC(__kvm_flush_vm_context)
38
39/********************************************************************
40 * Hypervisor world-switch code
41 */
42ENTRY(__kvm_vcpu_run)
43 bx lr
44
45/********************************************************************
46 * Call function in Hyp mode
47 *
48 *
49 * u64 kvm_call_hyp(void *hypfn, ...);
50 *
51 * This is not really a variadic function in the classic C-way and care must
52 * be taken when calling this to ensure parameters are passed in registers
53 * only, since the stack will change between the caller and the callee.
54 *
55 * Call the function with the first argument containing a pointer to the
56 * function you wish to call in Hyp mode, and subsequent arguments will be
57 * passed as r0, r1, and r2 (a maximum of 3 arguments in addition to the
58 * function pointer can be passed). The function being called must be mapped
59 * in Hyp mode (see init_hyp_mode in arch/arm/kvm/arm.c). Return values are
60 * passed in r0 and r1.
61 *
62 * The calling convention follows the standard AAPCS:
63 * r0 - r3: caller save
64 * r12: caller save
65 * rest: callee save
66 */
67ENTRY(kvm_call_hyp)
68 hvc #0
69 bx lr
70
71/********************************************************************
72 * Hypervisor exception vector and handlers
73 */
74
75 .align 5
76__kvm_hyp_vector:
77 .globl __kvm_hyp_vector
78 nop
79
80__kvm_hyp_code_end:
81 .globl __kvm_hyp_code_end