diff -Nru a/arch/i386/Kconfig b/arch/i386/Kconfig --- a/arch/i386/Kconfig Thu Nov 21 12:59:44 2002 +++ b/arch/i386/Kconfig Thu Nov 21 12:59:44 2002 @@ -636,6 +636,11 @@ with major 203 and minors 0 to 31 for /dev/cpu/0/cpuid to /dev/cpu/31/cpuid. +config E820_PROC + bool 'E820 proc support' + help + This exports the BIOS memory map. It is used by kexec + config EDD tristate "BIOS Enhanced Disk Drive calls determine boot disk (EXPERIMENTAL)" depends on EXPERIMENTAL diff -Nru a/arch/i386/kernel/Makefile b/arch/i386/kernel/Makefile --- a/arch/i386/kernel/Makefile Thu Nov 21 12:59:44 2002 +++ b/arch/i386/kernel/Makefile Thu Nov 21 12:59:44 2002 @@ -14,6 +14,7 @@ obj-y += timers/ obj-$(CONFIG_X86_BIOS_REBOOT) += reboot.o obj-$(CONFIG_MCA) += mca.o +obj-$(CONFIG_E820_PROC) += e820.o obj-$(CONFIG_X86_MSR) += msr.o obj-$(CONFIG_X86_CPUID) += cpuid.o obj-$(CONFIG_MICROCODE) += microcode.o diff -Nru a/arch/i386/kernel/e820.c b/arch/i386/kernel/e820.c --- /dev/null Wed Dec 31 16:00:00 1969 +++ b/arch/i386/kernel/e820.c Thu Nov 21 12:59:44 2002 @@ -0,0 +1,98 @@ +/* Copyright (c) 2001 Red Hat, Inc. All rights reserved. + * This software may be freely redistributed under the terms of the + * GNU General Public License. + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + * + * Author: Arjan van de Ven + */ +#include +#include +#include /* for module_init/exit */ +#include +#include +#include +#include +#include + +#include + +static void* e820info_start(struct seq_file *m, loff_t *pos) +{ + if ((unsigned long long)*pos < e820.nr_map ) + return (void *)(unsigned long)((*pos)+1); + else + return NULL; + +} + +static void* e820info_next(struct seq_file *m, void *arg, loff_t *pos) +{ + (*pos)++; + return e820info_start(m, pos); +} + +static int e820info_show(struct seq_file *m, void *arg) +{ + unsigned long off = (unsigned long)arg - 1; + + seq_printf(m, "%016Lx @ %016Lx %lu\n", + e820.map[off].size, + e820.map[off].addr, + e820.map[off].type); + + return 0; +} + +static void e820info_stop(struct seq_file *m, void *arg) +{ + kfree(m->private); + m->private = NULL; +} + +static struct seq_operations e820info_op = { + .start = e820info_start, + .next = e820info_next, + .stop = e820info_stop, + .show = e820info_show, +}; + +extern struct seq_operations e820info_op; +static int e820info_open(struct inode *inode, struct file *file) +{ + return seq_open(file, &e820info_op); +} +static struct file_operations proc_e820info_operations = { + .open = e820info_open, + .read = seq_read, + .llseek = seq_lseek, + .release = seq_release, +}; + +extern struct e820map e820; +struct proc_dir_entry *e820_proc_entry; + +int e820_module_init(void) +{ + /* /proc/e820info probably isn't the best place for it, need + to find a better one */ + e820_proc_entry = create_proc_entry ("e820info", 0, NULL); + if (e820_proc_entry==NULL) + return -EIO; + + e820_proc_entry->owner = THIS_MODULE; + e820_proc_entry->proc_fops = &proc_e820info_operations; + + return 0; +} + +void e820_module_exit(void) +{ + remove_proc_entry ("e820info", e820_proc_entry); +} + +module_init(e820_module_init); +module_exit(e820_module_exit); +