2022-12-21 08:29:33 +00:00
|
|
|
#include <stdint.h>
|
|
|
|
|
#include <socks/init.h>
|
2023-04-30 21:09:36 +01:00
|
|
|
#include <socks/clock.h>
|
2023-05-10 20:34:53 +01:00
|
|
|
#include <socks/input.h>
|
2023-04-09 16:43:03 +01:00
|
|
|
#include <socks/panic.h>
|
2023-02-26 10:05:39 +00:00
|
|
|
#include <socks/test.h>
|
2023-02-03 20:51:23 +00:00
|
|
|
#include <socks/printk.h>
|
2023-05-10 20:34:53 +01:00
|
|
|
#include <socks/device.h>
|
2023-04-08 09:27:21 +01:00
|
|
|
#include <socks/kext.h>
|
2023-03-06 11:08:02 +00:00
|
|
|
#include <socks/object.h>
|
2023-03-06 11:08:26 +00:00
|
|
|
#include <socks/sched.h>
|
2022-12-21 08:29:33 +00:00
|
|
|
#include <socks/machine/init.h>
|
2023-03-18 19:35:00 +00:00
|
|
|
#include <socks/cpu.h>
|
2023-02-04 19:03:45 +00:00
|
|
|
|
2023-06-10 21:41:07 +01:00
|
|
|
#ifdef KEXT_NET_DOORSTUCK_SOCKS_FBCON
|
|
|
|
|
#include <socks/fbcon.h>
|
|
|
|
|
#endif
|
|
|
|
|
|
2023-02-04 19:03:45 +00:00
|
|
|
extern unsigned long get_rflags(void);
|
2022-12-21 08:29:33 +00:00
|
|
|
|
2023-02-05 10:50:13 +00:00
|
|
|
extern char __pstart[], __pend[];
|
|
|
|
|
|
2023-05-10 20:34:53 +01:00
|
|
|
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,
|
|
|
|
|
};
|
|
|
|
|
|
2023-02-04 19:19:48 +00:00
|
|
|
void print_kernel_banner(void)
|
|
|
|
|
{
|
|
|
|
|
printk("Socks kernel version " BUILD_ID);
|
|
|
|
|
}
|
|
|
|
|
|
2023-05-10 20:34:53 +01:00
|
|
|
static void hang(void)
|
|
|
|
|
{
|
|
|
|
|
while (1) {
|
|
|
|
|
printk("tick");
|
|
|
|
|
milli_sleep(2000);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2023-05-04 21:43:18 +01:00
|
|
|
void background_thread(void)
|
|
|
|
|
{
|
|
|
|
|
printk("background_thread() running on processor %u", this_cpu());
|
2023-05-07 12:38:06 +01:00
|
|
|
milli_sleep(500);
|
|
|
|
|
|
2023-05-04 21:43:18 +01:00
|
|
|
while (1) {
|
2023-05-10 20:34:53 +01:00
|
|
|
//printk("tock");
|
|
|
|
|
milli_sleep(2000);
|
2023-05-04 21:43:18 +01:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2023-05-10 20:34:53 +01:00
|
|
|
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);
|
|
|
|
|
}
|
|
|
|
|
|
2022-12-21 08:29:33 +00:00
|
|
|
void kernel_init(uintptr_t arg)
|
|
|
|
|
{
|
2023-02-03 20:24:27 +00:00
|
|
|
ml_init(arg);
|
2023-02-26 10:05:39 +00:00
|
|
|
|
2023-04-09 16:43:03 +01:00
|
|
|
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));
|
|
|
|
|
}
|
2023-04-08 09:27:21 +01:00
|
|
|
|
2023-06-09 21:24:51 +01:00
|
|
|
scan_all_buses();
|
|
|
|
|
|
2023-03-18 19:35:00 +00:00
|
|
|
printk("kernel_init() running on processor %u", this_cpu());
|
|
|
|
|
|
2023-05-04 21:43:18 +01:00
|
|
|
create_kernel_thread(background_thread);
|
|
|
|
|
|
2023-05-14 21:11:32 +01:00
|
|
|
struct object *kbd;
|
2023-05-10 20:34:53 +01:00
|
|
|
|
2023-06-02 19:35:07 +01:00
|
|
|
run_all_tests();
|
2023-05-10 20:34:53 +01:00
|
|
|
|
2023-06-10 21:41:07 +01:00
|
|
|
#ifdef KEXT_NET_DOORSTUCK_SOCKS_FBCON
|
|
|
|
|
struct object *fb;
|
2023-06-08 20:46:43 +01:00
|
|
|
status = object_get("/dev/video/fb0", &fb);
|
|
|
|
|
if (status == KERN_OK) {
|
2023-06-10 21:41:07 +01:00
|
|
|
start_console_on_framebuffer(cast_to_device(fb));
|
2023-06-08 20:46:43 +01:00
|
|
|
}
|
2023-06-10 21:41:07 +01:00
|
|
|
#endif
|
2023-06-08 20:46:43 +01:00
|
|
|
|
|
|
|
|
status = object_get("/dev/input/input0", &kbd);
|
2023-06-02 19:35:07 +01:00
|
|
|
if (status != KERN_OK) {
|
2023-05-10 20:34:53 +01:00
|
|
|
printk("no keyboard available");
|
|
|
|
|
hang();
|
|
|
|
|
}
|
|
|
|
|
|
2023-03-19 20:36:36 +00:00
|
|
|
while (1) {
|
2023-05-10 20:34:53 +01:00
|
|
|
struct input_event ev;
|
|
|
|
|
size_t r;
|
2023-05-14 21:11:32 +01:00
|
|
|
status = object_read(kbd, &ev, sizeof ev, &r, 0);
|
2023-05-10 20:34:53 +01:00
|
|
|
|
|
|
|
|
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);
|
2023-03-19 20:36:36 +00:00
|
|
|
}
|
2023-05-10 20:34:53 +01:00
|
|
|
|
|
|
|
|
hang();
|
2022-12-21 08:29:33 +00:00
|
|
|
}
|