aboutsummaryrefslogtreecommitdiffstats
path: root/arch/arm/kvm
diff options
context:
space:
mode:
authorArd Biesheuvel <ard.biesheuvel@linaro.org>2016-02-16 07:52:39 -0500
committerCatalin Marinas <catalin.marinas@arm.com>2016-02-18 13:16:40 -0500
commita0bf9776cd0be4490d4675d4108e13379849fc7f (patch)
tree3ccf0e44607d452910fdc1552ff9a70d8dcde1fc /arch/arm/kvm
parent157962f5a8f236cab898b68bdaa69ce68922f0bf (diff)
arm64: kvm: deal with kernel symbols outside of linear mapping
KVM on arm64 uses a fixed offset between the linear mapping at EL1 and the HYP mapping at EL2. Before we can move the kernel virtual mapping out of the linear mapping, we have to make sure that references to kernel symbols that are accessed via the HYP mapping are translated to their linear equivalent. Reviewed-by: Mark Rutland <mark.rutland@arm.com> Acked-by: Marc Zyngier <marc.zyngier@arm.com> Signed-off-by: Ard Biesheuvel <ard.biesheuvel@linaro.org> Signed-off-by: Catalin Marinas <catalin.marinas@arm.com>
Diffstat (limited to 'arch/arm/kvm')
-rw-r--r--arch/arm/kvm/arm.c8
1 files changed, 5 insertions, 3 deletions
diff --git a/arch/arm/kvm/arm.c b/arch/arm/kvm/arm.c
index dda1959f0dde..975da6cfbf59 100644
--- a/arch/arm/kvm/arm.c
+++ b/arch/arm/kvm/arm.c
@@ -982,7 +982,7 @@ static void cpu_init_hyp_mode(void *dummy)
982 pgd_ptr = kvm_mmu_get_httbr(); 982 pgd_ptr = kvm_mmu_get_httbr();
983 stack_page = __this_cpu_read(kvm_arm_hyp_stack_page); 983 stack_page = __this_cpu_read(kvm_arm_hyp_stack_page);
984 hyp_stack_ptr = stack_page + PAGE_SIZE; 984 hyp_stack_ptr = stack_page + PAGE_SIZE;
985 vector_ptr = (unsigned long)__kvm_hyp_vector; 985 vector_ptr = (unsigned long)kvm_ksym_ref(__kvm_hyp_vector);
986 986
987 __cpu_init_hyp_mode(boot_pgd_ptr, pgd_ptr, hyp_stack_ptr, vector_ptr); 987 __cpu_init_hyp_mode(boot_pgd_ptr, pgd_ptr, hyp_stack_ptr, vector_ptr);
988 988
@@ -1074,13 +1074,15 @@ static int init_hyp_mode(void)
1074 /* 1074 /*
1075 * Map the Hyp-code called directly from the host 1075 * Map the Hyp-code called directly from the host
1076 */ 1076 */
1077 err = create_hyp_mappings(__kvm_hyp_code_start, __kvm_hyp_code_end); 1077 err = create_hyp_mappings(kvm_ksym_ref(__kvm_hyp_code_start),
1078 kvm_ksym_ref(__kvm_hyp_code_end));
1078 if (err) { 1079 if (err) {
1079 kvm_err("Cannot map world-switch code\n"); 1080 kvm_err("Cannot map world-switch code\n");
1080 goto out_free_mappings; 1081 goto out_free_mappings;
1081 } 1082 }
1082 1083
1083 err = create_hyp_mappings(__start_rodata, __end_rodata); 1084 err = create_hyp_mappings(kvm_ksym_ref(__start_rodata),
1085 kvm_ksym_ref(__end_rodata));
1084 if (err) { 1086 if (err) {
1085 kvm_err("Cannot map rodata section\n"); 1087 kvm_err("Cannot map rodata section\n");
1086 goto out_free_mappings; 1088 goto out_free_mappings;