From: Vivek Goyal Removed the dependency on backup region. Now all the information is encoded in ELF format. /dev/oldmem is a dummy interface. User space tool need to be intelligent enough to parse the elf headers and read the relevant memory areas with the help of /dev/oldmem. Signed-off-by: Vivek Goyal Signed-off-by: Andrew Morton --- 25-akpm/drivers/char/mem.c | 51 +++++++++++++-------------------------------- 1 files changed, 15 insertions(+), 36 deletions(-) diff -puN drivers/char/mem.c~kdump-cleanups-for-dump-file-access-in-linear drivers/char/mem.c --- 25/drivers/char/mem.c~kdump-cleanups-for-dump-file-access-in-linear 2005-03-28 18:03:34.000000000 -0800 +++ 25-akpm/drivers/char/mem.c 2005-03-28 18:03:34.000000000 -0800 @@ -26,6 +26,7 @@ #include #include #include +#include #include #include @@ -278,55 +279,33 @@ static int mmap_kmem(struct file * file, #ifdef CONFIG_CRASH_DUMP /* * Read memory corresponding to the old kernel. - * If we are reading from the reserved section, which is - * actually used by the current kernel, we just return zeroes. - * Or if we are reading from the first 640k, we return from the - * backed up area. */ -static ssize_t read_oldmem(struct file * file, char * buf, +static ssize_t read_oldmem(struct file *file, char __user *buf, size_t count, loff_t *ppos) { - unsigned long pfn; - unsigned backup_start, backup_end, relocate_start; - size_t read=0, csize; - - backup_start = CRASH_BACKUP_BASE / PAGE_SIZE; - backup_end = backup_start + (CRASH_BACKUP_SIZE / PAGE_SIZE); - relocate_start = (CRASH_BACKUP_BASE + CRASH_BACKUP_SIZE) / PAGE_SIZE; + unsigned long pfn, offset; + size_t read = 0, csize; + int rc = 0; while(count) { pfn = *ppos / PAGE_SIZE; + if (pfn > saved_max_pfn) + return read; - csize = (count > PAGE_SIZE) ? PAGE_SIZE : count; - - /* Perform translation (see comment above) */ - if ((pfn >= backup_start) && (pfn < backup_end)) { - if (clear_user(buf, csize)) { - read = -EFAULT; - goto done; - } - - goto copy_done; - } else if (pfn < (CRASH_RELOCATE_SIZE / PAGE_SIZE)) - pfn += relocate_start; - - if (pfn > saved_max_pfn) { - read = 0; - goto done; - } - - if (copy_oldmem_page(pfn, buf, csize, 1)) { - read = -EFAULT; - goto done; - } + offset = (unsigned long)(*ppos % PAGE_SIZE); + if (count > PAGE_SIZE - offset) + csize = PAGE_SIZE - offset; + else + csize = count; -copy_done: + rc = copy_oldmem_page(pfn, buf, csize, offset, 1); + if (rc < 0) + return rc; buf += csize; *ppos += csize; read += csize; count -= csize; } -done: return read; } #endif _