Detect keyboard ctrl-alt-delete and try to reset machine.
diff --git a/TODO b/TODO
index ca76fe3..0b45ffe 100644
--- 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 @@
 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.
 
diff --git a/src/kbd.c b/src/kbd.c
index cb60306..e0f958a 100644
--- a/src/kbd.c
+++ b/src/kbd.c
@@ -338,6 +338,9 @@
     }
 }
 
+// 16bit reset vector declared in romlayout.S
+void reset_vector() __attribute__ ((noreturn));
+
 #define none 0
 #define MAX_SCAN_CODE 0x58
 
@@ -566,9 +569,12 @@
         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);
diff --git a/src/romlayout.S b/src/romlayout.S
index 12052d8..4249d44 100644
--- a/src/romlayout.S
+++ b/src/romlayout.S
@@ -551,6 +551,8 @@
         IRQ_ENTRY_ARG 05
 
         ORG 0xfff0 // Power-up Entry Point
+        .global reset_vector
+reset_vector:
         ljmpw $SEG_BIOS, $post16
 
         ORG 0xfff5