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>
This commit is contained in:
Родитель
8b6bd6f295
Коммит
f1d3c53237
|
@ -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, ...);
|
||||
|
|
|
@ -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 = .;
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -115,6 +115,7 @@ struct zpci_report_error_header {
|
|||
u8 data[0]; /* Subsequent Data passed verbatim to SCLP ET 24 */
|
||||
} __packed;
|
||||
|
||||
void sclp_early_set_buffer(void *sccb);
|
||||
int sclp_early_read_info(void);
|
||||
int sclp_early_read_storage_info(void);
|
||||
int sclp_early_get_core_info(struct sclp_core_info *info);
|
||||
|
|
|
@ -7,15 +7,13 @@
|
|||
#define _ASM_S390_SETUP_H
|
||||
|
||||
#include <linux/bits.h>
|
||||
#include <asm/sclp.h>
|
||||
#include <uapi/asm/setup.h>
|
||||
#include <linux/build_bug.h>
|
||||
|
||||
#define EP_OFFSET 0x10008
|
||||
#define EP_STRING "S390EP"
|
||||
#define PARMAREA 0x10400
|
||||
#define EARLY_SCCB_OFFSET 0x11000
|
||||
#define HEAD_END (EARLY_SCCB_OFFSET + EXT_SCCB_READ_SCP)
|
||||
#define HEAD_END 0x11000
|
||||
|
||||
/*
|
||||
* Machine features detected in early.c
|
||||
|
|
|
@ -17,7 +17,7 @@
|
|||
|
||||
static struct read_info_sccb __bootdata(sclp_info_sccb);
|
||||
static int __bootdata(sclp_info_sccb_valid);
|
||||
char *sclp_early_sccb = (char *) EARLY_SCCB_OFFSET;
|
||||
char *__bootdata(sclp_early_sccb);
|
||||
int sclp_init_state = sclp_init_state_uninitialized;
|
||||
/*
|
||||
* Used to keep track of the size of the event masks. Qemu until version 2.11
|
||||
|
@ -211,6 +211,11 @@ static int sclp_early_setup(int disable, int *have_linemode, int *have_vt220)
|
|||
return rc;
|
||||
}
|
||||
|
||||
void sclp_early_set_buffer(void *sccb)
|
||||
{
|
||||
sclp_early_sccb = sccb;
|
||||
}
|
||||
|
||||
/*
|
||||
* Output one or more lines of text on the SCLP console (VT220 and /
|
||||
* or line-mode).
|
||||
|
|
Загрузка…
Ссылка в новой задаче