#include #include #include #include #include #include #include #include #include #include #include #include #include extern unsigned long get_rflags(void); extern char __pstart[], __pend[]; static char keycode_chars[] = { [KEY_UNKNOWN] = ' ', [KEY_A] = 'a', [KEY_B] = 'b', [KEY_C] = 'c', [KEY_D] = 'd', [KEY_E] = 'e', [KEY_F] = 'f', [KEY_G] = 'g', [KEY_H] = 'h', [KEY_I] = 'i', [KEY_J] = 'j', [KEY_K] = 'k', [KEY_L] = 'l', [KEY_M] = 'm', [KEY_N] = 'n', [KEY_O] = 'o', [KEY_P] = 'p', [KEY_Q] = 'q', [KEY_R] = 'r', [KEY_S] = 's', [KEY_T] = 't', [KEY_U] = 'u', [KEY_V] = 'v', [KEY_W] = 'w', [KEY_X] = 'x', [KEY_Y] = 'y', [KEY_Z] = 'z', [KEY_KEY_1] = '1', [KEY_KEY_2] = '2', [KEY_KEY_3] = '3', [KEY_KEY_4] = '4', [KEY_KEY_5] = '5', [KEY_KEY_6] = '6', [KEY_KEY_7] = '7', [KEY_KEY_8] = '8', [KEY_KEY_9] = '9', [KEY_KEY_0] = '0', [KEY_ENTER] = '\n', [KEY_ESCAPE] = 0, [KEY_BACKSPACE] = '\b', [KEY_TAB] = ' ', [KEY_SPACE] = ' ', [KEY_MINUS] = '-', [KEY_EQUALS] = '=', [KEY_LEFT_BRACE] = '[', [KEY_RIGHT_BRACE] = ']', [KEY_BACKSLASH] = '\\', [KEY_NON_US_HASH] = 0, [KEY_SEMICOLON] = ';', [KEY_APOSTROPHE] = '\'', [KEY_GRAVE_ACCENT] = 0, [KEY_COMMA] = ',', [KEY_DOT] = '.', [KEY_SLASH] = '/', [KEY_CAPS_LOCK] = 0, [KEY_F1] = 0, [KEY_F2] = 0, [KEY_F3] = 0, [KEY_F4] = 0, [KEY_F5] = 0, [KEY_F6] = 0, [KEY_F7] = 0, [KEY_F8] = 0, [KEY_F9] = 0, [KEY_F10] = 0, [KEY_F11] = 0, [KEY_F12] = 0, [KEY_PRINT_SCREEN] = 0, [KEY_SCROLL_LOCK] = 0, [KEY_PAUSE] = 0, [KEY_INSERT] = 0, [KEY_HOME] = 0, [KEY_PAGE_UP] = 0, [KEY_DELETE] = 0, [KEY_END] = 0, [KEY_PAGE_DOWN] = 0, [KEY_RIGHT] = 0, [KEY_LEFT] = 0, [KEY_DOWN] = 0, [KEY_UP] = 0, [KEY_NUM_LOCK] = 0, [KEY_KEYPAD_SLASH] = '/', [KEY_KEYPAD_ASTERISK] = '*', [KEY_KEYPAD_MINUS] = '-', [KEY_KEYPAD_PLUS] = '+', [KEY_KEYPAD_ENTER] = '\n', [KEY_KEYPAD_1] = '1', [KEY_KEYPAD_2] = '2', [KEY_KEYPAD_3] = '3', [KEY_KEYPAD_4] = '4', [KEY_KEYPAD_5] = '5', [KEY_KEYPAD_6] = '6', [KEY_KEYPAD_7] = '7', [KEY_KEYPAD_8] = '8', [KEY_KEYPAD_9] = '9', [KEY_KEYPAD_0] = '0', [KEY_KEYPAD_DOT] = '.', [KEY_NON_US_BACKSLASH] = 0, [KEY_KEYPAD_EQUALS] = '=', [KEY_MENU] = 0, [KEY_LEFT_CTRL] = 0, [KEY_LEFT_SHIFT] = 0, [KEY_LEFT_ALT] = 0, [KEY_LEFT_META] = 0, [KEY_RIGHT_CTRL] = 0, [KEY_RIGHT_SHIFT] = 0, [KEY_RIGHT_ALT] = 0, [KEY_RIGHT_META] = 0, [KEY_MEDIA_MUTE] = 0, [KEY_MEDIA_VOLUME_INCREMENT] = 0, [KEY_MEDIA_VOLUME_DECREMENT] = 0, }; void print_kernel_banner(void) { printk("Socks kernel version " BUILD_ID); } static void hang(void) { while (1) { printk("tick"); milli_sleep(2000); } } void background_thread(void) { printk("background_thread() running on processor %u", this_cpu()); milli_sleep(500); while (1) { //printk("tock"); milli_sleep(2000); } } static void putchar(char c) { unsigned long flags; struct queue *consoles = get_consoles(&flags); queue_foreach(struct console, con, consoles, c_list) { console_write(con, &c, 1); } put_consoles(consoles, flags); } void kernel_init(uintptr_t arg) { ml_init(arg); kern_status_t status; status = scan_internal_kexts(); if (status != KERN_OK) { panic("scan_internal_kexts() failed with code %s", kern_status_string(status)); } status = bring_internal_kexts_online(); if (status != KERN_OK) { panic("bring_internal_kexts_online() failed with code %s", kern_status_string(status)); } printk("kernel_init() running on processor %u", this_cpu()); run_all_tests(); create_kernel_thread(background_thread); struct object *kbd_obj; status = object_namespace_get_object(global_namespace(), "/dev/system/misc/input0", &kbd_obj); if (status != KERN_OK) { printk("no keyboard available"); hang(); } struct device *kbd_dev = cast_to_device(kbd_obj); if (!kbd_dev) { printk("no keyboard available"); hang(); } struct input_device *kbd = INPUT_DEVICE(kbd_dev); if (!kbd) { printk("no keyboard available"); hang(); } while (1) { struct input_event ev; size_t r; status = device_read(kbd_dev, &ev, sizeof ev, &r); if (status != KERN_OK || r != sizeof ev) { printk("keyboard read error: %s", kern_status_string(status)); break; } if (ev.ev_type != INPUT_TYPE_KEY || ev.ev_key.state != INPUT_KEYSTATE_DOWN) { continue; } char c = keycode_chars[ev.ev_key.key]; if (c == 0) { continue; } putchar(c); } hang(); }