~ubuntu-branches/ubuntu/precise/linux-lowlatency/precise

« back to all changes in this revision

Viewing changes to arch/sh/kernel/crash_dump.c

  • Committer: Package Import Robot
  • Author(s): Alessio Igor Bogani
  • Date: 2011-10-26 11:13:05 UTC
  • Revision ID: package-import@ubuntu.com-20111026111305-tz023xykf0i6eosh
Tags: upstream-3.2.0
ImportĀ upstreamĀ versionĀ 3.2.0

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/*
 
2
 *      crash_dump.c - Memory preserving reboot related code.
 
3
 *
 
4
 *      Created by: Hariprasad Nellitheertha (hari@in.ibm.com)
 
5
 *      Copyright (C) IBM Corporation, 2004. All rights reserved
 
6
 */
 
7
#include <linux/errno.h>
 
8
#include <linux/crash_dump.h>
 
9
#include <linux/io.h>
 
10
#include <asm/uaccess.h>
 
11
 
 
12
/**
 
13
 * copy_oldmem_page - copy one page from "oldmem"
 
14
 * @pfn: page frame number to be copied
 
15
 * @buf: target memory address for the copy; this can be in kernel address
 
16
 *      space or user address space (see @userbuf)
 
17
 * @csize: number of bytes to copy
 
18
 * @offset: offset in bytes into the page (based on pfn) to begin the copy
 
19
 * @userbuf: if set, @buf is in user address space, use copy_to_user(),
 
20
 *      otherwise @buf is in kernel address space, use memcpy().
 
21
 *
 
22
 * Copy a page from "oldmem". For this page, there is no pte mapped
 
23
 * in the current kernel. We stitch up a pte, similar to kmap_atomic.
 
24
 */
 
25
ssize_t copy_oldmem_page(unsigned long pfn, char *buf,
 
26
                               size_t csize, unsigned long offset, int userbuf)
 
27
{
 
28
        void  *vaddr;
 
29
 
 
30
        if (!csize)
 
31
                return 0;
 
32
 
 
33
        vaddr = ioremap(pfn << PAGE_SHIFT, PAGE_SIZE);
 
34
 
 
35
        if (userbuf) {
 
36
                if (copy_to_user(buf, (vaddr + offset), csize)) {
 
37
                        iounmap(vaddr);
 
38
                        return -EFAULT;
 
39
                }
 
40
        } else
 
41
        memcpy(buf, (vaddr + offset), csize);
 
42
 
 
43
        iounmap(vaddr);
 
44
        return csize;
 
45
}