diff -r ac48ec8ffd86 platform/pc99/pistachio/src/reboot.cc --- a/platform/pc99/pistachio/src/reboot.cc Tue Aug 03 13:10:36 2010 +0200 +++ b/platform/pc99/pistachio/src/reboot.cc Tue Oct 05 15:30:32 2010 +0200 @@ -58,7 +58,9 @@ /* * Description: PC99 reset */ + #include +#include /* * Reboot the box @@ -66,6 +68,39 @@ void Platform::reboot(void) { + asm volatile ("cli \n" :); - for (;;); + /* i8042: store the next byte at port 0x60 as command byte */ + while (in_u8(0x64) & 0x2) ; + out_u8(0x64, 0x60); + + /* i8042 command byte (PS/2-compatible mode): + b0=0 ... no IRQ 1 is generated when data available in + input buffer + b1=0 ... no IRQ 1 is generated when mouse data available + in input buffer + b2=1 ... set SYS flag in status register -- tells POST + to perform "warm boot" tests/initiailization + b3=0 ... reserved + b4=0 ... keyboard interface enabled + b5=0 ... auxillary PS/2 device (mouse) interface + enabled + b6=0 ... translation disabled -- data appears at + input buffer exactly as read from keyboard + b7=0 ... reserved + */ + while (in_u8(0x64) & 0x2) ; + out_u8(0x60, 0x4); + + /* i8042: pulse output port with 1110b + b0=0 ... reset computer + b1=1 ... set gate A20 + b2=1 ... pull mouse data low + b3=1 ... pull mouse clock low + */ + while (in_u8(0x64) & 0x2) ; + out_u8(0x64, 0xfe); + + for (;;) + asm volatile ("hlt \n" :); }