From 49f0237874f3225659a8f620a8f308fb3c82cbe1 Mon Sep 17 00:00:00 2001 From: giomba Date: Fri, 28 Dec 2018 09:20:09 +0100 Subject: [PATCH] First commit --- .gitignore | 4 ++++ Makefile | 33 +++++++++++++++++++++++++ dbg/qemu.sh | 4 ++++ src/kernel.cpp | 3 +++ src/kernel.s | 65 ++++++++++++++++++++++++++++++++++++++++++++++++++ src/linker.ld | 15 ++++++++++++ 6 files changed, 124 insertions(+) create mode 100644 .gitignore create mode 100644 Makefile create mode 100755 dbg/qemu.sh create mode 100644 src/kernel.cpp create mode 100644 src/kernel.s create mode 100644 src/linker.ld diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..158ee31 --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +bin/ +obj/ +.swp + diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..28240f4 --- /dev/null +++ b/Makefile @@ -0,0 +1,33 @@ +.POSIX: +CCX=arm-none-eabi-g++ +CCFLAGS=-c -Wall -fno-stack-protector -ffreestanding -march=armv7-a -nostdlib -Iinclude -g + +C_HDR=$(wildcard include/*.h) +C_SRC=$(wildcard src/*.cpp) +C_OBJ=$(patsubst src/%.cpp, obj/c_%.o, $(C_SRC)) + +A_SRC=$(wildcard src/*.s) +A_OBJ=$(patsubst src/%.s, obj/s_%.o, $(A_SRC)) + +.PHONY: all environ clean + +all: environ bin/kernel.elf + +environ: + mkdir -p bin + mkdir -p obj + +bin/kernel.elf: environ $(A_OBJ) $(C_OBJ) + arm-none-eabi-ld --nmagic -nostdlib -T src/linker.ld -o bin/kernel.elf obj/*.o + # maybe -msomearch + +obj/s_%.o: src/%.s + $(CCX) $(CCFLAGS) -o $@ $< + +obj/c_%.o: src/%.cpp $(C_HDR) + $(CCX) $(CCFLAGS) -o $@ $< + +clean: + rm -f bin/* + rm -f obj/* + diff --git a/dbg/qemu.sh b/dbg/qemu.sh new file mode 100755 index 0000000..648335c --- /dev/null +++ b/dbg/qemu.sh @@ -0,0 +1,4 @@ +#!/bin/bash + +qemu-system-arm -M virt -cpu cortex-a15 -nographic -kernel bin/kernel.elf -s -S + diff --git a/src/kernel.cpp b/src/kernel.cpp new file mode 100644 index 0000000..878912d --- /dev/null +++ b/src/kernel.cpp @@ -0,0 +1,3 @@ +extern "C" int f(int a) { + return a + 1; +} diff --git a/src/kernel.s b/src/kernel.s new file mode 100644 index 0000000..f60c1a1 --- /dev/null +++ b/src/kernel.s @@ -0,0 +1,65 @@ +.extern f + +.text +my_string: + .string "HELLO WORLD!\r\n\r\n" + .quad 0x00 + .quad 0x5a + +.align 4 +.global _start +_start: + /* does nothing special */ + mov r13, #0x8000 + + mov r1, #16 + +1: + ldr r0, =my_string + bl printk + sub r1, #1 + cmp r1, #0 + b 1b + +lup: + b lup + + +.global printk +printk: + stmfd r13!, {r0, r1, r2, r3, r4, r14} + + /* disable UART interrupts */ + mov r2, #0x8004 + movt r2, #0x01c2 + + ldr r1, [r2] + and r1, #0xfffffffc + str r1, [r2] + + /* mask interrupts in CPU */ + cpsid if + + /* TBR */ + mov r2, #0x8000 + movt r2, #0x01c2 + +1: + ldr r1, [r0] + add r0, #4 + + mov r4, #4 +2: + and r3, r1, #0xff + mov r1, r1, lsr#8 + cmp r3, #0 + beq 3f + str r3, [r2] + sub r4, #1 + cmp r4, #0 + bne 2b + b 1b +3: + + ldmfd r13!, {r0, r1, r2, r3, r4, r15} + diff --git a/src/linker.ld b/src/linker.ld new file mode 100644 index 0000000..e7c803b --- /dev/null +++ b/src/linker.ld @@ -0,0 +1,15 @@ +ENTRY(_start) + +SECTIONS +{ + . = 0x10000; + .text : { + *(.text) + } + .data : ALIGN(0x1000) { + *(.data) + } + .bss : ALIGN(0x1000) { + *(.bss) + } +}