162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-only */ 262306a36Sopenharmony_ci#ifndef _TESTCASES_MMAP_TEST_H 362306a36Sopenharmony_ci#define _TESTCASES_MMAP_TEST_H 462306a36Sopenharmony_ci#include <sys/mman.h> 562306a36Sopenharmony_ci#include <sys/resource.h> 662306a36Sopenharmony_ci#include <stddef.h> 762306a36Sopenharmony_ci 862306a36Sopenharmony_ci#define TOP_DOWN 0 962306a36Sopenharmony_ci#define BOTTOM_UP 1 1062306a36Sopenharmony_ci 1162306a36Sopenharmony_cistruct addresses { 1262306a36Sopenharmony_ci int *no_hint; 1362306a36Sopenharmony_ci int *on_37_addr; 1462306a36Sopenharmony_ci int *on_38_addr; 1562306a36Sopenharmony_ci int *on_46_addr; 1662306a36Sopenharmony_ci int *on_47_addr; 1762306a36Sopenharmony_ci int *on_55_addr; 1862306a36Sopenharmony_ci int *on_56_addr; 1962306a36Sopenharmony_ci}; 2062306a36Sopenharmony_ci 2162306a36Sopenharmony_ci// Only works on 64 bit 2262306a36Sopenharmony_ci#if __riscv_xlen == 64 2362306a36Sopenharmony_cistatic inline void do_mmaps(struct addresses *mmap_addresses) 2462306a36Sopenharmony_ci{ 2562306a36Sopenharmony_ci /* 2662306a36Sopenharmony_ci * Place all of the hint addresses on the boundaries of mmap 2762306a36Sopenharmony_ci * sv39, sv48, sv57 2862306a36Sopenharmony_ci * User addresses end at 1<<38, 1<<47, 1<<56 respectively 2962306a36Sopenharmony_ci */ 3062306a36Sopenharmony_ci void *on_37_bits = (void *)(1UL << 37); 3162306a36Sopenharmony_ci void *on_38_bits = (void *)(1UL << 38); 3262306a36Sopenharmony_ci void *on_46_bits = (void *)(1UL << 46); 3362306a36Sopenharmony_ci void *on_47_bits = (void *)(1UL << 47); 3462306a36Sopenharmony_ci void *on_55_bits = (void *)(1UL << 55); 3562306a36Sopenharmony_ci void *on_56_bits = (void *)(1UL << 56); 3662306a36Sopenharmony_ci 3762306a36Sopenharmony_ci int prot = PROT_READ | PROT_WRITE; 3862306a36Sopenharmony_ci int flags = MAP_PRIVATE | MAP_ANONYMOUS; 3962306a36Sopenharmony_ci 4062306a36Sopenharmony_ci mmap_addresses->no_hint = 4162306a36Sopenharmony_ci mmap(NULL, 5 * sizeof(int), prot, flags, 0, 0); 4262306a36Sopenharmony_ci mmap_addresses->on_37_addr = 4362306a36Sopenharmony_ci mmap(on_37_bits, 5 * sizeof(int), prot, flags, 0, 0); 4462306a36Sopenharmony_ci mmap_addresses->on_38_addr = 4562306a36Sopenharmony_ci mmap(on_38_bits, 5 * sizeof(int), prot, flags, 0, 0); 4662306a36Sopenharmony_ci mmap_addresses->on_46_addr = 4762306a36Sopenharmony_ci mmap(on_46_bits, 5 * sizeof(int), prot, flags, 0, 0); 4862306a36Sopenharmony_ci mmap_addresses->on_47_addr = 4962306a36Sopenharmony_ci mmap(on_47_bits, 5 * sizeof(int), prot, flags, 0, 0); 5062306a36Sopenharmony_ci mmap_addresses->on_55_addr = 5162306a36Sopenharmony_ci mmap(on_55_bits, 5 * sizeof(int), prot, flags, 0, 0); 5262306a36Sopenharmony_ci mmap_addresses->on_56_addr = 5362306a36Sopenharmony_ci mmap(on_56_bits, 5 * sizeof(int), prot, flags, 0, 0); 5462306a36Sopenharmony_ci} 5562306a36Sopenharmony_ci#endif /* __riscv_xlen == 64 */ 5662306a36Sopenharmony_ci 5762306a36Sopenharmony_cistatic inline int memory_layout(void) 5862306a36Sopenharmony_ci{ 5962306a36Sopenharmony_ci int prot = PROT_READ | PROT_WRITE; 6062306a36Sopenharmony_ci int flags = MAP_PRIVATE | MAP_ANONYMOUS; 6162306a36Sopenharmony_ci 6262306a36Sopenharmony_ci void *value1 = mmap(NULL, sizeof(int), prot, flags, 0, 0); 6362306a36Sopenharmony_ci void *value2 = mmap(NULL, sizeof(int), prot, flags, 0, 0); 6462306a36Sopenharmony_ci 6562306a36Sopenharmony_ci return value2 > value1; 6662306a36Sopenharmony_ci} 6762306a36Sopenharmony_ci#endif /* _TESTCASES_MMAP_TEST_H */ 68