From 50361931df9e87f97693396e539a34fc23e5fb6e Mon Sep 17 00:00:00 2001 From: giomba Date: Fri, 28 Dec 2018 11:30:39 +0100 Subject: [PATCH] Nice printk and file organization --- include/dbg.h | 15 +++++++++++++++ src/dbg.cpp | 19 +++++++++++++++++++ src/dbg.s | 18 ++++++++++++++++++ src/kernel.cpp | 32 +++++--------------------------- src/kernel.s | 25 ------------------------- 5 files changed, 57 insertions(+), 52 deletions(-) create mode 100644 include/dbg.h create mode 100644 src/dbg.cpp create mode 100644 src/dbg.s diff --git a/include/dbg.h b/include/dbg.h new file mode 100644 index 0000000..a71d8fe --- /dev/null +++ b/include/dbg.h @@ -0,0 +1,15 @@ +#ifndef DBG_H +#define DBG_H + +extern "C" int printk(const char* msg); +extern "C" int printkl(const char* msg); + +namespace dbg { + + char* const UART_RBR = (char* const)0x01c28000; + char* const UART_THR = (char* const)0x01c28000; + char* const UART_IER = (char* const)0x01c28004; + char* const UART_LSR = (char* const)0x01c28014; +} + +#endif diff --git a/src/dbg.cpp b/src/dbg.cpp new file mode 100644 index 0000000..9344e2b --- /dev/null +++ b/src/dbg.cpp @@ -0,0 +1,19 @@ +#include + +/* Never call this function directly: always use the printk, + * which disables and reenables interrupts */ +extern "C" int c_printk(const char* msg) { + while (*msg != '\0') { + while ((*dbg::UART_LSR & 0x20) == 0); /* Wait for transmission */ + *dbg::UART_THR = *msg; + msg++; + } + return 0; +} + +extern "C" int printkl(const char* msg) { + printk(msg); + printk("\r\n"); + return 0; +} + diff --git a/src/dbg.s b/src/dbg.s new file mode 100644 index 0000000..52ef9ac --- /dev/null +++ b/src/dbg.s @@ -0,0 +1,18 @@ +.text + +.extern c_printk +.global printk +printk: + push {lr} + + /* disables IRQ and FIR in CPU */ + cpsid if + + /* C-Implementation */ + bl c_printk + + /* enables IRQ and FIR in CPU */ + cpsie if + + pop {pc} + diff --git a/src/kernel.cpp b/src/kernel.cpp index 1cd45e6..2e8ff0e 100644 --- a/src/kernel.cpp +++ b/src/kernel.cpp @@ -1,33 +1,11 @@ -#define UART_RBR 0x01c28000 -char* const UART_THR = (char* const)0x01c28000; -#define UART_IER 0x01c28004 -char* const UART_LSR = (char* const)0x01c28014; - -extern "C" int printk(const char*); +#include +/* KERNEL MAIN */ extern "C" int main(int argc, char** argv) { - char letter[2] = "A"; + printkl("Welcome to STKARM -- Simple and Trivial Kernel for Advanced Reduced Instruction Set Computer Machines"); - for (char c = 'A'; c < 'Z'; c++) { - letter[0] = c; - - printk("HELLO WORLD!"); - printk("\t"); - printk(letter); - printk("\r\n"); - } - - return 0; -} - -/* Never call this function directly: always use the printk, - * which disables and reenables interrupts */ -extern "C" int c_printk(const char* msg) { - while (*msg != '\0') { - while ((*UART_LSR & 0x20) == 0); /* Wait for transmission */ - *UART_THR = *msg; - msg++; - } + printkl("EOK -- End of Kernel"); return 0; } + diff --git a/src/kernel.s b/src/kernel.s index e36f095..55d3b33 100644 --- a/src/kernel.s +++ b/src/kernel.s @@ -1,35 +1,10 @@ - .text -my_string: - .string "HELLO WORLD!\r\n\r\n" - .quad 0x00 - .quad 0x5a - .align 4 .global _start _start: bl main - - - endless_busy_loop: cpsid if b endless_busy_loop -.extern c_printk -.global printk -printk: - push {lr} - - /* disables IRQ and FIR in CPU */ - cpsid if - - - bl c_printk - - /* enables IRQ and FIR in CPU */ - cpsie if - - pop {pc} -