Added sti() and cli() assembly wrappers

This commit is contained in:
2025-05-07 08:56:09 +02:00
parent c646404cf0
commit d6035dff80
6 changed files with 29 additions and 16 deletions
+5 -4
View File
@@ -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 <errno.h> 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
+6
View File
@@ -2,6 +2,8 @@
#define _SYSTEM_H
#include <kernel.h>
#include <gdt.h>
#include <idt.h>
// 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
+1 -2
View File
@@ -1,6 +1,5 @@
#include <syscall.h>
#include <kernel.h>
#include <string.h>
#include <system.h>
#include <idt.h>
#include <isr.h>
@@ -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;
+8
View File
@@ -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");
}
+7 -8
View File
@@ -2,6 +2,8 @@
#include <kernel.h>
#include <paging.h>
#include <string.h>
#include <system.h>
#include <sched.h>
#include <gdt.h>
#include <isr.h>
#include <pmm.h>
@@ -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) {
+2 -2
View File
@@ -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) {