summaryrefslogtreecommitdiff
path: root/main.c
diff options
context:
space:
mode:
authorRobert Morris <[email protected]>2019-06-05 14:05:46 -0400
committerRobert Morris <[email protected]>2019-06-05 14:05:46 -0400
commit31136437684b5987ef46f4c6947940cf96de75b3 (patch)
tree3c89b1f0e12bbddbf307259326ecb5f763ba6e09 /main.c
parentf1a727b971a59bab6025b4c4111342c27356ca40 (diff)
downloadxv6-labs-31136437684b5987ef46f4c6947940cf96de75b3.tar.gz
xv6-labs-31136437684b5987ef46f4c6947940cf96de75b3.tar.bz2
xv6-labs-31136437684b5987ef46f4c6947940cf96de75b3.zip
spinlocks using gcc intrinsics
push_off() / pop_off() set up per-hart plic stuff so all harts get device interrupts
Diffstat (limited to 'main.c')
-rw-r--r--main.c42
1 files changed, 28 insertions, 14 deletions
diff --git a/main.c b/main.c
index 24793cd..2168b9f 100644
--- a/main.c
+++ b/main.c
@@ -4,25 +4,39 @@
#include "riscv.h"
#include "defs.h"
+volatile static int started = 0;
+
// Bootstrap processor starts running C code here.
// Allocate a real stack and switch to it, first
// doing some setup required for memory allocator to work.
void
-main(int hartid)
+main()
{
- w_tp(hartid); // save hartid where cpuid() can find it
- uartinit(); // serial port
- consoleinit();
- printf("entering main() on hart %d\n", hartid);
- kinit(); // physical page allocator
- kvminit(); // kernel page table
- procinit(); // process table
- trapinit(); // trap vectors
- plicinit(); // set up interrupt controller
- binit(); // buffer cache
- fileinit(); // file table
- ramdiskinit(); // disk
- userinit(); // first user process
+ if(cpuid() == 0){
+ uartinit(); // serial port
+ consoleinit();
+ printf("hart %d starting\n", cpuid());
+ kinit(); // physical page allocator
+ kvminit(); // create kernel page table
+ kvminithart(); // turn on paging
+ procinit(); // process table
+ trapinit(); // trap vectors
+ trapinithart(); // install kernel trap vector
+ plicinit(); // set up interrupt controller
+ plicinithart(); // ask PLIC for device interrupts
+ binit(); // buffer cache
+ fileinit(); // file table
+ ramdiskinit(); // disk
+ userinit(); // first user process
+ started = 1;
+ } else {
+ while(started == 0)
+ ;
+ printf("hart %d starting\n", cpuid());
+ kvminithart(); // turn on paging
+ trapinithart(); // install kernel trap vector
+ plicinithart(); // ask PLIC for device interrupts
+ }
scheduler();
}