[boot] Well now, we have a stage two that almost does something

This commit is contained in:
Kevin Lange 2011-02-21 23:51:06 -06:00
parent 6067f11faf
commit 20efbe7b74
8 changed files with 107 additions and 20 deletions

View File

@ -82,7 +82,7 @@ bootloader/stage1.bin: bootloader/stage1/main.o bootloader/stage1/start.o bootlo
# Stage 2 # Stage 2
bootloader/stage2/main.o: bootloader/stage2/main.c bootloader/stage2/main.o: bootloader/stage2/main.c
@${ECHO} -n "\033[32m CC $<\033[0m" @${ECHO} -n "\033[32m CC $<\033[0m"
@${GCC} ${CFLAGS} -c -o $@ $< @${GCC} ${CFLAGS} -I./kernel/include -c -o $@ $<
@${ECHO} "\r\033[32;1m CC $<\033[0m" @${ECHO} "\r\033[32;1m CC $<\033[0m"
bootloader/stage2/start.o: bootloader/stage2/start.s bootloader/stage2/start.o: bootloader/stage2/start.s

View File

@ -33,7 +33,7 @@ void read(unsigned char count, unsigned char sector, short segment, short offset
void main() void main()
{ {
PRINT("Loading... "); PRINT("Loading... ");
read(2,2,0,0x7e00); read(6,2,0,0x7e00);
PRINT("Ready.\r\n"); PRINT("Ready.\r\n");
/* Let's do this... */ /* Let's do this... */

View File

@ -21,7 +21,7 @@ SECTIONS
.padding : AT (phys + SIZEOF(.text) + SIZEOF(.data) + SIZEOF(.rodata)) .padding : AT (phys + SIZEOF(.text) + SIZEOF(.data) + SIZEOF(.rodata))
{ {
/* Pad so we have at least one sector */ /* Pad so we have at least one sector */
. = ALIGN(4096); . = ALIGN(512);
/* Add an additional sector for good measure */ /* Add an additional sector for good measure */
. = ALIGN(508); . = ALIGN(508);
/* End it with a sad face */ /* End it with a sad face */

View File

@ -7,15 +7,88 @@
*/ */
__asm__(".code16gcc\n"); __asm__(".code16gcc\n");
#define BOOTLOADER
#include <ext2.h>
#define EXT2_SUPER_OFFSET 0x1000
#define EXT2_START (EXT2_SUPER_OFFSET - 0x400)
#define ext2_get_block(block) (EXT2_START + (0x400 << sblock->log_block_size) * block)
#define PRINT(s) __asm__ ("movw %0, %%si\ncall _print" : : "l"((short)(int)s)) #define PRINT(s) __asm__ ("movw %0, %%si\ncall _print" : : "l"((short)(int)s))
void read(unsigned char count, unsigned char sector, short segment, short offset)
{
__asm__ __volatile__ (
"movw %0, %%es\n"
"movw %1, %%bx\n"
"movb %2, %%al\n"
"movb $0, %%ch\n"
"movb %3, %%cl\n"
"movb $0, %%dh\n"
"movb $0x80, %%dl\n"
"movb $0x02, %%ah\n"
"int $0x13" : :
"l" (segment),
"l" (offset),
"m" (count),
"m" (sector));
}
/* /*
* Main entry point * Main entry point
*/ */
void main() void main()
{ {
PRINT("== Mr. Boots Stage 2 Bootloader ==\r\n"); PRINT("M");
/*
* Load up the superblock
*/
read(16,3,0,EXT2_SUPER_OFFSET);
ext2_superblock_t * sblock = (ext2_superblock_t *)(EXT2_START + 0x400);
if (sblock->magic != EXT2_SUPER_MAGIC) {
goto failure;
}
if (sblock->inode_size == 0) {
sblock->inode_size = 128;
}
ext2_bgdescriptor_t * rblock = (ext2_bgdescriptor_t *)(EXT2_START + 0x400 + 0x400);
ext2_inodetable_t * itable = (ext2_inodetable_t *)(EXT2_START + (0x400 << sblock->log_block_size) * rblock->inode_table);
ext2_inodetable_t * rnode = (ext2_inodetable_t *)((unsigned short)(unsigned int)itable + (unsigned short)(unsigned int)sblock->inode_size);
PRINT("r");
/*
* Grab the first inode's data...
*/
read(2,9 + (ext2_get_block((rnode->block[0]))) / 0x200,0,EXT2_SUPER_OFFSET + 0xc00);
void * block;
ext2_dir_t * direntry = NULL;
block = (void *)ext2_get_block((rnode->block[0]));
PRINT(". ");
uint32_t dir_offset = 0;
dir_offset = 0;
while (dir_offset < rnode->size) {
ext2_dir_t * d_ent = (ext2_dir_t *)((unsigned short)(unsigned int)block + dir_offset);
if (((char *)&d_ent->name)[0] == 'k'){
direntry = d_ent;
goto success;
}
dir_offset += d_ent->rec_len;
}
goto failure;
success:
PRINT("B");
PRINT("o");
PRINT("o");
PRINT("t");
PRINT("s");
failure:
PRINT("\023");
/* And that's it for now... */ /* And that's it for now... */
__asm__ __volatile__ ("hlt"); __asm__ __volatile__ ("hlt");
while (1) {}; while (1) {};

View File

@ -376,6 +376,10 @@ initrd_mount(
initrd_root_block = (ext2_bgdescriptor_t *)((uintptr_t)initrd_start + 1024 + 1024); initrd_root_block = (ext2_bgdescriptor_t *)((uintptr_t)initrd_start + 1024 + 1024);
initrd_inode_table = (ext2_inodetable_t *)((uintptr_t)initrd_start + (1024 << initrd_superblock->log_block_size) * initrd_root_block->inode_table); initrd_inode_table = (ext2_inodetable_t *)((uintptr_t)initrd_start + (1024 << initrd_superblock->log_block_size) * initrd_root_block->inode_table);
ext2_inodetable_t * root_inode = ext2_get_inode(2); ext2_inodetable_t * root_inode = ext2_get_inode(2);
kprintf("[DEBUG] root block 0 is %d\n", root_inode->block[0]);
kprintf("[DEBUG] root size is %d\n", root_inode->size);
kprintf("[DEBUG] uid is %d\n", root_inode->uid);
kprintf("[DEBUG] atime is %d\n", root_inode->atime);
initrd_root = (fs_node_t *)malloc(sizeof(fs_node_t)); initrd_root = (fs_node_t *)malloc(sizeof(fs_node_t));
assert(initrd_node_root(root_inode, initrd_root)); assert(initrd_node_root(root_inode, initrd_root));
fs_root = initrd_root; fs_root = initrd_root;

View File

@ -1,8 +1,7 @@
#ifndef EXT2_H #ifndef EXT2_H
#define EXT2_h #define EXT2_h
#include <system.h> #include <types.h>
#include <fs.h>
#define EXT2_SUPER_MAGIC 0xEF53 #define EXT2_SUPER_MAGIC 0xEF53

View File

@ -1,25 +1,12 @@
#ifndef __SYSTEM_H #ifndef __SYSTEM_H
#define __SYSTEM_H #define __SYSTEM_H
/* Types */ #include <types.h>
#define NULL ((void *)0UL)
typedef unsigned long uintptr_t;
typedef long size_t;
typedef unsigned int uint32_t;
typedef unsigned short uint16_t;
typedef unsigned char uint8_t;
typedef unsigned long long uint64_t;
/* Unimportant Kernel Strings */ /* Unimportant Kernel Strings */
#define KERNEL_UNAME "ToAruOS" #define KERNEL_UNAME "ToAruOS"
#define KERNEL_VERSION_STRING "0.0.1" #define KERNEL_VERSION_STRING "0.0.1"
#define CHAR_BIT 8
#define INT32_MAX 0x7fffffffL
#define UINT32_MAX 0xffffffffL
extern void *sbrk(uintptr_t increment); extern void *sbrk(uintptr_t increment);
/* Kernel Main */ /* Kernel Main */

24
kernel/include/types.h Normal file
View File

@ -0,0 +1,24 @@
#ifndef TYPES_H
#define TYPES_H
/* Types */
#define NULL ((void *)0UL)
#ifndef BOOTLOADER
typedef unsigned long uintptr_t;
#else
typedef unsigned short uintptr_t;
#endif
typedef unsigned long size_t;
typedef unsigned int uint32_t;
typedef unsigned short uint16_t;
typedef unsigned char uint8_t;
typedef unsigned long long uint64_t;
#define CHAR_BIT 8
#define INT32_MAX 0x7fffffffL
#define UINT32_MAX 0xffffffffL
#endif