lemur/src/gdbserver/registers.rs

131 lines
4.2 KiB
Rust
Raw Normal View History

2025-01-02 02:48:33 +00:00
use crate::emulator::VBRegister;
2025-01-02 01:57:20 +00:00
pub struct RegisterInfo {
2025-01-02 02:48:33 +00:00
dwarf: u32,
2025-01-02 01:57:20 +00:00
name: &'static str,
set: &'static str,
alt_name: Option<&'static str>,
generic: Option<&'static str>,
}
impl RegisterInfo {
pub fn to_description(&self) -> String {
let mut string = format!("name:{}", self.name);
if let Some(alt) = self.alt_name {
string.push_str(&format!(";alt-name:{}", alt));
}
string.push_str(&format!(
";bitsize:32;offset:{};encoding:uint;format:hex;set:{};dwarf:{}",
2025-01-02 02:48:33 +00:00
self.dwarf * 4,
2025-01-02 01:57:20 +00:00
self.set,
2025-01-02 02:48:33 +00:00
self.dwarf
2025-01-02 01:57:20 +00:00
));
if let Some(generic) = self.generic {
string.push_str(&format!(";generic:{}", generic));
}
string
}
2025-01-02 02:48:33 +00:00
pub fn to_vb_register(&self) -> VBRegister {
match self.dwarf {
0..32 => VBRegister::Program(self.dwarf),
32..40 => VBRegister::System(self.dwarf - 32),
40..42 => VBRegister::System(self.dwarf - 16),
42..45 => VBRegister::System(self.dwarf - 13),
45 => VBRegister::PC,
other => panic!("unexpected DWARF register {other}"),
}
}
2025-01-02 01:57:20 +00:00
}
macro_rules! register {
2025-01-02 02:48:33 +00:00
($set:expr, $dwarf:expr, $name:expr) => {
2025-01-02 01:57:20 +00:00
RegisterInfo {
2025-01-02 02:48:33 +00:00
dwarf: $dwarf,
2025-01-02 01:57:20 +00:00
name: $name,
set: $set,
alt_name: None,
generic: None,
}
};
2025-01-02 02:48:33 +00:00
($set:expr, $dwarf:expr, $name:expr, alt: $alt:expr) => {
2025-01-02 01:57:20 +00:00
RegisterInfo {
2025-01-02 02:48:33 +00:00
dwarf: $dwarf,
2025-01-02 01:57:20 +00:00
name: $name,
set: $set,
alt_name: Some($alt),
generic: None,
}
};
2025-01-02 02:48:33 +00:00
($set:expr, $dwarf:expr, $name:expr, generic: $generic:expr) => {
2025-01-02 01:57:20 +00:00
RegisterInfo {
2025-01-02 02:48:33 +00:00
dwarf: $dwarf,
2025-01-02 01:57:20 +00:00
name: $name,
set: $set,
alt_name: None,
generic: Some($generic),
}
};
2025-01-02 02:48:33 +00:00
($set:expr, $dwarf:expr, $name:expr, alt: $alt:expr, generic: $generic:expr) => {
2025-01-02 01:57:20 +00:00
RegisterInfo {
2025-01-02 02:48:33 +00:00
dwarf: $dwarf,
2025-01-02 01:57:20 +00:00
name: $name,
set: $set,
alt_name: Some($alt),
generic: Some($generic),
}
};
}
const GENERAL: &str = "General Purpose Registers";
const SPECIAL: &str = "Special Registers";
pub const REGISTERS: [RegisterInfo; 46] = [
register!(GENERAL, 0, "r0"),
register!(GENERAL, 1, "r1"),
register!(GENERAL, 2, "fp", alt: "r2", generic: "fp"),
register!(GENERAL, 3, "sp", alt: "r3", generic: "sp"),
register!(GENERAL, 4, "gp", alt: "r4"),
register!(GENERAL, 5, "tp", alt: "r5"),
register!(GENERAL, 6, "r6", generic: "arg1"),
register!(GENERAL, 7, "r7", generic: "arg2"),
register!(GENERAL, 8, "r8", generic: "arg3"),
register!(GENERAL, 9, "r9", generic: "arg4"),
register!(GENERAL, 10, "r10"),
register!(GENERAL, 11, "r11"),
register!(GENERAL, 12, "r12"),
register!(GENERAL, 13, "r13"),
register!(GENERAL, 14, "r14"),
register!(GENERAL, 15, "r15"),
register!(GENERAL, 16, "r16"),
register!(GENERAL, 17, "r17"),
register!(GENERAL, 18, "r18"),
register!(GENERAL, 19, "r19"),
register!(GENERAL, 20, "r20"),
register!(GENERAL, 21, "r21"),
register!(GENERAL, 22, "r22"),
register!(GENERAL, 23, "r23"),
register!(GENERAL, 24, "r24"),
register!(GENERAL, 25, "r25"),
register!(GENERAL, 26, "r26"),
register!(GENERAL, 27, "r27"),
register!(GENERAL, 28, "r28"),
register!(GENERAL, 29, "r29"),
register!(GENERAL, 30, "r30"),
register!(GENERAL, 31, "lp", alt: "r31", generic: "ra"),
register!(SPECIAL, 32, "eipc", alt: "sr0"),
register!(SPECIAL, 33, "eipsw", alt: "sr1"),
register!(SPECIAL, 34, "fepc", alt: "sr2"),
register!(SPECIAL, 35, "fepsw", alt: "sr3"),
register!(SPECIAL, 36, "ecr", alt: "sr4"),
register!(SPECIAL, 37, "psw", alt: "sr5", generic: "flags"),
register!(SPECIAL, 38, "pir", alt: "sr6"),
register!(SPECIAL, 39, "tkcw", alt: "sr7"),
register!(SPECIAL, 40, "chcw", alt: "sr24"),
register!(SPECIAL, 41, "adtre", alt: "sr25"),
register!(SPECIAL, 42, "sr29"),
register!(SPECIAL, 43, "sr30"),
register!(SPECIAL, 44, "sr31"),
register!(SPECIAL, 45, "pc", generic: "pc"),
];