summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--kernel/proc.c20
-rw-r--r--kernel/proc.h32
-rw-r--r--kernel/trampoline.S2
-rw-r--r--kernel/trap.c2
4 files changed, 28 insertions, 28 deletions
diff --git a/kernel/proc.c b/kernel/proc.c
index a947f7f..5c2d4ce 100644
--- a/kernel/proc.c
+++ b/kernel/proc.c
@@ -6,20 +6,16 @@
#include "proc.h"
#include "defs.h"
-struct proc proc[NPROC];
-
struct cpu cpus[NCPU];
+struct proc proc[NPROC];
+
struct proc *initproc;
-struct spinlock pid_lock;
int nextpid = 1;
+struct spinlock pid_lock;
extern void forkret(void);
-
-// for returning out of the kernel
-extern void sysexit(void);
-
static void wakeup1(struct proc *chan);
extern char trampout[]; // trampoline.S
@@ -287,8 +283,8 @@ fork(void)
return pid;
}
-// Pass p's abandoned children to init. p and p's parent
-// are locked.
+// Pass p's abandoned children to init.
+// Caller must hold p->lock and parent->lock.
void
reparent(struct proc *p, struct proc *parent) {
struct proc *pp;
@@ -536,7 +532,7 @@ sleep(void *chan, struct spinlock *lk)
//PAGEBREAK!
// Wake up p, used by exit()
-// Caller should lock p.
+// Caller must hold p->lock.
static void
wakeup1(struct proc *p)
{
@@ -545,8 +541,8 @@ wakeup1(struct proc *p)
}
}
-// Wake up all processes sleeping on chan. Never
-// called when holding a p->lock
+// Wake up all processes sleeping on chan.
+// Must be called without any p->lock.
void
wakeup(void *chan)
{
diff --git a/kernel/proc.h b/kernel/proc.h
index 687fdd1..373b605 100644
--- a/kernel/proc.h
+++ b/kernel/proc.h
@@ -18,33 +18,37 @@ struct context {
uint64 s11;
};
-// Per-CPU state
+// Per-CPU state.
struct cpu {
- struct proc *proc; // The process running on this cpu or null
- struct context scheduler; // swtch() here to enter scheduler
- int noff; // Depth of push_off() nesting.
- int intena; // Were interrupts enabled before push_off()?
+ struct proc *proc; // The process running on this cpu, or null.
+ struct context scheduler; // swtch() here to enter scheduler().
+ int noff; // Depth of push_off() nesting.
+ int intena; // Were interrupts enabled before push_off()?
};
extern struct cpu cpus[NCPU];
//PAGEBREAK: 17
-// per-process data for the early trap handling code in trampoline.S.
+// per-process data for the trap handling code in trampoline.S.
// sits in a page by itself just under the trampoline page in the
// user page table. not specially mapped in the kernel page table.
// the sscratch register points here.
-// trampoline.S saves user registers, then restores kernel_sp and
-// kernel_satp.
-// includes callee-saved registers like s0-s11 because the
+// trampin in trampoline.S saves user registers in the trapframe,
+// then initializes registers from the trapframe's
+// kernel_sp, kernel_hartid, kernel_satp, and jumps to kernel_trap.
+// usertrapret() and trampout in trampoline.S set up
+// the trapframe's kernel_*, restore user registers from the
+// trapframe, switch to the user page table, and enter user space.
+// the trapframe includes callee-saved user registers like s0-s11 because the
// return-to-user path via usertrapret() doesn't return through
// the entire kernel call stack.
struct trapframe {
- /* 0 */ uint64 kernel_satp;
- /* 8 */ uint64 kernel_sp;
- /* 16 */ uint64 kernel_trap; // usertrap()
- /* 24 */ uint64 epc; // saved user program counter
- /* 32 */ uint64 hartid;
+ /* 0 */ uint64 kernel_satp; // kernel page table
+ /* 8 */ uint64 kernel_sp; // top of process's kernel stack
+ /* 16 */ uint64 kernel_trap; // usertrap()
+ /* 24 */ uint64 epc; // saved user program counter
+ /* 32 */ uint64 kernel_hartid; // saved kernel tp
/* 40 */ uint64 ra;
/* 48 */ uint64 sp;
/* 56 */ uint64 gp;
diff --git a/kernel/trampoline.S b/kernel/trampoline.S
index dd4eb02..b992ea6 100644
--- a/kernel/trampoline.S
+++ b/kernel/trampoline.S
@@ -120,7 +120,7 @@ trampin:
# restore kernel stack pointer from p->tf->kernel_sp
ld sp, 8(a0)
- # make tp hold the current hartid, from p->tf->hartid
+ # make tp hold the current hartid, from p->tf->kernel_hartid
ld tp, 32(a0)
# remember the address of usertrap(), p->tf->kernel_trap
diff --git a/kernel/trap.c b/kernel/trap.c
index 018b7db..27cfd32 100644
--- a/kernel/trap.c
+++ b/kernel/trap.c
@@ -100,7 +100,7 @@ usertrapret(void)
p->tf->kernel_satp = r_satp();
p->tf->kernel_sp = (uint64)p->kstack + PGSIZE;
p->tf->kernel_trap = (uint64)usertrap;
- p->tf->hartid = r_tp();
+ p->tf->kernel_hartid = r_tp();
// set up the registers that trampoline.S's sret will use
// to get to user space.