diff options
Diffstat (limited to 'arch/x86/kernel/e820.c')
| -rw-r--r-- | arch/x86/kernel/e820.c | 23 | 
1 files changed, 13 insertions, 10 deletions
| diff --git a/arch/x86/kernel/e820.c b/arch/x86/kernel/e820.c index 7271fa33d791..5cb5725b2bae 100644 --- a/arch/x86/kernel/e820.c +++ b/arch/x86/kernel/e820.c | |||
| @@ -627,10 +627,9 @@ __init void e820_setup_gap(void) | |||
| 627 | #ifdef CONFIG_X86_64 | 627 | #ifdef CONFIG_X86_64 | 
| 628 | if (!found) { | 628 | if (!found) { | 
| 629 | gapstart = (max_pfn << PAGE_SHIFT) + 1024*1024; | 629 | gapstart = (max_pfn << PAGE_SHIFT) + 1024*1024; | 
| 630 | printk(KERN_ERR "PCI: Warning: Cannot find a gap in the 32bit " | 630 | printk(KERN_ERR | 
| 631 | "address range\n" | 631 | "PCI: Warning: Cannot find a gap in the 32bit address range\n" | 
| 632 | KERN_ERR "PCI: Unassigned devices with 32bit resource " | 632 | "PCI: Unassigned devices with 32bit resource registers may break!\n"); | 
| 633 | "registers may break!\n"); | ||
| 634 | } | 633 | } | 
| 635 | #endif | 634 | #endif | 
| 636 | 635 | ||
| @@ -1383,6 +1382,8 @@ static unsigned long ram_alignment(resource_size_t pos) | |||
| 1383 | return 32*1024*1024; | 1382 | return 32*1024*1024; | 
| 1384 | } | 1383 | } | 
| 1385 | 1384 | ||
| 1385 | #define MAX_RESOURCE_SIZE ((resource_size_t)-1) | ||
| 1386 | |||
| 1386 | void __init e820_reserve_resources_late(void) | 1387 | void __init e820_reserve_resources_late(void) | 
| 1387 | { | 1388 | { | 
| 1388 | int i; | 1389 | int i; | 
| @@ -1400,17 +1401,19 @@ void __init e820_reserve_resources_late(void) | |||
| 1400 | * avoid stolen RAM: | 1401 | * avoid stolen RAM: | 
| 1401 | */ | 1402 | */ | 
| 1402 | for (i = 0; i < e820.nr_map; i++) { | 1403 | for (i = 0; i < e820.nr_map; i++) { | 
| 1403 | struct e820entry *entry = &e820_saved.map[i]; | 1404 | struct e820entry *entry = &e820.map[i]; | 
| 1404 | resource_size_t start, end; | 1405 | u64 start, end; | 
| 1405 | 1406 | ||
| 1406 | if (entry->type != E820_RAM) | 1407 | if (entry->type != E820_RAM) | 
| 1407 | continue; | 1408 | continue; | 
| 1408 | start = entry->addr + entry->size; | 1409 | start = entry->addr + entry->size; | 
| 1409 | end = round_up(start, ram_alignment(start)); | 1410 | end = round_up(start, ram_alignment(start)) - 1; | 
| 1410 | if (start == end) | 1411 | if (end > MAX_RESOURCE_SIZE) | 
| 1412 | end = MAX_RESOURCE_SIZE; | ||
| 1413 | if (start >= end) | ||
| 1411 | continue; | 1414 | continue; | 
| 1412 | reserve_region_with_split(&iomem_resource, start, | 1415 | reserve_region_with_split(&iomem_resource, start, end, | 
| 1413 | end - 1, "RAM buffer"); | 1416 | "RAM buffer"); | 
| 1414 | } | 1417 | } | 
| 1415 | } | 1418 | } | 
| 1416 | 1419 | ||
