1
1
//! satp register
2
2
3
- #[ cfg( riscv) ]
4
3
use bit_field:: BitField ;
5
4
6
5
/// satp register
@@ -18,7 +17,7 @@ impl Satp {
18
17
19
18
/// Current address-translation scheme
20
19
#[ inline]
21
- #[ cfg( riscv32 ) ]
20
+ #[ cfg( target_pointer_width = "32" ) ]
22
21
pub fn mode ( & self ) -> Mode {
23
22
match self . bits . get_bit ( 31 ) {
24
23
false => Mode :: Bare ,
@@ -28,7 +27,7 @@ impl Satp {
28
27
29
28
/// Current address-translation scheme
30
29
#[ inline]
31
- #[ cfg( riscv64 ) ]
30
+ #[ cfg( target_pointer_width = "64" ) ]
32
31
pub fn mode ( & self ) -> Mode {
33
32
match self . bits . get_bits ( 60 ..64 ) {
34
33
0 => Mode :: Bare ,
@@ -42,55 +41,65 @@ impl Satp {
42
41
43
42
/// Address space identifier
44
43
#[ inline]
45
- #[ cfg( riscv32 ) ]
44
+ #[ cfg( target_pointer_width = "32" ) ]
46
45
pub fn asid ( & self ) -> usize {
47
46
self . bits . get_bits ( 22 ..31 )
48
47
}
49
48
50
49
/// Address space identifier
51
50
#[ inline]
52
- #[ cfg( riscv64 ) ]
51
+ #[ cfg( target_pointer_width = "64" ) ]
53
52
pub fn asid ( & self ) -> usize {
54
53
self . bits . get_bits ( 44 ..60 )
55
54
}
56
55
57
56
/// Physical page number
58
57
#[ inline]
59
- #[ cfg( riscv32 ) ]
58
+ #[ cfg( target_pointer_width = "32" ) ]
60
59
pub fn ppn ( & self ) -> usize {
61
60
self . bits . get_bits ( 0 ..22 )
62
61
}
63
62
64
63
/// Physical page number
65
64
#[ inline]
66
- #[ cfg( riscv64 ) ]
65
+ #[ cfg( target_pointer_width = "64" ) ]
67
66
pub fn ppn ( & self ) -> usize {
68
67
self . bits . get_bits ( 0 ..44 )
69
68
}
70
69
}
71
70
72
- #[ cfg( riscv32) ]
71
+ /// 32-bit satp mode
72
+ #[ cfg( target_pointer_width = "32" ) ]
73
73
#[ derive( Clone , Copy , Debug , Eq , PartialEq ) ]
74
74
pub enum Mode {
75
+ /// No translation or protection
75
76
Bare = 0 ,
77
+ /// Page-based 32-bit virtual addressing
76
78
Sv32 = 1 ,
77
79
}
78
80
79
- #[ cfg( riscv64) ]
81
+ /// 64-bit satp mode
82
+ #[ cfg( target_pointer_width = "64" ) ]
80
83
#[ derive( Clone , Copy , Debug , Eq , PartialEq ) ]
81
84
pub enum Mode {
85
+ /// No translation or protection
82
86
Bare = 0 ,
87
+ /// Page-based 39-bit virtual addressing
83
88
Sv39 = 8 ,
89
+ /// Page-based 48-bit virtual addressing
84
90
Sv48 = 9 ,
91
+ /// Page-based 57-bit virtual addressing
85
92
Sv57 = 10 ,
93
+ /// Page-based 64-bit virtual addressing
86
94
Sv64 = 11 ,
87
95
}
88
96
89
97
read_csr_as ! ( Satp , 0x180 , __read_satp) ;
90
98
write_csr_as_usize ! ( 0x180 , __write_satp) ;
91
99
100
+ /// Sets the register to corresponding page table mode, physical page number and address space id.
92
101
#[ inline]
93
- #[ cfg( riscv32 ) ]
102
+ #[ cfg( target_pointer_width = "32" ) ]
94
103
pub unsafe fn set ( mode : Mode , asid : usize , ppn : usize ) {
95
104
let mut bits = 0usize ;
96
105
bits. set_bits ( 31 ..32 , mode as usize ) ;
@@ -99,8 +108,9 @@ pub unsafe fn set(mode: Mode, asid: usize, ppn: usize) {
99
108
_write ( bits) ;
100
109
}
101
110
111
+ /// Sets the register to corresponding page table mode, physical page number and address space id.
102
112
#[ inline]
103
- #[ cfg( riscv64 ) ]
113
+ #[ cfg( target_pointer_width = "64" ) ]
104
114
pub unsafe fn set ( mode : Mode , asid : usize , ppn : usize ) {
105
115
let mut bits = 0usize ;
106
116
bits. set_bits ( 60 ..64 , mode as usize ) ;
0 commit comments