Commit 7f9d8599 authored by Sven Schnelle's avatar Sven Schnelle Committed by Vasily Gorbik
Browse files

s390/alternatives: Allow early alternative patching in decompressor



Add the required code to patch alternatives early in the decompressor.
This is required for the upcoming lowcore relocation changes, where
alternatives for facility 193 need to get patched before lowcore
alternatives.

Reviewed-by: default avatarAlexander Gordeev <agordeev@linux.ibm.com>
Co-developed-by: default avatarHeiko Carstens <hca@linux.ibm.com>
Signed-off-by: default avatarHeiko Carstens <hca@linux.ibm.com>
Signed-off-by: default avatarSven Schnelle <svens@linux.ibm.com>
Signed-off-by: default avatarVasily Gorbik <gor@linux.ibm.com>
parent b3e0c5f7
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -39,7 +39,7 @@ CFLAGS_sclp_early_core.o += -I$(srctree)/drivers/s390/char

obj-y	:= head.o als.o startup.o physmem_info.o ipl_parm.o ipl_report.o vmem.o
obj-y	+= string.o ebcdic.o sclp_early_core.o mem.o ipl_vmparm.o cmdline.o
obj-y	+= version.o pgm_check_info.o ctype.o ipl_data.o relocs.o
obj-y	+= version.o pgm_check_info.o ctype.o ipl_data.o relocs.o alternative.o
obj-$(findstring y, $(CONFIG_PROTECTED_VIRTUALIZATION_GUEST) $(CONFIG_PGSTE))	+= uv.o
obj-$(CONFIG_RANDOMIZE_BASE)	+= kaslr.o
obj-y	+= $(if $(CONFIG_KERNEL_UNCOMPRESSED),,decompressor.o) info.o
+3 −0
Original line number Diff line number Diff line
// SPDX-License-Identifier: GPL-2.0

#include "../kernel/alternative.c"
+2 −0
Original line number Diff line number Diff line
@@ -30,6 +30,8 @@ struct vmlinux_info {
	unsigned long init_mm_off;
	unsigned long swapper_pg_dir_off;
	unsigned long invalid_pg_dir_off;
	unsigned long alt_instructions;
	unsigned long alt_instructions_end;
#ifdef CONFIG_KASAN
	unsigned long kasan_early_shadow_page_off;
	unsigned long kasan_early_shadow_pte_off;
+5 −0
Original line number Diff line number Diff line
@@ -376,6 +376,8 @@ static void kaslr_adjust_vmlinux_info(long offset)
	vmlinux.init_mm_off += offset;
	vmlinux.swapper_pg_dir_off += offset;
	vmlinux.invalid_pg_dir_off += offset;
	vmlinux.alt_instructions += offset;
	vmlinux.alt_instructions_end += offset;
#ifdef CONFIG_KASAN
	vmlinux.kasan_early_shadow_page_off += offset;
	vmlinux.kasan_early_shadow_pte_off += offset;
@@ -507,6 +509,9 @@ void startup_kernel(void)
	kaslr_adjust_got(__kaslr_offset);
	setup_vmem(__kaslr_offset, __kaslr_offset + kernel_size, asce_limit);
	copy_bootdata();
	__apply_alternatives((struct alt_instr *)_vmlinux_info.alt_instructions,
			     (struct alt_instr *)_vmlinux_info.alt_instructions_end,
			     ALT_CTX_EARLY);

	/*
	 * Save KASLR offset for early dumps, before vmcore_info is set.
+9 −3
Original line number Diff line number Diff line
@@ -27,15 +27,21 @@
 * alternative should be applied.
 */

#define ALT_CTX_LATE		1
#define ALT_CTX_ALL		ALT_CTX_LATE
#define ALT_CTX_EARLY		1
#define ALT_CTX_LATE		2
#define ALT_CTX_ALL		(ALT_CTX_EARLY | ALT_CTX_LATE)

#define ALT_TYPE_FACILITY	0
#define ALT_TYPE_FACILITY_EARLY	0
#define ALT_TYPE_FACILITY	1

#define ALT_DATA_SHIFT		0
#define ALT_TYPE_SHIFT		20
#define ALT_CTX_SHIFT		28

#define ALT_FACILITY_EARLY(facility)	(ALT_CTX_EARLY << ALT_CTX_SHIFT		   | \
					 ALT_TYPE_FACILITY_EARLY << ALT_TYPE_SHIFT | \
					 (facility) << ALT_DATA_SHIFT)

#define ALT_FACILITY(facility)		(ALT_CTX_LATE << ALT_CTX_SHIFT		| \
					 ALT_TYPE_FACILITY << ALT_TYPE_SHIFT	| \
					 (facility) << ALT_DATA_SHIFT)
Loading