use bitfield::bitfield;
use crate::{bitflags, consts};
#[derive(Debug, Copy, Clone, PartialEq, Eq)]
pub enum Reg {
X0,
X1,
X2,
X3,
X4,
X5,
X6,
X7,
X8,
X9,
X10,
X11,
X12,
X13,
X14,
X15,
X16,
X17,
X18,
X19,
X20,
X21,
X22,
X23,
X24,
X25,
X26,
X27,
X28,
X29,
X30,
Sp,
Pc,
Pstate,
}
pub const fn encode(op0: u16, op1: u16, crn: u16, crm: u16, op2: u16) -> u16 {
(op0 << 14) | (op1 << 11) | (crn << 7) | (crm << 3) | op2
}
consts! {
pub struct SReg(u16) {
OSLAR_EL1 = encode(2, 0, 1, 0, 4);
OSDLR_EL1 = encode(2, 0, 1, 3, 4);
MPIDR_EL1 = encode(3, 0, 0, 0, 5);
SCTLR_EL1 = encode(3, 0, 1, 0, 0);
SP_EL0 = encode(3, 0, 4, 1, 0);
ESR_EL2 = encode(3, 4, 5, 2, 0);
}
}
bitflags! {
pub struct Pstate(u32) {
N = 1 << 31;
Z = 1 << 30;
C = 1 << 29;
V = 1 << 28;
SS = 1 << 21;
IL = 1 << 20;
D = 1 << 9;
A = 1 << 8;
I = 1 << 7;
F = 1 << 6;
M = 1 << 4;
EL_BIT3 = 1 << 3;
EL_BIT2 = 1 << 2;
EL_H = 1 << 0;
}
}
bitfield! {
#[derive(Copy, Clone, Default, PartialEq, Eq, Hash)]
#[repr(transparent)]
pub struct EsrEl2(u64);
impl Debug;
pub iss2, _: 36, 32;
pub u8, into EsrEl2Ec, ec, _: 31, 26;
pub il, _: 25;
pub u32, iss, _: 24, 0;
}
consts! {
pub struct EsrEl2Ec(u8) {
HVC_64 = 0x16;
SYS_REG_64 = 0x18;
INSTR_ABRT_LOWER = 0x20;
DATA_ABORT_LOWER = 0x24;
}
}
bitfield! {
#[derive(Copy, Clone, Default, PartialEq, Eq, Hash)]
pub struct EsrEl2DataAbort(u32);
impl Debug;
pub isv, _: 24;
pub sas, _: 23, 22;
pub sse, _: 21;
pub srt, _: 20, 16;
pub sf, _: 15;
pub ar, _: 14;
pub vncr, _: 13;
pub set, _: 12, 11;
pub fnv, _: 10;
pub ea, _: 9;
pub cm, _: 8;
pub s1ptw, _: 7;
pub wnr, _: 6;
pub dfsc, _: 5, 0;
}
bitfield! {
#[derive(Copy, Clone, Default, PartialEq, Eq, Hash)]
pub struct EsrEl2SysReg(u32);
impl Debug;
pub is_read, _: 0;
pub u16, crm, _: 4, 1;
pub rt, _: 9, 5;
pub u16, crn, _: 13, 10;
pub u16, op1, _: 16, 14;
pub u16, op2, _: 19, 17;
pub u16, op0, _: 21, 20;
}
bitfield! {
#[derive(Copy, Clone, Default, PartialEq, Eq, Hash)]
pub struct MpidrEl1(u64);
impl Debug;
pub u8, aff3, set_aff3: 39, 32;
pub u, set_u: 30;
pub mt, set_mt: 24;
pub u8, aff2, set_aff2: 23, 16;
pub u8, aff1, set_aff1: 15, 8;
pub u8, aff0, set_aff0: 7, 0;
}