μ˜ˆμ™Έ

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와 같은 κ²ƒμœΌλ‘œ λž˜ν•‘ν•˜κ³  정적인 κ²ƒμœΌλ‘œ λ°°μΉ˜ν•΄μ•Ό ν•©λ‹ˆλ‹€.