/****************************************************************************** * keyhandler.c */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define KEY_MAX 256 #define STR_MAX 64 static struct { union { keyhandler_t *handler; irq_keyhandler_t *irq_handler; } u; unsigned int flags; char desc[STR_MAX]; } key_table[KEY_MAX]; #define KEYHANDLER_IRQ_CALLBACK 0x1 static unsigned char keypress_key; static void keypress_softirq(void) { keyhandler_t *h; unsigned char key = keypress_key; console_start_log_everything(); if ( (h = key_table[key].u.handler) != NULL ) (*h)(key); console_end_log_everything(); } void handle_keypress(unsigned char key, struct cpu_user_regs *regs) { irq_keyhandler_t *h; if ( !in_irq() || (key_table[key].flags & KEYHANDLER_IRQ_CALLBACK) ) { console_start_log_everything(); if ( (h = key_table[key].u.irq_handler) != NULL ) (*h)(key, regs); console_end_log_everything(); } else { keypress_key = key; raise_softirq(KEYPRESS_SOFTIRQ); } } void register_keyhandler( unsigned char key, keyhandler_t *handler, char *desc) { ASSERT(key_table[key].u.handler == NULL); key_table[key].u.handler = handler; key_table[key].flags = 0; safe_strcpy(key_table[key].desc, desc); } void register_irq_keyhandler( unsigned char key, irq_keyhandler_t *handler, char *desc) { ASSERT(key_table[key].u.irq_handler == NULL); key_table[key].u.irq_handler = handler; key_table[key].flags = KEYHANDLER_IRQ_CALLBACK; safe_strcpy(key_table[key].desc, desc); } static void show_handlers(unsigned char key) { int i; printk("'%c' pressed -> showing installed handlers\n", key); for ( i = 0; i < KEY_MAX; i++ ) if ( key_table[i].u.handler != NULL ) printk(" key '%c' (ascii '%02x') => %s\n", (i<33 || i>126)?(' '):(i),i, key_table[i].desc); } static void __dump_execstate(void *unused) { dump_execution_state(); printk("*** Dumping CPU%d guest state: ***\n", smp_processor_id()); if ( is_idle_vcpu(current) ) printk("No guest context (CPU is idle).\n"); else show_execution_state(guest_cpu_user_regs()); } static void dump_registers(unsigned char key, struct cpu_user_regs *regs) { unsigned int cpu; printk("'%c' pressed -> dumping registers\n", key); /* Get local execution state out immediately, in case we get stuck. */ printk("\n*** Dumping CPU%d host state: ***\n", smp_processor_id()); __dump_execstate(NULL); for_each_online_cpu ( cpu ) { if ( cpu == smp_processor_id() ) continue; printk("\n*** Dumping CPU%d host state: ***\n", cpu); on_selected_cpus(cpumask_of_cpu(cpu), __dump_execstate, NULL, 1, 1); } printk("\n"); } static void halt_machine(unsigned char key, struct cpu_user_regs *regs) { printk("'%c' pressed -> rebooting machine\n", key); machine_restart(NULL); } static void cpuset_print(char *set, int size, cpumask_t mask) { *set++ = '{'; set += cpulist_scnprintf(set, size-2, mask); *set++ = '}'; *set++ = '\0'; } static void periodic_timer_print(char *str, int size, uint64_t period) { if ( period == 0 ) { strlcpy(str, "No periodic timer", size);
// Fixed Width Icons
// -------------------------
.#{$fa-css-prefix}-fw {
  text-align: center;
  width: (20em / 16);
}