Skip to content

proc.h

TIP

Saved registers for kernel context switches.

struct context {
  uint64 ra;
  uint64 sp;

TIP

callee-saved

  uint64 s0;
  uint64 s1;
  uint64 s2;
  uint64 s3;
  uint64 s4;
  uint64 s5;
  uint64 s6;
  uint64 s7;
  uint64 s8;
  uint64 s9;
  uint64 s10;
  uint64 s11;
};

TIP

Per-CPU state.

struct cpu {
  struct proc *proc;
  struct context context;
  int noff;
  int intena;
};

extern struct cpu cpus[NCPU];

TIP

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. uservec 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 userret 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;
  /*  24 */ uint64 epc;
  /*  32 */ uint64 kernel_hartid;
  /*  40 */ uint64 ra;
  /*  48 */ uint64 sp;
  /*  56 */ uint64 gp;
  /*  64 */ uint64 tp;
  /*  72 */ uint64 t0;
  /*  80 */ uint64 t1;
  /*  88 */ uint64 t2;
  /*  96 */ uint64 s0;
  /* 104 */ uint64 s1;
  /* 112 */ uint64 a0;
  /* 120 */ uint64 a1;
  /* 128 */ uint64 a2;
  /* 136 */ uint64 a3;
  /* 144 */ uint64 a4;
  /* 152 */ uint64 a5;
  /* 160 */ uint64 a6;
  /* 168 */ uint64 a7;
  /* 176 */ uint64 s2;
  /* 184 */ uint64 s3;
  /* 192 */ uint64 s4;
  /* 200 */ uint64 s5;
  /* 208 */ uint64 s6;
  /* 216 */ uint64 s7;
  /* 224 */ uint64 s8;
  /* 232 */ uint64 s9;
  /* 240 */ uint64 s10;
  /* 248 */ uint64 s11;
  /* 256 */ uint64 t3;
  /* 264 */ uint64 t4;
  /* 272 */ uint64 t5;
  /* 280 */ uint64 t6;
};

enum procstate { UNUSED, USED, SLEEPING, RUNNABLE, RUNNING, ZOMBIE };

TIP

Per-process state

struct proc {
  struct spinlock lock;

TIP

p->lock must be held when using these:

  enum procstate state;
  void *chan;
  int killed;
  int xstate;
  int pid;

TIP

wait_lock must be held when using this:

  struct proc *parent;

TIP

these are private to the process, so p->lock need not be held.

  uint64 kstack;
  uint64 sz;
  pagetable_t pagetable;
  struct trapframe *trapframe;
  struct context context;
  struct file *ofile[NOFILE];
  struct inode *cwd;
  char name[16];
};