From 6378f262fa538ff10134bd63e11e6dc8e65386c5 Mon Sep 17 00:00:00 2001 From: notsomeidiot123 Date: Sun, 1 Mar 2026 15:42:47 -0500 Subject: [PATCH] Respect lock on interrupt for ata_read() and ata_write(), add support for unix-style file descriptors --- src/kernel/arch_i386/interrupts.c | 4 ++- src/kernel/system/scheduler.c | 5 ++++ src/kernel/system/scheduler.h | 7 +++++ src/kmodules/disk_driver.c | 48 +++++++++++++++---------------- 4 files changed, 39 insertions(+), 25 deletions(-) diff --git a/src/kernel/arch_i386/interrupts.c b/src/kernel/arch_i386/interrupts.c index 92d1c5e..aa45e88 100644 --- a/src/kernel/arch_i386/interrupts.c +++ b/src/kernel/arch_i386/interrupts.c @@ -111,7 +111,8 @@ void _isr_handler(cpu_registers_t *regs){ } cpu_registers_t *syscall(cpu_registers_t *regs){ - + printf("Hello!\n"); + return regs; } extern void panic_hold(cpu_registers_t *regs); @@ -203,6 +204,7 @@ void idt_load(){ set_idt_entry(i + 32, (&_irq0 + ((&_irq1 - &_irq0) * i)), IDT_GATE_INT, 0x10); // printf("int %d: address: %x\n", i + 32, _irq0 + (_irq1 - _irq0) * i); } + set_idt_entry(0x80, _syscall, IDT_GATE_INT, 0x10); idt_desc.pointer = (uint32_t)&idt_table; idt_desc.size = sizeof(idt_entry_t) * 256 - 1; diff --git a/src/kernel/system/scheduler.c b/src/kernel/system/scheduler.c index 8309307..760abc7 100644 --- a/src/kernel/system/scheduler.c +++ b/src/kernel/system/scheduler.c @@ -10,6 +10,7 @@ uint32_t volatile active_processes; uint32_t volatile current_pid; uint32_t volatile queue_length; uint32_t volatile current_queue_index; + void scheduler_init(){ processes = kmalloc((PROCESS_COUNT * sizeof(process_t) + 4095) / 4096); for(uint32_t i = 0; i < PROCESS_COUNT; i++){ @@ -80,6 +81,7 @@ uint32_t spawn_new_process(cpu_registers_t defaultregs, char **argv, uint32_t ar // i += !active_processes; active_processes++; process_t new_proc = {0}; + //TODO: make sure these are pushed in a way which is friendly for processes in a different virtual address space new_proc.argc = argc; new_proc.argv = argv; new_proc.page_dir = cr3; @@ -89,6 +91,9 @@ uint32_t spawn_new_process(cpu_registers_t defaultregs, char **argv, uint32_t ar new_proc.flags.cpu_lvl = 1; new_proc.flags.priority = 0; new_proc.flags.system = processes[current_pid].flags.system; + //allocate space for DEFUALT_FD_MAX file descriptors + new_proc.file_descriptors = kmalloc((DEFAULT_FD_MAX * sizeof(void **) + 4095)/4096); + new_proc.max_descriptors = DEFAULT_FD_MAX; processes[i] = new_proc; add_process_queue(i); return i; diff --git a/src/kernel/system/scheduler.h b/src/kernel/system/scheduler.h index b9713fb..2b3161d 100644 --- a/src/kernel/system/scheduler.h +++ b/src/kernel/system/scheduler.h @@ -1,7 +1,12 @@ #pragma once #include #include "../shared/interrupts.h" + +#define DEFAULT_FD_MAX 1024 +#define ABSOLUT_FD_MAX 65536 + typedef struct{ + char **argv; uint32_t argc; cpu_registers_t cpuregs; @@ -14,6 +19,8 @@ typedef struct{ uint8_t present :1; uint8_t ran :1; }flags; + void **file_descriptors; + uint32_t max_descriptors; uint32_t exit_value; uint32_t thread_id; uint32_t parent; diff --git a/src/kmodules/disk_driver.c b/src/kmodules/disk_driver.c index e1260ea..383723c 100644 --- a/src/kmodules/disk_driver.c +++ b/src/kmodules/disk_driver.c @@ -196,17 +196,17 @@ uint32_t find_free_drive(){ int ata_write(vfile_t *file, void *ptr, uint32_t offset, uint32_t count){ if (count == 0) return -1; // while(transferring_disk_index != -1); - if(!is_interrupt(api)){ - asm("cli"); - while(locked){ - asm("sti"); - puts(api, "KIDM", "Locked\n"); - asm("int $32"); - asm("cli"); - } - locked = 1; + // if(!is_interrupt(api)){ + asm("cli"); + while(locked){ asm("sti"); + // puts(api, "KIDM", "Locked\n"); + asm("int $32"); + asm("cli"); } + locked = 1; + asm("sti"); + // } drive_t drive = drives[file->mount_id]; uint16_t io_base = drive.BARs[0] &0xfffe; uint16_t ctrl_base = drive.BARs[1] &0xfffe; @@ -291,9 +291,9 @@ int ata_write(vfile_t *file, void *ptr, uint32_t offset, uint32_t count){ // while(ATA_BSY(status)){ // status = inb(io_base + ATA_STATUS); // } - if(!is_interrupt){ - asm("int $32\n"); - } + // if(!is_interrupt){ + asm("int $32\n"); + // } return 0; } @@ -305,17 +305,17 @@ int ata_read(vfile_t *file, uint8_t *ptr, uint32_t offset, uint32_t count) { uint16_t ctrl_base = drive.BARs[1] &0xfffe; uint16_t bm_base = drive.BARs[4] & ~3; - if(!is_interrupt(api)){ - asm("cli"); - while(locked){ - asm("sti"); - puts(api, "KIDM", "Locked\n"); - asm("int $32"); - asm("cli"); - } - locked = 1; + // if(!is_interrupt(api)){ + asm("cli"); + while(locked){ asm("sti"); + // puts(api, "KIDM", "Locked\n"); + asm("int $32"); + asm("cli"); } + locked = 1; + asm("sti"); + // } PRD_T *prdt = drive.PRDT; api(MODULE_API_PRINT, MODULE_NAME, "%x, %x, %x, %x\n", io_base, ctrl_base, bm_base, api(MODULE_API_PADDR, prdt)); @@ -398,9 +398,9 @@ int ata_read(vfile_t *file, uint8_t *ptr, uint32_t offset, uint32_t count) { // status = inb(io_base + ATA_STATUS); // } // outb(bm_base, 0x00); - if(!is_interrupt){ - asm("int $32\n"); - } + // if(!is_interrupt){ + asm("int $32\n"); + // } return 0; }