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