From ac2a76737357262062267c57381af6e33225e0ac Mon Sep 17 00:00:00 2001 From: Kevin Lange Date: Wed, 19 Jan 2011 00:04:27 -0600 Subject: [PATCH] [core] Fix up everything to read multiboot parameters and print them out. --- Makefile | 5 +++- bootdisk.img | Bin 1474560 -> 1474560 bytes core/timer.c | 9 ++----- core/vga.c | 9 +++++++ include/multiboot.h | 41 ++++++++++++++++++++++++++++++ include/system.h | 9 +++++++ main.c | 59 ++++++++++++++++++++++++++++++++++++++++---- start.asm | 3 +++ 8 files changed, 122 insertions(+), 13 deletions(-) create mode 100644 include/multiboot.h diff --git a/Makefile b/Makefile index 86e0b7a4..95841c39 100644 --- a/Makefile +++ b/Makefile @@ -2,7 +2,7 @@ include Makefile.inc DIRS = core -.PHONY: all clean install core +.PHONY: all clean install core run all: kernel @@ -12,6 +12,9 @@ install: kernel umount /mnt cp kernel /boot/toaruos-kernel +run: bootdisk.img + qemu -fda bootdisk.img + kernel: start.o link.ld main.o core ${LD} -T link.ld -o kernel *.o core/*.o diff --git a/bootdisk.img b/bootdisk.img index 6cc95c040a12f7245d79a773c48ff94d3e5d1155..b1c150c1e969f4ae645b6be6981bc4dad0ac1c75 100644 GIT binary patch delta 5245 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 delta 4027 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 + +#define MULTIBOOT_FLAG_MEM 0x001 +#define MULTIBOOT_FLAG_DEVICE 0x002 +#define MULTIBOOT_FLAG_CMDLINE 0x004 +#define MULTIBOOT_FLAG_MODS 0x008 +#define MULTIBOOT_FLAG_AOUT 0x010 +#define MULTIBOOT_FLAG_ELF 0x020 +#define MULTIBOOT_FLAG_MMAP 0x040 +#define MULTIBOOT_FLAG_CONFIG 0x080 +#define MULTIBOOT_FLAG_LOADER 0x100 +#define MULTIBOOT_FLAG_APM 0x200 +#define MULTIBOOT_FLAG_VBE 0x400 + +struct multiboot +{ + uintptr_t flags; + uintptr_t mem_lower; + uintptr_t mem_upper; + uintptr_t boot_device; + uintptr_t cmdline; + uintptr_t mods_count; + uintptr_t mods_addr; + uintptr_t num; + uintptr_t size; + uintptr_t addr; + uintptr_t shndx; + uintptr_t mmap_length; + uintptr_t mmap_addr; + uintptr_t drives_length; + uintptr_t drives_addr; + uintptr_t config_table; + uintptr_t boot_loader_name; + uintptr_t apm_table; + uintptr_t vbe_control_info; + uintptr_t vbe_mode_info; + uintptr_t vbe_mode; + uintptr_t vbe_interface_seg; + uintptr_t vbe_interface_off; + uintptr_t vbe_interface_len; +} __attribute__((packed)); diff --git a/include/system.h b/include/system.h index 68818c8d..53d5df2a 100644 --- a/include/system.h +++ b/include/system.h @@ -1,10 +1,18 @@ #ifndef __SYSTEM_H #define __SYSTEM_H +/* Types */ + #define NULL ((void *)0UL) typedef unsigned long uintptr_t; typedef long size_t; +typedef unsigned int uint32_t; + +/* Unimportant Kernel Strings */ +#define KERNEL_UNAME "ToAruOS" +#define KERNEL_VERSION_STRING "0.0.1" + /* Kernel Main */ extern void *memcpy(void * restrict dest, const void * restrict src, size_t count); @@ -19,6 +27,7 @@ extern void cls(); extern void putch(unsigned char c); extern void puts(char *str); extern void settextcolor(unsigned char forecolor, unsigned char backcolor); +extern void resettextcolor(); extern void init_video(); /* GDT */ diff --git a/main.c b/main.c index bddde7fa..887cff7c 100644 --- a/main.c +++ b/main.c @@ -1,4 +1,5 @@ #include +#include /* * memcpy @@ -96,6 +97,10 @@ outportb( __asm__ __volatile__ ("outb %1, %0" : : "dN" (_port), "a" (_data)); } +/* + * 99 Bottles of Beer on the -Wall + * Sample kernel mode program. + */ void beer() { int i = 99; while (i > 0) { @@ -116,10 +121,10 @@ void beer() { } /* - * Kernel Entry Point + * kernel entry point */ int -main() { +main(struct multiboot *mboot_ptr) { gdt_install(); idt_install(); isrs_install(); @@ -128,8 +133,52 @@ main() { timer_install(); keyboard_install(); init_video(); - puts("Good Morning!\n"); - beer(); - for (;;); + /* Yes, yes, these are #define'd strings, consider this a nice test of kprintf */ + settextcolor(12,0); + kprintf("[%s %s]\n", KERNEL_UNAME, KERNEL_VERSION_STRING); + settextcolor(1,0); + /* Multiboot Debug */ + kprintf("Received the following MULTIBOOT data:\n"); + settextcolor(7,0); + kprintf("Flags: %x\t", mboot_ptr->flags); + kprintf("Mem Lo: %x\t", mboot_ptr->mem_lower); + kprintf("Mem Hi: %x\n", mboot_ptr->mem_upper); + kprintf("Boot dev: %x\t", mboot_ptr->boot_device); + kprintf("cmdline: %x\t", mboot_ptr->cmdline); + kprintf("Mods: %x\n", mboot_ptr->mods_count); + kprintf("Addr: %x\t", mboot_ptr->mods_addr); + kprintf("Syms: %x\t", mboot_ptr->num); + kprintf("Syms: %x\n", mboot_ptr->size); + kprintf("Syms: %x\t", mboot_ptr->addr); + kprintf("Syms: %x\t", mboot_ptr->shndx); + kprintf("MMap: %x\n", mboot_ptr->mmap_length); + kprintf("Addr: %x\t", mboot_ptr->mmap_addr); + kprintf("Drives: %x\t", mboot_ptr->drives_length); + kprintf("Addr: %x\n", mboot_ptr->drives_addr); + kprintf("Config: %x\t", mboot_ptr->config_table); + kprintf("Loader: %x\t", mboot_ptr->boot_loader_name); + kprintf("APM: %x\n", mboot_ptr->apm_table); + kprintf("VBE Control: %x\t", mboot_ptr->vbe_control_info); + kprintf("VBE Mode Info: %x\t", mboot_ptr->vbe_mode_info); + kprintf("VBE Mode: %x\n", mboot_ptr->vbe_mode); + kprintf("VBE seg: %x\t", mboot_ptr->vbe_interface_seg); + kprintf("VBE off: %x\t", mboot_ptr->vbe_interface_off); + kprintf("VBE len: %x\n", mboot_ptr->vbe_interface_len); + resettextcolor(); + kprintf("(End multiboot raw data)\n"); + kprintf("Started with: %s\n", (char *)mboot_ptr->cmdline); + kprintf("Booted from: %s\n", (char *)mboot_ptr->boot_loader_name); + settextcolor(7,0); + kprintf("Testing colors...\n"); + resettextcolor(); + int i; + for (i = 0; i < 256; ++i) { + settextcolor(i,i); + putch(' '); + } + resettextcolor(); + + + //for (;;); return 0; } diff --git a/start.asm b/start.asm index 360f61c1..7740261d 100644 --- a/start.asm +++ b/start.asm @@ -16,10 +16,13 @@ mboot: global start start: mov esp, _sys_stack + push ebx + cli extern main call main jmp $ + ; Global Descriptor Table global gdt_flush extern gp