2024-03-19 23:11:03 +02:00
|
|
|
#![allow(missing_docs)]
|
|
|
|
|
2025-02-27 18:49:20 +02:00
|
|
|
use abi_serde::impl_struct_serde;
|
|
|
|
|
2024-10-27 06:46:25 +02:00
|
|
|
use super::FrameOps;
|
|
|
|
|
2024-03-19 23:11:03 +02:00
|
|
|
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
|
|
|
|
#[derive(Clone, Debug, Default)]
|
2023-11-04 15:40:48 +02:00
|
|
|
#[repr(C)]
|
|
|
|
pub struct SavedFrame {
|
2024-10-11 15:29:41 +03:00
|
|
|
pub gp_regs: [usize; 32],
|
2023-11-04 15:40:48 +02:00
|
|
|
pub spsr_el1: u64,
|
|
|
|
pub elr_el1: u64,
|
|
|
|
pub sp_el0: u64,
|
2024-03-19 23:11:03 +02:00
|
|
|
pub mdscr_el1: u64,
|
2023-11-04 15:40:48 +02:00
|
|
|
}
|
2024-10-27 06:46:25 +02:00
|
|
|
|
|
|
|
impl FrameOps for SavedFrame {
|
|
|
|
fn set_user_ip(&mut self, value: usize) {
|
|
|
|
self.elr_el1 = value as _;
|
|
|
|
}
|
|
|
|
|
|
|
|
fn user_ip(&self) -> usize {
|
|
|
|
self.elr_el1 as _
|
|
|
|
}
|
|
|
|
}
|
2025-02-27 18:49:20 +02:00
|
|
|
|
|
|
|
impl_struct_serde!(SavedFrame: [
|
|
|
|
gp_regs,
|
|
|
|
spsr_el1,
|
|
|
|
elr_el1,
|
|
|
|
sp_el0,
|
|
|
|
mdscr_el1,
|
|
|
|
]);
|