Detect keyboard ctrl-alt-delete and try to reset machine.
authorKevin O'Connor <kevin@koconnor.net>
Sat, 29 Nov 2008 18:22:29 +0000 (13:22 -0500)
committerKevin O'Connor <kevin@koconnor.net>
Sat, 29 Nov 2008 18:22:29 +0000 (13:22 -0500)
TODO
src/kbd.c
src/romlayout.S

diff --git a/TODO b/TODO
index ca76fe3c369a6c6b1c59c2d7f5b6ebb27add3e9e..0b45ffe81bb27867b97500dbd92decbf6eb7fb54 100644 (file)
--- a/TODO
+++ b/TODO
@@ -1,10 +1,3 @@
-Clean up timer code.  Don't use PORT_DIAG as delay mechanism.
-
-The keyboard driver should detect ctrl+alt+del and reboot the
-machine.
-
-Fix keyboard LEDs.
-
 Review changes committed to coreboot, virtualbox, qemu, kvm, and bochs
 cvs tip.
   * bochs cvs 20081016:           -- better post resume support
@@ -35,7 +28,8 @@ is unnecessary.
 Cleanup setting of ES on GET/SET_BDA
 
 Audit code for 16bit protected mode accesses.  Support 1ab1 from 16bit
-protected mode.
+protected mode.  The BDA is technically at segment 0x0040 (not
+0x0000).
 
 Possibly implement 32bit pcibios support.
 
index cb60306142736477266564a3a5300bdc4943d3dd..e0f958a3e15fdcbe80a4f5b97bb135e95a669171 100644 (file)
--- a/src/kbd.c
+++ b/src/kbd.c
@@ -338,6 +338,9 @@ handle_16(struct bregs *regs)
     }
 }
 
+// 16bit reset vector declared in romlayout.S
+void reset_vector() __attribute__ ((noreturn));
+
 #define none 0
 #define MAX_SCAN_CODE 0x58
 
@@ -566,9 +569,12 @@ process_key(u8 scancode)
         return;
 
     default:
-        if (scancode & 0x80) {
-            break; /* toss key releases ... */
-        }
+        if (scancode & 0x80)
+            // toss key releases
+            break;
+        if (scancode == 0x53 && (shift_flags & 0x0c) == 0x0c)
+            // Ctrl+alt+del - reset machine.
+            reset_vector();
         if (scancode > MAX_SCAN_CODE) {
             dprintf(1, "KBD: int09h_handler(): unknown scancode read: 0x%02x!\n"
                     , scancode);
index 12052d8af71a750658d85ed26031e32f68650415..4249d4471f69f5695311e6389cfa979d362a2226 100644 (file)
@@ -551,6 +551,8 @@ dummy_iret_handler:
         IRQ_ENTRY_ARG 05
 
         ORG 0xfff0 // Power-up Entry Point
+        .global reset_vector
+reset_vector:
         ljmpw $SEG_BIOS, $post16
 
         ORG 0xfff5