Fixed ISR handlers, managed to finish elf loading for modules at least

This commit is contained in:
notsomeidiot123 2025-08-17 17:31:21 -04:00
parent f6108aaab5
commit 51af16b61e
10 changed files with 158 additions and 41 deletions

View File

@ -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 $@

View File

@ -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

View File

@ -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

View File

@ -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);

View File

@ -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{

View File

@ -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)();
}

View File

@ -1,10 +1,15 @@
#include<stdint.h>
#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;
}

11
src/kmodules/fs_driver.c Normal file
View File

@ -0,0 +1,11 @@
#include <stdint.h>
void init(){
uint16_t *t = (void *)0xb8002;
*t = 0x0f41;
// for(int i = 0; i < 1000; i++){
// (*t)++;
// // asm volatile( " " );
// }
for(;;);
}

0
src/kmodules/fs_driver.h Normal file
View File

1
src/kmodules/modlib.h Normal file
View File

@ -0,0 +1 @@
typedef void (*KOS_MAPI_FP)(unsigned int function, ...);