mirror of
https://github.com/jart/cosmopolitan.git
synced 2025-05-28 00:02:28 +00:00
Make mmap() work better
- Mapping file offsets now works on Windows - Mapping stack memory now works on OpenBSD
This commit is contained in:
parent
23a14b537c
commit
27c899af56
10 changed files with 71 additions and 56 deletions
|
@ -88,6 +88,42 @@ TEST(mmap, testMapFixed_destroysEverythingInItsPath) {
|
|||
EXPECT_NE(-1, munmap((void *)kFixedmapStart, FRAMESIZE * 3));
|
||||
}
|
||||
|
||||
TEST(mmap, customStackMemory_isAuthorized) {
|
||||
char *stack;
|
||||
uintptr_t w, r;
|
||||
ASSERT_NE(MAP_FAILED,
|
||||
(stack = mmap(NULL, STACKSIZE, PROT_READ | PROT_WRITE,
|
||||
MAP_ANONYMOUS | MAP_PRIVATE | MAP_GROWSDOWN, -1, 0)));
|
||||
asm("mov\t%%rsp,%0\n\t"
|
||||
"mov\t%2,%%rsp\n\t"
|
||||
"push\t%3\n\t"
|
||||
"pop\t%1\n\t"
|
||||
"mov\t%0,%%rsp"
|
||||
: "=&r"(w), "=&r"(r)
|
||||
: "rm"(stack + STACKSIZE - 8), "i"(123));
|
||||
ASSERT_EQ(123, r);
|
||||
}
|
||||
|
||||
TEST(mmap, fileOffset) {
|
||||
int fd;
|
||||
char *map;
|
||||
char testdir[PATH_MAX];
|
||||
sprintf(testdir, "o/tmp/%s.%d", program_invocation_short_name, getpid());
|
||||
ASSERT_NE(-1, makedirs(testdir, 0755));
|
||||
ASSERT_NE(-1, chdir(testdir));
|
||||
ASSERT_NE(-1, (fd = open("foo", O_CREAT | O_RDWR, 0644)));
|
||||
EXPECT_NE(-1, ftruncate(fd, FRAMESIZE * 2));
|
||||
EXPECT_NE(-1, pwrite(fd, "hello", 5, FRAMESIZE * 0));
|
||||
EXPECT_NE(-1, pwrite(fd, "there", 5, FRAMESIZE * 1));
|
||||
ASSERT_NE(MAP_FAILED, (map = mmap(NULL, FRAMESIZE, PROT_READ, MAP_PRIVATE, fd,
|
||||
FRAMESIZE)));
|
||||
EXPECT_EQ(0, memcmp(map, "there", 5), "%#.*s", 5, map);
|
||||
EXPECT_NE(-1, munmap(map, FRAMESIZE));
|
||||
EXPECT_NE(-1, close(fd));
|
||||
ASSERT_NE(-1, chdir("../../.."));
|
||||
ASSERT_NE(-1, rmrf(testdir));
|
||||
}
|
||||
|
||||
TEST(isheap, nullPtr) {
|
||||
ASSERT_FALSE(isheap(NULL));
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue