Commit f1d3c532 authored by Alexander Egorenkov's avatar Alexander Egorenkov Committed by Heiko Carstens
Browse files

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: default avatarAlexander Egorenkov <egorenar@linux.ibm.com>
Acked-by: default avatarHeiko Carstens <hca@linux.ibm.com>
Signed-off-by: default avatarHeiko Carstens <hca@linux.ibm.com>
parent 8b6bd6f2
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -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, ...);
+4 −1
Original line number Diff line number Diff line
@@ -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 = .;

+1 −3
Original line number Diff line number Diff line
@@ -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
+9 −0
Original line number Diff line number Diff line
// 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);
}
+1 −0
Original line number Diff line number Diff line
@@ -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);
Loading