aboutsummaryrefslogtreecommitdiffstats
path: root/arch
diff options
context:
space:
mode:
authorH. Peter Anvin <hpa@zytor.com>2009-05-07 19:54:11 -0400
committerH. Peter Anvin <hpa@zytor.com>2009-05-11 20:45:06 -0400
commit5031296c57024a78ddad4edfc993367dbf4abb98 (patch)
tree7506daf7aabf25a5ec567fcd2e644fe22cd91eca /arch
parentfe83fcc0a14dcf71996de5eb84771b2369ba7abc (diff)
x86: add extension fields for bootloader type and version
A long ago, in days of yore, it all began with a god named Thor. There were vikings and boats and some plans for a Linux kernel header. Unfortunately, a single 8-bit field was used for bootloader type and version. This has generally worked without *too* much pain, but we're getting close to flat running out of ID fields. Add extension fields for both type and version. The type will be extended if it the old field is 0xE; the version is a simple MSB extension. Keep /proc/sys/kernel/bootloader_type containing (type << 4) + (ver & 0xf) for backwards compatiblity, but also add /proc/sys/kernel/bootloader_version which contains the full version number. [ Impact: new feature to support more bootloaders ] Signed-off-by: H. Peter Anvin <hpa@zytor.com>
Diffstat (limited to 'arch')
-rw-r--r--arch/x86/boot/header.S6
-rw-r--r--arch/x86/include/asm/bootparam.h3
-rw-r--r--arch/x86/include/asm/processor.h1
-rw-r--r--arch/x86/kernel/setup.c10
4 files changed, 16 insertions, 4 deletions
diff --git a/arch/x86/boot/header.S b/arch/x86/boot/header.S
index a0b426978d55..68c3bfbaff24 100644
--- a/arch/x86/boot/header.S
+++ b/arch/x86/boot/header.S
@@ -169,7 +169,11 @@ heap_end_ptr: .word _end+STACK_SIZE-512
169 # end of setup code can be used by setup 169 # end of setup code can be used by setup
170 # for local heap purposes. 170 # for local heap purposes.
171 171
172pad1: .word 0 172ext_loader_ver:
173 .byte 0 # Extended boot loader version
174ext_loader_type:
175 .byte 0 # Extended boot loader type
176
173cmd_line_ptr: .long 0 # (Header version 0x0202 or later) 177cmd_line_ptr: .long 0 # (Header version 0x0202 or later)
174 # If nonzero, a 32-bit pointer 178 # If nonzero, a 32-bit pointer
175 # to the kernel command line. 179 # to the kernel command line.
diff --git a/arch/x86/include/asm/bootparam.h b/arch/x86/include/asm/bootparam.h
index 433adaebf9b6..1724e8de317c 100644
--- a/arch/x86/include/asm/bootparam.h
+++ b/arch/x86/include/asm/bootparam.h
@@ -50,7 +50,8 @@ struct setup_header {
50 __u32 ramdisk_size; 50 __u32 ramdisk_size;
51 __u32 bootsect_kludge; 51 __u32 bootsect_kludge;
52 __u16 heap_end_ptr; 52 __u16 heap_end_ptr;
53 __u16 _pad1; 53 __u8 ext_loader_ver;
54 __u8 ext_loader_type;
54 __u32 cmd_line_ptr; 55 __u32 cmd_line_ptr;
55 __u32 initrd_addr_max; 56 __u32 initrd_addr_max;
56 __u32 kernel_alignment; 57 __u32 kernel_alignment;
diff --git a/arch/x86/include/asm/processor.h b/arch/x86/include/asm/processor.h
index fcf4d92e7e04..6384d25121ca 100644
--- a/arch/x86/include/asm/processor.h
+++ b/arch/x86/include/asm/processor.h
@@ -814,6 +814,7 @@ extern unsigned int BIOS_revision;
814 814
815/* Boot loader type from the setup header: */ 815/* Boot loader type from the setup header: */
816extern int bootloader_type; 816extern int bootloader_type;
817extern int bootloader_version;
817 818
818extern char ignore_fpu_irq; 819extern char ignore_fpu_irq;
819 820
diff --git a/arch/x86/kernel/setup.c b/arch/x86/kernel/setup.c
index b4158439bf63..2b093451aec9 100644
--- a/arch/x86/kernel/setup.c
+++ b/arch/x86/kernel/setup.c
@@ -214,8 +214,8 @@ unsigned long mmu_cr4_features;
214unsigned long mmu_cr4_features = X86_CR4_PAE; 214unsigned long mmu_cr4_features = X86_CR4_PAE;
215#endif 215#endif
216 216
217/* Boot loader ID as an integer, for the benefit of proc_dointvec */ 217/* Boot loader ID and version as integers, for the benefit of proc_dointvec */
218int bootloader_type; 218int bootloader_type, bootloader_version;
219 219
220/* 220/*
221 * Setup options 221 * Setup options
@@ -706,6 +706,12 @@ void __init setup_arch(char **cmdline_p)
706#endif 706#endif
707 saved_video_mode = boot_params.hdr.vid_mode; 707 saved_video_mode = boot_params.hdr.vid_mode;
708 bootloader_type = boot_params.hdr.type_of_loader; 708 bootloader_type = boot_params.hdr.type_of_loader;
709 if ((bootloader_type >> 4) == 0xe) {
710 bootloader_type &= 0xf;
711 bootloader_type |= (boot_params.hdr.ext_loader_type+0x10) << 4;
712 }
713 bootloader_version = bootloader_type & 0xf;
714 bootloader_version |= boot_params.hdr.ext_loader_ver << 4;
709 715
710#ifdef CONFIG_BLK_DEV_RAM 716#ifdef CONFIG_BLK_DEV_RAM
711 rd_image_start = boot_params.hdr.ram_size & RAMDISK_IMAGE_START_MASK; 717 rd_image_start = boot_params.hdr.ram_size & RAMDISK_IMAGE_START_MASK;