/proc/residual (CONFIG_PREP_PROCRESIDUAL)
Tom Rini
trini at kernel.crashing.org
Tue Jan 29 03:08:22 EST 2002
Hey all. Here's a version of the /proc/residual patch (originally by
David Monro, updated for 2.4 by Sven Dickert) vs current 2_4_devel.
This is slightly different than the previous versions that've been
floating around:
1) It can't be a module now. After talking to Al Viro, doing /proc
stuff in a module correctly is a giant PITA (it wasn't working in the
previous versions I don't think...)
2) Use __initcall() instead of editing fs/proc/root.c. This should make
it easier to run past Marcelo/Linus, since it only touches PPC-specific
things (and the help file).
3) I cleaned up the DPRINTK() macros slightly in a few places.
In some quick testing on my machine, I always got the same image file
(md5'ed). Can a few more people try this and make sure it still works
for them? Thanks.
--
Tom Rini (TR1265)
http://gate.crashing.org/~trini/
===== Documentation/Configure.help 1.109 vs edited =====
--- 1.109/Documentation/Configure.help Wed Jan 23 18:06:24 2002
+++ edited/Documentation/Configure.help Mon Jan 28 08:25:59 2002
@@ -14413,6 +14413,14 @@
Unless you expect to boot on a PReP system, there is not need to
select Y.
+PReP residual data avaiable in /proc/residual
+CONFIG_PROC_PREPRESIDUAL
+ Enabling this option will create a /proc/residual file which allows
+ you to get at the residual data on PReP systems (the data the firmware
+ passes to the kernel describing the system. You will need a tool
+ (lsresidual) to parse it. If you aren't on a PReP system, you don't
+ want this. It is also available as a module (prep_residual.o).
+
/dev file system support
CONFIG_DEVFS_FS
This is support for devfs, a virtual file system (like /proc) which
===== arch/ppc/config.in 1.114 vs edited =====
--- 1.114/arch/ppc/config.in Sun Jan 20 13:30:26 2002
+++ edited/arch/ppc/config.in Mon Jan 28 08:25:59 2002
@@ -393,6 +393,7 @@
bool 'Support for Open Firmware device tree in /proc' CONFIG_PROC_DEVICETREE
bool 'Support for RTAS (RunTime Abstraction Services) in /proc' CONFIG_PPC_RTAS
bool 'Support for PReP Residual Data' CONFIG_PREP_RESIDUAL
+ dep_bool ' Support for reading of PReP Residual data in /proc' CONFIG_PROC_PREPRESIDUAL $CONFIG_PREP_RESIDUAL
fi
bool 'Default bootloader kernel arguments' CONFIG_CMDLINE_BOOL
===== arch/ppc/platforms/Makefile 1.15 vs edited =====
--- 1.15/arch/ppc/platforms/Makefile Sat Jan 26 17:32:42 2002
+++ edited/arch/ppc/platforms/Makefile Mon Jan 28 08:26:25 2002
@@ -49,6 +49,7 @@
obj-$(CONFIG_PMAC_PBOOK) += sleep.o
obj-$(CONFIG_PPC_RTAS) += error_log.o proc_rtas.o
obj-$(CONFIG_PREP_RESIDUAL) += residual.o
+obj-$(CONFIG_PROC_PREPRESIDUAL) += prep_procresidual.o
obj-$(CONFIG_ADIR) += adir_setup.o adir_pic.o adir_pci.o
obj-$(CONFIG_EV64260) += ev64260_setup.o
obj-$(CONFIG_GEMINI) += gemini_pci.o gemini_setup.o gemini_prom.o
--- a/dev/null Wed Dec 31 17:00:00 1969
+++ b/arch/ppc/platforms/prep_procresidual.c Mon Jan 28 08:25:59 2002
@@ -0,0 +1,105 @@
+/*
+ * linux/arch/ppc/platforms/prep_procresidual.c
+ *
+ * Copyright (C) 2000 by David Monro
+ * Ported to linux 2.4 by Sven Dickert 2001
+ * Additional cleanups by Tom Rini, Jan 26 2002.
+ *
+ */
+
+#include <linux/types.h>
+#include <linux/errno.h>
+#include <linux/sched.h>
+#include <linux/kernel.h>
+#include <linux/proc_fs.h>
+#include <linux/init.h>
+
+#include <asm/residual.h>
+#include <asm/uaccess.h>
+#include <asm/io.h>
+
+#undef DEBUG
+
+#ifdef DEBUG
+#define DPRINTK(x...) printk(x)
+#else
+#define DPRINTK(x...)
+#endif
+
+static int
+prep_residual_open(struct inode *inode, struct file *file)
+{
+ if (res->ResidualLength == 0)
+ return -ENOENT;
+
+ DPRINTK("/proc/residual opened\n");
+
+ return 0;
+}
+
+static int
+prep_residual_release(struct inode *inode, struct file *file)
+{
+ if (res->ResidualLength == 0)
+ return -ENOENT;
+
+ DPRINTK("/proc/residual released\n");
+
+ return 0;
+}
+
+static ssize_t
+prep_residual_read(struct file *file, char *buf, size_t count, loff_t * ppos)
+{
+ int retval;
+ int rlen = res->ResidualLength;
+ int offset = *ppos;
+
+ DPRINTK("prep_residual_read called, offset = %d\n", offset);
+
+ /* Make sure we're have something to do, and are called correctly */
+ if (!count)
+ return 0;
+ else if (rlen == 0)
+ retval = -ENOENT;
+ else if (!buf || count < 0)
+ retval = -EINVAL;
+ else
+ retval = verify_area(VERIFY_WRITE, buf, count);
+
+ if (retval)
+ return retval;
+
+ if ((count + offset) > rlen)
+ count = rlen - offset;
+
+ copy_to_user(buf, ((char *) res) + offset, count);
+ *ppos += count;
+
+ return count;
+}
+
+static struct file_operations proc_prep_residual_operations = {
+ read:prep_residual_read,
+ open:prep_residual_open,
+ release:prep_residual_release,
+};
+
+struct proc_dir_entry *entry;
+
+int __init
+prep_procresidual_init(void)
+{
+ DPRINTK("Registering /proc/residual... ");
+
+ entry = create_proc_entry("residual", S_IFREG | S_IRUGO, &proc_root);
+
+ if (entry)
+ entry->proc_fops = &proc_prep_residual_operations;
+ else
+ return -EAGAIN;
+
+ return 0;
+}
+
+__initcall(prep_procresidual_init);
** Sent via the linuxppc-dev mail list. See http://lists.linuxppc.org/
More information about the Linuxppc-dev
mailing list