Update environment

This commit is contained in:
2019-05-29 11:10:01 +02:00
parent c95e490a21
commit 8718f035a5
12 changed files with 338 additions and 139 deletions
+38
View File
@@ -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
# -----------------------------------------------------------------------------
+37
View File
@@ -0,0 +1,37 @@
/******************************************************************************
*
* Copyright (c) 2017-2019 by Löwenware Ltd
* Please, refer LICENSE file for legal information
*
******************************************************************************/
/**
* @file main.c
* @author Ilja Kartašov <ik@lowenware.com>
* @brief
*
* @see https://lowenware.com/
*/
#include "uart.h"
void
k_main(void);
void
k_main(void)
{
uart_init();
uart_putc('L');
uart_putc('o');
uart_putc('w');
uart_putc('e');
uart_putc('\n');
for (;;) {
}
}
+12
View File
@@ -0,0 +1,12 @@
ENTRY(_start)
SECTIONS
{
. = 0x40000000;
.text : { *(.text) }
.data : { *(.data) }
.bss : { *(.bss COMMON) }
. = ALIGN(8);
. = . + 0x1000;
stack_ptr = . ;
}
+33
View File
@@ -0,0 +1,33 @@
/******************************************************************************
*
* Copyright (c) 2017-2019 by Löwenware Ltd
* Please, refer LICENSE file for legal information
*
******************************************************************************/
/**
* @file uart.c
* @author Ilja Kartašov <ik@lowenware.com>
* @brief
*
* @see https://lowenware.com/
*/
#include "uart.h"
unsigned int *uart_base = (unsigned int *)UART_BASE;
void
uart_init(void)
{
}
void
uart_putc(unsigned char c)
{
*uart_base = c;
if(c == '\n')
*uart_base = '\r';
}
+30
View File
@@ -0,0 +1,30 @@
/******************************************************************************
*
* Copyright (c) 2017-2019 by Löwenware Ltd
* Please, refer LICENSE file for legal information
*
******************************************************************************/
/**
* @file uart.h
* @author Ilja Kartašov <ik@lowenware.com>
* @brief
*
* @see https://lowenware.com/
*/
#ifndef UART_H_8AFC47F9_2953_42C1_A5C1_1AE5A1F52CD0
#define UART_H_8AFC47F9_2953_42C1_A5C1_1AE5A1F52CD0
#define UART_BASE 0x09000000
void
uart_init(void);
void
uart_putc(unsigned char c);
#endif /* !UART_H */
+93
View File
@@ -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
// -----------------------------------------------------------------------------