]> git.dujemihanovic.xyz Git - nameless-os.git/commitdiff
Compile stage3 in ELF format
authorDuje Mihanović <duje.mihanovic@skole.hr>
Sat, 18 Jun 2022 13:38:14 +0000 (15:38 +0200)
committerDuje Mihanović <duje.mihanovic@skole.hr>
Wed, 22 Jun 2022 16:03:18 +0000 (18:03 +0200)
During linking it gets converted to a good old flat binary. This was done so
that the ELF loading code can be written in C, which will save me plenty of
headaches later.

Also, since with ELF that's possible, stack space for stage3 is now reserved and
set up in a similar (same) fashion to the kernel.

boot/x86/Makefile
boot/x86/stage3/a20.s
boot/x86/stage3/e820.s
boot/x86/stage3/gdt.s
boot/x86/stage3/loader.s
boot/x86/stage3/print.s
boot/x86/stage3/stage3.ld [new file with mode: 0644]
boot/x86/stage3/unreal.s

index 1de8199c99b304f2de447804485c5f1b14867932..0e5ac00e050076b8f09aaa7ccc74eeb6ab313691 100644 (file)
@@ -1,15 +1,23 @@
 default: mbr vbr-fat32 stage3/LOADER.BIN
 
+LD=i686-elf-gcc
+LDFLAGS=-T stage3/stage3.ld -nostdlib
+
+STAGE3_OBJ=stage3/loader.o
+
 mbr: mbr.s
        $(AS) $(ASFLAGS) -w-zeroing -o $@ $<
 
 vbr-fat32: vbr-fat32.s fat32/*.s
        $(AS) $(ASFLAGS) -o $@ $<
 
-stage3/LOADER.BIN: stage3/loader.s stage3/*.s
-       $(AS) $(ASFLAGS) -DGIT_REVISION=\"$(GIT_REV)\" -o $@ $<
+stage3/LOADER.BIN: $(STAGE3_OBJ)
+       $(LD) $(LDFLAGS) -o $@ $<
+
+stage3/loader.o: stage3/loader.s stage3/*.s
+       $(AS) $(ASFLAGS) -f elf -g dwarf2 -DGIT_REVISION=\"$(GIT_REV)\" -o $@ $<
 
 clean:
-       -rm mbr vbr-fat32 stage3/LOADER.BIN disk.img
+       -rm mbr vbr-fat32 stage3/LOADER.BIN $(STAGE3_OBJ) disk.img
 
 .PHONY : default clean
index 8748dde580673653b15db546ade7739a1db13ac3..392e83de920c1fac19e06c301979ceb618348824 100644 (file)
@@ -1,3 +1,6 @@
+bits 16
+section .text
+
 %macro in_wait 0
        push ax
 %%loop:
index 247b3614cf83dcb8a754759ec4edd345e5193e0f..2d1780bfb48ac6f23e917971150612560dc1b3e1 100644 (file)
@@ -1,6 +1,7 @@
 ; Code for getting the BIOS E820 memory map
 
 bits 16
+section .text
 
 ; Return: ECX - number of entries, DI - pointer to map
 get_e820_map:
@@ -61,5 +62,6 @@ get_e820_map:
                hlt
                jmp $-1
 
+section .rodata
 no_e820: db "BIOS does not support E820, cannot proceed!", 0xd, 0xa, 0
 e820_unexpected: db "Unexpected value in EAX after getting map entry: expected SMAP, got ", 0
index d81bb64ecd34e90a144bab77c73f8afa7dba3f84..843df7bbdd259d040d8e8b442433b77e9090f758 100644 (file)
@@ -1,4 +1,7 @@
 ; Initial GDT for kernel, which wants a flat code and data descriptor
+
+section .rodata
+
 gdt:
        dw .end-.start-1
        dd .start
index 747905d704ef8bc0ae3c50921d996c3bc5ac000e..cdecbaac1b45f56740737cb355b28fefb6151863 100644 (file)
@@ -1,7 +1,7 @@
 bits 16
 cpu 686
-org 0x1800
 
+section .text
 %include "../fat32/fat32-structs.s"
 
 %macro print 1
@@ -11,7 +11,11 @@ org 0x1800
        pop si
 %endmacro
 
+extern __STACK_BOTTOM__
+
+global _start
 _start:
+       mov sp, __STACK_BOTTOM__
        mov [BOOT_DRIVE], dl
        call enable_unreal
        print begin
@@ -147,7 +151,6 @@ memcpy:
        pop esi
        ret
 
-
 %include "unreal.s"
 %include "a20.s"
 %include "../fat32/fat32.s"
@@ -155,8 +158,9 @@ memcpy:
 %include "print.s"
 %include "e820.s"
 
-in_protected:
 bits 32
+section .text
+in_protected:
        mov ax, 0x10
        mov ds, ax
        mov es, ax
@@ -170,6 +174,10 @@ bits 32
        jmp 0x8:0xc0000000
        nop
 
+%include "paging.s"
+
+section .rodata
+
 kernel_name: db "KERNEL  BIN"
 begin: db "Nameless Bootloader revision ", GIT_REVISION, 0xd, 0xa, 0
 a20_enabled: db "A20 has been enabled", 0xd, 0xa, "Searching for kernel...", 0xd, 0xa, 0
@@ -192,5 +200,3 @@ ss_s: db "SS: ", 0
 space: db " ", 0
 hex_delm: db "0x", 0
 newline: db 0xd, 0xa, 0
-
-%include "paging.s"
index 73b34d5adb8f5cf4fb5215e051202a40278b296d..edc71077c3a2312ab1b7284cb3e4353349e36f31 100644 (file)
@@ -1,5 +1,8 @@
 ; Routines for printing
 
+bits 16
+section .text
+
 print_str:
        push ax
        push bx
diff --git a/boot/x86/stage3/stage3.ld b/boot/x86/stage3/stage3.ld
new file mode 100644 (file)
index 0000000..1accdc0
--- /dev/null
@@ -0,0 +1,17 @@
+ENTRY(_start)
+OUTPUT_FORMAT(binary)
+
+SECTIONS {
+       . = 0x1800;
+       .text : {
+               stage3/loader.o(.text)
+               *(.text)
+       }
+       .rodata : { *(.rodata) }
+       .data : { *(.data) }
+       .bss : {
+               *(.bss)
+               . += 1K;
+               PROVIDE(__STACK_BOTTOM__ = .);
+       }
+}
index cdd361bbdd85ccf6ca83f2039d52494fc9362cda..1fbe1f909cf0953f26037dcb57df79362d7ad31a 100644 (file)
@@ -1,5 +1,8 @@
 ; Routine for enabling unreal mode, which allows using 32-bit offsets in real mode
 
+bits 16
+section .text
+
 enable_unreal:
        cli
        push eax
@@ -25,6 +28,8 @@ enable_unreal:
        sti
        ret
 
+section .rodata
+
 ; GDT with 1 flat data segment descriptor
 gdt_info:
        dw gdt_end-gdt_start-1