[haiku-development] [PATCH 2/4] Emergency functions module
- From: Jan Klötzke <jan.kloetzke@xxxxxxxxxx>
- To: haiku-development@xxxxxxxxxxxxx
- Date: Thu, 26 Jun 2008 21:14:54 +0200
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
- References:
- [haiku-development] Emergency keyboard shortcut handler
- From: Jan Klötzke
Other related posts:
- » [haiku-development] [PATCH 2/4] Emergency functions module
- [haiku-development] Emergency keyboard shortcut handler
- From: Jan Klötzke