diff --git a/makefile b/makefile index 3d25fa2..2c9206d 100644 --- a/makefile +++ b/makefile @@ -3,13 +3,14 @@ AS := nasm CFLAGS:=-g -c -m32 -fno-pie -mno-sse -O3 -D __bits__=32 -Wno-int-to-pointer-cast -Wno-pointer-to-int-cast -Wno-incompatible-pointer-types -Wno-address-of-packed-member -Wno-discarded-qualifiers -fno-stack-protector -mno-red-zone -mno-sse -mno-sse2 -ffreestanding -nostdlib -mno-mmx CFLAGS_MODULE:=-g -c -m32 -fpie -pie -mno-sse -O3 -D __bits__=32 -Wno-int-to-pointer-cast -Wno-pointer-to-int-cast -Wno-incompatible-pointer-types -Wno-address-of-packed-member -Wno-discarded-qualifiers -fno-stack-protector -mno-red-zone -mno-sse -mno-sse2 -ffreestanding -nostdlib -mno-mmx BL_ASFLAGS := -f bin +LDFLAGS_MODULE:=-melf_i386 -e init --no-dynamic-linker -static -nostdlib SRCS := $(wildcard src/kernel/*/*.c) OBJS := $(patsubst src/kernel/%.c, bin/kernel/%.o, $(SRCS)) all: bootloader tools kernel cp bin/bootloader.bin image.bin qemu-img resize -f raw image.bin 512M - ./diskwrite -v -l idm.elf kernel.elf -o image.bin + ./diskwrite -v -l idm.elf ifsm.elf kernel.elf -o image.bin # ./diskwrite -v idm.elf -o image.bin # ./diskwrite -v -l kernel.elf idm.elf -o image.bin qemu-system-i386 -hda image.bin --no-reboot --no-shutdown -m 32m -smp 2 -serial mon:stdio -D intlog.txt -d int @@ -23,12 +24,14 @@ bootloader: kernel: nasm src/kernel/entry.s -o bin/kernel/entry.o -f elf32 gcc src/kmodules/disk_driver.c $(CFLAGS_MODULE) -o bin/modules/disk_driver.o -m32 + gcc src/kmodules/fs_driver.c $(CFLAGS_MODULE) -o bin/modules/fs_driver.o -m32 sh c_build_helper.sh nasm src/kernel/arch_i386/idt.s -o bin/kernel/idt.o -felf32 # ld -T linker.ld bin/kernel/entry.o bin/kernel/*.o -melf_i386 ld -T linker.ld bin/kernel/*.o -melf_i386 -o kernel.elf -static - ld -T linker.ld -o kernel_interface.elf -r -R kernel.elf -melf_i386 - ld -pie bin/modules/disk_driver.o kernel_interface.elf -o idm.elf -melf_i386 -e main --no-dynamic-linker -static -nostdlib +# ld -T linker.ld -o kernel_interface.elf -r -R kernel.elf -melf_i386 + ld -pie bin/modules/disk_driver.o -o idm.elf -melf_i386 -e init --no-dynamic-linker -static -nostdlib + ld -pie bin/modules/fs_driver.o -o ifsm.elf -melf_i386 -e init --no-dynamic-linker -static -nostdlib # %.o: $(SRCS) # mkdir -p bin/kernel/$(shell dirname $@) # $(CC) $(CFLAGS) $< -o $@ diff --git a/src/bootloader/main.s b/src/bootloader/main.s index 7ab31c0..f7b17b1 100644 --- a/src/bootloader/main.s +++ b/src/bootloader/main.s @@ -351,21 +351,41 @@ part_2: mov ax, 0xe44 int 0x10 .find_fs_driver: + ; mov edi, fs_module_file + ; call open_file + ; cmp eax, -1 + ; je .start32_no_fs + ; mov [fs_module_struct.size], edx + ; mov eax, esi + ; and edx, 0xfffffc00 + ; add edx, 0x1000 + ; add [kload_paddr], edx + + ; mov edi, [kload_paddr] + ; mov [fs_module_struct.ptr], edi + ; call read_file + + ; jc load_fail + ; mov edi, fs_module_file call open_file + ; debug cmp eax, -1 je .start32_no_fs mov [fs_module_struct.size], edx - mov eax, esi - and edx, 0xfffffc00 - add edx, 0x1000 + mov esi, eax + and edx, 0xfffff000 + add edx, 0x2000 add [kload_paddr], edx - + ; mov eax, [kload_paddr] + ; jmp $ + ; debug mov edi, [kload_paddr] mov [fs_module_struct.ptr], edi call read_file - jc load_fail + jmp .start32 + ; .start32_no_fs: mov ax, 0xe46 int 0x10 diff --git a/src/kernel/arch_i386/idt.s b/src/kernel/arch_i386/idt.s index 4a0c2c8..94e5e3d 100644 --- a/src/kernel/arch_i386/idt.s +++ b/src/kernel/arch_i386/idt.s @@ -73,6 +73,7 @@ _isr5: jmp _isr_common_stub _isr6: cli + xchg bx, bx push dword 0 push dword 6 jmp _isr_common_stub @@ -83,7 +84,6 @@ _isr7: jmp _isr_common_stub _isr8: cli - push dword 0 push dword 8 jmp _isr_common_stub _isr9: @@ -123,6 +123,7 @@ _isr16: jmp _isr_common_stub _isr17: cli + push dword 0 push dword 17 jmp _isr_common_stub _isr18: @@ -142,6 +143,7 @@ _isr20: jmp _isr_common_stub _isr21: cli + push dword 0 push dword 21 jmp _isr_common_stub _isr22: @@ -197,18 +199,16 @@ extern _isr_handler global _isr_common_stub _isr_common_stub: - push eax - push ebx - push ecx - push edx - push ebp - push esi - push edi + pushad push ds push es push fs push gs - + mov ax, 0x10 + mov ds, ax + mov es, ax + mov fs, ax + mov gs, ax push esp;push argument call _isr_handler pop esp @@ -217,13 +217,7 @@ _isr_common_stub: pop fs pop es pop ds - pop edi - pop esi - pop ebp - pop edx - pop ecx - pop ebx - pop eax + popad add esp, 8 iret diff --git a/src/kernel/arch_i386/interrupts.c b/src/kernel/arch_i386/interrupts.c index 138cb0c..99ada79 100644 --- a/src/kernel/arch_i386/interrupts.c +++ b/src/kernel/arch_i386/interrupts.c @@ -5,6 +5,37 @@ extern void _isr0(); extern void _isr1(); +extern void _isr2(); +extern void _isr3(); +extern void _isr4(); +extern void _isr5(); +extern void _isr6(); +extern void _isr7(); +extern void _isr8(); +extern void _isr9(); +extern void _isr10(); +extern void _isr11(); +extern void _isr12(); +extern void _isr13(); +extern void _isr14(); +extern void _isr15(); +extern void _isr16(); +extern void _isr17(); +extern void _isr18(); +extern void _isr19(); +extern void _isr20(); +extern void _isr21(); +extern void _isr22(); +extern void _isr23(); +extern void _isr24(); +extern void _isr25(); +extern void _isr26(); +extern void _isr27(); +extern void _isr28(); +extern void _isr29(); +extern void _isr30(); +extern void _isr31(); + extern void _irq0(); extern void _irq1(); @@ -53,12 +84,21 @@ cpu_registers_t *_irq_handler(cpu_registers_t *regs){ } return regs; } + +char *isr_error_strings[] = {"DE", "DB", "NMI", "BP", "OF", "BR", "UD", "NM", "DF", "CSO", "TS", "NP", "SS", "GP", "PF", "", "MF", "AC", "MC", "XM", "VE", "CP", ""}; + void _isr_handler(cpu_registers_t *regs){ printf("Kernel Panic!\n"); - printf("ISR: %d\n", regs->int_no); + printf("ISR: #%s\n", isr_error_strings[regs->int_no]); printf("EAX: %x EBX: %x ECX: %x EDX: %x\n", regs->eax, regs->ebx, regs->ecx, regs->edx); printf("ESI: %x EDI: %x ESP: %x EBP: %x\n", regs->esi, regs->edi, regs->esp, regs->ebp); printf("EIP: %x CS: %x DS: %x SS: %x\n", regs->eip, regs->cs, regs->ds, regs->ss); + printf("Error Code: %x\n", regs->pfa); + if (regs->int_no == 14){ + uint32_t cr2; + asm volatile("mov %%cr3, %%eax;mov %0, %%eax": "=r"(cr2)); + printf("Address: %x", cr2); + } for(;;); } @@ -81,10 +121,43 @@ void install_irq_handler(void (*handler)(), uint8_t irqno){ } void init_idt(){ - for(uint32_t i = 0; i < 32; i++){ - set_idt_entry(i, (_isr0 + ((_isr1 - _isr0) * i)), IDT_GATE_INT, 0x10); - // printf("int %d: address: %x\n", i, _isr0 + (_isr1 - _isr0) * i); - } + // for(uint32_t i = 0; i < 32; i++){ + // set_idt_entry(i, (_isr0 + ((_isr1 - _isr0) * i)), IDT_GATE_INT, 0x10); + // // printf("int %d: address: %x\n", i, _isr0 + (_isr1 - _isr0) * i); + // } + set_idt_entry(0, _isr0, IDT_GATE_INT, 0x10); + set_idt_entry(1, _isr1, IDT_GATE_INT, 0x10); + set_idt_entry(2, _isr2, IDT_GATE_INT, 0x10); + set_idt_entry(3, _isr3, IDT_GATE_INT, 0x10); + set_idt_entry(4, _isr4, IDT_GATE_INT, 0x10); + set_idt_entry(5, _isr5, IDT_GATE_INT, 0x10); + set_idt_entry(6, _isr6, IDT_GATE_INT, 0x10); + set_idt_entry(7, _isr7, IDT_GATE_INT, 0x10); + set_idt_entry(8, _isr8, IDT_GATE_INT, 0x10); + set_idt_entry(9, _isr9, IDT_GATE_INT, 0x10); + set_idt_entry(10, _isr10, IDT_GATE_INT, 0x10); + set_idt_entry(11, _isr11, IDT_GATE_INT, 0x10); + set_idt_entry(12, _isr12, IDT_GATE_INT, 0x10); + set_idt_entry(13, _isr13, IDT_GATE_INT, 0x10); + set_idt_entry(14, _isr14, IDT_GATE_INT, 0x10); + set_idt_entry(15, _isr15, IDT_GATE_INT, 0x10); + set_idt_entry(16, _isr16, IDT_GATE_INT, 0x10); + set_idt_entry(17, _isr17, IDT_GATE_INT, 0x10); + set_idt_entry(18, _isr18, IDT_GATE_INT, 0x10); + set_idt_entry(19, _isr19, IDT_GATE_INT, 0x10); + set_idt_entry(20, _isr20, IDT_GATE_INT, 0x10); + set_idt_entry(21, _isr21, IDT_GATE_INT, 0x10); + set_idt_entry(22, _isr22, IDT_GATE_INT, 0x10); + set_idt_entry(23, _isr23, IDT_GATE_INT, 0x10); + set_idt_entry(24, _isr24, IDT_GATE_INT, 0x10); + set_idt_entry(25, _isr25, IDT_GATE_INT, 0x10); + set_idt_entry(26, _isr26, IDT_GATE_INT, 0x10); + set_idt_entry(27, _isr27, IDT_GATE_INT, 0x10); + set_idt_entry(28, _isr28, IDT_GATE_INT, 0x10); + set_idt_entry(29, _isr29, IDT_GATE_INT, 0x10); + set_idt_entry(30, _isr30, IDT_GATE_INT, 0x10); + set_idt_entry(31, _isr31, IDT_GATE_INT, 0x10); + // printf("last ") for(uint32_t i = 0; i < 16; i++){ set_idt_entry(i + 32, (_irq0 + ((_irq1 - _irq0) * i)), IDT_GATE_INT, 0x10); diff --git a/src/kernel/shared/interrupts.h b/src/kernel/shared/interrupts.h index b80d287..89634a9 100644 --- a/src/kernel/shared/interrupts.h +++ b/src/kernel/shared/interrupts.h @@ -5,7 +5,7 @@ void init_idt(); typedef struct cpu_registers{ uint32_t gs, fs, es, ds; uint32_t edi, esi, ebp, esp, ebx, edx, ecx, eax; - uint32_t int_no; uint32_t pfa; + uint32_t int_no, pfa; uint32_t eip, cs, eflags, useresp, ss; }__attribute__((packed))cpu_registers_t; typedef struct idt{ diff --git a/src/kernel/system/elf.c b/src/kernel/system/elf.c index cbfa4d3..7ad1e61 100644 --- a/src/kernel/system/elf.c +++ b/src/kernel/system/elf.c @@ -21,15 +21,23 @@ void *load_segment(program_entry_t entry, void *file_data, void *base_segment, u } else{ segment = base_segment + (entry.vaddr & 0xfffff000); - map(segment, (void *)pm_alloc(), PT_PRESENT | map_flags); + uint32_t count = 1; + count += ((entry.vaddr+entry.msize) - entry.vaddr) ? 1 : 0; + count += entry.msize/4096; + printf("count: %x\n", count); + // for (;;); + for(uint32_t i = 0; i < count; i++){ + map(segment + (i << 12), (void *)pm_alloc(), PT_PRESENT | map_flags); + printf("Mapping : %x\n", segment + (i << 12)); + } } for(uint32_t i = 0; i < entry.fsize/sizeof(uint32_t) + 1; i++){ - (segment)[i] = ((uint32_t *)(file_data))[i + entry.data_offset]; + segment[i] = ((uint32_t *)(file_data))[i + entry.data_offset/sizeof(uint32_t)]; // printf("Writing to %x\n", (uint32_t)base_segment+i+entry.vaddr); } } } - printf("dSegment: %x\n", data_offset); + printf("data_offset: %x\n", data_offset); return base_segment; } @@ -55,10 +63,12 @@ void *load_elf(void *file_data, uint32_t map_flags){ // } // } base_segment = load_segment(program_header[i], file_data, base_segment, map_flags); - } // void (*vt)(void) = base_segment; - uint32_t* vt = base_segment; - printf("%x", *vt); + uint32_t (*vt)(uint32_t) = base_segment + 0x1000; + // printf("%x", *vt); + uint32_t i = (*vt)(0); + printf("%x\n", i); + for(;;); // (*vt)(); } \ No newline at end of file diff --git a/src/kmodules/disk_driver.c b/src/kmodules/disk_driver.c index 3cbc764..07ac4f2 100644 --- a/src/kmodules/disk_driver.c +++ b/src/kmodules/disk_driver.c @@ -1,10 +1,15 @@ #include +#include "modlib.h" -void main(){ +KOS_MAPI_FP api; + +uint32_t init(KOS_MAPI_FP module_api){ uint16_t *t = (void *)0xb8000; *t = 0x0f41; - for(int i = 0; i < 1000; i++){ - (*t)++; - asm volatile( " " ); - } + api = module_api; + // for(int i = 0; i < 1000; i++){ + // (*t)++; + // // asm volatile( " " ); + // } + return &api; } \ No newline at end of file diff --git a/src/kmodules/fs_driver.c b/src/kmodules/fs_driver.c new file mode 100644 index 0000000..9b1ff4c --- /dev/null +++ b/src/kmodules/fs_driver.c @@ -0,0 +1,11 @@ +#include + +void init(){ + uint16_t *t = (void *)0xb8002; + *t = 0x0f41; + // for(int i = 0; i < 1000; i++){ + // (*t)++; + // // asm volatile( " " ); + // } + for(;;); +} \ No newline at end of file diff --git a/src/kmodules/fs_driver.h b/src/kmodules/fs_driver.h new file mode 100644 index 0000000..e69de29 diff --git a/src/kmodules/modlib.h b/src/kmodules/modlib.h new file mode 100644 index 0000000..43013ee --- /dev/null +++ b/src/kmodules/modlib.h @@ -0,0 +1 @@ +typedef void (*KOS_MAPI_FP)(unsigned int function, ...); \ No newline at end of file