Skip to content

Commit

Permalink
[PATCH] kdump: cleanups for dump file access in linear raw format
Browse files Browse the repository at this point in the history
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 <vgoyal@in.ibm.com>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
  • Loading branch information
Vivek Goyal authored and Linus Torvalds committed Jun 25, 2005
1 parent 50b1fdb commit 315c215
Showing 1 changed file with 15 additions and 36 deletions.
51 changes: 15 additions & 36 deletions drivers/char/mem.c
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@
#include <linux/highmem.h>
#include <linux/crash_dump.h>
#include <linux/backing-dev.h>
#include <linux/bootmem.h>

#include <asm/uaccess.h>
#include <asm/io.h>
Expand Down Expand Up @@ -278,55 +279,33 @@ static int mmap_kmem(struct file * file, struct vm_area_struct * vma)
#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
Expand Down

0 comments on commit 315c215

Please sign in to comment.