aboutsummaryrefslogtreecommitdiff
path: root/src/msp430/reg/id.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/msp430/reg/id.rs')
-rw-r--r--src/msp430/reg/id.rs51
1 files changed, 36 insertions, 15 deletions
diff --git a/src/msp430/reg/id.rs b/src/msp430/reg/id.rs
index 1c38763..679c1cc 100644
--- a/src/msp430/reg/id.rs
+++ b/src/msp430/reg/id.rs
@@ -1,3 +1,5 @@
+use core::num::NonZeroUsize;
+
use gdbstub::arch::RegId;
/// TI-MSP430 register identifier.
@@ -6,7 +8,7 @@ use gdbstub::arch::RegId;
/// The best file to reference is [msp430-tdep.c](https://github.com/bminor/binutils-gdb/blob/master/gdb/msp430-tdep.c).
#[derive(Debug, Clone, Copy)]
#[non_exhaustive]
-pub enum Msp430RegId {
+pub enum Msp430RegId<U> {
/// Program Counter (R0)
Pc,
/// Stack Pointer (R1)
@@ -17,19 +19,33 @@ pub enum Msp430RegId {
Cg,
/// General Purpose Registers (R4-R15)
Gpr(u8),
+ #[doc(hidden)]
+ _Size(core::marker::PhantomData<U>),
}
-impl RegId for Msp430RegId {
- fn from_raw_id(id: usize) -> Option<(Self, usize)> {
- let reg = match id {
- 0 => Self::Pc,
- 1 => Self::Sp,
- 2 => Self::Sr,
- 3 => Self::Cg,
- 4..=15 => Self::Gpr((id as u8) - 4),
- _ => return None,
- };
- Some((reg, 2))
+fn from_raw_id<U>(id: usize) -> Option<(Msp430RegId<U>, Option<NonZeroUsize>)> {
+ let reg = match id {
+ 0 => Msp430RegId::Pc,
+ 1 => Msp430RegId::Sp,
+ 2 => Msp430RegId::Sr,
+ 3 => Msp430RegId::Cg,
+ 4..=15 => Msp430RegId::Gpr((id as u8) - 4),
+ _ => return None,
+ };
+
+ let ptrsize = core::mem::size_of::<U>();
+ Some((reg, Some(NonZeroUsize::new(ptrsize)?)))
+}
+
+impl RegId for Msp430RegId<u16> {
+ fn from_raw_id(id: usize) -> Option<(Self, Option<NonZeroUsize>)> {
+ from_raw_id::<u16>(id)
+ }
+}
+
+impl RegId for Msp430RegId<u32> {
+ fn from_raw_id(id: usize) -> Option<(Self, Option<NonZeroUsize>)> {
+ from_raw_id::<u32>(id)
}
}
@@ -51,13 +67,13 @@ mod tests {
// The `Msp430Regs` implementation does not increment the size for
// the CG register since it will always be the constant zero.
- serialized_data_len += 4;
+ serialized_data_len += RId::from_raw_id(3).unwrap().1.unwrap().get();
// Accumulate register sizes returned by `from_raw_id`.
let mut i = 0;
let mut sum_reg_sizes = 0;
while let Some((_, size)) = RId::from_raw_id(i) {
- sum_reg_sizes += size;
+ sum_reg_sizes += size.unwrap().get();
i += 1;
}
@@ -66,6 +82,11 @@ mod tests {
#[test]
fn test_msp430() {
- test::<crate::msp430::reg::Msp430Regs, crate::msp430::reg::id::Msp430RegId>()
+ test::<crate::msp430::reg::Msp430Regs<u16>, crate::msp430::reg::id::Msp430RegId<u16>>()
+ }
+
+ #[test]
+ fn test_msp430x() {
+ test::<crate::msp430::reg::Msp430Regs<u32>, crate::msp430::reg::id::Msp430RegId<u32>>()
}
}