diff options
author | Alexander Gordeev <agordeev@linux.ibm.com> | 2022-12-04 23:15:41 +0300 |
---|---|---|
committer | Heiko Carstens <hca@linux.ibm.com> | 2023-01-13 16:15:05 +0300 |
commit | bd50b7436217b4123911c2bca1efd74718654f06 (patch) | |
tree | 57a16051bb67e2437a7cc3ed0dbd8da609f3ad9f /arch/s390/boot | |
parent | b265854060525ca2cef74e40a49494bbb52700e6 (diff) | |
download | linux-bd50b7436217b4123911c2bca1efd74718654f06.tar.xz |
s390/boot: detect and enable memory facilities
Detect and enable memory facilities which is a
prerequisite for pgtables setup in the decompressor.
Reviewed-by: Heiko Carstens <hca@linux.ibm.com>
Signed-off-by: Alexander Gordeev <agordeev@linux.ibm.com>
Signed-off-by: Heiko Carstens <hca@linux.ibm.com>
Diffstat (limited to 'arch/s390/boot')
-rw-r--r-- | arch/s390/boot/boot.h | 8 | ||||
-rw-r--r-- | arch/s390/boot/startup.c | 18 |
2 files changed, 26 insertions, 0 deletions
diff --git a/arch/s390/boot/boot.h b/arch/s390/boot/boot.h index f6e82cf7851e..286441cf3bf0 100644 --- a/arch/s390/boot/boot.h +++ b/arch/s390/boot/boot.h @@ -8,6 +8,12 @@ #ifndef __ASSEMBLY__ +struct machine_info { + unsigned char has_edat1 : 1; + unsigned char has_edat2 : 1; + unsigned char has_nx : 1; +}; + struct vmlinux_info { unsigned long default_lma; void (*entry)(void); @@ -38,6 +44,8 @@ unsigned long get_random_base(unsigned long safe_addr); void __printf(1, 2) decompressor_printk(const char *fmt, ...); void error(char *m); +extern struct machine_info machine; + /* Symbols defined by linker scripts */ extern const char kernel_version[]; extern unsigned long memory_limit; diff --git a/arch/s390/boot/startup.c b/arch/s390/boot/startup.c index 47ca3264c023..da6ee587fe9a 100644 --- a/arch/s390/boot/startup.c +++ b/arch/s390/boot/startup.c @@ -33,6 +33,8 @@ u64 __bootdata_preserved(stfle_fac_list[16]); u64 __bootdata_preserved(alt_stfle_fac_list[16]); struct oldmem_data __bootdata_preserved(oldmem_data); +struct machine_info machine; + void error(char *x) { sclp_early_printk("\n\n"); @@ -42,6 +44,20 @@ void error(char *x) disabled_wait(); } +static void detect_facilities(void) +{ + if (test_facility(8)) { + machine.has_edat1 = 1; + __ctl_set_bit(0, 23); + } + if (test_facility(78)) + machine.has_edat2 = 1; + if (!noexec_disabled && test_facility(130)) { + machine.has_nx = 1; + __ctl_set_bit(0, 20); + } +} + static void setup_lpp(void) { S390_lowcore.current_pid = 0; @@ -254,6 +270,8 @@ void startup_kernel(void) unsigned long safe_addr; void *img; + detect_facilities(); + initrd_data.start = parmarea.initrd_start; initrd_data.size = parmarea.initrd_size; oldmem_data.start = parmarea.oldmem_base; |