diff options
Diffstat (limited to 'include')
| -rw-r--r-- | include/fbos/compiler.h | 5 | ||||
| -rw-r--r-- | include/fbos/init.h | 25 | ||||
| -rw-r--r-- | include/fbos/printk.h | 10 |
3 files changed, 40 insertions, 0 deletions
diff --git a/include/fbos/compiler.h b/include/fbos/compiler.h index 67f3194..77413e9 100644 --- a/include/fbos/compiler.h +++ b/include/fbos/compiler.h @@ -39,6 +39,11 @@ typedef unsigned long size_t; typedef unsigned long uint64_t; typedef unsigned long uintptr_t; +// Strong type for atomic integer operations. +typedef struct { + int32_t value; +} atomic32_t; + /* * NULL */ diff --git a/include/fbos/init.h b/include/fbos/init.h index 9e0049e..dcffd02 100644 --- a/include/fbos/init.h +++ b/include/fbos/init.h @@ -5,6 +5,31 @@ #include <fbos/dt.h> #include <fbos/sched.h> +// Atomic value that holds how many harts have gone through the "hart lottery". +// This is in the same spirit as it happens on the Linux kernel: the RISC-V +// specification leaves open which hart will appear first into the kernel code. +// This greatly simplifies the specification and the hardware, but for the +// kernel this means that harts will appear randomly. In order to know which +// hart runs first, in Linux they run a "lottery": an atomic value holds how +// many harts hav already been seen. The first hart to appear will actually +// initialize things before bringing the others up, while the others will simply +// wait until the first hart frees the lock for them. +// +// That being said, here we only want *one* hart running. Hence, whichever hart +// wins the lottery, it's not only going to initialize the kernel, but it will +// also be the only one running the show. This is of course a waste of +// resources, but it's not like running fizz/buzz needs SMP and cores running at +// full speed. Actually, keeping things under a single hart simplifies things a +// lot. +// +// Instantiated in kernel/main.c +extern atomic32_t hart_lottery; + +// ID of the hart that is running the show. +// +// Instantiated in kernel/main.c +extern uint32_t hart_id; + // Tracks the amount of seconds that have elapsed since activating timer // interrupts. // diff --git a/include/fbos/printk.h b/include/fbos/printk.h index e68d1eb..d6ca71e 100644 --- a/include/fbos/printk.h +++ b/include/fbos/printk.h @@ -9,9 +9,19 @@ */ #ifdef __KERNEL__ +// Print the given message and loop indefinitely. extern void die(const char *const message); + +// Print the given number as a single digit. +extern void print_digit(uint32_t digit); + +// Print the given message. extern void printk(const char *const message); + +// Print the given message which is exactly 'n' bytes long. extern void write(const char *const message, size_t n); + +// 'write' system call. extern void sys_write(const char *const message, size_t n); #else #include <stdio.h> |
