Skip to main content

jelly_mem_access/
phys_accessor.rs

1#![allow(dead_code)]
2
3use super::*;
4use delegate::delegate;
5
6// Memory mapped IO for Physical Address
7#[derive(Debug)]
8pub struct PhysRegion<const ADDR: usize, const SIZE: usize> {}
9
10impl<const ADDR: usize, const SIZE: usize> PhysRegion<ADDR, SIZE> {
11    pub const fn new() -> Self {
12        PhysRegion::<ADDR, SIZE> {}
13    }
14}
15
16impl<const ADDR: usize, const SIZE: usize> MemRegion for PhysRegion<ADDR, SIZE> {
17    fn subclone(&self, offset: usize, size: usize) -> Self {
18        debug_assert!(offset == 0);
19        debug_assert!(size == 0 || size == SIZE);
20        PhysRegion::<ADDR, SIZE> {}
21    }
22
23    fn addr(&self) -> usize {
24        ADDR
25    }
26
27    fn size(&self) -> usize {
28        SIZE
29    }
30
31    fn phys_addr(&self) -> usize {
32        self.addr()
33    }
34}
35
36impl<const ADDR: usize, const SIZE: usize> Clone for PhysRegion<ADDR, SIZE> {
37    fn clone(&self) -> Self {
38        self.subclone(0, 0)
39    }
40}
41
42#[derive(Debug)]
43pub struct PhysAccessor<U, const ADDR: usize, const SIZE: usize> {
44    mem_accessor: MemAccessor<PhysRegion<ADDR, SIZE>, U>,
45}
46
47impl<U, const ADDR: usize, const SIZE: usize> From<PhysAccessor<U, ADDR, SIZE>>
48    for MemAccessor<PhysRegion<ADDR, SIZE>, U>
49{
50    fn from(from: PhysAccessor<U, ADDR, SIZE>) -> MemAccessor<PhysRegion<ADDR, SIZE>, U> {
51        from.mem_accessor
52    }
53}
54
55impl<U, const ADDR: usize, const SIZE: usize> PhysAccessor<U, ADDR, SIZE> {
56    pub const fn new() -> Self {
57        Self {
58            mem_accessor: MemAccessor::<PhysRegion<ADDR, SIZE>, U>::new(
59                PhysRegion::<ADDR, SIZE>::new(),
60            ),
61        }
62    }
63
64    pub fn subclone_<NewU>(&self, offset: usize, size: usize) -> PhysAccessor<NewU, ADDR, SIZE> {
65        PhysAccessor::<NewU, ADDR, SIZE> {
66            mem_accessor: MemAccessor::<PhysRegion<ADDR, SIZE>, NewU>::new(
67                self.mem_accessor.region().subclone(offset, size),
68            ),
69        }
70    }
71
72    pub fn subclone8(&self, offset: usize, size: usize) -> PhysAccessor<u8, ADDR, SIZE> {
73        self.subclone_::<u8>(offset, size)
74    }
75
76    pub fn subclone16(&self, offset: usize, size: usize) -> PhysAccessor<u16, ADDR, SIZE> {
77        self.subclone_::<u16>(offset, size)
78    }
79
80    pub fn subclone32(&self, offset: usize, size: usize) -> PhysAccessor<u32, ADDR, SIZE> {
81        self.subclone_::<u32>(offset, size)
82    }
83
84    pub fn subclone64(&self, offset: usize, size: usize) -> PhysAccessor<u64, ADDR, SIZE> {
85        self.subclone_::<u64>(offset, size)
86    }
87
88    delegate! {
89        to self.mem_accessor.region() {
90            pub fn addr(&self) -> usize;
91            pub fn size(&self) -> usize;
92        }
93    }
94}
95
96impl<U, const ADDR: usize, const SIZE: usize> Clone for PhysAccessor<U, ADDR, SIZE> {
97    fn clone(&self) -> Self {
98        self.subclone_::<U>(0, 0)
99    }
100}
101
102impl<U, const ADDR: usize, const SIZE: usize> MemAccessBase for PhysAccessor<U, ADDR, SIZE> {
103    fn reg_size() -> usize {
104        core::mem::size_of::<U>()
105    }
106
107    fn subclone(&self, offset: usize, size: usize) -> Self {
108        self.subclone_::<U>(offset, size)
109    }
110
111    delegate! {
112        to self.mem_accessor {
113            unsafe fn copy_to_<V>(&self, src_adr: usize, dst_ptr: *mut V, count: usize);
114            unsafe fn copy_from_<V>(&self, src_ptr: *const V, dst_adr: usize, count: usize);
115
116            unsafe fn write_mem_<V>(&self, offset: usize, data: V);
117            unsafe fn read_mem_<V>(&self, offset: usize) -> V;
118            unsafe fn write_reg_<V>(&self, reg: usize, data: V);
119            unsafe fn read_reg_<V>(&self, reg: usize) -> V;
120        }
121    }
122}
123
124impl<U, const ADDR: usize, const SIZE: usize> MemAccess for PhysAccessor<U, ADDR, SIZE> {
125    delegate! {
126        to self.mem_accessor {
127            fn addr(&self) -> usize;
128            fn size(&self) -> usize;
129            fn phys_addr(&self) -> usize;
130
131            unsafe fn copy_to_usize(&self, src_adr: usize, dst_ptr: *mut usize, count: usize);
132            unsafe fn copy_to_u8   (&self, src_adr: usize, dst_ptr: *mut u8   , count: usize);
133            unsafe fn copy_to_u16  (&self, src_adr: usize, dst_ptr: *mut u16  , count: usize);
134            unsafe fn copy_to_u32  (&self, src_adr: usize, dst_ptr: *mut u32  , count: usize);
135            unsafe fn copy_to_u64  (&self, src_adr: usize, dst_ptr: *mut u64  , count: usize);
136            unsafe fn copy_to_isize(&self, src_adr: usize, dst_ptr: *mut isize, count: usize);
137            unsafe fn copy_to_i8   (&self, src_adr: usize, dst_ptr: *mut i8   , count: usize);
138            unsafe fn copy_to_i16  (&self, src_adr: usize, dst_ptr: *mut i16  , count: usize);
139            unsafe fn copy_to_i32  (&self, src_adr: usize, dst_ptr: *mut i32  , count: usize);
140            unsafe fn copy_to_i64  (&self, src_adr: usize, dst_ptr: *mut i64  , count: usize);
141            unsafe fn copy_to_f32  (&self, src_adr: usize, dst_ptr: *mut f32  , count: usize);
142            unsafe fn copy_to_f64  (&self, src_adr: usize, dst_ptr: *mut f64  , count: usize);
143
144            unsafe fn copy_from_usize(&self, src_ptr: *const usize, dst_adr: usize, count: usize);
145            unsafe fn copy_from_u8   (&self, src_ptr: *const u8   , dst_adr: usize, count: usize);
146            unsafe fn copy_from_u16  (&self, src_ptr: *const u16  , dst_adr: usize, count: usize);
147            unsafe fn copy_from_u32  (&self, src_ptr: *const u32  , dst_adr: usize, count: usize);
148            unsafe fn copy_from_u64  (&self, src_ptr: *const u64  , dst_adr: usize, count: usize);
149            unsafe fn copy_from_isize(&self, src_ptr: *const isize, dst_adr: usize, count: usize);
150            unsafe fn copy_from_i8   (&self, src_ptr: *const i8   , dst_adr: usize, count: usize);
151            unsafe fn copy_from_i16  (&self, src_ptr: *const i16  , dst_adr: usize, count: usize);
152            unsafe fn copy_from_i32  (&self, src_ptr: *const i32  , dst_adr: usize, count: usize);
153            unsafe fn copy_from_i64  (&self, src_ptr: *const i64  , dst_adr: usize, count: usize);
154            unsafe fn copy_from_f32  (&self, src_ptr: *const f32  , dst_adr: usize, count: usize);
155            unsafe fn copy_from_f64  (&self, src_ptr: *const f64  , dst_adr: usize, count: usize);
156
157            unsafe fn write_mem      (&self, offset: usize, data: usize);
158            unsafe fn write_mem_usize(&self, offset: usize, data: usize);
159            unsafe fn write_mem_u8   (&self, offset: usize, data: u8);
160            unsafe fn write_mem_u16  (&self, offset: usize, data: u16);
161            unsafe fn write_mem_u32  (&self, offset: usize, data: u32);
162            unsafe fn write_mem_u64  (&self, offset: usize, data: u64);
163            unsafe fn write_mem_isize(&self, offset: usize, data: isize);
164            unsafe fn write_mem_i8   (&self, offset: usize, data: i8);
165            unsafe fn write_mem_i16  (&self, offset: usize, data: i16);
166            unsafe fn write_mem_i32  (&self, offset: usize, data: i32);
167            unsafe fn write_mem_i64  (&self, offset: usize, data: i64);
168            unsafe fn write_mem_f32  (&self, offset: usize, data: f32);
169            unsafe fn write_mem_f64  (&self, offset: usize, data: f64);
170
171            unsafe fn read_mem(&self, offset: usize) -> usize;
172            unsafe fn read_mem_usize(&self, offset: usize) -> usize;
173            unsafe fn read_mem_u8(&self, offset: usize) -> u8;
174            unsafe fn read_mem_u16(&self, offset: usize) -> u16;
175            unsafe fn read_mem_u32(&self, offset: usize) -> u32;
176            unsafe fn read_mem_u64(&self, offset: usize) -> u64;
177            unsafe fn read_mem_isize(&self, offset: usize) -> isize;
178            unsafe fn read_mem_i8(&self, offset: usize) -> i8;
179            unsafe fn read_mem_i16(&self, offset: usize) -> i16;
180            unsafe fn read_mem_i32(&self, offset: usize) -> i32;
181            unsafe fn read_mem_i64(&self, offset: usize) -> i64;
182            unsafe fn read_mem_f32(&self, offset: usize) -> f32;
183            unsafe fn read_mem_f64(&self, offset: usize) -> f64;
184
185            unsafe fn write_reg(&self, reg: usize, data: usize);
186            unsafe fn write_reg_usize(&self, reg: usize, data: usize);
187            unsafe fn write_reg_u8(&self, reg: usize, data: u8);
188            unsafe fn write_reg_u16(&self, reg: usize, data: u16);
189            unsafe fn write_reg_u32(&self, reg: usize, data: u32);
190            unsafe fn write_reg_u64(&self, reg: usize, data: u64);
191            unsafe fn write_reg_isize(&self, reg: usize, data: isize);
192            unsafe fn write_reg_i8(&self, reg: usize, data: i8);
193            unsafe fn write_reg_i16(&self, reg: usize, data: i16);
194            unsafe fn write_reg_i32(&self, reg: usize, data: i32);
195            unsafe fn write_reg_i64(&self, reg: usize, data: i64);
196            unsafe fn write_reg_f32(&self, reg: usize, data: f32);
197            unsafe fn write_reg_f64(&self, reg: usize, data: f64);
198
199            unsafe fn read_reg(&self, reg: usize) -> usize;
200            unsafe fn read_reg_usize(&self, reg: usize) -> usize;
201            unsafe fn read_reg_u8(&self, reg: usize) -> u8;
202            unsafe fn read_reg_u16(&self, reg: usize) -> u16;
203            unsafe fn read_reg_u32(&self, reg: usize) -> u32;
204            unsafe fn read_reg_u64(&self, reg: usize) -> u64;
205            unsafe fn read_reg_isize(&self, reg: usize) -> isize;
206            unsafe fn read_reg_i8(&self, reg: usize) -> i8;
207            unsafe fn read_reg_i16(&self, reg: usize) -> i16;
208            unsafe fn read_reg_i32(&self, reg: usize) -> i32;
209            unsafe fn read_reg_i64(&self, reg: usize) -> i64;
210            unsafe fn read_reg_f32(&self, reg: usize) -> f32;
211            unsafe fn read_reg_f64(&self, reg: usize) -> f64;
212        }
213    }
214}