From d6035dff80f56ad141ae3abe76bdf3ab4fc088a1 Mon Sep 17 00:00:00 2001 From: Tomas Date: Wed, 7 May 2025 08:56:09 +0200 Subject: [PATCH] Added sti() and cli() assembly wrappers --- TODO | 9 +++++---- kernel/include/system.h | 6 ++++++ kernel/src/isr.c | 3 +-- kernel/src/system.c | 8 ++++++++ kernel/src/task.c | 15 +++++++-------- kernel/src/timer.c | 4 ++-- 6 files changed, 29 insertions(+), 16 deletions(-) diff --git a/TODO b/TODO index 90b4086..a9d5dee 100644 --- a/TODO +++ b/TODO @@ -11,7 +11,7 @@ TODO [x] Paging [x] Serial monitor [x] kmalloc() -[ ] Make dedicated asm functions like lidt(), sti(), ... +[x] Make dedicated asm functions like lidt(), sti(), ... [ ] Add something like in the kernel [ ] Improve kmalloc() to reduce fragmentation [ ] Improve kmalloc() for better alignment @@ -20,9 +20,10 @@ TODO [ ] HPET [ ] System calls [ ] Userspace -[ ] Processes/Tasks -[ ] Scheduler -[ ] Task switching +[x] Processes/Tasks +[x] Scheduler +[ ] Priority scheduler +[x] Task switching [ ] Inter-process communication [ ] Graphics [ ] Multicore support diff --git a/kernel/include/system.h b/kernel/include/system.h index 4ac695a..d90c649 100644 --- a/kernel/include/system.h +++ b/kernel/include/system.h @@ -2,6 +2,8 @@ #define _SYSTEM_H #include +#include +#include // cpuid void cpuid(uint32_t* eax, uint32_t* ebx, uint32_t* ecx, uint32_t* edx); @@ -15,4 +17,8 @@ void outw(uint16_t port, uint16_t data); uint32_t inl(uint16_t port); void outl(uint16_t port, uint32_t data); +// x86 +void cli(void); +void sti(void); + #endif diff --git a/kernel/src/isr.c b/kernel/src/isr.c index b891668..4255ec2 100644 --- a/kernel/src/isr.c +++ b/kernel/src/isr.c @@ -1,6 +1,5 @@ #include #include -#include #include #include #include @@ -69,7 +68,7 @@ int isr_init(void) { idt_set_gate(0x80, (void*)(uint32_t)isr128, IDT_FLAG_USER); // Let interrupts interrupt - __asm__ volatile ("sti"); + sti(); debugf("[isr] ISR initialized.\n"); return 0; diff --git a/kernel/src/system.c b/kernel/src/system.c index 69b6ffd..cdcfd5f 100644 --- a/kernel/src/system.c +++ b/kernel/src/system.c @@ -42,3 +42,11 @@ void outl(uint16_t port, uint32_t data) { __asm__ volatile ("outl %1, %0" :: "dN"(port), "a"(data)); } +void cli(void) { + __asm__ volatile ("cli"); +} + +void sti(void) { + __asm__ volatile ("sti"); +} + diff --git a/kernel/src/task.c b/kernel/src/task.c index 8fc2a89..60cd290 100644 --- a/kernel/src/task.c +++ b/kernel/src/task.c @@ -2,6 +2,8 @@ #include #include #include +#include +#include #include #include #include @@ -31,7 +33,7 @@ int task_init(void) { } void task_create(size_t id, uint32_t eip, int kernel_task, uint32_t* pagedir, int argc, char** argv) { - __asm__ volatile ("cli"); // Make sure we don't get interrupted + cli(); uint32_t kstack = (uint32_t)kmalloc(0x1000 - 16) + (0x1000 - 16); uint8_t* kesp = (uint8_t*)kstack; @@ -82,12 +84,9 @@ void task_create(size_t id, uint32_t eip, int kernel_task, uint32_t* pagedir, in new->heap_start = USER_HEAP; new->heap_end = USER_HEAP; - debugf("[task] NEW! Task #%d - EIP = 0x%08x, ESP = 0x%08x%s\n", - id, eip, kesp, kernel_task ? " (kernel)" : ""); - // We don't need to setup a stack frame if (kernel_task) { - __asm__ volatile ("sti"); + sti(); return; } @@ -131,7 +130,7 @@ void task_create(size_t id, uint32_t eip, int kernel_task, uint32_t* pagedir, in } void task_kill(size_t id) { - __asm__ volatile ("cli"); + cli(); struct task* current = task_first; while (current != NULL) { @@ -171,8 +170,8 @@ void task_kill(size_t id) { } kfree(task); - // schedule(); - __asm__ volatile ("sti"); + schedule(); + sti(); } void task_set_user_heap(struct task* task, size_t heap_end) { diff --git a/kernel/src/timer.c b/kernel/src/timer.c index 5d8b989..0689301 100644 --- a/kernel/src/timer.c +++ b/kernel/src/timer.c @@ -27,7 +27,7 @@ int pit_init(void) { void pit_phase(uint8_t ch, uint8_t mode, uint32_t hz) { if (ch > 2 || mode > 7) return; - __asm__ volatile ("cli"); + cli(); outb(PIT_CMD, ((ch << 6) | (3 << 4) | (mode << 1))); @@ -36,7 +36,7 @@ void pit_phase(uint8_t ch, uint8_t mode, uint32_t hz) { outb(PIT_CH0 + ch, div >> 8); debugf("[PIT] Set PIT divisor to %d (%d Hz).\n", div, hz); - __asm__ volatile ("sti"); + sti(); } void pit_handler(struct isr_int_frame* iframe) {