From 95cd78840f0891e60f5ebecc8a8eb4fbaf3c2ebf Mon Sep 17 00:00:00 2001 From: Danny Holman Date: Sun, 12 Jan 2025 01:17:36 -0600 Subject: 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 --- arch/i386/boot/boot.s | 149 --------------------------------- arch/i386/boot/crti.s | 15 ---- arch/i386/boot/crtn.s | 7 -- arch/i386/include/kernel/asm.h | 158 ----------------------------------- arch/i386/include/kernel/gdt.h | 53 ------------ arch/i386/include/kernel/idt.h | 31 ------- arch/i386/include/kernel/multiboot.h | 102 ---------------------- arch/i386/include/kernel/paging.h | 46 ---------- arch/i386/include/kernel/pic.h | 44 ---------- arch/i386/include/kernel/pmem.h | 17 ---- arch/i386/include/kernel/syscall.h | 34 -------- arch/i386/include/kernel/timer.h | 9 -- arch/i386/include/kernel/vmem.h | 17 ---- arch/i386/kernel/gdt.c | 58 ------------- arch/i386/kernel/idt.c | 149 --------------------------------- arch/i386/kernel/isr.s | 129 ---------------------------- arch/i386/kernel/jump_userspace.s | 21 ----- arch/i386/kernel/kmalloc.c | 68 --------------- arch/i386/kernel/multiboot.c | 49 ----------- arch/i386/kernel/paging.c | 130 ---------------------------- arch/i386/kernel/pic.c | 79 ------------------ arch/i386/kernel/pmem.c | 45 ---------- arch/i386/kernel/serial.c | 42 ---------- arch/i386/kernel/spinlock.s | 30 ------- arch/i386/kernel/stack_trace.s | 31 ------- arch/i386/kernel/switch_thread.s | 28 ------- arch/i386/kernel/syscall.c | 25 ------ arch/i386/kernel/timer.c | 24 ------ arch/i386/linker.ld | 30 ------- arch/i386/make.config | 20 ----- 30 files changed, 1640 deletions(-) delete mode 100644 arch/i386/boot/boot.s delete mode 100644 arch/i386/boot/crti.s delete mode 100644 arch/i386/boot/crtn.s delete mode 100644 arch/i386/include/kernel/asm.h delete mode 100644 arch/i386/include/kernel/gdt.h delete mode 100644 arch/i386/include/kernel/idt.h delete mode 100644 arch/i386/include/kernel/multiboot.h delete mode 100644 arch/i386/include/kernel/paging.h delete mode 100644 arch/i386/include/kernel/pic.h delete mode 100644 arch/i386/include/kernel/pmem.h delete mode 100644 arch/i386/include/kernel/syscall.h delete mode 100644 arch/i386/include/kernel/timer.h delete mode 100644 arch/i386/include/kernel/vmem.h delete mode 100644 arch/i386/kernel/gdt.c delete mode 100644 arch/i386/kernel/idt.c delete mode 100644 arch/i386/kernel/isr.s delete mode 100644 arch/i386/kernel/jump_userspace.s delete mode 100644 arch/i386/kernel/kmalloc.c delete mode 100644 arch/i386/kernel/multiboot.c delete mode 100644 arch/i386/kernel/paging.c delete mode 100644 arch/i386/kernel/pic.c delete mode 100644 arch/i386/kernel/pmem.c delete mode 100644 arch/i386/kernel/serial.c delete mode 100644 arch/i386/kernel/spinlock.s delete mode 100644 arch/i386/kernel/stack_trace.s delete mode 100644 arch/i386/kernel/switch_thread.s delete mode 100644 arch/i386/kernel/syscall.c delete mode 100644 arch/i386/kernel/timer.c delete mode 100644 arch/i386/linker.ld delete mode 100644 arch/i386/make.config (limited to 'arch') diff --git a/arch/i386/boot/boot.s b/arch/i386/boot/boot.s deleted file mode 100644 index 5357910..0000000 --- a/arch/i386/boot/boot.s +++ /dev/null @@ -1,149 +0,0 @@ -.set ALIGN, 1<<0 -.set MEMINFO, 1<<1 -.set FLAGS, ALIGN | MEMINFO -.set MAGIC, 0x1BADB002 -.set CHECKSUM, -(MAGIC + FLAGS) - -.section .multiboot.data, "aw" -.align 4 -.long MAGIC -.long FLAGS -.long CHECKSUM - -.section .bootstrap_stack, "aw", @nobits -stack_bottom: -.skip 16384 -stack_top: - -.section .bss, "aw", @nobits - .align 4096 -boot_page_directory: - .skip 4096 -boot_page_table0: - .skip 4096 -boot_page_table1: - .skip 4096 - -.section .multiboot.text, "a" -.global _start -.type _start, @function -_start: - movl $(boot_page_table0 - 0xC0000000), %edi - movl $0, %esi - movl $1023, %ecx - -1: cmpl $_kernel_start, %esi - jl 2f - cmpl $(_kernel_end - 0xC0000000), %esi - jge 3f - - movl %esi, %edx - orl $0x003, %edx - movl %edx, (%edi) - -2: addl $4096, %esi - addl $4, %edi - loop 1b - - -3: movl $boot_page_directory, %ecx - subl $0xC0000000, %ecx - orl $0x003, %ecx - movl %ecx, boot_page_directory - 0xC0000000 + 1023 * 4 - - movl $boot_page_table0, %ecx - subl $0xC0000000, %ecx - orl $0x003, %ecx - movl %ecx, boot_page_directory - 0xC0000000 - movl %ecx, boot_page_directory - 0xC0000000 + 768 * 4 - - movl $boot_page_table1, %ecx - subl $0xC0000000, %ecx - orl $0x003, %ecx - movl %ecx, boot_page_directory - 0xC0000000 + 1022 * 4 - - movl $boot_page_directory, %ecx - subl $0xC0000000, %ecx - movl %ecx, %cr3 - - movl %cr0, %ecx - orl $0x80000000, %ecx - movl %ecx, %cr0 - - lea 4f, %ecx - jmp *%ecx - -.section .text - -4: movl $stack_top, %esp - and $-16, %esp - - call setup_stack_guard - - xorl %ebp, %ebp - pushl %ebx - pushl %eax - call i386_entry - - cli -1: hlt - jmp 1b - -.global setup_stack_guard -.type setup_stack_guard, @function -setup_stack_guard: - pushl %eax - pushl %ebx - pushl %ecx - - movl $1, %eax - movl $0, %ecx - cpuid - shrl $30, %ecx - andl $1, %ecx - jnz start_loop - jmp fail -start_loop: - rdrand %eax - jc done - loop start_loop -fail: - movl $-1, %eax -done: - movl %eax, __stack_chk_guard - popl %ecx - popl %ebx - popl %eax - ret - -.global enable_paging -.type enable_paging, @function -enable_paging: - pushl %ebp - movl %esp, %ebp - - movl 8(%esp), %eax - movl %eax, %cr3 - - movl %cr0, %eax - orl $0x80000001, %eax - movl %eax, %cr0 - - movl $0, %eax - popl %ebp - ret - -.global flush_gdt -.type flush_gdt, @function -flush_gdt: - cli - lgdt (gp) - movw $0x10, %ax - movw %ax, %ds - movw %ax, %es - movw %ax, %fs - movw %ax, %gs - movw %ax, %ss - jmp $0x08, $.flush -.flush: - ret diff --git a/arch/i386/boot/crti.s b/arch/i386/boot/crti.s deleted file mode 100644 index 8386b77..0000000 --- a/arch/i386/boot/crti.s +++ /dev/null @@ -1,15 +0,0 @@ -.section .init - -.global _init -.type _init, @function -_init: - pushl %ebp - movl %esp, %ebp - -.section .fini - -.global _fini -.type _fini, @function -_fini: - pushl %ebp - movl %esp, %ebp diff --git a/arch/i386/boot/crtn.s b/arch/i386/boot/crtn.s deleted file mode 100644 index 447afb1..0000000 --- a/arch/i386/boot/crtn.s +++ /dev/null @@ -1,7 +0,0 @@ -.section .init - popl %ebp - ret - -.section .fini - popl %ebp - ret diff --git a/arch/i386/include/kernel/asm.h b/arch/i386/include/kernel/asm.h deleted file mode 100644 index cc570c5..0000000 --- a/arch/i386/include/kernel/asm.h +++ /dev/null @@ -1,158 +0,0 @@ -#ifndef I386_ASM_H -#define I386_ASM_H - -#include -#include - -#define PCI_CONFIG_ADDR 0xCF8 -#define PCI_CONFIG_DATA 0xCFC - -#define COM_PORT 0x3F8 - -#define MAX_ISR 256 - -struct regs { - uint32_t eax; - uint32_t ebx; - uint32_t ecx; - uint32_t edx; - uint32_t esi; - uint32_t edi; - uint32_t ebp; - uint32_t esp; - - uint32_t cr0; - uint32_t cr2; - uint32_t cr3; - uint32_t cr4; -}; - -struct isr_frame { - uint32_t cr4; - uint32_t cr3; - uint32_t cr2; - uint32_t cr0; - - uint32_t edi; - uint32_t esi; - uint32_t edx; - uint32_t ecx; - uint32_t ebx; - uint32_t eax; - - uint32_t isr_vector; - uint32_t isr_err; - uint32_t eip; - uint32_t cs; - uint32_t eflags; -} __attribute__((packed)); - -void isr_stub_0(void); -void isr_stub_1(void); -void isr_stub_2(void); -void isr_stub_3(void); -void isr_stub_4(void); -void isr_stub_5(void); -void isr_stub_6(void); -void isr_stub_7(void); -void isr_stub_8(void); -void isr_stub_9(void); -void isr_stub_10(void); -void isr_stub_11(void); -void isr_stub_12(void); -void isr_stub_13(void); -void isr_stub_14(void); -void isr_stub_15(void); -void isr_stub_16(void); -void isr_stub_17(void); -void isr_stub_18(void); -void isr_stub_19(void); -void isr_stub_20(void); -void isr_stub_21(void); -void isr_stub_22(void); -void isr_stub_23(void); -void isr_stub_24(void); -void isr_stub_25(void); -void isr_stub_26(void); -void isr_stub_27(void); -void isr_stub_28(void); -void isr_stub_29(void); -void isr_stub_30(void); -void isr_stub_31(void); - -void irq_stub_0(void); -void irq_stub_1(void); -void irq_stub_2(void); -void irq_stub_3(void); -void irq_stub_4(void); -void irq_stub_5(void); -void irq_stub_6(void); -void irq_stub_7(void); -void irq_stub_8(void); -void irq_stub_9(void); -void irq_stub_10(void); -void irq_stub_11(void); -void irq_stub_12(void); -void irq_stub_13(void); -void irq_stub_14(void); -void irq_stub_15(void); - -void isr_stub_128(void); - -void aquire_lock(int *lock); -void release_lock(int *lock); - -void enable_paging(uint32_t new_cr3); -void flush_gdt(void); - -static inline void outb(uint16_t port, uint8_t value) { - __asm__ volatile("outb %0, %1" : : "a"(value), "Nd"(port)); -} - -static inline void outw(uint16_t port, uint16_t value) { - __asm__ volatile("outw %0, %1" : : "a"(value), "Nd"(port)); -} - -static inline void outl(uint16_t port, uint32_t value) { - __asm__ volatile("outl %0, %1" : : "a"(value), "Nd"(port)); -} - -static inline uint8_t inb(uint16_t port) { - uint8_t ret; - __asm__ volatile("inb %1, %0" : "=a"(ret) : "Nd"(port)); - return ret; -} - -static inline uint16_t inw(uint16_t port) { - uint16_t ret; - __asm__ volatile("inw %1, %0" : "=a"(ret) : "Nd"(port)); - return ret; -} - -static inline uint32_t inl(uint16_t port) { - uint32_t ret; - __asm__ volatile("inl %1, %0" : "=a"(ret) : "Nd"(port)); - return ret; -} - -static inline void enable_ints(void) { - __asm__ volatile("sti"); -} - -static inline void disable_ints(void) { - __asm__ volatile("cli"); -} - -static inline void flush_tss(void) { - __asm__ volatile("movw $0x28, %ax; ltr %ax"); -} - -static inline void flush_tlb(void) { - __asm__ volatile("movl %cr3, %eax; movl %eax, %cr3"); -} - -static inline void invlpg(void *addr) { - __asm__ volatile("invlpg (%0)" : : "b"(addr) : "memory"); -} - -#endif diff --git a/arch/i386/include/kernel/gdt.h b/arch/i386/include/kernel/gdt.h deleted file mode 100644 index ec02719..0000000 --- a/arch/i386/include/kernel/gdt.h +++ /dev/null @@ -1,53 +0,0 @@ -#ifndef I386_GDT_H -#define I386_GDT_H - -#include - -struct gdt_entry { - uint16_t limit_low; - uint16_t base_low; - uint8_t base_middle; - uint8_t access; - uint8_t gran; - uint8_t base_high; -} __attribute__((packed)); - -struct gdt_ptr { - uint16_t limit; - uint32_t base; -} __attribute__((packed)); - -struct tss_entry { - uint32_t link; - uint32_t esp0; - uint32_t ss0; - uint32_t esp1; - uint32_t ss2; - uint32_t cr3; - uint32_t eip; - uint32_t eflags; - uint32_t eax; - uint32_t ecx; - uint32_t edx; - uint32_t ebx; - uint32_t esp; - uint32_t ebp; - uint32_t esi; - uint32_t edi; - uint32_t es; - uint32_t cs; - uint32_t ss; - uint32_t ds; - uint32_t fs; - uint32_t gs; - uint32_t ldtr; - uint16_t trap; - uint16_t iomap_base; -} __attribute__((packed)); - -void gdt_set_gate(int num, uint32_t base, uint32_t limit, uint8_t access, uint8_t gran); -void write_tss(int num, uint32_t ss0, uint32_t esp0); -void set_kernel_esp(uint32_t esp); -void gdt_install(void); - -#endif diff --git a/arch/i386/include/kernel/idt.h b/arch/i386/include/kernel/idt.h deleted file mode 100644 index 29ec39f..0000000 --- a/arch/i386/include/kernel/idt.h +++ /dev/null @@ -1,31 +0,0 @@ -#ifndef I386_IDT_H -#define I386_IDT_H - -#include - -#define SEGMENT_PRESENT 0x80 -#define SEGMENT_RING0 0x00 -#define SEGMENT_RING3 0x60 -#define SEGMENT_STORAGE 0x00 -#define SEGMENT_INTERRUPT 0x0E -#define IDT_EXCEPTION (SEGMENT_PRESENT | SEGMENT_INTERRUPT) -#define IDT_INTERRUPT (SEGMENT_PRESENT | SEGMENT_INTERRUPT) - -#define IDT_MAX_DESCRIPTORS 256 - -struct idt_entry { - uint16_t isr_low; - uint16_t kernel_cs; - uint8_t reserved; - uint8_t flags; - uint16_t isr_high; -} __attribute__((packed)); - -struct idt_ptr { - uint16_t limit; - uint32_t base; -} __attribute__((packed)); - -void idt_install(void); - -#endif diff --git a/arch/i386/include/kernel/multiboot.h b/arch/i386/include/kernel/multiboot.h deleted file mode 100644 index abbd8a9..0000000 --- a/arch/i386/include/kernel/multiboot.h +++ /dev/null @@ -1,102 +0,0 @@ -#ifndef I386_MULTIBOOT_H -#define I386_MULTIBOOT_H - -#include - -#define MBOOT_HEADER_MAGIC 0x1BADB002 -#define MBOOT_LOADER_MAGIC 0x2BADB002 - -// Multiboot flags -#define MBOOT_INFO_MMAP 0x00000001 -#define MBOOT_INFO_BOOTDEV 0x00000002 -#define MBOOT_INFO_CMDLINE 0x00000004 -#define MBOOT_INFO_MODS 0x00000008 -#define MBOOT_INFO_AOUT_SYMS 0x00000010 -#define MBOOT_INFO_ELF_HEADER 0x00000020 -#define MBOOT_INFO_MEM_MAP 0x00000040 -#define MBOOT_INFO_DRIVE_INFO 0x00000080 -#define MBOOT_INFO_CONFIG_TBL 0x00000100 -#define MBOOT_INFO_BL_NAME 0x00000200 -#define MBOOT_INFO_APM_TBL 0x00000400 -#define MBOOT_INFO_VBE 0x00000800 -#define MBOOT_INFO_FRAMEBUFFER 0x00001000 - -// Memory types -#define MBOOT_MEM_AVAILABLE 1 -#define MBOOT_MEM_RESERVED 2 -#define MBOOT_MEM_ACPI_REC 3 -#define MBOOT_MEM_NVS 4 -#define MBOOT_MEM_BADRAM 5 - -struct aout_symbol_table { - uint32_t tabsize; - uint32_t strsize; - uint32_t addr; - uint32_t reserved; -}; - -struct elf_section_header { - uint32_t num; - uint32_t size; - uint32_t addr; - uint32_t shndx; -}; - -struct mboot_header { - uint32_t magic; - uint32_t flags; - uint32_t checksum; - uint32_t header_addr; - uint32_t load_addr; - uint32_t load_end_addr; - uint32_t bss_end_addr; - uint32_t entry_addr; - uint32_t mode_type; - uint32_t width; - uint32_t height; - uint32_t depth; -}; - -struct mboot_info { - uint32_t flags; - uint32_t mem_lower; - uint32_t mem_upper; - uint32_t boot_device; - uint32_t cmdline; - uint32_t mods_count; - uint32_t mods_addr; - union { - struct aout_symbol_table aout_sym; - struct elf_section_header elf_sec; - } u; - uint32_t mmap_length; - uint32_t mmap_addr; - uint32_t drives_length; - uint32_t drives_addr; - uint32_t config_table; - uint32_t boot_loader_name; - uint32_t apm_table; - uint32_t vbe_control_info; - uint32_t vbe_mode_info; - uint16_t vbe_mode; - uint16_t vbe_interface_seg; - uint16_t vbe_interface_off; - uint16_t vbe_interface_len; - uint64_t framebuffer_addr; - uint32_t framebuffer_pitch; - uint32_t framebuffer_width; - uint32_t framebuffer_height; - uint8_t framebuffer_bpp; - uint8_t framebuffer_type; -}; - -struct mboot_mmap_entry { - uint32_t size; - uint32_t addr_low; - uint32_t addr_high; - uint32_t len_low; - uint32_t len_high; - uint32_t type; -} __attribute__((packed)); - -#endif diff --git a/arch/i386/include/kernel/paging.h b/arch/i386/include/kernel/paging.h deleted file mode 100644 index d8bb8f3..0000000 --- a/arch/i386/include/kernel/paging.h +++ /dev/null @@ -1,46 +0,0 @@ -#ifndef I386_PAGING_H -#define I386_PAGING_H - -#include -#include -#include - -#define PAGE_SIZE 4096 - -#define PD_PRES 0x0001 -#define PD_RW 0x0002 -#define PD_USR 0x0004 -#define PD_PWT 0x0008 -#define PD_PCD 0x0010 -#define PD_ACC 0x0020 -#define PD_DIRTY 0x0040 -#define PD_PS 0x0080 -#define PD_GLOB 0x0100 -#define PD_PAT 0x1000 - -#define ERR_PRESENT 0x1 -#define ERR_RW 0x2 -#define ERR_USER 0x4 -#define ERR_RESERVED 0x8 -#define ERR_INST 0x10 - -#define PGROUNDUP(size) (((size)+PAGE_SIZE-1) & ~(PAGE_SIZE-1)) -#define PGROUNDDN(size) (((size)) & ~(PAGE_SIZE-1)) - -#define GET_PADDR(x) (((uint32_t)(x)) - 0xC0000000) -#define GET_VADDR(x) (((uint32_t)(x)) + 0xC0000000) - -#define GET_PDX(x) ((uintptr_t)(x) >> 22) -#define GET_PTX(x) (((uintptr_t)(x) >> 12) & 0x03FF) - -uintptr_t get_physaddr(void *vaddr); - -void paging_init(void); - -uintptr_t init_page_directory(void); -void map_page(uintptr_t paddr, uintptr_t vaddr, uint32_t flags); -void unmap_page(uintptr_t vaddr); - -void page_fault_handler(struct isr_frame *frame); - -#endif diff --git a/arch/i386/include/kernel/pic.h b/arch/i386/include/kernel/pic.h deleted file mode 100644 index 187d553..0000000 --- a/arch/i386/include/kernel/pic.h +++ /dev/null @@ -1,44 +0,0 @@ -#ifndef I386_PIC_H -#define I386_PIC_H - -#include -#include - -#define PIC1 0x20 -#define PIC2 0x28 -#define PIC1_COMMAND PIC1 -#define PIC1_DATA (PIC1+1) -#define PIC2_COMMAND PIC2 -#define PIC2_DATA (PIC2+1) - -#define ICW1_ICW4 0x01 -#define ICW1_SINGLE 0x02 -#define ICW1_INTERVAL4 0x04 -#define ICW1_LEVEL 0x08 -#define ICW1_INIT 0x10 - -#define ICW4_8086 0x01 -#define ICW4_AUTO 0x02 -#define ICW4_BUF_SLAVE 0x08 -#define ICW4_BUF_MASTER 0x0C -#define ICW4_SFNM 0x10 - -#define PIC_READ_IRR 0x0A -#define PIC_READ_ISR 0x0B - -static inline void io_wait(void) { - outb(0x80, 0); -} - -void pic_eoi(uint8_t irq); -void pic_remap(void); -uint16_t pic_get_irr(void); -uint16_t pic_get_isr(void); - -void register_irq_handler(uint8_t irq, void (*handler)(struct isr_frame *frame)); -void irq_dispatch(struct isr_frame *frame); - -void irq_set_mask(uint8_t irq); -void irq_clear_mask(uint8_t irq); - -#endif diff --git a/arch/i386/include/kernel/pmem.h b/arch/i386/include/kernel/pmem.h deleted file mode 100644 index e6e4f57..0000000 --- a/arch/i386/include/kernel/pmem.h +++ /dev/null @@ -1,17 +0,0 @@ -#ifndef I386_PMEM_H -#define I386_PMEM_H - -#include -#include -#include - -struct pfa_page { - struct pfa_page *next; -}; - -void pfa_init(struct mboot_info *header); - -void pfa_free_dma(uintptr_t paddr, size_t num_pages); -void pfa_free(uintptr_t paddr, size_t num_pages); - -#endif diff --git a/arch/i386/include/kernel/syscall.h b/arch/i386/include/kernel/syscall.h deleted file mode 100644 index a657527..0000000 --- a/arch/i386/include/kernel/syscall.h +++ /dev/null @@ -1,34 +0,0 @@ -#ifndef I386_SYSCALL_H -#define I386_SYSCALL_H - -#include -#include -#include - -// Unix standard calls -#define SYS_FORK 1 -#define SYS_EXIT 2 -#define SYS_WAIT 3 -#define SYS_PIPE 4 -#define SYS_READ 5 -#define SYS_WRITE 6 -#define SYS_KILL 7 -#define SYS_FSTAT 8 -#define SYS_CHDIR 9 -#define SYS_DUP 10 -#define SYS_GETPID 11 -#define SYS_SLEEP 12 -#define SYS_OPEN 13 -#define SYS_MKNOD 14 -#define SYS_UNLINK 15 -#define SYS_LINK 16 -#define SYS_MKDIR 17 -#define SYS_CLOSE 18 -#define SYS_EXEC 19 - -#define SYS_HALT 87 -#define SYS_REBOOT 88 - -void handle_syscall(struct isr_frame *frame); - -#endif diff --git a/arch/i386/include/kernel/timer.h b/arch/i386/include/kernel/timer.h deleted file mode 100644 index c0b3a73..0000000 --- a/arch/i386/include/kernel/timer.h +++ /dev/null @@ -1,9 +0,0 @@ -#ifndef I386_TIMER_H -#define I386_TIMER_H - -#include - -void timer_handler(struct isr_frame *frame); -void timer_init(void); - -#endif diff --git a/arch/i386/include/kernel/vmem.h b/arch/i386/include/kernel/vmem.h deleted file mode 100644 index 94aa32d..0000000 --- a/arch/i386/include/kernel/vmem.h +++ /dev/null @@ -1,17 +0,0 @@ -#ifndef I386_VMEM_H -#define I386_VMEM_H - -extern uintptr_t _kernel_start; -extern uintptr_t _kernel_end; - -#define KSTART ((uintptr_t)&_kernel_start) -#define KEND ((uintptr_t)&_kernel_end - 0xC0000000) - -#define KHEAP_START (GET_VADDR(KEND) + 0x2000) -#define KHEAP_STOP 0xFF7FF000 - -#define PAGE_DIR_MAP 0xFFFFF000 -#define PAGE_TAB_MAP 0xFFC00000 -#define PAGE_TMP_MAP 0xFFBFF000 - -#endif diff --git a/arch/i386/kernel/gdt.c b/arch/i386/kernel/gdt.c deleted file mode 100644 index 0d9e1d2..0000000 --- a/arch/i386/kernel/gdt.c +++ /dev/null @@ -1,58 +0,0 @@ -#include -#include -#include - -struct gdt_entry desc[6]; -struct gdt_ptr gp; -struct tss_entry tss_entry; - -void gdt_set_gate(int num, uint32_t base, uint32_t limit, uint8_t access, uint8_t gran) { - desc[num].base_low = (base & 0xFFFF); - desc[num].base_middle = (base >> 16) & 0xFF; - desc[num].base_high = (base >> 24) & 0xFF; - - desc[num].limit_low = (limit & 0xFFFF); - desc[num].gran = (limit >> 16) & 0x0F; - desc[num].gran |= (gran & 0xF0); - desc[num].access = access; -} - -void write_tss(int num, uint32_t ss0, uint32_t esp0) { - uint32_t base = (uint32_t)&tss_entry; - uint32_t limit = base + sizeof(struct tss_entry); - - gdt_set_gate(num, base, limit, 0x89, 0x00); - memset(&tss_entry, 0x0, sizeof(tss_entry)); - - tss_entry.ss0 = ss0; - tss_entry.esp0 = esp0; - tss_entry.cs = 0x0B; - tss_entry.ss = 0x13; - tss_entry.ds = 0x13; - tss_entry.es = 0x13; - tss_entry.fs = 0x13; - tss_entry.gs = 0x13; - 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; - - gdt_set_gate(0, 0, 0, 0, 0); - gdt_set_gate(1, 0, 0xFFFFF, 0x9A, 0xCF); - gdt_set_gate(2, 0, 0xFFFFF, 0x92, 0xCF); - 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); - - flush_gdt(); - flush_tss(); -} diff --git a/arch/i386/kernel/idt.c b/arch/i386/kernel/idt.c deleted file mode 100644 index a178801..0000000 --- a/arch/i386/kernel/idt.c +++ /dev/null @@ -1,149 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -__attribute__((aligned(0x10))) -struct idt_entry idt[256]; -struct idt_ptr idtr; - -const char* exceptions[] = { - "Division by zero", - "Debug", - "Non-maskable interrupt", - "Breakpoint", - "Overflow", - "Out-of-bounds", - "Invalid opcode", - "FPU not available", - "Double fault", - "RESERVED", - "Invalid TSS", - "Segment not present", - "Stack fault", - "General protection fault", - "Page fault", - "RESERVED", - "FPU exception", - "Alignment check", - "Machine check", - "FPU-SIMD exception", - "Virtualization exception", - "Control protection" - "RESERVED", - "Hypervisor injection", - "VMM exception", - "Security exception", - "RESERVED", - "Triple fault", - "RESERVED" -}; - -void exception_handler(struct isr_frame *frame) { - switch (frame->isr_vector) { - case 0x00: - panic("Division by zero in kernel address space"); - break; - case 0x06: - panic("Invalid opcode in kernel address space"); - break; - case 0x08: - panic("Double fault in interrupt handler"); - break; - case 0x0D: - panic("Protection fault in kernel address space"); - break; - case 0x0E: - page_fault_handler(frame); - break; - default: - panic("Unhandled exception"); - } -} - -void generic_handler(struct isr_frame *frame) { - kprintf("No handler registered for IRQ %d\n", frame->isr_vector); - if (frame->isr_vector > 32 && frame->isr_vector < 48) - pic_eoi(frame->isr_vector-32); -} - -void idt_set_gate(uint8_t num, void (*handler)(void), uint16_t cs, uint8_t flags) { - struct idt_entry *desc = &idt[num]; - desc->isr_low = (uint16_t)(((uint32_t)handler >> 0) & 0xFFFF); - desc->isr_high = (uint16_t)(((uint32_t)handler >> 16) & 0xFFFF); - desc->reserved = 0; - desc->kernel_cs = cs; - desc->flags = flags; -} - -void idt_install(void) { - idtr.limit = (uint16_t)sizeof(struct idt_entry) * 256 - 1; - idtr.base = (uint32_t)idt; - - for (int i = 0; i < 32; i++) - register_isr_handler(i, exception_handler); - for (int i = 32; i < 224; i++) - register_isr_handler(i, generic_handler); - register_isr_handler(0x80, handle_syscall); - - idt_set_gate(0x0, isr_stub_0, 0x08, IDT_EXCEPTION); - idt_set_gate(0x1, isr_stub_1, 0x08, IDT_EXCEPTION); - idt_set_gate(0x2, isr_stub_2, 0x08, IDT_EXCEPTION); - idt_set_gate(0x3, isr_stub_3, 0x08, IDT_EXCEPTION); - idt_set_gate(0x4, isr_stub_4, 0x08, IDT_EXCEPTION); - idt_set_gate(0x5, isr_stub_5, 0x08, IDT_EXCEPTION); - idt_set_gate(0x6, isr_stub_6, 0x08, IDT_EXCEPTION); - idt_set_gate(0x7, isr_stub_7, 0x08, IDT_EXCEPTION); - idt_set_gate(0x8, isr_stub_8, 0x08, IDT_EXCEPTION); - idt_set_gate(0x9, isr_stub_9, 0x08, IDT_EXCEPTION); - idt_set_gate(0xA, isr_stub_10, 0x08, IDT_EXCEPTION); - idt_set_gate(0xB, isr_stub_11, 0x08, IDT_EXCEPTION); - idt_set_gate(0xC, isr_stub_12, 0x08, IDT_EXCEPTION); - idt_set_gate(0xD, isr_stub_13, 0x08, IDT_EXCEPTION); - idt_set_gate(0xE, isr_stub_14, 0x08, IDT_EXCEPTION); - idt_set_gate(0xF, isr_stub_15, 0x08, IDT_EXCEPTION); - idt_set_gate(0x10, isr_stub_16, 0x08, IDT_EXCEPTION); - idt_set_gate(0x11, isr_stub_17, 0x08, IDT_EXCEPTION); - idt_set_gate(0x12, isr_stub_18, 0x08, IDT_EXCEPTION); - idt_set_gate(0x13, isr_stub_19, 0x08, IDT_EXCEPTION); - idt_set_gate(0x14, isr_stub_20, 0x08, IDT_EXCEPTION); - idt_set_gate(0x15, isr_stub_21, 0x08, IDT_EXCEPTION); - idt_set_gate(0x16, isr_stub_22, 0x08, IDT_EXCEPTION); - idt_set_gate(0x17, isr_stub_23, 0x08, IDT_EXCEPTION); - idt_set_gate(0x18, isr_stub_24, 0x08, IDT_EXCEPTION); - idt_set_gate(0x19, isr_stub_25, 0x08, IDT_EXCEPTION); - idt_set_gate(0x1A, isr_stub_26, 0x08, IDT_EXCEPTION); - idt_set_gate(0x1B, isr_stub_27, 0x08, IDT_EXCEPTION); - idt_set_gate(0x1C, isr_stub_28, 0x08, IDT_EXCEPTION); - idt_set_gate(0x1D, isr_stub_29, 0x08, IDT_EXCEPTION); - idt_set_gate(0x1E, isr_stub_30, 0x08, IDT_EXCEPTION); - idt_set_gate(0x1F, isr_stub_31, 0x08, IDT_EXCEPTION); - - idt_set_gate(0x20, irq_stub_0, 0x08, IDT_INTERRUPT); - idt_set_gate(0x21, irq_stub_1, 0x08, IDT_INTERRUPT); - idt_set_gate(0x22, irq_stub_2, 0x08, IDT_INTERRUPT); - idt_set_gate(0x23, irq_stub_3, 0x08, IDT_INTERRUPT); - idt_set_gate(0x24, irq_stub_4, 0x08, IDT_INTERRUPT); - idt_set_gate(0x25, irq_stub_5, 0x08, IDT_INTERRUPT); - idt_set_gate(0x26, irq_stub_6, 0x08, IDT_INTERRUPT); - idt_set_gate(0x27, irq_stub_7, 0x08, IDT_INTERRUPT); - idt_set_gate(0x28, irq_stub_8, 0x08, IDT_INTERRUPT); - idt_set_gate(0x29, irq_stub_9, 0x08, IDT_INTERRUPT); - idt_set_gate(0x2A, irq_stub_10, 0x08, IDT_INTERRUPT); - idt_set_gate(0x2B, irq_stub_11, 0x08, IDT_INTERRUPT); - idt_set_gate(0x2C, irq_stub_12, 0x08, IDT_INTERRUPT); - idt_set_gate(0x2D, irq_stub_13, 0x08, IDT_INTERRUPT); - idt_set_gate(0x2E, irq_stub_14, 0x08, IDT_INTERRUPT); - idt_set_gate(0x2F, irq_stub_15, 0x08, IDT_INTERRUPT); - - idt_set_gate(0x80, isr_stub_128, 0x08, IDT_INTERRUPT); - - __asm__ volatile("lidt %0" : : "memory"(idtr)); -} 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/kmalloc.c b/arch/i386/kernel/kmalloc.c deleted file mode 100644 index ea77428..0000000 --- a/arch/i386/kernel/kmalloc.c +++ /dev/null @@ -1,68 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include - -static uintptr_t heap_start = KEND + 0xC0001000; -static uintptr_t heap_end = 0xFFBFF000; - -static void *kbrk = NULL; -static struct mem_block *first = NULL; - -void _request_page(void) { - uintptr_t paddr = pfa_alloc(1); - uintptr_t vaddr = PGROUNDDN((uintptr_t)kbrk + PAGE_SIZE); - kbrk += PAGE_SIZE; - map_page(paddr, vaddr, PD_PRES | PD_RW); -} - -void kmalloc_init(void) { - kbrk = PGROUNDDN(heap_start); - _request_page(); - first = (struct mem_block*)kbrk; - first->start = (uintptr_t)kbrk + sizeof(struct mem_block); - first->size = 0; - first->alloc = 1; - first->next = NULL; -} - -void* kmalloc(size_t sz) { - if (kbrk == NULL) - panic("Attmpted to malloc before initialization"); - if ((uintptr_t)kbrk >= heap_end) - return NULL; - - struct mem_block *temp = first; - while (temp->next != NULL) { - if (temp->next->size <= sz && temp->next->alloc == 0) { - temp->next->alloc = 1; - return (void*)temp->next->start; - } - temp = temp->next; - } - - temp->next = (struct mem_block*)((uintptr_t)temp + sizeof(struct mem_block) + temp->size); - if (temp->next > kbrk) - _request_page(); - temp->next->prev = temp; - temp->next->start = (uintptr_t)(temp->next + sizeof(struct mem_block)); - temp->next->size = sz; - temp->next->alloc = 1; - temp->next->next = NULL; - return (void*)temp->start; -} - -void kfree(void *ptr) { - struct mem_block *temp = first; - while (temp != NULL) { - if (temp->start == (uintptr_t)ptr) { - temp->alloc = 0; - return; - } - temp = temp->next; - } - panic("Attempted to free memory not alloc'd"); -} diff --git a/arch/i386/kernel/multiboot.c b/arch/i386/kernel/multiboot.c deleted file mode 100644 index dedf163..0000000 --- a/arch/i386/kernel/multiboot.c +++ /dev/null @@ -1,49 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -void kernel_main(char *cmdline); - -void i386_entry(uint32_t mboot_magic, struct mboot_info *header) { - map_page(0xB8000, (uintptr_t)VGA_MEMORY, PD_RW); - fb_init(); - - if (mboot_magic != MBOOT_LOADER_MAGIC) { - disable_ints(); - panic("Not booted with multiboot bootloader"); - } - - map_page(0x9000, 0x9000, PD_RW); - if (!(header->flags >> 6 & 0x1)) { - disable_ints(); - panic("Physical memory map not provided by bootloader"); - } - - char cmdline[4096]; - map_page(header->cmdline, PAGE_TMP_MAP, 0); - memcpy(cmdline, (char*)PAGE_TMP_MAP, strlen((char*)PAGE_TMP_MAP)); - unmap_page(PAGE_TMP_MAP); - pfa_init(header); - gdt_install(); - idt_install(); - paging_init(); - map_page(0xB8000, (uintptr_t)VGA_MEMORY, PD_RW); - pic_remap(); - timer_init(); - - enable_ints(); - kernel_main(cmdline); - - while (1); -} diff --git a/arch/i386/kernel/paging.c b/arch/i386/kernel/paging.c deleted file mode 100644 index a0bbb92..0000000 --- a/arch/i386/kernel/paging.c +++ /dev/null @@ -1,130 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include -#include - -static int paging_enabled = 0; - -void paging_init(void) { - if (paging_enabled == 1) - return; - - uintptr_t phys_pt = pfa_alloc(1); - map_page(phys_pt, PAGE_TMP_MAP, PD_PRES | PD_RW); - uintptr_t *pt = (uintptr_t*)PAGE_TMP_MAP; - for (uintptr_t i = KSTART; i < KEND; i += PAGE_SIZE) - pt[GET_PTX(GET_VADDR(i))] = i | PD_PRES; - unmap_page(PAGE_TMP_MAP); - - uintptr_t temp_pt = pfa_alloc(1); - - uintptr_t phys_pd = pfa_alloc(1); - map_page(phys_pd, PAGE_TMP_MAP, PD_PRES | PD_RW); - uintptr_t *pd = (uintptr_t*)PAGE_TMP_MAP; - pd[GET_PDX(GET_VADDR(KSTART))] = phys_pt | PD_PRES | PD_RW; - pd[GET_PDX(PAGE_TMP_MAP)] = temp_pt | PD_PRES | PD_RW; - pd[1023] = phys_pd | PD_PRES | PD_RW; - unmap_page(PAGE_TMP_MAP); - - enable_paging(phys_pd); - paging_enabled = 1; - return; -} - -void init_page_table(int pdindex, uint32_t flags) { - uintptr_t *pd = (uintptr_t*)PAGE_DIR_MAP; - if ((pd[pdindex] & PD_PRES) != 0) - return; - - uintptr_t paddr = pfa_alloc(1); - pd[pdindex] = paddr | PD_PRES | PD_RW | flags; - - uintptr_t *pt = ((uintptr_t*)PAGE_TAB_MAP) + (pdindex << 12); - pd[GET_PDX(pt)] = paddr | PD_PRES | PD_RW; -} - -uintptr_t init_page_directory(void) { - uintptr_t ret = pfa_alloc(1); - map_page(ret, PAGE_TMP_MAP, PD_RW); - - uintptr_t *new_pd = (uintptr_t*)PAGE_TMP_MAP; - uintptr_t *cur_pd = (uintptr_t*)PAGE_DIR_MAP; - int kernel_pdx = GET_PDX(GET_VADDR(KSTART)); - new_pd[kernel_pdx] = cur_pd[kernel_pdx]; - - unmap_page(PAGE_TMP_MAP); - return ret; -} - -void map_page(uintptr_t paddr, uintptr_t vaddr, uint32_t flags) { - paddr = PGROUNDDN(paddr); - vaddr = PGROUNDDN(vaddr); - - int pdindex = GET_PDX(vaddr); - int ptindex = GET_PTX(vaddr); - - uintptr_t *pd = (uintptr_t*)PAGE_DIR_MAP; - if ((pd[pdindex] & PD_PRES) == 0) - init_page_table(pdindex, 0); - - uintptr_t *pt = (uintptr_t*)(PAGE_TAB_MAP + (pdindex << 12)); - pt[ptindex] = paddr | PD_PRES | flags; - invlpg((void*)vaddr); -} - -void unmap_page(uintptr_t vaddr) { - uintptr_t pdindex = GET_PDX(vaddr); - uintptr_t ptindex = GET_PTX(vaddr); - - uintptr_t *pd = (uintptr_t*)PAGE_DIR_MAP; - if ((pd[pdindex] & PD_PRES) == 0) - return; - - uintptr_t *pt = (uintptr_t*)(PAGE_TAB_MAP + (pdindex << 12)); - pt[ptindex] = 0; - invlpg((void*)vaddr); -} - -void page_fault_handler(struct isr_frame *frame) { - uintptr_t fault_addr; - __asm__ volatile("movl %%cr2, %0" : "=r"(fault_addr)); - - kprintf("Faulting address: %x\n", fault_addr); - panic("Page fault not operational"); - switch (frame->isr_err) { - case 0: - //map_page((uintptr_t*)GET_VADDR(frame->cr3), pfa_alloc(), fault_addr, PD_PRES); - break; - case 1: - panic("Kernel process caused protection fault on read\n"); - break; - case 2: - //map_page((uintptr_t*)GET_VADDR(frame->cr3), pfa_alloc(), fault_addr, PD_PRES | PD_RW); - break; - case 3: - panic("Kernel process caused protection fault on write\n"); - break; - case 4: - //map_page((uintptr_t*)GET_VADDR(frame->cr3), pfa_alloc(), fault_addr, PD_PRES | PD_USR); - break; - case 5: - // TODO: instead of panicking, kill process - panic("User process caused protection fault on read\n"); - break; - case 6: - //map_page((uintptr_t*)GET_VADDR(frame->cr3), pfa_alloc(), fault_addr, PD_PRES | PD_RW | PD_USR); - break; - case 7: - // TODO: see case 101 - panic("USER process caused protection fault on write\n"); - break; - default: - kprintf("Unknown paging error occured on address %x\n", fault_addr); - panic("Paging error"); - break; - } -} diff --git a/arch/i386/kernel/pic.c b/arch/i386/kernel/pic.c deleted file mode 100644 index 0d29473..0000000 --- a/arch/i386/kernel/pic.c +++ /dev/null @@ -1,79 +0,0 @@ -#include - -static void (*irq_handlers[16])(struct isr_frame *frame); - -void pic_eoi(uint8_t irq) { - if (irq >= 8) - outb(PIC2_COMMAND, 0x20); - outb(PIC1_COMMAND, 0x20); -} - -void pic_remap(void) { - unsigned char a1 = inb(PIC1_DATA); - unsigned char a2 = inb(PIC2_DATA); - - outb(PIC1_COMMAND, ICW1_INIT | ICW1_ICW4); - outb(PIC2_COMMAND, ICW1_INIT | ICW1_ICW4); - outb(PIC1_DATA, PIC1); - outb(PIC2_DATA, PIC2); - outb(PIC1_DATA, 4); - outb(PIC2_DATA, 2); - outb(PIC1_DATA, ICW4_8086); - outb(PIC2_DATA, ICW4_8086); - outb(PIC1_DATA, a1); - outb(PIC2_DATA, a2); -} - -static uint16_t _pic_get_irq_reg(int ocw3) { - outb(PIC1_COMMAND, ocw3); - outb(PIC2_COMMAND, ocw3); - return (inb(PIC2_COMMAND) << 8) | inb(PIC1_COMMAND); -} - -uint16_t pic_get_irr(void) { - return _pic_get_irq_reg(PIC_READ_IRR); -} - -uint16_t pic_get_isr(void) { - return _pic_get_irq_reg(PIC_READ_ISR); -} - -void register_irq_handler(uint8_t irq, void (*handler)(struct isr_frame *frame)) { - irq_handlers[irq] = handler; -} - -void irq_dispatch(struct isr_frame *frame) { - (*irq_handlers[frame->isr_vector-32])(frame); - pic_eoi(frame->isr_vector-32); - return; -} - -void irq_set_mask(uint8_t irq) { - uint16_t port; - uint8_t data; - - if (irq < 8) { - port = PIC1_DATA; - } else { - port = PIC2_DATA; - irq -= 8; - } - - data = inb(port) | (1 << irq); - outb(port, data); -} - -void irq_clear_mask(uint8_t irq) { - uint16_t port; - uint8_t data; - - if (irq < 8) { - port = PIC1_DATA; - } else { - port = PIC2_DATA; - irq -= 8; - } - - data = inb(port) & ~(1 << irq); - outb(port, data); -} diff --git a/arch/i386/kernel/pmem.c b/arch/i386/kernel/pmem.c deleted file mode 100644 index 40e3400..0000000 --- a/arch/i386/kernel/pmem.c +++ /dev/null @@ -1,45 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include - -static struct pfa_page freelist; - -void pfa_init(struct mboot_info *header) { - struct mboot_mmap_entry *mme; - for (uintptr_t i = 0; i < header->mmap_length; i += sizeof(struct mboot_mmap_entry)) { - mme = (struct mboot_mmap_entry*)(header->mmap_addr + i); - if (mme->type == MBOOT_MEM_AVAILABLE) - pfa_free(mme->addr_low, mme->len_low / PAGE_SIZE); - } -} - -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); - uintptr_t ret = freelist.next; - freelist.next = temp->next; - memset(temp, 0, 32); - unmap_page(PAGE_TMP_MAP); - return ret; -} - -void pfa_free(uintptr_t paddr, size_t num_pages) { - uintptr_t addr; - struct pfa_page *temp = (struct pfa_page*)PAGE_TMP_MAP; - for (size_t i = 0; i < num_pages; i++) { - addr = (i * PAGE_SIZE + paddr); - if (addr >= KSTART && addr < KEND) - continue; - if (addr == 0) - continue; - map_page(addr, PAGE_TMP_MAP, PD_PRES | PD_RW); - memset(PAGE_TMP_MAP, 1, 32); - temp->next = freelist.next; - freelist.next = addr; - unmap_page(PAGE_TMP_MAP); - } -} diff --git a/arch/i386/kernel/serial.c b/arch/i386/kernel/serial.c deleted file mode 100644 index dc2a8bd..0000000 --- a/arch/i386/kernel/serial.c +++ /dev/null @@ -1,42 +0,0 @@ -#include -#include -#include -#include - -#define PORT 0x3f8 - -static inline int _serial_received(void) { - return inb(PORT + 5) & 1; -} - -static inline int _is_transmit_empty(void) { - return inb(PORT + 5) & 0x20; -} - -int serial_init(void) { - outb(PORT + 1, 0x00); - outb(PORT + 3, 0x80); - outb(PORT + 0, 0x03); - outb(PORT + 1, 0x00); - outb(PORT + 3, 0x03); - outb(PORT + 2, 0xC7); - outb(PORT + 4, 0x0B); - outb(PORT + 4, 0x1E); - outb(PORT + 0, 0xAE); - - if (inb(PORT + 0) != 0xAE) - return -1; - - outb(PORT + 4, 0x0F); - return 0; -} - -void serial_putchar(char c) { - while (_is_transmit_empty() == 0); - outb(PORT, c); -} - -char serial_getchar(void) { - while (_serial_received() == 0); - return inb(PORT); -} 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/syscall.c b/arch/i386/kernel/syscall.c deleted file mode 100644 index 200af4f..0000000 --- a/arch/i386/kernel/syscall.c +++ /dev/null @@ -1,25 +0,0 @@ -#include -#include -#include -#include -#include - -void sys_read(struct isr_frame *frame) { -} - -void sys_write(struct isr_frame *frame) { -} - -void handle_syscall(struct isr_frame *frame) { - switch (frame->eax) { - case SYS_READ: - sys_read(frame); - break; - case SYS_WRITE: - sys_write(frame); - break; - default: - panic("Invalid system call number"); - } - return 0; -} diff --git a/arch/i386/kernel/timer.c b/arch/i386/kernel/timer.c deleted file mode 100644 index a7d88dd..0000000 --- a/arch/i386/kernel/timer.c +++ /dev/null @@ -1,24 +0,0 @@ -#include -#include -#include - -static uint32_t num_ticks = 0; - -void timer_handler(struct isr_frame *frame) { - num_ticks++; - if (num_ticks == 3) { - num_ticks = 0; - schedule_next(); - } -} - -void timer_init(void) { - disable_ints(); - int divisor = 1193182 / 100; - outb(0x43, 0x34); - outb(0x40, divisor && 0xFF); - outb(0x40, divisor && 0xFF00 >> 8); - enable_ints(); - - register_irq_handler(0, timer_handler); -} diff --git a/arch/i386/linker.ld b/arch/i386/linker.ld deleted file mode 100644 index 734310f..0000000 --- a/arch/i386/linker.ld +++ /dev/null @@ -1,30 +0,0 @@ -ENTRY(_start) - -SECTIONS { - . = 0x00100000; - _kernel_start = .; - .multiboot.data : { - *(.multiboot.data) - } - .multiboot.text : { - *(.multiboot.text) - } - - . += 0xC0000000; - .text ALIGN(4K) : AT(ADDR(.text) - 0xC0000000) { - *(.text) - } - .rodata ALIGN(4K) : AT(ADDR(.rodata) - 0xC0000000) { - *(.rodata) - } - .data ALIGN(4K) : AT(ADDR(.data) - 0xC0000000) { - *(.data) - } - .bss ALIGN(4K) : AT(ADDR(.bss) - 0xC0000000) { - *(COMMON) - *(.bss) - *(.bootstrap_stack) - } - - _kernel_end = .; -} diff --git a/arch/i386/make.config b/arch/i386/make.config deleted file mode 100644 index 557f01a..0000000 --- a/arch/i386/make.config +++ /dev/null @@ -1,20 +0,0 @@ -KERNEL_ARCH_INCLUDE=$(ARCHDIR)/include -KERNEL_ARCH_CFLAGS=-I$(KERNEL_ARCH_INCLUDE) -KERNEL_ARCH_LDFLAGS= -KERNEL_ARCH_LIBS= - -KERNEL_ARCH_OBJS=$(ARCHDIR)/boot/boot.o \ - $(ARCHDIR)/kernel/idt.o \ - $(ARCHDIR)/kernel/gdt.o \ - $(ARCHDIR)/kernel/isr.o \ - $(ARCHDIR)/kernel/stack_trace.o \ - $(ARCHDIR)/kernel/multiboot.o \ - $(ARCHDIR)/kernel/serial.o \ - $(ARCHDIR)/kernel/pic.o \ - $(ARCHDIR)/kernel/timer.o \ - $(ARCHDIR)/kernel/spinlock.o \ - $(ARCHDIR)/kernel/syscall.o \ - $(ARCHDIR)/kernel/paging.o \ - $(ARCHDIR)/kernel/pmem.o \ - $(ARCHDIR)/kernel/kmalloc.o \ - $(ARCHDIR)/kernel/switch_thread.o \ -- cgit v1.2.3