Attempt to fix bootloader.
This commit is contained in:
parent
b8604932eb
commit
38d384175c
10
Makefile
10
Makefile
@ -5,6 +5,14 @@ CC=x86_64-elf-gcc
|
|||||||
run: image.bin
|
run: image.bin
|
||||||
qemu-system-i386 -drive format=raw,file=$<
|
qemu-system-i386 -drive format=raw,file=$<
|
||||||
|
|
||||||
|
debug-preboot: image.bin mbr.elf
|
||||||
|
qemu-system-i386 -drive format=raw,file=$< -s -S &
|
||||||
|
x86_64-elf-gdb mbr.elf \
|
||||||
|
-ex "set architecture i8086" \
|
||||||
|
-ex "target remote localhost:1234" \
|
||||||
|
-ex "break *0x7c00" \
|
||||||
|
-ex "continue"
|
||||||
|
|
||||||
debug-boot: image.bin mbr.elf
|
debug-boot: image.bin mbr.elf
|
||||||
qemu-system-i386 -drive format=raw,file=$< -s -S &
|
qemu-system-i386 -drive format=raw,file=$< -s -S &
|
||||||
x86_64-elf-gdb mbr.elf \
|
x86_64-elf-gdb mbr.elf \
|
||||||
@ -41,7 +49,7 @@ mbr.elf: mbr.o
|
|||||||
$(LD) -m elf_i386 -Ttext=0x7c00 $^ -o $@
|
$(LD) -m elf_i386 -Ttext=0x7c00 $^ -o $@
|
||||||
|
|
||||||
clean:
|
clean:
|
||||||
rm -f *.elf *.bin *.o */*.o tools/mkfs
|
rm -f *.elf *.img *.bin *.o */*.o tools/mkfs
|
||||||
|
|
||||||
tools/%: tools/%.c
|
tools/%: tools/%.c
|
||||||
gcc -Wall -Werror -g $^ -o $@
|
gcc -Wall -Werror -g $^ -o $@
|
||||||
|
|||||||
@ -4,3 +4,11 @@
|
|||||||
void printk(const char* msg) {
|
void printk(const char* msg) {
|
||||||
vga_print_string(msg);
|
vga_print_string(msg);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void panic(const char* msg) {
|
||||||
|
printk("Kernel panic: ");
|
||||||
|
printk(msg);
|
||||||
|
while (1) {
|
||||||
|
asm("hlt");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@ -1,3 +1,4 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
void printk(const char* msg);
|
void printk(const char* msg);
|
||||||
|
void panic(const char* msg);
|
||||||
|
|||||||
@ -33,6 +33,9 @@ void set_idt_gate(int n, uint32_t handler) {
|
|||||||
extern uint32_t default_handlers[];
|
extern uint32_t default_handlers[];
|
||||||
|
|
||||||
void init_idt() {
|
void init_idt() {
|
||||||
|
if (default_handlers[0] == 0) {
|
||||||
|
panic("handler table empty\n");
|
||||||
|
}
|
||||||
for (int i = 0; i < IDT_HANDLERS; i++) {
|
for (int i = 0; i < IDT_HANDLERS; i++) {
|
||||||
set_idt_gate(i, default_handlers[i]);
|
set_idt_gate(i, default_handlers[i]);
|
||||||
}
|
}
|
||||||
@ -126,11 +129,12 @@ static idt_register_t idt_reg;
|
|||||||
|
|
||||||
void load_idt() {
|
void load_idt() {
|
||||||
init_idt();
|
init_idt();
|
||||||
init_pic();
|
|
||||||
|
|
||||||
idt_reg.base = &idt;
|
idt_reg.base = &idt;
|
||||||
idt_reg.limit = sizeof(idt) - 1;
|
idt_reg.limit = sizeof(idt) - 1;
|
||||||
asm("lidt %0" : : "m"(idt_reg));
|
asm("lidt (%0)" : : "r"(&idt_reg));
|
||||||
|
|
||||||
|
init_pic();
|
||||||
}
|
}
|
||||||
|
|
||||||
void cli() {
|
void cli() {
|
||||||
|
|||||||
@ -45,7 +45,7 @@ vector\i :
|
|||||||
.global default_handlers
|
.global default_handlers
|
||||||
default_handlers:
|
default_handlers:
|
||||||
.set i,0
|
.set i,0
|
||||||
.rept 40
|
.rept 256
|
||||||
irq_insertX %i
|
irq_insertX %i
|
||||||
.set i, i+1
|
.set i, i+1
|
||||||
.endr
|
.endr
|
||||||
|
|||||||
29
mbr.S
29
mbr.S
@ -5,11 +5,19 @@ _start:
|
|||||||
mov $banner, %si
|
mov $banner, %si
|
||||||
call print_string
|
call print_string
|
||||||
|
|
||||||
|
call get_drive_geometry
|
||||||
call load_kernel
|
call load_kernel
|
||||||
call switch_to_32bit
|
call switch_to_32bit
|
||||||
|
|
||||||
|
hlt
|
||||||
jmp . // loop forever
|
jmp . // loop forever
|
||||||
|
|
||||||
|
get_drive_geometry:
|
||||||
|
mov $8, %ah
|
||||||
|
mov boot_drive, %dl
|
||||||
|
int $0x13
|
||||||
|
// TODO
|
||||||
|
|
||||||
|
|
||||||
.equ ELF32_ENTRY_OFFSET, 0x18
|
.equ ELF32_ENTRY_OFFSET, 0x18
|
||||||
.equ ELF32_PHDR_OFFSET, 0x1c
|
.equ ELF32_PHDR_OFFSET, 0x1c
|
||||||
@ -53,15 +61,30 @@ load_kernel:
|
|||||||
|
|
||||||
bios_disk_read:
|
bios_disk_read:
|
||||||
// expects %al to specify number of sectors, %cl the initial sector
|
// expects %al to specify number of sectors, %cl the initial sector
|
||||||
mov $2, %ah // read mode
|
xor %ah, %ah
|
||||||
|
mov %ax, %si
|
||||||
mov $0, %ch // cylinder 0
|
mov $0, %ch // cylinder 0
|
||||||
mov $0, %dh // head 0
|
mov $0, %dh // head 0
|
||||||
mov $KERNEL_OFFSET, %bx // bx -> destination
|
mov $KERNEL_OFFSET, %bx // bx -> destination
|
||||||
mov boot_drive, %dl // dl -> disk
|
mov boot_drive, %dl // dl -> disk
|
||||||
|
mov $1, %al
|
||||||
|
|
||||||
|
1:
|
||||||
|
mov $2, %ah // read mode
|
||||||
int $0x13
|
int $0x13
|
||||||
// no error checking, let's hope it works
|
test %ah, %ah
|
||||||
|
jnz fail
|
||||||
|
add $SECTOR_SIZE, %bx
|
||||||
|
inc %cl
|
||||||
|
dec %si
|
||||||
|
jnz 1b
|
||||||
ret
|
ret
|
||||||
|
|
||||||
|
fail:
|
||||||
|
mov $read_error, %si
|
||||||
|
call print_string
|
||||||
|
hlt
|
||||||
|
jmp .
|
||||||
|
|
||||||
switch_to_32bit:
|
switch_to_32bit:
|
||||||
mov $2, %al
|
mov $2, %al
|
||||||
@ -111,6 +134,8 @@ boot_drive:
|
|||||||
.byte 0
|
.byte 0
|
||||||
banner:
|
banner:
|
||||||
.asciz "YABLOKO bootloader started\r\n"
|
.asciz "YABLOKO bootloader started\r\n"
|
||||||
|
read_error:
|
||||||
|
.asciz "Read error\r\n"
|
||||||
|
|
||||||
.balign 2
|
.balign 2
|
||||||
entry:
|
entry:
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user