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} -