1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
#[derive(Debug)]
pub enum AccessPermission {
NoAccess = 0b000,
PrivilegedOnly = 0b001,
UnprivilegedReadOnly = 0b010,
ReadWrite = 0b011,
Reserved = 0b100,
PrivilegedOnlyReadOnly = 0b101,
ReadOnly = 0b110,
ReadOnlyAlias = 0b111,
}
#[derive(Debug)]
pub enum ExecutePermission {
ExecutionPermitted = 0b0,
ExecutionNotPermitted = 0b1,
}
pub struct Region {
base_address: u32,
attributes: u32,
}
impl Region {
pub unsafe fn new(base_address: u32, attributes: u32) -> Region {
Region {
base_address: base_address,
attributes: attributes,
}
}
pub fn empty(region_num: usize) -> Region {
Region {
base_address: (region_num as u32) | 1 << 4,
attributes: 0,
}
}
pub fn base_address(&self) -> u32 {
self.base_address
}
pub fn attributes(&self) -> u32 {
self.attributes
}
}
pub trait MPU {
fn enable_mpu(&self);
fn disable_mpu(&self);
fn create_region(
region_num: usize,
start: usize,
len: usize,
execute: ExecutePermission,
access: AccessPermission,
) -> Option<Region>;
fn set_mpu(&self, region: Region);
}
impl MPU for () {
fn enable_mpu(&self) {}
fn disable_mpu(&self) {}
fn create_region(
_: usize,
_: usize,
_: usize,
_: ExecutePermission,
_: AccessPermission,
) -> Option<Region> {
Some(Region::empty(0))
}
fn set_mpu(&self, _: Region) {}
}