s390: introduce .boot.preserved.data section
Introduce .boot.preserve.data section which is similar to .boot.data and "shared" between the decompressor code and the decompressed kernel. The decompressor will store values in it, and copy over to the decompressed image before starting it. This method allows to avoid using pre-defined addresses and other hacks to pass values between those boot phases. Unlike .boot.data section .boot.preserved.data is NOT a part of init data, and hence will be preserved for the kernel life time. Signed-off-by: Gerald Schaefer <gerald.schaefer@de.ibm.com> Signed-off-by: Vasily Gorbik <gor@linux.ibm.com> Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
This commit is contained in:
parent
46a984ffb8
commit
bf9921a9c1
|
@ -17,6 +17,8 @@ struct vmlinux_info {
|
|||
unsigned long bss_size; /* uncompressed image .bss size */
|
||||
unsigned long bootdata_off;
|
||||
unsigned long bootdata_size;
|
||||
unsigned long bootdata_preserved_off;
|
||||
unsigned long bootdata_preserved_size;
|
||||
};
|
||||
|
||||
extern char _vmlinux_info[];
|
||||
|
|
|
@ -34,6 +34,7 @@ SECTIONS
|
|||
_edata = . ;
|
||||
}
|
||||
BOOT_DATA
|
||||
BOOT_DATA_PRESERVED
|
||||
|
||||
/*
|
||||
* uncompressed image info used by the decompressor it should match
|
||||
|
|
|
@ -6,6 +6,7 @@
|
|||
#include "boot.h"
|
||||
|
||||
extern char __boot_data_start[], __boot_data_end[];
|
||||
extern char __boot_data_preserved_start[], __boot_data_preserved_end[];
|
||||
|
||||
void error(char *x)
|
||||
{
|
||||
|
@ -43,6 +44,9 @@ static void copy_bootdata(void)
|
|||
if (__boot_data_end - __boot_data_start != vmlinux.bootdata_size)
|
||||
error(".boot.data section size mismatch");
|
||||
memcpy((void *)vmlinux.bootdata_off, __boot_data_start, vmlinux.bootdata_size);
|
||||
if (__boot_data_preserved_end - __boot_data_preserved_start != vmlinux.bootdata_preserved_size)
|
||||
error(".boot.preserved.data section size mismatch");
|
||||
memcpy((void *)vmlinux.bootdata_preserved_off, __boot_data_preserved_start, vmlinux.bootdata_preserved_size);
|
||||
}
|
||||
|
||||
void startup_kernel(void)
|
||||
|
|
|
@ -16,4 +16,11 @@
|
|||
*/
|
||||
#define __bootdata(var) __section(.boot.data.var) var
|
||||
|
||||
/*
|
||||
* .boot.preserved.data is similar to .boot.data, but it is not part of the
|
||||
* .init section and thus will be preserved for later use in the decompressed
|
||||
* kernel.
|
||||
*/
|
||||
#define __bootdata_preserved(var) __section(.boot.preserved.data.var) var
|
||||
|
||||
#endif
|
||||
|
|
|
@ -18,3 +18,16 @@
|
|||
*(SORT_BY_ALIGNMENT(SORT_BY_NAME(.boot.data*))) \
|
||||
__boot_data_end = .; \
|
||||
}
|
||||
|
||||
/*
|
||||
* .boot.preserved.data is similar to .boot.data, but it is not part of the
|
||||
* .init section and thus will be preserved for later use in the decompressed
|
||||
* kernel.
|
||||
*/
|
||||
#define BOOT_DATA_PRESERVED \
|
||||
. = ALIGN(PAGE_SIZE); \
|
||||
.boot.preserved.data : { \
|
||||
__boot_data_preserved_start = .; \
|
||||
*(SORT_BY_ALIGNMENT(SORT_BY_NAME(.boot.preserved.data*))) \
|
||||
__boot_data_preserved_end = .; \
|
||||
}
|
||||
|
|
|
@ -72,6 +72,7 @@ SECTIONS
|
|||
__end_ro_after_init = .;
|
||||
|
||||
RW_DATA_SECTION(0x100, PAGE_SIZE, THREAD_SIZE)
|
||||
BOOT_DATA_PRESERVED
|
||||
|
||||
_edata = .; /* End of data section */
|
||||
|
||||
|
@ -161,6 +162,9 @@ SECTIONS
|
|||
QUAD(__bss_stop - __bss_start) /* bss_size */
|
||||
QUAD(__boot_data_start) /* bootdata_off */
|
||||
QUAD(__boot_data_end - __boot_data_start) /* bootdata_size */
|
||||
QUAD(__boot_data_preserved_start) /* bootdata_preserved_off */
|
||||
QUAD(__boot_data_preserved_end -
|
||||
__boot_data_preserved_start) /* bootdata_preserved_size */
|
||||
} :NONE
|
||||
|
||||
/* Debugging sections. */
|
||||
|
|
Loading…
Reference in New Issue