[haiku-development] [PATCH 2/4] Emergency functions module

Simple module which provides a "emergency_key" method. This method should be
called with the last pressed character of a combination by keyboard drivers,
such as "Shift+F12+s". Depending on the passed character the following
functions are available
  * s = Sync disks
  * b = reBoot
  * o = Off (shutdown)
  * t = dump Threads
  * l = dump Locks
  * f = print stack Frames from all CPU's
---
 build/jam/HaikuImage                             |    2 +-
 headers/os/drivers/emergency.h                   |   28 +++++++
 src/add-ons/kernel/generic/Jamfile               |    1 +
 src/add-ons/kernel/generic/emergency/Jamfile     |    6 ++
 src/add-ons/kernel/generic/emergency/emergency.c |   93 ++++++++++++++++++++++
 5 files changed, 129 insertions(+), 1 deletions(-)
 create mode 100644 headers/os/drivers/emergency.h
 create mode 100644 src/add-ons/kernel/generic/emergency/Jamfile
 create mode 100644 src/add-ons/kernel/generic/emergency/emergency.c

diff --git a/build/jam/HaikuImage b/build/jam/HaikuImage
index e59f113..aea4299 100644
--- a/build/jam/HaikuImage
+++ b/build/jam/HaikuImage
@@ -156,7 +156,7 @@ AddFilesToHaikuImage beos system add-ons kernel debugger
 AddFilesToHaikuImage beos system add-ons kernel file_systems
        : $(BEOS_ADD_ONS_FILE_SYSTEMS) ;
 AddFilesToHaikuImage beos system add-ons kernel generic
-       : block_io dpc ide_adapter locked_pool mpu401 scsi_periph ;
+       : block_io dpc emergency ide_adapter locked_pool mpu401 scsi_periph ;
 AddFilesToHaikuImage beos system add-ons kernel partitioning_systems
        : intel session ;
 AddFilesToHaikuImage beos system add-ons kernel interrupt_controllers
diff --git a/headers/os/drivers/emergency.h b/headers/os/drivers/emergency.h
new file mode 100644
index 0000000..0c42f49
--- /dev/null
+++ b/headers/os/drivers/emergency.h
@@ -0,0 +1,28 @@
+/*
+ * Copyright 2008, Haiku Inc. All Rights Reserved.
+ * Distributed under the terms of the MIT License.
+ */
+#ifndef _EMERGENCY_H_
+#define _EMERGENCY_H_
+
+#include <OS.h>
+#include <module.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define B_EMERGENCY_MODULE_NAME "generic/emergency/v1"
+
+typedef struct emergency_module_info {
+       module_info     info;
+
+       void (*emergency_key)(char key);
+} emergency_module_info;
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/src/add-ons/kernel/generic/Jamfile 
b/src/add-ons/kernel/generic/Jamfile
index 617d177..6200f0b 100644
--- a/src/add-ons/kernel/generic/Jamfile
+++ b/src/add-ons/kernel/generic/Jamfile
@@ -3,6 +3,7 @@ SubDir HAIKU_TOP src add-ons kernel generic ;
 SubInclude HAIKU_TOP src add-ons kernel generic atomizer ;
 SubInclude HAIKU_TOP src add-ons kernel generic block_io ;
 SubInclude HAIKU_TOP src add-ons kernel generic dpc ;
+SubInclude HAIKU_TOP src add-ons kernel generic emergency ;
 SubInclude HAIKU_TOP src add-ons kernel generic ide_adapter ;
 SubInclude HAIKU_TOP src add-ons kernel generic locked_pool ;
 SubInclude HAIKU_TOP src add-ons kernel generic mpu401 ;
diff --git a/src/add-ons/kernel/generic/emergency/Jamfile 
b/src/add-ons/kernel/generic/emergency/Jamfile
new file mode 100644
index 0000000..abf115c
--- /dev/null
+++ b/src/add-ons/kernel/generic/emergency/Jamfile
@@ -0,0 +1,6 @@
+SubDir HAIKU_TOP src add-ons kernel generic emergency ;
+
+KernelAddon emergency :
+       emergency.c
+;
+
diff --git a/src/add-ons/kernel/generic/emergency/emergency.c 
b/src/add-ons/kernel/generic/emergency/emergency.c
new file mode 100644
index 0000000..96052d9
--- /dev/null
+++ b/src/add-ons/kernel/generic/emergency/emergency.c
@@ -0,0 +1,93 @@
+/*
+ * Copyright 2008, Jan Kloetzke. All rights reserved.
+ * Distributed under the terms of the MIT License.
+ */
+
+#include <KernelExport.h>
+#include <dpc.h>
+#include <stdlib.h>
+
+#include <emergency.h>
+
+static void *sQueue;
+static dpc_module_info *sDpc;
+
+
+static void
+em_sync(void *arg)
+{
+       sync();
+       dprintf("Emergency sync completed\n");
+}
+
+
+static void
+em_stack_frames(void *cookie, int cpu)
+{
+       kernel_debugger_exec("sc", false);
+}
+
+
+static void
+emergency_key(char key)
+{
+       switch (key) {
+               case 's': /* Sync */
+                       sDpc->queue_dpc(sQueue, em_sync, NULL);
+                       break;
+               case 'b': /* reBoot */
+                       kernel_debugger_exec("reboot", false);
+                       break;
+               case 'o': /* Off */
+                       kernel_debugger_exec("shutdown", true);
+                       break;
+               case 't': /* Threads */
+                       kernel_debugger_exec("threads", true);
+                       break;
+               case 'l': /* Locks */
+                       kernel_debugger_exec("sems", true);
+                       break;
+               case 'f': /* stack Frames */
+                       call_all_cpus(em_stack_frames, NULL);
+                       break;
+       }
+}
+
+
+static status_t
+std_ops(int32 op, ...)
+{
+       switch (op) {
+               case B_MODULE_INIT:
+                       return sDpc->new_dpc_queue(&sQueue, "emergency", 
B_REAL_TIME_PRIORITY);
+               case B_MODULE_UNINIT:
+                       return sDpc->delete_dpc_queue(sQueue);
+
+               default:
+                       return B_ERROR;
+       }
+}
+
+
+static emergency_module_info sEmergencyModule = {
+       {
+               B_EMERGENCY_MODULE_NAME,
+               0,
+               std_ops
+       },
+
+       emergency_key
+};
+
+
+module_dependency module_dependencies[] = {
+       { B_DPC_MODULE_NAME, (module_info **)&sDpc },
+       {}
+};
+
+
+module_info *modules[] = {
+       (module_info *) &sEmergencyModule,
+       NULL
+};
+
-- 
1.5.4.2


Other related posts: