lkml.org 
[lkml]   [2010]   [Jan]   [21]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[PATCH 2/3] x86: remove bios data range from e820
    From: Yinghai Lu <yinghai@kernel.org>

    To prepare move page_is_ram() as generic one.

    Tested-by: Wu Fengguang <fengguang.wu@intel.com>
    Signed-off-by: Yinghai Lu <yinghai@kernel.org>
    ---
    arch/x86/kernel/e820.c | 8 ++++++++
    arch/x86/kernel/setup.c | 19 ++++++++++++++++++-
    arch/x86/mm/ioremap.c | 16 ----------------
    3 files changed, 26 insertions(+), 17 deletions(-)

    --- linux-mm.orig/arch/x86/kernel/setup.c 2010-01-22 11:20:33.000000000 +0800
    +++ linux-mm/arch/x86/kernel/setup.c 2010-01-22 11:20:37.000000000 +0800
    @@ -659,6 +659,23 @@ static struct dmi_system_id __initdata b
    {}
    };

    +static void __init trim_bios_range(void)
    +{
    + /*
    + * A special case is the first 4Kb of memory;
    + * This is a BIOS owned area, not kernel ram, but generally
    + * not listed as such in the E820 table.
    + */
    + e820_update_range(0, PAGE_SIZE, E820_RAM, E820_RESERVED);
    + /*
    + * special case: Some BIOSen report the PC BIOS
    + * area (640->1Mb) as ram even though it is not.
    + * take them out.
    + */
    + e820_remove_range(BIOS_BEGIN, BIOS_END - BIOS_BEGIN, E820_RAM, 1);
    + sanitize_e820_map(e820.map, ARRAY_SIZE(e820.map), &e820.nr_map);
    +}
    +
    /*
    * Determine if we were loaded by an EFI loader. If so, then we have also been
    * passed the efi memmap, systab, etc., so we should use these data structures
    @@ -822,7 +839,7 @@ void __init setup_arch(char **cmdline_p)
    insert_resource(&iomem_resource, &data_resource);
    insert_resource(&iomem_resource, &bss_resource);

    -
    + trim_bios_range();
    #ifdef CONFIG_X86_32
    if (ppro_with_ram_bug()) {
    e820_update_range(0x70000000ULL, 0x40000ULL, E820_RAM,
    --- linux-mm.orig/arch/x86/kernel/e820.c 2010-01-22 11:20:33.000000000 +0800
    +++ linux-mm/arch/x86/kernel/e820.c 2010-01-22 11:20:37.000000000 +0800
    @@ -517,11 +517,19 @@ u64 __init e820_remove_range(u64 start,
    int checktype)
    {
    int i;
    + u64 end;
    u64 real_removed_size = 0;

    if (size > (ULLONG_MAX - start))
    size = ULLONG_MAX - start;

    + end = start + size;
    + printk(KERN_DEBUG "e820 remove range: %016Lx - %016Lx ",
    + (unsigned long long) start,
    + (unsigned long long) end);
    + e820_print_type(old_type);
    + printk(KERN_CONT "\n");
    +
    for (i = 0; i < e820.nr_map; i++) {
    struct e820entry *ei = &e820.map[i];
    u64 final_start, final_end;
    --- linux-mm.orig/arch/x86/mm/ioremap.c 2010-01-22 11:20:33.000000000 +0800
    +++ linux-mm/arch/x86/mm/ioremap.c 2010-01-22 11:20:37.000000000 +0800
    @@ -29,22 +29,6 @@ int page_is_ram(unsigned long pagenr)
    resource_size_t addr, end;
    int i;

    - /*
    - * A special case is the first 4Kb of memory;
    - * This is a BIOS owned area, not kernel ram, but generally
    - * not listed as such in the E820 table.
    - */
    - if (pagenr == 0)
    - return 0;
    -
    - /*
    - * Second special case: Some BIOSen report the PC BIOS
    - * area (640->1Mb) as ram even though it is not.
    - */
    - if (pagenr >= (BIOS_BEGIN >> PAGE_SHIFT) &&
    - pagenr < (BIOS_END >> PAGE_SHIFT))
    - return 0;
    -
    for (i = 0; i < e820.nr_map; i++) {
    /*
    * Not usable memory:



    \
     
     \ /
      Last update: 2010-01-22 04:33    [W:6.461 / U:0.032 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site