1*4d495c6eSApple OSS Distributions #include <darwintest.h>
2*4d495c6eSApple OSS Distributions #include <errno.h>
3*4d495c6eSApple OSS Distributions #include <fcntl.h>
4*4d495c6eSApple OSS Distributions #include <sys/types.h>
5*4d495c6eSApple OSS Distributions #include <sys/event.h>
6*4d495c6eSApple OSS Distributions #include <sys/time.h>
7*4d495c6eSApple OSS Distributions #include <sys/sysctl.h>
8*4d495c6eSApple OSS Distributions #include <sys/resource.h>
9*4d495c6eSApple OSS Distributions #include <signal.h>
10*4d495c6eSApple OSS Distributions #include <stdlib.h>
11*4d495c6eSApple OSS Distributions #include <string.h>
12*4d495c6eSApple OSS Distributions #include <stdio.h>
13*4d495c6eSApple OSS Distributions #include <TargetConditionals.h>
14*4d495c6eSApple OSS Distributions #include <unistd.h>
15*4d495c6eSApple OSS Distributions #include <dirent.h>
16*4d495c6eSApple OSS Distributions #include <sys/stat.h>
17*4d495c6eSApple OSS Distributions #include <sys/mman.h>
18*4d495c6eSApple OSS Distributions #include <mach/mach.h>
19*4d495c6eSApple OSS Distributions #include <mach/mach_vm.h>
20*4d495c6eSApple OSS Distributions
21*4d495c6eSApple OSS Distributions #include <arm_acle.h>
22*4d495c6eSApple OSS Distributions
23*4d495c6eSApple OSS Distributions #define BUFFLEN 2048
24*4d495c6eSApple OSS Distributions #define TIMEOUT 10 /* Timeout in seconds to wait for coredumps to appear */
25*4d495c6eSApple OSS Distributions
26*4d495c6eSApple OSS Distributions #define VM_FLAGS_MTE 0x00002000
27*4d495c6eSApple OSS Distributions
28*4d495c6eSApple OSS Distributions #define BUFFER_SZ_4MB (1024 * 1024 * 4)
29*4d495c6eSApple OSS Distributions
30*4d495c6eSApple OSS Distributions T_GLOBAL_META(
31*4d495c6eSApple OSS Distributions T_META_NAMESPACE("xnu.arm"),
32*4d495c6eSApple OSS Distributions T_META_RADAR_COMPONENT_NAME("xnu"),
33*4d495c6eSApple OSS Distributions T_META_RADAR_COMPONENT_VERSION("crash tools"));
34*4d495c6eSApple OSS Distributions
35*4d495c6eSApple OSS Distributions
36*4d495c6eSApple OSS Distributions // Mach-O parsing utilities :
37*4d495c6eSApple OSS Distributions
38*4d495c6eSApple OSS Distributions struct mach_header_64 {
39*4d495c6eSApple OSS Distributions uint32_t magic; /* mach magic number identifier */
40*4d495c6eSApple OSS Distributions uint32_t cputype; /* cpu specifier */
41*4d495c6eSApple OSS Distributions uint32_t cpusubtype; /* machine specifier */
42*4d495c6eSApple OSS Distributions uint32_t filetype; /* type of file */
43*4d495c6eSApple OSS Distributions uint32_t ncmds; /* number of load commands */
44*4d495c6eSApple OSS Distributions uint32_t sizeofcmds; /* the size of all the load commands */
45*4d495c6eSApple OSS Distributions uint32_t flags; /* flags */
46*4d495c6eSApple OSS Distributions uint32_t reserved; /* reserved */
47*4d495c6eSApple OSS Distributions };
48*4d495c6eSApple OSS Distributions
49*4d495c6eSApple OSS Distributions struct load_command {
50*4d495c6eSApple OSS Distributions uint32_t cmd; /* type of load command */
51*4d495c6eSApple OSS Distributions uint32_t cmdsize; /* total size of command in bytes */
52*4d495c6eSApple OSS Distributions };
53*4d495c6eSApple OSS Distributions
54*4d495c6eSApple OSS Distributions #define LC_SEGMENT_64 0x19 /* 64-bit segment of this file to be mapped */
55*4d495c6eSApple OSS Distributions
56*4d495c6eSApple OSS Distributions struct segment_command_64 { /* for 64-bit architectures */
57*4d495c6eSApple OSS Distributions uint32_t cmd; /* LC_SEGMENT_64 */
58*4d495c6eSApple OSS Distributions uint32_t cmdsize; /* includes sizeof section_64 structs */
59*4d495c6eSApple OSS Distributions char segname[16]; /* segment name */
60*4d495c6eSApple OSS Distributions uint64_t vmaddr; /* memory address of this segment */
61*4d495c6eSApple OSS Distributions uint64_t vmsize; /* memory size of this segment */
62*4d495c6eSApple OSS Distributions uint64_t fileoff; /* file offset of this segment */
63*4d495c6eSApple OSS Distributions uint64_t filesize; /* amount to map from the file */
64*4d495c6eSApple OSS Distributions uint32_t maxprot; /* maximum VM protection */
65*4d495c6eSApple OSS Distributions uint32_t initprot; /* initial VM protection */
66*4d495c6eSApple OSS Distributions uint32_t nsects; /* number of sections in segment */
67*4d495c6eSApple OSS Distributions uint32_t flags; /* flags */
68*4d495c6eSApple OSS Distributions };
69*4d495c6eSApple OSS Distributions
70*4d495c6eSApple OSS Distributions typedef struct mach_header_64 mach_header_t;
71*4d495c6eSApple OSS Distributions typedef struct segment_command_64 segment_command_t;
72*4d495c6eSApple OSS Distributions #define LC_SEGMENT_CMD LC_SEGMENT_64
73*4d495c6eSApple OSS Distributions typedef struct load_command load_command_t;
74*4d495c6eSApple OSS Distributions
75*4d495c6eSApple OSS Distributions #define FOREACH_SEGMENT_COMMAND(_header, _segment) \
76*4d495c6eSApple OSS Distributions for (const segment_command_t *seg_indx = NULL, \
77*4d495c6eSApple OSS Distributions *_segment = (const segment_command_t *)((uintptr_t)(_header + 1)); \
78*4d495c6eSApple OSS Distributions seg_indx < (const segment_command_t *)(NULL) + (_header)->ncmds; \
79*4d495c6eSApple OSS Distributions ++seg_indx, _segment = (const segment_command_t *)((uintptr_t)_segment + _segment->cmdsize))
80*4d495c6eSApple OSS Distributions
81*4d495c6eSApple OSS Distributions const segment_command_t * _Nullable
macho_get_next_segment(const mach_header_t * _Nonnull mh,const segment_command_t * _Nullable seg)82*4d495c6eSApple OSS Distributions macho_get_next_segment(const mach_header_t * _Nonnull mh, const segment_command_t * _Nullable seg)
83*4d495c6eSApple OSS Distributions {
84*4d495c6eSApple OSS Distributions FOREACH_SEGMENT_COMMAND(mh, nextseg) {
85*4d495c6eSApple OSS Distributions if (nextseg->cmd != LC_SEGMENT_CMD) {
86*4d495c6eSApple OSS Distributions continue;
87*4d495c6eSApple OSS Distributions }
88*4d495c6eSApple OSS Distributions if (seg == NULL) {
89*4d495c6eSApple OSS Distributions return nextseg;
90*4d495c6eSApple OSS Distributions }
91*4d495c6eSApple OSS Distributions if (seg == nextseg) {
92*4d495c6eSApple OSS Distributions seg = NULL;
93*4d495c6eSApple OSS Distributions }
94*4d495c6eSApple OSS Distributions }
95*4d495c6eSApple OSS Distributions return NULL;
96*4d495c6eSApple OSS Distributions }
97*4d495c6eSApple OSS Distributions
98*4d495c6eSApple OSS Distributions static const char corefile_ctl[] = "kern.corefile";
99*4d495c6eSApple OSS Distributions static const char coredump_ctl[] = "kern.coredump";
100*4d495c6eSApple OSS Distributions /* The directory where coredumps will be */
101*4d495c6eSApple OSS Distributions static const char dump_dir[] = "/cores";
102*4d495c6eSApple OSS Distributions /* The coredump location when we set kern.coredump ctl to something valid */
103*4d495c6eSApple OSS Distributions static const char valid_dump_fmt[] = "/cores/test-core.%d";
104*4d495c6eSApple OSS Distributions static const char ls_path[] = "/bin/ls";
105*4d495c6eSApple OSS Distributions
106*4d495c6eSApple OSS Distributions /* A valid coredump location to test. */
107*4d495c6eSApple OSS Distributions static char valid_dump_loc[] = "/cores/test-core.%P";
108*4d495c6eSApple OSS Distributions
109*4d495c6eSApple OSS Distributions static const struct rlimit lim_infty = {
110*4d495c6eSApple OSS Distributions RLIM_INFINITY,
111*4d495c6eSApple OSS Distributions RLIM_INFINITY
112*4d495c6eSApple OSS Distributions };
113*4d495c6eSApple OSS Distributions
114*4d495c6eSApple OSS Distributions static volatile int stop_looking = 0;
115*4d495c6eSApple OSS Distributions
116*4d495c6eSApple OSS Distributions static const struct timespec timeout = {
117*4d495c6eSApple OSS Distributions TIMEOUT,
118*4d495c6eSApple OSS Distributions 0
119*4d495c6eSApple OSS Distributions };
120*4d495c6eSApple OSS Distributions
121*4d495c6eSApple OSS Distributions static void
sigalrm_handler(int sig)122*4d495c6eSApple OSS Distributions sigalrm_handler(int sig)
123*4d495c6eSApple OSS Distributions {
124*4d495c6eSApple OSS Distributions (void)sig;
125*4d495c6eSApple OSS Distributions stop_looking = 1;
126*4d495c6eSApple OSS Distributions return;
127*4d495c6eSApple OSS Distributions }
128*4d495c6eSApple OSS Distributions
129*4d495c6eSApple OSS Distributions static void
list_coredump_files()130*4d495c6eSApple OSS Distributions list_coredump_files()
131*4d495c6eSApple OSS Distributions {
132*4d495c6eSApple OSS Distributions int ret;
133*4d495c6eSApple OSS Distributions char buf[BUFFLEN] = { 0 };
134*4d495c6eSApple OSS Distributions
135*4d495c6eSApple OSS Distributions T_LOG("Contents of %s:", dump_dir);
136*4d495c6eSApple OSS Distributions snprintf(buf, BUFFLEN, "%s %s", ls_path, dump_dir);
137*4d495c6eSApple OSS Distributions ret = system(buf);
138*4d495c6eSApple OSS Distributions T_ASSERT_POSIX_SUCCESS(ret, "Listing contents of cores directory");
139*4d495c6eSApple OSS Distributions return;
140*4d495c6eSApple OSS Distributions }
141*4d495c6eSApple OSS Distributions
142*4d495c6eSApple OSS Distributions static int
fork_and_wait_for_segfault()143*4d495c6eSApple OSS Distributions fork_and_wait_for_segfault()
144*4d495c6eSApple OSS Distributions {
145*4d495c6eSApple OSS Distributions int pid, ret;
146*4d495c6eSApple OSS Distributions int stat;
147*4d495c6eSApple OSS Distributions pid = fork();
148*4d495c6eSApple OSS Distributions if (pid == 0) {
149*4d495c6eSApple OSS Distributions unsigned int *ptr = (unsigned int *)0x30; /* Cause a segfault so that we get a coredump */
150*4d495c6eSApple OSS Distributions *ptr = 0xdeadd00d;
151*4d495c6eSApple OSS Distributions exit(0);
152*4d495c6eSApple OSS Distributions }
153*4d495c6eSApple OSS Distributions T_ASSERT_TRUE(pid != -1, "Checking fork success in parent");
154*4d495c6eSApple OSS Distributions
155*4d495c6eSApple OSS Distributions ret = wait(&stat);
156*4d495c6eSApple OSS Distributions T_ASSERT_TRUE(ret != -1, "Waited for child to segfault and dump core");
157*4d495c6eSApple OSS Distributions T_ASSERT_FALSE(WIFEXITED(stat), "Seems that child process did not fail to execute");
158*4d495c6eSApple OSS Distributions return pid;
159*4d495c6eSApple OSS Distributions }
160*4d495c6eSApple OSS Distributions
161*4d495c6eSApple OSS Distributions static int
setup_coredump_kevent(struct kevent * kev,int dir)162*4d495c6eSApple OSS Distributions setup_coredump_kevent(struct kevent *kev, int dir)
163*4d495c6eSApple OSS Distributions {
164*4d495c6eSApple OSS Distributions int ret;
165*4d495c6eSApple OSS Distributions int kqfd;
166*4d495c6eSApple OSS Distributions
167*4d495c6eSApple OSS Distributions EV_SET(kev, dir, EVFILT_VNODE, EV_ADD, NOTE_WRITE, 0, NULL);
168*4d495c6eSApple OSS Distributions kqfd = kqueue();
169*4d495c6eSApple OSS Distributions T_ASSERT_POSIX_SUCCESS(kqfd, "kqueue: get kqueue for coredump monitoring");
170*4d495c6eSApple OSS Distributions
171*4d495c6eSApple OSS Distributions ret = kevent(kqfd, kev, 1, NULL, 0, NULL);
172*4d495c6eSApple OSS Distributions T_ASSERT_POSIX_SUCCESS(ret, "kevent: setup directory monitoring for coredump");
173*4d495c6eSApple OSS Distributions return kqfd;
174*4d495c6eSApple OSS Distributions }
175*4d495c6eSApple OSS Distributions
176*4d495c6eSApple OSS Distributions static bool
check_coredump_contains_vm_addr(const char * path,vm_address_t vm_addr,size_t vm_size)177*4d495c6eSApple OSS Distributions check_coredump_contains_vm_addr(const char *path, vm_address_t vm_addr, size_t vm_size)
178*4d495c6eSApple OSS Distributions {
179*4d495c6eSApple OSS Distributions int err;
180*4d495c6eSApple OSS Distributions struct stat filestat;
181*4d495c6eSApple OSS Distributions int fd = open(path, O_RDONLY);
182*4d495c6eSApple OSS Distributions T_ASSERT_GE(fd, 0, "Failed to open file %s\n", path);
183*4d495c6eSApple OSS Distributions err = fstat(fd, &filestat);
184*4d495c6eSApple OSS Distributions T_ASSERT_POSIX_SUCCESS(err, "Failed to open the corefile to check vm region");
185*4d495c6eSApple OSS Distributions
186*4d495c6eSApple OSS Distributions T_WITH_ERRNO;
187*4d495c6eSApple OSS Distributions const mach_header_t *macho = (const mach_header_t *) mmap(NULL, filestat.st_size, PROT_READ, MAP_SHARED, fd, 0);
188*4d495c6eSApple OSS Distributions T_ASSERT_NE(macho, MAP_FAILED, "Failed to mmap corefile\n");
189*4d495c6eSApple OSS Distributions
190*4d495c6eSApple OSS Distributions const segment_command_t * seg = NULL;
191*4d495c6eSApple OSS Distributions
192*4d495c6eSApple OSS Distributions while (vm_size > 0 && NULL != (seg = macho_get_next_segment(macho, seg))) {
193*4d495c6eSApple OSS Distributions vm_address_t curr_end = seg->vmaddr + seg->vmsize;
194*4d495c6eSApple OSS Distributions /* if vm_addr is included in the segment : */
195*4d495c6eSApple OSS Distributions if ((vm_addr >= seg->vmaddr) && (vm_addr < curr_end)) {
196*4d495c6eSApple OSS Distributions size_t seg_shift = vm_addr - seg->vmaddr;
197*4d495c6eSApple OSS Distributions T_ASSERT_GE(
198*4d495c6eSApple OSS Distributions (unsigned long long)seg->filesize,
199*4d495c6eSApple OSS Distributions (unsigned long long)sizeof(unsigned long long) + seg_shift,
200*4d495c6eSApple OSS Distributions "We expect corefile to contain an unsigned long long at least");
201*4d495c6eSApple OSS Distributions unsigned long long *ptr = (unsigned long long*)((uintptr_t)seg->fileoff + (uintptr_t)macho + seg_shift);
202*4d495c6eSApple OSS Distributions T_ASSERT_EQ(*ptr, (unsigned long long)0xbadc0ffee, "Corefile missing secret value");
203*4d495c6eSApple OSS Distributions size_t curr_seg_tail = curr_end - vm_addr;
204*4d495c6eSApple OSS Distributions size_t sub_size = MIN(curr_seg_tail, vm_size);
205*4d495c6eSApple OSS Distributions vm_addr += sub_size;
206*4d495c6eSApple OSS Distributions vm_size -= sub_size;
207*4d495c6eSApple OSS Distributions }
208*4d495c6eSApple OSS Distributions }
209*4d495c6eSApple OSS Distributions return vm_size == 0;
210*4d495c6eSApple OSS Distributions }
211*4d495c6eSApple OSS Distributions
212*4d495c6eSApple OSS Distributions static void
look_for_coredump_content(const char * format,int pid,int kqfd,struct kevent * kev,vm_address_t vm_addr,size_t vm_size)213*4d495c6eSApple OSS Distributions look_for_coredump_content(const char *format, int pid, int kqfd, struct kevent *kev, vm_address_t vm_addr, size_t vm_size)
214*4d495c6eSApple OSS Distributions {
215*4d495c6eSApple OSS Distributions int ret = 0;
216*4d495c6eSApple OSS Distributions int i = 0;
217*4d495c6eSApple OSS Distributions char buf[BUFFLEN];
218*4d495c6eSApple OSS Distributions memset(buf, 0, BUFFLEN);
219*4d495c6eSApple OSS Distributions snprintf(buf, BUFFLEN, format, pid);
220*4d495c6eSApple OSS Distributions /*
221*4d495c6eSApple OSS Distributions * Something else might touch this directory. If we get notified and don't see
222*4d495c6eSApple OSS Distributions * anything, try a few more times before failing.
223*4d495c6eSApple OSS Distributions */
224*4d495c6eSApple OSS Distributions alarm(TIMEOUT);
225*4d495c6eSApple OSS Distributions while (!stop_looking) {
226*4d495c6eSApple OSS Distributions /* Wait for kevent to tell us the coredump folder was modified */
227*4d495c6eSApple OSS Distributions ret = kevent(kqfd, NULL, 0, kev, 1, &timeout);
228*4d495c6eSApple OSS Distributions T_ASSERT_POSIX_SUCCESS(ret, "kevent: Waiting for coredump to appear");
229*4d495c6eSApple OSS Distributions ret = -1;
230*4d495c6eSApple OSS Distributions int fd = open(buf, O_RDONLY);
231*4d495c6eSApple OSS Distributions if (fd > 0) {
232*4d495c6eSApple OSS Distributions // found the file, stop looking
233*4d495c6eSApple OSS Distributions ret = 0;
234*4d495c6eSApple OSS Distributions close(fd);
235*4d495c6eSApple OSS Distributions break;
236*4d495c6eSApple OSS Distributions }
237*4d495c6eSApple OSS Distributions
238*4d495c6eSApple OSS Distributions T_LOG("Couldn't find coredump file (try #%d).", i + 1);
239*4d495c6eSApple OSS Distributions i++;
240*4d495c6eSApple OSS Distributions }
241*4d495c6eSApple OSS Distributions alarm(0);
242*4d495c6eSApple OSS Distributions
243*4d495c6eSApple OSS Distributions if (ret == -1) {
244*4d495c6eSApple OSS Distributions /* Couldn't find the coredump -- list contents of /cores */
245*4d495c6eSApple OSS Distributions list_coredump_files();
246*4d495c6eSApple OSS Distributions } else if (ret == 0) {
247*4d495c6eSApple OSS Distributions bool vm_reg_contained = check_coredump_contains_vm_addr(buf, vm_addr, vm_size);
248*4d495c6eSApple OSS Distributions T_ASSERT_EQ(vm_reg_contained, true, "Corefile %s doesn't have requested memory region", buf);
249*4d495c6eSApple OSS Distributions ret = remove(buf);
250*4d495c6eSApple OSS Distributions }
251*4d495c6eSApple OSS Distributions
252*4d495c6eSApple OSS Distributions T_ASSERT_POSIX_SUCCESS(ret, "Removing coredump file (should be at %s)", buf);
253*4d495c6eSApple OSS Distributions }
254*4d495c6eSApple OSS Distributions
255*4d495c6eSApple OSS Distributions static void
sysctl_enable_coredumps(void)256*4d495c6eSApple OSS Distributions sysctl_enable_coredumps(void)
257*4d495c6eSApple OSS Distributions {
258*4d495c6eSApple OSS Distributions int ret;
259*4d495c6eSApple OSS Distributions int enable_core_dump = 1;
260*4d495c6eSApple OSS Distributions size_t oldlen = BUFFLEN;
261*4d495c6eSApple OSS Distributions char buf[BUFFLEN];
262*4d495c6eSApple OSS Distributions memset(buf, 0, BUFFLEN);
263*4d495c6eSApple OSS Distributions
264*4d495c6eSApple OSS Distributions ret = sysctlbyname(coredump_ctl, buf, &oldlen, &enable_core_dump, sizeof(int));
265*4d495c6eSApple OSS Distributions T_ASSERT_POSIX_SUCCESS(ret, "sysctl: enable core dumps");
266*4d495c6eSApple OSS Distributions
267*4d495c6eSApple OSS Distributions ret = setrlimit(RLIMIT_CORE, &lim_infty);
268*4d495c6eSApple OSS Distributions T_ASSERT_POSIX_SUCCESS(ret, "setrlimit: remove limit on maximum coredump size");
269*4d495c6eSApple OSS Distributions }
270*4d495c6eSApple OSS Distributions
271*4d495c6eSApple OSS Distributions T_DECL(
272*4d495c6eSApple OSS Distributions proc_core_name_mte,
273*4d495c6eSApple OSS Distributions "Tests behavior of core dump when process has MTE hard mode enabled and MTE mapping with active tags",
274*4d495c6eSApple OSS Distributions T_META_ASROOT(true),
275*4d495c6eSApple OSS Distributions T_META_IGNORECRASHES("proc_core_name_mte.*"),
276*4d495c6eSApple OSS Distributions T_META_REQUIRES_SYSCTL_EQ("hw.optional.arm.FEAT_MTE", 1),
277*4d495c6eSApple OSS Distributions #if TARGET_OS_OSX
278*4d495c6eSApple OSS Distributions T_META_ENABLED(true)
279*4d495c6eSApple OSS Distributions #else
280*4d495c6eSApple OSS Distributions T_META_ENABLED(false)
281*4d495c6eSApple OSS Distributions #endif
282*4d495c6eSApple OSS Distributions )
283*4d495c6eSApple OSS Distributions {
284*4d495c6eSApple OSS Distributions DIR *dirp;
285*4d495c6eSApple OSS Distributions int ret, pid, dir;
286*4d495c6eSApple OSS Distributions char buf[BUFFLEN];
287*4d495c6eSApple OSS Distributions memset(buf, 0, BUFFLEN);
288*4d495c6eSApple OSS Distributions size_t oldlen = BUFFLEN;
289*4d495c6eSApple OSS Distributions struct kevent kev;
290*4d495c6eSApple OSS Distributions sig_t sig;
291*4d495c6eSApple OSS Distributions int kqfd;
292*4d495c6eSApple OSS Distributions
293*4d495c6eSApple OSS Distributions sig = signal(SIGALRM, sigalrm_handler);
294*4d495c6eSApple OSS Distributions T_WITH_ERRNO; T_EXPECT_NE(sig, SIG_ERR, "signal: set sigalrm handler");
295*4d495c6eSApple OSS Distributions
296*4d495c6eSApple OSS Distributions dirp = opendir(dump_dir);
297*4d495c6eSApple OSS Distributions T_ASSERT_NOTNULL(dirp, "opendir: opening coredump directory");
298*4d495c6eSApple OSS Distributions dir = dirfd(dirp);
299*4d495c6eSApple OSS Distributions T_ASSERT_POSIX_SUCCESS(dir, "dirfd: getting file descriptor for coredump directory");
300*4d495c6eSApple OSS Distributions kqfd = setup_coredump_kevent(&kev, dir);
301*4d495c6eSApple OSS Distributions
302*4d495c6eSApple OSS Distributions sysctl_enable_coredumps();
303*4d495c6eSApple OSS Distributions vm_address_t vm_addr;
304*4d495c6eSApple OSS Distributions kern_return_t kret = vm_allocate(mach_task_self(), &vm_addr, BUFFER_SZ_4MB,
305*4d495c6eSApple OSS Distributions VM_FLAGS_ANYWHERE | VM_FLAGS_MTE);
306*4d495c6eSApple OSS Distributions
307*4d495c6eSApple OSS Distributions T_ASSERT_EQ(kret, 0, "vm_allocate failed to allocate MTE buffer");
308*4d495c6eSApple OSS Distributions *(unsigned long long *)vm_addr = 0xbadc0ffee;
309*4d495c6eSApple OSS Distributions
310*4d495c6eSApple OSS Distributions uint8_t *tag_addr = __arm_mte_create_random_tag((void*)vm_addr, 0xffff);
311*4d495c6eSApple OSS Distributions uint8_t *tag_addr_next = __arm_mte_increment_tag((void*)vm_addr + 16, 1);
312*4d495c6eSApple OSS Distributions __arm_mte_set_tag(tag_addr);
313*4d495c6eSApple OSS Distributions __arm_mte_set_tag(tag_addr_next);
314*4d495c6eSApple OSS Distributions
315*4d495c6eSApple OSS Distributions printf("New tagged addresses %p : %p\n", tag_addr, tag_addr_next);
316*4d495c6eSApple OSS Distributions
317*4d495c6eSApple OSS Distributions ret = sysctlbyname(corefile_ctl, buf, &oldlen, valid_dump_loc, strlen(valid_dump_loc));
318*4d495c6eSApple OSS Distributions T_ASSERT_POSIX_SUCCESS(ret, "sysctl: set valid core dump location, old value was %s", buf);
319*4d495c6eSApple OSS Distributions memset(buf, 0, BUFFLEN);
320*4d495c6eSApple OSS Distributions
321*4d495c6eSApple OSS Distributions pid = fork_and_wait_for_segfault();
322*4d495c6eSApple OSS Distributions look_for_coredump_content(valid_dump_fmt, pid, kqfd, &kev, vm_addr, BUFFER_SZ_4MB);
323*4d495c6eSApple OSS Distributions
324*4d495c6eSApple OSS Distributions vm_deallocate(mach_task_self(), vm_addr, BUFFER_SZ_4MB);
325*4d495c6eSApple OSS Distributions closedir(dirp);
326*4d495c6eSApple OSS Distributions close(kqfd);
327*4d495c6eSApple OSS Distributions T_PASS("proc_core_name_mte PASSED");
328*4d495c6eSApple OSS Distributions }
329