Browse Source

Make munmap use funmap2

jD91mZM2 4 years ago
parent
commit
4c148c1860

+ 3 - 0
.editorconfig

@@ -0,0 +1,3 @@
+[**.c]
+indent_size = 4
+indent_style = space

+ 1 - 3
Cargo.lock

@@ -297,7 +297,6 @@ dependencies = [
 [[package]]
 name = "redox_syscall"
 version = "0.1.56"
-source = "git+https://gitlab.redox-os.org/4lDO2/syscall?branch=mmap2#27fcecb30fb3154a9b45f66756d64f8f48281a7b"
 dependencies = [
  "bitflags 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
@@ -322,7 +321,7 @@ dependencies = [
  "posix-regex 0.1.0",
  "ralloc 1.0.0",
  "rand 0.5.6 (registry+https://github.com/rust-lang/crates.io-index)",
- "redox_syscall 0.1.56 (git+https://gitlab.redox-os.org/4lDO2/syscall?branch=mmap2)",
+ "redox_syscall 0.1.56",
  "sc 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
  "spin 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
@@ -567,7 +566,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
 "checksum rand_core 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "9c33a3c44ca05fa6f1807d8e6743f3824e8509beca625669633be0acbdf509dc"
 "checksum rand_core 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19"
 "checksum rand_hc 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c"
-"checksum redox_syscall 0.1.56 (git+https://gitlab.redox-os.org/4lDO2/syscall?branch=mmap2)" = "<none>"
 "checksum redox_syscall 0.1.56 (registry+https://github.com/rust-lang/crates.io-index)" = "2439c63f3f6139d1b57529d16bc3b8bb855230c8efcc5d3a896c8bea7c3b1e84"
 "checksum remove_dir_all 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)" = "3acd125665422973a33ac9d3dd2df85edad0f4ae9b00dafb1a05e43a9f5ef8e7"
 "checksum rustc_version 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)" = "c5f5376ea5e30ce23c03eb77cbe4962b988deead10910c372b226388b594c084"

+ 2 - 1
Cargo.toml

@@ -39,7 +39,8 @@ optional = true
 sc = "0.2.2"
 
 [target.'cfg(target_os = "redox")'.dependencies]
-redox_syscall = { git = "https://gitlab.redox-os.org/4lDO2/syscall", branch = "mmap2" }
+#redox_syscall = { git = "https://gitlab.redox-os.org/redox-os/syscall", rev = "0e1e7d5d" }
+redox_syscall = { path = "../kernel/syscall" }
 spin = "0.4.10"
 
 [features]

+ 1 - 1
redoxer.sh

@@ -2,7 +2,7 @@
 
 set -e
 
-if [[ "$(cargo install --list | grep '^redoxer ')" != "redoxer "* ]]
+if ! which redoxer
 then
     cargo install redoxer
 fi

+ 3 - 0
src/header/sys_mman/linux.rs

@@ -4,3 +4,6 @@ pub const PROT_READ: c_int = 0x0001;
 pub const PROT_WRITE: c_int = 0x0002;
 pub const PROT_EXEC: c_int = 0x0004;
 pub const PROT_NONE: c_int = 0x0000;
+
+pub const MAP_FIXED: c_int = 0x0010;
+pub const MAP_FIXED_NOREPLACE: c_int = 0x100000;

+ 0 - 1
src/header/sys_mman/mod.rs

@@ -17,7 +17,6 @@ pub mod sys;
 pub const MAP_SHARED: c_int = 0x0001;
 pub const MAP_PRIVATE: c_int = 0x0002;
 pub const MAP_TYPE: c_int = 0x000F;
-pub const MAP_FIXED: c_int = 0x0010;
 pub const MAP_ANON: c_int = 0x0020;
 pub const MAP_ANONYMOUS: c_int = MAP_ANON;
 

+ 3 - 0
src/header/sys_mman/redox.rs

@@ -4,3 +4,6 @@ pub const PROT_NONE: c_int = 0x0000;
 pub const PROT_EXEC: c_int = 0x0001;
 pub const PROT_WRITE: c_int = 0x0002;
 pub const PROT_READ: c_int = 0x0004;
+
+pub const MAP_FIXED: c_int = 0x0004;
+pub const MAP_FIXED_NOREPLACE: c_int = 0x000C;

+ 2 - 2
src/platform/redox/mod.rs

@@ -714,8 +714,8 @@ impl Pal for Sys {
         */
     }
 
-    unsafe fn munmap(addr: *mut c_void, _len: usize) -> c_int {
-        if e(syscall::funmap(addr as usize)) == !0 {
+    unsafe fn munmap(addr: *mut c_void, len: usize) -> c_int {
+        if e(syscall::funmap2(addr as usize, len)) == !0 {
             return !0;
         }
         0

+ 1 - 1
src/platform/redox/ptrace.rs

@@ -64,7 +64,7 @@ pub fn get_session(
                     first: true,
                     tracer: File::open(
                         &CString::new(format!("proc:{}/trace", pid)).unwrap(),
-                        NEW_FLAGS | fcntl::O_NONBLOCK,
+                        NEW_FLAGS,
                     )?,
                     mem: File::open(
                         &CString::new(format!("proc:{}/mem", pid)).unwrap(),

+ 2 - 1
tests/Makefile

@@ -19,7 +19,7 @@ EXPECT_NAMES=\
 	math \
 	netdb/getaddrinfo \
 	netdb/netdb \
-    ptrace \
+	ptrace \
 	regex \
 	select \
 	setjmp \
@@ -76,6 +76,7 @@ EXPECT_NAMES=\
 	string/strtok_r \
 	string/strsignal \
 	strings \
+	sys_mman \
 	time/asctime \
 	time/gmtime \
 	time/localtime \

+ 50 - 0
tests/sys_mman.c

@@ -0,0 +1,50 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <sys/mman.h>
+#include <unistd.h>
+
+#include "test_helpers.h"
+
+int main() {
+    int page_size = getpagesize();
+    printf("Page size: %d\n", page_size);
+
+    puts("Mapping 1 page of memory...");
+    char *map1 = mmap((void *) 0x200000000, (size_t) page_size, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS | MAP_FIXED_NOREPLACE, -1, 0);
+    puts("Mapping 3 pages of memory...");
+    char *map2 = mmap(map1 + page_size, (size_t) page_size * 3, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS | MAP_FIXED_NOREPLACE, -1, 0);
+
+    ERROR_IF(mmap, map1, == MAP_FAILED);
+    ERROR_IF(mmap, map2, == MAP_FAILED);
+
+    puts("Randomizing mapping #1");
+    for (int i = 0; i < page_size; ++i) {
+        map1[i] = (char) (rand() & 0xFF);
+    }
+    puts("Randomizing mapping #2");
+    for (int i = 0; i < page_size * 3; ++i) {
+        map2[i] = (char) (rand() & 0xFF);
+    }
+
+    puts("Unmapping page 2 of map2");
+    munmap(map2 + page_size, page_size);
+
+    puts("Randomizing page 1 of mapping #2");
+    for (int i = 0; i < page_size; ++i) {
+        map2[i] = (char) (rand() % 256);
+    }
+
+    puts("Randomizing page 3 of mapping #2");
+    for (int i = 0; i < page_size; ++i) {
+        map2[page_size * 2 + i] = (char) (rand() % 256);
+    }
+
+    // Page fault:
+    // map2[page_size] = 0;
+
+    puts("Unmapping it all at once!");
+    munmap(map1, (size_t) page_size * 4);
+
+    // Page fault:
+    // *map2 = 0;
+}