diff options
author | Austin Clements <[email protected]> | 2010-09-02 04:15:17 -0400 |
---|---|---|
committer | Austin Clements <[email protected]> | 2010-09-02 04:15:17 -0400 |
commit | d8828817d72962a6220cb1fca315cab4bbf6d0a3 (patch) | |
tree | 018515d8e7ce0c6681121914fb9d78e9955025b3 /proc.h | |
parent | dd3ecd42cd6c8dee72e5212848cd8037d47f81dd (diff) | |
download | xv6-labs-d8828817d72962a6220cb1fca315cab4bbf6d0a3.tar.gz xv6-labs-d8828817d72962a6220cb1fca315cab4bbf6d0a3.tar.bz2 xv6-labs-d8828817d72962a6220cb1fca315cab4bbf6d0a3.zip |
Rearrange proc.h and proc.c to get our action-packed spreads back (mostly). They also make sense in this order, so it's not just for page layout.
Diffstat (limited to 'proc.h')
-rw-r--r-- | proc.h | 59 |
1 files changed, 30 insertions, 29 deletions
@@ -8,6 +8,36 @@ #define SEG_TSS 6 // this process's task state #define NSEGS 7 +// Per-CPU state +struct cpu { + uchar id; // Local APIC ID; index into cpus[] below + struct context *scheduler; // Switch here to enter scheduler + struct taskstate ts; // Used by x86 to find stack for interrupt + struct segdesc gdt[NSEGS]; // x86 global descriptor table + volatile uint booted; // Has the CPU started? + int ncli; // Depth of pushcli nesting. + int intena; // Were interrupts enabled before pushcli? + + // Cpu-local storage variables; see below + struct cpu *cpu; + struct proc *proc; +}; + +extern struct cpu cpus[NCPU]; +extern int ncpu; + +// Per-CPU variables, holding pointers to the +// current cpu and to the current process. +// The asm suffix tells gcc to use "%gs:0" to refer to cpu +// and "%gs:4" to refer to proc. ksegment sets up the +// %gs segment register so that %gs refers to the memory +// holding those two variables in the local cpu's struct cpu. +// This is similar to how thread-local variables are implemented +// in thread libraries such as Linux pthreads. +extern struct cpu *cpu asm("%gs:0"); // This cpu. +extern struct proc *proc asm("%gs:4"); // Current proc on this cpu. + +//PAGEBREAK: 17 // Saved registers for kernel context switches. // Don't need to save all the segment registers (%cs, etc), // because they are constant across kernel contexts. @@ -50,32 +80,3 @@ struct proc { // original data and bss // fixed-size stack // expandable heap - -// Per-CPU state -struct cpu { - uchar id; // Local APIC ID; index into cpus[] below - struct context *scheduler; // Switch here to enter scheduler - struct taskstate ts; // Used by x86 to find stack for interrupt - struct segdesc gdt[NSEGS]; // x86 global descriptor table - volatile uint booted; // Has the CPU started? - int ncli; // Depth of pushcli nesting. - int intena; // Were interrupts enabled before pushcli? - - // Cpu-local storage variables; see below - struct cpu *cpu; - struct proc *proc; -}; - -extern struct cpu cpus[NCPU]; -extern int ncpu; - -// Per-CPU variables, holding pointers to the -// current cpu and to the current process. -// The asm suffix tells gcc to use "%gs:0" to refer to cpu -// and "%gs:4" to refer to proc. ksegment sets up the -// %gs segment register so that %gs refers to the memory -// holding those two variables in the local cpu's struct cpu. -// This is similar to how thread-local variables are implemented -// in thread libraries such as Linux pthreads. -extern struct cpu *cpu asm("%gs:0"); // This cpu. -extern struct proc *proc asm("%gs:4"); // Current proc on this cpu. |