diff options
author | Alexander Egorenkov <egorenar@linux.ibm.com> | 2020-11-05 15:09:06 +0300 |
---|---|---|
committer | Heiko Carstens <hca@linux.ibm.com> | 2021-07-27 10:39:15 +0300 |
commit | f1d3c5323772a215d910aeaf697d210a3671cf81 (patch) | |
tree | 18dd370f427bf284c19835fbed139d8ca23083cd /arch/s390/boot | |
parent | 8b6bd6f295b7ff5e3205ef135de8ad3b2034ed73 (diff) |
s390/boot: move sclp early buffer from fixed address in asm to C
To make the decompressor relocatable, the early SCLP buffer with a fixed
address must be replaced with a relocatable C buffer of the according size
and alignment as required by SCLP.
Introduce a new function sclp_early_set_buffer() into the SCLP driver
which enables the decompressor to change the SCLP early buffer at any time.
This will be useful when the decompressor becomes fully relocatable and
might need to change the SCLP early buffer to one with an address < 2G
as required by SCLP because it was loaded at an address >= 2G.
Signed-off-by: Alexander Egorenkov <egorenar@linux.ibm.com>
Acked-by: Heiko Carstens <hca@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 | 1 | ||||
-rw-r--r-- | arch/s390/boot/compressed/vmlinux.lds.S | 5 | ||||
-rw-r--r-- | arch/s390/boot/head.S | 4 | ||||
-rw-r--r-- | arch/s390/boot/sclp_early_core.c | 9 |
4 files changed, 15 insertions, 4 deletions
diff --git a/arch/s390/boot/boot.h b/arch/s390/boot/boot.h index 3d7d5ef4d169..716c35c1d78f 100644 --- a/arch/s390/boot/boot.h +++ b/arch/s390/boot/boot.h @@ -13,6 +13,7 @@ void setup_boot_command_line(void); void parse_boot_command_line(void); void verify_facilities(void); void print_missing_facilities(void); +void sclp_early_setup_buffer(void); void print_pgm_check_info(void); unsigned long get_random_base(unsigned long safe_addr); void __printf(1, 2) decompressor_printk(const char *fmt, ...); diff --git a/arch/s390/boot/compressed/vmlinux.lds.S b/arch/s390/boot/compressed/vmlinux.lds.S index 0bd8aaaa4b33..d6a69aa6e937 100644 --- a/arch/s390/boot/compressed/vmlinux.lds.S +++ b/arch/s390/boot/compressed/vmlinux.lds.S @@ -3,6 +3,7 @@ #include <asm/vmlinux.lds.h> #include <asm/thread_info.h> #include <asm/page.h> +#include <asm/sclp.h> OUTPUT_FORMAT("elf64-s390", "elf64-s390", "elf64-s390") OUTPUT_ARCH(s390:64-bit) @@ -54,7 +55,9 @@ SECTIONS KEEP(*(.dma.ex_table)) _stop_dma_ex_table = .; } - .dma.data : { *(.dma.data) } + .dma.data : { + *(.dma.data) + } . = ALIGN(PAGE_SIZE); _edma = .; diff --git a/arch/s390/boot/head.S b/arch/s390/boot/head.S index 4ac3958b3032..759f77c6af45 100644 --- a/arch/s390/boot/head.S +++ b/arch/s390/boot/head.S @@ -320,6 +320,7 @@ SYM_CODE_START_LOCAL(startup_normal) spt 6f-.LPG0(%r13) mvc __LC_LAST_UPDATE_TIMER(8),6f-.LPG0(%r13) larl %r15,_stack_end-STACK_FRAME_OVERHEAD + brasl %r14,sclp_early_setup_buffer brasl %r14,verify_facilities brasl %r14,startup_kernel SYM_CODE_END(startup_normal) @@ -410,7 +411,4 @@ SYM_DATA_START(parmarea) .org PARMAREA+__PARMAREA_SIZE SYM_DATA_END(parmarea) - .org EARLY_SCCB_OFFSET - .fill EXT_SCCB_READ_SCP - .org HEAD_END diff --git a/arch/s390/boot/sclp_early_core.c b/arch/s390/boot/sclp_early_core.c index 5a19fd7020b5..6f30646afbd0 100644 --- a/arch/s390/boot/sclp_early_core.c +++ b/arch/s390/boot/sclp_early_core.c @@ -1,2 +1,11 @@ // SPDX-License-Identifier: GPL-2.0 +#include "boot.h" #include "../../../drivers/s390/char/sclp_early_core.c" + +/* SCLP early buffer must stay page-aligned and below 2GB */ +static char __sclp_early_sccb[EXT_SCCB_READ_SCP] __aligned(PAGE_SIZE); + +void sclp_early_setup_buffer(void) +{ + sclp_early_set_buffer(&__sclp_early_sccb); +} |