From: Michael Holzheu <holzheu@linux.vnet.ibm.com>
To: vgoyal@redhat.com
Cc: oomichi@mxs.nes.nec.co.jp, linux-s390@vger.kernel.org,
mahesh@linux.vnet.ibm.com, heiko.carstens@de.ibm.com,
linux-kernel@vger.kernel.org, hbabu@us.ibm.com,
horms@verge.net.au, ebiederm@xmission.com,
schwidefsky@de.ibm.com, kexec@lists.infradead.org
Subject: [patch v2 08/10] s390: Add real memory access functions
Date: Wed, 27 Jul 2011 14:55:12 +0200 [thread overview]
Message-ID: <20110727125808.670392469@linux.vnet.ibm.com> (raw)
In-Reply-To: 20110727125504.491183728@linux.vnet.ibm.com
[-- Attachment #1: s390-kdump-arch-maccess.patch --]
[-- Type: text/plain, Size: 3744 bytes --]
From: Michael Holzheu <holzheu@linux.vnet.ibm.com>
Add access function for real memory needed by s390 kdump backend.
Signed-off-by: Michael Holzheu <holzheu@linux.vnet.ibm.com>
---
arch/s390/include/asm/system.h | 2 +
arch/s390/mm/maccess.c | 57 +++++++++++++++++++++++++++++++++++++++++
drivers/s390/char/zcore.c | 20 +-------------
3 files changed, 61 insertions(+), 18 deletions(-)
--- a/arch/s390/include/asm/system.h
+++ b/arch/s390/include/asm/system.h
@@ -114,6 +114,8 @@ extern void pfault_fini(void);
extern void cmma_init(void);
extern int memcpy_real(void *, void *, size_t);
extern void copy_to_absolute_zero(void *dest, void *src, size_t count);
+extern int copy_to_user_real(void __user *dest, void *src, size_t count);
+extern int copy_from_user_real(void *dest, void __user *src, size_t count);
#define finish_arch_switch(prev) do { \
set_fs(current->thread.mm_segment); \
--- a/arch/s390/mm/maccess.c
+++ b/arch/s390/mm/maccess.c
@@ -11,6 +11,7 @@
#include <linux/kernel.h>
#include <linux/types.h>
#include <linux/errno.h>
+#include <linux/gfp.h>
#include <asm/system.h>
/*
@@ -60,6 +61,9 @@ long probe_kernel_write(void *dst, const
return copied < 0 ? -EFAULT : 0;
}
+/*
+ * Copy memory in real mode (kernel to kernel)
+ */
int memcpy_real(void *dest, void *src, size_t count)
{
register unsigned long _dest asm("2") = (unsigned long) dest;
@@ -101,3 +105,56 @@ void copy_to_absolute_zero(void *dest, v
__ctl_load(cr0, 0, 0);
preempt_enable();
}
+
+/*
+ * Copy memory from kernel (real) to user (virtual)
+ */
+int copy_to_user_real(void __user *dest, void *src, size_t count)
+{
+ int offs = 0, size, rc;
+ char *buf;
+
+ buf = (char *) __get_free_page(GFP_KERNEL);
+ if (!buf)
+ return -ENOMEM;
+ rc = -EFAULT;
+ while (offs < count) {
+ size = min(PAGE_SIZE, count - offs);
+ if (memcpy_real(buf, src + offs, size))
+ goto out;
+ if (copy_to_user(dest + offs, buf, size))
+ goto out;
+ offs += size;
+ }
+ rc = 0;
+out:
+ free_page((unsigned long) buf);
+ return rc;
+}
+
+/*
+ * Copy memory from user (virtual) to kernel (real)
+ */
+int copy_from_user_real(void *dest, void __user *src, size_t count)
+{
+ int offs = 0, size, rc;
+ char *buf;
+
+ buf = (char *) __get_free_page(GFP_KERNEL);
+ if (!buf)
+ return -ENOMEM;
+ rc = -EFAULT;
+ while (offs < count) {
+ size = min(PAGE_SIZE, count - offs);
+ if (copy_from_user(buf, src + offs, size))
+ goto out;
+ if (memcpy_real(dest + offs, buf, size))
+ goto out;
+ offs += size;
+ }
+ rc = 0;
+out:
+ free_page((unsigned long) buf);
+ return rc;
+}
+
--- a/drivers/s390/char/zcore.c
+++ b/drivers/s390/char/zcore.c
@@ -142,22 +142,6 @@ static int memcpy_hsa_kernel(void *dest,
return memcpy_hsa(dest, src, count, TO_KERNEL);
}
-static int memcpy_real_user(void __user *dest, unsigned long src, size_t count)
-{
- static char buf[4096];
- int offs = 0, size;
-
- while (offs < count) {
- size = min(sizeof(buf), count - offs);
- if (memcpy_real(buf, (void *) src + offs, size))
- return -EFAULT;
- if (copy_to_user(dest + offs, buf, size))
- return -EFAULT;
- offs += size;
- }
- return 0;
-}
-
static int __init init_cpu_info(enum arch_id arch)
{
struct save_area *sa;
@@ -346,8 +330,8 @@ static ssize_t zcore_read(struct file *f
/* Copy from real mem */
size = count - mem_offs - hdr_count;
- rc = memcpy_real_user(buf + hdr_count + mem_offs, mem_start + mem_offs,
- size);
+ rc = copy_to_user_real(buf + hdr_count + mem_offs,
+ (void *) mem_start + mem_offs, size);
if (rc)
goto fail;
_______________________________________________
kexec mailing list
kexec@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/kexec
next prev parent reply other threads:[~2011-07-27 12:58 UTC|newest]
Thread overview: 33+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-07-27 12:55 [patch v2 00/10] kdump: Patch series for s390 support (version 2) Michael Holzheu
2011-07-27 12:55 ` [patch v2 01/10] kdump: Add KEXEC_CRASH_CONTROL_MEMORY_LIMIT Michael Holzheu
2011-08-01 20:16 ` Vivek Goyal
2011-08-02 9:51 ` Michael Holzheu
2011-08-02 19:16 ` Vivek Goyal
2011-08-03 9:27 ` Michael Holzheu
2011-07-27 12:55 ` [patch v2 02/10] kdump: Make kimage_load_crash_segment() weak Michael Holzheu
2011-08-01 20:31 ` Vivek Goyal
2011-08-02 9:30 ` Michael Holzheu
2011-08-02 18:55 ` Vivek Goyal
2011-08-03 10:41 ` Michael Holzheu
2011-08-04 20:25 ` Vivek Goyal
2011-07-27 12:55 ` [patch v2 03/10] kdump: Add size to elfcorehdr kernel parameter Michael Holzheu
2011-08-01 20:36 ` Vivek Goyal
2011-08-02 9:08 ` Michael Holzheu
2011-08-02 18:55 ` Vivek Goyal
2011-08-03 10:40 ` Michael Holzheu
2011-07-27 12:55 ` [patch v2 04/10] kdump: Trigger kdump via panic notifier chain on s390 Michael Holzheu
2011-08-01 20:41 ` Vivek Goyal
2011-08-02 8:37 ` Michael Holzheu
2011-08-02 19:21 ` Vivek Goyal
2011-08-03 9:50 ` Michael Holzheu
2011-08-04 21:14 ` Vivek Goyal
2011-08-08 17:47 ` Michael Holzheu
2011-08-09 21:19 ` Vivek Goyal
2011-07-27 12:55 ` [patch v2 05/10] s390: Add PSW restart shutdown trigger Michael Holzheu
2011-08-01 20:54 ` Vivek Goyal
2011-08-02 8:05 ` Michael Holzheu
2011-07-27 12:55 ` [patch v2 06/10] s390: Export store_status() function Michael Holzheu
2011-07-27 12:55 ` [patch v2 07/10] s390: Use diagnose 308 for system reset Michael Holzheu
2011-07-27 12:55 ` Michael Holzheu [this message]
2011-07-27 12:55 ` [patch v2 09/10] s390: kdump backend code Michael Holzheu
2011-07-27 12:55 ` [patch v2 10/10] kexec-tools: Add s390 kdump support Michael Holzheu
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20110727125808.670392469@linux.vnet.ibm.com \
--to=holzheu@linux.vnet.ibm.com \
--cc=ebiederm@xmission.com \
--cc=hbabu@us.ibm.com \
--cc=heiko.carstens@de.ibm.com \
--cc=horms@verge.net.au \
--cc=kexec@lists.infradead.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-s390@vger.kernel.org \
--cc=mahesh@linux.vnet.ibm.com \
--cc=oomichi@mxs.nes.nec.co.jp \
--cc=schwidefsky@de.ibm.com \
--cc=vgoyal@redhat.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox