diff options
Diffstat (limited to 'arch/s390/kernel/setup.c')
| -rw-r--r-- | arch/s390/kernel/setup.c | 71 | 
1 files changed, 70 insertions, 1 deletions
diff --git a/arch/s390/kernel/setup.c b/arch/s390/kernel/setup.c index 2c642af526ce..f8544d517430 100644 --- a/arch/s390/kernel/setup.c +++ b/arch/s390/kernel/setup.c @@ -50,6 +50,7 @@  #include <linux/compat.h>  #include <linux/start_kernel.h> +#include <asm/boot_data.h>  #include <asm/ipl.h>  #include <asm/facility.h>  #include <asm/smp.h> @@ -65,11 +66,13 @@  #include <asm/diag.h>  #include <asm/os_info.h>  #include <asm/sclp.h> +#include <asm/stacktrace.h>  #include <asm/sysinfo.h>  #include <asm/numa.h>  #include <asm/alternative.h>  #include <asm/nospec-branch.h>  #include <asm/mem_detect.h> +#include <asm/uv.h>  #include "entry.h"  /* @@ -89,12 +92,25 @@ char elf_platform[ELF_PLATFORM_SIZE];  unsigned long int_hwcap = 0; +#ifdef CONFIG_PROTECTED_VIRTUALIZATION_GUEST +int __bootdata_preserved(prot_virt_guest); +#endif +  int __bootdata(noexec_disabled);  int __bootdata(memory_end_set);  unsigned long __bootdata(memory_end);  unsigned long __bootdata(max_physmem_end);  struct mem_detect_info __bootdata(mem_detect); +struct exception_table_entry *__bootdata_preserved(__start_dma_ex_table); +struct exception_table_entry *__bootdata_preserved(__stop_dma_ex_table); +unsigned long __bootdata_preserved(__swsusp_reset_dma); +unsigned long __bootdata_preserved(__stext_dma); +unsigned long __bootdata_preserved(__etext_dma); +unsigned long __bootdata_preserved(__sdma); +unsigned long __bootdata_preserved(__edma); +unsigned long __bootdata_preserved(__kaslr_offset); +  unsigned long VMALLOC_START;  EXPORT_SYMBOL(VMALLOC_START); @@ -736,6 +752,15 @@ static void __init reserve_initrd(void)  #endif  } +/* + * Reserve the memory area used to pass the certificate lists + */ +static void __init reserve_certificate_list(void) +{ +	if (ipl_cert_list_addr) +		memblock_reserve(ipl_cert_list_addr, ipl_cert_list_size); +} +  static void __init reserve_mem_detect_info(void)  {  	unsigned long start, size; @@ -814,9 +839,10 @@ static void __init reserve_kernel(void)  {  	unsigned long start_pfn = PFN_UP(__pa(_end)); -	memblock_reserve(0, PARMAREA_END); +	memblock_reserve(0, HEAD_END);  	memblock_reserve((unsigned long)_stext, PFN_PHYS(start_pfn)  			 - (unsigned long)_stext); +	memblock_reserve(__sdma, __edma - __sdma);  }  static void __init setup_memory(void) @@ -914,7 +940,15 @@ static int __init setup_hwcaps(void)  			elf_hwcap |= HWCAP_S390_VXRS_EXT;  		if (test_facility(135))  			elf_hwcap |= HWCAP_S390_VXRS_BCD; +		if (test_facility(148)) +			elf_hwcap |= HWCAP_S390_VXRS_EXT2; +		if (test_facility(152)) +			elf_hwcap |= HWCAP_S390_VXRS_PDE;  	} +	if (test_facility(150)) +		elf_hwcap |= HWCAP_S390_SORT; +	if (test_facility(151)) +		elf_hwcap |= HWCAP_S390_DFLT;  	/*  	 * Guarded storage support HWCAP_S390_GS is bit 12. @@ -1023,6 +1057,38 @@ static void __init setup_control_program_code(void)  }  /* + * Print the component list from the IPL report + */ +static void __init log_component_list(void) +{ +	struct ipl_rb_component_entry *ptr, *end; +	char *str; + +	if (!early_ipl_comp_list_addr) +		return; +	if (ipl_block.hdr.flags & IPL_PL_FLAG_IPLSR) +		pr_info("Linux is running with Secure-IPL enabled\n"); +	else +		pr_info("Linux is running with Secure-IPL disabled\n"); +	ptr = (void *) early_ipl_comp_list_addr; +	end = (void *) ptr + early_ipl_comp_list_size; +	pr_info("The IPL report contains the following components:\n"); +	while (ptr < end) { +		if (ptr->flags & IPL_RB_COMPONENT_FLAG_SIGNED) { +			if (ptr->flags & IPL_RB_COMPONENT_FLAG_VERIFIED) +				str = "signed, verified"; +			else +				str = "signed, verification failed"; +		} else { +			str = "not signed"; +		} +		pr_info("%016llx - %016llx (%s)\n", +			ptr->addr, ptr->addr + ptr->len, str); +		ptr++; +	} +} + +/*   * Setup function called from init/main.c just after the banner   * was printed.   */ @@ -1042,6 +1108,8 @@ void __init setup_arch(char **cmdline_p)  	else  		pr_info("Linux is running as a guest in 64-bit mode\n"); +	log_component_list(); +  	/* Have one command line that is parsed and saved in /proc/cmdline */  	/* boot_command_line has been already set up in early.c */  	*cmdline_p = boot_command_line; @@ -1073,6 +1141,7 @@ void __init setup_arch(char **cmdline_p)  	reserve_oldmem();  	reserve_kernel();  	reserve_initrd(); +	reserve_certificate_list();  	reserve_mem_detect_info();  	memblock_allow_resize();  |