Commit 16174eea authored by David Brazdil's avatar David Brazdil Committed by Marc Zyngier
Browse files

KVM: arm64: Set up .hyp.rodata ELF section



We will need to recognize pointers in .rodata specific to hyp, so
establish a .hyp.rodata ELF section. Merge it with the existing
.hyp.data..ro_after_init as they are treated the same at runtime.

Signed-off-by: default avatarDavid Brazdil <dbrazdil@google.com>
Signed-off-by: default avatarMarc Zyngier <maz@kernel.org>
Link: https://lore.kernel.org/r/20210105180541.65031-3-dbrazdil@google.com
parent eceaf38f
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -11,7 +11,7 @@ extern char __alt_instructions[], __alt_instructions_end[];
extern char __hibernate_exit_text_start[], __hibernate_exit_text_end[];
extern char __hyp_idmap_text_start[], __hyp_idmap_text_end[];
extern char __hyp_text_start[], __hyp_text_end[];
extern char __hyp_data_ro_after_init_start[], __hyp_data_ro_after_init_end[];
extern char __hyp_rodata_start[], __hyp_rodata_end[];
extern char __idmap_text_start[], __idmap_text_end[];
extern char __initdata_begin[], __initdata_end[];
extern char __inittext_begin[], __inittext_end[];
+4 −3
Original line number Diff line number Diff line
@@ -31,10 +31,11 @@ jiffies = jiffies_64;
	__stop___kvm_ex_table = .;

#define HYPERVISOR_DATA_SECTIONS				\
	HYP_SECTION_NAME(.data..ro_after_init) : {		\
		__hyp_data_ro_after_init_start = .;		\
	HYP_SECTION_NAME(.rodata) : {				\
		__hyp_rodata_start = .;				\
		*(HYP_SECTION_NAME(.data..ro_after_init))	\
		__hyp_data_ro_after_init_end = .;		\
		*(HYP_SECTION_NAME(.rodata))			\
		__hyp_rodata_end = .;				\
	}

#define HYPERVISOR_PERCPU_SECTION				\
+3 −4
Original line number Diff line number Diff line
@@ -1749,11 +1749,10 @@ static int init_hyp_mode(void)
		goto out_err;
	}

	err = create_hyp_mappings(kvm_ksym_ref(__hyp_data_ro_after_init_start),
				  kvm_ksym_ref(__hyp_data_ro_after_init_end),
				  PAGE_HYP_RO);
	err = create_hyp_mappings(kvm_ksym_ref(__hyp_rodata_start),
				  kvm_ksym_ref(__hyp_rodata_end), PAGE_HYP_RO);
	if (err) {
		kvm_err("Cannot map .hyp.data..ro_after_init section\n");
		kvm_err("Cannot map .hyp.rodata section\n");
		goto out_err;
	}

+3 −1
Original line number Diff line number Diff line
@@ -14,6 +14,9 @@
SECTIONS {
	HYP_SECTION(.idmap.text)
	HYP_SECTION(.text)
	HYP_SECTION(.data..ro_after_init)
	HYP_SECTION(.rodata)

	/*
	 * .hyp..data..percpu needs to be page aligned to maintain the same
	 * alignment for when linking into vmlinux.
@@ -22,5 +25,4 @@ SECTIONS {
	HYP_SECTION_NAME(.data..percpu) : {
		PERCPU_INPUT(L1_CACHE_BYTES)
	}
	HYP_SECTION(.data..ro_after_init)
}