diff options
author | Danny Holman <dholman@gymli.org> | 2025-01-12 01:17:36 -0600 |
---|---|---|
committer | Danny Holman <dholman@gymli.org> | 2025-01-12 01:19:11 -0600 |
commit | 95cd78840f0891e60f5ebecc8a8eb4fbaf3c2ebf (patch) | |
tree | c8c35347b50477929727fa5be9f5d0f55cbe18fd /arch/i386/kernel | |
parent | arch: i386: kmalloc: fix last element being ignored (diff) | |
download | box-95cd78840f0891e60f5ebecc8a8eb4fbaf3c2ebf.tar.gz box-95cd78840f0891e60f5ebecc8a8eb4fbaf3c2ebf.tar.zst box-95cd78840f0891e60f5ebecc8a8eb4fbaf3c2ebf.zip |
PROJECT RESTRUCTURING
Move the entire kernel into its own directory. Create new directories
for system commands, libraries and other required essentials for a
complete Unix-like operating system.
Signed-off-by: Danny Holman <dholman@gymli.org>
Diffstat (limited to '')
-rw-r--r-- | arch/i386/kernel/isr.s | 129 | ||||
-rw-r--r-- | arch/i386/kernel/jump_userspace.s | 21 | ||||
-rw-r--r-- | arch/i386/kernel/spinlock.s | 30 | ||||
-rw-r--r-- | arch/i386/kernel/stack_trace.s | 31 | ||||
-rw-r--r-- | arch/i386/kernel/switch_thread.s | 28 | ||||
-rw-r--r-- | kernel/arch/x86/kernel/gdt.c (renamed from arch/i386/kernel/gdt.c) | 14 | ||||
-rw-r--r-- | kernel/arch/x86/kernel/idt.c (renamed from arch/i386/kernel/idt.c) | 0 | ||||
-rw-r--r-- | kernel/arch/x86/kernel/kmalloc.c (renamed from arch/i386/kernel/kmalloc.c) | 2 | ||||
-rw-r--r-- | kernel/arch/x86/kernel/multiboot.c (renamed from arch/i386/kernel/multiboot.c) | 0 | ||||
-rw-r--r-- | kernel/arch/x86/kernel/paging.c (renamed from arch/i386/kernel/paging.c) | 0 | ||||
-rw-r--r-- | kernel/arch/x86/kernel/pic.c (renamed from arch/i386/kernel/pic.c) | 0 | ||||
-rw-r--r-- | kernel/arch/x86/kernel/pmem.c (renamed from arch/i386/kernel/pmem.c) | 21 | ||||
-rw-r--r-- | kernel/arch/x86/kernel/serial.c (renamed from arch/i386/kernel/serial.c) | 0 | ||||
-rw-r--r-- | kernel/arch/x86/kernel/syscall.c (renamed from arch/i386/kernel/syscall.c) | 4 | ||||
-rw-r--r-- | kernel/arch/x86/kernel/timer.c (renamed from arch/i386/kernel/timer.c) | 5 |
15 files changed, 33 insertions, 252 deletions
diff --git a/arch/i386/kernel/isr.s b/arch/i386/kernel/isr.s deleted file mode 100644 index 55db35e..0000000 --- a/arch/i386/kernel/isr.s +++ /dev/null @@ -1,129 +0,0 @@ -.section .text - -.macro isr_err_stub num -.global isr_stub_\num -.type isr_stub_\num, @function -isr_stub_\num: - cli - pushl $\num - jmp isr_frame_asm -.endm -.macro isr_no_err_stub num -.global isr_stub_\num -.type isr_stub_\num, @function -isr_stub_\num: - cli - pushl $0 - pushl $\num - jmp isr_frame_asm -.endm - -.macro irq_stub num -.global irq_stub_\num -.type irq_stub_\num, @function -irq_stub_\num: - cli - pushl $0 - pushl $\num+32 - jmp isr_frame_asm -.endm - -.global syscall_stub -syscall_stub: - cli - pushl $0 - pushl $0x80 - jmp isr_frame_asm - -isr_frame_asm: - pushl %eax - pushl %ebx - pushl %ecx - pushl %edx - pushl %esi - pushl %edi - - movl %cr0, %eax - pushl %eax - movl %cr2, %eax - pushl %eax - movl %cr3, %eax - pushl %eax - movl %cr4, %eax - pushl %eax - - pushl %esp - call set_kernel_esp - addl $4, %esp - - cld - call interrupt_handler - - popl %eax - movl %eax, %cr4 - popl %eax - movl %eax, %cr3 - popl %eax - movl %eax, %cr2 - popl %eax - movl %eax, %cr0 - - popl %edi - popl %esi - popl %edx - popl %ecx - popl %ebx - popl %eax - addl $8, %esp - - iret - -isr_no_err_stub 0 -isr_no_err_stub 1 -isr_no_err_stub 2 -isr_no_err_stub 3 -isr_no_err_stub 4 -isr_no_err_stub 5 -isr_no_err_stub 6 -isr_no_err_stub 7 -isr_err_stub 8 -isr_no_err_stub 9 -isr_err_stub 10 -isr_err_stub 11 -isr_err_stub 12 -isr_err_stub 13 -isr_err_stub 14 -isr_no_err_stub 15 -isr_no_err_stub 16 -isr_err_stub 17 -isr_no_err_stub 18 -isr_no_err_stub 19 -isr_no_err_stub 20 -isr_err_stub 21 -isr_no_err_stub 22 -isr_no_err_stub 23 -isr_no_err_stub 24 -isr_no_err_stub 25 -isr_no_err_stub 26 -isr_no_err_stub 27 -isr_no_err_stub 28 -isr_err_stub 29 -isr_err_stub 30 -isr_no_err_stub 31 - -irq_stub 0 -irq_stub 1 -irq_stub 2 -irq_stub 3 -irq_stub 4 -irq_stub 5 -irq_stub 6 -irq_stub 7 -irq_stub 8 -irq_stub 9 -irq_stub 10 -irq_stub 11 -irq_stub 12 -irq_stub 13 -irq_stub 14 -irq_stub 15 diff --git a/arch/i386/kernel/jump_userspace.s b/arch/i386/kernel/jump_userspace.s deleted file mode 100644 index add144a..0000000 --- a/arch/i386/kernel/jump_userspace.s +++ /dev/null @@ -1,21 +0,0 @@ -.global jump_userspace -.type jump_userspace, @function -jump_userspace: - movw $0x23, %ax - movw %ax, %ds - movw %ax, %es - movw %ax, %fs - movw %ax, %gs - - movl %esp, %eax - pushl $0x23 - pushl %eax - pushf - push $0x1B - pushl $start_init - - pushl %esp - call set_kernel_esp - addl $4, %esp - - iret diff --git a/arch/i386/kernel/spinlock.s b/arch/i386/kernel/spinlock.s deleted file mode 100644 index c8235ca..0000000 --- a/arch/i386/kernel/spinlock.s +++ /dev/null @@ -1,30 +0,0 @@ -.section .text - -.global aquire_lock -.type aquire_lock, @function -aquire_lock: - pushl %ebp - movl %esp, %ebp -locked: - movl 8(%esp), %eax - lock incl (%eax) - jc spin_wait - - popl %ebp - ret -spin_wait: - test %eax, 1 - jnz spin_wait - jmp locked - -.global release_lock -.type release_lock, @function -release_lock: - pushl %ebp - movl %esp, %ebp - - movl 8(%ebp), %eax - lock decl (%eax) - - popl %ebp - ret diff --git a/arch/i386/kernel/stack_trace.s b/arch/i386/kernel/stack_trace.s deleted file mode 100644 index fbd77ed..0000000 --- a/arch/i386/kernel/stack_trace.s +++ /dev/null @@ -1,31 +0,0 @@ -.section .text - -.global walk_stack -.type walk_stack, @function -walk_stack: - pushl %ebp - movl %esp, %ebp - - pushl %edi - movl -4(%ebp), %edi - pushl %ebx - movl -8(%ebp), %ebx - - xorl %eax, %eax - movl 8(%esp), %ebx - movl 16(%esp), %edi - movl 20(%esp), %ecx -walk: - testl %ebx, %ebx - jz done - movl 4(%ebx), %edx - movl 0(%ebx), %ebx - movl %edx, (%edi) - addl $4, %edi - inc %eax - loop walk -done: - popl %ebx - popl %edi - popl %ebp - ret diff --git a/arch/i386/kernel/switch_thread.s b/arch/i386/kernel/switch_thread.s deleted file mode 100644 index f1168d5..0000000 --- a/arch/i386/kernel/switch_thread.s +++ /dev/null @@ -1,28 +0,0 @@ -.global switch_thread -.type switch_thread, @function -switch_thread: - pushl %ebp - movl %esp, %ebp - - pushl %ebx - pushl %esi - pushl %edi - pushl %ebp - - movl 8(%ebp), %esi - movl 12(%ebp), %edi - - movl %esp, (%edi); - movl %cr3, %ecx - movl %ecx, 4(%edi) - - movl (%esi), %esp - movl 4(%esi), %ecx - movl %ecx, %cr3 - - popl %ebp - popl %edi - popl %esi - popl %ebx - popl %ebp - ret diff --git a/arch/i386/kernel/gdt.c b/kernel/arch/x86/kernel/gdt.c index 0d9e1d2..57424aa 100644 --- a/arch/i386/kernel/gdt.c +++ b/kernel/arch/x86/kernel/gdt.c @@ -18,7 +18,7 @@ void gdt_set_gate(int num, uint32_t base, uint32_t limit, uint8_t access, uint8_ } void write_tss(int num, uint32_t ss0, uint32_t esp0) { - uint32_t base = (uint32_t)&tss_entry; + uint64_t base = (uint64_t)&tss_entry; uint32_t limit = base + sizeof(struct tss_entry); gdt_set_gate(num, base, limit, 0x89, 0x00); @@ -35,13 +35,9 @@ void write_tss(int num, uint32_t ss0, uint32_t esp0) { tss_entry.iomap_base = sizeof(tss_entry); } -void set_kernel_esp(uint32_t esp) { - tss_entry.esp0 = esp; -} - void gdt_install(void) { gp.limit = (sizeof(struct gdt_entry) * 6) - 1; - gp.base = (uint32_t)&desc; + gp.base = (uint64_t)&desc; gdt_set_gate(0, 0, 0, 0, 0); gdt_set_gate(1, 0, 0xFFFFF, 0x9A, 0xCF); @@ -49,9 +45,9 @@ void gdt_install(void) { gdt_set_gate(3, 0, 0xFFFFF, 0xFA, 0xCF); gdt_set_gate(4, 0, 0xFFFFF, 0xF2, 0xCF); - uint32_t esp; - __asm__ volatile("movl %%esp, %0" : "=r"(esp)); - write_tss(5, 0x10, esp); + uint64_t rsp; + __asm__ volatile("movq %%rsp, %0" : "=r"(rsp)); + write_tss(5, 0x10, rsp); flush_gdt(); flush_tss(); diff --git a/arch/i386/kernel/idt.c b/kernel/arch/x86/kernel/idt.c index a178801..a178801 100644 --- a/arch/i386/kernel/idt.c +++ b/kernel/arch/x86/kernel/idt.c diff --git a/arch/i386/kernel/kmalloc.c b/kernel/arch/x86/kernel/kmalloc.c index ea77428..9e5254c 100644 --- a/arch/i386/kernel/kmalloc.c +++ b/kernel/arch/x86/kernel/kmalloc.c @@ -56,6 +56,8 @@ void* kmalloc(size_t sz) { } void kfree(void *ptr) { + if (ptr == NULL) + return; struct mem_block *temp = first; while (temp != NULL) { if (temp->start == (uintptr_t)ptr) { diff --git a/arch/i386/kernel/multiboot.c b/kernel/arch/x86/kernel/multiboot.c index dedf163..dedf163 100644 --- a/arch/i386/kernel/multiboot.c +++ b/kernel/arch/x86/kernel/multiboot.c diff --git a/arch/i386/kernel/paging.c b/kernel/arch/x86/kernel/paging.c index a0bbb92..a0bbb92 100644 --- a/arch/i386/kernel/paging.c +++ b/kernel/arch/x86/kernel/paging.c diff --git a/arch/i386/kernel/pic.c b/kernel/arch/x86/kernel/pic.c index 0d29473..0d29473 100644 --- a/arch/i386/kernel/pic.c +++ b/kernel/arch/x86/kernel/pic.c diff --git a/arch/i386/kernel/pmem.c b/kernel/arch/x86/kernel/pmem.c index 40e3400..edf71d9 100644 --- a/arch/i386/kernel/pmem.c +++ b/kernel/arch/x86/kernel/pmem.c @@ -6,6 +6,7 @@ #include <libk/io.h> #include <libk/string.h> +static uintptr_t bitmap[5]; static struct pfa_page freelist; void pfa_init(struct mboot_info *header) { @@ -17,6 +18,9 @@ void pfa_init(struct mboot_info *header) { } } +uintptr_t pfa_alloc_dma(size_t num_pages) { +} + uintptr_t pfa_alloc(size_t num_pages) { struct pfa_page *temp = (struct pfa_page*)PAGE_TMP_MAP; map_page(freelist.next, PAGE_TMP_MAP, PD_PRES | PD_RW); @@ -27,6 +31,23 @@ uintptr_t pfa_alloc(size_t num_pages) { return ret; } +void pfa_free_dma(uintptr_t paddr, size_t num_pages) { + if (paddr % PAGE_SIZE != 0) + panic("Task attempted to free non-aligned memory"); + if (paddr >= KSTART && paddr < KEND) + return; + if (paddr >= 0x00080000 && paddr < 0x00100000) + return; + + int index = 0; + int bit = 0; + for (uintptr_t i = paddr; i < paddr + (num_pages * PAGE_SIZE); i += PAGE_SIZE) { + index = i / PAGE_SIZE / 32; + bit = i / PAGE_SIZE % 32; + bitmap[index] |= 1 << bit; + } +} + void pfa_free(uintptr_t paddr, size_t num_pages) { uintptr_t addr; struct pfa_page *temp = (struct pfa_page*)PAGE_TMP_MAP; diff --git a/arch/i386/kernel/serial.c b/kernel/arch/x86/kernel/serial.c index dc2a8bd..dc2a8bd 100644 --- a/arch/i386/kernel/serial.c +++ b/kernel/arch/x86/kernel/serial.c diff --git a/arch/i386/kernel/syscall.c b/kernel/arch/x86/kernel/syscall.c index 200af4f..1fa73e9 100644 --- a/arch/i386/kernel/syscall.c +++ b/kernel/arch/x86/kernel/syscall.c @@ -19,7 +19,7 @@ void handle_syscall(struct isr_frame *frame) { sys_write(frame); break; default: - panic("Invalid system call number"); + kprintf("Invalid system call number %d\n", frame->eax); + break; } - return 0; } diff --git a/arch/i386/kernel/timer.c b/kernel/arch/x86/kernel/timer.c index a7d88dd..bd57cc2 100644 --- a/arch/i386/kernel/timer.c +++ b/kernel/arch/x86/kernel/timer.c @@ -8,8 +8,9 @@ void timer_handler(struct isr_frame *frame) { num_ticks++; if (num_ticks == 3) { num_ticks = 0; - schedule_next(); + //schedule_next(); } + pic_eoi(frame->isr_vector-32); } void timer_init(void) { @@ -20,5 +21,5 @@ void timer_init(void) { outb(0x40, divisor && 0xFF00 >> 8); enable_ints(); - register_irq_handler(0, timer_handler); + //register_isr_handler(32, timer_handler); } |