mirror of
https://github.com/jart/cosmopolitan.git
synced 2025-06-26 22:38:30 +00:00
Add some documentation
This commit is contained in:
parent
567d8fe32d
commit
1ff037df3c
5 changed files with 177 additions and 22 deletions
|
@ -22,6 +22,7 @@
|
|||
#include "libc/errno.h"
|
||||
#include "libc/intrin/maps.h"
|
||||
#include "libc/limits.h"
|
||||
#include "libc/literal.h"
|
||||
#include "libc/runtime/runtime.h"
|
||||
#include "libc/runtime/sysconf.h"
|
||||
#include "libc/stdio/rand.h"
|
||||
|
@ -146,7 +147,6 @@ TEST(mmap, hint) {
|
|||
TEST(mprotect, punchHoleAndFillHole) {
|
||||
char *p;
|
||||
int count = __maps.count;
|
||||
int gransz = getgransize();
|
||||
|
||||
// obtain memory
|
||||
ASSERT_NE(MAP_FAILED,
|
||||
|
@ -223,16 +223,17 @@ TEST(mmap, testMapFile_fdGetsClosed_makesNoDifference) {
|
|||
TEST(mmap, fileOffset) {
|
||||
int fd;
|
||||
char *map;
|
||||
int offset_align = IsWindows() ? gransz : getpagesize();
|
||||
ASSERT_NE(-1, (fd = open("foo", O_CREAT | O_RDWR, 0644)));
|
||||
EXPECT_NE(-1, ftruncate(fd, offset_align * 2));
|
||||
EXPECT_NE(-1, pwrite(fd, "hello", 5, offset_align * 0));
|
||||
EXPECT_NE(-1, pwrite(fd, "there", 5, offset_align * 1));
|
||||
EXPECT_NE(-1, ftruncate(fd, gransz * 2));
|
||||
EXPECT_NE(-1, pwrite(fd, "hello", 5, gransz * 0));
|
||||
EXPECT_NE(-1, pwrite(fd, "there", 5, gransz * 1));
|
||||
EXPECT_NE(-1, fdatasync(fd));
|
||||
ASSERT_NE(MAP_FAILED, (map = mmap(NULL, offset_align, PROT_READ, MAP_PRIVATE,
|
||||
fd, offset_align)));
|
||||
ASSERT_SYS(EINVAL, MAP_FAILED,
|
||||
mmap(NULL, gransz, PROT_READ, MAP_PRIVATE, fd, gransz - 1));
|
||||
ASSERT_NE(MAP_FAILED,
|
||||
(map = mmap(NULL, gransz, PROT_READ, MAP_PRIVATE, fd, gransz)));
|
||||
EXPECT_EQ(0, memcmp(map, "there", 5), "%#.*s", 5, map);
|
||||
EXPECT_NE(-1, munmap(map, offset_align));
|
||||
EXPECT_NE(-1, munmap(map, gransz));
|
||||
EXPECT_NE(-1, close(fd));
|
||||
}
|
||||
|
||||
|
@ -263,6 +264,67 @@ TEST(mmap, ziposCannotBeShared) {
|
|||
close(fd);
|
||||
}
|
||||
|
||||
TEST(mmap, misalignedAddr_justIgnoresIt) {
|
||||
char *p;
|
||||
ASSERT_NE(MAP_FAILED, (p = mmap((void *)1, 1, PROT_READ,
|
||||
MAP_ANONYMOUS | MAP_PRIVATE, -1, 0)));
|
||||
munmap(p, 1);
|
||||
}
|
||||
|
||||
TEST(mmap, nullFixed_isNotAllowed) {
|
||||
ASSERT_SYS(
|
||||
EPERM, MAP_FAILED,
|
||||
mmap(0, 1, PROT_NONE, MAP_ANONYMOUS | MAP_PRIVATE | MAP_FIXED, -1, 0));
|
||||
ASSERT_SYS(EPERM, MAP_FAILED,
|
||||
mmap(0, 1, PROT_NONE,
|
||||
MAP_ANONYMOUS | MAP_PRIVATE | MAP_FIXED_NOREPLACE, -1, 0));
|
||||
}
|
||||
|
||||
static int GetBitsInAddressSpace(void) {
|
||||
int i;
|
||||
void *ptr;
|
||||
uint64_t want;
|
||||
for (i = 0; i < 40; ++i) {
|
||||
want = UINT64_C(0x8123000000000000) >> i;
|
||||
if (want > UINTPTR_MAX)
|
||||
continue;
|
||||
if (msync((void *)(uintptr_t)want, 1, MS_ASYNC) == 0 || errno == EBUSY)
|
||||
return 64 - i;
|
||||
ptr = mmap((void *)(uintptr_t)want, 1, PROT_READ,
|
||||
MAP_PRIVATE | MAP_FIXED | MAP_ANONYMOUS, -1, 0);
|
||||
if (ptr != MAP_FAILED) {
|
||||
munmap(ptr, 1);
|
||||
return 64 - i;
|
||||
}
|
||||
}
|
||||
abort();
|
||||
}
|
||||
|
||||
TEST(mmap, negative_isNotAllowed) {
|
||||
ASSERT_SYS(ENOMEM, MAP_FAILED,
|
||||
mmap((void *)-(70 * 1024 * 1024), 1, PROT_NONE,
|
||||
MAP_ANONYMOUS | MAP_PRIVATE | MAP_FIXED, -1, 0));
|
||||
}
|
||||
|
||||
TEST(mmap, pml5t) {
|
||||
switch (GetBitsInAddressSpace()) {
|
||||
case 56:
|
||||
ASSERT_EQ((void *)0x00fff2749119c000,
|
||||
mmap((void *)0x00fff2749119c000, 1, PROT_NONE,
|
||||
MAP_ANONYMOUS | MAP_PRIVATE | MAP_FIXED, -1, 0));
|
||||
munmap((void *)0x00fff2749119c000, 1);
|
||||
break;
|
||||
case 48:
|
||||
ASSERT_EQ((void *)0x0000f2749119c000,
|
||||
mmap((void *)0x0000f2749119c000, 1, PROT_NONE,
|
||||
MAP_ANONYMOUS | MAP_PRIVATE | MAP_FIXED, -1, 0));
|
||||
munmap((void *)0x0000f2749119c000, 1);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
// zipos NON-SHARED READ-ONLY FILE MEMORY
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue