Skip to content

Commit 4fcfcf7

Browse files
Remove the parameter align from the populate_area function
1 parent 39a2574 commit 4fcfcf7

File tree

7 files changed

+333
-14
lines changed

7 files changed

+333
-14
lines changed

Cargo.lock

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ axsignal = { git = "https://github.com/Starry-OS/axsignal.git", rev = "b5b6089"
4141
axerrno = "0.1"
4242
bitflags = "2.6"
4343
cfg-if = "1.0"
44-
linkme = "0.3"
44+
linkme = "0.3.33"
4545
linux-raw-sys = { version = "0.9.3", default-features = false, features = [
4646
"no_std",
4747
"general",

api/Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ axio = "0.1.1"
3636
ctor_bare = "0.2.1"
3737
flatten_objects = "0.2.3"
3838
num_enum = { version = "0.7", default-features = false }
39+
page_table_multiarch = "0.5"
3940

4041
[target.'cfg(target_arch = "x86_64")'.dependencies]
4142
x86 = "0.52"

api/src/imp/mm/mmap.rs

Lines changed: 22 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,9 @@ use alloc::vec;
22
use axerrno::{LinuxError, LinuxResult};
33
use axhal::paging::MappingFlags;
44
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};
7+
use page_table_multiarch::PageSize;
108

119
use crate::file::{File, FileLike};
1210

@@ -81,14 +79,26 @@ pub fn sys_mmap(
8179
// TODO: check illegal flags for mmap
8280
// An example is the flags contained none of MAP_PRIVATE, MAP_SHARED, or MAP_SHARED_VALIDATE.
8381
let map_flags = MmapFlags::from_bits_truncate(flags);
82+
if map_flags.contains(MmapFlags::from_bits_truncate(MAP_PRIVATE | MAP_SHARED)) {
83+
return Err(LinuxError::EINVAL);
84+
}
8485

8586
info!(
8687
"sys_mmap: addr: {:x?}, length: {:x?}, prot: {:?}, flags: {:?}, fd: {:?}, offset: {:?}",
8788
addr, length, permission_flags, map_flags, fd, offset
8889
);
8990

90-
let start = memory_addr::align_down_4k(addr);
91-
let end = memory_addr::align_up_4k(addr + length);
91+
let page_size = if flags & MAP_HUGETLB == 0 {
92+
PageSize::Size4K
93+
} else {
94+
match flags & MAP_HUGE_MASK << MAP_HUGE_SHIFT {
95+
MAP_HUGE_1GB => PageSize::Size1G,
96+
_ => PageSize::Size2M,
97+
}
98+
};
99+
100+
let start = addr.align_down(page_size);
101+
let end = (addr + length).align_up(page_size);
92102
let aligned_length = end - start;
93103
debug!(
94104
"start: {:x?}, end: {:x?}, aligned_length: {:x?}",
@@ -108,11 +118,13 @@ pub fn sys_mmap(
108118
VirtAddr::from(start),
109119
aligned_length,
110120
VirtAddrRange::new(aspace.base(), aspace.end()),
121+
page_size,
111122
)
112123
.or(aspace.find_free_area(
113124
aspace.base(),
114125
aligned_length,
115126
VirtAddrRange::new(aspace.base(), aspace.end()),
127+
page_size,
116128
))
117129
.ok_or(LinuxError::ENOMEM)?
118130
};
@@ -128,6 +140,7 @@ pub fn sys_mmap(
128140
aligned_length,
129141
permission_flags.into(),
130142
populate,
143+
page_size,
131144
)?;
132145

133146
if populate {
@@ -141,7 +154,7 @@ pub fn sys_mmap(
141154
let length = core::cmp::min(length, file_size - offset);
142155
let mut buf = vec![0u8; length];
143156
file.read_at(offset as u64, &mut buf)?;
144-
aspace.write(start_addr, &buf)?;
157+
aspace.write(start_addr, page_size, &buf)?;
145158
}
146159
Ok(start_addr.as_usize() as _)
147160
}
@@ -150,8 +163,8 @@ pub fn sys_munmap(addr: usize, length: usize) -> LinuxResult<isize> {
150163
let curr = current();
151164
let process_data = curr.task_ext().process_data();
152165
let mut aspace = process_data.aspace.lock();
153-
let length = memory_addr::align_up_4k(length);
154166
let start_addr = VirtAddr::from(addr);
167+
let length = memory_addr::align_up_4k(length);
155168
aspace.unmap(start_addr, length)?;
156169
axhal::arch::flush_tlb(None);
157170
Ok(0)

0 commit comments

Comments
 (0)