Browse Source

Initiated

master
Ilja Kartašov 5 years ago
commit
c95e490a21
  1. 3
      .gitignore
  2. 1
      AUTHORS
  3. 2
      LICENSE
  4. 3
      README.md
  5. 34
      kernel/arm64/Makefile
  6. 12
      kernel/arm64/core.ld
  7. 38
      kernel/arm64/core.s
  8. 93
      kernel/arm64/uart.s

3
.gitignore

@ -0,0 +1,3 @@
.elf
.o
build/

1
AUTHORS

@ -0,0 +1 @@
Elias Löwe <elias@lowenware.com>

2
LICENSE

@ -0,0 +1,2 @@
# Lion's Share License -> LSL
# Löwenware Software Distribution -> LSD

3
README.md

@ -0,0 +1,3 @@
# Löwe OS
Operating System for ARMv8 (aarch64) architecture.

34
kernel/arm64/Makefile

@ -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/*

12
kernel/arm64/core.ld

@ -0,0 +1,12 @@
ENTRY(_core_init)
SECTIONS
{
. = 0x40000000;
.text : { *(.text) }
.data : { *(.text) }
.bss : { *(.bss COMMON) }
. = ALIGN(10);
. = . + 0x1000;
stack_ptr = . ;
}

38
kernel/arm64/core.s

@ -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
# -----------------------------------------------------------------------------

93
kernel/arm64/uart.s

@ -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…
Cancel
Save