Improve the test framework for MM syscalls

This commit is contained in:
Ruihan Li
2025-06-21 23:43:46 +08:00
committed by Jianfeng Jiang
parent 93015a6090
commit ee542e043e
4 changed files with 34 additions and 56 deletions

View File

@ -1,48 +1,35 @@
// SPDX-License-Identifier: MPL-2.0
#define _GNU_SOURCE
#include <stdio.h>
#include <stdlib.h>
#include <sys/mman.h>
#include <unistd.h>
#include <string.h>
#include <errno.h>
#include "../network/test.h"
#define PAGE_SIZE 4096
const char *content = "kjfkljk*wigo&h";
void *x_mmap(void *addr, size_t length, int prot, int flags, int fd,
off_t offset)
{
void *result = mmap(addr, length, prot, flags, fd, offset);
if (result == MAP_FAILED) {
perror("mmap");
exit(EXIT_FAILURE);
}
return result;
}
#define CHECK_MM(func) CHECK_WITH(func, _ret != MAP_FAILED)
FN_TEST(mmap_and_mremap)
{
char *addr = x_mmap(NULL, 3 * PAGE_SIZE, PROT_READ | PROT_WRITE,
MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
char *addr = CHECK_MM(mmap(NULL, 3 * PAGE_SIZE, PROT_READ | PROT_WRITE,
MAP_PRIVATE | MAP_ANONYMOUS, -1, 0));
TEST_SUCC(munmap(addr, 3 * PAGE_SIZE));
addr = x_mmap(addr, PAGE_SIZE, PROT_READ | PROT_WRITE,
MAP_PRIVATE | MAP_ANONYMOUS | MAP_FIXED, -1, 0);
addr = CHECK_MM(mmap(addr, PAGE_SIZE, PROT_READ | PROT_WRITE,
MAP_PRIVATE | MAP_ANONYMOUS | MAP_FIXED, -1, 0));
strcpy(addr, content);
char *addr2 = x_mmap(addr + 2 * PAGE_SIZE, PAGE_SIZE,
PROT_READ | PROT_WRITE,
MAP_PRIVATE | MAP_ANONYMOUS | MAP_FIXED, -1, 0);
char *addr2 = CHECK_MM(
mmap(addr + 2 * PAGE_SIZE, PAGE_SIZE, PROT_READ | PROT_WRITE,
MAP_PRIVATE | MAP_ANONYMOUS | MAP_FIXED, -1, 0));
char *new_addr = mremap(addr, PAGE_SIZE, 3 * PAGE_SIZE, MREMAP_MAYMOVE);
if (new_addr == MAP_FAILED) {
perror("mremap");
exit(EXIT_FAILURE);
}
char *new_addr = CHECK_MM(
mremap(addr, PAGE_SIZE, 3 * PAGE_SIZE, MREMAP_MAYMOVE));
// The following operation (if uncommented) would cause a segmentation fault.
// strcpy(addr, "Writing to old address");
@ -58,8 +45,8 @@ END_TEST()
FN_TEST(mmap_and_mremap_fixed)
{
char *addr1 = x_mmap(NULL, PAGE_SIZE * 2, PROT_READ | PROT_WRITE,
MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
char *addr1 = CHECK_MM(mmap(NULL, PAGE_SIZE * 2, PROT_READ | PROT_WRITE,
MAP_PRIVATE | MAP_ANONYMOUS, -1, 0));
strcpy(addr1, content);
// Unmap a target region to ensure we know it's free
@ -67,19 +54,15 @@ FN_TEST(mmap_and_mremap_fixed)
TEST_SUCC(munmap(addr2, PAGE_SIZE)); // free it for mremap
// Remap from the first address to the second address
if (mremap(addr1, PAGE_SIZE, PAGE_SIZE, MREMAP_MAYMOVE | MREMAP_FIXED,
addr2) != addr2) {
perror("mremap");
exit(EXIT_FAILURE);
}
CHECK_WITH(mremap(addr1, PAGE_SIZE, PAGE_SIZE,
MREMAP_MAYMOVE | MREMAP_FIXED, addr2),
_ret == addr2);
TEST_RES(strcmp(addr2, content), _ret == 0);
// Remap from the second address to the first address
if (mremap(addr2, PAGE_SIZE, PAGE_SIZE, MREMAP_MAYMOVE | MREMAP_FIXED,
addr1) != addr1) {
perror("mremap");
exit(EXIT_FAILURE);
}
CHECK_WITH(mremap(addr2, PAGE_SIZE, PAGE_SIZE,
MREMAP_MAYMOVE | MREMAP_FIXED, addr1),
_ret == addr1);
TEST_RES(strcmp(addr1, content), _ret == 0);
TEST_SUCC(munmap(addr1, PAGE_SIZE));