ARM: KVM: Move the HYP code to its own section
authorMarc Zyngier <marc.zyngier@arm.com>
Sat, 2 Jan 2016 13:57:18 +0000 (13:57 +0000)
committerMarc Zyngier <marc.zyngier@arm.com>
Mon, 29 Feb 2016 18:34:12 +0000 (18:34 +0000)
In order to be able to spread the HYP code into multiple compilation
units, adopt a layout similar to that of arm64:
- the HYP text is emited in its own section (.hyp.text)
- two linker generated symbols are use to identify the boundaries
  of that section

No functionnal change.

Acked-by: Christoffer Dall <christoffer.dall@linaro.org>
Signed-off-by: Marc Zyngier <marc.zyngier@arm.com>
arch/arm/include/asm/kvm_asm.h
arch/arm/include/asm/virt.h
arch/arm/kernel/vmlinux.lds.S
arch/arm/kvm/interrupts.S

index 194c91b..fa2fd25 100644 (file)
@@ -19,6 +19,8 @@
 #ifndef __ARM_KVM_ASM_H__
 #define __ARM_KVM_ASM_H__
 
+#include <asm/virt.h>
+
 /* 0 is reserved as an invalid value. */
 #define c0_MPIDR       1       /* MultiProcessor ID Register */
 #define c0_CSSELR      2       /* Cache Size Selection Register */
@@ -91,8 +93,8 @@ extern char __kvm_hyp_exit_end[];
 
 extern char __kvm_hyp_vector[];
 
-extern char __kvm_hyp_code_start[];
-extern char __kvm_hyp_code_end[];
+#define        __kvm_hyp_code_start    __hyp_text_start
+#define __kvm_hyp_code_end     __hyp_text_end
 
 extern void __kvm_flush_vm_context(void);
 extern void __kvm_tlb_flush_vmid_ipa(struct kvm *kvm, phys_addr_t ipa);
index 4371f45..5fdbfea 100644 (file)
@@ -74,6 +74,10 @@ static inline bool is_hyp_mode_mismatched(void)
 {
        return !!(__boot_cpu_mode & BOOT_CPU_MODE_MISMATCH);
 }
+
+/* The section containing the hypervisor text */
+extern char __hyp_text_start[];
+extern char __hyp_text_end[];
 #endif
 
 #endif /* __ASSEMBLY__ */
index 8b60fde..b4139cb 100644 (file)
        *(.proc.info.init)                                              \
        VMLINUX_SYMBOL(__proc_info_end) = .;
 
+#define HYPERVISOR_TEXT                                                        \
+       VMLINUX_SYMBOL(__hyp_text_start) = .;                           \
+       *(.hyp.text)                                                    \
+       VMLINUX_SYMBOL(__hyp_text_end) = .;
+
 #define IDMAP_TEXT                                                     \
        ALIGN_FUNCTION();                                               \
        VMLINUX_SYMBOL(__idmap_text_start) = .;                         \
@@ -108,6 +113,7 @@ SECTIONS
                        TEXT_TEXT
                        SCHED_TEXT
                        LOCK_TEXT
+                       HYPERVISOR_TEXT
                        KPROBES_TEXT
                        *(.gnu.warning)
                        *(.glue_7)
index 900ef6d..9d9cb71 100644 (file)
@@ -28,9 +28,7 @@
 #include "interrupts_head.S"
 
        .text
-
-__kvm_hyp_code_start:
-       .globl __kvm_hyp_code_start
+       .pushsection    .hyp.text, "ax"
 
 /********************************************************************
  * Flush per-VMID TLBs
@@ -314,8 +312,6 @@ THUMB(      orr     r2, r2, #PSR_T_BIT      )
        eret
 .endm
 
-       .text
-
        .align 5
 __kvm_hyp_vector:
        .globl __kvm_hyp_vector
@@ -511,10 +507,9 @@ hyp_fiq:
 
        .ltorg
 
-__kvm_hyp_code_end:
-       .globl  __kvm_hyp_code_end
+       .popsection
 
-       .section ".rodata"
+       .pushsection ".rodata"
 
 und_die_str:
        .ascii  "unexpected undefined exception in Hyp mode at: %#08x\n"
@@ -524,3 +519,5 @@ dabt_die_str:
        .ascii  "unexpected data abort in Hyp mode at: %#08x\n"
 svc_die_str:
        .ascii  "unexpected HVC/SVC trap in Hyp mode at: %#08x\n"
+
+       .popsection