void setkbdled (int ledstatus) { u8 gomi; wait_for_kbdsend (false); asm_outb (KBD_DATA, 0xED); wait_for_kbdrecv (true); asm_inb (KBD_DATA, &gomi); wait_for_kbdsend (false); asm_outb (KBD_DATA, ledstatus); wait_for_kbdrecv (true); asm_inb (KBD_DATA, &gomi); }
static void wait_for_kbdsend (bool sending) { u8 status; do asm_inb (KBD_STATUS, &status); while (!(status & 2) != !sending); }
static void wait_for_kbdrecv (bool receiving) { u8 status; do asm_inb (KBD_STATUS, &status); while (!(status & 1) != !receiving); }
static u8 keyboard_getkey (void) { u8 data; wait_for_kbdrecv (true); asm_inb (KBD_DATA, &data); wait_for_kbdrecv (false); pressed[data & 127] = (data & 128) ? false : true; return data; }
static void vt_panic (void) { ulong cr4; u8 port0x92; asm_rdcr4 (&cr4); if (!(cr4 & CR4_VMXE_BIT)) return; /* enable A20 */ /* the guest can set or clear A20M# because A20M# is ignored during VMX operation. however A20M# is used after VMXOFF. */ asm_inb (0x92, &port0x92); port0x92 |= 2; asm_outb (0x92, port0x92); asm_vmxoff (); cr4 &= ~CR4_VMXE_BIT; asm_wrcr4 (cr4); }