#include <palacios/vmm_intr.h>
#include <palacios/vmm_host_events.h>
#include <palacios/vm_guest.h>
+#include <palacios/vmm_debug.h>
#ifndef V3_CONFIG_DEBUG_KEYBOARD
// after having a f0 sent to 60
// we wait for a new output byte on 60
GETSET_SCANCODES,
+ // first send ACK (0xfa)
+ // then wait for reception, and reset kb state
+ SET_DEFAULTS,
} state;
// Data for system
uint8_t wrap;
- int mouse_enabled;
- int scancode_set;
+ uint8_t mouse_enabled;
+ uint8_t scancode_set;
struct queue kbd_queue;
struct queue mouse_queue;
};
+static int keyboard_reset_device(struct keyboard_internal * kbd);
+
+
static int update_kb_irq(struct keyboard_internal * state) {
int irq_num = 0;
#ifdef V3_CONFIG_TELEMETRY
else if (evt->scan_code == 0x41) { // F7 telemetry dump
- v3_print_telemetry(vm);
+ v3_print_global_telemetry(vm);
}
#endif
#ifdef V3_CONFIG_SYMMOD
break;
default:
PrintError("keyboard: unknown scancode set %d selected\n", data);
- return -1;
+ ret = -1;
+ break;
}
kbd->state = NORMAL;
break;
+ case SET_DEFAULTS:
+ keyboard_reset_device(kbd);
+ kbd->state = NORMAL;
+ break;
+
default:
case NORMAL: {
// command is being sent to keyboard controller
kbd->state = GETSET_SCANCODES;
break;
+
+ case 0xf6: // set defaults
+ // ACK command
+ // clear output buffer
+ // reset to init state
+ push_to_output_queue(kbd, 0xfa, COMMAND, KEYBOARD);
+ kbd->state = SET_DEFAULTS;
+ break;
+
case 0xfe: // resend
case 0xfd: // set key type make
case 0xfc: // set key typ make/break
case 0xf9: // set all make
case 0xf8: // set all make/break
case 0xf7: // set all typemaktic
- case 0xf6: // set defaults
+
PrintError("keyboard: unhandled known command 0x%x on output buffer (60h)\n", data);
ret = -1;
break;
#ifdef V3_CONFIG_CHECKPOINT
static int keyboard_save(struct v3_chkpt_ctx * ctx, void * private_data) {
+ struct keyboard_internal * kbd = (struct keyboard_internal *)private_data;
+
+ v3_chkpt_save_8(ctx, "CMD_REG", &(kbd->cmd.val));
+ v3_chkpt_save_8(ctx, "STATUS_REG", &(kbd->status.val));
+ v3_chkpt_save_8(ctx, "STATE", &(kbd->state));
+ v3_chkpt_save_8(ctx, "MOUSE_STATE", &(kbd->mouse_state));
+ v3_chkpt_save_8(ctx, "OUTPUT", &(kbd->output_byte));
+ v3_chkpt_save_8(ctx, "INPUT", &(kbd->input_byte));
+ v3_chkpt_save_8(ctx, "SCANCODE_SET", &(kbd->scancode_set));
+ v3_chkpt_save_8(ctx, "MOUSE_ENABLED", &(kbd->mouse_enabled));
+
+
return 0;
}
static int keyboard_load(struct v3_chkpt_ctx * ctx, void * private_data) {
struct keyboard_internal * kbd = (struct keyboard_internal *)private_data;
keyboard_reset_device(kbd);
+
+ v3_chkpt_load_8(ctx, "CMD_REG", &(kbd->cmd.val));
+ v3_chkpt_load_8(ctx, "STATUS_REG", &(kbd->status.val));
+ v3_chkpt_load_8(ctx, "STATE", &(kbd->state));
+ v3_chkpt_load_8(ctx, "MOUSE_STATE", &(kbd->mouse_state));
+ v3_chkpt_load_8(ctx, "OUTPUT", &(kbd->output_byte));
+ v3_chkpt_load_8(ctx, "INPUT", &(kbd->input_byte));
+ v3_chkpt_load_8(ctx, "SCANCODE_SET", &(kbd->scancode_set));
+ v3_chkpt_load_8(ctx, "MOUSE_ENABLED", &(kbd->mouse_enabled));
+
+
return 0;
}
kbd = (struct keyboard_internal *)V3_Malloc(sizeof(struct keyboard_internal));
+ if (!kbd) {
+ PrintError("Cannot allocate in init\n");
+ return -1;
+ }
+
memset(kbd, 0, sizeof(struct keyboard_internal));
kbd->vm = vm;