From c375c9389352d579b6a3232e5952763f18cf8e4e Mon Sep 17 00:00:00 2001 From: Daniel Yang Date: Sun, 19 Nov 2023 01:35:36 -0800 Subject: [PATCH 1/3] cleaned up stuff --- source/kernel/idt.c | 33 --------------------------------- source/kernel/isr.c | 6 ++++++ source/kernel/kernel.c | 26 ++------------------------ source/kernel/memory.c | 3 ++- 4 files changed, 10 insertions(+), 58 deletions(-) diff --git a/source/kernel/idt.c b/source/kernel/idt.c index d5651ec..37f358f 100644 --- a/source/kernel/idt.c +++ b/source/kernel/idt.c @@ -19,39 +19,6 @@ __attribute__((aligned(0x10))) static idt_entry_t idt[NUM_IDTS]; // define the idtr static idtr_t idtr; -static uint32_t has_triggered = 0; -static uint32_t hits = 0; -static uint32_t oopsie_woopsie = 0; - -uint32_t get_hits(void) { return oopsie_woopsie; } - -// we no-inline because I don't want it inlined :lemonthink: -// also i want the actual isr to only have save register, call, then iret -__attribute__((noinline)) static void actual_exception_handler(void) -{ - oopsie_woopsie++; -} - -// this currently will triple-fault on pressing a keyboard -__attribute__((noinline)) static void actualirq1Handler(void) -{ - // seems to triple fault before reaching here, idk pls can we get serial - // driver - hits++; - if (terminal_driver_loaded() && !has_triggered) { - terminal_putchar('U'); - terminal_update_cursor(); - // inb(0x60) is the port containing the key pressed - terminal_put64(inb(0x60)); - terminal_update_cursor(); - - // send eoi to the master PIC - // this is needed in the PIC remapping, don't question it - outb(0x20, 0x20); - __asm__ volatile("cli"); - } -} - void idt_set_entry(int idx, uint32_t handler_ptr, uint16_t code_selector, uint8_t attributes) { diff --git a/source/kernel/isr.c b/source/kernel/isr.c index c9addbf..1ccc0fb 100644 --- a/source/kernel/isr.c +++ b/source/kernel/isr.c @@ -21,6 +21,8 @@ void breakpoint(registers_t *frame) { printf("breakpoint\n"); } void overflow(registers_t *frame) { printf("overflow trap\n"); } +void pagefault(registers_t *frame) { printf("page fault\n"); } + void init_isr() { for (int i = 0; i < 256; i++) @@ -31,9 +33,13 @@ void init_isr() register_interrupt_handler(3, &breakpoint); register_interrupt_handler(4, &overflow); + register_interrupt_handler(14, &pagefault); + // irq handlers register_interrupt_handler(33, &keyboard_irq); + printf("%x\n", &keyboard_irq); + // handler initializations keyboard_init(); } diff --git a/source/kernel/kernel.c b/source/kernel/kernel.c index f1fe5bd..3a72fe1 100644 --- a/source/kernel/kernel.c +++ b/source/kernel/kernel.c @@ -12,32 +12,10 @@ void main() { init_drivers(); terminal_clear(); - init_paging(); terminal_update_cursor(); init_idt(); - asm volatile("int $0x3"); - asm volatile("int $0x4"); + init_paging(); + printf("Hello"); write_serial(COM1, "Hello From SecureOS!"); - // printf(s.data); - - // init_paging(); - // string s; - // s.data = - // "HEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEELLLLLLLLLLLLLLLLLLLLLLLLLLL" - // "LLOOOOOOOOOOOOOOOOOOOOOOOOOOOOO"; - // s.len = 96; - // printf(&s); - // uint32_t* wow = (uint32_t*) 0x12340000; - // palloc(wow, PAGE_PRESENT | PAGE_RW); - // *wow = 0x42042069; - // terminal_put64(*wow); - // for (int i = 0; i < 30; i ++) { - // uint32_t* smol = kalloc(200); - // *smol = 0x12345678; - // terminal_put64(smol); - // terminal_putchar(' '); - // terminal_put64(*smol); - // terminal_putchar('\n'); - // } } diff --git a/source/kernel/memory.c b/source/kernel/memory.c index 978d696..82ccd73 100644 --- a/source/kernel/memory.c +++ b/source/kernel/memory.c @@ -1,7 +1,7 @@ #include "memory.h" #include "terminal_driver.h" +#include "io.h" #include -#include uint32_t l2_page_table[1024] __attribute__((aligned(4096))); @@ -266,5 +266,6 @@ void print_chunks() void init_paging() { // unmap lower page + printf("%x\n", l2_page_table[0]); l2_page_table[0] = 0; } From 16edd56bc500ba78aafafa772a2352e49debb617 Mon Sep 17 00:00:00 2001 From: Daniel Yang Date: Sun, 19 Nov 2023 01:37:04 -0800 Subject: [PATCH 2/3] fixed the looping issue on interrupts. it was the motherfucking kernel_entry page directory offset. --- source/kernel/kernel_entry.asm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/kernel/kernel_entry.asm b/source/kernel/kernel_entry.asm index a54116b..200878d 100644 --- a/source/kernel/kernel_entry.asm +++ b/source/kernel/kernel_entry.asm @@ -6,7 +6,7 @@ global kernel_entry ; flags for a megapage MEGAPAGE_FLAGS equ (1 << 7) | (1 << 1) | (1 << 0) -L2_PAGE_BASE equ l2_page_table - (1 << 31) +L2_PAGE_BASE equ l2_page_table - (0x80100000) kernel_entry: ; enable page size extensions From 3a721a985f4827c54e5ad7b4c622bccdd87cde9b Mon Sep 17 00:00:00 2001 From: Daniel Yang Date: Sun, 19 Nov 2023 02:19:27 -0800 Subject: [PATCH 3/3] timer interrupt --- source/kernel/idt.c | 2 +- source/kernel/include/timer.h | 4 ++- source/kernel/isr.c | 11 ++++---- source/kernel/memory.c | 1 - source/kernel/timer.c | 51 ++++++++++++++++++++++++++++++----- 5 files changed, 53 insertions(+), 16 deletions(-) diff --git a/source/kernel/idt.c b/source/kernel/idt.c index 37f358f..2b5f04a 100644 --- a/source/kernel/idt.c +++ b/source/kernel/idt.c @@ -76,7 +76,7 @@ void setup_pic(void) // // remember that ^ toggles bits, so bits 1 and 2 will be toggled to 0 // (which will enable them in hw) - mask1 = 0xff ^ (1 << 1 | 1 << 2); + mask1 = 0xff ^ (1 << 0 | 1 << 1 | 1 << 2); mask2 = 0xff; outb(0x21, mask1); io_wait(); diff --git a/source/kernel/include/timer.h b/source/kernel/include/timer.h index 765542f..4321d2f 100644 --- a/source/kernel/include/timer.h +++ b/source/kernel/include/timer.h @@ -1,4 +1,6 @@ #pragma once #include +#include "idt.h" -unsigned long long get_cpu_time(); \ No newline at end of file +void timer_init(uint32_t hz); +void timer_irq(registers_t *frame); diff --git a/source/kernel/isr.c b/source/kernel/isr.c index 1ccc0fb..23a07a0 100644 --- a/source/kernel/isr.c +++ b/source/kernel/isr.c @@ -3,6 +3,7 @@ #include "io.h" #include "keyboard_driver.h" #include "terminal_driver.h" +#include "timer.h" isr_t interrupt_handlers[256]; @@ -35,13 +36,11 @@ void init_isr() register_interrupt_handler(14, &pagefault); - // irq handlers - register_interrupt_handler(33, &keyboard_irq); - - printf("%x\n", &keyboard_irq); - - // handler initializations + // irq handlers IRQ# + 32 + timer_init(100); + register_interrupt_handler(32, &timer_irq); keyboard_init(); + register_interrupt_handler(33, &keyboard_irq); } void isr_handler(registers_t *frame) diff --git a/source/kernel/memory.c b/source/kernel/memory.c index 82ccd73..6d6321b 100644 --- a/source/kernel/memory.c +++ b/source/kernel/memory.c @@ -266,6 +266,5 @@ void print_chunks() void init_paging() { // unmap lower page - printf("%x\n", l2_page_table[0]); l2_page_table[0] = 0; } diff --git a/source/kernel/timer.c b/source/kernel/timer.c index 178ebac..f563691 100644 --- a/source/kernel/timer.c +++ b/source/kernel/timer.c @@ -1,12 +1,49 @@ #include "timer.h" +#include "io.h" -unsigned long long get_cpu_time() -{ - unsigned long long time_stamp; - // get time_stamp from cpu register - asm volatile("rdtsc" : "=A"(time_stamp)); +#define PORT_CHANNEL_0 0x40 +#define PORT_CHANNEL_1 0x41 +#define PORT_CHANNEL_2 0x42 +#define PORT_CMD 0x43 - return time_stamp; +// Channel options +#define CHANNEL_0 (0b00 << 6) +#define CHANNEL_1 (0b01 << 6) +#define CHANNEL_2 (0b10 << 6) +#define READ_BACK (0b11 << 6) + +// Access mode options +#define LATCH_COUNT (0b00 << 4) +#define LOBYTE_ONLY (0b01 << 4) +#define HIBYTE_ONLY (0b10 << 4) +#define LOBYTE_HIBYTE (0b11 << 4) + +// Operating mode options +#define MODE_0 (0b000 << 1) //interrupt on terminal count +#define MODE_1 (0b001 << 1) //hardware retriggerable one-shot +#define MODE_2 (0b010 << 1) //rate generator +#define MODE_3 (0b011 << 1) //square wave generator +#define MODE_4 (0b100 << 1) //software strobe +#define MODE_5 (0b101 << 1) //hardware strobe + +// BCD/Binary mode options +#define BINARY_MODE 0 +#define BCD_MODE 1 + +uint32_t divisor; +uint32_t tick; + +void timer_init(uint32_t hz) { + tick = 0; + divisor = 1193180 / hz; + outb(PORT_CMD, CHANNEL_0 | LOBYTE_HIBYTE | MODE_3 | BINARY_MODE); + uint8_t lowbyte = (uint8_t) (divisor & 0xFF); + uint8_t highbyte = (uint8_t) ((divisor >> 8) & 0xFF); + outb(PORT_CHANNEL_0, lowbyte); + outb(PORT_CHANNEL_0, highbyte); } -unsigned long long get_cpu_frequency() {} \ No newline at end of file +void timer_irq(registers_t *frame) { + tick++; + // printf("%x\n", tick); +}