1*4d495c6eSApple OSS Distributions #include <darwintest.h>
2*4d495c6eSApple OSS Distributions #include <machine/cpu_capabilities.h>
3*4d495c6eSApple OSS Distributions #include "test_utils.h"
4*4d495c6eSApple OSS Distributions
5*4d495c6eSApple OSS Distributions #include <stdlib.h>
6*4d495c6eSApple OSS Distributions #include <signal.h>
7*4d495c6eSApple OSS Distributions
8*4d495c6eSApple OSS Distributions T_GLOBAL_META(
9*4d495c6eSApple OSS Distributions T_META_NAMESPACE("xnu.arm"),
10*4d495c6eSApple OSS Distributions T_META_RADAR_COMPONENT_NAME("xnu"),
11*4d495c6eSApple OSS Distributions T_META_RADAR_COMPONENT_VERSION("arm"),
12*4d495c6eSApple OSS Distributions T_META_ENABLED(TARGET_CPU_ARM64),
13*4d495c6eSApple OSS Distributions T_META_OWNER("xi_han"),
14*4d495c6eSApple OSS Distributions T_META_RUN_CONCURRENTLY(true),
15*4d495c6eSApple OSS Distributions XNU_T_META_SOC_SPECIFIC
16*4d495c6eSApple OSS Distributions );
17*4d495c6eSApple OSS Distributions
18*4d495c6eSApple OSS Distributions #if defined(__LP64__)
19*4d495c6eSApple OSS Distributions #define SIGNAL_EXPECTED SIGBUS
20*4d495c6eSApple OSS Distributions #define SIGNAL_EXPECTED_STR "SIGBUS"
21*4d495c6eSApple OSS Distributions #else
22*4d495c6eSApple OSS Distributions /* On arm64_32, _COMM_PAGE_START_ADDRESS is out of normal VA range, so a SIGSEGV is expected if there's a fault. */
23*4d495c6eSApple OSS Distributions #define SIGNAL_EXPECTED SIGSEGV
24*4d495c6eSApple OSS Distributions #define SIGNAL_EXPECTED_STR "SIGSEGV"
25*4d495c6eSApple OSS Distributions #endif
26*4d495c6eSApple OSS Distributions
27*4d495c6eSApple OSS Distributions #define TEST_STATE_TESTING_NONE 0
28*4d495c6eSApple OSS Distributions #define TEST_STATE_TESTING_READ 1
29*4d495c6eSApple OSS Distributions #define TEST_STATE_TESTING_WRITE 2
30*4d495c6eSApple OSS Distributions static volatile sig_atomic_t test_state;
31*4d495c6eSApple OSS Distributions
32*4d495c6eSApple OSS Distributions static void
test_handler(int signum)33*4d495c6eSApple OSS Distributions test_handler(int signum)
34*4d495c6eSApple OSS Distributions {
35*4d495c6eSApple OSS Distributions T_ASSERT_EQ(signum, SIGNAL_EXPECTED, "received signal");
36*4d495c6eSApple OSS Distributions
37*4d495c6eSApple OSS Distributions if (test_state == TEST_STATE_TESTING_READ) {
38*4d495c6eSApple OSS Distributions T_FAIL("read access triggered a %s", SIGNAL_EXPECTED_STR);
39*4d495c6eSApple OSS Distributions } else if (test_state == TEST_STATE_TESTING_WRITE) {
40*4d495c6eSApple OSS Distributions T_PASS("write access triggered a %s", SIGNAL_EXPECTED_STR);
41*4d495c6eSApple OSS Distributions exit(EXIT_SUCCESS);
42*4d495c6eSApple OSS Distributions } else {
43*4d495c6eSApple OSS Distributions T_FAIL("unexpected %s in test state %u", SIGNAL_EXPECTED_STR, (unsigned int)test_state);
44*4d495c6eSApple OSS Distributions }
45*4d495c6eSApple OSS Distributions }
46*4d495c6eSApple OSS Distributions
47*4d495c6eSApple OSS Distributions T_DECL(pmap_commpage_access_test,
48*4d495c6eSApple OSS Distributions "Verify system behavior on user access to the commpage", T_META_TAG_VM_NOT_PREFERRED)
49*4d495c6eSApple OSS Distributions {
50*4d495c6eSApple OSS Distributions test_state = TEST_STATE_TESTING_NONE;
51*4d495c6eSApple OSS Distributions
52*4d495c6eSApple OSS Distributions struct sigaction sa;
53*4d495c6eSApple OSS Distributions sa.sa_handler = test_handler;
54*4d495c6eSApple OSS Distributions sa.sa_mask = 0;
55*4d495c6eSApple OSS Distributions sa.sa_flags = 0;
56*4d495c6eSApple OSS Distributions sigaction(SIGNAL_EXPECTED, &sa, NULL);
57*4d495c6eSApple OSS Distributions
58*4d495c6eSApple OSS Distributions test_state = TEST_STATE_TESTING_READ;
59*4d495c6eSApple OSS Distributions *(volatile uint32_t *)_COMM_PAGE_START_ADDRESS;
60*4d495c6eSApple OSS Distributions
61*4d495c6eSApple OSS Distributions T_PASS("read access must not trigger a %s", SIGNAL_EXPECTED_STR);
62*4d495c6eSApple OSS Distributions
63*4d495c6eSApple OSS Distributions test_state = TEST_STATE_TESTING_WRITE;
64*4d495c6eSApple OSS Distributions *(volatile uint32_t *)_COMM_PAGE_START_ADDRESS = 0;
65*4d495c6eSApple OSS Distributions
66*4d495c6eSApple OSS Distributions T_FAIL("write access must trigger a %s", SIGNAL_EXPECTED_STR);
67*4d495c6eSApple OSS Distributions }
68