Fixed ISR handlers, managed to finish elf loading for modules at least
This commit is contained in:
parent
f6108aaab5
commit
51af16b61e
9
makefile
9
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 $@
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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{
|
||||
|
|
|
|||
|
|
@ -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)();
|
||||
}
|
||||
|
|
@ -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;
|
||||
}
|
||||
|
|
@ -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,0 +1 @@
|
|||
typedef void (*KOS_MAPI_FP)(unsigned int function, ...);
|
||||
Loading…
Reference in New Issue