Skip to content
Snippets Groups Projects
proc.h 1.65 KiB
Newer Older
rsc's avatar
rsc committed
// segments in proc->gdt
rtm's avatar
rtm committed
#define SEG_KCODE 1 // kernel code
#define SEG_KDATA 2 // kernel data+stack
#define SEG_UCODE 3
#define SEG_UDATA 4
rsc's avatar
rsc committed
#define SEG_TSS   5   // this process's task state
#define NSEGS     6
rtm's avatar
rtm committed

struct jmpbuf {
  // saved registers for kernel context switches
  // don't need to save all the fs etc. registers because
  // they are constant across kernel contexts
  // save all the regular registers so we don't care which are caller save
  // don't save eax because that's the return register
  // layout known to setjmp.S
  int ebx;
  int ecx;
  int edx;
  int esi;
  int edi;
  int esp;
  int ebp;
  int eip;
enum proc_state { UNUSED, EMBRYO, SLEEPING, RUNNABLE, RUNNING, ZOMBIE };
rtm's avatar
rtm committed

rtm's avatar
rtm committed
struct proc{
rtm's avatar
rtm committed
  char *mem;    // start of process's memory (a kernel address)
rsc's avatar
rsc committed
    // process memory is laid out contiguously:
    //   text
    //   original data and bss
    //   fixed-size stack
    //   expandable heap
rtm's avatar
rtm committed
  uint sz;      // user memory size
  char *kstack; // kernel stack
rtm's avatar
rtm committed
  enum proc_state state;
rtm's avatar
rtm committed
  int pid;
  int ppid;
  void *chan; // sleep
rtm's avatar
rtm committed
  struct fd *fds[NOFILE];
kaashoek's avatar
kaashoek committed
  struct inode *cwd;
  struct jmpbuf jmpbuf;
  struct trapframe *tf; // points into kstack, used to find user regs
rtm's avatar
rtm committed
};

extern struct proc proc[];
extern struct proc *curproc[NCPU];  // can be NULL if no proc running.
rtm's avatar
rtm committed

#define MPSTACK 512

struct cpu {
rtm's avatar
rtm committed
  uchar apicid;       // Local APIC ID
  struct jmpbuf jmpbuf;
  struct taskstate ts;  // only to give cpu address of kernel stack
  struct segdesc gdt[NSEGS];
  char mpstack[MPSTACK]; // per-cpu start-up stack
  volatile int booted;
rsc's avatar
 
rsc committed
  int nlock; // # of locks currently held
rtm's avatar
rtm committed
};

extern struct cpu cpus[NCPU];
extern int ncpu;