diff options
Diffstat (limited to 'kernel/boot/idt')
-rw-r--r-- | kernel/boot/idt/exceptions.cc | 36 | ||||
-rw-r--r-- | kernel/boot/idt/idt.cc | 46 | ||||
-rw-r--r-- | kernel/boot/idt/isr.s | 72 |
3 files changed, 154 insertions, 0 deletions
diff --git a/kernel/boot/idt/exceptions.cc b/kernel/boot/idt/exceptions.cc new file mode 100644 index 0000000..79ffd68 --- /dev/null +++ b/kernel/boot/idt/exceptions.cc @@ -0,0 +1,36 @@ +/* + * bubbl + * Copyright (C) 2025 Raghuram Subramani <raghus2247@gmail.com> + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +#include <boot/idt.h> +#include <common.h> +#include <kernel/halt.h> +#include <libk/stdio.h> +#include <stdbool.h> + +namespace IDT +{ + +void +exception_handler(void) +{ + ASSERT_NOT_REACHED(); + while (true) + __asm__ volatile("cli; hlt"); +} + +} diff --git a/kernel/boot/idt/idt.cc b/kernel/boot/idt/idt.cc new file mode 100644 index 0000000..e640fd5 --- /dev/null +++ b/kernel/boot/idt/idt.cc @@ -0,0 +1,46 @@ +/* + * bubbl + * Copyright (C) 2025 Raghuram Subramani <raghus2247@gmail.com> + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +#include <boot/idt.h> +#include <kernel/io.h> + +namespace IDT +{ + +extern "C" void *isr_stub_table[]; + +entry_t l_entries[256]; +descriptor_t descriptor = { sizeof(l_entries) - 1, l_entries }; + +void +load(void) +{ + for (uint16_t i = 0; i < 256; i++) + l_entries[i] = (entry_t) { 0 }; + + /* The first 32 entries are exceptions */ + for (uint8_t i = 0; i < 32; i++) { + entry_t idt_entry = IDT_ENTRY((uint32_t) isr_stub_table[i], 0x8E); + l_entries[i] = idt_entry; + } + + __asm__ volatile("lidt %0" ::"m"(descriptor)); + __asm__ volatile("sti"); +} + +} diff --git a/kernel/boot/idt/isr.s b/kernel/boot/idt/isr.s new file mode 100644 index 0000000..925bb27 --- /dev/null +++ b/kernel/boot/idt/isr.s @@ -0,0 +1,72 @@ +;; +;; bubbl +;; Copyright (C) 2025 Raghuram Subramani <raghus2247@gmail.com> +;; +;; This program is free software: you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation, either version 3 of the License, or +;; (at your option) any later version. +;; +;; This program is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. +;; +;; You should have received a copy of the GNU General Public License +;; along with this program. If not, see <http://www.gnu.org/licenses/>. +;; + +extern exception_handler; + +global isr_stub_table +isr_stub_table: +%assign i 0 +%rep 32 +dd ISR_%+i +%assign i i+1 +%endrep + +%macro ISR_WITH_ERROR 1 +ISR_%+%1: + call exception_handler + iret +%endmacro + +%macro ISR_NO_ERROR 1 +ISR_%+%1: + call exception_handler + iret +%endmacro + +ISR_NO_ERROR 0 +ISR_NO_ERROR 1 +ISR_NO_ERROR 2 +ISR_NO_ERROR 3 +ISR_NO_ERROR 4 +ISR_NO_ERROR 5 +ISR_NO_ERROR 6 +ISR_NO_ERROR 7 +ISR_WITH_ERROR 8 +ISR_NO_ERROR 9 +ISR_WITH_ERROR 10 +ISR_WITH_ERROR 11 +ISR_WITH_ERROR 12 +ISR_WITH_ERROR 13 +ISR_WITH_ERROR 14 +ISR_NO_ERROR 15 +ISR_NO_ERROR 16 +ISR_WITH_ERROR 17 +ISR_NO_ERROR 18 +ISR_NO_ERROR 19 +ISR_NO_ERROR 20 +ISR_NO_ERROR 21 +ISR_NO_ERROR 22 +ISR_NO_ERROR 23 +ISR_NO_ERROR 24 +ISR_NO_ERROR 25 +ISR_NO_ERROR 26 +ISR_NO_ERROR 27 +ISR_NO_ERROR 28 +ISR_NO_ERROR 29 +ISR_WITH_ERROR 30 +ISR_NO_ERROR 31 |