use bitfield::bitfield;
use crate::bitflags;
bitflags! {
pub struct Rflags(u32) {
CF = 1 << 0;
RESERVED_1 = 1 << 1;
PF = 1 << 2;
AF = 1 << 4;
ZF = 1 << 6;
SF = 1 << 7;
TF = 1 << 8;
IF = 1 << 9;
DF = 1 << 10;
OF = 1 << 11;
IOPL = 1 << 13;
NT = 1 << 14;
RF = 1 << 16;
VM = 1 << 17;
AC = 1 << 18;
VIF = 1 << 19;
VIP = 1 << 20;
ID = 1 << 21;
}
}
bitflags! {
pub struct Cr0(u32) {
PE = 1 << 0;
MP = 1 << 1;
EM = 1 << 2;
TS = 1 << 3;
ET = 1 << 4;
NE = 1 << 5;
WP = 1 << 16;
AM = 1 << 18;
NW = 1 << 29;
CD = 1 << 30;
PG = 1 << 31;
}
}
bitflags! {
pub struct Cr3(u64) {
PWT = 1 << 3;
PCD = 1 << 4;
}
}
bitflags! {
pub struct Cr4(u32) {
VME = 1 << 0;
PVI = 1 << 1;
TSD = 1 << 2;
DE = 1 << 3;
PSE = 1 << 4;
PAE = 1 << 5;
MCE = 1 << 6;
PGE = 1 << 7;
PCE = 1 << 8;
OSFXSR = 1 << 9;
OSXMMEXCPT = 1 << 10;
UMIP = 1 << 11;
LA57 = 1 << 12;
VMXE = 1 << 13;
SMXE = 1 << 14;
FSGSBASE = 1 << 16;
PCIDE = 1 << 17;
OSXSAVE = 1 << 18;
KL = 1 << 19;
SMEP = 1 << 20;
SMAP = 1 << 21;
PKE = 1 << 22;
CET = 1 << 23;
PKS = 1 << 24;
UINTR = 1 << 25;
}
}
bitfield! {
#[derive(Copy, Clone, Default, PartialEq, Eq, Hash)]
pub struct SegAccess(u32);
impl Debug;
pub seg_type, _ : 3, 0;
pub s_code_data, _ : 4;
pub priv_level, _ : 6, 5;
pub present, _ : 7;
pub available, _ : 12;
pub l_64bit, _ : 13;
pub db_size_32, _: 14;
pub granularity, _: 15;
pub unusable, _: 16;
}
#[derive(Debug, Copy, Clone, PartialEq, Eq)]
pub enum Reg {
Rax,
Rbx,
Rcx,
Rdx,
Rsi,
Rdi,
Rsp,
Rbp,
R8,
R9,
R10,
R11,
R12,
R13,
R14,
R15,
Rip,
Rflags,
}
#[derive(Debug, Copy, Clone, PartialEq, Eq)]
pub enum SReg {
Cr0,
Cr2,
Cr3,
Cr4,
Cr8,
Efer,
ApicBase,
}
#[derive(Debug, Copy, Clone, PartialEq, Eq)]
pub enum SegReg {
Cs,
Ds,
Es,
Fs,
Gs,
Ss,
Tr,
Ldtr,
}
#[derive(Debug, Copy, Clone, PartialEq, Eq)]
pub enum DtReg {
Gdtr,
Idtr,
}
#[derive(Debug, Copy, Clone, Default, PartialEq, Eq)]
pub struct SegRegVal {
pub selector: u16,
pub base: u64,
pub limit: u32,
pub access: SegAccess,
}
impl SegRegVal {
pub fn to_desc(&self) -> u64 {
((self.base & 0xff00_0000) << (56 - 24))
| (((self.access.0 as u64) & 0x0000_f0ff) << 40)
| (((self.limit as u64) & 0x000f_0000) << (48 - 16))
| ((self.base & 0x00ff_ffff) << 16)
| ((self.limit as u64) & 0x0000_ffff)
}
}
#[derive(Debug, Copy, Clone, Default, PartialEq, Eq)]
pub struct DtRegVal {
pub base: u64,
pub limit: u16,
}