Skip to content

Commit 73d0526

Browse files
charlie-rivospalmer-dabbelt
authored andcommitted
selftests: riscv: Generalize mm selftests
The behavior of mmap on riscv is defined to not provide an address that uses more bits than the hint address, if provided. Make the tests reflect that. Signed-off-by: Charlie Jenkins <[email protected]> Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Palmer Dabbelt <[email protected]>
1 parent b5b4287 commit 73d0526

File tree

3 files changed

+67
-86
lines changed

3 files changed

+67
-86
lines changed

tools/testing/selftests/riscv/mm/mmap_bottomup.c

Lines changed: 1 addition & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -6,30 +6,9 @@
66

77
TEST(infinite_rlimit)
88
{
9-
// Only works on 64 bit
10-
#if __riscv_xlen == 64
11-
struct addresses mmap_addresses;
12-
139
EXPECT_EQ(BOTTOM_UP, memory_layout());
1410

15-
do_mmaps(&mmap_addresses);
16-
17-
EXPECT_NE(MAP_FAILED, mmap_addresses.no_hint);
18-
EXPECT_NE(MAP_FAILED, mmap_addresses.on_37_addr);
19-
EXPECT_NE(MAP_FAILED, mmap_addresses.on_38_addr);
20-
EXPECT_NE(MAP_FAILED, mmap_addresses.on_46_addr);
21-
EXPECT_NE(MAP_FAILED, mmap_addresses.on_47_addr);
22-
EXPECT_NE(MAP_FAILED, mmap_addresses.on_55_addr);
23-
EXPECT_NE(MAP_FAILED, mmap_addresses.on_56_addr);
24-
25-
EXPECT_GT(1UL << 47, (unsigned long)mmap_addresses.no_hint);
26-
EXPECT_GT(1UL << 38, (unsigned long)mmap_addresses.on_37_addr);
27-
EXPECT_GT(1UL << 38, (unsigned long)mmap_addresses.on_38_addr);
28-
EXPECT_GT(1UL << 38, (unsigned long)mmap_addresses.on_46_addr);
29-
EXPECT_GT(1UL << 47, (unsigned long)mmap_addresses.on_47_addr);
30-
EXPECT_GT(1UL << 47, (unsigned long)mmap_addresses.on_55_addr);
31-
EXPECT_GT(1UL << 56, (unsigned long)mmap_addresses.on_56_addr);
32-
#endif
11+
TEST_MMAPS;
3312
}
3413

3514
TEST_HARNESS_MAIN

tools/testing/selftests/riscv/mm/mmap_default.c

Lines changed: 1 addition & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -6,30 +6,9 @@
66

77
TEST(default_rlimit)
88
{
9-
// Only works on 64 bit
10-
#if __riscv_xlen == 64
11-
struct addresses mmap_addresses;
12-
139
EXPECT_EQ(TOP_DOWN, memory_layout());
1410

15-
do_mmaps(&mmap_addresses);
16-
17-
EXPECT_NE(MAP_FAILED, mmap_addresses.no_hint);
18-
EXPECT_NE(MAP_FAILED, mmap_addresses.on_37_addr);
19-
EXPECT_NE(MAP_FAILED, mmap_addresses.on_38_addr);
20-
EXPECT_NE(MAP_FAILED, mmap_addresses.on_46_addr);
21-
EXPECT_NE(MAP_FAILED, mmap_addresses.on_47_addr);
22-
EXPECT_NE(MAP_FAILED, mmap_addresses.on_55_addr);
23-
EXPECT_NE(MAP_FAILED, mmap_addresses.on_56_addr);
24-
25-
EXPECT_GT(1UL << 47, (unsigned long)mmap_addresses.no_hint);
26-
EXPECT_GT(1UL << 38, (unsigned long)mmap_addresses.on_37_addr);
27-
EXPECT_GT(1UL << 38, (unsigned long)mmap_addresses.on_38_addr);
28-
EXPECT_GT(1UL << 38, (unsigned long)mmap_addresses.on_46_addr);
29-
EXPECT_GT(1UL << 47, (unsigned long)mmap_addresses.on_47_addr);
30-
EXPECT_GT(1UL << 47, (unsigned long)mmap_addresses.on_55_addr);
31-
EXPECT_GT(1UL << 56, (unsigned long)mmap_addresses.on_56_addr);
32-
#endif
11+
TEST_MMAPS;
3312
}
3413

3514
TEST_HARNESS_MAIN

tools/testing/selftests/riscv/mm/mmap_test.h

Lines changed: 65 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -4,60 +4,83 @@
44
#include <sys/mman.h>
55
#include <sys/resource.h>
66
#include <stddef.h>
7+
#include <strings.h>
8+
#include "../../kselftest_harness.h"
79

