Move RSDP address out of setup_header
Subsystems (3)
cover Move RSDP address out of setup_header
Instead of passing the RSDP address for Xen PVH guests from grub2 to the kernel in setup_header move it into the non-legacy part of the boot_params structure.
This patch series should be applied rather sooner than later in order to avoid shipping linux 4.20 with a corky boot protocol.
Juergen Gross (2):
x86/boot: revert commit ae7e1238e68f2a (Add ACPI RSDP address to
setup_header)
x86/acpi, x86/boot: Take RSDP address from boot params if available
Documentation/x86/boot.txt | 32 +------------------------------- arch/x86/boot/header.S | 6 +----- arch/x86/include/asm/x86_init.h | 2 -- arch/x86/include/uapi/asm/bootparam.h | 7 ++----- arch/x86/kernel/acpi/boot.c | 2 +- arch/x86/kernel/head32.c | 1 - arch/x86/kernel/head64.c | 2 -- arch/x86/kernel/setup.c | 17 ----------------- 8 files changed, 5 insertions(+), 64 deletions(-)
Signature · 1 line
2.16.4
PATCH 1/2 x86/boot: revert commit ae7e1238e68f2a (Add ACPI RSDP address to setup_header)
Peter Anvin pointed out that commit ae7e1238e68f2a ("x86/boot: Add ACPI RSDP address to setup_header") should be reverted as setup_header should contain only items set by legacy BIOS.
So revert said commit. Instead of fully reverting the depending commit e7b66d16fe4172 ("x86/acpi, x86/boot: Take RSDP address for boot params if available") just remove the setup_header reference in order to replace it by a boot_params in a followup patch.
--- Documentation/x86/boot.txt | 32 +------------------------------- arch/x86/boot/header.S | 6 +----- arch/x86/include/asm/x86_init.h | 2 -- arch/x86/include/uapi/asm/bootparam.h | 4 ---- arch/x86/kernel/acpi/boot.c | 2 +- arch/x86/kernel/head32.c | 1 - arch/x86/kernel/head64.c | 2 -- arch/x86/kernel/setup.c | 17 ----------------- 8 files changed, 3 insertions(+), 63 deletions(-)
Documentation/x86/boot.txt +1 -31
@@ -61,18 +61,6 @@ Protocol 2.12: (Kernel 3.8) Added the xloadflags field and extension fields to struct boot_params for loading bzImage and ramdisk above 4G in 64bit. -Protocol 2.13: (Kernel 3.14) Support 32- and 64-bit flags being set in - xloadflags to support booting a 64-bit kernel from 32-bit - EFI - -Protocol 2.14: (Kernel 4.20) Added acpi_rsdp_addr holding the physical - address of the ACPI RSDP table. - The bootloader updates version with: - 0x8000 | min(kernel-version, bootloader-version) - kernel-version being the protocol version supported by - the kernel and bootloader-version the protocol version - supported by the bootloader. - **** MEMORY LAYOUT The traditional memory map for the kernel loader, used for Image or
@@ -209,7 +197,6 @@ Offset Proto Name Meaning 0258/8 2.10+ pref_address Preferred loading address 0260/4 2.10+ init_size Linear memory required during initialization 0264/4 2.11+ handover_offset Offset of handover entry point -0268/8 2.14+ acpi_rsdp_addr Physical address of RSDP table (1) For backwards compatibility, if the setup_sects field contains 0, the real value is 4.
@@ -322,7 +309,7 @@ Protocol: 2.00+ Contains the magic number "HdrS" (0x53726448). Field name: version -Type: modify +Type: read Offset/size: 0x206/2 Protocol: 2.00+
@@ -330,12 +317,6 @@ Protocol: 2.00+ e.g. 0x0204 for version 2.04, and 0x0a11 for a hypothetical version 10.17. - Up to protocol version 2.13 this information is only read by the - bootloader. From protocol version 2.14 onwards the bootloader will - write the used protocol version or-ed with 0x8000 to the field. The - used protocol version will be the minimum of the supported protocol - versions of the bootloader and the kernel. - Field name: realmode_swtch Type: modify (optional) Offset/size: 0x208/4
@@ -763,17 +744,6 @@ Offset/size: 0x264/4 See EFI HANDOVER PROTOCOL below for more details. -Field name: acpi_rsdp_addr -Type: write -Offset/size: 0x268/8 -Protocol: 2.14+ - - This field can be set by the boot loader to tell the kernel the - physical address of the ACPI RSDP table. - - A value of 0 indicates the kernel should fall back to the standard - methods to locate the RSDP. - **** THE IMAGE CHECKSUM
arch/x86/boot/header.S +1 -5
@@ -300,7 +300,7 @@ _start: # Part 2 of the header, from the old setup.S .ascii "HdrS" # header signature - .word 0x020e # header version number (>= 0x0105) + .word 0x020d # header version number (>= 0x0105) # or else old loadlin-1.5 will fail) .globl realmode_swtch realmode_swtch: .word 0, 0 # default_switch, SETUPSEG
@@ -558,10 +558,6 @@ pref_address: .quad LOAD_PHYSICAL_ADDR # preferred load addr init_size: .long INIT_SIZE # kernel initialization size handover_offset: .long 0 # Filled in by build.c -acpi_rsdp_addr: .quad 0 # 64-bit physical pointer to the - # ACPI RSDP table, added with - # version 2.14 - # End of setup header ##################################################### .section ".entrytext", "ax"
arch/x86/include/asm/x86_init.h +0 -2
@@ -303,6 +303,4 @@ extern void x86_init_noop(void);extern void x86_init_uint_noop (unsigned int unused);extern bool x86_pnpbios_disabled (void ); -void x86_verify_bootdata_version (void ); -#endif
arch/x86/include/uapi/asm/bootparam.h +0 -4
@@ -16,9 +16,6 @@#define RAMDISK_PROMPT_FLAG 0x8000#define RAMDISK_LOAD_FLAG 0x4000 -/* version flags */ -#define VERSION_WRITTEN 0x8000 -/* loadflags */ #define LOADED_HIGH (1<<0)#define KASLR_FLAG (1<<1)
@@ -89,7 +86,6 @@ struct setup_header {__u64 pref_address;__u32 init_size;__u32 handover_offset; -__u64 acpi_rsdp_addr; } __attribute__((packed));struct sys_desc_table {
arch/x86/kernel/acpi/boot.c +1 -1
@@ -1776,5 +1776,5 @@ void __init arch_reserve_mem_area(acpi_physical_address addr, size_t size)u64 x86_default_get_root_pointer (void ) { -return boot_params.hdr.acpi_rsdp_addr; +return 0 ; }
arch/x86/kernel/head32.c +0 -1
@@ -37,7 +37,6 @@ asmlinkage __visible void __init i386_start_kernel(void)cr4_init_shadow ();sanitize_boot_params (&boot_params); -x86_verify_bootdata_version ();x86_early_init_platform_quirks ();
arch/x86/kernel/head64.c +0 -2
@@ -457,8 +457,6 @@ void __init x86_64_start_reservations(char *real_mode_data)if (!boot_params.hdr.version)copy_bootdata (__va (real_mode_data)); -x86_verify_bootdata_version (); -x86_early_init_platform_quirks ();switch (boot_params.hdr.hardware_subarch) {
arch/x86/kernel/setup.c +0 -17
@@ -1280,23 +1280,6 @@ void __init setup_arch(char **cmdline_p)unwind_init (); } -/* -* From boot protocol 2.14 onwards we expect the bootloader to set the -* version to "0x8000 | <used version>". In case we find a version >= 2.14 -* without the 0x8000 we assume the boot loader supports 2.13 only and -* reset the version accordingly. The 0x8000 flag is removed in any case. -*/ -void __init x86_verify_bootdata_version (void ) -{ -if (boot_params.hdr.version &VERSION_WRITTEN ) - boot_params.hdr.version &= ~VERSION_WRITTEN ; -else if (boot_params.hdr.version >=0x020e ) - boot_params.hdr.version =0x020d ; - -if (boot_params.hdr.version <0x020e ) - boot_params.hdr.acpi_rsdp_addr =0 ; -} -#ifdef CONFIG_X86_32 static struct resource video_ram_resource = {
Signature · 7 lines
2.16.4 _______________________________________________ Xen-devel mailing list [email protected] https://lists.xenproject.org/mailman/listinfo/xen-devel
PATCH 1/2 x86/boot: revert commit ae7e1238e68f2a (Add ACPI RSDP address to setup_header)
In reply to Juergen GrossPeter Anvin pointed out that commit ae7e1238e68f2a ("x86/boot: Add ACPI RSDP address to setup_header") should be reverted as setup_header should contain only items set by legacy BIOS.
So revert said commit. Instead of fully reverting the depending commit e7b66d16fe4172 ("x86/acpi, x86/boot: Take RSDP address for boot params if available") just remove the setup_header reference in order to replace it by a boot_params in a followup patch.
--- Documentation/x86/boot.txt | 32 +------------------------------- arch/x86/boot/header.S | 6 +----- arch/x86/include/asm/x86_init.h | 2 -- arch/x86/include/uapi/asm/bootparam.h | 4 ---- arch/x86/kernel/acpi/boot.c | 2 +- arch/x86/kernel/head32.c | 1 - arch/x86/kernel/head64.c | 2 -- arch/x86/kernel/setup.c | 17 ----------------- 8 files changed, 3 insertions(+), 63 deletions(-)
Documentation/x86/boot.txt +1 -31
@@ -61,18 +61,6 @@ Protocol 2.12: (Kernel 3.8) Added the xloadflags field and extension fields to struct boot_params for loading bzImage and ramdisk above 4G in 64bit. -Protocol 2.13: (Kernel 3.14) Support 32- and 64-bit flags being set in - xloadflags to support booting a 64-bit kernel from 32-bit - EFI - -Protocol 2.14: (Kernel 4.20) Added acpi_rsdp_addr holding the physical - address of the ACPI RSDP table. - The bootloader updates version with: - 0x8000 | min(kernel-version, bootloader-version) - kernel-version being the protocol version supported by - the kernel and bootloader-version the protocol version - supported by the bootloader. - **** MEMORY LAYOUT The traditional memory map for the kernel loader, used for Image or
@@ -209,7 +197,6 @@ Offset Proto Name Meaning 0258/8 2.10+ pref_address Preferred loading address 0260/4 2.10+ init_size Linear memory required during initialization 0264/4 2.11+ handover_offset Offset of handover entry point -0268/8 2.14+ acpi_rsdp_addr Physical address of RSDP table (1) For backwards compatibility, if the setup_sects field contains 0, the real value is 4.
@@ -322,7 +309,7 @@ Protocol: 2.00+ Contains the magic number "HdrS" (0x53726448). Field name: version -Type: modify +Type: read Offset/size: 0x206/2 Protocol: 2.00+
@@ -330,12 +317,6 @@ Protocol: 2.00+ e.g. 0x0204 for version 2.04, and 0x0a11 for a hypothetical version 10.17. - Up to protocol version 2.13 this information is only read by the - bootloader. From protocol version 2.14 onwards the bootloader will - write the used protocol version or-ed with 0x8000 to the field. The - used protocol version will be the minimum of the supported protocol - versions of the bootloader and the kernel. - Field name: realmode_swtch Type: modify (optional) Offset/size: 0x208/4
@@ -763,17 +744,6 @@ Offset/size: 0x264/4 See EFI HANDOVER PROTOCOL below for more details. -Field name: acpi_rsdp_addr -Type: write -Offset/size: 0x268/8 -Protocol: 2.14+ - - This field can be set by the boot loader to tell the kernel the - physical address of the ACPI RSDP table. - - A value of 0 indicates the kernel should fall back to the standard - methods to locate the RSDP. - **** THE IMAGE CHECKSUM
arch/x86/boot/header.S +1 -5
@@ -300,7 +300,7 @@ _start: # Part 2 of the header, from the old setup.S .ascii "HdrS" # header signature - .word 0x020e # header version number (>= 0x0105) + .word 0x020d # header version number (>= 0x0105) # or else old loadlin-1.5 will fail) .globl realmode_swtch realmode_swtch: .word 0, 0 # default_switch, SETUPSEG
@@ -558,10 +558,6 @@ pref_address: .quad LOAD_PHYSICAL_ADDR # preferred load addr init_size: .long INIT_SIZE # kernel initialization size handover_offset: .long 0 # Filled in by build.c -acpi_rsdp_addr: .quad 0 # 64-bit physical pointer to the - # ACPI RSDP table, added with - # version 2.14 - # End of setup header ##################################################### .section ".entrytext", "ax"
arch/x86/include/asm/x86_init.h +0 -2
@@ -303,6 +303,4 @@ extern void x86_init_noop(void);extern void x86_init_uint_noop (unsigned int unused);extern bool x86_pnpbios_disabled (void ); -void x86_verify_bootdata_version (void ); -#endif
arch/x86/include/uapi/asm/bootparam.h +0 -4
@@ -16,9 +16,6 @@#define RAMDISK_PROMPT_FLAG 0x8000#define RAMDISK_LOAD_FLAG 0x4000 -/* version flags */ -#define VERSION_WRITTEN 0x8000 -/* loadflags */ #define LOADED_HIGH (1<<0)#define KASLR_FLAG (1<<1)
@@ -89,7 +86,6 @@ struct setup_header {__u64 pref_address;__u32 init_size;__u32 handover_offset; -__u64 acpi_rsdp_addr; } __attribute__((packed));struct sys_desc_table {
arch/x86/kernel/acpi/boot.c +1 -1
@@ -1776,5 +1776,5 @@ void __init arch_reserve_mem_area(acpi_physical_address addr, size_t size)u64 x86_default_get_root_pointer (void ) { -return boot_params.hdr.acpi_rsdp_addr; +return 0 ; }
arch/x86/kernel/head32.c +0 -1
@@ -37,7 +37,6 @@ asmlinkage __visible void __init i386_start_kernel(void)cr4_init_shadow ();sanitize_boot_params (&boot_params); -x86_verify_bootdata_version ();x86_early_init_platform_quirks ();
arch/x86/kernel/head64.c +0 -2
@@ -457,8 +457,6 @@ void __init x86_64_start_reservations(char *real_mode_data)if (!boot_params.hdr.version)copy_bootdata (__va (real_mode_data)); -x86_verify_bootdata_version (); -x86_early_init_platform_quirks ();switch (boot_params.hdr.hardware_subarch) {
arch/x86/kernel/setup.c +0 -17
@@ -1280,23 +1280,6 @@ void __init setup_arch(char **cmdline_p)unwind_init (); } -/* -* From boot protocol 2.14 onwards we expect the bootloader to set the -* version to "0x8000 | <used version>". In case we find a version >= 2.14 -* without the 0x8000 we assume the boot loader supports 2.13 only and -* reset the version accordingly. The 0x8000 flag is removed in any case. -*/ -void __init x86_verify_bootdata_version (void ) -{ -if (boot_params.hdr.version &VERSION_WRITTEN ) - boot_params.hdr.version &= ~VERSION_WRITTEN ; -else if (boot_params.hdr.version >=0x020e ) - boot_params.hdr.version =0x020d ; - -if (boot_params.hdr.version <0x020e ) - boot_params.hdr.acpi_rsdp_addr =0 ; -} -#ifdef CONFIG_X86_32 static struct resource video_ram_resource = {
Signature · 1 line
2.16.4
PATCH 2/2 x86/acpi, x86/boot: Take RSDP address from boot params if available
In reply to Juergen GrossIn case the RSDP address in struct boot_params is specified don't try to find the table by searching, but take the address directly as set by the boot loader.
--- arch/x86/include/uapi/asm/bootparam.h | 3 ++- arch/x86/kernel/acpi/boot.c | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-)
arch/x86/include/uapi/asm/bootparam.h +2 -1
@@ -155,7 +155,8 @@ struct boot_params {__u8 _pad2[4 ];/* 0x054 */ __u64 tboot_addr;/* 0x058 */ struct ist_info ist_info;/* 0x060 */ -__u8 _pad3[16 ];/* 0x070 */ +__u64 acpi_rsdp_addr;/* 0x070 */ +__u8 _pad3[8 ];/* 0x078 */ __u8 hd0_info[16 ];/* obsolete! */ /* 0x080 */ __u8 hd1_info[16 ];/* obsolete! */ /* 0x090 */ struct sys_desc_table sys_desc_table;/* obsolete! */ /* 0x0a0 */
arch/x86/kernel/acpi/boot.c +1 -1
@@ -1776,5 +1776,5 @@ void __init arch_reserve_mem_area(acpi_physical_address addr, size_t size)u64 x86_default_get_root_pointer (void ) { -return 0 ; +return boot_params.acpi_rsdp_addr; }
Signature · 7 lines
2.16.4 _______________________________________________ Xen-devel mailing list [email protected] https://lists.xenproject.org/mailman/listinfo/xen-devel
PATCH 2/2 x86/acpi, x86/boot: Take RSDP address from boot params if available
In reply to Juergen GrossIn case the RSDP address in struct boot_params is specified don't try to find the table by searching, but take the address directly as set by the boot loader.
--- arch/x86/include/uapi/asm/bootparam.h | 3 ++- arch/x86/kernel/acpi/boot.c | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-)
arch/x86/include/uapi/asm/bootparam.h +2 -1
@@ -155,7 +155,8 @@ struct boot_params {__u8 _pad2[4 ];/* 0x054 */ __u64 tboot_addr;/* 0x058 */ struct ist_info ist_info;/* 0x060 */ -__u8 _pad3[16 ];/* 0x070 */ +__u64 acpi_rsdp_addr;/* 0x070 */ +__u8 _pad3[8 ];/* 0x078 */ __u8 hd0_info[16 ];/* obsolete! */ /* 0x080 */ __u8 hd1_info[16 ];/* obsolete! */ /* 0x090 */ struct sys_desc_table sys_desc_table;/* obsolete! */ /* 0x0a0 */
arch/x86/kernel/acpi/boot.c +1 -1
@@ -1776,5 +1776,5 @@ void __init arch_reserve_mem_area(acpi_physical_address addr, size_t size)u64 x86_default_get_root_pointer (void ) { -return 0 ; +return boot_params.acpi_rsdp_addr; }
Signature · 1 line
2.16.4