์์ธ
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
์ ๊ฐ์ ๊ฒ์ผ๋ก ๋ํํ๊ณ ์ ์ ์ธ ๊ฒ์ผ๋ก ๋ฐฐ์นํด์ผ ํฉ๋๋ค.