1
2
3
4
5
6
7
8
9
10#include <stdarg.h>
11
12#include <linux/compat.h>
13#include <linux/efi.h>
14#include <linux/elf.h>
15#include <linux/export.h>
16#include <linux/sched.h>
17#include <linux/sched/debug.h>
18#include <linux/sched/task.h>
19#include <linux/sched/task_stack.h>
20#include <linux/kernel.h>
21#include <linux/lockdep.h>
22#include <linux/mman.h>
23#include <linux/mm.h>
24#include <linux/nospec.h>
25#include <linux/stddef.h>
26#include <linux/sysctl.h>
27#include <linux/unistd.h>
28#include <linux/user.h>
29#include <linux/delay.h>
30#include <linux/reboot.h>
31#include <linux/interrupt.h>
32#include <linux/init.h>
33#include <linux/cpu.h>
34#include <linux/elfcore.h>
35#include <linux/pm.h>
36#include <linux/tick.h>
37#include <linux/utsname.h>
38#include <linux/uaccess.h>
39#include <linux/random.h>
40#include <linux/hw_breakpoint.h>
41#include <linux/personality.h>
42#include <linux/notifier.h>
43#include <trace/events/power.h>
44#include <linux/percpu.h>
45#include <linux/thread_info.h>
46#include <linux/prctl.h>
47
48#include <asm/alternative.h>
49#include <asm/arch_gicv3.h>
50#include <asm/compat.h>
51#include <asm/cpufeature.h>
52#include <asm/cacheflush.h>
53#include <asm/exec.h>
54#include <asm/fpsimd.h>
55#include <asm/mmu_context.h>
56#include <asm/mte.h>
57#include <asm/processor.h>
58#include <asm/pointer_auth.h>
59#include <asm/stacktrace.h>
60#include <asm/switch_to.h>
61#include <asm/system_misc.h>
62
63#if defined(CONFIG_STACKPROTECTOR) && !defined(CONFIG_STACKPROTECTOR_PER_TASK)
64#include <linux/stackprotector.h>
65unsigned long __stack_chk_guard __read_mostly;
66EXPORT_SYMBOL(__stack_chk_guard);
67#endif
68
69
70
71
72void (*pm_power_off)(void);
73EXPORT_SYMBOL_GPL(pm_power_off);
74
75void (*arm_pm_restart)(enum reboot_mode reboot_mode, const char *cmd);
76
77static void noinstr __cpu_do_idle(void)
78{
79 dsb(sy);
80 wfi();
81}
82
83static void noinstr __cpu_do_idle_irqprio(void)
84{
85 unsigned long pmr;
86 unsigned long daif_bits;
87
88 daif_bits = read_sysreg(daif);
89 write_sysreg(daif_bits | PSR_I_BIT, daif);
90
91
92
93
94
95 pmr = gic_read_pmr();
96 gic_write_pmr(GIC_PRIO_IRQON | GIC_PRIO_PSR_I_SET);
97
98 __cpu_do_idle();
99
100 gic_write_pmr(pmr);
101 write_sysreg(daif_bits, daif);
102}
103
104
105
106
107
108
109
110
111
112
113void noinstr cpu_do_idle(void)
114{
115 if (system_uses_irq_prio_masking())
116 __cpu_do_idle_irqprio();
117 else
118 __cpu_do_idle();
119}
120
121
122
123
124void noinstr arch_cpu_idle(void)
125{
126
127
128
129
130 cpu_do_idle();
131 raw_local_irq_enable();
132}
133
134#ifdef CONFIG_HOTPLUG_CPU
135void arch_cpu_idle_dead(void)
136{
137 cpu_die();
138}
139#endif
140
141
142
143
144
145
146
147
148
149
150void machine_shutdown(void)
151{
152 smp_shutdown_nonboot_cpus(reboot_cpu);
153}
154
155
156
157
158
159
160void machine_halt(void)
161{
162 local_irq_disable();
163 smp_send_stop();
164 while (1);
165}
166
167
168
169
170
171
172
173void machine_power_off(void)
174{
175 local_irq_disable();
176 smp_send_stop();
177 if (pm_power_off)
178 pm_power_off();
179}
180
181
182
183
184
185
186
187
188
189
190void machine_restart(char *cmd)
191{
192
193 local_irq_disable();
194 smp_send_stop();
195
196
197
198
199
200 if (efi_enabled(EFI_RUNTIME_SERVICES))
201 efi_reboot(reboot_mode, NULL);
202
203
204 if (arm_pm_restart)
205 arm_pm_restart(reboot_mode, cmd);
206 else
207 do_kernel_restart(cmd);
208
209
210
211
212 printk("Reboot failed -- System halted\n");
213 while (1);
214}
215
216#define bstr(suffix, str) [PSR_BTYPE_ ## suffix >> PSR_BTYPE_SHIFT] = str
217static const char *const btypes[] = {
218 bstr(NONE, "--"),
219 bstr( JC, "jc"),
220 bstr( C, "-c"),
221 bstr( J , "j-")
222};
223#undef bstr
224
225static void print_pstate(struct pt_regs *regs)
226{
227 u64 pstate = regs->pstate;
228
229 if (compat_user_mode(regs)) {
230 printk("pstate: %08llx (%c%c%c%c %c %s %s %c%c%c)\n",
231 pstate,
232 pstate & PSR_AA32_N_BIT ? 'N' : 'n',
233 pstate & PSR_AA32_Z_BIT ? 'Z' : 'z',
234 pstate & PSR_AA32_C_BIT ? 'C' : 'c',
235 pstate & PSR_AA32_V_BIT ? 'V' : 'v',
236 pstate & PSR_AA32_Q_BIT ? 'Q' : 'q',
237 pstate & PSR_AA32_T_BIT ? "T32" : "A32",
238 pstate & PSR_AA32_E_BIT ? "BE" : "LE",
239 pstate & PSR_AA32_A_BIT ? 'A' : 'a',
240 pstate & PSR_AA32_I_BIT ? 'I' : 'i',
241 pstate & PSR_AA32_F_BIT ? 'F' : 'f');
242 } else {
243 const char *btype_str = btypes[(pstate & PSR_BTYPE_MASK) >>
244 PSR_BTYPE_SHIFT];
245
246 printk("pstate: %08llx (%c%c%c%c %c%c%c%c %cPAN %cUAO %cTCO BTYPE=%s)\n",
247 pstate,
248 pstate & PSR_N_BIT ? 'N' : 'n',
249 pstate & PSR_Z_BIT ? 'Z' : 'z',
250 pstate & PSR_C_BIT ? 'C' : 'c',
251 pstate & PSR_V_BIT ? 'V' : 'v',
252 pstate & PSR_D_BIT ? 'D' : 'd',
253 pstate & PSR_A_BIT ? 'A' : 'a',
254 pstate & PSR_I_BIT ? 'I' : 'i',
255 pstate & PSR_F_BIT ? 'F' : 'f',
256 pstate & PSR_PAN_BIT ? '+' : '-',
257 pstate & PSR_UAO_BIT ? '+' : '-',
258 pstate & PSR_TCO_BIT ? '+' : '-',
259 btype_str);
260 }
261}
262
263void __show_regs(struct pt_regs *regs)
264{
265 int i, top_reg;
266 u64 lr, sp;
267
268 if (compat_user_mode(regs)) {
269 lr = regs->compat_lr;
270 sp = regs->compat_sp;
271 top_reg = 12;
272 } else {
273 lr = regs->regs[30];
274 sp = regs->sp;
275 top_reg = 29;
276 }
277
278 show_regs_print_info(KERN_DEFAULT);
279 print_pstate(regs);
280
281 if (!user_mode(regs)) {
282 printk("pc : %pS\n", (void *)regs->pc);
283 printk("lr : %pS\n", (void *)ptrauth_strip_insn_pac(lr));
284 } else {
285 printk("pc : %016llx\n", regs->pc);
286 printk("lr : %016llx\n", lr);
287 }
288
289 printk("sp : %016llx\n", sp);
290
291 if (system_uses_irq_prio_masking())
292 printk("pmr_save: %08llx\n", regs->pmr_save);
293
294 i = top_reg;
295
296 while (i >= 0) {
297 printk("x%-2d: %016llx ", i, regs->regs[i]);
298 i--;
299
300 if (i % 2 == 0) {
301 pr_cont("x%-2d: %016llx ", i, regs->regs[i]);
302 i--;
303 }
304
305 pr_cont("\n");
306 }
307}
308
309void show_regs(struct pt_regs *regs)
310{
311 __show_regs(regs);
312 dump_backtrace(regs, NULL, KERN_DEFAULT);
313}
314
315static void tls_thread_flush(void)
316{
317 write_sysreg(0, tpidr_el0);
318
319 if (is_compat_task()) {
320 current->thread.uw.tp_value = 0;
321
322
323
324
325
326
327 barrier();
328 write_sysreg(0, tpidrro_el0);
329 }
330}
331
332static void flush_tagged_addr_state(void)
333{
334 if (IS_ENABLED(CONFIG_ARM64_TAGGED_ADDR_ABI))
335 clear_thread_flag(TIF_TAGGED_ADDR);
336}
337
338void flush_thread(void)
339{
340 fpsimd_flush_thread();
341 tls_thread_flush();
342 flush_ptrace_hw_breakpoint(current);
343 flush_tagged_addr_state();
344 flush_mte_state();
345}
346
347void release_thread(struct task_struct *dead_task)
348{
349}
350
351void arch_release_task_struct(struct task_struct *tsk)
352{
353 fpsimd_release_task(tsk);
354}
355
356int arch_dup_task_struct(struct task_struct *dst, struct task_struct *src)
357{
358 if (current->mm)
359 fpsimd_preserve_current_state();
360 *dst = *src;
361
362
363 BUILD_BUG_ON(!IS_ENABLED(CONFIG_THREAD_INFO_IN_TASK));
364
365
366
367
368
369
370
371
372
373
374 dst->thread.sve_state = NULL;
375 clear_tsk_thread_flag(dst, TIF_SVE);
376
377
378 clear_tsk_thread_flag(dst, TIF_MTE_ASYNC_FAULT);
379
380 return 0;
381}
382
383asmlinkage void ret_from_fork(void) asm("ret_from_fork");
384
385int copy_thread(unsigned long clone_flags, unsigned long stack_start,
386 unsigned long stk_sz, struct task_struct *p, unsigned long tls)
387{
388 struct pt_regs *childregs = task_pt_regs(p);
389
390 memset(&p->thread.cpu_context, 0, sizeof(struct cpu_context));
391
392
393
394
395
396
397
398
399 fpsimd_flush_task_state(p);
400
401 ptrauth_thread_init_kernel(p);
402
403 if (likely(!(p->flags & (PF_KTHREAD | PF_IO_WORKER)))) {
404 *childregs = *current_pt_regs();
405 childregs->regs[0] = 0;
406
407
408
409
410
411 *task_user_tls(p) = read_sysreg(tpidr_el0);
412
413 if (stack_start) {
414 if (is_compat_thread(task_thread_info(p)))
415 childregs->compat_sp = stack_start;
416 else
417 childregs->sp = stack_start;
418 }
419
420
421
422
423
424 if (clone_flags & CLONE_SETTLS)
425 p->thread.uw.tp_value = tls;
426 } else {
427
428
429
430
431
432
433
434 memset(childregs, 0, sizeof(struct pt_regs));
435 childregs->pstate = PSR_MODE_EL1h | PSR_IL_BIT;
436
437 p->thread.cpu_context.x19 = stack_start;
438 p->thread.cpu_context.x20 = stk_sz;
439 }
440 p->thread.cpu_context.pc = (unsigned long)ret_from_fork;
441 p->thread.cpu_context.sp = (unsigned long)childregs;
442
443 ptrace_hw_copy_thread(p);
444
445 return 0;
446}
447
448void tls_preserve_current_state(void)
449{
450 *task_user_tls(current) = read_sysreg(tpidr_el0);
451}
452
453static void tls_thread_switch(struct task_struct *next)
454{
455 tls_preserve_current_state();
456
457 if (is_compat_thread(task_thread_info(next)))
458 write_sysreg(next->thread.uw.tp_value, tpidrro_el0);
459 else if (!arm64_kernel_unmapped_at_el0())
460 write_sysreg(0, tpidrro_el0);
461
462 write_sysreg(*task_user_tls(next), tpidr_el0);
463}
464
465
466
467
468
469static void ssbs_thread_switch(struct task_struct *next)
470{
471
472
473
474
475 if (unlikely(next->flags & PF_KTHREAD))
476 return;
477
478
479
480
481
482 if (cpus_have_const_cap(ARM64_SSBS))
483 return;
484
485 spectre_v4_enable_task_mitigation(next);
486}
487
488
489
490
491
492
493
494
495DEFINE_PER_CPU(struct task_struct *, __entry_task);
496
497static void entry_task_switch(struct task_struct *next)
498{
499 __this_cpu_write(__entry_task, next);
500}
501
502
503
504
505
506
507
508
509static void erratum_1418040_thread_switch(struct task_struct *prev,
510 struct task_struct *next)
511{
512 bool prev32, next32;
513 u64 val;
514
515 if (!IS_ENABLED(CONFIG_ARM64_ERRATUM_1418040))
516 return;
517
518 prev32 = is_compat_thread(task_thread_info(prev));
519 next32 = is_compat_thread(task_thread_info(next));
520
521 if (prev32 == next32 || !this_cpu_has_cap(ARM64_WORKAROUND_1418040))
522 return;
523
524 val = read_sysreg(cntkctl_el1);
525
526 if (!next32)
527 val |= ARCH_TIMER_USR_VCT_ACCESS_EN;
528 else
529 val &= ~ARCH_TIMER_USR_VCT_ACCESS_EN;
530
531 write_sysreg(val, cntkctl_el1);
532}
533
534
535
536
537__notrace_funcgraph struct task_struct *__switch_to(struct task_struct *prev,
538 struct task_struct *next)
539{
540 struct task_struct *last;
541
542 fpsimd_thread_switch(next);
543 tls_thread_switch(next);
544 hw_breakpoint_thread_switch(next);
545 contextidr_thread_switch(next);
546 entry_task_switch(next);
547 ssbs_thread_switch(next);
548 erratum_1418040_thread_switch(prev, next);
549
550
551
552
553
554
555
556 dsb(ish);
557
558
559
560
561
562
563 mte_thread_switch(next);
564
565
566 last = cpu_switch_to(prev, next);
567
568 return last;
569}
570
571unsigned long get_wchan(struct task_struct *p)
572{
573 struct stackframe frame;
574 unsigned long stack_page, ret = 0;
575 int count = 0;
576 if (!p || p == current || p->state == TASK_RUNNING)
577 return 0;
578
579 stack_page = (unsigned long)try_get_task_stack(p);
580 if (!stack_page)
581 return 0;
582
583 start_backtrace(&frame, thread_saved_fp(p), thread_saved_pc(p));
584
585 do {
586 if (unwind_frame(p, &frame))
587 goto out;
588 if (!in_sched_functions(frame.pc)) {
589 ret = frame.pc;
590 goto out;
591 }
592 } while (count++ < 16);
593
594out:
595 put_task_stack(p);
596 return ret;
597}
598
599unsigned long arch_align_stack(unsigned long sp)
600{
601 if (!(current->personality & ADDR_NO_RANDOMIZE) && randomize_va_space)
602 sp -= get_random_int() & ~PAGE_MASK;
603 return sp & ~0xf;
604}
605
606
607
608
609void arch_setup_new_exec(void)
610{
611 current->mm->context.flags = is_compat_task() ? MMCF_AARCH32 : 0;
612
613 ptrauth_thread_init_user(current);
614
615 if (task_spec_ssb_noexec(current)) {
616 arch_prctl_spec_ctrl_set(current, PR_SPEC_STORE_BYPASS,
617 PR_SPEC_ENABLE);
618 }
619}
620
621#ifdef CONFIG_ARM64_TAGGED_ADDR_ABI
622
623
624
625static unsigned int tagged_addr_disabled;
626
627long set_tagged_addr_ctrl(struct task_struct *task, unsigned long arg)
628{
629 unsigned long valid_mask = PR_TAGGED_ADDR_ENABLE;
630 struct thread_info *ti = task_thread_info(task);
631
632 if (is_compat_thread(ti))
633 return -EINVAL;
634
635 if (system_supports_mte())
636 valid_mask |= PR_MTE_TCF_MASK | PR_MTE_TAG_MASK;
637
638 if (arg & ~valid_mask)
639 return -EINVAL;
640
641
642
643
644
645 if (arg & PR_TAGGED_ADDR_ENABLE && tagged_addr_disabled)
646 return -EINVAL;
647
648 if (set_mte_ctrl(task, arg) != 0)
649 return -EINVAL;
650
651 update_ti_thread_flag(ti, TIF_TAGGED_ADDR, arg & PR_TAGGED_ADDR_ENABLE);
652
653 return 0;
654}
655
656long get_tagged_addr_ctrl(struct task_struct *task)
657{
658 long ret = 0;
659 struct thread_info *ti = task_thread_info(task);
660
661 if (is_compat_thread(ti))
662 return -EINVAL;
663
664 if (test_ti_thread_flag(ti, TIF_TAGGED_ADDR))
665 ret = PR_TAGGED_ADDR_ENABLE;
666
667 ret |= get_mte_ctrl(task);
668
669 return ret;
670}
671
672
673
674
675
676
677
678static struct ctl_table tagged_addr_sysctl_table[] = {
679 {
680 .procname = "tagged_addr_disabled",
681 .mode = 0644,
682 .data = &tagged_addr_disabled,
683 .maxlen = sizeof(int),
684 .proc_handler = proc_dointvec_minmax,
685 .extra1 = SYSCTL_ZERO,
686 .extra2 = SYSCTL_ONE,
687 },
688 { }
689};
690
691static int __init tagged_addr_init(void)
692{
693 if (!register_sysctl("abi", tagged_addr_sysctl_table))
694 return -EINVAL;
695 return 0;
696}
697
698core_initcall(tagged_addr_init);
699#endif
700
701asmlinkage void __sched arm64_preempt_schedule_irq(void)
702{
703 lockdep_assert_irqs_disabled();
704
705
706
707
708
709
710
711
712
713 if (system_capabilities_finalized())
714 preempt_schedule_irq();
715}
716
717#ifdef CONFIG_BINFMT_ELF
718int arch_elf_adjust_prot(int prot, const struct arch_elf_state *state,
719 bool has_interp, bool is_interp)
720{
721
722
723
724
725
726 if (is_interp != has_interp)
727 return prot;
728
729 if (!(state->flags & ARM64_ELF_BTI))
730 return prot;
731
732 if (prot & PROT_EXEC)
733 prot |= PROT_BTI;
734
735 return prot;
736}
737#endif
738