aboutsummaryrefslogtreecommitdiff
path: root/include
diff options
context:
space:
mode:
Diffstat (limited to 'include')
-rw-r--r--include/fbos/compiler.h5
-rw-r--r--include/fbos/init.h25
-rw-r--r--include/fbos/printk.h10
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>