1#![allow(dead_code)]
2
3use super::*;
4use delegate::delegate;
5
6#[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}