lkml.org 
[lkml]   [2007]   [Jul]   [11]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[x86 setup 25/33] Memory probing support for the new x86 setup code
    Date
    From: H. Peter Anvin <hpa@zytor.com>

    Probe memory (INT 15h: E820, E801, 88).

    Signed-off-by: H. Peter Anvin <hpa@zytor.com>
    ---
    arch/i386/boot/memory.c | 99 +++++++++++++++++++++++++++++++++++++++++++++++
    1 files changed, 99 insertions(+), 0 deletions(-)
    create mode 100644 arch/i386/boot/memory.c
    diff --git a/arch/i386/boot/memory.c b/arch/i386/boot/memory.c
    new file mode 100644
    index 0000000..1a2e62d
    --- /dev/null
    +++ b/arch/i386/boot/memory.c
    @@ -0,0 +1,99 @@
    +/* -*- linux-c -*- ------------------------------------------------------- *
    + *
    + * Copyright (C) 1991, 1992 Linus Torvalds
    + * Copyright 2007 rPath, Inc. - All Rights Reserved
    + *
    + * This file is part of the Linux kernel, and is made available under
    + * the terms of the GNU General Public License version 2.
    + *
    + * ----------------------------------------------------------------------- */
    +
    +/*
    + * arch/i386/boot/memory.c
    + *
    + * Memory detection code
    + */
    +
    +#include "boot.h"
    +
    +#define SMAP 0x534d4150 /* ASCII "SMAP" */
    +
    +static int detect_memory_e820(void)
    +{
    + u32 next = 0;
    + u32 size, id;
    + u8 err;
    + struct e820entry *desc = boot_params.e820_map;
    +
    + do {
    + size = sizeof(struct e820entry);
    + id = SMAP;
    + asm("int $0x15; setc %0"
    + : "=am" (err), "+b" (next), "+d" (id), "+c" (size),
    + "=m" (*desc)
    + : "D" (desc), "a" (0xe820));
    +
    + if (err || id != SMAP)
    + break;
    +
    + boot_params.e820_entries++;
    + desc++;
    + } while (next && boot_params.e820_entries < E820MAX);
    +
    + return boot_params.e820_entries;
    +}
    +
    +static int detect_memory_e801(void)
    +{
    + u16 ax, bx, cx, dx;
    + u8 err;
    +
    + bx = cx = dx = 0;
    + ax = 0xe801;
    + asm("stc; int $0x15; setc %0"
    + : "=m" (err), "+a" (ax), "+b" (bx), "+c" (cx), "+d" (dx));
    +
    + if (err)
    + return -1;
    +
    + /* Do we really need to do this? */
    + if (cx || dx) {
    + ax = cx;
    + bx = dx;
    + }
    +
    + if (ax > 15*1024)
    + return -1; /* Bogus! */
    +
    + /* This ignores memory above 16MB if we have a memory hole
    + there. If someone actually finds a machine with a memory
    + hole at 16MB and no support for 0E820h they should probably
    + generate a fake e820 map. */
    + boot_params.alt_mem_k = (ax == 15*1024) ? (dx << 6)+ax : ax;
    +
    + return 0;
    +}
    +
    +static int detect_memory_88(void)
    +{
    + u16 ax;
    + u8 err;
    +
    + ax = 0x8800;
    + asm("stc; int $0x15; setc %0" : "=bcdm" (err), "+a" (ax));
    +
    + boot_params.screen_info.ext_mem_k = ax;
    +
    + return -err;
    +}
    +
    +int detect_memory(void)
    +{
    + if (detect_memory_e820() > 0)
    + return 0;
    +
    + if (!detect_memory_e801())
    + return 0;
    +
    + return detect_memory_88();
    +}
    --
    1.5.2.2
    -
    To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
    the body of a message to majordomo@vger.kernel.org
    More majordomo info at http://vger.kernel.org/majordomo-info.html
    Please read the FAQ at http://www.tux.org/lkml/

    \
     
     \ /
      Last update: 2007-07-11 21:33    [from the cache]
    ©2003-2014 Jasper Spaans. Advertise on this site