1
0
Fork 0

Initial commit

This commit is contained in:
Aaron Lindsay 2012-09-03 23:44:36 -04:00
commit 4be5ceeec6
6 changed files with 107 additions and 0 deletions

52
Makefile Normal file
View File

@ -0,0 +1,52 @@
# Aedrix root Makefile
# Copyright (C) 2012 Aaron Lindsay <aaron@aclindsay.com>
# Config options for the code itself (should be separated from the Makefile sometime)
ARCH = arm
# Config options concerning the build process itself
VERBOSE = 0 # 1 shows all compiler flags, 0 shows cleaner output
# Define the tools to be used
TOOL_PREFIX = arm-elf-
AS = $(TOOL_PREFIX)as
CC = $(TOOL_PREFIX)gcc
LD = $(TOOL_PREFIX)ld
# Define the flags we'll need for our tools
KCFLAGS = -Wall -Wextra -Werror -nostdlib -nostartfiles -ffreestanding -std=gnu99
KLDFLAGS = -T link.ld
KOBJS =
include boot/Makefile.inc
include kernel/Makefile.inc
all: aedrix-kernel
#all:
# @echo $(KOBJS)
aedrix-kernel: $(KOBJS)
$(if $(VERBOSE:1=),@echo ' LD $@')
$(if $(VERBOSE:1=),@)$(LD) $(KLDFLAGS) -o $@ $(KOBJS)
%.o: %.c
$(if $(VERBOSE:1=),@echo ' CC $@')
$(if $(VERBOSE:1=),@)$(CC) $(KCFLAGS) -c -o $@ $<
# Assembly files without preprocessor directives
%.o: %.s
$(if $(VERBOSE:1=),@echo ' AS $@')
$(if $(VERBOSE:1=),@)$(AS) -o $@ $<
# Assembly files with preprocessor directives
%.o: %.S
$(if $(VERBOSE:1=),@echo ' AS $@')
$(if $(VERBOSE:1=),@)$(AS) -o $@ $<
.PHONY : clean
clean:
@echo ' CLEAN *.o'
@rm -f $(KOBJS)
@echo ' CLEAN aedrix-kernel'
@rm -f aedrix-kernel

3
boot/Makefile.inc Normal file
View File

@ -0,0 +1,3 @@
BOOT_PREFIX = boot
KOBJS += $(BOOT_PREFIX)/start.o

17
boot/start.s Normal file
View File

@ -0,0 +1,17 @@
interrupt_vector_table:
b . @ Reset
b .
b . @ SWI instruction
b .
b .
b .
b .
b .
.comm stack, 0x10000 @ Reserve 64k stack in the BSS
_start:
.globl _start
ldr sp, =stack+0x10000 @ Set up the stack
bl main @ Jump to the main function
1:
b 1b @ Halt

3
kernel/Makefile.inc Normal file
View File

@ -0,0 +1,3 @@
KERNEL_PREFIX = kernel
KOBJS += $(KERNEL_PREFIX)/hello.o

23
kernel/hello.c Normal file
View File

@ -0,0 +1,23 @@
#define SERIAL_BASE 0x16000000
#define SERIAL_FLAG_REGISTER 0x18
#define SERIAL_BUFFER_FULL (1 << 5)
void putc (char c)
{
/* Wait until the serial buffer is empty */
while (*(volatile unsigned long*)(SERIAL_BASE + SERIAL_FLAG_REGISTER)
& (SERIAL_BUFFER_FULL));
/* Put our character, c, into the serial buffer */
*(volatile unsigned long*)SERIAL_BASE = c;
}
void puts (const char * str)
{
while (*str) putc (*str++);
}
int main (void)
{
puts ("hello, world!\n");
return 0;
}

9
link.ld Normal file
View File

@ -0,0 +1,9 @@
ENTRY (_start)
SECTIONS
{
. = 0;
.text : { *(.text*) *(.rodata*) }
.data : { *(.data*) }
.bss : { *(.bss*) *(COMMON*) }
}