parent
c23080c46c
commit
ebd3efb47b
3
.gitignore
vendored
3
.gitignore
vendored
@ -4,8 +4,7 @@ toaruos-initrd
|
|||||||
*.swp
|
*.swp
|
||||||
bootloader/stage1.bin
|
bootloader/stage1.bin
|
||||||
bootloader/stage2.bin
|
bootloader/stage2.bin
|
||||||
bootloader/stage3.bin
|
|
||||||
initrd/kernel
|
initrd/kernel
|
||||||
initrd/stage3
|
initrd/stage2
|
||||||
.gdb_history
|
.gdb_history
|
||||||
testdisk
|
testdisk
|
||||||
|
38
Makefile
38
Makefile
@ -45,12 +45,11 @@ kernel/start.o: kernel/start.asm
|
|||||||
################
|
################
|
||||||
# Ram disk #
|
# Ram disk #
|
||||||
################
|
################
|
||||||
toaruos-initrd: initrd bootloader/stage1.bin bootloader/stage2.bin initrd/stage3 initrd/kernel
|
toaruos-initrd: initrd bootloader/stage1.bin initrd/stage2 initrd/kernel
|
||||||
@${ECHO} -n "\033[32m initrd Generating initial RAM disk\033[0m"
|
@${ECHO} -n "\033[32m initrd Generating initial RAM disk\033[0m"
|
||||||
@-rm -f toaruos-initrd
|
@-rm -f toaruos-initrd
|
||||||
@${GENEXT} -d initrd -q -b 249 toaruos-initrd
|
@${GENEXT} -d initrd -q -b 249 toaruos-initrd
|
||||||
@${DD} if=bootloader/stage1.bin of=toaruos-initrd 2>/dev/null
|
@${DD} if=bootloader/stage1.bin of=toaruos-initrd 2>/dev/null
|
||||||
@${DD} if=bootloader/stage2.bin of=toaruos-initrd seek=1 count=1 bs=512 2>/dev/null
|
|
||||||
@${ECHO} "\r\033[32;1m initrd Generated initial RAM disk image\033[0m"
|
@${ECHO} "\r\033[32;1m initrd Generated initial RAM disk image\033[0m"
|
||||||
|
|
||||||
### Ram Disk installers...
|
### Ram Disk installers...
|
||||||
@ -60,8 +59,8 @@ initrd/kernel: toaruos-kernel
|
|||||||
@cp toaruos-kernel initrd/kernel
|
@cp toaruos-kernel initrd/kernel
|
||||||
|
|
||||||
# Second-stage bootloader
|
# Second-stage bootloader
|
||||||
initrd/stage3: bootloader/stage3.bin
|
initrd/stage2: bootloader/stage2.bin
|
||||||
@cp bootloader/stage3.bin initrd/stage3
|
@cp bootloader/stage2.bin initrd/stage2
|
||||||
|
|
||||||
################
|
################
|
||||||
# Bootloader #
|
# Bootloader #
|
||||||
@ -70,7 +69,7 @@ initrd/stage3: bootloader/stage3.bin
|
|||||||
# Stage 1
|
# Stage 1
|
||||||
bootloader/stage1/main.o: bootloader/stage1/main.c
|
bootloader/stage1/main.o: bootloader/stage1/main.c
|
||||||
@${ECHO} -n "\033[32m CC $<\033[0m"
|
@${ECHO} -n "\033[32m CC $<\033[0m"
|
||||||
@${GCC} ${CFLAGS} -I./kernel/include/ -c -o $@ $<
|
@${GCC} ${CFLAGS} -c -o $@ $<
|
||||||
@${ECHO} "\r\033[32;1m CC $<\033[0m"
|
@${ECHO} "\r\033[32;1m CC $<\033[0m"
|
||||||
|
|
||||||
bootloader/stage1/start.o: bootloader/stage1/start.s
|
bootloader/stage1/start.o: bootloader/stage1/start.s
|
||||||
@ -86,30 +85,25 @@ 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} -I./kernel/include/ -c -o $@ $<
|
@${GCC} ${CFLAGS} -c -o $@ $<
|
||||||
@${ECHO} "\r\033[32;1m CC $<\033[0m"
|
@${ECHO} "\r\033[32;1m CC $<\033[0m"
|
||||||
|
|
||||||
bootloader/stage2.bin: bootloader/stage2/main.o bootloader/stage2/link.ld
|
bootloader/stage2/start.o: bootloader/stage2/start.s
|
||||||
@${ECHO} -n "\033[32m ld $<\033[0m"
|
|
||||||
@${LD} -o bootloader/stage2.bin -T bootloader/stage2/link.ld bootloader/stage2/main.o
|
|
||||||
@${ECHO} "\r\033[32;1m ld $<\033[0m"
|
|
||||||
|
|
||||||
# Stage 3
|
|
||||||
bootloader/stage3/main.o: bootloader/stage3/main.c
|
|
||||||
@${ECHO} -n "\033[32m CC $<\033[0m"
|
|
||||||
@${GCC} ${CFLAGS} -I./kernel/include/ -c -o $@ $<
|
|
||||||
@${ECHO} "\r\033[32;1m CC $<\033[0m"
|
|
||||||
|
|
||||||
bootloader/stage3/start.o: bootloader/stage3/start.s
|
|
||||||
@${ECHO} -n "\033[32m yasm $<\033[0m"
|
@${ECHO} -n "\033[32m yasm $<\033[0m"
|
||||||
@${YASM} -f elf32 -p gas -o $@ $<
|
@${YASM} -f elf32 -p gas -o $@ $<
|
||||||
@${ECHO} "\r\033[32;1m yasm $<\033[0m"
|
@${ECHO} "\r\033[32;1m yasm $<\033[0m"
|
||||||
|
|
||||||
bootloader/stage3.bin: bootloader/stage3/main.o bootloader/stage3/start.o bootloader/stage3/link.ld
|
bootloader/stage2.bin: bootloader/stage2/main.o bootloader/stage2/start.o bootloader/stage2/link.ld
|
||||||
@${ECHO} -n "\033[32m ld $<\033[0m"
|
@${ECHO} -n "\033[32m ld $<\033[0m"
|
||||||
@${LD} -o bootloader/stage3.bin -T bootloader/stage3/link.ld bootloader/stage3/start.o bootloader/stage3/main.o
|
@${LD} -o bootloader/stage2.bin -T bootloader/stage2/link.ld bootloader/stage2/start.o bootloader/stage2/main.o
|
||||||
@${ECHO} "\r\033[32;1m ld $<\033[0m"
|
@${ECHO} "\r\033[32;1m ld $<\033[0m"
|
||||||
|
|
||||||
|
testdisk: bootloader/stage1.bin bootloader/stage2.bin
|
||||||
|
@${ECHO} "\033[31;1m WARN This disk is a temporary development test only!\033[0m"
|
||||||
|
@${ECHO} -n "\033[34m -- Building tesdisk...\033[0m"
|
||||||
|
@cat bootloader/stage1.bin bootloader/stage2.bin > testdisk
|
||||||
|
@${ECHO} "\r\033[34;1m -- Testdisk compiled. \033[0m"
|
||||||
|
|
||||||
###############
|
###############
|
||||||
# clean #
|
# clean #
|
||||||
###############
|
###############
|
||||||
@ -124,9 +118,7 @@ clean:
|
|||||||
@-rm -f bootloader/stage1/*.o
|
@-rm -f bootloader/stage1/*.o
|
||||||
@-rm -f bootloader/stage2.bin
|
@-rm -f bootloader/stage2.bin
|
||||||
@-rm -f bootloader/stage2/*.o
|
@-rm -f bootloader/stage2/*.o
|
||||||
@-rm -f bootloader/stage3.bin
|
@-rm -f initrd/stage2
|
||||||
@-rm -f bootloader/stage3/*.o
|
|
||||||
@-rm -f initrd/stage3
|
|
||||||
@-rm -f initrd/kernel
|
@-rm -f initrd/kernel
|
||||||
@-rm -f testdisk
|
@-rm -f testdisk
|
||||||
@${ECHO} "\r\033[31;1m RM Finished cleaning.\033[0m\033[K"
|
@${ECHO} "\r\033[31;1m RM Finished cleaning.\033[0m\033[K"
|
||||||
|
@ -7,16 +7,8 @@
|
|||||||
*/
|
*/
|
||||||
__asm__(".code16gcc\n");
|
__asm__(".code16gcc\n");
|
||||||
|
|
||||||
#include <ext2.h>
|
#define PRINT(s) __asm__ ("movw %0, %%si\ncall _print" : : "l"((short)(int)s))
|
||||||
|
|
||||||
#define EXT2_SUPER_OFFSET 0x6000
|
|
||||||
#define EXT2_START 0x5C00
|
|
||||||
|
|
||||||
#define ext2_get_block(block) (void *)(EXT2_START + (0x400 << sblock->log_block_size * block))
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Read some sectors from the first hard drive
|
|
||||||
*/
|
|
||||||
void read(unsigned char count, unsigned char sector, short segment, short offset)
|
void read(unsigned char count, unsigned char sector, short segment, short offset)
|
||||||
{
|
{
|
||||||
__asm__ __volatile__ (
|
__asm__ __volatile__ (
|
||||||
@ -40,28 +32,10 @@ void read(unsigned char count, unsigned char sector, short segment, short offset
|
|||||||
*/
|
*/
|
||||||
void main()
|
void main()
|
||||||
{
|
{
|
||||||
/*
|
PRINT("Loading... ");
|
||||||
* Read the EXT2 Super Block
|
read(2,2,0,0x7e00);
|
||||||
*/
|
PRINT("Ready.\r\n");
|
||||||
read(2,3,0,EXT2_SUPER_OFFSET);
|
|
||||||
ext2_superblock_t * sblock = (ext2_superblock_t *)EXT2_SUPER_OFFSET;
|
/* Let's do this... */
|
||||||
ext2_bgdescriptor_t * rblock = (ext2_bgdescriptor_t *)(EXT2_SUPER_OFFSET + 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 *)((uintptr_t)itable + sblock->inode_size);
|
|
||||||
void * block;
|
|
||||||
ext2_dir_t * direntry = NULL;
|
|
||||||
block = (void *)ext2_get_block((rnode->block[0]));
|
|
||||||
uint32_t dir_offset = 0;
|
|
||||||
while (dir_offset < rnode->size) {
|
|
||||||
ext2_dir_t * d_ent = (ext2_dir_t *)((uintptr_t)block + dir_offset);
|
|
||||||
if (((char *)&d_ent->name)[0] == 's') {
|
|
||||||
direntry = d_ent;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
dir_offset += d_ent->rec_len;
|
|
||||||
}
|
|
||||||
*((unsigned int *)0x5000) = direntry->inode;
|
|
||||||
read(1,2,0,0x7e00);
|
|
||||||
/* Stage 2 */
|
|
||||||
__asm__ __volatile__ ("jmp $0x00, $0x7e00");
|
__asm__ __volatile__ ("jmp $0x00, $0x7e00");
|
||||||
}
|
}
|
||||||
|
@ -9,8 +9,24 @@
|
|||||||
_start:
|
_start:
|
||||||
movw $0x00,%ax # Initialize segments...
|
movw $0x00,%ax # Initialize segments...
|
||||||
movw %ax,%ds # ... data
|
movw %ax,%ds # ... data
|
||||||
|
movw %ax,%es # ... e?
|
||||||
|
movw %ax,%ss # ... selector
|
||||||
|
|
||||||
movw $0x7bf0,%sp # stack pointer
|
movw $0x7bf0,%sp # stack pointer
|
||||||
|
|
||||||
.extern main # Jump the C main entry point...
|
.extern main # Jump the C main entry point...
|
||||||
jmp main
|
jmp main
|
||||||
|
|
||||||
|
.global _print
|
||||||
|
_print:
|
||||||
|
movb $0x0E,%ah # set registers for
|
||||||
|
movb $0x00,%bh # bios video call
|
||||||
|
movb $0x07,%bl
|
||||||
|
_print.next:
|
||||||
|
lodsb # string stuff
|
||||||
|
orb %al,%al # if 0...
|
||||||
|
jz _print.return # return
|
||||||
|
int $0x10 # print character
|
||||||
|
jmp _print.next # continue
|
||||||
|
_print.return:
|
||||||
|
retl
|
||||||
|
@ -1,8 +1,7 @@
|
|||||||
OUTPUT_FORMAT(binary)
|
OUTPUT_FORMAT(binary)
|
||||||
ENTRY(main)
|
ENTRY(_start)
|
||||||
load = 0x7e00;
|
load = 0x7e00;
|
||||||
phys = 0x0;
|
phys = 0x0;
|
||||||
end = 0x1ff;
|
|
||||||
SECTIONS
|
SECTIONS
|
||||||
{
|
{
|
||||||
.text load : AT(phys)
|
.text load : AT(phys)
|
||||||
@ -19,9 +18,15 @@ SECTIONS
|
|||||||
{
|
{
|
||||||
*(.rodata)
|
*(.rodata)
|
||||||
}
|
}
|
||||||
.end : AT(end)
|
.padding : AT (phys + SIZEOF(.text) + SIZEOF(.data) + SIZEOF(.rodata))
|
||||||
{
|
{
|
||||||
BYTE(0x01);
|
/* Pad so we have at least one sector */
|
||||||
|
. = ALIGN(4096);
|
||||||
|
/* Add an additional sector for good measure */
|
||||||
|
. = ALIGN(508);
|
||||||
|
/* End it with a sad face */
|
||||||
|
SHORT(0xada5);
|
||||||
|
SHORT(0xcefa);
|
||||||
}
|
}
|
||||||
/DISCARD/ :
|
/DISCARD/ :
|
||||||
{
|
{
|
||||||
|
@ -7,18 +7,16 @@
|
|||||||
*/
|
*/
|
||||||
__asm__(".code16gcc\n");
|
__asm__(".code16gcc\n");
|
||||||
|
|
||||||
#include <ext2.h>
|
#define PRINT(s) __asm__ ("movw %0, %%si\ncall _print" : : "l"((short)(int)s))
|
||||||
#define EXT2_SUPER_OFFSET 0x6000
|
|
||||||
#define EXT2_START 0x5C00
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Main entry point
|
* Main entry point
|
||||||
*/
|
*/
|
||||||
void main()
|
void main()
|
||||||
{
|
{
|
||||||
ext2_superblock_t * sblock = (ext2_superblock_t *)EXT2_SUPER_OFFSET;
|
PRINT("== Mr. Boots Stage 2 Bootloader ==\r\n");
|
||||||
ext2_bgdescriptor_t * rblock = (ext2_bgdescriptor_t *)(EXT2_SUPER_OFFSET + 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 *)((uintptr_t)itable + sblock->inode_size * (*(uint32_t *)(0x5000)));
|
|
||||||
|
|
||||||
|
/* And that's it for now... */
|
||||||
|
__asm__ __volatile__ ("hlt");
|
||||||
|
while (1) {};
|
||||||
}
|
}
|
||||||
|
@ -1,38 +0,0 @@
|
|||||||
OUTPUT_FORMAT(binary)
|
|
||||||
ENTRY(_start)
|
|
||||||
load = 0x8000;
|
|
||||||
phys = 0x0;
|
|
||||||
SECTIONS
|
|
||||||
{
|
|
||||||
.text load : AT(phys)
|
|
||||||
{
|
|
||||||
*(.text)
|
|
||||||
. = ALIGN(4);
|
|
||||||
}
|
|
||||||
.data : AT(phys + SIZEOF(.text))
|
|
||||||
{
|
|
||||||
*(.data)
|
|
||||||
. = ALIGN(4);
|
|
||||||
}
|
|
||||||
.rodata : AT (phys + SIZEOF(.text) + SIZEOF(.data))
|
|
||||||
{
|
|
||||||
*(.rodata)
|
|
||||||
}
|
|
||||||
.padding : AT (phys + SIZEOF(.text) + SIZEOF(.data) + SIZEOF(.rodata))
|
|
||||||
{
|
|
||||||
/* Pad so we have at least one sector */
|
|
||||||
. = ALIGN(4096);
|
|
||||||
/* Add an additional sector for good measure */
|
|
||||||
. = ALIGN(508);
|
|
||||||
/* End it with a sad face */
|
|
||||||
SHORT(0xada5);
|
|
||||||
SHORT(0xcefa);
|
|
||||||
}
|
|
||||||
/DISCARD/ :
|
|
||||||
{
|
|
||||||
*(.bss)
|
|
||||||
*(.comment)
|
|
||||||
*(.eh_frame)
|
|
||||||
*(.note.gnu.build-id)
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,22 +0,0 @@
|
|||||||
/*
|
|
||||||
* Mr. Boots Stage 1
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* 16-bit bootloader
|
|
||||||
*/
|
|
||||||
__asm__(".code16gcc\n");
|
|
||||||
|
|
||||||
#define PRINT(s) __asm__ ("movw %0, %%si\ncall _print" : : "l"((short)(int)s))
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Main entry point
|
|
||||||
*/
|
|
||||||
void main()
|
|
||||||
{
|
|
||||||
PRINT("== Mr. Boots Stage 2 Bootloader ==\r\n");
|
|
||||||
|
|
||||||
/* And that's it for now... */
|
|
||||||
__asm__ __volatile__ ("hlt");
|
|
||||||
while (1) {};
|
|
||||||
}
|
|
@ -1,32 +0,0 @@
|
|||||||
#
|
|
||||||
# Mr. Boots - Stage 2 (ASM entry point)
|
|
||||||
#
|
|
||||||
.code16
|
|
||||||
|
|
||||||
.text
|
|
||||||
|
|
||||||
.global _start
|
|
||||||
.global _print
|
|
||||||
_start:
|
|
||||||
movw $0x00,%ax # Initialize segments...
|
|
||||||
movw %ax,%ds # ... data
|
|
||||||
movw %ax,%es # ... e?
|
|
||||||
movw %ax,%ss # ... selector
|
|
||||||
|
|
||||||
movw $0x7bf0,%sp # stack pointer
|
|
||||||
|
|
||||||
.extern main # Jump the C main entry point...
|
|
||||||
jmp main
|
|
||||||
|
|
||||||
_print:
|
|
||||||
movb $0x0E,%ah # set registers for
|
|
||||||
movb $0x00,%bh # bios video call
|
|
||||||
movb $0x07,%bl
|
|
||||||
_print.next:
|
|
||||||
lodsb # string stuff
|
|
||||||
orb %al,%al # if 0...
|
|
||||||
jz _print.return # return
|
|
||||||
int $0x10 # print character
|
|
||||||
jmp _print.next # continue
|
|
||||||
_print.return:
|
|
||||||
retl
|
|
@ -1,7 +1,8 @@
|
|||||||
#ifndef EXT2_H
|
#ifndef EXT2_H
|
||||||
#define EXT2_h
|
#define EXT2_h
|
||||||
|
|
||||||
#include <types.h>
|
#include <system.h>
|
||||||
|
#include <fs.h>
|
||||||
|
|
||||||
#define EXT2_SUPER_MAGIC 0xEF53
|
#define EXT2_SUPER_MAGIC 0xEF53
|
||||||
|
|
||||||
|
@ -1,8 +1,6 @@
|
|||||||
#ifndef FS_H
|
#ifndef FS_H
|
||||||
#define FS_H
|
#define FS_H
|
||||||
|
|
||||||
#include <types.h>
|
|
||||||
|
|
||||||
#define FS_FILE 0x01
|
#define FS_FILE 0x01
|
||||||
#define FS_DIRECTORY 0x02
|
#define FS_DIRECTORY 0x02
|
||||||
#define FS_CHARDEVICE 0x04
|
#define FS_CHARDEVICE 0x04
|
||||||
|
@ -1,7 +1,17 @@
|
|||||||
#ifndef __SYSTEM_H
|
#ifndef __SYSTEM_H
|
||||||
#define __SYSTEM_H
|
#define __SYSTEM_H
|
||||||
|
|
||||||
#include <types.h>
|
/* Types */
|
||||||
|
|
||||||
|
#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"
|
||||||
|
@ -1,14 +0,0 @@
|
|||||||
#ifndef TYPES_H
|
|
||||||
#define TYPES_H
|
|
||||||
/* Types */
|
|
||||||
|
|
||||||
#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;
|
|
||||||
|
|
||||||
#endif
|
|
@ -30,7 +30,6 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#include <system.h>
|
#include <system.h>
|
||||||
#include <fs.h>
|
|
||||||
#include <boot.h>
|
#include <boot.h>
|
||||||
#include <ext2.h>
|
#include <ext2.h>
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user