summaryrefslogtreecommitdiffstats
path: root/oops.c
diff options
context:
space:
mode:
Diffstat (limited to 'oops.c')
-rw-r--r--oops.c118
1 files changed, 118 insertions, 0 deletions
diff --git a/oops.c b/oops.c
new file mode 100644
index 00000000..14573f0f
--- /dev/null
+++ b/oops.c
@@ -0,0 +1,118 @@
+/*
+ * Loadable driver which provides the ability to generate a kernel
+ * protection fault. Mainly useful for testing the address translation
+ * capabilities of klogd.
+ *
+ * Fri Oct 27 14:34:27 CDT 1995: Dr. Wettstein
+ *
+ * Initial version.
+ */
+
+#define NEW_MODULES
+
+/* Kernel includes. */
+#include <linux/kernel.h>
+#include <linux/config.h>
+#include <linux/errno.h>
+#include <linux/fs.h>
+
+/* Standard module stuff. */
+#if defined(NEW_MODULES)
+#include <linux/module.h>
+#else
+#include <linux/module.h>
+#include <linux/version.h>
+char kernel_version[] = UTS_RELEASE;
+#endif
+
+
+static int major = 32;
+
+
+#ifdef MODULE
+static int oops_ioctl(struct inode *, struct file *, unsigned int cmd, unsigned long arg);
+static int oops_open(struct inode * node, struct file * file);
+static void oops(void);
+
+static struct symbol_table these_symbols = {
+#include <linux/symtab_begin.h>
+ X(oops_open),
+ X(oops_ioctl),
+ X(oops),
+#include <linux/symtab_end.h>
+};
+
+/* driver specific module definitions */
+static struct file_operations oops_fops1 = {
+ NULL, /* hw_lseek */
+ NULL, /* hw_read */
+ NULL, /* write */
+ NULL, /* hw_readdir */
+ NULL, /* hw_select */
+ oops_ioctl, /* hw_ioctl */
+ NULL, /* mmap */
+ oops_open, /* hw_open */
+ NULL, /* hw_release */
+ NULL /* fsync */
+};
+
+static int oops_open(struct inode * node, struct file * file)
+{
+ printk("Called oops_open.\n");
+ return(0);
+}
+
+
+static int oops_ioctl(struct inode * node, struct file * file, \
+ unsigned int cmd, unsigned long arg)
+{
+
+ printk("Called oops_ioctl.\n");
+ printk("Cmd: %d, Arg: %ld\n", cmd, arg);
+ if ( cmd == 1 )
+ {
+ oops();
+ }
+
+ return(0);
+}
+
+static void oops()
+
+{
+ auto unsigned long *p = (unsigned long *) 828282828;
+ *p = 5;
+ return;
+}
+
+
+int
+init_module(void)
+{
+ printk("oops: Module initilization.\n");
+ if (register_chrdev(major, "oops", &oops_fops1)) {
+ printk("register_chrdev failed.");
+ return -EIO;
+ }
+
+ printk("oops: Registering symbols.\n");
+ register_symtab(&these_symbols);
+
+ return 0;
+}
+
+
+void
+cleanup_module(void)
+{
+ /* driver specific cleanups, ususally "unregister_*()" */
+ printk("oops: Module unloadeding.\n");
+ if (unregister_chrdev(major, "oops") != 0)
+ printk("cleanup_module failed\n");
+ else
+ printk("cleanup_module succeeded\n");
+
+ return;
+
+}
+#endif /* MODULE */