summaryrefslogtreecommitdiff
path: root/kernel/include
diff options
context:
space:
mode:
authorFreya Murphy <freya@freyacat.org>2025-04-28 11:09:43 -0400
committerFreya Murphy <freya@freyacat.org>2025-04-28 11:09:43 -0400
commit103e9e001036dce5cd34209b62a416fd1f34abbf (patch)
tree4363f631c929f23b618c94f4d1a05ce51c4e6de8 /kernel/include
parentadd stderr (diff)
downloadcomus-103e9e001036dce5cd34209b62a416fd1f34abbf.tar.gz
comus-103e9e001036dce5cd34209b62a416fd1f34abbf.tar.bz2
comus-103e9e001036dce5cd34209b62a416fd1f34abbf.zip
move context save area to pcb not in stack
Diffstat (limited to 'kernel/include')
-rw-r--r--kernel/include/comus/cpu.h7
-rw-r--r--kernel/include/comus/memory.h5
-rw-r--r--kernel/include/comus/procs.h11
3 files changed, 20 insertions, 3 deletions
diff --git a/kernel/include/comus/cpu.h b/kernel/include/comus/cpu.h
index 3669000..df8f44e 100644
--- a/kernel/include/comus/cpu.h
+++ b/kernel/include/comus/cpu.h
@@ -31,6 +31,13 @@ struct cpu_feat {
};
struct cpu_regs {
+ // pgdir
+ uint64_t cr3;
+ // segments
+ uint16_t gs;
+ uint16_t fs;
+ uint16_t es;
+ uint16_t ds;
// registers
uint64_t r15;
uint64_t r14;
diff --git a/kernel/include/comus/memory.h b/kernel/include/comus/memory.h
index 408521b..47ea103 100644
--- a/kernel/include/comus/memory.h
+++ b/kernel/include/comus/memory.h
@@ -104,6 +104,11 @@ void mem_ctx_free(mem_ctx_t ctx);
void mem_ctx_switch(mem_ctx_t ctx);
/**
+ * @returns the pgdir pointer in the memory ctx
+ */
+volatile void *mem_ctx_pgdir(mem_ctx_t ctx);
+
+/**
* Allocates at least len bytes of memory starting at
* physical address addr. Returned address can be
* any virtural address.
diff --git a/kernel/include/comus/procs.h b/kernel/include/comus/procs.h
index 0150975..eb6c54f 100644
--- a/kernel/include/comus/procs.h
+++ b/kernel/include/comus/procs.h
@@ -15,8 +15,8 @@
#include <lib.h>
#include <elf.h>
-#define PCB_REG(pcb, x) ((pcb)->regs->x)
-#define PCB_RET(pcb) ((pcb)->regs->rax)
+#define PCB_REG(pcb, x) ((pcb)->regs.x)
+#define PCB_RET(pcb) ((pcb)->regs.rax)
#define PCB_ARG1(pcb) PCB_REG((pcb), rdi)
#define PCB_ARG2(pcb) PCB_REG((pcb), rsi)
#define PCB_ARG3(pcb) PCB_REG((pcb), rdx)
@@ -47,8 +47,8 @@ enum proc_state {
/// process control block
struct pcb {
// context
- struct cpu_regs *regs;
mem_ctx_t memctx;
+ struct cpu_regs regs;
// metadata
pid_t pid;
@@ -224,4 +224,9 @@ void schedule(struct pcb *pcb);
*/
__attribute__((noreturn)) void dispatch(void);
+/**
+ * Scheduler function called on every system tick
+ */
+void pcb_on_tick(void);
+
#endif /* procs.h */