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