xref: /freebsd-12.1/sys/arm64/arm64/machdep.c (revision 9a9dd8e6)
1 /*-
2  * Copyright (c) 2014 Andrew Turner
3  * All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  * 1. Redistributions of source code must retain the above copyright
9  *    notice, this list of conditions and the following disclaimer.
10  * 2. Redistributions in binary form must reproduce the above copyright
11  *    notice, this list of conditions and the following disclaimer in the
12  *    documentation and/or other materials provided with the distribution.
13  *
14  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
15  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
18  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24  * SUCH DAMAGE.
25  *
26  */
27 
28 #include "opt_acpi.h"
29 #include "opt_platform.h"
30 #include "opt_ddb.h"
31 
32 #include <sys/cdefs.h>
33 __FBSDID("$FreeBSD$");
34 
35 #include <sys/param.h>
36 #include <sys/systm.h>
37 #include <sys/buf.h>
38 #include <sys/bus.h>
39 #include <sys/cons.h>
40 #include <sys/cpu.h>
41 #include <sys/devmap.h>
42 #include <sys/efi.h>
43 #include <sys/exec.h>
44 #include <sys/imgact.h>
45 #include <sys/kdb.h>
46 #include <sys/kernel.h>
47 #include <sys/limits.h>
48 #include <sys/linker.h>
49 #include <sys/msgbuf.h>
50 #include <sys/pcpu.h>
51 #include <sys/proc.h>
52 #include <sys/ptrace.h>
53 #include <sys/reboot.h>
54 #include <sys/rwlock.h>
55 #include <sys/sched.h>
56 #include <sys/signalvar.h>
57 #include <sys/syscallsubr.h>
58 #include <sys/sysent.h>
59 #include <sys/sysproto.h>
60 #include <sys/ucontext.h>
61 #include <sys/vdso.h>
62 
63 #include <vm/vm.h>
64 #include <vm/vm_kern.h>
65 #include <vm/vm_object.h>
66 #include <vm/vm_page.h>
67 #include <vm/pmap.h>
68 #include <vm/vm_map.h>
69 #include <vm/vm_pager.h>
70 
71 #include <machine/armreg.h>
72 #include <machine/cpu.h>
73 #include <machine/debug_monitor.h>
74 #include <machine/kdb.h>
75 #include <machine/machdep.h>
76 #include <machine/metadata.h>
77 #include <machine/md_var.h>
78 #include <machine/pcb.h>
79 #include <machine/reg.h>
80 #include <machine/undefined.h>
81 #include <machine/vmparam.h>
82 
83 #include <arm/include/physmem.h>
84 
85 #ifdef VFP
86 #include <machine/vfp.h>
87 #endif
88 
89 #ifdef DEV_ACPI
90 #include <contrib/dev/acpica/include/acpi.h>
91 #include <machine/acpica_machdep.h>
92 #endif
93 
94 #ifdef FDT
95 #include <dev/fdt/fdt_common.h>
96 #include <dev/ofw/openfirm.h>
97 #endif
98 
99 
100 enum arm64_bus arm64_bus_method = ARM64_BUS_NONE;
101 
102 struct pcpu __pcpu[MAXCPU];
103 
104 static struct trapframe proc0_tf;
105 
106 int early_boot = 1;
107 int cold = 1;
108 
109 struct kva_md_info kmi;
110 
111 int64_t dcache_line_size;	/* The minimum D cache line size */
112 int64_t icache_line_size;	/* The minimum I cache line size */
113 int64_t idcache_line_size;	/* The minimum cache line size */
114 int64_t dczva_line_size;	/* The size of cache line the dc zva zeroes */
115 int has_pan;
116 
117 /*
118  * Physical address of the EFI System Table. Stashed from the metadata hints
119  * passed into the kernel and used by the EFI code to call runtime services.
120  */
121 vm_paddr_t efi_systbl_phys;
122 
123 /* pagezero_* implementations are provided in support.S */
124 void pagezero_simple(void *);
125 void pagezero_cache(void *);
126 
127 /* pagezero_simple is default pagezero */
128 void (*pagezero)(void *p) = pagezero_simple;
129 
130 static void
pan_setup(void)131 pan_setup(void)
132 {
133 	uint64_t id_aa64mfr1;
134 
135 	id_aa64mfr1 = READ_SPECIALREG(id_aa64mmfr1_el1);
136 	if (ID_AA64MMFR1_PAN(id_aa64mfr1) != ID_AA64MMFR1_PAN_NONE)
137 		has_pan = 1;
138 }
139 
140 void
pan_enable(void)141 pan_enable(void)
142 {
143 
144 	/*
145 	 * The LLVM integrated assembler doesn't understand the PAN
146 	 * PSTATE field. Because of this we need to manually create
147 	 * the instruction in an asm block. This is equivalent to:
148 	 * msr pan, #1
149 	 *
150 	 * This sets the PAN bit, stopping the kernel from accessing
151 	 * memory when userspace can also access it unless the kernel
152 	 * uses the userspace load/store instructions.
153 	 */
154 	if (has_pan) {
155 		WRITE_SPECIALREG(sctlr_el1,
156 		    READ_SPECIALREG(sctlr_el1) & ~SCTLR_SPAN);
157 		__asm __volatile(".inst 0xd500409f | (0x1 << 8)");
158 	}
159 }
160 
161 static void
cpu_startup(void * dummy)162 cpu_startup(void *dummy)
163 {
164 
165 	undef_init();
166 	identify_cpu();
167 	install_cpu_errata();
168 
169 	vm_ksubmap_init(&kmi);
170 	bufinit();
171 	vm_pager_bufferinit();
172 }
173 
174 SYSINIT(cpu, SI_SUB_CPU, SI_ORDER_FIRST, cpu_startup, NULL);
175 
176 int
cpu_idle_wakeup(int cpu)177 cpu_idle_wakeup(int cpu)
178 {
179 
180 	return (0);
181 }
182 
183 int
fill_regs(struct thread * td,struct reg * regs)184 fill_regs(struct thread *td, struct reg *regs)
185 {
186 	struct trapframe *frame;
187 
188 	frame = td->td_frame;
189 	regs->sp = frame->tf_sp;
190 	regs->lr = frame->tf_lr;
191 	regs->elr = frame->tf_elr;
192 	regs->spsr = frame->tf_spsr;
193 
194 	memcpy(regs->x, frame->tf_x, sizeof(regs->x));
195 
196 	return (0);
197 }
198 
199 int
set_regs(struct thread * td,struct reg * regs)200 set_regs(struct thread *td, struct reg *regs)
201 {
202 	struct trapframe *frame;
203 
204 	frame = td->td_frame;
205 	frame->tf_sp = regs->sp;
206 	frame->tf_lr = regs->lr;
207 	frame->tf_elr = regs->elr;
208 	frame->tf_spsr &= ~PSR_FLAGS;
209 	frame->tf_spsr |= regs->spsr & PSR_FLAGS;
210 
211 	memcpy(frame->tf_x, regs->x, sizeof(frame->tf_x));
212 
213 	return (0);
214 }
215 
216 int
fill_fpregs(struct thread * td,struct fpreg * regs)217 fill_fpregs(struct thread *td, struct fpreg *regs)
218 {
219 #ifdef VFP
220 	struct pcb *pcb;
221 
222 	pcb = td->td_pcb;
223 	if ((pcb->pcb_fpflags & PCB_FP_STARTED) != 0) {
224 		/*
225 		 * If we have just been running VFP instructions we will
226 		 * need to save the state to memcpy it below.
227 		 */
228 		if (td == curthread)
229 			vfp_save_state(td, pcb);
230 
231 		KASSERT(pcb->pcb_fpusaved == &pcb->pcb_fpustate,
232 		    ("Called fill_fpregs while the kernel is using the VFP"));
233 		memcpy(regs->fp_q, pcb->pcb_fpustate.vfp_regs,
234 		    sizeof(regs->fp_q));
235 		regs->fp_cr = pcb->pcb_fpustate.vfp_fpcr;
236 		regs->fp_sr = pcb->pcb_fpustate.vfp_fpsr;
237 	} else
238 #endif
239 		memset(regs, 0, sizeof(*regs));
240 	return (0);
241 }
242 
243 int
set_fpregs(struct thread * td,struct fpreg * regs)244 set_fpregs(struct thread *td, struct fpreg *regs)
245 {
246 #ifdef VFP
247 	struct pcb *pcb;
248 
249 	pcb = td->td_pcb;
250 	KASSERT(pcb->pcb_fpusaved == &pcb->pcb_fpustate,
251 	    ("Called set_fpregs while the kernel is using the VFP"));
252 	memcpy(pcb->pcb_fpustate.vfp_regs, regs->fp_q, sizeof(regs->fp_q));
253 	pcb->pcb_fpustate.vfp_fpcr = regs->fp_cr;
254 	pcb->pcb_fpustate.vfp_fpsr = regs->fp_sr;
255 #endif
256 	return (0);
257 }
258 
259 int
fill_dbregs(struct thread * td,struct dbreg * regs)260 fill_dbregs(struct thread *td, struct dbreg *regs)
261 {
262 
263 	printf("ARM64TODO: fill_dbregs");
264 	return (EDOOFUS);
265 }
266 
267 int
set_dbregs(struct thread * td,struct dbreg * regs)268 set_dbregs(struct thread *td, struct dbreg *regs)
269 {
270 
271 	printf("ARM64TODO: set_dbregs");
272 	return (EDOOFUS);
273 }
274 
275 #ifdef COMPAT_FREEBSD32
276 int
fill_regs32(struct thread * td,struct reg32 * regs)277 fill_regs32(struct thread *td, struct reg32 *regs)
278 {
279 
280 	printf("ARM64TODO: fill_regs32");
281 	return (EDOOFUS);
282 }
283 
284 int
set_regs32(struct thread * td,struct reg32 * regs)285 set_regs32(struct thread *td, struct reg32 *regs)
286 {
287 
288 	printf("ARM64TODO: set_regs32");
289 	return (EDOOFUS);
290 }
291 
292 int
fill_fpregs32(struct thread * td,struct fpreg32 * regs)293 fill_fpregs32(struct thread *td, struct fpreg32 *regs)
294 {
295 
296 	printf("ARM64TODO: fill_fpregs32");
297 	return (EDOOFUS);
298 }
299 
300 int
set_fpregs32(struct thread * td,struct fpreg32 * regs)301 set_fpregs32(struct thread *td, struct fpreg32 *regs)
302 {
303 
304 	printf("ARM64TODO: set_fpregs32");
305 	return (EDOOFUS);
306 }
307 
308 int
fill_dbregs32(struct thread * td,struct dbreg32 * regs)309 fill_dbregs32(struct thread *td, struct dbreg32 *regs)
310 {
311 
312 	printf("ARM64TODO: fill_dbregs32");
313 	return (EDOOFUS);
314 }
315 
316 int
set_dbregs32(struct thread * td,struct dbreg32 * regs)317 set_dbregs32(struct thread *td, struct dbreg32 *regs)
318 {
319 
320 	printf("ARM64TODO: set_dbregs32");
321 	return (EDOOFUS);
322 }
323 #endif
324 
325 int
ptrace_set_pc(struct thread * td,u_long addr)326 ptrace_set_pc(struct thread *td, u_long addr)
327 {
328 
329 	printf("ARM64TODO: ptrace_set_pc");
330 	return (EDOOFUS);
331 }
332 
333 int
ptrace_single_step(struct thread * td)334 ptrace_single_step(struct thread *td)
335 {
336 
337 	td->td_frame->tf_spsr |= PSR_SS;
338 	td->td_pcb->pcb_flags |= PCB_SINGLE_STEP;
339 	return (0);
340 }
341 
342 int
ptrace_clear_single_step(struct thread * td)343 ptrace_clear_single_step(struct thread *td)
344 {
345 
346 	td->td_frame->tf_spsr &= ~PSR_SS;
347 	td->td_pcb->pcb_flags &= ~PCB_SINGLE_STEP;
348 	return (0);
349 }
350 
351 void
exec_setregs(struct thread * td,struct image_params * imgp,u_long stack)352 exec_setregs(struct thread *td, struct image_params *imgp, u_long stack)
353 {
354 	struct trapframe *tf = td->td_frame;
355 
356 	memset(tf, 0, sizeof(struct trapframe));
357 
358 	tf->tf_x[0] = stack;
359 	tf->tf_sp = STACKALIGN(stack);
360 	tf->tf_lr = imgp->entry_addr;
361 	tf->tf_elr = imgp->entry_addr;
362 }
363 
364 /* Sanity check these are the same size, they will be memcpy'd to and fro */
365 CTASSERT(sizeof(((struct trapframe *)0)->tf_x) ==
366     sizeof((struct gpregs *)0)->gp_x);
367 CTASSERT(sizeof(((struct trapframe *)0)->tf_x) ==
368     sizeof((struct reg *)0)->x);
369 
370 int
get_mcontext(struct thread * td,mcontext_t * mcp,int clear_ret)371 get_mcontext(struct thread *td, mcontext_t *mcp, int clear_ret)
372 {
373 	struct trapframe *tf = td->td_frame;
374 
375 	if (clear_ret & GET_MC_CLEAR_RET) {
376 		mcp->mc_gpregs.gp_x[0] = 0;
377 		mcp->mc_gpregs.gp_spsr = tf->tf_spsr & ~PSR_C;
378 	} else {
379 		mcp->mc_gpregs.gp_x[0] = tf->tf_x[0];
380 		mcp->mc_gpregs.gp_spsr = tf->tf_spsr;
381 	}
382 
383 	memcpy(&mcp->mc_gpregs.gp_x[1], &tf->tf_x[1],
384 	    sizeof(mcp->mc_gpregs.gp_x[1]) * (nitems(mcp->mc_gpregs.gp_x) - 1));
385 
386 	mcp->mc_gpregs.gp_sp = tf->tf_sp;
387 	mcp->mc_gpregs.gp_lr = tf->tf_lr;
388 	mcp->mc_gpregs.gp_elr = tf->tf_elr;
389 
390 	return (0);
391 }
392 
393 int
set_mcontext(struct thread * td,mcontext_t * mcp)394 set_mcontext(struct thread *td, mcontext_t *mcp)
395 {
396 	struct trapframe *tf = td->td_frame;
397 	uint32_t spsr;
398 
399 	spsr = mcp->mc_gpregs.gp_spsr;
400 	if ((spsr & PSR_M_MASK) != PSR_M_EL0t ||
401 	    (spsr & (PSR_AARCH32 | PSR_F | PSR_I | PSR_A | PSR_D)) != 0)
402 		return (EINVAL);
403 
404 	memcpy(tf->tf_x, mcp->mc_gpregs.gp_x, sizeof(tf->tf_x));
405 
406 	tf->tf_sp = mcp->mc_gpregs.gp_sp;
407 	tf->tf_lr = mcp->mc_gpregs.gp_lr;
408 	tf->tf_elr = mcp->mc_gpregs.gp_elr;
409 	tf->tf_spsr = mcp->mc_gpregs.gp_spsr;
410 
411 	return (0);
412 }
413 
414 static void
get_fpcontext(struct thread * td,mcontext_t * mcp)415 get_fpcontext(struct thread *td, mcontext_t *mcp)
416 {
417 #ifdef VFP
418 	struct pcb *curpcb;
419 
420 	critical_enter();
421 
422 	curpcb = curthread->td_pcb;
423 
424 	if ((curpcb->pcb_fpflags & PCB_FP_STARTED) != 0) {
425 		/*
426 		 * If we have just been running VFP instructions we will
427 		 * need to save the state to memcpy it below.
428 		 */
429 		vfp_save_state(td, curpcb);
430 
431 		KASSERT(curpcb->pcb_fpusaved == &curpcb->pcb_fpustate,
432 		    ("Called get_fpcontext while the kernel is using the VFP"));
433 		KASSERT((curpcb->pcb_fpflags & ~PCB_FP_USERMASK) == 0,
434 		    ("Non-userspace FPU flags set in get_fpcontext"));
435 		memcpy(mcp->mc_fpregs.fp_q, curpcb->pcb_fpustate.vfp_regs,
436 		    sizeof(mcp->mc_fpregs));
437 		mcp->mc_fpregs.fp_cr = curpcb->pcb_fpustate.vfp_fpcr;
438 		mcp->mc_fpregs.fp_sr = curpcb->pcb_fpustate.vfp_fpsr;
439 		mcp->mc_fpregs.fp_flags = curpcb->pcb_fpflags;
440 		mcp->mc_flags |= _MC_FP_VALID;
441 	}
442 
443 	critical_exit();
444 #endif
445 }
446 
447 static void
set_fpcontext(struct thread * td,mcontext_t * mcp)448 set_fpcontext(struct thread *td, mcontext_t *mcp)
449 {
450 #ifdef VFP
451 	struct pcb *curpcb;
452 
453 	critical_enter();
454 
455 	if ((mcp->mc_flags & _MC_FP_VALID) != 0) {
456 		curpcb = curthread->td_pcb;
457 
458 		/*
459 		 * Discard any vfp state for the current thread, we
460 		 * are about to override it.
461 		 */
462 		vfp_discard(td);
463 
464 		KASSERT(curpcb->pcb_fpusaved == &curpcb->pcb_fpustate,
465 		    ("Called set_fpcontext while the kernel is using the VFP"));
466 		memcpy(curpcb->pcb_fpustate.vfp_regs, mcp->mc_fpregs.fp_q,
467 		    sizeof(mcp->mc_fpregs));
468 		curpcb->pcb_fpustate.vfp_fpcr = mcp->mc_fpregs.fp_cr;
469 		curpcb->pcb_fpustate.vfp_fpsr = mcp->mc_fpregs.fp_sr;
470 		curpcb->pcb_fpflags = mcp->mc_fpregs.fp_flags & PCB_FP_USERMASK;
471 	}
472 
473 	critical_exit();
474 #endif
475 }
476 
477 void
cpu_idle(int busy)478 cpu_idle(int busy)
479 {
480 
481 	spinlock_enter();
482 	if (!busy)
483 		cpu_idleclock();
484 	if (!sched_runnable())
485 		__asm __volatile(
486 		    "dsb sy \n"
487 		    "wfi    \n");
488 	if (!busy)
489 		cpu_activeclock();
490 	spinlock_exit();
491 }
492 
493 void
cpu_halt(void)494 cpu_halt(void)
495 {
496 
497 	/* We should have shutdown by now, if not enter a low power sleep */
498 	intr_disable();
499 	while (1) {
500 		__asm __volatile("wfi");
501 	}
502 }
503 
504 /*
505  * Flush the D-cache for non-DMA I/O so that the I-cache can
506  * be made coherent later.
507  */
508 void
cpu_flush_dcache(void * ptr,size_t len)509 cpu_flush_dcache(void *ptr, size_t len)
510 {
511 
512 	/* ARM64TODO TBD */
513 }
514 
515 /* Get current clock frequency for the given CPU ID. */
516 int
cpu_est_clockrate(int cpu_id,uint64_t * rate)517 cpu_est_clockrate(int cpu_id, uint64_t *rate)
518 {
519 	struct pcpu *pc;
520 
521 	pc = pcpu_find(cpu_id);
522 	if (pc == NULL || rate == NULL)
523 		return (EINVAL);
524 
525 	if (pc->pc_clock == 0)
526 		return (EOPNOTSUPP);
527 
528 	*rate = pc->pc_clock;
529 	return (0);
530 }
531 
532 void
cpu_pcpu_init(struct pcpu * pcpu,int cpuid,size_t size)533 cpu_pcpu_init(struct pcpu *pcpu, int cpuid, size_t size)
534 {
535 
536 	pcpu->pc_acpi_id = 0xffffffff;
537 }
538 
539 void
spinlock_enter(void)540 spinlock_enter(void)
541 {
542 	struct thread *td;
543 	register_t daif;
544 
545 	td = curthread;
546 	if (td->td_md.md_spinlock_count == 0) {
547 		daif = intr_disable();
548 		td->td_md.md_spinlock_count = 1;
549 		td->td_md.md_saved_daif = daif;
550 	} else
551 		td->td_md.md_spinlock_count++;
552 	critical_enter();
553 }
554 
555 void
spinlock_exit(void)556 spinlock_exit(void)
557 {
558 	struct thread *td;
559 	register_t daif;
560 
561 	td = curthread;
562 	critical_exit();
563 	daif = td->td_md.md_saved_daif;
564 	td->td_md.md_spinlock_count--;
565 	if (td->td_md.md_spinlock_count == 0)
566 		intr_restore(daif);
567 }
568 
569 #ifndef	_SYS_SYSPROTO_H_
570 struct sigreturn_args {
571 	ucontext_t *ucp;
572 };
573 #endif
574 
575 int
sys_sigreturn(struct thread * td,struct sigreturn_args * uap)576 sys_sigreturn(struct thread *td, struct sigreturn_args *uap)
577 {
578 	ucontext_t uc;
579 	int error;
580 
581 	if (uap == NULL)
582 		return (EFAULT);
583 	if (copyin(uap->sigcntxp, &uc, sizeof(uc)))
584 		return (EFAULT);
585 
586 	error = set_mcontext(td, &uc.uc_mcontext);
587 	if (error != 0)
588 		return (error);
589 	set_fpcontext(td, &uc.uc_mcontext);
590 
591 	/* Restore signal mask. */
592 	kern_sigprocmask(td, SIG_SETMASK, &uc.uc_sigmask, NULL, 0);
593 
594 	return (EJUSTRETURN);
595 }
596 
597 /*
598  * Construct a PCB from a trapframe. This is called from kdb_trap() where
599  * we want to start a backtrace from the function that caused us to enter
600  * the debugger. We have the context in the trapframe, but base the trace
601  * on the PCB. The PCB doesn't have to be perfect, as long as it contains
602  * enough for a backtrace.
603  */
604 void
makectx(struct trapframe * tf,struct pcb * pcb)605 makectx(struct trapframe *tf, struct pcb *pcb)
606 {
607 	int i;
608 
609 	for (i = 0; i < PCB_LR; i++)
610 		pcb->pcb_x[i] = tf->tf_x[i];
611 
612 	pcb->pcb_x[PCB_LR] = tf->tf_lr;
613 	pcb->pcb_pc = tf->tf_elr;
614 	pcb->pcb_sp = tf->tf_sp;
615 }
616 
617 void
sendsig(sig_t catcher,ksiginfo_t * ksi,sigset_t * mask)618 sendsig(sig_t catcher, ksiginfo_t *ksi, sigset_t *mask)
619 {
620 	struct thread *td;
621 	struct proc *p;
622 	struct trapframe *tf;
623 	struct sigframe *fp, frame;
624 	struct sigacts *psp;
625 	struct sysentvec *sysent;
626 	int onstack, sig;
627 
628 	td = curthread;
629 	p = td->td_proc;
630 	PROC_LOCK_ASSERT(p, MA_OWNED);
631 
632 	sig = ksi->ksi_signo;
633 	psp = p->p_sigacts;
634 	mtx_assert(&psp->ps_mtx, MA_OWNED);
635 
636 	tf = td->td_frame;
637 	onstack = sigonstack(tf->tf_sp);
638 
639 	CTR4(KTR_SIG, "sendsig: td=%p (%s) catcher=%p sig=%d", td, p->p_comm,
640 	    catcher, sig);
641 
642 	/* Allocate and validate space for the signal handler context. */
643 	if ((td->td_pflags & TDP_ALTSTACK) != 0 && !onstack &&
644 	    SIGISMEMBER(psp->ps_sigonstack, sig)) {
645 		fp = (struct sigframe *)((uintptr_t)td->td_sigstk.ss_sp +
646 		    td->td_sigstk.ss_size);
647 #if defined(COMPAT_43)
648 		td->td_sigstk.ss_flags |= SS_ONSTACK;
649 #endif
650 	} else {
651 		fp = (struct sigframe *)td->td_frame->tf_sp;
652 	}
653 
654 	/* Make room, keeping the stack aligned */
655 	fp--;
656 	fp = (struct sigframe *)STACKALIGN(fp);
657 
658 	/* Fill in the frame to copy out */
659 	bzero(&frame, sizeof(frame));
660 	get_mcontext(td, &frame.sf_uc.uc_mcontext, 0);
661 	get_fpcontext(td, &frame.sf_uc.uc_mcontext);
662 	frame.sf_si = ksi->ksi_info;
663 	frame.sf_uc.uc_sigmask = *mask;
664 	frame.sf_uc.uc_stack.ss_flags = (td->td_pflags & TDP_ALTSTACK) ?
665 	    ((onstack) ? SS_ONSTACK : 0) : SS_DISABLE;
666 	frame.sf_uc.uc_stack = td->td_sigstk;
667 	mtx_unlock(&psp->ps_mtx);
668 	PROC_UNLOCK(td->td_proc);
669 
670 	/* Copy the sigframe out to the user's stack. */
671 	if (copyout(&frame, fp, sizeof(*fp)) != 0) {
672 		/* Process has trashed its stack. Kill it. */
673 		CTR2(KTR_SIG, "sendsig: sigexit td=%p fp=%p", td, fp);
674 		PROC_LOCK(p);
675 		sigexit(td, SIGILL);
676 	}
677 
678 	tf->tf_x[0]= sig;
679 	tf->tf_x[1] = (register_t)&fp->sf_si;
680 	tf->tf_x[2] = (register_t)&fp->sf_uc;
681 
682 	tf->tf_elr = (register_t)catcher;
683 	tf->tf_sp = (register_t)fp;
684 	sysent = p->p_sysent;
685 	if (sysent->sv_sigcode_base != 0)
686 		tf->tf_lr = (register_t)sysent->sv_sigcode_base;
687 	else
688 		tf->tf_lr = (register_t)(sysent->sv_psstrings -
689 		    *(sysent->sv_szsigcode));
690 
691 	CTR3(KTR_SIG, "sendsig: return td=%p pc=%#x sp=%#x", td, tf->tf_elr,
692 	    tf->tf_sp);
693 
694 	PROC_LOCK(p);
695 	mtx_lock(&psp->ps_mtx);
696 }
697 
698 static void
init_proc0(vm_offset_t kstack)699 init_proc0(vm_offset_t kstack)
700 {
701 	struct pcpu *pcpup = &__pcpu[0];
702 
703 	proc_linkup0(&proc0, &thread0);
704 	thread0.td_kstack = kstack;
705 	thread0.td_pcb = (struct pcb *)(thread0.td_kstack) - 1;
706 	thread0.td_pcb->pcb_fpflags = 0;
707 	thread0.td_pcb->pcb_fpusaved = &thread0.td_pcb->pcb_fpustate;
708 	thread0.td_pcb->pcb_vfpcpu = UINT_MAX;
709 	thread0.td_frame = &proc0_tf;
710 	pcpup->pc_curpcb = thread0.td_pcb;
711 
712 	/* Set the base address of translation table 0. */
713 	thread0.td_proc->p_md.md_l0addr = READ_SPECIALREG(ttbr0_el1);
714 }
715 
716 typedef struct {
717 	uint32_t type;
718 	uint64_t phys_start;
719 	uint64_t virt_start;
720 	uint64_t num_pages;
721 	uint64_t attr;
722 } EFI_MEMORY_DESCRIPTOR;
723 
724 typedef void (*efi_map_entry_cb)(struct efi_md *);
725 
726 static void
foreach_efi_map_entry(struct efi_map_header * efihdr,efi_map_entry_cb cb)727 foreach_efi_map_entry(struct efi_map_header *efihdr, efi_map_entry_cb cb)
728 {
729 	struct efi_md *map, *p;
730 	size_t efisz;
731 	int ndesc, i;
732 
733 	/*
734 	 * Memory map data provided by UEFI via the GetMemoryMap
735 	 * Boot Services API.
736 	 */
737 	efisz = (sizeof(struct efi_map_header) + 0xf) & ~0xf;
738 	map = (struct efi_md *)((uint8_t *)efihdr + efisz);
739 
740 	if (efihdr->descriptor_size == 0)
741 		return;
742 	ndesc = efihdr->memory_size / efihdr->descriptor_size;
743 
744 	for (i = 0, p = map; i < ndesc; i++,
745 	    p = efi_next_descriptor(p, efihdr->descriptor_size)) {
746 		cb(p);
747 	}
748 }
749 
750 static void
exclude_efi_map_entry(struct efi_md * p)751 exclude_efi_map_entry(struct efi_md *p)
752 {
753 
754 	switch (p->md_type) {
755 	case EFI_MD_TYPE_CODE:
756 	case EFI_MD_TYPE_DATA:
757 	case EFI_MD_TYPE_BS_CODE:
758 	case EFI_MD_TYPE_BS_DATA:
759 	case EFI_MD_TYPE_FREE:
760 		/*
761 		 * We're allowed to use any entry with these types.
762 		 */
763 		break;
764 	default:
765 		arm_physmem_exclude_region(p->md_phys, p->md_pages * PAGE_SIZE,
766 		    EXFLAG_NOALLOC);
767 	}
768 }
769 
770 static void
exclude_efi_map_entries(struct efi_map_header * efihdr)771 exclude_efi_map_entries(struct efi_map_header *efihdr)
772 {
773 
774 	foreach_efi_map_entry(efihdr, exclude_efi_map_entry);
775 }
776 
777 static void
add_efi_map_entry(struct efi_md * p)778 add_efi_map_entry(struct efi_md *p)
779 {
780 
781 	switch (p->md_type) {
782 	case EFI_MD_TYPE_RT_DATA:
783 		/*
784 		 * Runtime data will be excluded after the DMAP
785 		 * region is created to stop it from being added
786 		 * to phys_avail.
787 		 */
788 	case EFI_MD_TYPE_CODE:
789 	case EFI_MD_TYPE_DATA:
790 	case EFI_MD_TYPE_BS_CODE:
791 	case EFI_MD_TYPE_BS_DATA:
792 	case EFI_MD_TYPE_FREE:
793 		/*
794 		 * We're allowed to use any entry with these types.
795 		 */
796 		arm_physmem_hardware_region(p->md_phys,
797 		    p->md_pages * PAGE_SIZE);
798 		break;
799 	}
800 }
801 
802 static void
add_efi_map_entries(struct efi_map_header * efihdr)803 add_efi_map_entries(struct efi_map_header *efihdr)
804 {
805 
806 	foreach_efi_map_entry(efihdr, add_efi_map_entry);
807 }
808 
809 static void
print_efi_map_entry(struct efi_md * p)810 print_efi_map_entry(struct efi_md *p)
811 {
812 	const char *type;
813 	static const char *types[] = {
814 		"Reserved",
815 		"LoaderCode",
816 		"LoaderData",
817 		"BootServicesCode",
818 		"BootServicesData",
819 		"RuntimeServicesCode",
820 		"RuntimeServicesData",
821 		"ConventionalMemory",
822 		"UnusableMemory",
823 		"ACPIReclaimMemory",
824 		"ACPIMemoryNVS",
825 		"MemoryMappedIO",
826 		"MemoryMappedIOPortSpace",
827 		"PalCode",
828 		"PersistentMemory"
829 	};
830 
831 	if (p->md_type < nitems(types))
832 		type = types[p->md_type];
833 	else
834 		type = "<INVALID>";
835 	printf("%23s %012lx %12p %08lx ", type, p->md_phys,
836 	    p->md_virt, p->md_pages);
837 	if (p->md_attr & EFI_MD_ATTR_UC)
838 		printf("UC ");
839 	if (p->md_attr & EFI_MD_ATTR_WC)
840 		printf("WC ");
841 	if (p->md_attr & EFI_MD_ATTR_WT)
842 		printf("WT ");
843 	if (p->md_attr & EFI_MD_ATTR_WB)
844 		printf("WB ");
845 	if (p->md_attr & EFI_MD_ATTR_UCE)
846 		printf("UCE ");
847 	if (p->md_attr & EFI_MD_ATTR_WP)
848 		printf("WP ");
849 	if (p->md_attr & EFI_MD_ATTR_RP)
850 		printf("RP ");
851 	if (p->md_attr & EFI_MD_ATTR_XP)
852 		printf("XP ");
853 	if (p->md_attr & EFI_MD_ATTR_NV)
854 		printf("NV ");
855 	if (p->md_attr & EFI_MD_ATTR_MORE_RELIABLE)
856 		printf("MORE_RELIABLE ");
857 	if (p->md_attr & EFI_MD_ATTR_RO)
858 		printf("RO ");
859 	if (p->md_attr & EFI_MD_ATTR_RT)
860 		printf("RUNTIME");
861 	printf("\n");
862 }
863 
864 static void
print_efi_map_entries(struct efi_map_header * efihdr)865 print_efi_map_entries(struct efi_map_header *efihdr)
866 {
867 
868 	printf("%23s %12s %12s %8s %4s\n",
869 	    "Type", "Physical", "Virtual", "#Pages", "Attr");
870 	foreach_efi_map_entry(efihdr, print_efi_map_entry);
871 }
872 
873 #ifdef FDT
874 static void
try_load_dtb(caddr_t kmdp)875 try_load_dtb(caddr_t kmdp)
876 {
877 	vm_offset_t dtbp;
878 
879 	dtbp = MD_FETCH(kmdp, MODINFOMD_DTBP, vm_offset_t);
880 	if (dtbp == (vm_offset_t)NULL) {
881 		printf("ERROR loading DTB\n");
882 		return;
883 	}
884 
885 	if (OF_install(OFW_FDT, 0) == FALSE)
886 		panic("Cannot install FDT");
887 
888 	if (OF_init((void *)dtbp) != 0)
889 		panic("OF_init failed with the found device tree");
890 }
891 #endif
892 
893 static bool
bus_probe(void)894 bus_probe(void)
895 {
896 	bool has_acpi, has_fdt;
897 	char *order, *env;
898 
899 	has_acpi = has_fdt = false;
900 
901 #ifdef FDT
902 	has_fdt = (OF_peer(0) != 0);
903 #endif
904 #ifdef DEV_ACPI
905 	has_acpi = (acpi_find_table(ACPI_SIG_SPCR) != 0);
906 #endif
907 
908 	env = kern_getenv("kern.cfg.order");
909 	if (env != NULL) {
910 		order = env;
911 		while (order != NULL) {
912 			if (has_acpi &&
913 			    strncmp(order, "acpi", 4) == 0 &&
914 			    (order[4] == ',' || order[4] == '\0')) {
915 				arm64_bus_method = ARM64_BUS_ACPI;
916 				break;
917 			}
918 			if (has_fdt &&
919 			    strncmp(order, "fdt", 3) == 0 &&
920 			    (order[3] == ',' || order[3] == '\0')) {
921 				arm64_bus_method = ARM64_BUS_FDT;
922 				break;
923 			}
924 			order = strchr(order, ',');
925 		}
926 		freeenv(env);
927 
928 		/* If we set the bus method it is valid */
929 		if (arm64_bus_method != ARM64_BUS_NONE)
930 			return (true);
931 	}
932 	/* If no order or an invalid order was set use the default */
933 	if (arm64_bus_method == ARM64_BUS_NONE) {
934 		if (has_fdt)
935 			arm64_bus_method = ARM64_BUS_FDT;
936 		else if (has_acpi)
937 			arm64_bus_method = ARM64_BUS_ACPI;
938 	}
939 
940 	/*
941 	 * If no option was set the default is valid, otherwise we are
942 	 * setting one to get cninit() working, then calling panic to tell
943 	 * the user about the invalid bus setup.
944 	 */
945 	return (env == NULL);
946 }
947 
948 static void
cache_setup(void)949 cache_setup(void)
950 {
951 	int dcache_line_shift, icache_line_shift, dczva_line_shift;
952 	uint32_t ctr_el0;
953 	uint32_t dczid_el0;
954 
955 	ctr_el0 = READ_SPECIALREG(ctr_el0);
956 
957 	/* Read the log2 words in each D cache line */
958 	dcache_line_shift = CTR_DLINE_SIZE(ctr_el0);
959 	/* Get the D cache line size */
960 	dcache_line_size = sizeof(int) << dcache_line_shift;
961 
962 	/* And the same for the I cache */
963 	icache_line_shift = CTR_ILINE_SIZE(ctr_el0);
964 	icache_line_size = sizeof(int) << icache_line_shift;
965 
966 	idcache_line_size = MIN(dcache_line_size, icache_line_size);
967 
968 	dczid_el0 = READ_SPECIALREG(dczid_el0);
969 
970 	/* Check if dc zva is not prohibited */
971 	if (dczid_el0 & DCZID_DZP)
972 		dczva_line_size = 0;
973 	else {
974 		/* Same as with above calculations */
975 		dczva_line_shift = DCZID_BS_SIZE(dczid_el0);
976 		dczva_line_size = sizeof(int) << dczva_line_shift;
977 
978 		/* Change pagezero function */
979 		pagezero = pagezero_cache;
980 	}
981 }
982 
983 void
initarm(struct arm64_bootparams * abp)984 initarm(struct arm64_bootparams *abp)
985 {
986 	struct efi_fb *efifb;
987 	struct efi_map_header *efihdr;
988 	struct pcpu *pcpup;
989 	char *env;
990 #ifdef FDT
991 	struct mem_region mem_regions[FDT_MEM_REGIONS];
992 	int mem_regions_sz;
993 #endif
994 	vm_offset_t lastaddr;
995 	caddr_t kmdp;
996 	bool valid;
997 
998 	/* Set the module data location */
999 	preload_metadata = (caddr_t)(uintptr_t)(abp->modulep);
1000 
1001 	/* Find the kernel address */
1002 	kmdp = preload_search_by_type("elf kernel");
1003 	if (kmdp == NULL)
1004 		kmdp = preload_search_by_type("elf64 kernel");
1005 
1006 	boothowto = MD_FETCH(kmdp, MODINFOMD_HOWTO, int);
1007 	init_static_kenv(MD_FETCH(kmdp, MODINFOMD_ENVP, char *), 0);
1008 	link_elf_ireloc(kmdp);
1009 
1010 #ifdef FDT
1011 	try_load_dtb(kmdp);
1012 #endif
1013 
1014 	efi_systbl_phys = MD_FETCH(kmdp, MODINFOMD_FW_HANDLE, vm_paddr_t);
1015 
1016 	/* Find the address to start allocating from */
1017 	lastaddr = MD_FETCH(kmdp, MODINFOMD_KERNEND, vm_offset_t);
1018 
1019 	/* Load the physical memory ranges */
1020 	efihdr = (struct efi_map_header *)preload_search_info(kmdp,
1021 	    MODINFO_METADATA | MODINFOMD_EFI_MAP);
1022 	if (efihdr != NULL)
1023 		add_efi_map_entries(efihdr);
1024 #ifdef FDT
1025 	else {
1026 		/* Grab physical memory regions information from device tree. */
1027 		if (fdt_get_mem_regions(mem_regions, &mem_regions_sz,
1028 		    NULL) != 0)
1029 			panic("Cannot get physical memory regions");
1030 		arm_physmem_hardware_regions(mem_regions, mem_regions_sz);
1031 	}
1032 	if (fdt_get_reserved_mem(mem_regions, &mem_regions_sz) == 0)
1033 		arm_physmem_exclude_regions(mem_regions, mem_regions_sz,
1034 		    EXFLAG_NODUMP | EXFLAG_NOALLOC);
1035 #endif
1036 
1037 	/* Exclude the EFI framebuffer from our view of physical memory. */
1038 	efifb = (struct efi_fb *)preload_search_info(kmdp,
1039 	    MODINFO_METADATA | MODINFOMD_EFI_FB);
1040 	if (efifb != NULL)
1041 		arm_physmem_exclude_region(efifb->fb_addr, efifb->fb_size,
1042 		    EXFLAG_NOALLOC);
1043 
1044 	/* Set the pcpu data, this is needed by pmap_bootstrap */
1045 	pcpup = &__pcpu[0];
1046 	pcpu_init(pcpup, 0, sizeof(struct pcpu));
1047 
1048 	/*
1049 	 * Set the pcpu pointer with a backup in tpidr_el1 to be
1050 	 * loaded when entering the kernel from userland.
1051 	 */
1052 	__asm __volatile(
1053 	    "mov x18, %0 \n"
1054 	    "msr tpidr_el1, %0" :: "r"(pcpup));
1055 
1056 	PCPU_SET(curthread, &thread0);
1057 
1058 	/* Do basic tuning, hz etc */
1059 	init_param1();
1060 
1061 	cache_setup();
1062 	pan_setup();
1063 
1064 	/* Bootstrap enough of pmap  to enter the kernel proper */
1065 	pmap_bootstrap(abp->kern_l0pt, abp->kern_l1pt,
1066 	    KERNBASE - abp->kern_delta, lastaddr - KERNBASE);
1067 	/* Exclude entries neexed in teh DMAP region, but not phys_avail */
1068 	if (efihdr != NULL)
1069 		exclude_efi_map_entries(efihdr);
1070 	arm_physmem_init_kernel_globals();
1071 
1072 	devmap_bootstrap(0, NULL);
1073 
1074 	valid = bus_probe();
1075 
1076 	cninit();
1077 
1078 	if (!valid)
1079 		panic("Invalid bus configuration: %s",
1080 		    kern_getenv("kern.cfg.order"));
1081 
1082 	init_proc0(abp->kern_stack);
1083 	msgbufinit(msgbufp, msgbufsize);
1084 	mutex_init();
1085 	init_param2(physmem);
1086 
1087 	dbg_init();
1088 	kdb_init();
1089 	pan_enable();
1090 
1091 	env = kern_getenv("kernelname");
1092 	if (env != NULL)
1093 		strlcpy(kernelname, env, sizeof(kernelname));
1094 
1095 	if (boothowto & RB_VERBOSE) {
1096 		print_efi_map_entries(efihdr);
1097 		arm_physmem_print_tables();
1098 	}
1099 
1100 	early_boot = 0;
1101 }
1102 
1103 void
dbg_init(void)1104 dbg_init(void)
1105 {
1106 
1107 	/* Clear OS lock */
1108 	WRITE_SPECIALREG(OSLAR_EL1, 0);
1109 
1110 	/* This permits DDB to use debug registers for watchpoints. */
1111 	dbg_monitor_init();
1112 
1113 	/* TODO: Eventually will need to initialize debug registers here. */
1114 }
1115 
1116 #ifdef DDB
1117 #include <ddb/ddb.h>
1118 
DB_SHOW_COMMAND(specialregs,db_show_spregs)1119 DB_SHOW_COMMAND(specialregs, db_show_spregs)
1120 {
1121 #define	PRINT_REG(reg)	\
1122     db_printf(__STRING(reg) " = %#016lx\n", READ_SPECIALREG(reg))
1123 
1124 	PRINT_REG(actlr_el1);
1125 	PRINT_REG(afsr0_el1);
1126 	PRINT_REG(afsr1_el1);
1127 	PRINT_REG(aidr_el1);
1128 	PRINT_REG(amair_el1);
1129 	PRINT_REG(ccsidr_el1);
1130 	PRINT_REG(clidr_el1);
1131 	PRINT_REG(contextidr_el1);
1132 	PRINT_REG(cpacr_el1);
1133 	PRINT_REG(csselr_el1);
1134 	PRINT_REG(ctr_el0);
1135 	PRINT_REG(currentel);
1136 	PRINT_REG(daif);
1137 	PRINT_REG(dczid_el0);
1138 	PRINT_REG(elr_el1);
1139 	PRINT_REG(esr_el1);
1140 	PRINT_REG(far_el1);
1141 #if 0
1142 	/* ARM64TODO: Enable VFP before reading floating-point registers */
1143 	PRINT_REG(fpcr);
1144 	PRINT_REG(fpsr);
1145 #endif
1146 	PRINT_REG(id_aa64afr0_el1);
1147 	PRINT_REG(id_aa64afr1_el1);
1148 	PRINT_REG(id_aa64dfr0_el1);
1149 	PRINT_REG(id_aa64dfr1_el1);
1150 	PRINT_REG(id_aa64isar0_el1);
1151 	PRINT_REG(id_aa64isar1_el1);
1152 	PRINT_REG(id_aa64pfr0_el1);
1153 	PRINT_REG(id_aa64pfr1_el1);
1154 	PRINT_REG(id_afr0_el1);
1155 	PRINT_REG(id_dfr0_el1);
1156 	PRINT_REG(id_isar0_el1);
1157 	PRINT_REG(id_isar1_el1);
1158 	PRINT_REG(id_isar2_el1);
1159 	PRINT_REG(id_isar3_el1);
1160 	PRINT_REG(id_isar4_el1);
1161 	PRINT_REG(id_isar5_el1);
1162 	PRINT_REG(id_mmfr0_el1);
1163 	PRINT_REG(id_mmfr1_el1);
1164 	PRINT_REG(id_mmfr2_el1);
1165 	PRINT_REG(id_mmfr3_el1);
1166 #if 0
1167 	/* Missing from llvm */
1168 	PRINT_REG(id_mmfr4_el1);
1169 #endif
1170 	PRINT_REG(id_pfr0_el1);
1171 	PRINT_REG(id_pfr1_el1);
1172 	PRINT_REG(isr_el1);
1173 	PRINT_REG(mair_el1);
1174 	PRINT_REG(midr_el1);
1175 	PRINT_REG(mpidr_el1);
1176 	PRINT_REG(mvfr0_el1);
1177 	PRINT_REG(mvfr1_el1);
1178 	PRINT_REG(mvfr2_el1);
1179 	PRINT_REG(revidr_el1);
1180 	PRINT_REG(sctlr_el1);
1181 	PRINT_REG(sp_el0);
1182 	PRINT_REG(spsel);
1183 	PRINT_REG(spsr_el1);
1184 	PRINT_REG(tcr_el1);
1185 	PRINT_REG(tpidr_el0);
1186 	PRINT_REG(tpidr_el1);
1187 	PRINT_REG(tpidrro_el0);
1188 	PRINT_REG(ttbr0_el1);
1189 	PRINT_REG(ttbr1_el1);
1190 	PRINT_REG(vbar_el1);
1191 #undef PRINT_REG
1192 }
1193 
DB_SHOW_COMMAND(vtop,db_show_vtop)1194 DB_SHOW_COMMAND(vtop, db_show_vtop)
1195 {
1196 	uint64_t phys;
1197 
1198 	if (have_addr) {
1199 		phys = arm64_address_translate_s1e1r(addr);
1200 		db_printf("EL1 physical address reg (read):  0x%016lx\n", phys);
1201 		phys = arm64_address_translate_s1e1w(addr);
1202 		db_printf("EL1 physical address reg (write): 0x%016lx\n", phys);
1203 		phys = arm64_address_translate_s1e0r(addr);
1204 		db_printf("EL0 physical address reg (read):  0x%016lx\n", phys);
1205 		phys = arm64_address_translate_s1e0w(addr);
1206 		db_printf("EL0 physical address reg (write): 0x%016lx\n", phys);
1207 	} else
1208 		db_printf("show vtop <virt_addr>\n");
1209 }
1210 #endif
1211