diff --git a/tools/Makefile b/tools/Makefile index 3901479a..f843f833 100644 --- a/tools/Makefile +++ b/tools/Makefile @@ -10,8 +10,6 @@ ASMFLAGS = -fbin # other implicit rules %.o : %.c $(CC) -c $(CFLAGS) -o $@ $< -%.o : %.asm - $(ASM) $(ASMFLAGS) -o $@ $< default: $(MAKE) all @@ -22,8 +20,13 @@ all: make_initrd: make_initrd.o $(CC) $(CFLAGS) -o make_initrd $< $(LDFLAGS) -SCC: - $(ASM) $(ASMFLAGS) -o scc_entry.bin scc_entry.asm +scc_setup.bin: scc_setup.asm + $(ASM) $(ASMFLAGS) -o $@ $< + +reset_vector.bin: reset_vector.o + ld --oformat binary -Ttext 0 -melf_i386 -o $@ $< + +SCC: scc_setup.bin reset_vector.bin cp ../metalsvm.bin . chmod a-x *.bin . ./prepare.sh diff --git a/tools/load.map b/tools/load.map index 70b9f74c..70dfa90a 100644 --- a/tools/load.map +++ b/tools/load.map @@ -1,2 +1,3 @@ +0x00090200 scc_setup.bin 0x00100000 metalsvm.bin -0xfffff000 scc_entry.bin +0xfffff000 reset_vector.bin diff --git a/tools/metalsvm.mt b/tools/metalsvm.mt index a910a1e9..9d40eaab 100644 --- a/tools/metalsvm.mt +++ b/tools/metalsvm.mt @@ -1,2 +1,2 @@ -# pid object file -0x00 ./metalsvm.obj +# pid mch-route mch-dest-id mch-offset-base testcase +0x00 0x00 6 0x00 metalsvm.obj diff --git a/tools/reset_vector.S b/tools/reset_vector.S new file mode 100644 index 00000000..944e8c29 --- /dev/null +++ b/tools/reset_vector.S @@ -0,0 +1,39 @@ +/* + * QEMU Boot sector to launch a preloaded Linux kernel + * Copyright (c) 2004 Fabrice Bellard + */ + +#define LOAD_SEG 0x9000 +// define CONFIG_MCEMU_DEBUG 1 +.code16 +.text + .globl _start + +.org 0x0000 + .ascii "MetalSVM Boot sector" + +_realstart: +#ifdef CONFIG_MCEMU_DEBUG + movl $27, %eax + movw $0xff8, %dx + outl %eax, %dx + movl $0x0010, %eax + movw $0xffc, %dx + outl %eax, %dx +#endif + cli + cld + mov $LOAD_SEG, %ax + mov %ax, %ds + mov %ax, %es + mov %ax, %fs + mov %ax, %gs + mov %ax, %ss + mov $0x8ffe, %sp + ljmp $LOAD_SEG + 0x20, $0 + +.org 0x0ff0 +_start: + jmp _realstart +_end: + .fill 4096 - _end, 1, 0 diff --git a/tools/scc_entry.asm b/tools/scc_setup.asm similarity index 70% rename from tools/scc_entry.asm rename to tools/scc_setup.asm index 5efbefd6..ebcd5e71 100644 --- a/tools/scc_entry.asm +++ b/tools/scc_setup.asm @@ -16,15 +16,18 @@ ; ; This file is part of metalsvm. -; This is the kernel's entry point. We could either call main here, -; or we can use this to setup the stack or other nice stuff, like -; perhaps setting up the GDT and segments. Please note that interrupts -; are disabled at this point: More on interrupts later! +; This is the kernel's entry point. We switch to the protected mode +; and jump to our kernel. [BITS 16] SECTION .text GLOBAL _start -ORG 0 +ORG 0x90200 +_start: + jmp _realstart + + msg db "Hello from MetalSVM bootloader!!",0 + struc GDT_STR s0_15: resw 1 b0_15: resw 1 @@ -35,8 +38,8 @@ ORG 0 endstruc gdt_start dw gdt_size - gdt_ptr dd 0 - + gdt_ptr dd dummy_descriptor + dummy_descriptor: istruc GDT_STR at s0_15, dw 0 at b0_15, dw 0 @@ -56,7 +59,7 @@ ORG 0 at b24_31, db 0 iend - ; 4GB 32-bit data, 92h = 10010010b = Presetn , DPL 00, No System, Data Read/Write + ; 4GB 32-bit data, 92h = 10010010b = Present, DPL 00, No System, Data Read/Write data32_descriptor: istruc GDT_STR at s0_15, dw 0x0ffff at b0_15, dw 0 @@ -66,8 +69,7 @@ ORG 0 at b24_31, db 0 iend - gdt_size equ $-(dummy_descriptor) - msg db "0ello from MetalSVM bootloader!!",0 + gdt_size equ $ - (dummy_descriptor) - 1 enable_A20: call a20wait @@ -111,37 +113,23 @@ a20wait2: ret _realstart: - cli - cld + lgdt [gdt_start] - mov [msg], BYTE 'H' - - mov ax, dummy_descriptor - mov [gdt_ptr], ax - - mov bx, gdt_start - lgdt [bx] - ; call enable_A20 ; switch to protected mode by setting PE bit - ; we also clear the VM bit mov eax, cr0 - or eax, 0x1 - and eax, 0x7FFFFFFF + or al, 0x1 mov cr0, eax - ; far jump - db 0x66 ; Prefix for 32-bit - db 0xea ; Opcode for far jump - dd _pmstart ; Offset to start, 32-bit - dw 0x08 ; This is the selector for CODE32_DESCRIPTOR, - ; assuming that start address resides in this segment + ; far jump to the 32bit code + jmp dword 0x08 : _pmstart [BITS 32] _pmstart: ; MetalSVM support Multiboot ; => Therefore, we switch to the same machine state. Afterwards, we jump to our kernel + xor eax, eax mov ax, 0x10 mov ds, ax mov es, ax @@ -149,13 +137,7 @@ _pmstart: mov gs, ax mov ss, ax mov eax, 0x2BAD002 - xor ebx, ebx ; => it exists n valid multiboot information structure + xor ebx, ebx ; => it exists no valid multiboot information structure jmp 0x08 : 0x100000 - TIMES 4080 - ($-$$) DB 0 - -[BITS 16] -_start: - jmp _realstart - - TIMES 4096 - ($-$$) DB 0 + TIMES 4096-($-$$) DB 0