810
#define TOP_DOWN 0
911
#define BOTTOM_UP 1
1012

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;
13+
#if __riscv_xlen == 64
14+
uint64_t random_addresses[] = {
15+
0x19764f0d73b3a9f0, 0x016049584cecef59, 0x3580bdd3562f4acd,
16+
0x1164219f20b17da0, 0x07d97fcb40ff2373, 0x76ec528921272ee7,
17+
0x4dd48c38a3de3f70, 0x2e11415055f6997d, 0x14b43334ac476c02,
18+
0x375a60795aff19f6, 0x47f3051725b8ee1a, 0x4e697cf240494a9f,
19+
0x456b59b5c2f9e9d1, 0x101724379d63cb96, 0x7fe9ad31619528c1,
20+
0x2f417247c495c2ea, 0x329a5a5b82943a5e, 0x06d7a9d6adcd3827,
21+
0x327b0b9ee37f62d5, 0x17c7b1851dfd9b76, 0x006ebb6456ec2cd9,
22+
0x00836cd14146a134, 0x00e5c4dcde7126db, 0x004c29feadf75753,
23+
0x00d8b20149ed930c, 0x00d71574c269387a, 0x0006ebe4a82acb7a,
24+
0x0016135df51f471b, 0x00758bdb55455160, 0x00d0bdd949b13b32,
25+
0x00ecea01e7c5f54b, 0x00e37b071b9948b1, 0x0011fdd00ff57ab3,
26+
0x00e407294b52f5ea, 0x00567748c200ed20, 0x000d073084651046,
27+
0x00ac896f4365463c, 0x00eb0d49a0b26216, 0x0066a2564a982a31,
28+
0x002e0d20237784ae, 0x0000554ff8a77a76, 0x00006ce07a54c012,
29+
0x000009570516d799, 0x00000954ca15b84d, 0x0000684f0d453379,
30+
0x00002ae5816302b5, 0x0000042403fb54bf, 0x00004bad7392bf30,
31+
0x00003e73bfa4b5e3, 0x00005442c29978e0, 0x00002803f11286b6,
32+
0x000073875d745fc6, 0x00007cede9cb8240, 0x000027df84cc6a4f,
33+
0x00006d7e0e74242a, 0x00004afd0b836e02, 0x000047d0e837cd82,
34+
0x00003b42405efeda, 0x00001531bafa4c95, 0x00007172cae34ac4,
1935
};
36+
#else
37+
uint32_t random_addresses[] = {
38+
0x8dc302e0, 0x929ab1e0, 0xb47683ba, 0xea519c73, 0xa19f1c90, 0xc49ba213,
39+
0x8f57c625, 0xadfe5137, 0x874d4d95, 0xaa20f09d, 0xcf21ebfc, 0xda7737f1,
40+
0xcedf392a, 0x83026c14, 0xccedca52, 0xc6ccf826, 0xe0cd9415, 0x997472ca,
41+
0xa21a44c1, 0xe82196f5, 0xa23fd66b, 0xc28d5590, 0xd009cdce, 0xcf0be646,
42+
0x8fc8c7ff, 0xe2a85984, 0xa3d3236b, 0x89a0619d, 0xc03db924, 0xb5d4cc1b,
43+
0xb96ee04c, 0xd191da48, 0xb432a000, 0xaa2bebbc, 0xa2fcb289, 0xb0cca89b,
44+
0xb0c18d6a, 0x88f58deb, 0xa4d42d1c, 0xe4d74e86, 0x99902b09, 0x8f786d31,
45+
0xbec5e381, 0x9a727e65, 0xa9a65040, 0xa880d789, 0x8f1b335e, 0xfc821c1e,
46+
0x97e34be4, 0xbbef84ed, 0xf447d197, 0xfd7ceee2, 0xe632348d, 0xee4590f4,
47+
0x958992a5, 0xd57e05d6, 0xfd240970, 0xc5b0dcff, 0xd96da2c2, 0xa7ae041d,
48+
};
49+
#endif
2050

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);
51+
#define PROT (PROT_READ | PROT_WRITE)
52+
#define FLAGS (MAP_PRIVATE | MAP_ANONYMOUS)
3453

35-
int prot = PROT_READ | PROT_WRITE;
36-
int flags = MAP_PRIVATE | MAP_ANONYMOUS;
54+
/* mmap must return a value that doesn't use more bits than the hint address. */
55+
static inline unsigned long get_max_value(unsigned long input)
56+
{
57+
unsigned long max_bit = (1UL << (((sizeof(unsigned long) * 8) - 1 -
58+
__builtin_clzl(input))));
3759

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);
60+
return max_bit + (max_bit - 1);
5261
}
5362

63+
#define TEST_MMAPS \
64+
({ \
65+
void *mmap_addr; \
66+
for (int i = 0; i < ARRAY_SIZE(random_addresses); i++) { \
67+
mmap_addr = mmap((void *)random_addresses[i], \
68+
5 * sizeof(int), PROT, FLAGS, 0, 0); \
69+
EXPECT_NE(MAP_FAILED, mmap_addr); \
70+
EXPECT_GE((void *)get_max_value(random_addresses[i]), \
71+
mmap_addr); \
72+
mmap_addr = mmap((void *)random_addresses[i], \
73+
5 * sizeof(int), PROT, FLAGS, 0, 0); \
74+
EXPECT_NE(MAP_FAILED, mmap_addr); \
75+
EXPECT_GE((void *)get_max_value(random_addresses[i]), \
76+
mmap_addr); \
77+
} \
78+
})
79+
5480
static inline int memory_layout(void)
5581
{
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);
82+
void *value1 = mmap(NULL, sizeof(int), PROT, FLAGS, 0, 0);
83+
void *value2 = mmap(NULL, sizeof(int), PROT, FLAGS, 0, 0);
6184

6285
return value2 > value1;
6386
}

0 commit comments

Comments
 (0)