@@ -29,33 +29,46 @@ TEST(LlvmLibcMincoreTest, UnMappedMemory) {
29
29
EXPECT_THAT (res, Fails (ENOMEM, -1 ));
30
30
}
31
31
32
+ // It is always possible to find an aligned boundary if we allocate page sized
33
+ // memory.
34
+ static char *aligned_addr (void *addr, size_t alignment) {
35
+ char *byte_addr = static_cast <char *>(addr);
36
+ uintptr_t addr_val = reinterpret_cast <uintptr_t >(addr);
37
+ uintptr_t offset =
38
+ addr_val % alignment == 0 ? 0 : alignment - (addr_val % alignment);
39
+ return byte_addr + offset;
40
+ }
41
+
32
42
TEST (LlvmLibcMincoreTest, InvalidVec) {
33
43
size_t page_size = static_cast <size_t >(LIBC_NAMESPACE::sysconf (_SC_PAGESIZE));
34
- void *addr = LIBC_NAMESPACE::mmap (nullptr , 4 * page_size, PROT_READ,
44
+ void *addr = LIBC_NAMESPACE::mmap (nullptr , 5 * page_size, PROT_READ,
35
45
MAP_ANONYMOUS | MAP_PRIVATE, -1 , 0 );
36
46
EXPECT_NE (addr, MAP_FAILED);
37
- EXPECT_EQ (reinterpret_cast <unsigned long >(addr) % page_size, 0ul );
47
+ // Since we allocated 5 pages, we can find an aligned boundary after which
48
+ // there are at least 4 pages
49
+ char *aligned = aligned_addr (addr, page_size);
38
50
libc_errno = 0 ;
39
- int res = LIBC_NAMESPACE::mincore (addr , 1 , nullptr );
51
+ int res = LIBC_NAMESPACE::mincore (aligned , 1 , nullptr );
40
52
EXPECT_THAT (res, Fails (EFAULT, -1 ));
41
53
void *area = LIBC_NAMESPACE::mmap (nullptr , page_size, PROT_READ | PROT_WRITE,
42
54
MAP_ANONYMOUS | MAP_PRIVATE, -1 , 0 );
43
55
EXPECT_NE (area, MAP_FAILED);
44
56
unsigned char *ptr = static_cast <unsigned char *>(area) + page_size - 3 ;
45
- res = LIBC_NAMESPACE::mincore (addr , 4 * page_size, ptr);
57
+ res = LIBC_NAMESPACE::mincore (aligned , 4 * page_size, ptr);
46
58
EXPECT_THAT (res, Fails (EFAULT, -1 ));
47
- EXPECT_THAT (LIBC_NAMESPACE::munmap (addr, page_size), Succeeds ());
48
- EXPECT_THAT (LIBC_NAMESPACE::munmap (area, 2 ), Succeeds ());
59
+ EXPECT_THAT (LIBC_NAMESPACE::munmap (addr, 5 * page_size), Succeeds ());
60
+ EXPECT_THAT (LIBC_NAMESPACE::munmap (area, page_size ), Succeeds ());
49
61
}
50
62
51
63
TEST (LlvmLibcMincoreTest, UnalignedAddr) {
52
64
size_t page_size = static_cast <size_t >(LIBC_NAMESPACE::sysconf (_SC_PAGESIZE));
53
65
void *addr = LIBC_NAMESPACE::mmap (nullptr , page_size, PROT_READ,
54
66
MAP_ANONYMOUS | MAP_PRIVATE, -1 , 0 );
55
67
EXPECT_NE (addr, MAP_FAILED);
56
- EXPECT_EQ ( reinterpret_cast < unsigned long >(addr) % page_size, 0ul );
68
+ char *aligned = aligned_addr (addr, page_size );
57
69
libc_errno = 0 ;
58
- int res = LIBC_NAMESPACE::mincore (static_cast <char *>(addr) + 1 , 1 , nullptr );
70
+ int res =
71
+ LIBC_NAMESPACE::mincore (static_cast <char *>(aligned) + 1 , 1 , nullptr );
59
72
EXPECT_THAT (res, Fails (EINVAL, -1 ));
60
73
EXPECT_THAT (LIBC_NAMESPACE::munmap (addr, page_size), Succeeds ());
61
74
}
@@ -65,10 +78,10 @@ TEST(LlvmLibcMincoreTest, NoError) {
65
78
void *addr = LIBC_NAMESPACE::mmap (nullptr , page_size, PROT_READ,
66
79
MAP_ANONYMOUS | MAP_PRIVATE, -1 , 0 );
67
80
EXPECT_NE (addr, MAP_FAILED);
68
- EXPECT_EQ ( reinterpret_cast < unsigned long >(addr) % page_size, 0ul );
81
+ char *aligned = aligned_addr (addr, page_size );
69
82
unsigned char vec;
70
83
libc_errno = 0 ;
71
- int res = LIBC_NAMESPACE::mincore (addr , 1 , &vec);
84
+ int res = LIBC_NAMESPACE::mincore (aligned , 1 , &vec);
72
85
EXPECT_THAT (res, Succeeds ());
73
86
EXPECT_THAT (LIBC_NAMESPACE::munmap (addr, page_size), Succeeds ());
74
87
}
@@ -78,42 +91,44 @@ TEST(LlvmLibcMincoreTest, NegativeLength) {
78
91
void *addr = LIBC_NAMESPACE::mmap (nullptr , page_size, PROT_READ,
79
92
MAP_ANONYMOUS | MAP_PRIVATE, -1 , 0 );
80
93
EXPECT_NE (addr, MAP_FAILED);
81
- EXPECT_EQ ( reinterpret_cast < unsigned long >(addr) % page_size, 0ul );
94
+ char *aligned = aligned_addr (addr, page_size );
82
95
unsigned char vec;
83
96
libc_errno = 0 ;
84
- int res = LIBC_NAMESPACE::mincore (addr , -1 , &vec);
97
+ int res = LIBC_NAMESPACE::mincore (aligned , -1 , &vec);
85
98
EXPECT_THAT (res, Fails (ENOMEM, -1 ));
86
99
EXPECT_THAT (LIBC_NAMESPACE::munmap (addr, page_size), Succeeds ());
87
100
}
88
101
89
102
TEST (LlvmLibcMincoreTest, PageOut) {
90
103
unsigned char vec;
91
104
size_t page_size = static_cast <size_t >(LIBC_NAMESPACE::sysconf (_SC_PAGESIZE));
92
- void *addr = LIBC_NAMESPACE::mmap (nullptr , page_size, PROT_READ | PROT_WRITE,
93
- MAP_ANONYMOUS | MAP_PRIVATE, -1 , 0 );
105
+ // allocate 2 pages since we need to page out page_size bytes
106
+ void *addr =
107
+ LIBC_NAMESPACE::mmap (nullptr , 2 * page_size, PROT_READ | PROT_WRITE,
108
+ MAP_ANONYMOUS | MAP_PRIVATE, -1 , 0 );
94
109
EXPECT_NE (addr, MAP_FAILED);
95
- EXPECT_EQ ( reinterpret_cast < unsigned long >(addr) % page_size, 0ul );
110
+ char *aligned = aligned_addr (addr, page_size );
96
111
97
112
// touch the page
98
113
{
99
- static_cast < char *>(addr) [0 ] = 0 ;
114
+ aligned [0 ] = 0 ;
100
115
libc_errno = 0 ;
101
- int res = LIBC_NAMESPACE::mincore (addr , 1 , &vec);
116
+ int res = LIBC_NAMESPACE::mincore (aligned , 1 , &vec);
102
117
EXPECT_EQ (vec & 1u , 1u );
103
118
EXPECT_THAT (res, Succeeds ());
104
119
}
105
120
106
121
// page out the memory
107
122
{
108
123
libc_errno = 0 ;
109
- EXPECT_THAT (LIBC_NAMESPACE::madvise (addr , page_size, MADV_DONTNEED),
124
+ EXPECT_THAT (LIBC_NAMESPACE::madvise (aligned , page_size, MADV_DONTNEED),
110
125
Succeeds ());
111
126
112
127
libc_errno = 0 ;
113
- int res = LIBC_NAMESPACE::mincore (addr, page_size , &vec);
128
+ int res = LIBC_NAMESPACE::mincore (aligned, 1 , &vec);
114
129
EXPECT_EQ (vec & 1u , 0u );
115
130
EXPECT_THAT (res, Succeeds ());
116
131
}
117
132
118
- EXPECT_THAT (LIBC_NAMESPACE::munmap (addr, page_size), Succeeds ());
133
+ EXPECT_THAT (LIBC_NAMESPACE::munmap (addr, 2 * page_size), Succeeds ());
119
134
}
0 commit comments