tests: add a basic test multiboot1 kernel
Signed-off-by: Andy-Python-Programmer <andypythonappdeveloper@gmail.com>
This commit is contained in:
parent
6a56a07d20
commit
7be818bf77
|
@ -14,12 +14,19 @@ INTERNALLDFLAGS := \
|
||||||
--no-dynamic-linker \
|
--no-dynamic-linker \
|
||||||
-ztext
|
-ztext
|
||||||
|
|
||||||
INTERNALLDFLAGSMBOOT2 := \
|
INTERNAL_LD_FLAGS_MULTIBOOT2 := \
|
||||||
-Tmultiboot2.ld \
|
-Tmultiboot2.ld \
|
||||||
-nostdlib \
|
-nostdlib \
|
||||||
-zmax-page-size=0x1000 \
|
-zmax-page-size=0x1000 \
|
||||||
-static \
|
-static \
|
||||||
--no-dynamic-linker \
|
--no-dynamic-linker \
|
||||||
|
|
||||||
|
INTERNAL_LD_FLAGS_MULTIBOOT1 := \
|
||||||
|
-Tmultiboot.ld \
|
||||||
|
-nostdlib \
|
||||||
|
-zmax-page-size=0x1000 \
|
||||||
|
-static \
|
||||||
|
--no-dynamic-linker \
|
||||||
|
|
||||||
INTERNALCFLAGS := \
|
INTERNALCFLAGS := \
|
||||||
-I../stivale \
|
-I../stivale \
|
||||||
|
@ -36,7 +43,7 @@ INTERNALCFLAGS := \
|
||||||
-mno-sse2 \
|
-mno-sse2 \
|
||||||
-mno-red-zone
|
-mno-red-zone
|
||||||
|
|
||||||
all: test.elf multiboot2.elf
|
all: test.elf multiboot2.elf multiboot.elf
|
||||||
|
|
||||||
test.elf: stivale.o stivale2.o e9print.o memory.o
|
test.elf: stivale.o stivale2.o e9print.o memory.o
|
||||||
$(LD) $^ $(LDFLAGS) $(INTERNALLDFLAGS) -o $@
|
$(LD) $^ $(LDFLAGS) $(INTERNALLDFLAGS) -o $@
|
||||||
|
@ -44,7 +51,12 @@ test.elf: stivale.o stivale2.o e9print.o memory.o
|
||||||
multiboot2.elf: multiboot2_trampoline.o
|
multiboot2.elf: multiboot2_trampoline.o
|
||||||
$(CC) $(CFLAGS) $(INTERNALCFLAGS) -I../stage23/protos -m32 -c multiboot2.c -o multiboot2.o
|
$(CC) $(CFLAGS) $(INTERNALCFLAGS) -I../stage23/protos -m32 -c multiboot2.c -o multiboot2.o
|
||||||
$(CC) $(CFLAGS) $(INTERNALCFLAGS) -m32 -c e9print.c -o e9print.o
|
$(CC) $(CFLAGS) $(INTERNALCFLAGS) -m32 -c e9print.c -o e9print.o
|
||||||
$(LD) $^ multiboot2.o e9print.o $(LDFLAGS) $(INTERNALLDFLAGSMBOOT2) -m elf_i386 -o $@
|
$(LD) $^ multiboot2.o e9print.o $(LDFLAGS) $(INTERNAL_LD_FLAGS_MULTIBOOT2) -m elf_i386 -o $@
|
||||||
|
|
||||||
|
multiboot.elf: multiboot_trampoline.o
|
||||||
|
$(CC) $(CFLAGS) $(INTERNALCFLAGS) -I../stage23/protos -m32 -c multiboot.c -o multiboot.o
|
||||||
|
$(CC) $(CFLAGS) $(INTERNALCFLAGS) -m32 -c e9print.c -o e9print.o
|
||||||
|
$(LD) $^ multiboot.o e9print.o $(LDFLAGS) $(INTERNAL_LD_FLAGS_MULTIBOOT1) -m elf_i386 -o $@
|
||||||
|
|
||||||
%.o: %.c
|
%.o: %.c
|
||||||
$(CC) $(CFLAGS) $(INTERNALCFLAGS) -c $< -o $@
|
$(CC) $(CFLAGS) $(INTERNALCFLAGS) -c $< -o $@
|
||||||
|
@ -53,4 +65,4 @@ multiboot2.elf: multiboot2_trampoline.o
|
||||||
nasm -felf32 $< -o $@
|
nasm -felf32 $< -o $@
|
||||||
|
|
||||||
clean:
|
clean:
|
||||||
rm -rf test.elf stivale.o stivale2.o e9print.o memory.o multiboot2.o multiboot2.elf multiboot2_trampoline.o
|
rm -rf test.elf stivale.o stivale2.o e9print.o memory.o multiboot2.o multiboot2.elf multiboot2_trampoline.o multiboot_trampoline.o multiboot.elf
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
DEFAULT_ENTRY=2
|
DEFAULT_ENTRY=3
|
||||||
TIMEOUT=3
|
TIMEOUT=3
|
||||||
GRAPHICS=yes
|
GRAPHICS=yes
|
||||||
VERBOSE=yes
|
VERBOSE=yes
|
||||||
|
@ -38,6 +38,18 @@ KERNEL_CMDLINE=Woah! Another another example!
|
||||||
MODULE_PATH=boot:///boot/bg.bmp
|
MODULE_PATH=boot:///boot/bg.bmp
|
||||||
MODULE_STRING=This is the background image!
|
MODULE_STRING=This is the background image!
|
||||||
|
|
||||||
|
:Multiboot1 Test
|
||||||
|
|
||||||
|
COMMENT=Test of the multiboot1 boot protocol.
|
||||||
|
|
||||||
|
PROTOCOL=multiboot1
|
||||||
|
RESOLUTION=800x600
|
||||||
|
KERNEL_PATH=boot:///boot/multiboot.elf
|
||||||
|
KERNEL_CMDLINE=Woah! Another another another example!
|
||||||
|
|
||||||
|
MODULE_PATH=boot:///boot/bg.bmp
|
||||||
|
MODULE_STRING=This is the background image! Yay!
|
||||||
|
|
||||||
# Test that this should be NULL:
|
# Test that this should be NULL:
|
||||||
MODULE_PATH=boot:///boot/bg.bmp
|
MODULE_PATH=boot:///boot/bg.bmp
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,94 @@
|
||||||
|
#include <e9print.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <multiboot1.h>
|
||||||
|
|
||||||
|
#define MULTIBOOT_BOOTLOADER_MAGIC 0x2badb002
|
||||||
|
|
||||||
|
void multiboot_main(uint32_t magic, struct multiboot1_info *info) {
|
||||||
|
if (magic != MULTIBOOT_BOOTLOADER_MAGIC) {
|
||||||
|
e9_printf("multiboot: Invalid magic: %x\n", magic);
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
|
e9_printf("Welcome to the multiboot1 test kernel: ");
|
||||||
|
|
||||||
|
e9_printf("\t flags: %x", info->flags);
|
||||||
|
|
||||||
|
e9_printf("\t mem_lower: %x", info->mem_lower);
|
||||||
|
e9_printf("\t mem_upper: %x", info->mem_upper);
|
||||||
|
|
||||||
|
e9_printf("\t boot_device: %x", info->boot_device);
|
||||||
|
e9_printf("\t cmdline: %s", info->cmdline);
|
||||||
|
|
||||||
|
{
|
||||||
|
struct multiboot1_module *start = (struct multiboot1_module *)info->mods_addr;
|
||||||
|
struct multiboot1_module *end = (struct multiboot1_module *)(info->mods_addr + info->mods_count);
|
||||||
|
|
||||||
|
e9_printf("\t modules:");
|
||||||
|
for (struct multiboot1_module* entry = start; entry < end; entry++) {
|
||||||
|
e9_printf("\t\t begin=%x", entry->begin);
|
||||||
|
e9_printf("\t\t end=%x", entry->end);
|
||||||
|
e9_printf("\t\t cmdline=%s", entry->cmdline);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO(Andy-Python-Programmer): ELF sections are unimplemented
|
||||||
|
|
||||||
|
{
|
||||||
|
struct multiboot1_mmap_entry *start = (struct multiboot1_mmap_entry *)info->mmap_addr;
|
||||||
|
struct multiboot1_mmap_entry *end = (struct multiboot1_mmap_entry *)(info->mmap_addr + info->mmap_length);
|
||||||
|
|
||||||
|
e9_printf("\t useable_entries_mmap:");
|
||||||
|
|
||||||
|
size_t total_mem = 0;
|
||||||
|
|
||||||
|
// For now we only print the useable memory map entries since
|
||||||
|
// printing the whole memory map blows my terminal up. We also
|
||||||
|
// iterate through the avaliable memory map entries and add up
|
||||||
|
// to find the total amount of useable memory.
|
||||||
|
for (struct multiboot1_mmap_entry* entry = start; entry < end; entry++) {
|
||||||
|
// Check if the memory map entry is marked as useable!
|
||||||
|
if (entry->type != 1) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
e9_printf("\t\t addr=%x", entry->addr);
|
||||||
|
e9_printf("\t\t length=%x", entry->len);
|
||||||
|
e9_printf("\t\t type=Useable");
|
||||||
|
|
||||||
|
// Now this might be a bit confusing since but `entry->size` represents the
|
||||||
|
// is the size of the associated structure in bytes and `entry->len` represents the
|
||||||
|
// size of the memory region.
|
||||||
|
total_mem += entry->len;
|
||||||
|
}
|
||||||
|
|
||||||
|
e9_printf("Total usable memory: %x", total_mem);
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO(Andy-Python-Programmer): Drives are unimplemented
|
||||||
|
// TODO(Andy-Python-Programmer): ROM config is unimplemented
|
||||||
|
|
||||||
|
e9_printf("\t bootloader_name: %s", info->bootloader_name);
|
||||||
|
|
||||||
|
// TODO(Andy-Python-Programmer): APM table is unimplemented
|
||||||
|
// TODO(Andy-Python-Programmer): VBE tag is unimplemented
|
||||||
|
|
||||||
|
e9_printf("\t fb_addr: %x", info->fb_addr);
|
||||||
|
e9_printf("\t fb_pitch: %x", info->fb_pitch);
|
||||||
|
e9_printf("\t fb_width: %x", info->fb_width);
|
||||||
|
e9_printf("\t fb_height: %x", info->fb_height);
|
||||||
|
e9_printf("\t fb_bpp: %x", info->fb_bpp);
|
||||||
|
e9_printf("\t fb_type: %x", info->fb_type);
|
||||||
|
|
||||||
|
e9_printf("\t fb_red_mask_shift: %x", info->fb_red_mask_shift);
|
||||||
|
e9_printf("\t fb_red_mask_size: %x", info->fb_red_mask_size);
|
||||||
|
|
||||||
|
e9_printf("\t fb_green_mask_shift: %x", info->fb_green_mask_shift);
|
||||||
|
e9_printf("\t fb_green_mask_size: %x", info->fb_green_mask_size);
|
||||||
|
|
||||||
|
e9_printf("\t fb_blue_mask_shift: %x", info->fb_blue_mask_shift);
|
||||||
|
e9_printf("\t fb_blue_mask_size: %x", info->fb_blue_mask_size);
|
||||||
|
|
||||||
|
out:
|
||||||
|
for (;;);
|
||||||
|
}
|
|
@ -0,0 +1,35 @@
|
||||||
|
ENTRY(_start)
|
||||||
|
|
||||||
|
SECTIONS {
|
||||||
|
. = 1M;
|
||||||
|
|
||||||
|
.boot :
|
||||||
|
{
|
||||||
|
/* Ensure that the multiboot header is at the beginning! */
|
||||||
|
*(.multiboot_header)
|
||||||
|
}
|
||||||
|
|
||||||
|
. = ALIGN(4K);
|
||||||
|
.text :
|
||||||
|
{
|
||||||
|
*(.text .text.*)
|
||||||
|
}
|
||||||
|
|
||||||
|
. = ALIGN(4K);
|
||||||
|
.rodata :
|
||||||
|
{
|
||||||
|
*(.rodata.*)
|
||||||
|
}
|
||||||
|
|
||||||
|
. = ALIGN(4K);
|
||||||
|
.data :
|
||||||
|
{
|
||||||
|
*(.data .data.*)
|
||||||
|
}
|
||||||
|
|
||||||
|
. = ALIGN(4K);
|
||||||
|
.bss :
|
||||||
|
{
|
||||||
|
*(.bss .bss.*)
|
||||||
|
}
|
||||||
|
}
|
|
@ -87,7 +87,7 @@ void multiboot2_main(uint32_t magic, struct multiboot_info* mb_info_addr) {
|
||||||
|
|
||||||
e9_printf("\t\t\t addr=%x", entry->addr);
|
e9_printf("\t\t\t addr=%x", entry->addr);
|
||||||
e9_printf("\t\t\t len=%x", entry->len);
|
e9_printf("\t\t\t len=%x", entry->len);
|
||||||
e9_printf("\t\t\t type=%x", entry->type);
|
e9_printf("\t\t\t type=Useable");
|
||||||
|
|
||||||
total_mem += entry->len;
|
total_mem += entry->len;
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,37 @@
|
||||||
|
%define MULTIBOOT_HEADER_MAGIC 0x1badb002
|
||||||
|
|
||||||
|
; Flags:
|
||||||
|
;
|
||||||
|
; bit 2: request framebuffer
|
||||||
|
%define MULTIBOOT_HEADER_FLAGS (1 << 2)
|
||||||
|
|
||||||
|
extern multiboot_main
|
||||||
|
|
||||||
|
global _start
|
||||||
|
|
||||||
|
section .multiboot_header
|
||||||
|
|
||||||
|
align 4
|
||||||
|
header_start:
|
||||||
|
dd MULTIBOOT_HEADER_MAGIC ; Magic number (multiboot 1)
|
||||||
|
dd MULTIBOOT_HEADER_FLAGS ; Flags
|
||||||
|
dd -(MULTIBOOT_HEADER_MAGIC + MULTIBOOT_HEADER_FLAGS) ; Checksum
|
||||||
|
header_end:
|
||||||
|
|
||||||
|
section .text
|
||||||
|
bits 32
|
||||||
|
|
||||||
|
_start:
|
||||||
|
cli
|
||||||
|
|
||||||
|
mov esp, stack_top
|
||||||
|
|
||||||
|
push ebx
|
||||||
|
push eax
|
||||||
|
|
||||||
|
call multiboot_main ; Jump to our multiboot test kernel
|
||||||
|
|
||||||
|
section .bss
|
||||||
|
stack_bottom:
|
||||||
|
resb 4096 * 16
|
||||||
|
stack_top:
|
Loading…
Reference in New Issue