mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
From: Bryan Freed <bfreed@chromium.org>
To: linux-kernel@vger.kernel.org
Cc: akpm@linux-foundation.org, msb@chromium.org,
	marco.stornelli@gmail.com, seiji.aguchi@hds.com,
	Bryan Freed <bfreed@chromium.org>
Subject: [PATCH] ramoops: Add a device file for ramoops buffer access.
Date: Mon,  7 Nov 2011 16:06:00 -0800	[thread overview]
Message-ID: <1320710760-2734-1-git-send-email-bfreed@chromium.org> (raw)

Add a /dev/ramoops device file that gives direct access to ramoops buffers.
This interface is cleaner than using /dev/mem to access the buffers because
we no longer need to lseek() or (for ARM) mmap() to an address specified in
the sysfs mem_address file.

Signed-off-by: Bryan Freed <bfreed@chromium.org>
---
 drivers/char/ramoops.c |   43 ++++++++++++++++++++++++++++++++++++++++++-
 1 files changed, 42 insertions(+), 1 deletions(-)

diff --git a/drivers/char/ramoops.c b/drivers/char/ramoops.c
index 7c7f42a1f8..eac273a 100644
--- a/drivers/char/ramoops.c
+++ b/drivers/char/ramoops.c
@@ -32,6 +32,9 @@
 #include <linux/platform_device.h>
 #include <linux/slab.h>
 #include <linux/ramoops.h>
+#include <linux/fs.h>
+#include <linux/miscdevice.h>
+#include <linux/uaccess.h>
 
 #define RAMOOPS_KERNMSG_HDR "===="
 #define MIN_MEM_SIZE 4096UL
@@ -65,11 +68,39 @@ static struct ramoops_context {
 	int dump_oops;
 	int count;
 	int max_count;
+	struct miscdevice misc_dev;
 } oops_cxt;
 
 static struct platform_device *dummy;
 static struct ramoops_platform_data *dummy_data;
 
+static int ramoops_open(struct inode *inode, struct file *file)
+{
+	file->private_data = &oops_cxt;
+	return 0;
+}
+
+static ssize_t
+ramoops_read(struct file *file, char __user *buf, size_t count, loff_t *ppos)
+{
+	struct ramoops_context *cxt = file->private_data;
+	void *from = cxt->virt_addr + *ppos;
+
+	if (*ppos + count > cxt->size)
+		count = cxt->size - *ppos;
+	if (copy_to_user(buf, from, count))
+		count = -EFAULT;
+	else
+		*ppos += count;
+
+	return count;
+}
+
+static const struct file_operations ramoops_fops = {
+	.open = ramoops_open,
+	.read = ramoops_read,
+};
+
 static void ramoops_do_dump(struct kmsg_dumper *dumper,
 		enum kmsg_dump_reason reason, const char *s1, unsigned long l1,
 		const char *s2, unsigned long l2)
@@ -169,15 +200,24 @@ static int __init ramoops_probe(struct platform_device *pdev)
 		goto fail2;
 	}
 
+	cxt->misc_dev.minor = MISC_DYNAMIC_MINOR;
+	cxt->misc_dev.name = "ramoops";
+	cxt->misc_dev.fops = &ramoops_fops;
+	err = misc_register(&cxt->misc_dev);
+	if (err)
+		goto fail1;
+
 	cxt->dump.dump = ramoops_do_dump;
 	err = kmsg_dump_register(&cxt->dump);
 	if (err) {
 		pr_err("registering kmsg dumper failed\n");
-		goto fail1;
+		goto clean_misc;
 	}
 
 	return 0;
 
+clean_misc:
+	misc_deregister(&cxt->misc_dev);
 fail1:
 	iounmap(cxt->virt_addr);
 fail2:
@@ -193,6 +233,7 @@ static int __exit ramoops_remove(struct platform_device *pdev)
 	if (kmsg_dump_unregister(&cxt->dump) < 0)
 		pr_warn("could not unregister kmsg_dumper\n");
 
+	misc_deregister(&cxt->misc_dev);
 	iounmap(cxt->virt_addr);
 	release_mem_region(cxt->phys_addr, cxt->size);
 	return 0;
-- 
1.7.3.1


             reply	other threads:[~2011-11-08  0:06 UTC|newest]

Thread overview: 6+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2011-11-08  0:06 Bryan Freed [this message]
2011-11-08  0:14 ` Alan Cox
2011-11-08  0:36 ` Kees Cook
2011-11-08  1:04   ` Bryan Freed
2011-11-08  1:33     ` H. Peter Anvin
2011-11-08  7:58   ` Marco Stornelli

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=1320710760-2734-1-git-send-email-bfreed@chromium.org \
    --to=bfreed@chromium.org \
    --cc=akpm@linux-foundation.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=marco.stornelli@gmail.com \
    --cc=msb@chromium.org \
    --cc=seiji.aguchi@hds.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

all inboxes | Powered by JetHome®