Initiated
This commit is contained in:
commit
c95e490a21
|
@ -0,0 +1,3 @@
|
|||
.elf
|
||||
.o
|
||||
build/
|
|
@ -0,0 +1,2 @@
|
|||
# Lion's Share License -> LSL
|
||||
# Löwenware Software Distribution -> LSD
|
|
@ -0,0 +1,3 @@
|
|||
# Löwe OS
|
||||
Operating System for ARMv8 (aarch64) architecture.
|
||||
|
|
@ -0,0 +1,34 @@
|
|||
ASM=clang
|
||||
TARGET=aarch64-none-elf
|
||||
CPU=cortex-a57
|
||||
LD=ld.lld
|
||||
OBJCOPY=objcopy --target elf64-littleaarch64
|
||||
|
||||
all: build/core.bin build/core.elf
|
||||
|
||||
# compilation -----------------------------------------------------------------
|
||||
|
||||
build/core.o: core/core.s
|
||||
$(ASM) -c -triple --target=$(TARGET) -mcpu=$(CPU) -O0 -g $< -o $@
|
||||
|
||||
build/uart.o: core/uart.s
|
||||
$(ASM) -c --target=$(TARGET) -mcpu=$(CPU) -O0 -g $< -o $@
|
||||
|
||||
# ELF -------------------------------------------------------------------------
|
||||
|
||||
build/core.elf: build/core.o build/uart.o
|
||||
$(LD) -Tcore/core.ld $^ -o $@
|
||||
|
||||
# BIN -------------------------------------------------------------------------
|
||||
|
||||
build/core.bin: build/core.elf
|
||||
$(OBJCOPY) -O binary $< $@
|
||||
|
||||
build/core.sym: build/core.elf
|
||||
$(OBJCOPY) --only-keep-debug $< $@
|
||||
$(OBJCOPY) --strip-debug build/core.elf
|
||||
|
||||
# Clean -----------------------------------------------------------------------
|
||||
|
||||
clean:
|
||||
rm -f build/*
|
|
@ -0,0 +1,12 @@
|
|||
ENTRY(_core_init)
|
||||
|
||||
SECTIONS
|
||||
{
|
||||
. = 0x40000000;
|
||||
.text : { *(.text) }
|
||||
.data : { *(.text) }
|
||||
.bss : { *(.bss COMMON) }
|
||||
. = ALIGN(10);
|
||||
. = . + 0x1000;
|
||||
stack_ptr = . ;
|
||||
}
|
|
@ -0,0 +1,38 @@
|
|||
# file: core.s
|
||||
# project: Löwe OS
|
||||
# authors: Elias Löwe <elias@lowenware.com>
|
||||
|
||||
# -----------------------------------------------------------------------------
|
||||
|
||||
.global _core_init
|
||||
.extern _uart_puts
|
||||
|
||||
# -----------------------------------------------------------------------------
|
||||
|
||||
.text
|
||||
|
||||
_core_init:
|
||||
# set up stack pointer using x30 register
|
||||
LDR x30, =0x40001000
|
||||
MOV sp, x30
|
||||
bl 1f
|
||||
|
||||
1:
|
||||
LDR x0, =some_int
|
||||
BL _uart_putx
|
||||
LDR x0, =greeting
|
||||
BL _uart_puts
|
||||
2:
|
||||
B 2b
|
||||
|
||||
# -----------------------------------------------------------------------------
|
||||
|
||||
.data
|
||||
|
||||
greeting:
|
||||
.asciz "\nStarting Lowe OS\n"
|
||||
|
||||
|
||||
.equ some_int, 0x1234567890ABCDEF
|
||||
|
||||
# -----------------------------------------------------------------------------
|
|
@ -0,0 +1,93 @@
|
|||
# file : uart.s
|
||||
# project : Löwe OS
|
||||
# authors : Elias Löwe <elias@lowenware.com>
|
||||
|
||||
# address of UART for virt device in qemu
|
||||
|
||||
# -----------------------------------------------------------------------------
|
||||
|
||||
.global _uart_putc # print single character uart
|
||||
.global _uart_putx # print integer in HEX format to uart
|
||||
.global _uart_puts # print null-terminated string to uart
|
||||
|
||||
# -----------------------------------------------------------------------------
|
||||
|
||||
.text
|
||||
|
||||
# helper to avoid extra data moving
|
||||
# @x1 character print
|
||||
uart_putc:
|
||||
STP x2, lr, [sp, -16]!
|
||||
|
||||
MOV x2, 0x09000000 # set UART address
|
||||
STRB w1, [x2] # put character out
|
||||
|
||||
LDP x2, lr, [sp], 16
|
||||
RET
|
||||
|
||||
# -----------------------------------------------------------------------------
|
||||
|
||||
|
||||
# print character to uart
|
||||
# @x0 character print
|
||||
_uart_putc:
|
||||
STR lr, [sp, -16]!
|
||||
|
||||
MOV x1, x0 # set arguments
|
||||
BL uart_putc # put character out
|
||||
|
||||
LDR lr, [sp], 16
|
||||
RET
|
||||
|
||||
|
||||
# -----------------------------------------------------------------------------
|
||||
|
||||
# @x0 integer to print
|
||||
_uart_putx:
|
||||
STP lr, x3, [sp, -32]!
|
||||
STP x0, x1, [sp, 16]
|
||||
|
||||
LDR x3, =60 # init bits counter 64-4
|
||||
|
||||
1:
|
||||
LSR x1, x0, x3 # shift to digit
|
||||
AND x1, x1, 0xF # keep only digit
|
||||
CMP x1, 9 # compare it to 9
|
||||
BLS 2f # less or equal
|
||||
ADD x1, x1, 0x37 # turn into ASCII HEX char
|
||||
B 3f # continue to output
|
||||
|
||||
2:
|
||||
ADD x1, x1, 0x30 # turn into ASCII num char
|
||||
|
||||
3:
|
||||
BL uart_putc # output carachter
|
||||
CBZ x3, 0f # if counter == 0 return
|
||||
SUB x3, x3, 4 # otherwise subtract counter by 4
|
||||
B 1b # repeat
|
||||
|
||||
0:
|
||||
LDP lr, x3, [sp], 16
|
||||
LDP x0, x1, [sp], 16
|
||||
RET
|
||||
|
||||
# -----------------------------------------------------------------------------
|
||||
|
||||
# @x0 pointer to string
|
||||
|
||||
_uart_puts:
|
||||
STR lr, [sp, -16]!
|
||||
STP x0, x1, [sp, -16]!
|
||||
|
||||
1:
|
||||
LDRB w1, [x0], 1 # load byte of string from address in x0
|
||||
CBZ w1, 0f # return if zero
|
||||
BL uart_putc # put charcter out
|
||||
B 1b # loop
|
||||
|
||||
0:
|
||||
LDP x0, x1, [sp], 16
|
||||
LDR lr, [sp], 16
|
||||
RET
|
||||
|
||||
# -----------------------------------------------------------------------------
|
Loading…
Reference in New Issue