|
| 1 | +/* SPDX-License-Identifier: GPL-2.0-only */ |
| 2 | +#ifndef _TESTCASES_MMAP_TEST_H |
| 3 | +#define _TESTCASES_MMAP_TEST_H |
| 4 | +#include <sys/mman.h> |
| 5 | +#include <sys/resource.h> |
| 6 | +#include <stddef.h> |
| 7 | + |
| 8 | +#define TOP_DOWN 0 |
| 9 | +#define BOTTOM_UP 1 |
| 10 | + |
| 11 | +struct addresses { |
| 12 | + int *no_hint; |
| 13 | + int *on_37_addr; |
| 14 | + int *on_38_addr; |
| 15 | + int *on_46_addr; |
| 16 | + int *on_47_addr; |
| 17 | + int *on_55_addr; |
| 18 | + int *on_56_addr; |
| 19 | +}; |
| 20 | + |
| 21 | +static inline void do_mmaps(struct addresses *mmap_addresses) |
| 22 | +{ |
| 23 | + /* |
| 24 | + * Place all of the hint addresses on the boundaries of mmap |
| 25 | + * sv39, sv48, sv57 |
| 26 | + * User addresses end at 1<<38, 1<<47, 1<<56 respectively |
| 27 | + */ |
| 28 | + void *on_37_bits = (void *)(1UL << 37); |
| 29 | + void *on_38_bits = (void *)(1UL << 38); |
| 30 | + void *on_46_bits = (void *)(1UL << 46); |
| 31 | + void *on_47_bits = (void *)(1UL << 47); |
| 32 | + void *on_55_bits = (void *)(1UL << 55); |
| 33 | + void *on_56_bits = (void *)(1UL << 56); |
| 34 | + |
| 35 | + int prot = PROT_READ | PROT_WRITE; |
| 36 | + int flags = MAP_PRIVATE | MAP_ANONYMOUS; |
| 37 | + |
| 38 | + mmap_addresses->no_hint = |
| 39 | + mmap(NULL, 5 * sizeof(int), prot, flags, 0, 0); |
| 40 | + mmap_addresses->on_37_addr = |
| 41 | + mmap(on_37_bits, 5 * sizeof(int), prot, flags, 0, 0); |
| 42 | + mmap_addresses->on_38_addr = |
| 43 | + mmap(on_38_bits, 5 * sizeof(int), prot, flags, 0, 0); |
| 44 | + mmap_addresses->on_46_addr = |
| 45 | + mmap(on_46_bits, 5 * sizeof(int), prot, flags, 0, 0); |
| 46 | + mmap_addresses->on_47_addr = |
| 47 | + mmap(on_47_bits, 5 * sizeof(int), prot, flags, 0, 0); |
| 48 | + mmap_addresses->on_55_addr = |
| 49 | + mmap(on_55_bits, 5 * sizeof(int), prot, flags, 0, 0); |
| 50 | + mmap_addresses->on_56_addr = |
| 51 | + mmap(on_56_bits, 5 * sizeof(int), prot, flags, 0, 0); |
| 52 | +} |
| 53 | + |
| 54 | +static inline int memory_layout(void) |
| 55 | +{ |
| 56 | + int prot = PROT_READ | PROT_WRITE; |
| 57 | + int flags = MAP_PRIVATE | MAP_ANONYMOUS; |
| 58 | + |
| 59 | + void *value1 = mmap(NULL, sizeof(int), prot, flags, 0, 0); |
| 60 | + void *value2 = mmap(NULL, sizeof(int), prot, flags, 0, 0); |
| 61 | + |
| 62 | + return value2 > value1; |
| 63 | +} |
| 64 | +#endif /* _TESTCASES_MMAP_TEST_H */ |
0 commit comments