aboutsummaryrefslogtreecommitdiff
path: root/kernel
diff options
context:
space:
mode:
authorMiquel Sabaté Solà <mikisabate@gmail.com>2024-12-02 20:47:19 +0100
committerMiquel Sabaté Solà <mikisabate@gmail.com>2024-12-02 20:47:19 +0100
commit32e880127366fabc3e8b4fecb642f1cc06b8fd71 (patch)
treedf11bd7d7895ac0dde245383b4a10a51f83fc659 /kernel
parenta7287a7891d9ead98221c3de79d46d487e0d68ac (diff)
downloadfbos-32e880127366fabc3e8b4fecb642f1cc06b8fd71.tar.gz
fbos-32e880127366fabc3e8b4fecb642f1cc06b8fd71.zip
Prepend the name of the task on debug
On 'printk' and 'sys_write' calls, prepend the name of the task that is being executed for each message. This is an easy way to show off that we are doing the right thing with the 'tp' register, even if we don't do much with it. Signed-off-by: Miquel Sabaté Solà <mikisabate@gmail.com>
Diffstat (limited to 'kernel')
-rw-r--r--kernel/head.S6
-rw-r--r--kernel/main.c8
-rw-r--r--kernel/printk.c44
-rw-r--r--kernel/trap.c10
4 files changed, 51 insertions, 17 deletions
diff --git a/kernel/head.S b/kernel/head.S
index 31f423e..9a12833 100644
--- a/kernel/head.S
+++ b/kernel/head.S
@@ -94,9 +94,9 @@ _start_kernel:
li t6, 0
csrw sscratch, 0
- // Point tp and sp to the init task. This is not crucial because in the end
- // we are not doing anything with the 'tp' register, and our processes
- // actually don't do anything on the stack.
+ // Point tp and sp to the init task. The 'tp' register will always point to
+ // the current process being executed, and it will be shown on debug when
+ // printing out messages.
la tp, tasks
la sp, tasks + THREAD_SIZE
diff --git a/kernel/main.c b/kernel/main.c
index ecb93da..9c524c4 100644
--- a/kernel/main.c
+++ b/kernel/main.c
@@ -10,10 +10,10 @@ unsigned long stack[4][THREAD_SIZE / sizeof(unsigned long)];
// Initialize the list of structs by providing a fixed stack address and empty
// values everywhere else.
struct task_struct tasks[4] = {
- [TASK_INIT] = { .stack = stack[0], .entry_addr = nullptr, },
- [TASK_FIZZ] = { .stack = stack[1], .entry_addr = nullptr, },
- [TASK_BUZZ] = { .stack = stack[2], .entry_addr = nullptr, },
- [TASK_FIZZBUZZ] = { .stack = stack[3], .entry_addr = nullptr, },
+ [TASK_INIT] = { .stack = stack[0], .name = "init", .entry_addr = nullptr, },
+ [TASK_FIZZ] = { .stack = stack[1], .name = "fizz", .entry_addr = nullptr, },
+ [TASK_BUZZ] = { .stack = stack[2], .name = "buzz", .entry_addr = nullptr, },
+ [TASK_FIZZBUZZ] = { .stack = stack[3], .name = "fizzbuzz", .entry_addr = nullptr, },
};
// Defined in fbos/init.h.
diff --git a/kernel/printk.c b/kernel/printk.c
index b3c925a..bd2bcab 100644
--- a/kernel/printk.c
+++ b/kernel/printk.c
@@ -1,4 +1,5 @@
#include <fbos/printk.h>
+#include <fbos/sched.h>
#include <fbos/string.h>
#include <fbos/sbi.h>
@@ -12,8 +13,40 @@ void __noreturn __kernel die(const char *const message)
;
}
+__kernel void write(const char *const message, size_t n)
+{
+ struct sbi_ret ret = sbi_ecall2(DBCN_EXT, DBCN_WRITE, n, (unsigned long)message);
+ if (ret.error != SBI_SUCCESS) {
+ die(nullptr);
+ }
+}
+
+#ifdef __DEBUG__
+__kernel void print_task_prefix(void)
+{
+ register struct task_struct *current asm("tp");
+
+ if (!current) {
+ return;
+ }
+
+ size_t len = strlen(current->name);
+ if (!len) {
+ return;
+ }
+
+ write("[=> ", 4);
+ write(current->name, len);
+ write("] ", 2);
+}
+#endif
+
__kernel void printk(const char *const message)
{
+#ifdef __DEBUG__
+ print_task_prefix();
+#endif
+
size_t len = strlen(message);
if (!len) {
return;
@@ -22,10 +55,11 @@ __kernel void printk(const char *const message)
write(message, len);
}
-__kernel void write(const char *const message, size_t n)
+__kernel void sys_write(const char *const message, size_t n)
{
- struct sbi_ret ret = sbi_ecall2(DBCN_EXT, DBCN_WRITE, n, (unsigned long)message);
- if (ret.error != SBI_SUCCESS) {
- die(nullptr);
- }
+#ifdef __DEBUG__
+ print_task_prefix();
+#endif
+
+ write(message, n);
}
diff --git a/kernel/trap.c b/kernel/trap.c
index 54bf6aa..29f1c21 100644
--- a/kernel/trap.c
+++ b/kernel/trap.c
@@ -52,7 +52,7 @@ __kernel __always_inline void exception_handler(uint64_t cause)
die("Bad syscall\n");
}
- write(message, n);
+ sys_write(message, n);
}
/*
@@ -75,7 +75,7 @@ __aligned(4) __s_interrupt __kernel void interrupt_handler(void)
if (IS_EXCEPTION(cause)) {
exception_handler(cause);
- set_return_address_to(TASK_INIT);
+ prepare_switch_to(TASK_INIT);
goto end;
}
@@ -91,11 +91,11 @@ __aligned(4) __s_interrupt __kernel void interrupt_handler(void)
// BEHOLD! The fizz buzz logic! :D
seconds_elapsed += 1;
if ((seconds_elapsed % 15) == 0) {
- set_return_address_to(TASK_FIZZBUZZ);
+ prepare_switch_to(TASK_FIZZBUZZ);
} else if ((seconds_elapsed % 5) == 0) {
- set_return_address_to(TASK_BUZZ);
+ prepare_switch_to(TASK_BUZZ);
} else if ((seconds_elapsed % 3) == 0) {
- set_return_address_to(TASK_FIZZ);
+ prepare_switch_to(TASK_FIZZ);
}
// Re-enable timer interrupts.