Make init lock less ambiguous, add fences
This commit is contained in:
		
							parent
							
								
									325fa3c147
								
							
						
					
					
						commit
						eee7c6f02b
					
				| 
						 | 
					@ -1,6 +1,6 @@
 | 
				
			||||||
// src/entry.rs
 | 
					// src/entry.rs
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static READY: spin::Once<()> = spin::Once::new();
 | 
					static INIT_LOCK: spin::Once<()> = spin::Once::new();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/// After some initialization in asm/entry.S, the kernel will jump here and
 | 
					/// After some initialization in asm/entry.S, the kernel will jump here and
 | 
				
			||||||
/// each hart will have its own setup sequence.
 | 
					/// each hart will have its own setup sequence.
 | 
				
			||||||
| 
						 | 
					@ -42,7 +42,7 @@ extern "C" fn main() {
 | 
				
			||||||
    use riscv::register::{mstatus, sstatus};
 | 
					    use riscv::register::{mstatus, sstatus};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if hartid() == 0 {
 | 
					    if hartid() == 0 {
 | 
				
			||||||
        READY.call_once(|| {
 | 
					        INIT_LOCK.call_once(|| {
 | 
				
			||||||
            // Disable machine interrupts while initializing
 | 
					            // Disable machine interrupts while initializing
 | 
				
			||||||
            interrupt::machine::disable();
 | 
					            interrupt::machine::disable();
 | 
				
			||||||
            // TODO Initialize console
 | 
					            // TODO Initialize console
 | 
				
			||||||
| 
						 | 
					@ -62,10 +62,11 @@ extern "C" fn main() {
 | 
				
			||||||
                mstatus::set_fs(sstatus::FS::Initial);
 | 
					                mstatus::set_fs(sstatus::FS::Initial);
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            riscv::asm::fence();
 | 
					            riscv::asm::fence(); // Emit a fence just in case
 | 
				
			||||||
        });
 | 
					        });
 | 
				
			||||||
    } else {
 | 
					    } else {
 | 
				
			||||||
        READY.wait();
 | 
					        INIT_LOCK.wait();
 | 
				
			||||||
 | 
					        riscv::asm::fence(); // Emit a fence just in case
 | 
				
			||||||
        kinit_hart();
 | 
					        kinit_hart();
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in a new issue