Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

[PATCH] Increase number of e820 entries hard limit from 32 to 128

The specifications that talk about E820 map doesn't have an upper limit on
the number of e820 entries. But, today's kernel has a hard limit of 32.
With increase in memory size, we are seeing the number of E820 entries
reaching close to 32. Patch below bumps the number upto 128.

The patch changes the location of EDDBUF in zero-page (as it comes after E820).
As, EDDBUF is not used by boot loaders, this patch should not have any effect
on bootloader-setup code interface.

Patch covers both i386 and x86-64.

Tested on:
* grub booting bzImage
* lilo booting bzImage with EDID info enabled
* pxeboot of bzImage

Side-effect:
bss increases by ~ 2K and init.data increases by ~7.5K
on all systems, due to increase in size of static arrays.

Signed-off-by: Venkatesh Pallipadi <venkatesh.pallipadi@intel.com>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>

authored by

Venkatesh Pallipadi and committed by
Linus Torvalds
f9ba7053 be9e6870

+18 -18
+3 -3
Documentation/i386/zero-page.txt
··· 79 79 0x22c unsigned long ramdisk_max 80 80 0x230 16 bytes trampoline 81 81 0x290 - 0x2cf EDD_MBR_SIG_BUFFER (edd.S) 82 - 0x2d0 - 0x600 E820MAP 83 - 0x600 - 0x7ff EDDBUF (edd.S) for disk signature read sector 84 - 0x600 - 0x7eb EDDBUF (edd.S) for edd data 82 + 0x2d0 - 0xd00 E820MAP 83 + 0xd00 - 0xeff EDDBUF (edd.S) for disk signature read sector 84 + 0xd00 - 0xeeb EDDBUF (edd.S) for edd data
+3 -3
arch/i386/boot/setup.S
··· 164 164 trampoline: call start_of_setup 165 165 .align 16 166 166 # The offset at this point is 0x240 167 - .space (0x7ff-0x240+1) # E820 & EDD space (ending at 0x7ff) 167 + .space (0xeff-0x240+1) # E820 & EDD space (ending at 0xeff) 168 168 # End of setup header ##################################################### 169 169 170 170 start_of_setup: ··· 333 333 # sizeof(e820rec). 334 334 # 335 335 good820: 336 - movb (E820NR), %al # up to 32 entries 336 + movb (E820NR), %al # up to 128 entries 337 337 cmpb $E820MAX, %al 338 - jnl bail820 338 + jae bail820 339 339 340 340 incb (E820NR) 341 341 movw %di, %ax
+3 -3
arch/x86_64/boot/setup.S
··· 160 160 trampoline: call start_of_setup 161 161 .align 16 162 162 # The offset at this point is 0x240 163 - .space (0x7ff-0x240+1) # E820 & EDD space (ending at 0x7ff) 163 + .space (0xeff-0x240+1) # E820 & EDD space (ending at 0xeff) 164 164 # End of setup header ##################################################### 165 165 166 166 start_of_setup: ··· 412 412 # sizeof(e820rec). 413 413 # 414 414 good820: 415 - movb (E820NR), %al # up to 32 entries 415 + movb (E820NR), %al # up to 128 entries 416 416 cmpb $E820MAX, %al 417 - jnl bail820 417 + jae bail820 418 418 419 419 incb (E820NR) 420 420 movw %di, %ax
+1 -3
arch/x86_64/kernel/head64.c
··· 29 29 (unsigned long) __bss_end - (unsigned long) __bss_start); 30 30 } 31 31 32 - extern char x86_boot_params[2048]; 33 - 34 32 #define NEW_CL_POINTER 0x228 /* Relative to real mode data */ 35 33 #define OLD_CL_MAGIC_ADDR 0x90020 36 34 #define OLD_CL_MAGIC 0xA33F ··· 42 44 int new_data; 43 45 char * command_line; 44 46 45 - memcpy(x86_boot_params, real_mode_data, 2048); 47 + memcpy(x86_boot_params, real_mode_data, BOOT_PARAM_SIZE); 46 48 new_data = *(int *) (x86_boot_params + NEW_CL_POINTER); 47 49 if (!new_data) { 48 50 if (OLD_CL_MAGIC != * (u16 *) OLD_CL_MAGIC_ADDR) {
+2 -1
arch/x86_64/kernel/setup64.c
··· 12 12 #include <linux/string.h> 13 13 #include <linux/bootmem.h> 14 14 #include <linux/bitops.h> 15 + #include <asm/bootsetup.h> 15 16 #include <asm/pda.h> 16 17 #include <asm/pgtable.h> 17 18 #include <asm/processor.h> ··· 27 26 #include <asm/mman.h> 28 27 #include <asm/numa.h> 29 28 30 - char x86_boot_params[2048] __initdata = {0,}; 29 + char x86_boot_params[BOOT_PARAM_SIZE] __initdata = {0,}; 31 30 32 31 cpumask_t cpu_initialized __initdata = CPU_MASK_NONE; 33 32
+1 -1
include/asm-i386/e820.h
··· 13 13 #define __E820_HEADER 14 14 15 15 #define E820MAP 0x2d0 /* our map */ 16 - #define E820MAX 32 /* number of entries in E820MAP */ 16 + #define E820MAX 128 /* number of entries in E820MAP */ 17 17 #define E820NR 0x1e8 /* # entries in E820MAP */ 18 18 19 19 #define E820_RAM 1
+1 -1
include/asm-i386/setup.h
··· 16 16 #define MAXMEM_PFN PFN_DOWN(MAXMEM) 17 17 #define MAX_NONPAE_PFN (1 << 20) 18 18 19 - #define PARAM_SIZE 2048 19 + #define PARAM_SIZE 4096 20 20 #define COMMAND_LINE_SIZE 256 21 21 22 22 #define OLD_CL_MAGIC_ADDR 0x90020
+2 -1
include/asm-x86_64/bootsetup.h
··· 2 2 #ifndef _X86_64_BOOTSETUP_H 3 3 #define _X86_64_BOOTSETUP_H 1 4 4 5 - extern char x86_boot_params[2048]; 5 + #define BOOT_PARAM_SIZE 4096 6 + extern char x86_boot_params[BOOT_PARAM_SIZE]; 6 7 7 8 /* 8 9 * This is set up by the setup-routine at boot-time
+1 -1
include/asm-x86_64/e820.h
··· 14 14 #include <linux/mmzone.h> 15 15 16 16 #define E820MAP 0x2d0 /* our map */ 17 - #define E820MAX 32 /* number of entries in E820MAP */ 17 + #define E820MAX 128 /* number of entries in E820MAP */ 18 18 #define E820NR 0x1e8 /* # entries in E820MAP */ 19 19 20 20 #define E820_RAM 1
+1 -1
include/linux/edd.h
··· 32 32 33 33 #define EDDNR 0x1e9 /* addr of number of edd_info structs at EDDBUF 34 34 in boot_params - treat this as 1 byte */ 35 - #define EDDBUF 0x600 /* addr of edd_info structs in boot_params */ 35 + #define EDDBUF 0xd00 /* addr of edd_info structs in boot_params */ 36 36 #define EDDMAXNR 6 /* number of edd_info structs starting at EDDBUF */ 37 37 #define EDDEXTSIZE 8 /* change these if you muck with the structures */ 38 38 #define EDDPARMSIZE 74