summaryrefslogtreecommitdiff
path: root/include
diff options
context:
space:
mode:
Diffstat (limited to 'include')
-rw-r--r--include/drivers/uart.h11
-rw-r--r--include/kernel/cpu.h19
-rw-r--r--include/kernel/mm.h28
-rw-r--r--include/kernel/pmm.h3
-rw-r--r--include/kernel/proc.h65
-rw-r--r--include/kernel/proc_def.h59
-rw-r--r--include/kernel/riscv.h1
-rw-r--r--include/kernel/runqueue.h16
-rw-r--r--include/kernel/slab.h10
-rw-r--r--include/kernel/spinlock.h2
-rw-r--r--include/kernel/sync.h38
-rw-r--r--include/kernel/trap.h7
12 files changed, 169 insertions, 90 deletions
diff --git a/include/drivers/uart.h b/include/drivers/uart.h
index 4d00d94..cb84bde 100644
--- a/include/drivers/uart.h
+++ b/include/drivers/uart.h
@@ -1,9 +1,12 @@
#pragma once
-typedef unsigned long long uint64_t;
+#include "common/types.h"
-namespace Drivers {
+namespace Drivers
+{
void uart_init();
void uart_putc(char c);
- void uart_puts(const char* s);
- void print_hex(uint64_t val);
+
+ void uart_puts(const char *s);
+ void uart_put_int(int value);
+ void print_hex(uint64 value);
} \ No newline at end of file
diff --git a/include/kernel/cpu.h b/include/kernel/cpu.h
new file mode 100644
index 0000000..92890b6
--- /dev/null
+++ b/include/kernel/cpu.h
@@ -0,0 +1,19 @@
+#pragma once
+#include "common/types.h"
+#include "kernel/proc_def.h"
+
+struct RunQueue;
+
+struct cpu
+{
+ struct Proc *proc;
+ struct Context context;
+ int noff;
+ int intena;
+
+ struct RunQueue *runqueue;
+};
+
+
+extern struct cpu cpus[];
+struct cpu *mycpu(); \ No newline at end of file
diff --git a/include/kernel/mm.h b/include/kernel/mm.h
index 07d675b..363ce74 100644
--- a/include/kernel/mm.h
+++ b/include/kernel/mm.h
@@ -3,20 +3,22 @@
namespace VM
{
- typedef uint64_t *pagetable_t;
- typedef uint64_t pte_t;
+ extern uint64 *kernel_pagetable;
- pte_t *walk(pagetable_t pagetable, uint64 va, int alloc);
- int mappages(pagetable_t pagetable, uint64 va, uint64 size, uint64 pa, int perm);
- void kvmmap(uint64 va, uint64 pa, uint64 sz, int perm);
void kvminit();
void kvminithart();
- pagetable_t uvmcreate();
- void uvminit(pagetable_t pagetable, uchar *src, uint sz);
- void uvmunmap(pagetable_t pagetable, uint64 va, uint64 npages, int do_free);
- void uvmfree(pagetable_t pagetable, uint64 sz);
- int uvmcopy(pagetable_t oldpt, pagetable_t newpt, uint64 sz);
- uint64 uvmalloc(pagetable_t pagetable, uint64 oldsz, uint64 newsz);
- uint64 uvmdealloc(pagetable_t pagetable, uint64 oldsz, uint64 newsz);
- int copyin(pagetable_t pagetable, char *dst, uint64 srcva, uint64 len);
+
+ uint64 *uvmcreate();
+ void uvminit(uint64 *pagetable, uchar *src, uint64 sz);
+ uint64 uvmalloc(uint64 *pagetable, uint64 oldsz, uint64 newsz, int xperm);
+ uint64 uvmdealloc(uint64 *pagetable, uint64 oldsz, uint64 newsz);
+ void uvmfree(uint64 *pagetable, uint64 sz);
+ int uvmcopy(uint64 *oldpt, uint64 *newpt, uint64 sz);
+ void uvmunmap(uint64 *pagetable, uint64 va, uint64 npages, int do_free);
+
+ int copyout(uint64 *pagetable, uint64 dstva, char *src, uint64 len);
+ int copyin(uint64 *pagetable, char *dst, uint64 srcva, uint64 len);
+
+ int handle_cow_fault(uint64 *pagetable, uint64 va);
+ int mappages(uint64 *pagetable, uint64 va, uint64 size, uint64 pa, int perm);
} \ No newline at end of file
diff --git a/include/kernel/pmm.h b/include/kernel/pmm.h
index 7156c76..d31473f 100644
--- a/include/kernel/pmm.h
+++ b/include/kernel/pmm.h
@@ -8,9 +8,6 @@
#define PHYSIZE (128 * 1024 * 1024)
#define PHYSTOP (KERNBASE + PHYSIZE)
-#define PGSIZE 4096
-#define PGSHIFT 12
-
// Buddy System Max Order
// Order 10 => 2^10 pages = 1024 * 4KB = 4MB contiguous block
// Order 11 => 2^11 pages = 8MB
diff --git a/include/kernel/proc.h b/include/kernel/proc.h
index e77fdc9..d63ccf7 100644
--- a/include/kernel/proc.h
+++ b/include/kernel/proc.h
@@ -1,71 +1,8 @@
#pragma once
#include "common/types.h"
-#include "kernel/trap.h"
+#include "kernel/proc_def.h"
#include "kernel/spinlock.h"
-// Context structure, used for context switching
-struct Context
-{
- uint64 ra;
- uint64 sp;
-
- // Callee-saved registers
- uint64 s0;
- uint64 s1;
- uint64 s2;
- uint64 s3;
- uint64 s4;
- uint64 s5;
- uint64 s6;
- uint64 s7;
- uint64 s8;
- uint64 s9;
- uint64 s10;
- uint64 s11;
-};
-
-// Process State Enumeration
-enum ProcState
-{
- UNUSED,
- USED,
- SLEEPING,
- RUNNABLE,
- RUNNING,
- ZOMBIE,
-};
-
-// Process Control Block (PCB)
-struct Proc
-{
- struct Context context;
- struct Trapframe *tf;
-
- uint64 *pagetable;
-
- enum ProcState state;
- int pid;
-
- void *kstack;
- char name[16];
- uint64 sz;
-
- struct Proc *parent;
- void *chan;
- int xstate;
-
- // Implement later
-};
-
-// CPU status structure
-struct cpu
-{
- struct Proc *proc; // Processes currently running on this CPU
- struct Context context; // Save the scheduler context here
- int noff; // Depth of push_off()
- int intena; // Interrupt enable status before closing
-};
-
namespace ProcManager
{
void init();
diff --git a/include/kernel/proc_def.h b/include/kernel/proc_def.h
new file mode 100644
index 0000000..e5a2cbc
--- /dev/null
+++ b/include/kernel/proc_def.h
@@ -0,0 +1,59 @@
+#pragma once
+#include "common/types.h"
+
+struct cpu;
+struct Trapframe;
+
+enum ProcState
+{
+ UNUSED,
+ USED,
+ SLEEPING,
+ RUNNABLE,
+ RUNNING,
+ ZOMBIE,
+};
+
+#define PRIO_MAX 0
+#define PRIO_MIN 3
+#define N_PRIO 4
+
+// Context structure
+struct Context
+{
+ uint64 ra;
+ uint64 sp;
+ uint64 s0;
+ uint64 s1;
+ uint64 s2;
+ uint64 s3;
+ uint64 s4;
+ uint64 s5;
+ uint64 s6;
+ uint64 s7;
+ uint64 s8;
+ uint64 s9;
+ uint64 s10;
+ uint64 s11;
+};
+
+struct Proc
+{
+ struct Context context;
+ struct Trapframe *tf;
+ uint64 *pagetable;
+ enum ProcState state;
+ int pid;
+ void *kstack;
+ char name[16];
+ uint64 sz;
+ struct Proc *parent;
+ void *chan;
+ int xstate;
+
+ struct Proc *next;
+ struct Proc *prev;
+ int priority;
+ int ticks;
+ struct cpu *cpu;
+}; \ No newline at end of file
diff --git a/include/kernel/riscv.h b/include/kernel/riscv.h
index 4b3d323..e81976f 100644
--- a/include/kernel/riscv.h
+++ b/include/kernel/riscv.h
@@ -79,6 +79,7 @@ w_sip(uint64 x)
// Supervisor Interrupt Enable
#define SIE_SEIE (1L << 9) // external
#define SIE_STIE (1L << 5) // timer
+#define SIE_SSIE (1L << 1) // software
static inline uint64
r_sie()
{
diff --git a/include/kernel/runqueue.h b/include/kernel/runqueue.h
new file mode 100644
index 0000000..ea6e4cc
--- /dev/null
+++ b/include/kernel/runqueue.h
@@ -0,0 +1,16 @@
+#pragma once
+#include "kernel/spinlock.h"
+#include "kernel/proc_def.h"
+
+struct RunQueue
+{
+ Spinlock lock;
+ struct Proc *heads[N_PRIO];
+ struct Proc *tails[N_PRIO];
+ uint64 count;
+
+ void init(const char *name);
+ void enqueue(struct Proc *p);
+ struct Proc *dequeue();
+ struct Proc *steal();
+}; \ No newline at end of file
diff --git a/include/kernel/slab.h b/include/kernel/slab.h
new file mode 100644
index 0000000..650f8a9
--- /dev/null
+++ b/include/kernel/slab.h
@@ -0,0 +1,10 @@
+#pragma once
+#include "common/types.h"
+
+namespace Slab
+{
+ void init();
+
+ void *kmalloc(uint64 size);
+ void kfree(void *ptr);
+} \ No newline at end of file
diff --git a/include/kernel/spinlock.h b/include/kernel/spinlock.h
index b3cc93e..3102e68 100644
--- a/include/kernel/spinlock.h
+++ b/include/kernel/spinlock.h
@@ -1,9 +1,7 @@
#pragma once
-
#include "common/types.h"
struct cpu;
-struct Proc;
// Spinlock
// Features: Non-interruptible, busy-wait loop, extremely short hold time.
diff --git a/include/kernel/sync.h b/include/kernel/sync.h
new file mode 100644
index 0000000..83d88c8
--- /dev/null
+++ b/include/kernel/sync.h
@@ -0,0 +1,38 @@
+#pragma once
+#include "common/types.h"
+#include "kernel/spinlock.h"
+#include "kernel/proc_def.h"
+
+
+struct WaitQueue
+{
+ Spinlock lock;
+ struct Proc *head;
+ struct Proc *tail;
+
+ void init(const char *name);
+ void sleep();
+ void wakeup();
+ void wakeup_all();
+};
+
+struct Semaphore
+{
+ int value;
+ WaitQueue wq;
+ Spinlock lock;
+
+ void init(int val, const char *name);
+ void wait();
+ void post();
+};
+
+struct CondVar
+{
+ WaitQueue wq;
+
+ void init(const char *name);
+ void wait(Spinlock *mutex_lock);
+ void signal();
+ void broadcast();
+}; \ No newline at end of file
diff --git a/include/kernel/trap.h b/include/kernel/trap.h
index 79bb037..35b225c 100644
--- a/include/kernel/trap.h
+++ b/include/kernel/trap.h
@@ -45,7 +45,6 @@ struct Trapframe
namespace Trap
{
void init();
- extern "C" void kernelvec();
- extern "C" void kerneltrap(struct Trapframe *tf);
-}
-extern "C" void usertrap(); \ No newline at end of file
+ void inithart();
+ int devintr();
+} \ No newline at end of file