@@ -37,10 +37,11 @@ impl MemoryRegion {
37
37
/// Read a value from a given offset
38
38
fn read < T > ( & self , offset : u64 ) -> T
39
39
where
40
- T : Copy ,
40
+ T : Copy + Sized ,
41
41
{
42
42
assert ! ( ( offset + ( core:: mem:: size_of:: <T >( ) - 1 ) as u64 ) < self . length) ;
43
- unsafe { * ( ( self . base + offset) as * const T ) }
43
+ let ptr: * const T = core:: ptr:: from_exposed_addr ( ( self . base + offset) as usize ) ;
44
+ unsafe { ptr. read_unaligned ( ) }
44
45
}
45
46
46
47
/// Read a single byte at a given offset
@@ -64,11 +65,13 @@ impl MemoryRegion {
64
65
}
65
66
66
67
/// Write a value at the given offset
67
- pub fn write < T > ( & self , offset : u64 , value : T ) {
68
+ pub fn write < T > ( & self , offset : u64 , value : T )
69
+ where
70
+ T : Sized ,
71
+ {
68
72
assert ! ( ( offset + ( core:: mem:: size_of:: <T >( ) - 1 ) as u64 ) < self . length) ;
69
- unsafe {
70
- * ( ( self . base + offset) as * mut T ) = value;
71
- }
73
+ let ptr: * mut T = core:: ptr:: from_exposed_addr_mut ( ( self . base + offset) as usize ) ;
74
+ unsafe { core:: ptr:: write_unaligned ( ptr, value) }
72
75
}
73
76
74
77
/// Write a single byte at given offset
@@ -95,9 +98,13 @@ impl MemoryRegion {
95
98
}
96
99
97
100
/// Read a value at given offset with a mechanism suitable for MMIO
98
- fn io_read < T > ( & self , offset : u64 ) -> T {
101
+ fn io_read < T > ( & self , offset : u64 ) -> T
102
+ where
103
+ T : Copy + Sized ,
104
+ {
99
105
assert ! ( ( offset + ( core:: mem:: size_of:: <T >( ) - 1 ) as u64 ) < self . length) ;
100
- unsafe { core:: ptr:: read_volatile ( ( self . base + offset) as * const T ) }
106
+ let ptr: * const T = core:: ptr:: from_exposed_addr ( ( self . base + offset) as usize ) ;
107
+ unsafe { ptr. read_volatile ( ) }
101
108
}
102
109
103
110
/// Read a single byte at given offset with a mechanism suitable for MMIO
@@ -121,11 +128,13 @@ impl MemoryRegion {
121
128
}
122
129
123
130
/// Write a value at given offset using a mechanism suitable for MMIO
124
- fn io_write < T > ( & self , offset : u64 , value : T ) {
131
+ pub fn io_write < T > ( & self , offset : u64 , value : T )
132
+ where
133
+ T : Sized ,
134
+ {
125
135
assert ! ( ( offset + ( core:: mem:: size_of:: <T >( ) - 1 ) as u64 ) < self . length) ;
126
- unsafe {
127
- core:: ptr:: write_volatile ( ( self . base + offset) as * mut T , value) ;
128
- }
136
+ let ptr: * mut T = core:: ptr:: from_exposed_addr_mut ( ( self . base + offset) as usize ) ;
137
+ unsafe { core:: ptr:: write_volatile ( ptr, value) }
129
138
}
130
139
131
140
/// Write a single byte at given offset with a mechanism suitable for MMIO
0 commit comments