Index: kernel/arch/amd64/src/amd64.c
===================================================================
--- kernel/arch/amd64/src/amd64.c	(revision 415d272c2410b6829f7665da39831ac552d8305e)
+++ kernel/arch/amd64/src/amd64.c	(revision 149d14e522aa5c449b696ad4420f3caa33ca9b8e)
@@ -282,4 +282,11 @@
 }
 
+void arch_reboot(void)
+{
+#ifdef CONFIG_PC_KBD
+	i8042_cpu_reset((i8042_t *) I8042_BASE);
+#endif
+}
+
 /** @}
  */
Index: kernel/arch/amd64/src/pm.c
===================================================================
--- kernel/arch/amd64/src/pm.c	(revision 415d272c2410b6829f7665da39831ac552d8305e)
+++ kernel/arch/amd64/src/pm.c	(revision 149d14e522aa5c449b696ad4420f3caa33ca9b8e)
@@ -231,23 +231,4 @@
 }
 
-/* Reboot the machine by initiating
- * a triple fault
- */
-void arch_reboot(void)
-{
-	preemption_disable();
-	ipl_t ipl = interrupts_disable();
-	
-	memsetb(idt, sizeof(idt), 0);
-	idtr_load(&idtr);
-	
-	interrupts_restore(ipl);
-	asm volatile (
-		"int $0x03\n"
-		"cli\n"
-		"hlt\n"
-	);
-}
-
 /** @}
  */
Index: kernel/arch/ia32/src/ia32.c
===================================================================
--- kernel/arch/ia32/src/ia32.c	(revision 415d272c2410b6829f7665da39831ac552d8305e)
+++ kernel/arch/ia32/src/ia32.c	(revision 149d14e522aa5c449b696ad4420f3caa33ca9b8e)
@@ -238,4 +238,11 @@
 }
 
+void arch_reboot(void)
+{
+#ifdef CONFIG_PC_KBD
+	i8042_cpu_reset((i8042_t *) I8042_BASE);
+#endif
+}
+
 /** @}
  */
Index: kernel/arch/ia32/src/pm.c
===================================================================
--- kernel/arch/ia32/src/pm.c	(revision 415d272c2410b6829f7665da39831ac552d8305e)
+++ kernel/arch/ia32/src/pm.c	(revision 149d14e522aa5c449b696ad4420f3caa33ca9b8e)
@@ -233,27 +233,4 @@
 }
 
-/* Reboot the machine by initiating
- * a triple fault
- */
-void arch_reboot(void)
-{
-	preemption_disable();
-	ipl_t ipl = interrupts_disable();
-	
-	memsetb(idt, sizeof(idt), 0);
-	
-	ptr_16_32_t idtr;
-	idtr.limit = sizeof(idt);
-	idtr.base = (uintptr_t) idt;
-	idtr_load(&idtr);
-	
-	interrupts_restore(ipl);
-	asm volatile (
-		"int $0x03\n"
-		"cli\n"
-		"hlt\n"
-	);
-}
-
 /** @}
  */
Index: kernel/genarch/include/drivers/i8042/i8042.h
===================================================================
--- kernel/genarch/include/drivers/i8042/i8042.h	(revision 415d272c2410b6829f7665da39831ac552d8305e)
+++ kernel/genarch/include/drivers/i8042/i8042.h	(revision 149d14e522aa5c449b696ad4420f3caa33ca9b8e)
@@ -54,4 +54,5 @@
 
 extern indev_t *i8042_init(i8042_t *, inr_t);
+extern void i8042_cpu_reset(i8042_t *);
 
 #endif
Index: kernel/genarch/src/drivers/i8042/i8042.c
===================================================================
--- kernel/genarch/src/drivers/i8042/i8042.c	(revision 415d272c2410b6829f7665da39831ac552d8305e)
+++ kernel/genarch/src/drivers/i8042/i8042.c	(revision 149d14e522aa5c449b696ad4420f3caa33ca9b8e)
@@ -51,4 +51,5 @@
 #define i8042_SET_COMMAND  0x60
 #define i8042_COMMAND      0x69
+#define i8042_CPU_RESET    0xfe
 
 #define i8042_BUFFER_FULL_MASK  0x01
@@ -98,7 +99,5 @@
 	irq_register(&instance->irq);
 	
-	/*
-	 * Clear input buffer.
-	 */
+	/* Clear input buffer */
 	while (pio_read_8(&dev->status) & i8042_BUFFER_FULL_MASK)
 		(void) pio_read_8(&dev->data);
@@ -107,4 +106,17 @@
 }
 
+/* Reset CPU by pulsing pin 0 */
+void i8042_cpu_reset(i8042_t *dev)
+{
+	interrupts_disable();
+	
+	/* Clear input buffer */
+	while (pio_read_8(&dev->status) & i8042_BUFFER_FULL_MASK)
+		(void) pio_read_8(&dev->data);
+	
+	/* Reset CPU */
+	pio_write_8(&dev->status, i8042_CPU_RESET);
+}
+
 /** @}
  */
