μμΈ
AArch64λ 4κ° μν(SP0μ μ¬μ©νλ νμ¬ EL, SPxλ₯Ό μ¬μ©νλ νμ¬ EL, AArch64λ₯Ό μ¬μ©νλ νμ EL, AArch32λ₯Ό μ¬μ©νλ νμ EL)μ 4κ°μ§ μμΈ νμ (λκΈ°, IRQ, FIQ, SError)μ λν΄ 16κ° νλͺ©μ΄ μλ μμΈ λ²‘ν° ν μ΄λΈμ μ μν©λλ€. Rust μ½λλ₯Ό νΈμΆνκΈ° μ μ νλ°μ± λ μ§μ€ν°λ₯Ό μ€νμ μ μ₯νκΈ° μν΄ μ΄μ λΈλ¦¬μμ μ΄λ₯Ό ꡬνν©λλ€.
use log::error; use smccc::psci::system_off; use smccc::Hvc; #[no_mangle] extern "C" fn sync_exception_current(_elr: u64, _spsr: u64) { error!("sync_exception_current"); system_off::<Hvc>().unwrap(); } #[no_mangle] extern "C" fn irq_current(_elr: u64, _spsr: u64) { error!("irq_current"); system_off::<Hvc>().unwrap(); } #[no_mangle] extern "C" fn fiq_current(_elr: u64, _spsr: u64) { error!("fiq_current"); system_off::<Hvc>().unwrap(); } #[no_mangle] extern "C" fn serr_current(_elr: u64, _spsr: u64) { error!("serr_current"); system_off::<Hvc>().unwrap(); } #[no_mangle] extern "C" fn sync_lower(_elr: u64, _spsr: u64) { error!("sync_lower"); system_off::<Hvc>().unwrap(); } #[no_mangle] extern "C" fn irq_lower(_elr: u64, _spsr: u64) { error!("irq_lower"); system_off::<Hvc>().unwrap(); } #[no_mangle] extern "C" fn fiq_lower(_elr: u64, _spsr: u64) { error!("fiq_lower"); system_off::<Hvc>().unwrap(); } #[no_mangle] extern "C" fn serr_lower(_elr: u64, _spsr: u64) { error!("serr_lower"); system_off::<Hvc>().unwrap(); }
- ELμ μμΈ μμ€μ λλ€. μ€λ μ€νμ λͺ¨λ μλ EL1μμ μ€νλ©λλ€.
- νΈμμ νμ¬ EL μμΈμ SP0κ³Ό SPxλ₯Ό ꡬλ³νκ±°λ νμ EL μμΈμ AArch32μ AArch64λ₯Ό ꡬλ³νμ§ μμ΅λλ€.
- μ΄ μμμλ μμΈκ° μ€μ λ‘ λ°μν κ²μΌλ‘ μμλμ§ μμΌλ―λ‘ μμΈλ₯Ό κΈ°λ‘νκ³ μ μμ λλλ€.
- μμΈ νΈλ€λ¬μ κΈ°λ³Έ μ€ν 컨ν
μ€νΈλ μλ‘ λ€λ₯Έ μ€λ λμ κ±°μ λΉμ·νλ€κ³ μκ°ν μ μμ΅λλ€.
Send
λ°Sync
λ μ€λ λμ λ§μ°¬κ°μ§λ‘ μ΄λ€ κ°μ 곡μ ν μ μλ νλͺ©μ μ μ΄ν©λλ€. μλ₯Ό λ€μ΄ μμΈ νΈλ€λ¬μ νλ‘κ·Έλ¨μ λλ¨Έμ§ λΆλΆ κ°μ κ°μ 곡μ νλ €κ³ νλλ°Send
μ΄μ§λ§Sync
λ μλ κ²½μ°,Mutex
μ κ°μ κ²μΌλ‘ λννκ³ μ μ μΈ κ²μΌλ‘ λ°°μΉν΄μΌ ν©λλ€.