1
1
use alloc:: vec;
2
2
use axerrno:: { LinuxError , LinuxResult } ;
3
- use axhal:: paging:: MappingFlags ;
3
+ use axhal:: paging:: { MappingFlags , PageSize } ;
4
4
use axtask:: { TaskExtRef , current} ;
5
- use linux_raw_sys:: general:: {
6
- MAP_ANONYMOUS , MAP_FIXED , MAP_NORESERVE , MAP_PRIVATE , MAP_SHARED , MAP_STACK , PROT_EXEC ,
7
- PROT_GROWSDOWN , PROT_GROWSUP , PROT_READ , PROT_WRITE ,
8
- } ;
9
- use memory_addr:: { VirtAddr , VirtAddrRange } ;
5
+ use linux_raw_sys:: general:: * ;
6
+ use memory_addr:: { MemoryAddr , VirtAddr , VirtAddrRange , align_up_4k} ;
10
7
11
8
use crate :: file:: { File , FileLike } ;
12
9
@@ -63,6 +60,10 @@ bitflags::bitflags! {
63
60
const NORESERVE = MAP_NORESERVE ;
64
61
/// Allocation is for a stack.
65
62
const STACK = MAP_STACK ;
63
+ /// Huge page
64
+ const HUGE = MAP_HUGETLB ;
65
+ /// Huge page 1g size
66
+ const HUGE_1GB = MAP_HUGETLB | MAP_HUGE_1GB ;
66
67
}
67
68
}
68
69
@@ -81,14 +82,25 @@ pub fn sys_mmap(
81
82
// TODO: check illegal flags for mmap
82
83
// An example is the flags contained none of MAP_PRIVATE, MAP_SHARED, or MAP_SHARED_VALIDATE.
83
84
let map_flags = MmapFlags :: from_bits_truncate ( flags) ;
85
+ if map_flags. contains ( MmapFlags :: PRIVATE | MmapFlags :: SHARED ) {
86
+ return Err ( LinuxError :: EINVAL ) ;
87
+ }
84
88
85
89
info ! (
86
90
"sys_mmap: addr: {:x?}, length: {:x?}, prot: {:?}, flags: {:?}, fd: {:?}, offset: {:?}" ,
87
91
addr, length, permission_flags, map_flags, fd, offset
88
92
) ;
89
93
90
- let start = memory_addr:: align_down_4k ( addr) ;
91
- let end = memory_addr:: align_up_4k ( addr + length) ;
94
+ let page_size = if map_flags. contains ( MmapFlags :: HUGE_1GB ) {
95
+ PageSize :: Size1G
96
+ } else if map_flags. contains ( MmapFlags :: HUGE ) {
97
+ PageSize :: Size2M
98
+ } else {
99
+ PageSize :: Size4K
100
+ } ;
101
+
102
+ let start = addr. align_down ( page_size) ;
103
+ let end = ( addr + length) . align_up ( page_size) ;
92
104
let aligned_length = end - start;
93
105
debug ! (
94
106
"start: {:x?}, end: {:x?}, aligned_length: {:x?}" ,
@@ -108,11 +120,13 @@ pub fn sys_mmap(
108
120
VirtAddr :: from ( start) ,
109
121
aligned_length,
110
122
VirtAddrRange :: new ( aspace. base ( ) , aspace. end ( ) ) ,
123
+ page_size,
111
124
)
112
125
. or ( aspace. find_free_area (
113
126
aspace. base ( ) ,
114
127
aligned_length,
115
128
VirtAddrRange :: new ( aspace. base ( ) , aspace. end ( ) ) ,
129
+ page_size,
116
130
) )
117
131
. ok_or ( LinuxError :: ENOMEM ) ?
118
132
} ;
@@ -128,6 +142,7 @@ pub fn sys_mmap(
128
142
aligned_length,
129
143
permission_flags. into ( ) ,
130
144
populate,
145
+ page_size,
131
146
) ?;
132
147
133
148
if populate {
@@ -141,7 +156,7 @@ pub fn sys_mmap(
141
156
let length = core:: cmp:: min ( length, file_size - offset) ;
142
157
let mut buf = vec ! [ 0u8 ; length] ;
143
158
file. read_at ( & mut buf, offset as u64 ) ?;
144
- aspace. write ( start_addr, & buf) ?;
159
+ aspace. write ( start_addr, page_size , & buf) ?;
145
160
}
146
161
Ok ( start_addr. as_usize ( ) as _ )
147
162
}
@@ -150,7 +165,7 @@ pub fn sys_munmap(addr: usize, length: usize) -> LinuxResult<isize> {
150
165
let curr = current ( ) ;
151
166
let process_data = curr. task_ext ( ) . process_data ( ) ;
152
167
let mut aspace = process_data. aspace . lock ( ) ;
153
- let length = memory_addr :: align_up_4k ( length) ;
168
+ let length = align_up_4k ( length) ;
154
169
let start_addr = VirtAddr :: from ( addr) ;
155
170
aspace. unmap ( start_addr, length) ?;
156
171
axhal:: arch:: flush_tlb ( None ) ;
@@ -169,8 +184,9 @@ pub fn sys_mprotect(addr: usize, length: usize, prot: u32) -> LinuxResult<isize>
169
184
let curr = current ( ) ;
170
185
let process_data = curr. task_ext ( ) . process_data ( ) ;
171
186
let mut aspace = process_data. aspace . lock ( ) ;
172
- let length = memory_addr :: align_up_4k ( length) ;
187
+ let length = align_up_4k ( length) ;
173
188
let start_addr = VirtAddr :: from ( addr) ;
189
+ // TODO: is 4k right here?
174
190
aspace. protect ( start_addr, length, permission_flags. into ( ) ) ?;
175
191
176
192
Ok ( 0 )
0 commit comments