[core] Fix up everything to read multiboot parameters and print them out.

This commit is contained in:
Kevin Lange 2011-01-19 00:04:27 -06:00
parent 3e9f4d65a7
commit ac2a767373
8 changed files with 122 additions and 13 deletions

View File

@ -2,7 +2,7 @@ include Makefile.inc
DIRS = core DIRS = core
.PHONY: all clean install core .PHONY: all clean install core run
all: kernel all: kernel
@ -12,6 +12,9 @@ install: kernel
umount /mnt umount /mnt
cp kernel /boot/toaruos-kernel cp kernel /boot/toaruos-kernel
run: bootdisk.img
qemu -fda bootdisk.img
kernel: start.o link.ld main.o core kernel: start.o link.ld main.o core
${LD} -T link.ld -o kernel *.o core/*.o ${LD} -T link.ld -o kernel *.o core/*.o

Binary file not shown.

View File

@ -19,18 +19,13 @@ timer_handler(
) { ) {
++timer_ticks; ++timer_ticks;
if (timer_ticks % 18 == 0) { if (timer_ticks % 18 == 0) {
ticker++; ++ticker;
puts ("Tick. ");
if (ticker % 4 == 0) { putch('|'); }
else if(ticker % 4 == 1) { putch('/'); }
else if(ticker % 4 == 2) { putch('-'); }
else if(ticker % 4 == 3) { putch('\\'); }
putch('\n');
} }
} }
void timer_install() { void timer_install() {
irq_install_handler(0, timer_handler); irq_install_handler(0, timer_handler);
timer_phase(100); /* 100Hz */
} }
void void

View File

@ -130,6 +130,15 @@ settextcolor(
attrib = (backcolor << 4) | (forecolor & 0x0F); attrib = (backcolor << 4) | (forecolor & 0x0F);
} }
/*
* resettextcolor
* Reset the text color to white on black
*/
void
resettextcolor() {
settextcolor(15,0);
}
/* /*
* init_video * init_video
* Initialize the VGA driver. * Initialize the VGA driver.

41
include/multiboot.h Normal file
View File

@ -0,0 +1,41 @@
#include <system.h>
#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));

View File

@ -1,10 +1,18 @@
#ifndef __SYSTEM_H #ifndef __SYSTEM_H
#define __SYSTEM_H #define __SYSTEM_H
/* Types */
#define NULL ((void *)0UL) #define NULL ((void *)0UL)
typedef unsigned long uintptr_t; typedef unsigned long uintptr_t;
typedef long size_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 */ /* Kernel Main */
extern void *memcpy(void * restrict dest, const void * restrict src, size_t count); 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 putch(unsigned char c);
extern void puts(char *str); extern void puts(char *str);
extern void settextcolor(unsigned char forecolor, unsigned char backcolor); extern void settextcolor(unsigned char forecolor, unsigned char backcolor);
extern void resettextcolor();
extern void init_video(); extern void init_video();
/* GDT */ /* GDT */

59
main.c
View File

@ -1,4 +1,5 @@
#include <system.h> #include <system.h>
#include <multiboot.h>
/* /*
* memcpy * memcpy
@ -96,6 +97,10 @@ outportb(
__asm__ __volatile__ ("outb %1, %0" : : "dN" (_port), "a" (_data)); __asm__ __volatile__ ("outb %1, %0" : : "dN" (_port), "a" (_data));
} }
/*
* 99 Bottles of Beer on the -Wall
* Sample kernel mode program.
*/
void beer() { void beer() {
int i = 99; int i = 99;
while (i > 0) { while (i > 0) {
@ -116,10 +121,10 @@ void beer() {
} }
/* /*
* Kernel Entry Point * kernel entry point
*/ */
int int
main() { main(struct multiboot *mboot_ptr) {
gdt_install(); gdt_install();
idt_install(); idt_install();
isrs_install(); isrs_install();
@ -128,8 +133,52 @@ main() {
timer_install(); timer_install();
keyboard_install(); keyboard_install();
init_video(); init_video();
puts("Good Morning!\n"); /* Yes, yes, these are #define'd strings, consider this a nice test of kprintf */
beer(); settextcolor(12,0);
for (;;); 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; return 0;
} }

View File

@ -16,10 +16,13 @@ mboot:
global start global start
start: start:
mov esp, _sys_stack mov esp, _sys_stack
push ebx
cli
extern main extern main
call main call main
jmp $ jmp $
; Global Descriptor Table ; Global Descriptor Table
global gdt_flush global gdt_flush
extern gp extern gp