The pointer returned by mmap() and mremap() has extra properties in PCuABI, indicating ownership of the mapping. Certain mmap and mremap tests rely on an mmap() + munmap() sequence to make sure that an address range is not mapped. In this case, a subsequent call to mmap/mremap should simply pass the address of that range, not a capability owning it, because at that point the underlying reservation will have disappeared.
Note: this pattern is acceptable in the current implementation of reservations where they are destroyed synchronously with the last mapping within them. This should not be assumed in general, but given the difficulty to remove that assumption it is kept for now.
Signed-off-by: Kevin Brodsky kevin.brodsky@arm.com --- testcases/kernel/syscalls/mmap/mmap16.c | 3 ++- testcases/kernel/syscalls/mmap/mmap19.c | 4 ++-- testcases/kernel/syscalls/mremap/mremap05.c | 4 +++- 3 files changed, 7 insertions(+), 4 deletions(-)
diff --git a/testcases/kernel/syscalls/mmap/mmap16.c b/testcases/kernel/syscalls/mmap/mmap16.c index 4e0d8a3f4249..64fb02fa4034 100644 --- a/testcases/kernel/syscalls/mmap/mmap16.c +++ b/testcases/kernel/syscalls/mmap/mmap16.c @@ -67,7 +67,8 @@ static void do_child(void) MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); SAFE_MUNMAP(addr, page_size * 2);
- addr = SAFE_MMAP(addr, FS_BLOCKSIZE, PROT_WRITE | PROT_READ, MAP_SHARED, childfd, 0); + addr = SAFE_MMAP((void *)(ptraddr_t)addr, FS_BLOCKSIZE, + PROT_WRITE | PROT_READ, MAP_SHARED, childfd, 0);
addr[0] = 'a';
diff --git a/testcases/kernel/syscalls/mmap/mmap19.c b/testcases/kernel/syscalls/mmap/mmap19.c index 90b3f45b1f63..e6e04dcc1bde 100644 --- a/testcases/kernel/syscalls/mmap/mmap19.c +++ b/testcases/kernel/syscalls/mmap/mmap19.c @@ -52,8 +52,8 @@ static void run(void) SAFE_MUNMAP(mm1, LEN); SAFE_MUNMAP(mm2, LEN);
- mm1 = SAFE_MMAP(save_mm2, LEN, PROT_READ, MAP_PRIVATE, f1, 0); - mm2 = SAFE_MMAP(save_mm1, LEN, PROT_READ, MAP_PRIVATE, f2, 0); + mm1 = SAFE_MMAP((void *)(ptraddr_t)save_mm2, LEN, PROT_READ, MAP_PRIVATE, f1, 0); + mm2 = SAFE_MMAP((void *)(ptraddr_t)save_mm1, LEN, PROT_READ, MAP_PRIVATE, f2, 0);
if (mm1 != save_mm2 || mm2 != save_mm1) tst_res(TINFO, "mmap not using same address"); diff --git a/testcases/kernel/syscalls/mremap/mremap05.c b/testcases/kernel/syscalls/mremap/mremap05.c index d85ebb068dc4..1e9f6c162ce3 100644 --- a/testcases/kernel/syscalls/mremap/mremap05.c +++ b/testcases/kernel/syscalls/mremap/mremap05.c @@ -128,8 +128,10 @@ static void *get_test_area(int size, int free_area) MAP_PRIVATE | MAP_ANONYMOUS, 0, 0); if (p == MAP_FAILED) tst_brkm(TBROK | TERRNO, cleanup, "get_test_area mmap"); - if (free_area) + if (free_area) { free_test_area(p, size); + p = (void *)(ptraddr_t)p; + } return p; }