diff options
-rw-r--r-- | arch/x86/kernel/e820_64.c | 8 | ||||
-rw-r--r-- | arch/x86/kernel/head64.c | 28 |
2 files changed, 27 insertions, 9 deletions
diff --git a/arch/x86/kernel/e820_64.c b/arch/x86/kernel/e820_64.c index 8b914a833ac..4a0953857cb 100644 --- a/arch/x86/kernel/e820_64.c +++ b/arch/x86/kernel/e820_64.c | |||
@@ -621,10 +621,10 @@ static int __init copy_e820_map(struct e820entry *biosmap, int nr_map) | |||
621 | return -1; | 621 | return -1; |
622 | 622 | ||
623 | do { | 623 | do { |
624 | unsigned long start = biosmap->addr; | 624 | u64 start = biosmap->addr; |
625 | unsigned long size = biosmap->size; | 625 | u64 size = biosmap->size; |
626 | unsigned long end = start + size; | 626 | u64 end = start + size; |
627 | unsigned long type = biosmap->type; | 627 | u32 type = biosmap->type; |
628 | 628 | ||
629 | /* Overflow in 64 bits? Ignore the memory map. */ | 629 | /* Overflow in 64 bits? Ignore the memory map. */ |
630 | if (start > end) | 630 | if (start > end) |
diff --git a/arch/x86/kernel/head64.c b/arch/x86/kernel/head64.c index b684552347d..269a6b481fe 100644 --- a/arch/x86/kernel/head64.c +++ b/arch/x86/kernel/head64.c | |||
@@ -55,12 +55,30 @@ static void __init copy_bootdata(char *real_mode_data) | |||
55 | /* | 55 | /* |
56 | * The BIOS places the EBDA/XBDA at the top of conventional | 56 | * The BIOS places the EBDA/XBDA at the top of conventional |
57 | * memory, and usually decreases the reported amount of | 57 | * memory, and usually decreases the reported amount of |
58 | * conventional memory (int 0x12) too. | 58 | * conventional memory (int 0x12) too. This also contains a |
59 | * workaround for Dell systems that neglect to reserve EBDA. | ||
60 | * The same workaround also avoids a problem with the AMD768MPX | ||
61 | * chipset: reserve a page before VGA to prevent PCI prefetch | ||
62 | * into it (errata #56). Usually the page is reserved anyways, | ||
63 | * unless you have no PS/2 mouse plugged in. | ||
59 | */ | 64 | */ |
60 | static __init void reserve_ebda(void) | 65 | static void __init reserve_ebda_region(void) |
61 | { | 66 | { |
62 | unsigned int lowmem, ebda_addr; | 67 | unsigned int lowmem, ebda_addr; |
63 | 68 | ||
69 | /* To determine the position of the EBDA and the */ | ||
70 | /* end of conventional memory, we need to look at */ | ||
71 | /* the BIOS data area. In a paravirtual environment */ | ||
72 | /* that area is absent. We'll just have to assume */ | ||
73 | /* that the paravirt case can handle memory setup */ | ||
74 | /* correctly, without our help. */ | ||
75 | #ifdef CONFIG_PARAVIRT | ||
76 | if ((boot_params.hdr.version >= 0x207) && | ||
77 | (boot_params.hdr.hardware_subarch != 0)) { | ||
78 | return; | ||
79 | } | ||
80 | #endif | ||
81 | |||
64 | /* end of low (conventional) memory */ | 82 | /* end of low (conventional) memory */ |
65 | lowmem = *(unsigned short *)__va(BIOS_LOWMEM_KILOBYTES); | 83 | lowmem = *(unsigned short *)__va(BIOS_LOWMEM_KILOBYTES); |
66 | lowmem <<= 10; | 84 | lowmem <<= 10; |
@@ -80,8 +98,8 @@ static __init void reserve_ebda(void) | |||
80 | lowmem = 0x9f000; | 98 | lowmem = 0x9f000; |
81 | 99 | ||
82 | /* Paranoia: should never happen, but... */ | 100 | /* Paranoia: should never happen, but... */ |
83 | if (lowmem >= 0x100000) | 101 | if ((lowmem == 0) || (lowmem >= 0x100000)) |
84 | lowmem = 0xa0000; | 102 | lowmem = 0x9f000; |
85 | 103 | ||
86 | /* reserve all memory between lowmem and the 1MB mark */ | 104 | /* reserve all memory between lowmem and the 1MB mark */ |
87 | reserve_early(lowmem, 0x100000, "BIOS reserved"); | 105 | reserve_early(lowmem, 0x100000, "BIOS reserved"); |
@@ -140,7 +158,7 @@ void __init x86_64_start_kernel(char * real_mode_data) | |||
140 | reserve_early(ramdisk_image, ramdisk_end, "RAMDISK"); | 158 | reserve_early(ramdisk_image, ramdisk_end, "RAMDISK"); |
141 | } | 159 | } |
142 | 160 | ||
143 | reserve_ebda(); | 161 | reserve_ebda_region(); |
144 | 162 | ||
145 | /* | 163 | /* |
146 | * At this point everything still needed from the boot loader | 164 | * At this point everything still needed from the boot loader |