diff options
Diffstat (limited to 'src/msp430/reg/id.rs')
-rw-r--r-- | src/msp430/reg/id.rs | 51 |
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>>() } } |