1// SPDX-License-Identifier: GPL-2.0-only
2/*
3 * Based on arch/arm/kernel/ptrace.c
4 *
5 * By Ross Biro 1/23/92
6 * edited by Linus Torvalds
7 * ARM modifications Copyright (C) 2000 Russell King
8 * Copyright (C) 2012 ARM Ltd.
9 */
10
11#include <linux/audit.h>
12#include <linux/compat.h>
13#include <linux/kernel.h>
14#include <linux/sched/signal.h>
15#include <linux/sched/task_stack.h>
16#include <linux/mm.h>
17#include <linux/nospec.h>
18#include <linux/smp.h>
19#include <linux/ptrace.h>
20#include <linux/user.h>
21#include <linux/seccomp.h>
22#include <linux/security.h>
23#include <linux/init.h>
24#include <linux/signal.h>
25#include <linux/string.h>
26#include <linux/uaccess.h>
27#include <linux/perf_event.h>
28#include <linux/hw_breakpoint.h>
29#include <linux/regset.h>
30#include <linux/elf.h>
31#include <linux/rseq.h>
32
33#include <asm/compat.h>
34#include <asm/cpufeature.h>
35#include <asm/debug-monitors.h>
36#include <asm/fpsimd.h>
37#include <asm/mte.h>
38#include <asm/pointer_auth.h>
39#include <asm/stacktrace.h>
40#include <asm/syscall.h>
41#include <asm/traps.h>
42#include <asm/system_misc.h>
43
44#define CREATE_TRACE_POINTS
45#include <trace/events/syscalls.h>
46
47struct pt_regs_offset {
48	const char *name;
49	int offset;
50};
51
52#define REG_OFFSET_NAME(r) {.name = #r, .offset = offsetof(struct pt_regs, r)}
53#define REG_OFFSET_END {.name = NULL, .offset = 0}
54#define GPR_OFFSET_NAME(r) \
55	{.name = "x" #r, .offset = offsetof(struct pt_regs, regs[r])}
56
57static const struct pt_regs_offset regoffset_table[] = {
58	GPR_OFFSET_NAME(0),
59	GPR_OFFSET_NAME(1),
60	GPR_OFFSET_NAME(2),
61	GPR_OFFSET_NAME(3),
62	GPR_OFFSET_NAME(4),
63	GPR_OFFSET_NAME(5),
64	GPR_OFFSET_NAME(6),
65	GPR_OFFSET_NAME(7),
66	GPR_OFFSET_NAME(8),
67	GPR_OFFSET_NAME(9),
68	GPR_OFFSET_NAME(10),
69	GPR_OFFSET_NAME(11),
70	GPR_OFFSET_NAME(12),
71	GPR_OFFSET_NAME(13),
72	GPR_OFFSET_NAME(14),
73	GPR_OFFSET_NAME(15),
74	GPR_OFFSET_NAME(16),
75	GPR_OFFSET_NAME(17),
76	GPR_OFFSET_NAME(18),
77	GPR_OFFSET_NAME(19),
78	GPR_OFFSET_NAME(20),
79	GPR_OFFSET_NAME(21),
80	GPR_OFFSET_NAME(22),
81	GPR_OFFSET_NAME(23),
82	GPR_OFFSET_NAME(24),
83	GPR_OFFSET_NAME(25),
84	GPR_OFFSET_NAME(26),
85	GPR_OFFSET_NAME(27),
86	GPR_OFFSET_NAME(28),
87	GPR_OFFSET_NAME(29),
88	GPR_OFFSET_NAME(30),
89	{.name = "lr", .offset = offsetof(struct pt_regs, regs[30])},
90	REG_OFFSET_NAME(sp),
91	REG_OFFSET_NAME(pc),
92	REG_OFFSET_NAME(pstate),
93	REG_OFFSET_END,
94};
95
96/**
97 * regs_query_register_offset() - query register offset from its name
98 * @name:	the name of a register
99 *
100 * regs_query_register_offset() returns the offset of a register in struct
101 * pt_regs from its name. If the name is invalid, this returns -EINVAL;
102 */
103int regs_query_register_offset(const char *name)
104{
105	const struct pt_regs_offset *roff;
106
107	for (roff = regoffset_table; roff->name != NULL; roff++)
108		if (!strcmp(roff->name, name))
109			return roff->offset;
110	return -EINVAL;
111}
112
113/**
114 * regs_within_kernel_stack() - check the address in the stack
115 * @regs:      pt_regs which contains kernel stack pointer.
116 * @addr:      address which is checked.
117 *
118 * regs_within_kernel_stack() checks @addr is within the kernel stack page(s).
119 * If @addr is within the kernel stack, it returns true. If not, returns false.
120 */
121static bool regs_within_kernel_stack(struct pt_regs *regs, unsigned long addr)
122{
123	return ((addr & ~(THREAD_SIZE - 1))  ==
124		(kernel_stack_pointer(regs) & ~(THREAD_SIZE - 1))) ||
125		on_irq_stack(addr, sizeof(unsigned long));
126}
127
128/**
129 * regs_get_kernel_stack_nth() - get Nth entry of the stack
130 * @regs:	pt_regs which contains kernel stack pointer.
131 * @n:		stack entry number.
132 *
133 * regs_get_kernel_stack_nth() returns @n th entry of the kernel stack which
134 * is specified by @regs. If the @n th entry is NOT in the kernel stack,
135 * this returns 0.
136 */
137unsigned long regs_get_kernel_stack_nth(struct pt_regs *regs, unsigned int n)
138{
139	unsigned long *addr = (unsigned long *)kernel_stack_pointer(regs);
140
141	addr += n;
142	if (regs_within_kernel_stack(regs, (unsigned long)addr))
143		return *addr;
144	else
145		return 0;
146}
147
148/*
149 * TODO: does not yet catch signals sent when the child dies.
150 * in exit.c or in signal.c.
151 */
152
153/*
154 * Called by kernel/ptrace.c when detaching..
155 */
156void ptrace_disable(struct task_struct *child)
157{
158	/*
159	 * This would be better off in core code, but PTRACE_DETACH has
160	 * grown its fair share of arch-specific worts and changing it
161	 * is likely to cause regressions on obscure architectures.
162	 */
163	user_disable_single_step(child);
164}
165
166#ifdef CONFIG_HAVE_HW_BREAKPOINT
167/*
168 * Handle hitting a HW-breakpoint.
169 */
170static void ptrace_hbptriggered(struct perf_event *bp,
171				struct perf_sample_data *data,
172				struct pt_regs *regs)
173{
174	struct arch_hw_breakpoint *bkpt = counter_arch_bp(bp);
175	const char *desc = "Hardware breakpoint trap (ptrace)";
176
177	if (is_compat_task()) {
178		int si_errno = 0;
179		int i;
180
181		for (i = 0; i < ARM_MAX_BRP; ++i) {
182			if (current->thread.debug.hbp_break[i] == bp) {
183				si_errno = (i << 1) + 1;
184				break;
185			}
186		}
187
188		for (i = 0; i < ARM_MAX_WRP; ++i) {
189			if (current->thread.debug.hbp_watch[i] == bp) {
190				si_errno = -((i << 1) + 1);
191				break;
192			}
193		}
194		arm64_force_sig_ptrace_errno_trap(si_errno, bkpt->trigger,
195						  desc);
196		return;
197	}
198
199	arm64_force_sig_fault(SIGTRAP, TRAP_HWBKPT, bkpt->trigger, desc);
200}
201
202/*
203 * Unregister breakpoints from this task and reset the pointers in
204 * the thread_struct.
205 */
206void flush_ptrace_hw_breakpoint(struct task_struct *tsk)
207{
208	int i;
209	struct thread_struct *t = &tsk->thread;
210
211	for (i = 0; i < ARM_MAX_BRP; i++) {
212		if (t->debug.hbp_break[i]) {
213			unregister_hw_breakpoint(t->debug.hbp_break[i]);
214			t->debug.hbp_break[i] = NULL;
215		}
216	}
217
218	for (i = 0; i < ARM_MAX_WRP; i++) {
219		if (t->debug.hbp_watch[i]) {
220			unregister_hw_breakpoint(t->debug.hbp_watch[i]);
221			t->debug.hbp_watch[i] = NULL;
222		}
223	}
224}
225
226void ptrace_hw_copy_thread(struct task_struct *tsk)
227{
228	memset(&tsk->thread.debug, 0, sizeof(struct debug_info));
229}
230
231static struct perf_event *ptrace_hbp_get_event(unsigned int note_type,
232					       struct task_struct *tsk,
233					       unsigned long idx)
234{
235	struct perf_event *bp = ERR_PTR(-EINVAL);
236
237	switch (note_type) {
238	case NT_ARM_HW_BREAK:
239		if (idx >= ARM_MAX_BRP)
240			goto out;
241		idx = array_index_nospec(idx, ARM_MAX_BRP);
242		bp = tsk->thread.debug.hbp_break[idx];
243		break;
244	case NT_ARM_HW_WATCH:
245		if (idx >= ARM_MAX_WRP)
246			goto out;
247		idx = array_index_nospec(idx, ARM_MAX_WRP);
248		bp = tsk->thread.debug.hbp_watch[idx];
249		break;
250	}
251
252out:
253	return bp;
254}
255
256static int ptrace_hbp_set_event(unsigned int note_type,
257				struct task_struct *tsk,
258				unsigned long idx,
259				struct perf_event *bp)
260{
261	int err = -EINVAL;
262
263	switch (note_type) {
264	case NT_ARM_HW_BREAK:
265		if (idx >= ARM_MAX_BRP)
266			goto out;
267		idx = array_index_nospec(idx, ARM_MAX_BRP);
268		tsk->thread.debug.hbp_break[idx] = bp;
269		err = 0;
270		break;
271	case NT_ARM_HW_WATCH:
272		if (idx >= ARM_MAX_WRP)
273			goto out;
274		idx = array_index_nospec(idx, ARM_MAX_WRP);
275		tsk->thread.debug.hbp_watch[idx] = bp;
276		err = 0;
277		break;
278	}
279
280out:
281	return err;
282}
283
284static struct perf_event *ptrace_hbp_create(unsigned int note_type,
285					    struct task_struct *tsk,
286					    unsigned long idx)
287{
288	struct perf_event *bp;
289	struct perf_event_attr attr;
290	int err, type;
291
292	switch (note_type) {
293	case NT_ARM_HW_BREAK:
294		type = HW_BREAKPOINT_X;
295		break;
296	case NT_ARM_HW_WATCH:
297		type = HW_BREAKPOINT_RW;
298		break;
299	default:
300		return ERR_PTR(-EINVAL);
301	}
302
303	ptrace_breakpoint_init(&attr);
304
305	/*
306	 * Initialise fields to sane defaults
307	 * (i.e. values that will pass validation).
308	 */
309	attr.bp_addr	= 0;
310	attr.bp_len	= HW_BREAKPOINT_LEN_4;
311	attr.bp_type	= type;
312	attr.disabled	= 1;
313
314	bp = register_user_hw_breakpoint(&attr, ptrace_hbptriggered, NULL, tsk);
315	if (IS_ERR(bp))
316		return bp;
317
318	err = ptrace_hbp_set_event(note_type, tsk, idx, bp);
319	if (err)
320		return ERR_PTR(err);
321
322	return bp;
323}
324
325static int ptrace_hbp_fill_attr_ctrl(unsigned int note_type,
326				     struct arch_hw_breakpoint_ctrl ctrl,
327				     struct perf_event_attr *attr)
328{
329	int err, len, type, offset, disabled = !ctrl.enabled;
330
331	attr->disabled = disabled;
332	if (disabled)
333		return 0;
334
335	err = arch_bp_generic_fields(ctrl, &len, &type, &offset);
336	if (err)
337		return err;
338
339	switch (note_type) {
340	case NT_ARM_HW_BREAK:
341		if ((type & HW_BREAKPOINT_X) != type)
342			return -EINVAL;
343		break;
344	case NT_ARM_HW_WATCH:
345		if ((type & HW_BREAKPOINT_RW) != type)
346			return -EINVAL;
347		break;
348	default:
349		return -EINVAL;
350	}
351
352	attr->bp_len	= len;
353	attr->bp_type	= type;
354	attr->bp_addr	+= offset;
355
356	return 0;
357}
358
359static int ptrace_hbp_get_resource_info(unsigned int note_type, u32 *info)
360{
361	u8 num;
362	u32 reg = 0;
363
364	switch (note_type) {
365	case NT_ARM_HW_BREAK:
366		num = hw_breakpoint_slots(TYPE_INST);
367		break;
368	case NT_ARM_HW_WATCH:
369		num = hw_breakpoint_slots(TYPE_DATA);
370		break;
371	default:
372		return -EINVAL;
373	}
374
375	reg |= debug_monitors_arch();
376	reg <<= 8;
377	reg |= num;
378
379	*info = reg;
380	return 0;
381}
382
383static int ptrace_hbp_get_ctrl(unsigned int note_type,
384			       struct task_struct *tsk,
385			       unsigned long idx,
386			       u32 *ctrl)
387{
388	struct perf_event *bp = ptrace_hbp_get_event(note_type, tsk, idx);
389
390	if (IS_ERR(bp))
391		return PTR_ERR(bp);
392
393	*ctrl = bp ? encode_ctrl_reg(counter_arch_bp(bp)->ctrl) : 0;
394	return 0;
395}
396
397static int ptrace_hbp_get_addr(unsigned int note_type,
398			       struct task_struct *tsk,
399			       unsigned long idx,
400			       u64 *addr)
401{
402	struct perf_event *bp = ptrace_hbp_get_event(note_type, tsk, idx);
403
404	if (IS_ERR(bp))
405		return PTR_ERR(bp);
406
407	*addr = bp ? counter_arch_bp(bp)->address : 0;
408	return 0;
409}
410
411static struct perf_event *ptrace_hbp_get_initialised_bp(unsigned int note_type,
412							struct task_struct *tsk,
413							unsigned long idx)
414{
415	struct perf_event *bp = ptrace_hbp_get_event(note_type, tsk, idx);
416
417	if (!bp)
418		bp = ptrace_hbp_create(note_type, tsk, idx);
419
420	return bp;
421}
422
423static int ptrace_hbp_set_ctrl(unsigned int note_type,
424			       struct task_struct *tsk,
425			       unsigned long idx,
426			       u32 uctrl)
427{
428	int err;
429	struct perf_event *bp;
430	struct perf_event_attr attr;
431	struct arch_hw_breakpoint_ctrl ctrl;
432
433	bp = ptrace_hbp_get_initialised_bp(note_type, tsk, idx);
434	if (IS_ERR(bp)) {
435		err = PTR_ERR(bp);
436		return err;
437	}
438
439	attr = bp->attr;
440	decode_ctrl_reg(uctrl, &ctrl);
441	err = ptrace_hbp_fill_attr_ctrl(note_type, ctrl, &attr);
442	if (err)
443		return err;
444
445	return modify_user_hw_breakpoint(bp, &attr);
446}
447
448static int ptrace_hbp_set_addr(unsigned int note_type,
449			       struct task_struct *tsk,
450			       unsigned long idx,
451			       u64 addr)
452{
453	int err;
454	struct perf_event *bp;
455	struct perf_event_attr attr;
456
457	bp = ptrace_hbp_get_initialised_bp(note_type, tsk, idx);
458	if (IS_ERR(bp)) {
459		err = PTR_ERR(bp);
460		return err;
461	}
462
463	attr = bp->attr;
464	attr.bp_addr = addr;
465	err = modify_user_hw_breakpoint(bp, &attr);
466	return err;
467}
468
469#define PTRACE_HBP_ADDR_SZ	sizeof(u64)
470#define PTRACE_HBP_CTRL_SZ	sizeof(u32)
471#define PTRACE_HBP_PAD_SZ	sizeof(u32)
472
473static int hw_break_get(struct task_struct *target,
474			const struct user_regset *regset,
475			struct membuf to)
476{
477	unsigned int note_type = regset->core_note_type;
478	int ret, idx = 0;
479	u32 info, ctrl;
480	u64 addr;
481
482	/* Resource info */
483	ret = ptrace_hbp_get_resource_info(note_type, &info);
484	if (ret)
485		return ret;
486
487	membuf_write(&to, &info, sizeof(info));
488	membuf_zero(&to, sizeof(u32));
489	/* (address, ctrl) registers */
490	while (to.left) {
491		ret = ptrace_hbp_get_addr(note_type, target, idx, &addr);
492		if (ret)
493			return ret;
494		ret = ptrace_hbp_get_ctrl(note_type, target, idx, &ctrl);
495		if (ret)
496			return ret;
497		membuf_store(&to, addr);
498		membuf_store(&to, ctrl);
499		membuf_zero(&to, sizeof(u32));
500		idx++;
501	}
502	return 0;
503}
504
505static int hw_break_set(struct task_struct *target,
506			const struct user_regset *regset,
507			unsigned int pos, unsigned int count,
508			const void *kbuf, const void __user *ubuf)
509{
510	unsigned int note_type = regset->core_note_type;
511	int ret, idx = 0, offset, limit;
512	u32 ctrl;
513	u64 addr;
514
515	/* Resource info and pad */
516	offset = offsetof(struct user_hwdebug_state, dbg_regs);
517	user_regset_copyin_ignore(&pos, &count, &kbuf, &ubuf, 0, offset);
518
519	/* (address, ctrl) registers */
520	limit = regset->n * regset->size;
521	while (count && offset < limit) {
522		if (count < PTRACE_HBP_ADDR_SZ)
523			return -EINVAL;
524		ret = user_regset_copyin(&pos, &count, &kbuf, &ubuf, &addr,
525					 offset, offset + PTRACE_HBP_ADDR_SZ);
526		if (ret)
527			return ret;
528		ret = ptrace_hbp_set_addr(note_type, target, idx, addr);
529		if (ret)
530			return ret;
531		offset += PTRACE_HBP_ADDR_SZ;
532
533		if (!count)
534			break;
535		ret = user_regset_copyin(&pos, &count, &kbuf, &ubuf, &ctrl,
536					 offset, offset + PTRACE_HBP_CTRL_SZ);
537		if (ret)
538			return ret;
539		ret = ptrace_hbp_set_ctrl(note_type, target, idx, ctrl);
540		if (ret)
541			return ret;
542		offset += PTRACE_HBP_CTRL_SZ;
543
544		user_regset_copyin_ignore(&pos, &count, &kbuf, &ubuf,
545					  offset, offset + PTRACE_HBP_PAD_SZ);
546		offset += PTRACE_HBP_PAD_SZ;
547		idx++;
548	}
549
550	return 0;
551}
552#endif	/* CONFIG_HAVE_HW_BREAKPOINT */
553
554static int gpr_get(struct task_struct *target,
555		   const struct user_regset *regset,
556		   struct membuf to)
557{
558	struct user_pt_regs *uregs = &task_pt_regs(target)->user_regs;
559	return membuf_write(&to, uregs, sizeof(*uregs));
560}
561
562static int gpr_set(struct task_struct *target, const struct user_regset *regset,
563		   unsigned int pos, unsigned int count,
564		   const void *kbuf, const void __user *ubuf)
565{
566	int ret;
567	struct user_pt_regs newregs = task_pt_regs(target)->user_regs;
568
569	ret = user_regset_copyin(&pos, &count, &kbuf, &ubuf, &newregs, 0, -1);
570	if (ret)
571		return ret;
572
573	if (!valid_user_regs(&newregs, target))
574		return -EINVAL;
575
576	task_pt_regs(target)->user_regs = newregs;
577	return 0;
578}
579
580static int fpr_active(struct task_struct *target, const struct user_regset *regset)
581{
582	if (!system_supports_fpsimd())
583		return -ENODEV;
584	return regset->n;
585}
586
587/*
588 * TODO: update fp accessors for lazy context switching (sync/flush hwstate)
589 */
590static int __fpr_get(struct task_struct *target,
591		     const struct user_regset *regset,
592		     struct membuf to)
593{
594	struct user_fpsimd_state *uregs;
595
596	sve_sync_to_fpsimd(target);
597
598	uregs = &target->thread.uw.fpsimd_state;
599
600	return membuf_write(&to, uregs, sizeof(*uregs));
601}
602
603static int fpr_get(struct task_struct *target, const struct user_regset *regset,
604		   struct membuf to)
605{
606	if (!system_supports_fpsimd())
607		return -EINVAL;
608
609	if (target == current)
610		fpsimd_preserve_current_state();
611
612	return __fpr_get(target, regset, to);
613}
614
615static int __fpr_set(struct task_struct *target,
616		     const struct user_regset *regset,
617		     unsigned int pos, unsigned int count,
618		     const void *kbuf, const void __user *ubuf,
619		     unsigned int start_pos)
620{
621	int ret;
622	struct user_fpsimd_state newstate;
623
624	/*
625	 * Ensure target->thread.uw.fpsimd_state is up to date, so that a
626	 * short copyin can't resurrect stale data.
627	 */
628	sve_sync_to_fpsimd(target);
629
630	newstate = target->thread.uw.fpsimd_state;
631
632	ret = user_regset_copyin(&pos, &count, &kbuf, &ubuf, &newstate,
633				 start_pos, start_pos + sizeof(newstate));
634	if (ret)
635		return ret;
636
637	target->thread.uw.fpsimd_state = newstate;
638
639	return ret;
640}
641
642static int fpr_set(struct task_struct *target, const struct user_regset *regset,
643		   unsigned int pos, unsigned int count,
644		   const void *kbuf, const void __user *ubuf)
645{
646	int ret;
647
648	if (!system_supports_fpsimd())
649		return -EINVAL;
650
651	ret = __fpr_set(target, regset, pos, count, kbuf, ubuf, 0);
652	if (ret)
653		return ret;
654
655	sve_sync_from_fpsimd_zeropad(target);
656	fpsimd_flush_task_state(target);
657
658	return ret;
659}
660
661static int tls_get(struct task_struct *target, const struct user_regset *regset,
662		   struct membuf to)
663{
664	int ret;
665
666	if (target == current)
667		tls_preserve_current_state();
668
669	ret = membuf_store(&to, target->thread.uw.tp_value);
670	if (system_supports_tpidr2())
671		ret = membuf_store(&to, target->thread.tpidr2_el0);
672	else
673		ret = membuf_zero(&to, sizeof(u64));
674
675	return ret;
676}
677
678static int tls_set(struct task_struct *target, const struct user_regset *regset,
679		   unsigned int pos, unsigned int count,
680		   const void *kbuf, const void __user *ubuf)
681{
682	int ret;
683	unsigned long tls[2];
684
685	tls[0] = target->thread.uw.tp_value;
686	if (system_supports_tpidr2())
687		tls[1] = target->thread.tpidr2_el0;
688
689	ret = user_regset_copyin(&pos, &count, &kbuf, &ubuf, tls, 0, count);
690	if (ret)
691		return ret;
692
693	target->thread.uw.tp_value = tls[0];
694	if (system_supports_tpidr2())
695		target->thread.tpidr2_el0 = tls[1];
696
697	return ret;
698}
699
700static int fpmr_get(struct task_struct *target, const struct user_regset *regset,
701		   struct membuf to)
702{
703	if (!system_supports_fpmr())
704		return -EINVAL;
705
706	if (target == current)
707		fpsimd_preserve_current_state();
708
709	return membuf_store(&to, target->thread.uw.fpmr);
710}
711
712static int fpmr_set(struct task_struct *target, const struct user_regset *regset,
713		   unsigned int pos, unsigned int count,
714		   const void *kbuf, const void __user *ubuf)
715{
716	int ret;
717	unsigned long fpmr;
718
719	if (!system_supports_fpmr())
720		return -EINVAL;
721
722	ret = user_regset_copyin(&pos, &count, &kbuf, &ubuf, &fpmr, 0, count);
723	if (ret)
724		return ret;
725
726	target->thread.uw.fpmr = fpmr;
727
728	fpsimd_flush_task_state(target);
729
730	return 0;
731}
732
733static int system_call_get(struct task_struct *target,
734			   const struct user_regset *regset,
735			   struct membuf to)
736{
737	return membuf_store(&to, task_pt_regs(target)->syscallno);
738}
739
740static int system_call_set(struct task_struct *target,
741			   const struct user_regset *regset,
742			   unsigned int pos, unsigned int count,
743			   const void *kbuf, const void __user *ubuf)
744{
745	int syscallno = task_pt_regs(target)->syscallno;
746	int ret;
747
748	ret = user_regset_copyin(&pos, &count, &kbuf, &ubuf, &syscallno, 0, -1);
749	if (ret)
750		return ret;
751
752	task_pt_regs(target)->syscallno = syscallno;
753	return ret;
754}
755
756#ifdef CONFIG_ARM64_SVE
757
758static void sve_init_header_from_task(struct user_sve_header *header,
759				      struct task_struct *target,
760				      enum vec_type type)
761{
762	unsigned int vq;
763	bool active;
764	enum vec_type task_type;
765
766	memset(header, 0, sizeof(*header));
767
768	/* Check if the requested registers are active for the task */
769	if (thread_sm_enabled(&target->thread))
770		task_type = ARM64_VEC_SME;
771	else
772		task_type = ARM64_VEC_SVE;
773	active = (task_type == type);
774
775	switch (type) {
776	case ARM64_VEC_SVE:
777		if (test_tsk_thread_flag(target, TIF_SVE_VL_INHERIT))
778			header->flags |= SVE_PT_VL_INHERIT;
779		break;
780	case ARM64_VEC_SME:
781		if (test_tsk_thread_flag(target, TIF_SME_VL_INHERIT))
782			header->flags |= SVE_PT_VL_INHERIT;
783		break;
784	default:
785		WARN_ON_ONCE(1);
786		return;
787	}
788
789	if (active) {
790		if (target->thread.fp_type == FP_STATE_FPSIMD) {
791			header->flags |= SVE_PT_REGS_FPSIMD;
792		} else {
793			header->flags |= SVE_PT_REGS_SVE;
794		}
795	}
796
797	header->vl = task_get_vl(target, type);
798	vq = sve_vq_from_vl(header->vl);
799
800	header->max_vl = vec_max_vl(type);
801	header->size = SVE_PT_SIZE(vq, header->flags);
802	header->max_size = SVE_PT_SIZE(sve_vq_from_vl(header->max_vl),
803				      SVE_PT_REGS_SVE);
804}
805
806static unsigned int sve_size_from_header(struct user_sve_header const *header)
807{
808	return ALIGN(header->size, SVE_VQ_BYTES);
809}
810
811static int sve_get_common(struct task_struct *target,
812			  const struct user_regset *regset,
813			  struct membuf to,
814			  enum vec_type type)
815{
816	struct user_sve_header header;
817	unsigned int vq;
818	unsigned long start, end;
819
820	/* Header */
821	sve_init_header_from_task(&header, target, type);
822	vq = sve_vq_from_vl(header.vl);
823
824	membuf_write(&to, &header, sizeof(header));
825
826	if (target == current)
827		fpsimd_preserve_current_state();
828
829	BUILD_BUG_ON(SVE_PT_FPSIMD_OFFSET != sizeof(header));
830	BUILD_BUG_ON(SVE_PT_SVE_OFFSET != sizeof(header));
831
832	switch ((header.flags & SVE_PT_REGS_MASK)) {
833	case SVE_PT_REGS_FPSIMD:
834		return __fpr_get(target, regset, to);
835
836	case SVE_PT_REGS_SVE:
837		start = SVE_PT_SVE_OFFSET;
838		end = SVE_PT_SVE_FFR_OFFSET(vq) + SVE_PT_SVE_FFR_SIZE(vq);
839		membuf_write(&to, target->thread.sve_state, end - start);
840
841		start = end;
842		end = SVE_PT_SVE_FPSR_OFFSET(vq);
843		membuf_zero(&to, end - start);
844
845		/*
846		 * Copy fpsr, and fpcr which must follow contiguously in
847		 * struct fpsimd_state:
848		 */
849		start = end;
850		end = SVE_PT_SVE_FPCR_OFFSET(vq) + SVE_PT_SVE_FPCR_SIZE;
851		membuf_write(&to, &target->thread.uw.fpsimd_state.fpsr,
852			     end - start);
853
854		start = end;
855		end = sve_size_from_header(&header);
856		return membuf_zero(&to, end - start);
857
858	default:
859		return 0;
860	}
861}
862
863static int sve_get(struct task_struct *target,
864		   const struct user_regset *regset,
865		   struct membuf to)
866{
867	if (!system_supports_sve())
868		return -EINVAL;
869
870	return sve_get_common(target, regset, to, ARM64_VEC_SVE);
871}
872
873static int sve_set_common(struct task_struct *target,
874			  const struct user_regset *regset,
875			  unsigned int pos, unsigned int count,
876			  const void *kbuf, const void __user *ubuf,
877			  enum vec_type type)
878{
879	int ret;
880	struct user_sve_header header;
881	unsigned int vq;
882	unsigned long start, end;
883
884	/* Header */
885	if (count < sizeof(header))
886		return -EINVAL;
887	ret = user_regset_copyin(&pos, &count, &kbuf, &ubuf, &header,
888				 0, sizeof(header));
889	if (ret)
890		goto out;
891
892	/*
893	 * Apart from SVE_PT_REGS_MASK, all SVE_PT_* flags are consumed by
894	 * vec_set_vector_length(), which will also validate them for us:
895	 */
896	ret = vec_set_vector_length(target, type, header.vl,
897		((unsigned long)header.flags & ~SVE_PT_REGS_MASK) << 16);
898	if (ret)
899		goto out;
900
901	/* Actual VL set may be less than the user asked for: */
902	vq = sve_vq_from_vl(task_get_vl(target, type));
903
904	/* Enter/exit streaming mode */
905	if (system_supports_sme()) {
906		u64 old_svcr = target->thread.svcr;
907
908		switch (type) {
909		case ARM64_VEC_SVE:
910			target->thread.svcr &= ~SVCR_SM_MASK;
911			break;
912		case ARM64_VEC_SME:
913			target->thread.svcr |= SVCR_SM_MASK;
914
915			/*
916			 * Disable traps and ensure there is SME storage but
917			 * preserve any currently set values in ZA/ZT.
918			 */
919			sme_alloc(target, false);
920			set_tsk_thread_flag(target, TIF_SME);
921			break;
922		default:
923			WARN_ON_ONCE(1);
924			ret = -EINVAL;
925			goto out;
926		}
927
928		/*
929		 * If we switched then invalidate any existing SVE
930		 * state and ensure there's storage.
931		 */
932		if (target->thread.svcr != old_svcr)
933			sve_alloc(target, true);
934	}
935
936	/* Registers: FPSIMD-only case */
937
938	BUILD_BUG_ON(SVE_PT_FPSIMD_OFFSET != sizeof(header));
939	if ((header.flags & SVE_PT_REGS_MASK) == SVE_PT_REGS_FPSIMD) {
940		ret = __fpr_set(target, regset, pos, count, kbuf, ubuf,
941				SVE_PT_FPSIMD_OFFSET);
942		clear_tsk_thread_flag(target, TIF_SVE);
943		target->thread.fp_type = FP_STATE_FPSIMD;
944		goto out;
945	}
946
947	/*
948	 * Otherwise: no registers or full SVE case.  For backwards
949	 * compatibility reasons we treat empty flags as SVE registers.
950	 */
951
952	/*
953	 * If setting a different VL from the requested VL and there is
954	 * register data, the data layout will be wrong: don't even
955	 * try to set the registers in this case.
956	 */
957	if (count && vq != sve_vq_from_vl(header.vl)) {
958		ret = -EIO;
959		goto out;
960	}
961
962	sve_alloc(target, true);
963	if (!target->thread.sve_state) {
964		ret = -ENOMEM;
965		clear_tsk_thread_flag(target, TIF_SVE);
966		target->thread.fp_type = FP_STATE_FPSIMD;
967		goto out;
968	}
969
970	/*
971	 * Ensure target->thread.sve_state is up to date with target's
972	 * FPSIMD regs, so that a short copyin leaves trailing
973	 * registers unmodified.  Only enable SVE if we are
974	 * configuring normal SVE, a system with streaming SVE may not
975	 * have normal SVE.
976	 */
977	fpsimd_sync_to_sve(target);
978	if (type == ARM64_VEC_SVE)
979		set_tsk_thread_flag(target, TIF_SVE);
980	target->thread.fp_type = FP_STATE_SVE;
981
982	BUILD_BUG_ON(SVE_PT_SVE_OFFSET != sizeof(header));
983	start = SVE_PT_SVE_OFFSET;
984	end = SVE_PT_SVE_FFR_OFFSET(vq) + SVE_PT_SVE_FFR_SIZE(vq);
985	ret = user_regset_copyin(&pos, &count, &kbuf, &ubuf,
986				 target->thread.sve_state,
987				 start, end);
988	if (ret)
989		goto out;
990
991	start = end;
992	end = SVE_PT_SVE_FPSR_OFFSET(vq);
993	user_regset_copyin_ignore(&pos, &count, &kbuf, &ubuf, start, end);
994
995	/*
996	 * Copy fpsr, and fpcr which must follow contiguously in
997	 * struct fpsimd_state:
998	 */
999	start = end;
1000	end = SVE_PT_SVE_FPCR_OFFSET(vq) + SVE_PT_SVE_FPCR_SIZE;
1001	ret = user_regset_copyin(&pos, &count, &kbuf, &ubuf,
1002				 &target->thread.uw.fpsimd_state.fpsr,
1003				 start, end);
1004
1005out:
1006	fpsimd_flush_task_state(target);
1007	return ret;
1008}
1009
1010static int sve_set(struct task_struct *target,
1011		   const struct user_regset *regset,
1012		   unsigned int pos, unsigned int count,
1013		   const void *kbuf, const void __user *ubuf)
1014{
1015	if (!system_supports_sve())
1016		return -EINVAL;
1017
1018	return sve_set_common(target, regset, pos, count, kbuf, ubuf,
1019			      ARM64_VEC_SVE);
1020}
1021
1022#endif /* CONFIG_ARM64_SVE */
1023
1024#ifdef CONFIG_ARM64_SME
1025
1026static int ssve_get(struct task_struct *target,
1027		   const struct user_regset *regset,
1028		   struct membuf to)
1029{
1030	if (!system_supports_sme())
1031		return -EINVAL;
1032
1033	return sve_get_common(target, regset, to, ARM64_VEC_SME);
1034}
1035
1036static int ssve_set(struct task_struct *target,
1037		    const struct user_regset *regset,
1038		    unsigned int pos, unsigned int count,
1039		    const void *kbuf, const void __user *ubuf)
1040{
1041	if (!system_supports_sme())
1042		return -EINVAL;
1043
1044	return sve_set_common(target, regset, pos, count, kbuf, ubuf,
1045			      ARM64_VEC_SME);
1046}
1047
1048static int za_get(struct task_struct *target,
1049		  const struct user_regset *regset,
1050		  struct membuf to)
1051{
1052	struct user_za_header header;
1053	unsigned int vq;
1054	unsigned long start, end;
1055
1056	if (!system_supports_sme())
1057		return -EINVAL;
1058
1059	/* Header */
1060	memset(&header, 0, sizeof(header));
1061
1062	if (test_tsk_thread_flag(target, TIF_SME_VL_INHERIT))
1063		header.flags |= ZA_PT_VL_INHERIT;
1064
1065	header.vl = task_get_sme_vl(target);
1066	vq = sve_vq_from_vl(header.vl);
1067	header.max_vl = sme_max_vl();
1068	header.max_size = ZA_PT_SIZE(vq);
1069
1070	/* If ZA is not active there is only the header */
1071	if (thread_za_enabled(&target->thread))
1072		header.size = ZA_PT_SIZE(vq);
1073	else
1074		header.size = ZA_PT_ZA_OFFSET;
1075
1076	membuf_write(&to, &header, sizeof(header));
1077
1078	BUILD_BUG_ON(ZA_PT_ZA_OFFSET != sizeof(header));
1079	end = ZA_PT_ZA_OFFSET;
1080
1081	if (target == current)
1082		fpsimd_preserve_current_state();
1083
1084	/* Any register data to include? */
1085	if (thread_za_enabled(&target->thread)) {
1086		start = end;
1087		end = ZA_PT_SIZE(vq);
1088		membuf_write(&to, target->thread.sme_state, end - start);
1089	}
1090
1091	/* Zero any trailing padding */
1092	start = end;
1093	end = ALIGN(header.size, SVE_VQ_BYTES);
1094	return membuf_zero(&to, end - start);
1095}
1096
1097static int za_set(struct task_struct *target,
1098		  const struct user_regset *regset,
1099		  unsigned int pos, unsigned int count,
1100		  const void *kbuf, const void __user *ubuf)
1101{
1102	int ret;
1103	struct user_za_header header;
1104	unsigned int vq;
1105	unsigned long start, end;
1106
1107	if (!system_supports_sme())
1108		return -EINVAL;
1109
1110	/* Header */
1111	if (count < sizeof(header))
1112		return -EINVAL;
1113	ret = user_regset_copyin(&pos, &count, &kbuf, &ubuf, &header,
1114				 0, sizeof(header));
1115	if (ret)
1116		goto out;
1117
1118	/*
1119	 * All current ZA_PT_* flags are consumed by
1120	 * vec_set_vector_length(), which will also validate them for
1121	 * us:
1122	 */
1123	ret = vec_set_vector_length(target, ARM64_VEC_SME, header.vl,
1124		((unsigned long)header.flags) << 16);
1125	if (ret)
1126		goto out;
1127
1128	/* Actual VL set may be less than the user asked for: */
1129	vq = sve_vq_from_vl(task_get_sme_vl(target));
1130
1131	/* Ensure there is some SVE storage for streaming mode */
1132	if (!target->thread.sve_state) {
1133		sve_alloc(target, false);
1134		if (!target->thread.sve_state) {
1135			ret = -ENOMEM;
1136			goto out;
1137		}
1138	}
1139
1140	/*
1141	 * Only flush the storage if PSTATE.ZA was not already set,
1142	 * otherwise preserve any existing data.
1143	 */
1144	sme_alloc(target, !thread_za_enabled(&target->thread));
1145	if (!target->thread.sme_state)
1146		return -ENOMEM;
1147
1148	/* If there is no data then disable ZA */
1149	if (!count) {
1150		target->thread.svcr &= ~SVCR_ZA_MASK;
1151		goto out;
1152	}
1153
1154	/*
1155	 * If setting a different VL from the requested VL and there is
1156	 * register data, the data layout will be wrong: don't even
1157	 * try to set the registers in this case.
1158	 */
1159	if (vq != sve_vq_from_vl(header.vl)) {
1160		ret = -EIO;
1161		goto out;
1162	}
1163
1164	BUILD_BUG_ON(ZA_PT_ZA_OFFSET != sizeof(header));
1165	start = ZA_PT_ZA_OFFSET;
1166	end = ZA_PT_SIZE(vq);
1167	ret = user_regset_copyin(&pos, &count, &kbuf, &ubuf,
1168				 target->thread.sme_state,
1169				 start, end);
1170	if (ret)
1171		goto out;
1172
1173	/* Mark ZA as active and let userspace use it */
1174	set_tsk_thread_flag(target, TIF_SME);
1175	target->thread.svcr |= SVCR_ZA_MASK;
1176
1177out:
1178	fpsimd_flush_task_state(target);
1179	return ret;
1180}
1181
1182static int zt_get(struct task_struct *target,
1183		  const struct user_regset *regset,
1184		  struct membuf to)
1185{
1186	if (!system_supports_sme2())
1187		return -EINVAL;
1188
1189	/*
1190	 * If PSTATE.ZA is not set then ZT will be zeroed when it is
1191	 * enabled so report the current register value as zero.
1192	 */
1193	if (thread_za_enabled(&target->thread))
1194		membuf_write(&to, thread_zt_state(&target->thread),
1195			     ZT_SIG_REG_BYTES);
1196	else
1197		membuf_zero(&to, ZT_SIG_REG_BYTES);
1198
1199	return 0;
1200}
1201
1202static int zt_set(struct task_struct *target,
1203		  const struct user_regset *regset,
1204		  unsigned int pos, unsigned int count,
1205		  const void *kbuf, const void __user *ubuf)
1206{
1207	int ret;
1208
1209	if (!system_supports_sme2())
1210		return -EINVAL;
1211
1212	/* Ensure SVE storage in case this is first use of SME */
1213	sve_alloc(target, false);
1214	if (!target->thread.sve_state)
1215		return -ENOMEM;
1216
1217	if (!thread_za_enabled(&target->thread)) {
1218		sme_alloc(target, true);
1219		if (!target->thread.sme_state)
1220			return -ENOMEM;
1221	}
1222
1223	ret = user_regset_copyin(&pos, &count, &kbuf, &ubuf,
1224				 thread_zt_state(&target->thread),
1225				 0, ZT_SIG_REG_BYTES);
1226	if (ret == 0) {
1227		target->thread.svcr |= SVCR_ZA_MASK;
1228		set_tsk_thread_flag(target, TIF_SME);
1229	}
1230
1231	fpsimd_flush_task_state(target);
1232
1233	return ret;
1234}
1235
1236#endif /* CONFIG_ARM64_SME */
1237
1238#ifdef CONFIG_ARM64_PTR_AUTH
1239static int pac_mask_get(struct task_struct *target,
1240			const struct user_regset *regset,
1241			struct membuf to)
1242{
1243	/*
1244	 * The PAC bits can differ across data and instruction pointers
1245	 * depending on TCR_EL1.TBID*, which we may make use of in future, so
1246	 * we expose separate masks.
1247	 */
1248	unsigned long mask = ptrauth_user_pac_mask();
1249	struct user_pac_mask uregs = {
1250		.data_mask = mask,
1251		.insn_mask = mask,
1252	};
1253
1254	if (!system_supports_address_auth())
1255		return -EINVAL;
1256
1257	return membuf_write(&to, &uregs, sizeof(uregs));
1258}
1259
1260static int pac_enabled_keys_get(struct task_struct *target,
1261				const struct user_regset *regset,
1262				struct membuf to)
1263{
1264	long enabled_keys = ptrauth_get_enabled_keys(target);
1265
1266	if (IS_ERR_VALUE(enabled_keys))
1267		return enabled_keys;
1268
1269	return membuf_write(&to, &enabled_keys, sizeof(enabled_keys));
1270}
1271
1272static int pac_enabled_keys_set(struct task_struct *target,
1273				const struct user_regset *regset,
1274				unsigned int pos, unsigned int count,
1275				const void *kbuf, const void __user *ubuf)
1276{
1277	int ret;
1278	long enabled_keys = ptrauth_get_enabled_keys(target);
1279
1280	if (IS_ERR_VALUE(enabled_keys))
1281		return enabled_keys;
1282
1283	ret = user_regset_copyin(&pos, &count, &kbuf, &ubuf, &enabled_keys, 0,
1284				 sizeof(long));
1285	if (ret)
1286		return ret;
1287
1288	return ptrauth_set_enabled_keys(target, PR_PAC_ENABLED_KEYS_MASK,
1289					enabled_keys);
1290}
1291
1292#ifdef CONFIG_CHECKPOINT_RESTORE
1293static __uint128_t pac_key_to_user(const struct ptrauth_key *key)
1294{
1295	return (__uint128_t)key->hi << 64 | key->lo;
1296}
1297
1298static struct ptrauth_key pac_key_from_user(__uint128_t ukey)
1299{
1300	struct ptrauth_key key = {
1301		.lo = (unsigned long)ukey,
1302		.hi = (unsigned long)(ukey >> 64),
1303	};
1304
1305	return key;
1306}
1307
1308static void pac_address_keys_to_user(struct user_pac_address_keys *ukeys,
1309				     const struct ptrauth_keys_user *keys)
1310{
1311	ukeys->apiakey = pac_key_to_user(&keys->apia);
1312	ukeys->apibkey = pac_key_to_user(&keys->apib);
1313	ukeys->apdakey = pac_key_to_user(&keys->apda);
1314	ukeys->apdbkey = pac_key_to_user(&keys->apdb);
1315}
1316
1317static void pac_address_keys_from_user(struct ptrauth_keys_user *keys,
1318				       const struct user_pac_address_keys *ukeys)
1319{
1320	keys->apia = pac_key_from_user(ukeys->apiakey);
1321	keys->apib = pac_key_from_user(ukeys->apibkey);
1322	keys->apda = pac_key_from_user(ukeys->apdakey);
1323	keys->apdb = pac_key_from_user(ukeys->apdbkey);
1324}
1325
1326static int pac_address_keys_get(struct task_struct *target,
1327				const struct user_regset *regset,
1328				struct membuf to)
1329{
1330	struct ptrauth_keys_user *keys = &target->thread.keys_user;
1331	struct user_pac_address_keys user_keys;
1332
1333	if (!system_supports_address_auth())
1334		return -EINVAL;
1335
1336	pac_address_keys_to_user(&user_keys, keys);
1337
1338	return membuf_write(&to, &user_keys, sizeof(user_keys));
1339}
1340
1341static int pac_address_keys_set(struct task_struct *target,
1342				const struct user_regset *regset,
1343				unsigned int pos, unsigned int count,
1344				const void *kbuf, const void __user *ubuf)
1345{
1346	struct ptrauth_keys_user *keys = &target->thread.keys_user;
1347	struct user_pac_address_keys user_keys;
1348	int ret;
1349
1350	if (!system_supports_address_auth())
1351		return -EINVAL;
1352
1353	pac_address_keys_to_user(&user_keys, keys);
1354	ret = user_regset_copyin(&pos, &count, &kbuf, &ubuf,
1355				 &user_keys, 0, -1);
1356	if (ret)
1357		return ret;
1358	pac_address_keys_from_user(keys, &user_keys);
1359
1360	return 0;
1361}
1362
1363static void pac_generic_keys_to_user(struct user_pac_generic_keys *ukeys,
1364				     const struct ptrauth_keys_user *keys)
1365{
1366	ukeys->apgakey = pac_key_to_user(&keys->apga);
1367}
1368
1369static void pac_generic_keys_from_user(struct ptrauth_keys_user *keys,
1370				       const struct user_pac_generic_keys *ukeys)
1371{
1372	keys->apga = pac_key_from_user(ukeys->apgakey);
1373}
1374
1375static int pac_generic_keys_get(struct task_struct *target,
1376				const struct user_regset *regset,
1377				struct membuf to)
1378{
1379	struct ptrauth_keys_user *keys = &target->thread.keys_user;
1380	struct user_pac_generic_keys user_keys;
1381
1382	if (!system_supports_generic_auth())
1383		return -EINVAL;
1384
1385	pac_generic_keys_to_user(&user_keys, keys);
1386
1387	return membuf_write(&to, &user_keys, sizeof(user_keys));
1388}
1389
1390static int pac_generic_keys_set(struct task_struct *target,
1391				const struct user_regset *regset,
1392				unsigned int pos, unsigned int count,
1393				const void *kbuf, const void __user *ubuf)
1394{
1395	struct ptrauth_keys_user *keys = &target->thread.keys_user;
1396	struct user_pac_generic_keys user_keys;
1397	int ret;
1398
1399	if (!system_supports_generic_auth())
1400		return -EINVAL;
1401
1402	pac_generic_keys_to_user(&user_keys, keys);
1403	ret = user_regset_copyin(&pos, &count, &kbuf, &ubuf,
1404				 &user_keys, 0, -1);
1405	if (ret)
1406		return ret;
1407	pac_generic_keys_from_user(keys, &user_keys);
1408
1409	return 0;
1410}
1411#endif /* CONFIG_CHECKPOINT_RESTORE */
1412#endif /* CONFIG_ARM64_PTR_AUTH */
1413
1414#ifdef CONFIG_ARM64_TAGGED_ADDR_ABI
1415static int tagged_addr_ctrl_get(struct task_struct *target,
1416				const struct user_regset *regset,
1417				struct membuf to)
1418{
1419	long ctrl = get_tagged_addr_ctrl(target);
1420
1421	if (IS_ERR_VALUE(ctrl))
1422		return ctrl;
1423
1424	return membuf_write(&to, &ctrl, sizeof(ctrl));
1425}
1426
1427static int tagged_addr_ctrl_set(struct task_struct *target, const struct
1428				user_regset *regset, unsigned int pos,
1429				unsigned int count, const void *kbuf, const
1430				void __user *ubuf)
1431{
1432	int ret;
1433	long ctrl;
1434
1435	ret = user_regset_copyin(&pos, &count, &kbuf, &ubuf, &ctrl, 0, -1);
1436	if (ret)
1437		return ret;
1438
1439	return set_tagged_addr_ctrl(target, ctrl);
1440}
1441#endif
1442
1443enum aarch64_regset {
1444	REGSET_GPR,
1445	REGSET_FPR,
1446	REGSET_TLS,
1447#ifdef CONFIG_HAVE_HW_BREAKPOINT
1448	REGSET_HW_BREAK,
1449	REGSET_HW_WATCH,
1450#endif
1451	REGSET_FPMR,
1452	REGSET_SYSTEM_CALL,
1453#ifdef CONFIG_ARM64_SVE
1454	REGSET_SVE,
1455#endif
1456#ifdef CONFIG_ARM64_SME
1457	REGSET_SSVE,
1458	REGSET_ZA,
1459	REGSET_ZT,
1460#endif
1461#ifdef CONFIG_ARM64_PTR_AUTH
1462	REGSET_PAC_MASK,
1463	REGSET_PAC_ENABLED_KEYS,
1464#ifdef CONFIG_CHECKPOINT_RESTORE
1465	REGSET_PACA_KEYS,
1466	REGSET_PACG_KEYS,
1467#endif
1468#endif
1469#ifdef CONFIG_ARM64_TAGGED_ADDR_ABI
1470	REGSET_TAGGED_ADDR_CTRL,
1471#endif
1472};
1473
1474static const struct user_regset aarch64_regsets[] = {
1475	[REGSET_GPR] = {
1476		.core_note_type = NT_PRSTATUS,
1477		.n = sizeof(struct user_pt_regs) / sizeof(u64),
1478		.size = sizeof(u64),
1479		.align = sizeof(u64),
1480		.regset_get = gpr_get,
1481		.set = gpr_set
1482	},
1483	[REGSET_FPR] = {
1484		.core_note_type = NT_PRFPREG,
1485		.n = sizeof(struct user_fpsimd_state) / sizeof(u32),
1486		/*
1487		 * We pretend we have 32-bit registers because the fpsr and
1488		 * fpcr are 32-bits wide.
1489		 */
1490		.size = sizeof(u32),
1491		.align = sizeof(u32),
1492		.active = fpr_active,
1493		.regset_get = fpr_get,
1494		.set = fpr_set
1495	},
1496	[REGSET_TLS] = {
1497		.core_note_type = NT_ARM_TLS,
1498		.n = 2,
1499		.size = sizeof(void *),
1500		.align = sizeof(void *),
1501		.regset_get = tls_get,
1502		.set = tls_set,
1503	},
1504#ifdef CONFIG_HAVE_HW_BREAKPOINT
1505	[REGSET_HW_BREAK] = {
1506		.core_note_type = NT_ARM_HW_BREAK,
1507		.n = sizeof(struct user_hwdebug_state) / sizeof(u32),
1508		.size = sizeof(u32),
1509		.align = sizeof(u32),
1510		.regset_get = hw_break_get,
1511		.set = hw_break_set,
1512	},
1513	[REGSET_HW_WATCH] = {
1514		.core_note_type = NT_ARM_HW_WATCH,
1515		.n = sizeof(struct user_hwdebug_state) / sizeof(u32),
1516		.size = sizeof(u32),
1517		.align = sizeof(u32),
1518		.regset_get = hw_break_get,
1519		.set = hw_break_set,
1520	},
1521#endif
1522	[REGSET_SYSTEM_CALL] = {
1523		.core_note_type = NT_ARM_SYSTEM_CALL,
1524		.n = 1,
1525		.size = sizeof(int),
1526		.align = sizeof(int),
1527		.regset_get = system_call_get,
1528		.set = system_call_set,
1529	},
1530	[REGSET_FPMR] = {
1531		.core_note_type = NT_ARM_FPMR,
1532		.n = 1,
1533		.size = sizeof(u64),
1534		.align = sizeof(u64),
1535		.regset_get = fpmr_get,
1536		.set = fpmr_set,
1537	},
1538#ifdef CONFIG_ARM64_SVE
1539	[REGSET_SVE] = { /* Scalable Vector Extension */
1540		.core_note_type = NT_ARM_SVE,
1541		.n = DIV_ROUND_UP(SVE_PT_SIZE(ARCH_SVE_VQ_MAX,
1542					      SVE_PT_REGS_SVE),
1543				  SVE_VQ_BYTES),
1544		.size = SVE_VQ_BYTES,
1545		.align = SVE_VQ_BYTES,
1546		.regset_get = sve_get,
1547		.set = sve_set,
1548	},
1549#endif
1550#ifdef CONFIG_ARM64_SME
1551	[REGSET_SSVE] = { /* Streaming mode SVE */
1552		.core_note_type = NT_ARM_SSVE,
1553		.n = DIV_ROUND_UP(SVE_PT_SIZE(SME_VQ_MAX, SVE_PT_REGS_SVE),
1554				  SVE_VQ_BYTES),
1555		.size = SVE_VQ_BYTES,
1556		.align = SVE_VQ_BYTES,
1557		.regset_get = ssve_get,
1558		.set = ssve_set,
1559	},
1560	[REGSET_ZA] = { /* SME ZA */
1561		.core_note_type = NT_ARM_ZA,
1562		/*
1563		 * ZA is a single register but it's variably sized and
1564		 * the ptrace core requires that the size of any data
1565		 * be an exact multiple of the configured register
1566		 * size so report as though we had SVE_VQ_BYTES
1567		 * registers. These values aren't exposed to
1568		 * userspace.
1569		 */
1570		.n = DIV_ROUND_UP(ZA_PT_SIZE(SME_VQ_MAX), SVE_VQ_BYTES),
1571		.size = SVE_VQ_BYTES,
1572		.align = SVE_VQ_BYTES,
1573		.regset_get = za_get,
1574		.set = za_set,
1575	},
1576	[REGSET_ZT] = { /* SME ZT */
1577		.core_note_type = NT_ARM_ZT,
1578		.n = 1,
1579		.size = ZT_SIG_REG_BYTES,
1580		.align = sizeof(u64),
1581		.regset_get = zt_get,
1582		.set = zt_set,
1583	},
1584#endif
1585#ifdef CONFIG_ARM64_PTR_AUTH
1586	[REGSET_PAC_MASK] = {
1587		.core_note_type = NT_ARM_PAC_MASK,
1588		.n = sizeof(struct user_pac_mask) / sizeof(u64),
1589		.size = sizeof(u64),
1590		.align = sizeof(u64),
1591		.regset_get = pac_mask_get,
1592		/* this cannot be set dynamically */
1593	},
1594	[REGSET_PAC_ENABLED_KEYS] = {
1595		.core_note_type = NT_ARM_PAC_ENABLED_KEYS,
1596		.n = 1,
1597		.size = sizeof(long),
1598		.align = sizeof(long),
1599		.regset_get = pac_enabled_keys_get,
1600		.set = pac_enabled_keys_set,
1601	},
1602#ifdef CONFIG_CHECKPOINT_RESTORE
1603	[REGSET_PACA_KEYS] = {
1604		.core_note_type = NT_ARM_PACA_KEYS,
1605		.n = sizeof(struct user_pac_address_keys) / sizeof(__uint128_t),
1606		.size = sizeof(__uint128_t),
1607		.align = sizeof(__uint128_t),
1608		.regset_get = pac_address_keys_get,
1609		.set = pac_address_keys_set,
1610	},
1611	[REGSET_PACG_KEYS] = {
1612		.core_note_type = NT_ARM_PACG_KEYS,
1613		.n = sizeof(struct user_pac_generic_keys) / sizeof(__uint128_t),
1614		.size = sizeof(__uint128_t),
1615		.align = sizeof(__uint128_t),
1616		.regset_get = pac_generic_keys_get,
1617		.set = pac_generic_keys_set,
1618	},
1619#endif
1620#endif
1621#ifdef CONFIG_ARM64_TAGGED_ADDR_ABI
1622	[REGSET_TAGGED_ADDR_CTRL] = {
1623		.core_note_type = NT_ARM_TAGGED_ADDR_CTRL,
1624		.n = 1,
1625		.size = sizeof(long),
1626		.align = sizeof(long),
1627		.regset_get = tagged_addr_ctrl_get,
1628		.set = tagged_addr_ctrl_set,
1629	},
1630#endif
1631};
1632
1633static const struct user_regset_view user_aarch64_view = {
1634	.name = "aarch64", .e_machine = EM_AARCH64,
1635	.regsets = aarch64_regsets, .n = ARRAY_SIZE(aarch64_regsets)
1636};
1637
1638enum compat_regset {
1639	REGSET_COMPAT_GPR,
1640	REGSET_COMPAT_VFP,
1641};
1642
1643static inline compat_ulong_t compat_get_user_reg(struct task_struct *task, int idx)
1644{
1645	struct pt_regs *regs = task_pt_regs(task);
1646
1647	switch (idx) {
1648	case 15:
1649		return regs->pc;
1650	case 16:
1651		return pstate_to_compat_psr(regs->pstate);
1652	case 17:
1653		return regs->orig_x0;
1654	default:
1655		return regs->regs[idx];
1656	}
1657}
1658
1659static int compat_gpr_get(struct task_struct *target,
1660			  const struct user_regset *regset,
1661			  struct membuf to)
1662{
1663	int i = 0;
1664
1665	while (to.left)
1666		membuf_store(&to, compat_get_user_reg(target, i++));
1667	return 0;
1668}
1669
1670static int compat_gpr_set(struct task_struct *target,
1671			  const struct user_regset *regset,
1672			  unsigned int pos, unsigned int count,
1673			  const void *kbuf, const void __user *ubuf)
1674{
1675	struct pt_regs newregs;
1676	int ret = 0;
1677	unsigned int i, start, num_regs;
1678
1679	/* Calculate the number of AArch32 registers contained in count */
1680	num_regs = count / regset->size;
1681
1682	/* Convert pos into an register number */
1683	start = pos / regset->size;
1684
1685	if (start + num_regs > regset->n)
1686		return -EIO;
1687
1688	newregs = *task_pt_regs(target);
1689
1690	for (i = 0; i < num_regs; ++i) {
1691		unsigned int idx = start + i;
1692		compat_ulong_t reg;
1693
1694		if (kbuf) {
1695			memcpy(&reg, kbuf, sizeof(reg));
1696			kbuf += sizeof(reg);
1697		} else {
1698			ret = copy_from_user(&reg, ubuf, sizeof(reg));
1699			if (ret) {
1700				ret = -EFAULT;
1701				break;
1702			}
1703
1704			ubuf += sizeof(reg);
1705		}
1706
1707		switch (idx) {
1708		case 15:
1709			newregs.pc = reg;
1710			break;
1711		case 16:
1712			reg = compat_psr_to_pstate(reg);
1713			newregs.pstate = reg;
1714			break;
1715		case 17:
1716			newregs.orig_x0 = reg;
1717			break;
1718		default:
1719			newregs.regs[idx] = reg;
1720		}
1721
1722	}
1723
1724	if (valid_user_regs(&newregs.user_regs, target))
1725		*task_pt_regs(target) = newregs;
1726	else
1727		ret = -EINVAL;
1728
1729	return ret;
1730}
1731
1732static int compat_vfp_get(struct task_struct *target,
1733			  const struct user_regset *regset,
1734			  struct membuf to)
1735{
1736	struct user_fpsimd_state *uregs;
1737	compat_ulong_t fpscr;
1738
1739	if (!system_supports_fpsimd())
1740		return -EINVAL;
1741
1742	uregs = &target->thread.uw.fpsimd_state;
1743
1744	if (target == current)
1745		fpsimd_preserve_current_state();
1746
1747	/*
1748	 * The VFP registers are packed into the fpsimd_state, so they all sit
1749	 * nicely together for us. We just need to create the fpscr separately.
1750	 */
1751	membuf_write(&to, uregs, VFP_STATE_SIZE - sizeof(compat_ulong_t));
1752	fpscr = (uregs->fpsr & VFP_FPSCR_STAT_MASK) |
1753		(uregs->fpcr & VFP_FPSCR_CTRL_MASK);
1754	return membuf_store(&to, fpscr);
1755}
1756
1757static int compat_vfp_set(struct task_struct *target,
1758			  const struct user_regset *regset,
1759			  unsigned int pos, unsigned int count,
1760			  const void *kbuf, const void __user *ubuf)
1761{
1762	struct user_fpsimd_state *uregs;
1763	compat_ulong_t fpscr;
1764	int ret, vregs_end_pos;
1765
1766	if (!system_supports_fpsimd())
1767		return -EINVAL;
1768
1769	uregs = &target->thread.uw.fpsimd_state;
1770
1771	vregs_end_pos = VFP_STATE_SIZE - sizeof(compat_ulong_t);
1772	ret = user_regset_copyin(&pos, &count, &kbuf, &ubuf, uregs, 0,
1773				 vregs_end_pos);
1774
1775	if (count && !ret) {
1776		ret = user_regset_copyin(&pos, &count, &kbuf, &ubuf, &fpscr,
1777					 vregs_end_pos, VFP_STATE_SIZE);
1778		if (!ret) {
1779			uregs->fpsr = fpscr & VFP_FPSCR_STAT_MASK;
1780			uregs->fpcr = fpscr & VFP_FPSCR_CTRL_MASK;
1781		}
1782	}
1783
1784	fpsimd_flush_task_state(target);
1785	return ret;
1786}
1787
1788static int compat_tls_get(struct task_struct *target,
1789			  const struct user_regset *regset,
1790			  struct membuf to)
1791{
1792	return membuf_store(&to, (compat_ulong_t)target->thread.uw.tp_value);
1793}
1794
1795static int compat_tls_set(struct task_struct *target,
1796			  const struct user_regset *regset, unsigned int pos,
1797			  unsigned int count, const void *kbuf,
1798			  const void __user *ubuf)
1799{
1800	int ret;
1801	compat_ulong_t tls = target->thread.uw.tp_value;
1802
1803	ret = user_regset_copyin(&pos, &count, &kbuf, &ubuf, &tls, 0, -1);
1804	if (ret)
1805		return ret;
1806
1807	target->thread.uw.tp_value = tls;
1808	return ret;
1809}
1810
1811static const struct user_regset aarch32_regsets[] = {
1812	[REGSET_COMPAT_GPR] = {
1813		.core_note_type = NT_PRSTATUS,
1814		.n = COMPAT_ELF_NGREG,
1815		.size = sizeof(compat_elf_greg_t),
1816		.align = sizeof(compat_elf_greg_t),
1817		.regset_get = compat_gpr_get,
1818		.set = compat_gpr_set
1819	},
1820	[REGSET_COMPAT_VFP] = {
1821		.core_note_type = NT_ARM_VFP,
1822		.n = VFP_STATE_SIZE / sizeof(compat_ulong_t),
1823		.size = sizeof(compat_ulong_t),
1824		.align = sizeof(compat_ulong_t),
1825		.active = fpr_active,
1826		.regset_get = compat_vfp_get,
1827		.set = compat_vfp_set
1828	},
1829};
1830
1831static const struct user_regset_view user_aarch32_view = {
1832	.name = "aarch32", .e_machine = EM_ARM,
1833	.regsets = aarch32_regsets, .n = ARRAY_SIZE(aarch32_regsets)
1834};
1835
1836static const struct user_regset aarch32_ptrace_regsets[] = {
1837	[REGSET_GPR] = {
1838		.core_note_type = NT_PRSTATUS,
1839		.n = COMPAT_ELF_NGREG,
1840		.size = sizeof(compat_elf_greg_t),
1841		.align = sizeof(compat_elf_greg_t),
1842		.regset_get = compat_gpr_get,
1843		.set = compat_gpr_set
1844	},
1845	[REGSET_FPR] = {
1846		.core_note_type = NT_ARM_VFP,
1847		.n = VFP_STATE_SIZE / sizeof(compat_ulong_t),
1848		.size = sizeof(compat_ulong_t),
1849		.align = sizeof(compat_ulong_t),
1850		.regset_get = compat_vfp_get,
1851		.set = compat_vfp_set
1852	},
1853	[REGSET_TLS] = {
1854		.core_note_type = NT_ARM_TLS,
1855		.n = 1,
1856		.size = sizeof(compat_ulong_t),
1857		.align = sizeof(compat_ulong_t),
1858		.regset_get = compat_tls_get,
1859		.set = compat_tls_set,
1860	},
1861#ifdef CONFIG_HAVE_HW_BREAKPOINT
1862	[REGSET_HW_BREAK] = {
1863		.core_note_type = NT_ARM_HW_BREAK,
1864		.n = sizeof(struct user_hwdebug_state) / sizeof(u32),
1865		.size = sizeof(u32),
1866		.align = sizeof(u32),
1867		.regset_get = hw_break_get,
1868		.set = hw_break_set,
1869	},
1870	[REGSET_HW_WATCH] = {
1871		.core_note_type = NT_ARM_HW_WATCH,
1872		.n = sizeof(struct user_hwdebug_state) / sizeof(u32),
1873		.size = sizeof(u32),
1874		.align = sizeof(u32),
1875		.regset_get = hw_break_get,
1876		.set = hw_break_set,
1877	},
1878#endif
1879	[REGSET_SYSTEM_CALL] = {
1880		.core_note_type = NT_ARM_SYSTEM_CALL,
1881		.n = 1,
1882		.size = sizeof(int),
1883		.align = sizeof(int),
1884		.regset_get = system_call_get,
1885		.set = system_call_set,
1886	},
1887};
1888
1889static const struct user_regset_view user_aarch32_ptrace_view = {
1890	.name = "aarch32", .e_machine = EM_ARM,
1891	.regsets = aarch32_ptrace_regsets, .n = ARRAY_SIZE(aarch32_ptrace_regsets)
1892};
1893
1894#ifdef CONFIG_COMPAT
1895static int compat_ptrace_read_user(struct task_struct *tsk, compat_ulong_t off,
1896				   compat_ulong_t __user *ret)
1897{
1898	compat_ulong_t tmp;
1899
1900	if (off & 3)
1901		return -EIO;
1902
1903	if (off == COMPAT_PT_TEXT_ADDR)
1904		tmp = tsk->mm->start_code;
1905	else if (off == COMPAT_PT_DATA_ADDR)
1906		tmp = tsk->mm->start_data;
1907	else if (off == COMPAT_PT_TEXT_END_ADDR)
1908		tmp = tsk->mm->end_code;
1909	else if (off < sizeof(compat_elf_gregset_t))
1910		tmp = compat_get_user_reg(tsk, off >> 2);
1911	else if (off >= COMPAT_USER_SZ)
1912		return -EIO;
1913	else
1914		tmp = 0;
1915
1916	return put_user(tmp, ret);
1917}
1918
1919static int compat_ptrace_write_user(struct task_struct *tsk, compat_ulong_t off,
1920				    compat_ulong_t val)
1921{
1922	struct pt_regs newregs = *task_pt_regs(tsk);
1923	unsigned int idx = off / 4;
1924
1925	if (off & 3 || off >= COMPAT_USER_SZ)
1926		return -EIO;
1927
1928	if (off >= sizeof(compat_elf_gregset_t))
1929		return 0;
1930
1931	switch (idx) {
1932	case 15:
1933		newregs.pc = val;
1934		break;
1935	case 16:
1936		newregs.pstate = compat_psr_to_pstate(val);
1937		break;
1938	case 17:
1939		newregs.orig_x0 = val;
1940		break;
1941	default:
1942		newregs.regs[idx] = val;
1943	}
1944
1945	if (!valid_user_regs(&newregs.user_regs, tsk))
1946		return -EINVAL;
1947
1948	*task_pt_regs(tsk) = newregs;
1949	return 0;
1950}
1951
1952#ifdef CONFIG_HAVE_HW_BREAKPOINT
1953
1954/*
1955 * Convert a virtual register number into an index for a thread_info
1956 * breakpoint array. Breakpoints are identified using positive numbers
1957 * whilst watchpoints are negative. The registers are laid out as pairs
1958 * of (address, control), each pair mapping to a unique hw_breakpoint struct.
1959 * Register 0 is reserved for describing resource information.
1960 */
1961static int compat_ptrace_hbp_num_to_idx(compat_long_t num)
1962{
1963	return (abs(num) - 1) >> 1;
1964}
1965
1966static int compat_ptrace_hbp_get_resource_info(u32 *kdata)
1967{
1968	u8 num_brps, num_wrps, debug_arch, wp_len;
1969	u32 reg = 0;
1970
1971	num_brps	= hw_breakpoint_slots(TYPE_INST);
1972	num_wrps	= hw_breakpoint_slots(TYPE_DATA);
1973
1974	debug_arch	= debug_monitors_arch();
1975	wp_len		= 8;
1976	reg		|= debug_arch;
1977	reg		<<= 8;
1978	reg		|= wp_len;
1979	reg		<<= 8;
1980	reg		|= num_wrps;
1981	reg		<<= 8;
1982	reg		|= num_brps;
1983
1984	*kdata = reg;
1985	return 0;
1986}
1987
1988static int compat_ptrace_hbp_get(unsigned int note_type,
1989				 struct task_struct *tsk,
1990				 compat_long_t num,
1991				 u32 *kdata)
1992{
1993	u64 addr = 0;
1994	u32 ctrl = 0;
1995
1996	int err, idx = compat_ptrace_hbp_num_to_idx(num);
1997
1998	if (num & 1) {
1999		err = ptrace_hbp_get_addr(note_type, tsk, idx, &addr);
2000		*kdata = (u32)addr;
2001	} else {
2002		err = ptrace_hbp_get_ctrl(note_type, tsk, idx, &ctrl);
2003		*kdata = ctrl;
2004	}
2005
2006	return err;
2007}
2008
2009static int compat_ptrace_hbp_set(unsigned int note_type,
2010				 struct task_struct *tsk,
2011				 compat_long_t num,
2012				 u32 *kdata)
2013{
2014	u64 addr;
2015	u32 ctrl;
2016
2017	int err, idx = compat_ptrace_hbp_num_to_idx(num);
2018
2019	if (num & 1) {
2020		addr = *kdata;
2021		err = ptrace_hbp_set_addr(note_type, tsk, idx, addr);
2022	} else {
2023		ctrl = *kdata;
2024		err = ptrace_hbp_set_ctrl(note_type, tsk, idx, ctrl);
2025	}
2026
2027	return err;
2028}
2029
2030static int compat_ptrace_gethbpregs(struct task_struct *tsk, compat_long_t num,
2031				    compat_ulong_t __user *data)
2032{
2033	int ret;
2034	u32 kdata;
2035
2036	/* Watchpoint */
2037	if (num < 0) {
2038		ret = compat_ptrace_hbp_get(NT_ARM_HW_WATCH, tsk, num, &kdata);
2039	/* Resource info */
2040	} else if (num == 0) {
2041		ret = compat_ptrace_hbp_get_resource_info(&kdata);
2042	/* Breakpoint */
2043	} else {
2044		ret = compat_ptrace_hbp_get(NT_ARM_HW_BREAK, tsk, num, &kdata);
2045	}
2046
2047	if (!ret)
2048		ret = put_user(kdata, data);
2049
2050	return ret;
2051}
2052
2053static int compat_ptrace_sethbpregs(struct task_struct *tsk, compat_long_t num,
2054				    compat_ulong_t __user *data)
2055{
2056	int ret;
2057	u32 kdata = 0;
2058
2059	if (num == 0)
2060		return 0;
2061
2062	ret = get_user(kdata, data);
2063	if (ret)
2064		return ret;
2065
2066	if (num < 0)
2067		ret = compat_ptrace_hbp_set(NT_ARM_HW_WATCH, tsk, num, &kdata);
2068	else
2069		ret = compat_ptrace_hbp_set(NT_ARM_HW_BREAK, tsk, num, &kdata);
2070
2071	return ret;
2072}
2073#endif	/* CONFIG_HAVE_HW_BREAKPOINT */
2074
2075long compat_arch_ptrace(struct task_struct *child, compat_long_t request,
2076			compat_ulong_t caddr, compat_ulong_t cdata)
2077{
2078	unsigned long addr = caddr;
2079	unsigned long data = cdata;
2080	void __user *datap = compat_ptr(data);
2081	int ret;
2082
2083	switch (request) {
2084		case PTRACE_PEEKUSR:
2085			ret = compat_ptrace_read_user(child, addr, datap);
2086			break;
2087
2088		case PTRACE_POKEUSR:
2089			ret = compat_ptrace_write_user(child, addr, data);
2090			break;
2091
2092		case COMPAT_PTRACE_GETREGS:
2093			ret = copy_regset_to_user(child,
2094						  &user_aarch32_view,
2095						  REGSET_COMPAT_GPR,
2096						  0, sizeof(compat_elf_gregset_t),
2097						  datap);
2098			break;
2099
2100		case COMPAT_PTRACE_SETREGS:
2101			ret = copy_regset_from_user(child,
2102						    &user_aarch32_view,
2103						    REGSET_COMPAT_GPR,
2104						    0, sizeof(compat_elf_gregset_t),
2105						    datap);
2106			break;
2107
2108		case COMPAT_PTRACE_GET_THREAD_AREA:
2109			ret = put_user((compat_ulong_t)child->thread.uw.tp_value,
2110				       (compat_ulong_t __user *)datap);
2111			break;
2112
2113		case COMPAT_PTRACE_SET_SYSCALL:
2114			task_pt_regs(child)->syscallno = data;
2115			ret = 0;
2116			break;
2117
2118		case COMPAT_PTRACE_GETVFPREGS:
2119			ret = copy_regset_to_user(child,
2120						  &user_aarch32_view,
2121						  REGSET_COMPAT_VFP,
2122						  0, VFP_STATE_SIZE,
2123						  datap);
2124			break;
2125
2126		case COMPAT_PTRACE_SETVFPREGS:
2127			ret = copy_regset_from_user(child,
2128						    &user_aarch32_view,
2129						    REGSET_COMPAT_VFP,
2130						    0, VFP_STATE_SIZE,
2131						    datap);
2132			break;
2133
2134#ifdef CONFIG_HAVE_HW_BREAKPOINT
2135		case COMPAT_PTRACE_GETHBPREGS:
2136			ret = compat_ptrace_gethbpregs(child, addr, datap);
2137			break;
2138
2139		case COMPAT_PTRACE_SETHBPREGS:
2140			ret = compat_ptrace_sethbpregs(child, addr, datap);
2141			break;
2142#endif
2143
2144		default:
2145			ret = compat_ptrace_request(child, request, addr,
2146						    data);
2147			break;
2148	}
2149
2150	return ret;
2151}
2152#endif /* CONFIG_COMPAT */
2153
2154const struct user_regset_view *task_user_regset_view(struct task_struct *task)
2155{
2156	/*
2157	 * Core dumping of 32-bit tasks or compat ptrace requests must use the
2158	 * user_aarch32_view compatible with arm32. Native ptrace requests on
2159	 * 32-bit children use an extended user_aarch32_ptrace_view to allow
2160	 * access to the TLS register.
2161	 */
2162	if (is_compat_task())
2163		return &user_aarch32_view;
2164	else if (is_compat_thread(task_thread_info(task)))
2165		return &user_aarch32_ptrace_view;
2166
2167	return &user_aarch64_view;
2168}
2169
2170long arch_ptrace(struct task_struct *child, long request,
2171		 unsigned long addr, unsigned long data)
2172{
2173	switch (request) {
2174	case PTRACE_PEEKMTETAGS:
2175	case PTRACE_POKEMTETAGS:
2176		return mte_ptrace_copy_tags(child, request, addr, data);
2177	}
2178
2179	return ptrace_request(child, request, addr, data);
2180}
2181
2182enum ptrace_syscall_dir {
2183	PTRACE_SYSCALL_ENTER = 0,
2184	PTRACE_SYSCALL_EXIT,
2185};
2186
2187static void report_syscall(struct pt_regs *regs, enum ptrace_syscall_dir dir)
2188{
2189	int regno;
2190	unsigned long saved_reg;
2191
2192	/*
2193	 * We have some ABI weirdness here in the way that we handle syscall
2194	 * exit stops because we indicate whether or not the stop has been
2195	 * signalled from syscall entry or syscall exit by clobbering a general
2196	 * purpose register (ip/r12 for AArch32, x7 for AArch64) in the tracee
2197	 * and restoring its old value after the stop. This means that:
2198	 *
2199	 * - Any writes by the tracer to this register during the stop are
2200	 *   ignored/discarded.
2201	 *
2202	 * - The actual value of the register is not available during the stop,
2203	 *   so the tracer cannot save it and restore it later.
2204	 *
2205	 * - Syscall stops behave differently to seccomp and pseudo-step traps
2206	 *   (the latter do not nobble any registers).
2207	 */
2208	regno = (is_compat_task() ? 12 : 7);
2209	saved_reg = regs->regs[regno];
2210	regs->regs[regno] = dir;
2211
2212	if (dir == PTRACE_SYSCALL_ENTER) {
2213		if (ptrace_report_syscall_entry(regs))
2214			forget_syscall(regs);
2215		regs->regs[regno] = saved_reg;
2216	} else if (!test_thread_flag(TIF_SINGLESTEP)) {
2217		ptrace_report_syscall_exit(regs, 0);
2218		regs->regs[regno] = saved_reg;
2219	} else {
2220		regs->regs[regno] = saved_reg;
2221
2222		/*
2223		 * Signal a pseudo-step exception since we are stepping but
2224		 * tracer modifications to the registers may have rewound the
2225		 * state machine.
2226		 */
2227		ptrace_report_syscall_exit(regs, 1);
2228	}
2229}
2230
2231int syscall_trace_enter(struct pt_regs *regs)
2232{
2233	unsigned long flags = read_thread_flags();
2234
2235	if (flags & (_TIF_SYSCALL_EMU | _TIF_SYSCALL_TRACE)) {
2236		report_syscall(regs, PTRACE_SYSCALL_ENTER);
2237		if (flags & _TIF_SYSCALL_EMU)
2238			return NO_SYSCALL;
2239	}
2240
2241	/* Do the secure computing after ptrace; failures should be fast. */
2242	if (secure_computing() == -1)
2243		return NO_SYSCALL;
2244
2245	if (test_thread_flag(TIF_SYSCALL_TRACEPOINT))
2246		trace_sys_enter(regs, regs->syscallno);
2247
2248	audit_syscall_entry(regs->syscallno, regs->orig_x0, regs->regs[1],
2249			    regs->regs[2], regs->regs[3]);
2250
2251	return regs->syscallno;
2252}
2253
2254void syscall_trace_exit(struct pt_regs *regs)
2255{
2256	unsigned long flags = read_thread_flags();
2257
2258	audit_syscall_exit(regs);
2259
2260	if (flags & _TIF_SYSCALL_TRACEPOINT)
2261		trace_sys_exit(regs, syscall_get_return_value(current, regs));
2262
2263	if (flags & (_TIF_SYSCALL_TRACE | _TIF_SINGLESTEP))
2264		report_syscall(regs, PTRACE_SYSCALL_EXIT);
2265
2266	rseq_syscall(regs);
2267}
2268
2269/*
2270 * SPSR_ELx bits which are always architecturally RES0 per ARM DDI 0487D.a.
2271 * We permit userspace to set SSBS (AArch64 bit 12, AArch32 bit 23) which is
2272 * not described in ARM DDI 0487D.a.
2273 * We treat PAN and UAO as RES0 bits, as they are meaningless at EL0, and may
2274 * be allocated an EL0 meaning in future.
2275 * Userspace cannot use these until they have an architectural meaning.
2276 * Note that this follows the SPSR_ELx format, not the AArch32 PSR format.
2277 * We also reserve IL for the kernel; SS is handled dynamically.
2278 */
2279#define SPSR_EL1_AARCH64_RES0_BITS \
2280	(GENMASK_ULL(63, 32) | GENMASK_ULL(27, 26) | GENMASK_ULL(23, 22) | \
2281	 GENMASK_ULL(20, 13) | GENMASK_ULL(5, 5))
2282#define SPSR_EL1_AARCH32_RES0_BITS \
2283	(GENMASK_ULL(63, 32) | GENMASK_ULL(22, 22) | GENMASK_ULL(20, 20))
2284
2285static int valid_compat_regs(struct user_pt_regs *regs)
2286{
2287	regs->pstate &= ~SPSR_EL1_AARCH32_RES0_BITS;
2288
2289	if (!system_supports_mixed_endian_el0()) {
2290		if (IS_ENABLED(CONFIG_CPU_BIG_ENDIAN))
2291			regs->pstate |= PSR_AA32_E_BIT;
2292		else
2293			regs->pstate &= ~PSR_AA32_E_BIT;
2294	}
2295
2296	if (user_mode(regs) && (regs->pstate & PSR_MODE32_BIT) &&
2297	    (regs->pstate & PSR_AA32_A_BIT) == 0 &&
2298	    (regs->pstate & PSR_AA32_I_BIT) == 0 &&
2299	    (regs->pstate & PSR_AA32_F_BIT) == 0) {
2300		return 1;
2301	}
2302
2303	/*
2304	 * Force PSR to a valid 32-bit EL0t, preserving the same bits as
2305	 * arch/arm.
2306	 */
2307	regs->pstate &= PSR_AA32_N_BIT | PSR_AA32_Z_BIT |
2308			PSR_AA32_C_BIT | PSR_AA32_V_BIT |
2309			PSR_AA32_Q_BIT | PSR_AA32_IT_MASK |
2310			PSR_AA32_GE_MASK | PSR_AA32_E_BIT |
2311			PSR_AA32_T_BIT;
2312	regs->pstate |= PSR_MODE32_BIT;
2313
2314	return 0;
2315}
2316
2317static int valid_native_regs(struct user_pt_regs *regs)
2318{
2319	regs->pstate &= ~SPSR_EL1_AARCH64_RES0_BITS;
2320
2321	if (user_mode(regs) && !(regs->pstate & PSR_MODE32_BIT) &&
2322	    (regs->pstate & PSR_D_BIT) == 0 &&
2323	    (regs->pstate & PSR_A_BIT) == 0 &&
2324	    (regs->pstate & PSR_I_BIT) == 0 &&
2325	    (regs->pstate & PSR_F_BIT) == 0) {
2326		return 1;
2327	}
2328
2329	/* Force PSR to a valid 64-bit EL0t */
2330	regs->pstate &= PSR_N_BIT | PSR_Z_BIT | PSR_C_BIT | PSR_V_BIT;
2331
2332	return 0;
2333}
2334
2335/*
2336 * Are the current registers suitable for user mode? (used to maintain
2337 * security in signal handlers)
2338 */
2339int valid_user_regs(struct user_pt_regs *regs, struct task_struct *task)
2340{
2341	/* https://lore.kernel.org/lkml/20191118131525.GA4180@willie-the-truck */
2342	user_regs_reset_single_step(regs, task);
2343
2344	if (is_compat_thread(task_thread_info(task)))
2345		return valid_compat_regs(regs);
2346	else
2347		return valid_native_regs(regs);
2348}
2349