From fa4ce2afc79451dfcab79982c604710238cd5aa6 Mon Sep 17 00:00:00 2001 From: Atheria Date: Sun, 2 Nov 2025 18:59:43 +0700 Subject: [PATCH 1/2] PS2 keymaps --- CMakeLists.txt | 1 + arch/x86_64/features/x64.h | 3 +- cmake/ccache.cmake | 2 +- cmake/configuration.cmake | 1 + cmake/flags.cmake | 4 ++ cmake/source.cmake | 1 + drivers/PS2.c | 23 ++------ drivers/PS2.h | 69 +++++++++++----------- drivers/PS2Keymap.c | 118 +++++++++++++++++++++++++++++++++++++ drivers/PS2Keymap.h | 25 ++++++++ kernel/etc/Shell.c | 23 ++++++++ vfcompositor/Compositor.c | 2 - 12 files changed, 214 insertions(+), 58 deletions(-) create mode 100644 drivers/PS2Keymap.c create mode 100644 drivers/PS2Keymap.h diff --git a/CMakeLists.txt b/CMakeLists.txt index a19704b..25b5471 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -174,6 +174,7 @@ add_custom_target(run -cdrom ${CMAKE_CURRENT_BINARY_DIR}/VoidFrame.iso -no-reboot -no-shutdown -m 4G + -smp 4 -boot d # Debug console and serial output -debugcon file:bootstrap.log diff --git a/arch/x86_64/features/x64.h b/arch/x86_64/features/x64.h index 341318f..4eac766 100644 --- a/arch/x86_64/features/x64.h +++ b/arch/x86_64/features/x64.h @@ -61,12 +61,13 @@ typedef struct { __asm__ volatile("mfence; sfence; lfence" ::: "memory");\ __sync_synchronize();\ } +#ifdef VF_CONFIG_INTEL #define _full_mem_prot_end_intel() {\ __asm__ volatile("mfence; sfence; lfence" ::: "memory");\ __sync_synchronize();\ __builtin_ia32_serialize();\ } - +#endif void CpuInit(void); CpuFeatures* GetCpuFeatures(void); diff --git a/cmake/ccache.cmake b/cmake/ccache.cmake index 192edba..fe76ecf 100644 --- a/cmake/ccache.cmake +++ b/cmake/ccache.cmake @@ -13,7 +13,7 @@ if(VF_ENABLE_CCACHE) # Set ccache options for kernel development set(ENV{CCACHE_SLOPPINESS} "file_macro,locale,time_macros") - set(ENV{CCACHE_MAXSIZE} "2G") + set(ENV{CCACHE_MAXSIZE} "12G") set(ENV{CCACHE_COMPRESS} "true") set(ENV{CCACHE_COMPRESSLEVEL} "6") diff --git a/cmake/configuration.cmake b/cmake/configuration.cmake index ff174e7..f79a60f 100644 --- a/cmake/configuration.cmake +++ b/cmake/configuration.cmake @@ -6,6 +6,7 @@ option(AUTOMATIC_POST "Run POST automatically on boot" OFF) option(DEBUG_SYMBOLS "Enable debug symbols" ON) option(STACK_PROTECTION "Enable stack protection" ON) option(SILENT_BUILD "Enable silent build (suppress warnings)" OFF) +option(SANITIZER "Enable sanitizers" ON) option(VF_CONFIG_ENABLE_VMWARE_SVGA_II "Enable VMware SVGA II support" OFF) option(VF_CONFIG_PANIC_OVERRIDE "Enable panic override" OFF) diff --git a/cmake/flags.cmake b/cmake/flags.cmake index 7659e92..82cc25a 100644 --- a/cmake/flags.cmake +++ b/cmake/flags.cmake @@ -15,6 +15,10 @@ if(STACK_PROTECTION) string(APPEND C_FLAGS " -fstack-protector-all -D_FORTIFY_SOURCE=2") endif() +#if(SANITIZER) +# string(APPEND C_FLAGS " -fsanitize=undefined,integer,bounds,shift,null,return,vla-bound") +#endif() + if(DEBUG_SYMBOLS) string(APPEND C_FLAGS " -g3 -DDEBUG") string(APPEND CMAKE_ASM_NASM_FLAGS " -g -O0") diff --git a/cmake/source.cmake b/cmake/source.cmake index f12b391..7e8de26 100644 --- a/cmake/source.cmake +++ b/cmake/source.cmake @@ -93,6 +93,7 @@ set(DRIVER_SOURCES drivers/Serial.c drivers/Random.c drivers/PS2.c + drivers/PS2Keymap.c drivers/storage/Ide.c drivers/Vesa.c drivers/PCI/PCI.c diff --git a/drivers/PS2.c b/drivers/PS2.c index 2634fbb..fc22199 100644 --- a/drivers/PS2.c +++ b/drivers/PS2.c @@ -1,5 +1,6 @@ #include #include +#include #include #include @@ -27,22 +28,7 @@ typedef struct { static MouseState mouse = {0}; -static char scancode_to_ascii[] = { - 0, 27, '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '-', '=', '\b', - '\t', 'q', 'w', 'e', 'r', 't', 'y', 'u', 'i', 'o', 'p', '[', ']', '\n', - 0, 'a', 's', 'd', 'f', 'g', 'h', 'j', 'k', 'l', ';', '\'', '`', - 0, '\\', 'z', 'x', 'c', 'v', 'b', 'n', 'm', ',', '.', '/', 0, - '*', 0, ' ' -}; -static char scancode_to_ascii_shift[] = { - 0, 27, '!', '@', '#', '$', '%', '^', '&', '*', '(', ')', '_', '+', '\b', - '\t', 'Q', 'W', 'E', 'R', 'T', 'Y', 'U', 'I', 'O', 'P', '{', '}', '\n', - 0, 'A', 'S', 'D', 'F', 'G', 'H', 'J', 'K', 'L', ':', '"', '~', - 0, '|', 'Z', 'X', 'C', 'V', 'B', 'N', 'M', '<', '>', '?', 0, - - '*', 0, ' ' -}; // Compute result of a modifier combo with a base character. char PS2_CalcCombo(uint8_t mods, char base) { @@ -83,6 +69,8 @@ void send_mouse_command(uint8_t cmd) { } void PS2Init(void) { + PS2_InitKeymaps(); + uint8_t status = inb(KEYBOARD_STATUS_PORT); if (status & 0xC0) { // Bits 6-7: timeout/parity errors PrintKernelWarning("PS2: Controller errors detected, performing reset\n"); @@ -173,10 +161,9 @@ static void ProcessKeyboardData(uint8_t scancode) { } if (key_released) return; - if (scancode >= sizeof(scancode_to_ascii)) return; - char base = shift_pressed ? scancode_to_ascii_shift[scancode] - : scancode_to_ascii[scancode]; + char base = PS2_TranslateKey(scancode, shift_pressed); + if (!base) return; uint8_t mods = (shift_pressed ? K_SHIFT : 0) | (ctrl_pressed ? K_CTRL : 0) | diff --git a/drivers/PS2.h b/drivers/PS2.h index 5c96079..a88f48f 100644 --- a/drivers/PS2.h +++ b/drivers/PS2.h @@ -1,47 +1,38 @@ -#include -#include +#ifndef VOIDFRAME_PS2_H +#define VOIDFRAME_PS2_H -#ifndef PS2_H -#define PS2_H +#include -#define KEYBOARD_DATA_PORT 0x60 -#define KEYBOARD_STATUS_PORT 0x64 +// PS/2 Controller ports +#define KEYBOARD_DATA_PORT 0x60 +#define KEYBOARD_STATUS_PORT 0x64 -// PS2 Controller Commands -#define PS2_CMD_READ_CONFIG 0x20 -#define PS2_CMD_WRITE_CONFIG 0x60 -#define PS2_CMD_DISABLE_AUX 0xA7 -#define PS2_CMD_ENABLE_AUX 0xA8 -#define PS2_CMD_TEST_AUX 0xA9 -#define PS2_CMD_WRITE_AUX 0xD4 +// PS/2 Commands +#define PS2_CMD_READ_CONFIG 0x20 +#define PS2_CMD_WRITE_CONFIG 0x60 +#define PS2_CMD_DISABLE_AUX 0xA7 +#define PS2_CMD_ENABLE_AUX 0xA8 +#define PS2_CMD_WRITE_AUX 0xD4 -// Mouse Commands -#define MOUSE_CMD_RESET 0xFF -#define MOUSE_CMD_ENABLE 0xF4 -#define MOUSE_CMD_SET_DEFAULTS 0xF6 -#define MOUSE_CMD_SET_SAMPLE 0xF3 +// Mouse commands +#define MOUSE_CMD_SET_DEFAULTS 0xF6 +#define MOUSE_CMD_ENABLE 0xF4 -// Modifier flags for combos +// Modifier key flags #define K_SHIFT 0x01 #define K_CTRL 0x02 #define K_ALT 0x04 -#define K_SUPER 0x08 - -// Compute the resulting character for a given modifier combo and base char -char PS2_CalcCombo(uint8_t mods, char base); -// Fast helper for control-key combos: returns ASCII control code for letters -static inline char PS2_Ctrl(char c) { - if (c >= 'a' && c <= 'z') return (char)(c - 'a' + 1); - if (c >= 'A' && c <= 'Z') return (char)(c - 'A' + 1); - return c; -} - - -//keyboard +// PS/2 functions void PS2Init(void); -// Unified PS/2 interrupt handler void PS2Handler(void); + +// Keyboard functions +char PS2_GetChar(void); +int PS2_HasInput(void); +char PS2_CalcCombo(uint8_t mods, char base); + +// Mouse functions int GetMouseX(void); int GetMouseY(void); int GetMouseDeltaX(void); @@ -50,6 +41,12 @@ uint8_t GetMouseButtons(void); int IsLeftButtonPressed(void); int IsRightButtonPressed(void); int IsMiddleButtonPressed(void); -char PS2_GetChar(void); -int PS2_HasInput(void); -#endif \ No newline at end of file + +// Helper function for control characters +static inline char PS2_Ctrl(char c) { + if (c >= 'a' && c <= 'z') return c - 'a' + 1; + if (c >= 'A' && c <= 'Z') return c - 'A' + 1; + return c; +} + +#endif // VOIDFRAME_PS2_H \ No newline at end of file diff --git a/drivers/PS2Keymap.c b/drivers/PS2Keymap.c new file mode 100644 index 0000000..866fcee --- /dev/null +++ b/drivers/PS2Keymap.c @@ -0,0 +1,118 @@ +#include +#include +#include +#include + +#define MAX_KEYMAPS 8 + +static Keymap keymaps[MAX_KEYMAPS]; +static int keymap_count = 0; +static int current_keymap = 0; + +// US QWERTY layout +static const Keymap us_qwerty = { + .name = "us_qwerty", + .normal = { + 0, 27, '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '-', '=', '\b', + '\t', 'q', 'w', 'e', 'r', 't', 'y', 'u', 'i', 'o', 'p', '[', ']', '\n', + 0, 'a', 's', 'd', 'f', 'g', 'h', 'j', 'k', 'l', ';', '\'', '`', + 0, '\\', 'z', 'x', 'c', 'v', 'b', 'n', 'm', ',', '.', '/', 0, + '*', 0, ' ' + }, + .shift = { + 0, 27, '!', '@', '#', '$', '%', '^', '&', '*', '(', ')', '_', '+', '\b', + '\t', 'Q', 'W', 'E', 'R', 'T', 'Y', 'U', 'I', 'O', 'P', '{', '}', '\n', + 0, 'A', 'S', 'D', 'F', 'G', 'H', 'J', 'K', 'L', ':', '"', '~', + 0, '|', 'Z', 'X', 'C', 'V', 'B', 'N', 'M', '<', '>', '?', 0, + '*', 0, ' ' + } +}; + +static const Keymap us_qwertz = { + .name = "us_qwertz", + .normal = { + 0, 27, '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '-', '=', '\b', + '\t', 'q', 'w', 'e', 'r', 't', 'z', 'u', 'i', 'o', 'p', '[', ']', '\n', + 0, 'a', 's', 'd', 'f', 'g', 'h', 'j', 'k', 'l', ';', '\'', '`', + 0, '\\', 'y', 'x', 'c', 'v', 'b', 'n', 'm', ',', '.', '/', 0, + '*', 0, ' ' + }, + .shift = { + 0, 27, '!', '@', '#', '$', '%', '^', '&', '*', '(', ')', '_', '+', '\b', + '\t', 'Q', 'W', 'E', 'R', 'T', 'Z', 'U', 'I', 'O', 'P', '{', '}', '\n', + 0, 'A', 'S', 'D', 'F', 'G', 'H', 'J', 'K', 'L', ':', '"', '~', + 0, '|', 'Y', 'X', 'C', 'V', 'B', 'N', 'M', '<', '>', '?', 0, + '*', 0, ' ' + } +}; + +// Dvorak layout +static const Keymap dvorak = { + .name = "dvorak", + .normal = { + 0, 27, '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '[', ']', '\b', + '\t', '\'', ',', '.', 'p', 'y', 'f', 'g', 'c', 'r', 'l', '/', '=', '\n', + 0, 'a', 'o', 'e', 'u', 'i', 'd', 'h', 't', 'n', 's', '-', '`', + 0, '\\', ';', 'q', 'j', 'k', 'x', 'b', 'm', 'w', 'v', 'z', 0, + '*', 0, ' ' + }, + .shift = { + 0, 27, '!', '@', '#', '$', '%', '^', '&', '*', '(', ')', '{', '}', '\b', + '\t', '"', '<', '>', 'P', 'Y', 'F', 'G', 'C', 'R', 'L', '?', '+', '\n', + 0, 'A', 'O', 'E', 'U', 'I', 'D', 'H', 'T', 'N', 'S', '_', '~', + 0, '|', ':', 'Q', 'J', 'K', 'X', 'B', 'M', 'W', 'V', 'Z', 0, + '*', 0, ' ' + } +}; + +void PS2_InitKeymaps(void) { + keymap_count = 0; + PS2_RegisterKeymap(&us_qwerty); + PS2_RegisterKeymap(&dvorak); + PS2_RegisterKeymap(&us_qwertz); + current_keymap = 0; + PrintKernelSuccess("PS2: Initialized keymaps (default: us)\n"); +} + +int PS2_RegisterKeymap(const Keymap* keymap) { + if (keymap_count >= MAX_KEYMAPS) return -1; + + FastMemcpy(&keymaps[keymap_count], keymap, sizeof(Keymap)); + keymap_count++; + return 0; +} + +int PS2_SetKeymap(const char* name) { + for (int i = 0; i < keymap_count; i++) { + if (FastStrCmp(keymaps[i].name, name) == 0) { + current_keymap = i; + PrintKernelF("PS2: Switched to keymap: %s\n", name); + return 0; + } + } + return -1; +} + +const char* PS2_GetCurrentKeymapName(void) { + if (current_keymap < keymap_count) { + return keymaps[current_keymap].name; + } + return "unknown"; +} + +void PS2_ListKeymaps(void) { + PrintKernel("Available keymaps:\n"); + for (int i = 0; i < keymap_count; i++) { + PrintKernelF(" %s%s\n", keymaps[i].name, + (i == current_keymap) ? " (current)" : ""); + } +} + +char PS2_TranslateKey(uint8_t scancode, int shift_pressed) { + if (current_keymap >= keymap_count || scancode >= MAX_SCANCODE) { + return 0; + } + + return shift_pressed ? keymaps[current_keymap].shift[scancode] + : keymaps[current_keymap].normal[scancode]; +} \ No newline at end of file diff --git a/drivers/PS2Keymap.h b/drivers/PS2Keymap.h new file mode 100644 index 0000000..98f539d --- /dev/null +++ b/drivers/PS2Keymap.h @@ -0,0 +1,25 @@ +#ifndef VOIDFRAME_PS2_KEYMAP_H +#define VOIDFRAME_PS2_KEYMAP_H + +#include + +#define MAX_SCANCODE 128 +#define MAX_KEYMAP_NAME 32 + +typedef struct { + char name[MAX_KEYMAP_NAME]; + char normal[MAX_SCANCODE]; + char shift[MAX_SCANCODE]; +} Keymap; + +// Keymap management +void PS2_InitKeymaps(void); +int PS2_SetKeymap(const char* name); +const char* PS2_GetCurrentKeymapName(void); +void PS2_ListKeymaps(void); +int PS2_RegisterKeymap(const Keymap* keymap); + +// Internal functions +char PS2_TranslateKey(uint8_t scancode, int shift_pressed); + +#endif // VOIDFRAME_PS2_KEYMAP_H \ No newline at end of file diff --git a/kernel/etc/Shell.c b/kernel/etc/Shell.c index 005a675..5190600 100644 --- a/kernel/etc/Shell.c +++ b/kernel/etc/Shell.c @@ -27,6 +27,7 @@ #include #include #include +#include #include #include #include @@ -190,6 +191,7 @@ static const HelpEntry system_cmds[] = { {"lscpu", "List CPU features"}, {"vfc NULL/fork", "Start VFCompositor as another process or on the currently session"}, {"snoozer ", "Snooze messages from PrintKernel"}, + {"keymap <...>", "Set keymap"}, {"acpi sd/rb", "Shutdown (sd) or reboot (rb) via ACPI"}, }; @@ -1250,6 +1252,26 @@ FNDEF(GetSerialHandler) { PrintNewline(); } +static void KeymapHandler(const char* args) { + char* keymap = GetArg(args, 1); + if (!keymap) { + PrintKernelF("Current keymap: %s\n", PS2_GetCurrentKeymapName()); + PS2_ListKeymaps(); + return; + } + + + if (PS2_SetKeymap(keymap) == 0) { + PrintKernelF("Keymap set to %s\n", keymap); + return; + } + PrintKernelF("Failed to set keymap to %s\n", keymap); + PrintKernel("Usage: keymap [layout]\n"); + PrintKernel(" keymap - show current keymap and list available\n"); + PrintKernel(" keymap us - switch to US QWERTY\n"); + PrintKernel(" keymap dvorak - switch to Dvorak\n"); +} + static const ShellCommand commands[] = {\ {"help", HelpHandler}, {"ps", PSHandler}, @@ -1306,6 +1328,7 @@ static const ShellCommand commands[] = {\ {"mount", MountHandler}, {"umount", UnmountHandler}, {"gserial", GetSerialHandler}, + {"keymap", KeymapHandler}, }; void ExecuteCommand(const char* cmd) { diff --git a/vfcompositor/Compositor.c b/vfcompositor/Compositor.c index 42420a3..cec2555 100644 --- a/vfcompositor/Compositor.c +++ b/vfcompositor/Compositor.c @@ -480,8 +480,6 @@ void VFCompositor(void) { Window* w = g_compositor_ctx.g_focused_window; if (w) { w->minimized = !w->minimized; } } else if (c == PS2_CalcCombo(K_CTRL, 'L')) { Window* w = g_compositor_ctx.g_focused_window; if (w) { w->is_moving = true; w->move_offset_x = g_compositor_ctx.g_mouse_x - w->rect.x; } - } else if (c == PS2_CalcCombo(K_SUPER, 'W')) { - Window* w = g_compositor_ctx.g_focused_window; if (w) { RequestDestroyWindow(&g_compositor_ctx, w); } } else if (c == PS2_CalcCombo(K_ALT, '\t')) { Window* w = g_compositor_ctx.g_focused_window ? g_compositor_ctx.g_focused_window->next : g_compositor_ctx.g_window_list_head; while (w && w->minimized) w = w->next; From 29e63543f8aca74b41ce0f34d38c0593b4b46eda Mon Sep 17 00:00:00 2001 From: Atheria Date: Sun, 2 Nov 2025 19:35:06 +0700 Subject: [PATCH 2/2] Sanitizer --- cmake/cache.cmake | 3 +++ cmake/configuration.cmake | 6 +++--- cmake/flags.cmake | 8 ++++---- cmake/source.cmake | 6 ++++++ kernel/ubsan/Sanitizer.c | 31 +++++++++++++++++++++++++++++++ kernel/ubsan/Sanitizer.h | 1 + 6 files changed, 48 insertions(+), 7 deletions(-) create mode 100644 kernel/ubsan/Sanitizer.c create mode 100644 kernel/ubsan/Sanitizer.h diff --git a/cmake/cache.cmake b/cmake/cache.cmake index 24aef03..25522ad 100644 --- a/cmake/cache.cmake +++ b/cmake/cache.cmake @@ -3,3 +3,6 @@ # ============================================================================ set(VF_SCHEDULER "EEVDF" CACHE STRING "Scheduler type: MLFQ or EEVDF") set_property(CACHE VF_SCHEDULER PROPERTY STRINGS MLFQ EEVDF) + +set(CLANG_TARGET_TRIPLE "x86_64-unknown-none-elf" CACHE STRING "Clang target triple for cross-compilation") +set_property(CACHE CLANG_TARGET_TRIPLE PROPERTY STRINGS x86_64-unknown-none-elf x86_64-pc-none-elf x86_64-pc-linux-gnu) # Why would anyone use linux-gnu for a kernel? Who knows. \ No newline at end of file diff --git a/cmake/configuration.cmake b/cmake/configuration.cmake index f79a60f..630c70e 100644 --- a/cmake/configuration.cmake +++ b/cmake/configuration.cmake @@ -3,10 +3,10 @@ # ============================================================================ option(EXCLUDE_EXTRA_OBJECTS "Exclude extra objects from the build" OFF) option(AUTOMATIC_POST "Run POST automatically on boot" OFF) -option(DEBUG_SYMBOLS "Enable debug symbols" ON) +option(DEBUG_SYMBOLS "Enable debug symbols" OFF) option(STACK_PROTECTION "Enable stack protection" ON) -option(SILENT_BUILD "Enable silent build (suppress warnings)" OFF) -option(SANITIZER "Enable sanitizers" ON) +option(SILENT_BUILD "Enable silent build (suppress warnings)" ON) +option(SANITIZER "Enable sanitizers" OFF) option(VF_CONFIG_ENABLE_VMWARE_SVGA_II "Enable VMware SVGA II support" OFF) option(VF_CONFIG_PANIC_OVERRIDE "Enable panic override" OFF) diff --git a/cmake/flags.cmake b/cmake/flags.cmake index 82cc25a..f74bf67 100644 --- a/cmake/flags.cmake +++ b/cmake/flags.cmake @@ -1,7 +1,7 @@ # ============================================================================ # Compiler Flags # ============================================================================ -set(C_FLAGS " -m64 -target x86_64-unknown-none-elf -O2 -fno-omit-frame-pointer -finline-functions -foptimize-sibling-calls -nostdinc -nostdlib -fno-builtin -ffreestanding -mno-red-zone -mserialize -fPIE -fPIC -mcmodel=kernel -fcf-protection=full -fvisibility=hidden") +set(C_FLAGS " -m64 -target ${CLANG_TARGET_TRIPLE} -O2 -fno-omit-frame-pointer -finline-functions -foptimize-sibling-calls -nostdinc -nostdlib -fno-builtin -ffreestanding -mno-red-zone -mserialize -fPIE -fPIC -mcmodel=kernel -fcf-protection=full -fvisibility=hidden") if(SILENT_BUILD) string(APPEND C_FLAGS " -w") @@ -15,9 +15,9 @@ if(STACK_PROTECTION) string(APPEND C_FLAGS " -fstack-protector-all -D_FORTIFY_SOURCE=2") endif() -#if(SANITIZER) -# string(APPEND C_FLAGS " -fsanitize=undefined,integer,bounds,shift,null,return,vla-bound") -#endif() +if(SANITIZER) + string(APPEND C_FLAGS " -fsanitize=bounds,null,return,vla-bound") +endif() if(DEBUG_SYMBOLS) string(APPEND C_FLAGS " -g3 -DDEBUG") diff --git a/cmake/source.cmake b/cmake/source.cmake index 7e8de26..9777235 100644 --- a/cmake/source.cmake +++ b/cmake/source.cmake @@ -41,6 +41,10 @@ set(KERNEL_ETC_SOURCES kernel/etc/POST.c ) +set(UBSAN_SOURCES + kernel/ubsan/Sanitizer.c +) + set(ATOMIC_IPC_SOURCES kernel/atomic/Atomics.c kernel/atomic/cpp/Spinlock.cpp @@ -196,6 +200,7 @@ include_directories( kernel/execf/macho kernel/ipc kernel/sched + kernel/ubsan mm mm/asm mm/dynamic @@ -237,4 +242,5 @@ set(C_SOURCES ${INCLUDE_SOURCES} ${VFC_SOURCES} ${CRYPTO_SOURCES} + ${UBSAN_SOURCES} ) \ No newline at end of file diff --git a/kernel/ubsan/Sanitizer.c b/kernel/ubsan/Sanitizer.c new file mode 100644 index 0000000..a453443 --- /dev/null +++ b/kernel/ubsan/Sanitizer.c @@ -0,0 +1,31 @@ +#include +#include + +#define UBSAN_HANDLER(name) \ + void __attribute__((noreturn)) name() { \ + PANIC(#name); \ + } + +UBSAN_HANDLER(__ubsan_handle_add_overflow) +UBSAN_HANDLER(__ubsan_handle_sub_overflow) +UBSAN_HANDLER(__ubsan_handle_mul_overflow) +UBSAN_HANDLER(__ubsan_handle_divrem_overflow) +UBSAN_HANDLER(__ubsan_handle_negate_overflow) +UBSAN_HANDLER(__ubsan_handle_shift_out_of_bounds) +UBSAN_HANDLER(__ubsan_handle_load_invalid_value) +UBSAN_HANDLER(__ubsan_handle_out_of_bounds) +UBSAN_HANDLER(__ubsan_handle_type_mismatch) +UBSAN_HANDLER(__ubsan_handle_vla_bound_not_positive) +UBSAN_HANDLER(__ubsan_handle_nonnull_return) +UBSAN_HANDLER(__ubsan_handle_nonnull_arg) +UBSAN_HANDLER(__ubsan_handle_pointer_overflow) +UBSAN_HANDLER(__ubsan_handle_float_cast_overflow) +UBSAN_HANDLER(__ubsan_handle_float_cast_invalid_value) +UBSAN_HANDLER(__ubsan_handle_invalid_builtin) +UBSAN_HANDLER(__ubsan_handle_missing_return) +UBSAN_HANDLER(__ubsan_handle_implicit_conversion) +UBSAN_HANDLER(__ubsan_handle_type_mismatch_v1) +UBSAN_HANDLER(__ubsan_handle_builtin_unreachable) +UBSAN_HANDLER(__ubsan_handle_function_type_mismatch) +UBSAN_HANDLER(__ubsan_handle_nonnull_return_v1) +UBSAN_HANDLER(__ubsan_handle_nonnull_arg_v1) \ No newline at end of file diff --git a/kernel/ubsan/Sanitizer.h b/kernel/ubsan/Sanitizer.h new file mode 100644 index 0000000..7b9637e --- /dev/null +++ b/kernel/ubsan/Sanitizer.h @@ -0,0 +1 @@ +#pragma once \ No newline at end of file