1/*	$NetBSD: machdep.c,v 1.308 2024/03/05 14:15:35 thorpej Exp $ */
2
3/*-
4 * Copyright (c) 1996, 1997, 1998, 2019, 2023 The NetBSD Foundation, Inc.
5 * All rights reserved.
6 *
7 * This code is derived from software contributed to The NetBSD Foundation
8 * by Jason R. Thorpe of the Numerical Aerospace Simulation Facility,
9 * NASA Ames Research Center.
10 *
11 * Redistribution and use in source and binary forms, with or without
12 * modification, are permitted provided that the following conditions
13 * are met:
14 * 1. Redistributions of source code must retain the above copyright
15 *    notice, this list of conditions and the following disclaimer.
16 * 2. Redistributions in binary form must reproduce the above copyright
17 *    notice, this list of conditions and the following disclaimer in the
18 *    documentation and/or other materials provided with the distribution.
19 *
20 * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
21 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
22 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
23 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
24 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
25 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
26 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
27 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
28 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
29 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
30 * POSSIBILITY OF SUCH DAMAGE.
31 */
32
33/*
34 * Copyright (c) 1992, 1993
35 *	The Regents of the University of California.  All rights reserved.
36 *
37 * This software was developed by the Computer Systems Engineering group
38 * at Lawrence Berkeley Laboratory under DARPA contract BG 91-66 and
39 * contributed to Berkeley.
40 *
41 * All advertising materials mentioning features or use of this software
42 * must display the following acknowledgement:
43 *	This product includes software developed by the University of
44 *	California, Lawrence Berkeley Laboratory.
45 *
46 * Redistribution and use in source and binary forms, with or without
47 * modification, are permitted provided that the following conditions
48 * are met:
49 * 1. Redistributions of source code must retain the above copyright
50 *    notice, this list of conditions and the following disclaimer.
51 * 2. Redistributions in binary form must reproduce the above copyright
52 *    notice, this list of conditions and the following disclaimer in the
53 *    documentation and/or other materials provided with the distribution.
54 * 3. Neither the name of the University nor the names of its contributors
55 *    may be used to endorse or promote products derived from this software
56 *    without specific prior written permission.
57 *
58 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
59 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
60 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
61 * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
62 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
63 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
64 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
65 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
66 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
67 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
68 * SUCH DAMAGE.
69 *
70 *	@(#)machdep.c	8.6 (Berkeley) 1/14/94
71 */
72
73#include <sys/cdefs.h>
74__KERNEL_RCSID(0, "$NetBSD: machdep.c,v 1.308 2024/03/05 14:15:35 thorpej Exp $");
75
76#include "opt_ddb.h"
77#include "opt_multiprocessor.h"
78#include "opt_modular.h"
79#include "opt_compat_netbsd.h"
80#include "opt_compat_sunos.h"
81
82#include <sys/param.h>
83#include <sys/extent.h>
84#include <sys/signal.h>
85#include <sys/signalvar.h>
86#include <sys/proc.h>
87#include <sys/buf.h>
88#include <sys/device.h>
89#include <sys/ras.h>
90#include <sys/reboot.h>
91#include <sys/systm.h>
92#include <sys/kernel.h>
93#include <sys/conf.h>
94#include <sys/file.h>
95#include <sys/kmem.h>
96#include <sys/mbuf.h>
97#include <sys/mount.h>
98#include <sys/msgbuf.h>
99#include <sys/syscallargs.h>
100#include <sys/exec.h>
101#include <sys/ucontext.h>
102#include <sys/cpu.h>
103#include <sys/module.h>
104#include <sys/ksyms.h>
105#include <sys/pserialize.h>
106
107#include <sys/exec_aout.h>
108
109#include <ddb/db_active.h>
110
111#include <dev/mm.h>
112
113#include <uvm/uvm.h>
114
115#include <sys/sysctl.h>
116#ifndef	ELFSIZE
117#ifdef __arch64__
118#define	ELFSIZE	64
119#else
120#define	ELFSIZE	32
121#endif
122#endif
123#include <sys/exec_elf.h>
124
125#define _SPARC_BUS_DMA_PRIVATE
126#include <machine/autoconf.h>
127#include <sys/bus.h>
128#include <sys/kprintf.h>
129#include <machine/frame.h>
130#include <machine/cpu.h>
131#include <machine/pcb.h>
132#include <machine/pmap.h>
133#include <machine/openfirm.h>
134#include <machine/sparc64.h>
135
136#include <sparc64/sparc64/cache.h>
137
138/* #include "fb.h" */
139#include "ksyms.h"
140
141int bus_space_debug = 0; /* This may be used by macros elsewhere. */
142#ifdef DEBUG
143#define DPRINTF(l, s)   do { if (bus_space_debug & l) printf s; } while (0)
144#else
145#define DPRINTF(l, s)
146#endif
147
148#if defined(COMPAT_16) || defined(COMPAT_SUNOS)
149#ifdef DEBUG
150/* See <sparc64/sparc64/sigdebug.h> */
151int sigdebug = 0x0;
152int sigpid = 0;
153#endif
154#endif
155
156extern vaddr_t avail_end;
157#ifdef MODULAR
158vaddr_t module_start, module_end;
159static struct vm_map module_map_store;
160#endif
161
162/*
163 * Maximum number of DMA segments we'll allow in dmamem_load()
164 * routines.  Can be overridden in config files, etc.
165 */
166#ifndef MAX_DMA_SEGS
167#define MAX_DMA_SEGS	20
168#endif
169
170void	dumpsys(void);
171void	stackdump(void);
172
173
174/*
175 * Machine-dependent startup code
176 */
177void
178cpu_startup(void)
179{
180#ifdef DEBUG
181	extern int pmapdebug;
182	int opmapdebug = pmapdebug;
183#endif
184	char pbuf[9];
185
186#ifdef DEBUG
187	pmapdebug = 0;
188#endif
189
190	/*
191	 * Good {morning,afternoon,evening,night}.
192	 */
193	printf("%s%s", copyright, version);
194	/*identifycpu();*/
195	format_bytes(pbuf, sizeof(pbuf), ctob((uint64_t)physmem));
196	printf("total memory = %s\n", pbuf);
197
198#ifdef DEBUG
199	pmapdebug = opmapdebug;
200#endif
201	format_bytes(pbuf, sizeof(pbuf), ptoa(uvm_availmem(false)));
202	printf("avail memory = %s\n", pbuf);
203
204#if 0
205	pmap_redzone();
206#endif
207
208#ifdef MODULAR
209	uvm_map_setup(&module_map_store, module_start, module_end, 0);
210	module_map_store.pmap = pmap_kernel();
211	module_map = &module_map_store;
212#endif
213}
214
215/*
216 * Set up registers on exec.
217 */
218
219#ifdef __arch64__
220#define STACK_OFFSET	BIAS
221#undef CCFSZ
222#define CCFSZ	CC64FSZ
223#else
224#define STACK_OFFSET	0
225#endif
226
227/* ARGSUSED */
228void
229setregs(struct lwp *l, struct exec_package *pack, vaddr_t stack)
230{
231	struct trapframe64 *tf = l->l_md.md_tf;
232	struct fpstate64 *fs;
233	int64_t tstate;
234	int pstate = PSTATE_USER;
235#ifdef __arch64__
236	Elf_Ehdr *eh = pack->ep_hdr;
237#endif
238
239	/* Clear the P_32 flag. */
240	l->l_proc->p_flag &= ~PK_32;
241
242	/* Don't allow misaligned code by default */
243	l->l_proc->p_md.md_flags &= ~MDP_FIXALIGN;
244
245	/*
246	 * Set the registers to 0 except for:
247	 *	%o6: stack pointer, built in exec())
248	 *	%tstate: (retain icc and xcc and cwp bits)
249	 *	%g1: p->p_psstrp (used by crt0)
250	 *	%tpc,%tnpc: entry point of program
251	 */
252#ifdef __arch64__
253	/* Check what memory model is requested */
254	switch ((eh->e_flags & EF_SPARCV9_MM)) {
255	default:
256		printf("Unknown memory model %d\n",
257		       (eh->e_flags & EF_SPARCV9_MM));
258		/* FALLTHROUGH */
259	case EF_SPARCV9_TSO:
260		pstate = PSTATE_MM_TSO|PSTATE_IE;
261		break;
262	case EF_SPARCV9_PSO:
263		pstate = PSTATE_MM_PSO|PSTATE_IE;
264		break;
265	case EF_SPARCV9_RMO:
266		pstate = PSTATE_MM_RMO|PSTATE_IE;
267		break;
268	}
269#endif
270	tstate = ((int64_t)ASI_PRIMARY_NO_FAULT << TSTATE_ASI_SHIFT) |
271	    (pstate << TSTATE_PSTATE_SHIFT) | (tf->tf_tstate & TSTATE_CWP);
272	if ((fs = l->l_md.md_fpstate) != NULL) {
273		/*
274		 * We hold an FPU state.  If we own *the* FPU chip state
275		 * we must get rid of it, and the only way to do that is
276		 * to save it.  In any case, get rid of our FPU state.
277		 */
278		fpusave_lwp(l, false);
279		pool_cache_put(fpstate_cache, fs);
280		l->l_md.md_fpstate = NULL;
281	}
282	memset(tf, 0, sizeof *tf);
283	tf->tf_tstate = tstate;
284	tf->tf_global[1] = l->l_proc->p_psstrp;
285	/* %g4 needs to point to the start of the data segment */
286	tf->tf_global[4] = 0;
287	tf->tf_pc = pack->ep_entry & ~3;
288	tf->tf_npc = tf->tf_pc + 4;
289	stack -= sizeof(struct rwindow);
290	tf->tf_out[6] = stack - STACK_OFFSET;
291	tf->tf_out[7] = 0UL;
292#ifdef NOTDEF_DEBUG
293	printf("setregs: setting tf %p sp %p pc %p\n", (long)tf,
294	       (long)tf->tf_out[6], (long)tf->tf_pc);
295#ifdef DDB
296	Debugger();
297#endif
298#endif
299}
300
301/*
302 * machine dependent system variables.
303 */
304static int
305sysctl_machdep_boot(SYSCTLFN_ARGS)
306{
307	struct sysctlnode node = *rnode;
308	char bootpath[256];
309	const char *cp = NULL;
310	extern char ofbootpath[], *ofbootpartition, *ofbootfile, *ofbootflags;
311
312	switch (node.sysctl_num) {
313	case CPU_BOOTED_KERNEL:
314		cp = ofbootfile;
315                if (cp == NULL || cp[0] == '\0')
316                        /* Unknown to firmware, return default name */
317                        cp = "netbsd";
318		break;
319	case CPU_BOOT_ARGS:
320		cp = ofbootflags;
321		break;
322	case CPU_BOOTED_DEVICE:
323		if (ofbootpartition) {
324			snprintf(bootpath, sizeof(bootpath), "%s:%s",
325			    ofbootpath, ofbootpartition);
326			cp = bootpath;
327		} else {
328			cp = ofbootpath;
329		}
330		break;
331	}
332
333	if (cp == NULL || cp[0] == '\0')
334		return (ENOENT);
335
336	/*XXXUNCONST*/
337	node.sysctl_data = __UNCONST(cp);
338	node.sysctl_size = strlen(cp) + 1;
339	return (sysctl_lookup(SYSCTLFN_CALL(&node)));
340}
341
342/*
343 * figure out which VIS version the CPU supports
344 * this assumes all CPUs in the system are the same
345 */
346static int
347get_vis(void)
348{
349	int vis = 0;
350
351	if ( CPU_ISSUN4V ) {
352		/*
353		 * UA2005 and UA2007 supports VIS 1 and VIS 2.
354		 * Oracle SPARC Architecture 2011 supports VIS 3.
355		 *
356		 * XXX Settle with VIS 2 until we can determite the
357		 *     actual sun4v implementation.
358		 */
359		vis = 2;
360	} else {
361		if (GETVER_CPU_MANUF() == MANUF_FUJITSU) {
362			/* as far as I can tell SPARC64-III and up have VIS 1.0 */
363			if (GETVER_CPU_IMPL() >= IMPL_SPARC64_III) {
364				vis = 1;
365			}
366			/* XXX - which, if any, SPARC64 support VIS 2.0? */
367		} else {
368			/* this better be Sun */
369			vis = 1;	/* all UltraSPARCs support at least VIS 1.0 */
370			if (CPU_IS_USIII_UP()) {
371				vis = 2;
372			}
373		}
374	}
375	return vis;
376}
377
378SYSCTL_SETUP(sysctl_machdep_setup, "sysctl machdep subtree setup")
379{
380
381	sysctl_createv(clog, 0, NULL, NULL,
382		       CTLFLAG_PERMANENT,
383		       CTLTYPE_NODE, "machdep", NULL,
384		       NULL, 0, NULL, 0,
385		       CTL_MACHDEP, CTL_EOL);
386
387	sysctl_createv(clog, 0, NULL, NULL,
388		       CTLFLAG_PERMANENT,
389		       CTLTYPE_STRING, "booted_kernel", NULL,
390		       sysctl_machdep_boot, 0, NULL, 0,
391		       CTL_MACHDEP, CPU_BOOTED_KERNEL, CTL_EOL);
392	sysctl_createv(clog, 0, NULL, NULL,
393		       CTLFLAG_PERMANENT,
394		       CTLTYPE_STRING, "boot_args", NULL,
395		       sysctl_machdep_boot, 0, NULL, 0,
396		       CTL_MACHDEP, CPU_BOOT_ARGS, CTL_EOL);
397	sysctl_createv(clog, 0, NULL, NULL,
398		       CTLFLAG_PERMANENT,
399		       CTLTYPE_STRING, "booted_device", NULL,
400		       sysctl_machdep_boot, 0, NULL, 0,
401		       CTL_MACHDEP, CPU_BOOTED_DEVICE, CTL_EOL);
402	sysctl_createv(clog, 0, NULL, NULL,
403		       CTLFLAG_PERMANENT|CTLFLAG_IMMEDIATE,
404		       CTLTYPE_INT, "cpu_arch", NULL,
405		       NULL, 9, NULL, 0,
406		       CTL_MACHDEP, CPU_ARCH, CTL_EOL);
407	sysctl_createv(clog, 0, NULL, NULL,
408	               CTLFLAG_PERMANENT|CTLFLAG_IMMEDIATE,
409	               CTLTYPE_INT, "vis",
410	               SYSCTL_DESCR("supported version of VIS instruction set"),
411	               NULL, get_vis(), NULL, 0,
412	               CTL_MACHDEP, CPU_VIS, CTL_EOL);
413}
414
415void *
416getframe(struct lwp *l, int sig, int *onstack)
417{
418	struct proc *p = l->l_proc;
419	struct trapframe64 *tf = l->l_md.md_tf;
420
421	/*
422	 * Compute new user stack addresses, subtract off
423	 * one signal frame, and align.
424	 */
425	*onstack = (l->l_sigstk.ss_flags & (SS_DISABLE | SS_ONSTACK)) == 0
426	    && (SIGACTION(p, sig).sa_flags & SA_ONSTACK) != 0;
427
428	if (*onstack)
429		return ((char *)l->l_sigstk.ss_sp + l->l_sigstk.ss_size);
430	else
431		return (void *)((uintptr_t)tf->tf_out[6] + STACK_OFFSET);
432}
433
434struct sigframe_siginfo {
435	siginfo_t	sf_si;		/* saved siginfo */
436	ucontext_t	sf_uc;		/* saved ucontext */
437};
438
439void
440sendsig_siginfo(const ksiginfo_t *ksi, const sigset_t *mask)
441{
442	struct lwp *l = curlwp;
443	struct proc *p = l->l_proc;
444	struct sigacts *ps = p->p_sigacts;
445	int onstack, error;
446	int sig = ksi->ksi_signo;
447	ucontext_t uc;
448	long ucsz;
449	struct sigframe_siginfo *fp = getframe(l, sig, &onstack);
450	sig_t catcher = SIGACTION(p, sig).sa_handler;
451	struct trapframe64 *tf = l->l_md.md_tf;
452	struct rwindow *newsp;
453	register_t sp;
454	/* Allocate an aligned sigframe */
455	fp = (void *)((u_long)(fp - 1) & ~0x0f);
456
457	memset(&uc, 0, sizeof(uc));
458	uc.uc_flags = _UC_SIGMASK |
459	    ((l->l_sigstk.ss_flags & SS_ONSTACK)
460		? _UC_SETSTACK : _UC_CLRSTACK);
461	uc.uc_sigmask = *mask;
462	uc.uc_link = l->l_ctxlink;
463
464	sendsig_reset(l, sig);
465	mutex_exit(p->p_lock);
466	cpu_getmcontext(l, &uc.uc_mcontext, &uc.uc_flags);
467	ucsz = (char *)&uc.__uc_pad - (char *)&uc;
468
469	/*
470	 * Now copy the stack contents out to user space.
471	 * We need to make sure that when we start the signal handler,
472	 * its %i6 (%fp), which is loaded from the newly allocated stack area,
473	 * joins seamlessly with the frame it was in when the signal occurred,
474	 * so that the debugger and _longjmp code can back up through it.
475	 * Since we're calling the handler directly, allocate a full size
476	 * C stack frame.
477	 */
478	newsp = (struct rwindow *)((u_long)fp - CCFSZ);
479	sp = (register_t)(uintptr_t)tf->tf_out[6];
480	error = (copyout(&ksi->ksi_info, &fp->sf_si,
481			sizeof(ksi->ksi_info)) != 0 ||
482	    copyout(&uc, &fp->sf_uc, ucsz) != 0 ||
483	    copyout(&sp, &newsp->rw_in[6], sizeof(sp)) != 0);
484	mutex_enter(p->p_lock);
485
486	if (error) {
487		/*
488		 * Process has trashed its stack; give it an illegal
489		 * instruction to halt it in its tracks.
490		 */
491		sigexit(l, SIGILL);
492		/* NOTREACHED */
493	}
494
495	tf->tf_pc = (const vaddr_t)catcher;
496	tf->tf_npc = (const vaddr_t)catcher + 4;
497	tf->tf_out[0] = sig;
498	tf->tf_out[1] = (vaddr_t)&fp->sf_si;
499	tf->tf_out[2] = (vaddr_t)&fp->sf_uc;
500	tf->tf_out[6] = (vaddr_t)newsp - STACK_OFFSET;
501	tf->tf_out[7] = (vaddr_t)ps->sa_sigdesc[sig].sd_tramp - 8;
502
503	/* Remember that we're now on the signal stack. */
504	if (onstack)
505		l->l_sigstk.ss_flags |= SS_ONSTACK;
506}
507
508struct pcb dumppcb;
509
510static void
511maybe_dump(int howto)
512{
513	int s;
514
515	/* Disable interrupts. */
516	s = splhigh();
517
518	/* Do a dump if requested. */
519	if ((howto & (RB_DUMP | RB_HALT)) == RB_DUMP)
520		dumpsys();
521
522	splx(s);
523}
524
525void
526cpu_reboot(int howto, char *user_boot_string)
527{
528	static bool syncdone = false;
529	int i;
530	static char str[128];
531	struct lwp *l;
532
533	l = (curlwp == NULL) ? &lwp0 : curlwp;
534
535	if (cold) {
536		howto |= RB_HALT;
537		goto haltsys;
538	}
539
540#if NFB > 0
541	fb_unblank();
542#endif
543	boothowto = howto;
544
545	/* If rebooting and a dump is requested, do it.
546	 *
547	 * XXX used to dump after vfs_shutdown() and before
548	 * detaching devices / shutdown hooks / pmf_system_shutdown().
549	 */
550	maybe_dump(howto);
551
552	/*
553	 * If we've panic'd, don't make the situation potentially
554	 * worse by syncing or unmounting the file systems.
555	 */
556	if ((howto & RB_NOSYNC) == 0 && panicstr == NULL) {
557		if (!syncdone) {
558			syncdone = true;
559			/* XXX used to force unmount as well, here */
560			vfs_sync_all(l);
561		}
562
563		while (vfs_unmountall1(l, false, false) ||
564		       config_detach_all(boothowto) ||
565		       vfs_unmount_forceone(l))
566			;	/* do nothing */
567	} else {
568		if (!db_active)
569			suspendsched();
570	}
571
572	pmf_system_shutdown(boothowto);
573
574	splhigh();
575
576haltsys:
577	doshutdownhooks();
578
579#ifdef MULTIPROCESSOR
580	/* Stop all secondary cpus */
581	mp_halt_cpus();
582#endif
583
584	/* If powerdown was requested, do it. */
585	if ((howto & RB_POWERDOWN) == RB_POWERDOWN) {
586#ifdef MULTIPROCESSOR
587		printf("cpu%d: powered down\n\n", cpu_number());
588#else
589		printf("powered down\n\n");
590#endif
591		/* Let the OBP do the work. */
592		OF_poweroff();
593		printf("WARNING: powerdown failed!\n");
594		/*
595		 * RB_POWERDOWN implies RB_HALT... fall into it...
596		 */
597	}
598
599	if (howto & RB_HALT) {
600#ifdef MULTIPROCESSOR
601		printf("cpu%d: halted\n\n", cpu_number());
602#else
603		printf("halted\n\n");
604#endif
605		OF_exit();
606		panic("PROM exit failed");
607	}
608
609#ifdef MULTIPROCESSOR
610	printf("cpu%d: rebooting\n\n", cpu_number());
611#else
612	printf("rebooting\n\n");
613#endif
614	if (user_boot_string && *user_boot_string) {
615		i = strlen(user_boot_string);
616		if (i > sizeof(str))
617			OF_boot(user_boot_string);	/* XXX */
618		memcpy(str, user_boot_string, i);
619	} else {
620		i = 1;
621		str[0] = '\0';
622	}
623
624	if (howto & RB_SINGLE)
625		str[i++] = 's';
626	if (howto & RB_KDB)
627		str[i++] = 'd';
628	if (i > 1) {
629		if (str[0] == '\0')
630			str[0] = '-';
631		str[i] = 0;
632	} else
633		str[0] = 0;
634	OF_boot(str);
635	panic("cpu_reboot -- failed");
636	/*NOTREACHED*/
637}
638
639uint32_t dumpmag = 0x8fca0101;	/* magic number for savecore */
640int	dumpsize = 0;		/* also for savecore */
641long	dumplo = 0;
642
643void
644cpu_dumpconf(void)
645{
646	int nblks, dumpblks;
647
648	if (dumpdev == NODEV)
649		/* No usable dump device */
650		return;
651	nblks = bdev_size(dumpdev);
652
653	dumpblks = ctod(physmem) + pmap_dumpsize();
654	if (dumpblks > (nblks - ctod(1)))
655		/*
656		 * dump size is too big for the partition.
657		 * Note, we safeguard a click at the front for a
658		 * possible disk label.
659		 */
660		return;
661
662	/* Put the dump at the end of the partition */
663	dumplo = nblks - dumpblks;
664
665	/*
666	 * savecore(8) expects dumpsize to be the number of pages
667	 * of actual core dumped (i.e. excluding the MMU stuff).
668	 */
669	dumpsize = physmem;
670}
671
672#define	BYTES_PER_DUMP	MAXPHYS		/* must be a multiple of pagesize */
673static vaddr_t dumpspace;
674
675void *
676reserve_dumppages(void *p)
677{
678
679	dumpspace = (vaddr_t)p;
680	return (char *)p + BYTES_PER_DUMP;
681}
682
683/*
684 * Write a crash dump.
685 */
686void
687dumpsys(void)
688{
689	const struct bdevsw *bdev;
690	int psize;
691	daddr_t blkno;
692	int (*dump)(dev_t, daddr_t, void *, size_t);
693	int j, error = 0;
694	uint64_t todo;
695	struct mem_region *mp;
696
697	/* copy registers to dumppcb and flush windows */
698	memset(&dumppcb, 0, sizeof(struct pcb));
699	snapshot(&dumppcb);
700	stackdump();
701
702	if (dumpdev == NODEV)
703		return;
704	bdev = bdevsw_lookup(dumpdev);
705	if (bdev == NULL || bdev->d_psize == NULL)
706		return;
707
708	/*
709	 * For dumps during autoconfiguration,
710	 * if dump device has already configured...
711	 */
712	if (dumpsize == 0)
713		cpu_dumpconf();
714	if (!dumpspace) {
715		printf("\nno address space available, dump not possible\n");
716		return;
717	}
718	if (dumplo <= 0) {
719		printf("\ndump to dev %" PRId32 ",%" PRId32 " not possible ("
720		    "partition too small?)\n", major(dumpdev), minor(dumpdev));
721		return;
722	}
723	printf("\ndumping to dev %" PRId32 ",%" PRId32 " offset %ld\n",
724	    major(dumpdev), minor(dumpdev), dumplo);
725
726	psize = bdev_size(dumpdev);
727	if (psize == -1) {
728		printf("dump area unavailable\n");
729		return;
730	}
731	blkno = dumplo;
732	dump = bdev->d_dump;
733
734	error = pmap_dumpmmu(dump, blkno);
735	blkno += pmap_dumpsize();
736
737	/* calculate total size of dump */
738	for (todo = 0, j = 0; j < phys_installed_size; j++)
739		todo += phys_installed[j].size;
740
741	for (mp = &phys_installed[0], j = 0; j < phys_installed_size;
742			j++, mp = &phys_installed[j]) {
743		uint64_t i = 0, n, off;
744		paddr_t maddr = mp->start;
745
746		for (; i < mp->size; i += n) {
747			n = mp->size - i;
748			if (n > BYTES_PER_DUMP)
749				 n = BYTES_PER_DUMP;
750
751			/* print out how many MBs we still have to dump */
752			if ((todo % (1024*1024)) == 0)
753				printf_flags(TOCONS|NOTSTAMP,
754				    "\r%6" PRIu64 " M ",
755				    todo / (1024*1024));
756			for (off = 0; off < n; off += PAGE_SIZE)
757				pmap_kenter_pa(dumpspace+off, maddr+off,
758				    VM_PROT_READ, 0);
759			error = (*dump)(dumpdev, blkno,
760					(void *)dumpspace, (size_t)n);
761			pmap_kremove(dumpspace, n);
762			if (error)
763				break;
764			maddr += n;
765			todo -= n;
766			blkno += btodb(n);
767		}
768	}
769
770	switch (error) {
771
772	case ENXIO:
773		printf("- device bad\n");
774		break;
775
776	case EFAULT:
777		printf("- device not ready\n");
778		break;
779
780	case EINVAL:
781		printf("- area improper\n");
782		break;
783
784	case EIO:
785		printf("- i/o error\n");
786		break;
787
788	case 0:
789		printf_flags(TOCONS|NOTSTAMP, "\r           ");
790		printf("\ndump succeeded\n");
791		break;
792
793	default:
794		printf("- error %d\n", error);
795		break;
796	}
797}
798
799void trapdump(struct trapframe64*);
800/*
801 * dump out a trapframe.
802 */
803void
804trapdump(struct trapframe64* tf)
805{
806	printf("TRAPFRAME: tstate=%llx pc=%llx npc=%llx y=%x\n",
807	       (unsigned long long)tf->tf_tstate, (unsigned long long)tf->tf_pc,
808	       (unsigned long long)tf->tf_npc, (unsigned)tf->tf_y);
809	printf("%%g1-7: %llx %llx %llx %llx %llx %llx %llx\n",
810	       (unsigned long long)tf->tf_global[1],
811	       (unsigned long long)tf->tf_global[2],
812	       (unsigned long long)tf->tf_global[3],
813	       (unsigned long long)tf->tf_global[4],
814	       (unsigned long long)tf->tf_global[5],
815	       (unsigned long long)tf->tf_global[6],
816	       (unsigned long long)tf->tf_global[7]);
817	printf("%%o0-7: %llx %llx %llx %llx\n %llx %llx %llx %llx\n",
818	       (unsigned long long)tf->tf_out[0],
819	       (unsigned long long)tf->tf_out[1],
820	       (unsigned long long)tf->tf_out[2],
821	       (unsigned long long)tf->tf_out[3],
822	       (unsigned long long)tf->tf_out[4],
823	       (unsigned long long)tf->tf_out[5],
824	       (unsigned long long)tf->tf_out[6],
825	       (unsigned long long)tf->tf_out[7]);
826}
827
828static void
829get_symbol_and_offset(const char **mod, const char **sym, vaddr_t *offset, vaddr_t pc)
830{
831	static char symbuf[256];
832	unsigned long symaddr;
833	int s, error;
834
835#if NKSYMS || defined(DDB) || defined(MODULAR)
836	s = pserialize_read_enter();
837	if (ksyms_getname(mod, sym, pc,
838			  KSYMS_CLOSEST|KSYMS_PROC|KSYMS_ANY) == 0) {
839		error = ksyms_getval(*mod, *sym, &symaddr,
840		    KSYMS_CLOSEST|KSYMS_PROC|KSYMS_ANY);
841		pserialize_read_exit(s);
842		if (error)
843			goto failed;
844
845		*offset = (vaddr_t)(pc - symaddr);
846		return;
847	}
848	pserialize_read_exit(s);
849#endif
850 failed:
851	snprintf(symbuf, sizeof symbuf, "%llx", (unsigned long long)pc);
852	*mod = "netbsd";
853	*sym = symbuf;
854	*offset = 0;
855}
856
857/*
858 * get the fp and dump the stack as best we can.  don't leave the
859 * current stack page
860 */
861void
862stackdump(void)
863{
864	struct frame32 *fp = (struct frame32 *)getfp(), *sfp;
865	struct frame64 *fp64;
866	const char *mod, *sym;
867	vaddr_t offset;
868
869	sfp = fp;
870	printf("Frame pointer is at %p\n", fp);
871	printf("Call traceback:\n");
872	while (fp && ((u_long)fp >> PGSHIFT) == ((u_long)sfp >> PGSHIFT)) {
873		if( ((long)fp) & 1 ) {
874			fp64 = (struct frame64*)(((char*)fp)+BIAS);
875			/* 64-bit frame */
876			get_symbol_and_offset(&mod, &sym, &offset, fp64->fr_pc);
877			printf(" %s:%s+%#llx(%llx, %llx, %llx, %llx, %llx, %llx) fp = %llx\n",
878			       mod, sym,
879			       (unsigned long long)offset,
880			       (unsigned long long)fp64->fr_arg[0],
881			       (unsigned long long)fp64->fr_arg[1],
882			       (unsigned long long)fp64->fr_arg[2],
883			       (unsigned long long)fp64->fr_arg[3],
884			       (unsigned long long)fp64->fr_arg[4],
885			       (unsigned long long)fp64->fr_arg[5],
886			       (unsigned long long)fp64->fr_fp);
887			fp = (struct frame32 *)(u_long)fp64->fr_fp;
888		} else {
889			/* 32-bit frame */
890			get_symbol_and_offset(&mod, &sym, &offset, fp->fr_pc);
891			printf(" %s:%s+%#lx(%x, %x, %x, %x, %x, %x) fp = %x\n",
892			       mod, sym,
893			       (unsigned long)offset,
894			       fp->fr_arg[0],
895			       fp->fr_arg[1],
896			       fp->fr_arg[2],
897			       fp->fr_arg[3],
898			       fp->fr_arg[4],
899			       fp->fr_arg[5],
900			       fp->fr_fp);
901			fp = (struct frame32*)(u_long)fp->fr_fp;
902		}
903	}
904}
905
906
907int
908cpu_exec_aout_makecmds(struct lwp *l, struct exec_package *epp)
909{
910	return (ENOEXEC);
911}
912
913static size_t
914_bus_dmamap_mapsize(int const nsegments)
915{
916	KASSERT(nsegments > 0);
917	return sizeof(struct sparc_bus_dmamap) +
918	    (sizeof(bus_dma_segment_t) * (nsegments - 1));
919}
920
921/*
922 * Common function for DMA map creation.  May be called by bus-specific
923 * DMA map creation functions.
924 */
925int
926_bus_dmamap_create(bus_dma_tag_t t, bus_size_t size, int nsegments,
927	bus_size_t maxsegsz, bus_size_t boundary, int flags,
928	bus_dmamap_t *dmamp)
929{
930	struct sparc_bus_dmamap *map;
931	void *mapstore;
932
933	/*
934	 * Allocate and initialize the DMA map.  The end of the map
935	 * is a variable-sized array of segments, so we allocate enough
936	 * room for them in one shot.
937	 *
938	 * Note we don't preserve the WAITOK or NOWAIT flags.  Preservation
939	 * of ALLOCNOW notifies others that we've reserved these resources,
940	 * and they are not to be freed.
941	 *
942	 * The bus_dmamap_t includes one bus_dma_segment_t, hence
943	 * the (nsegments - 1).
944	 */
945	if ((mapstore = kmem_zalloc(_bus_dmamap_mapsize(nsegments),
946	    (flags & BUS_DMA_NOWAIT) ? KM_NOSLEEP : KM_SLEEP)) == NULL)
947		return (ENOMEM);
948
949	map = (struct sparc_bus_dmamap *)mapstore;
950	map->_dm_size = size;
951	map->_dm_segcnt = nsegments;
952	map->_dm_maxmaxsegsz = maxsegsz;
953	map->_dm_boundary = boundary;
954	map->_dm_flags = flags & ~(BUS_DMA_WAITOK|BUS_DMA_NOWAIT|BUS_DMA_COHERENT|
955				   BUS_DMA_NOWRITE|BUS_DMA_NOCACHE);
956	map->dm_maxsegsz = maxsegsz;
957	map->dm_mapsize = 0;		/* no valid mappings */
958	map->dm_nsegs = 0;
959
960	*dmamp = map;
961	return (0);
962}
963
964/*
965 * Common function for DMA map destruction.  May be called by bus-specific
966 * DMA map destruction functions.
967 */
968void
969_bus_dmamap_destroy(bus_dma_tag_t t, bus_dmamap_t map)
970{
971	if (map->dm_nsegs)
972		bus_dmamap_unload(t, map);
973	kmem_free(map, _bus_dmamap_mapsize(map->_dm_segcnt));
974}
975
976/*
977 * Common function for loading a DMA map with a linear buffer.  May
978 * be called by bus-specific DMA map load functions.
979 *
980 * Most SPARCs have IOMMUs in the bus controllers.  In those cases
981 * they only need one segment and will use virtual addresses for DVMA.
982 * Those bus controllers should intercept these vectors and should
983 * *NEVER* call _bus_dmamap_load() which is used only by devices that
984 * bypass DVMA.
985 */
986int
987_bus_dmamap_load(bus_dma_tag_t t, bus_dmamap_t map, void *sbuf,
988	bus_size_t buflen, struct proc *p, int flags)
989{
990	bus_size_t sgsize;
991	vaddr_t vaddr = (vaddr_t)sbuf;
992	long incr;
993	int i;
994
995	/*
996	 * Make sure that on error condition we return "no valid mappings".
997	 */
998	map->dm_nsegs = 0;
999	KASSERT(map->dm_maxsegsz <= map->_dm_maxmaxsegsz);
1000
1001	if (buflen > map->_dm_size)
1002	{
1003#ifdef DEBUG
1004		printf("_bus_dmamap_load(): error %lu > %lu -- map size exceeded!\n",
1005		    (unsigned long)buflen, (unsigned long)map->_dm_size);
1006#ifdef DDB
1007		Debugger();
1008#endif
1009#endif
1010		return (EINVAL);
1011	}
1012
1013	sgsize = round_page(buflen + ((int)vaddr & PGOFSET));
1014
1015	/*
1016	 * We always use just one segment.
1017	 */
1018	i = 0;
1019	map->dm_segs[i].ds_addr = 0UL;
1020	map->dm_segs[i].ds_len = 0;
1021
1022	incr = PAGE_SIZE - (vaddr & PGOFSET);
1023	while (sgsize > 0) {
1024		paddr_t pa;
1025
1026		incr = uimin(sgsize, incr);
1027
1028		(void) pmap_extract(pmap_kernel(), vaddr, &pa);
1029		if (map->dm_segs[i].ds_len == 0)
1030			map->dm_segs[i].ds_addr = pa;
1031		if (pa == (map->dm_segs[i].ds_addr + map->dm_segs[i].ds_len)
1032		    && ((map->dm_segs[i].ds_len + incr) <= map->dm_maxsegsz)) {
1033			/* Hey, waddyaknow, they're contiguous */
1034			map->dm_segs[i].ds_len += incr;
1035		} else {
1036			if (++i >= map->_dm_segcnt)
1037				return (EFBIG);
1038			map->dm_segs[i].ds_addr = pa;
1039			map->dm_segs[i].ds_len = incr;
1040		}
1041		sgsize -= incr;
1042		vaddr += incr;
1043		incr = PAGE_SIZE;
1044	}
1045	map->dm_nsegs = i + 1;
1046	map->dm_mapsize = buflen;
1047	/* Mapping is bus dependent */
1048	return (0);
1049}
1050
1051/*
1052 * Like _bus_dmamap_load(), but for mbufs.
1053 */
1054int
1055_bus_dmamap_load_mbuf(bus_dma_tag_t t, bus_dmamap_t map, struct mbuf *m,
1056	int flags)
1057{
1058	bus_dma_segment_t segs[MAX_DMA_SEGS];
1059	int i;
1060	size_t len;
1061
1062	/*
1063	 * Make sure that on error condition we return "no valid mappings".
1064	 */
1065	map->dm_nsegs = 0;
1066	KASSERT(map->dm_maxsegsz <= map->_dm_maxmaxsegsz);
1067
1068	if (m->m_pkthdr.len > map->_dm_size)
1069		return EINVAL;
1070
1071	/* Record mbuf for *_unload */
1072	map->_dm_type = _DM_TYPE_MBUF;
1073	map->_dm_source = (void *)m;
1074
1075	i = 0;
1076	len = 0;
1077	while (m) {
1078		vaddr_t vaddr = mtod(m, vaddr_t);
1079		long buflen = (long)m->m_len;
1080
1081		len += buflen;
1082		while (buflen > 0 && i < MAX_DMA_SEGS) {
1083			paddr_t pa;
1084			long incr;
1085
1086			incr = PAGE_SIZE - (vaddr & PGOFSET);
1087			incr = uimin(buflen, incr);
1088
1089			if (pmap_extract(pmap_kernel(), vaddr, &pa) == FALSE) {
1090#ifdef DIAGNOSTIC
1091				printf("_bus_dmamap_load_mbuf: pmap_extract failed %lx\n",
1092				       vaddr);
1093#endif
1094				map->_dm_type = 0;
1095				map->_dm_source = NULL;
1096				return EINVAL;
1097			}
1098
1099			buflen -= incr;
1100			vaddr += incr;
1101
1102			if (i > 0 &&
1103				pa == (segs[i-1].ds_addr + segs[i-1].ds_len) &&
1104				((segs[i-1].ds_len + incr) <=
1105					map->dm_maxsegsz)) {
1106				/* Hey, waddyaknow, they're contiguous */
1107				segs[i-1].ds_len += incr;
1108				continue;
1109			}
1110			segs[i].ds_addr = pa;
1111			segs[i].ds_len = incr;
1112			segs[i]._ds_boundary = 0;
1113			segs[i]._ds_align = 0;
1114			segs[i]._ds_mlist = NULL;
1115			i++;
1116		}
1117		m = m->m_next;
1118		if (m && i >= MAX_DMA_SEGS) {
1119			/* Exceeded the size of our dmamap */
1120			map->_dm_type = 0;
1121			map->_dm_source = NULL;
1122			return EFBIG;
1123		}
1124	}
1125
1126#ifdef DEBUG
1127	{
1128		size_t mbuflen, sglen;
1129		int j;
1130		int retval;
1131
1132		mbuflen = 0;
1133		for (m = (struct mbuf *)map->_dm_source; m; m = m->m_next)
1134			mbuflen += (long)m->m_len;
1135		sglen = 0;
1136		for (j = 0; j < i; j++)
1137			sglen += segs[j].ds_len;
1138		if (sglen != mbuflen)
1139			panic("load_mbuf: sglen %ld != mbuflen %lx\n",
1140				sglen, mbuflen);
1141		if (sglen != len)
1142			panic("load_mbuf: sglen %ld != len %lx\n",
1143				sglen, len);
1144		retval = bus_dmamap_load_raw(t, map, segs, i,
1145			(bus_size_t)len, flags);
1146		if (retval == 0) {
1147			if (map->dm_mapsize != len)
1148				panic("load_mbuf: mapsize %ld != len %lx\n",
1149					(long)map->dm_mapsize, len);
1150			sglen = 0;
1151			for (j = 0; j < map->dm_nsegs; j++)
1152				sglen += map->dm_segs[j].ds_len;
1153			if (sglen != len)
1154				panic("load_mbuf: dmamap sglen %ld != len %lx\n",
1155					sglen, len);
1156		}
1157		return (retval);
1158	}
1159#endif
1160	return (bus_dmamap_load_raw(t, map, segs, i, (bus_size_t)len, flags));
1161}
1162
1163/*
1164 * Like _bus_dmamap_load(), but for uios.
1165 */
1166int
1167_bus_dmamap_load_uio(bus_dma_tag_t t, bus_dmamap_t map, struct uio *uio,
1168	int flags)
1169{
1170/*
1171 * XXXXXXX The problem with this routine is that it needs to
1172 * lock the user address space that is being loaded, but there
1173 * is no real way for us to unlock it during the unload process.
1174 */
1175#if 0
1176	bus_dma_segment_t segs[MAX_DMA_SEGS];
1177	int i, j;
1178	size_t len;
1179	struct proc *p = uio->uio_lwp->l_proc;
1180	struct pmap *pm;
1181
1182	/*
1183	 * Make sure that on error condition we return "no valid mappings".
1184	 */
1185	map->dm_nsegs = 0;
1186	KASSERT(map->dm_maxsegsz <= map->_dm_maxmaxsegsz);
1187
1188	if (uio->uio_segflg == UIO_USERSPACE) {
1189		pm = p->p_vmspace->vm_map.pmap;
1190	} else
1191		pm = pmap_kernel();
1192
1193	i = 0;
1194	len = 0;
1195	for (j = 0; j < uio->uio_iovcnt; j++) {
1196		struct iovec *iov = &uio->uio_iov[j];
1197		vaddr_t vaddr = (vaddr_t)iov->iov_base;
1198		bus_size_t buflen = iov->iov_len;
1199
1200		/*
1201		 * Lock the part of the user address space involved
1202		 *    in the transfer.
1203		 */
1204		if (__predict_false(uvm_vslock(p->p_vmspace, vaddr, buflen,
1205			    (uio->uio_rw == UIO_WRITE) ?
1206			    VM_PROT_WRITE : VM_PROT_READ) != 0)) {
1207				goto after_vsunlock;
1208			}
1209
1210		len += buflen;
1211		while (buflen > 0 && i < MAX_DMA_SEGS) {
1212			paddr_t pa;
1213			long incr;
1214
1215			incr = uimin(buflen, PAGE_SIZE);
1216			(void) pmap_extract(pm, vaddr, &pa);
1217			buflen -= incr;
1218			vaddr += incr;
1219			if (segs[i].ds_len == 0)
1220				segs[i].ds_addr = pa;
1221
1222
1223			if (i > 0 && pa == (segs[i-1].ds_addr + segs[i-1].ds_len)
1224			    && ((segs[i-1].ds_len + incr) <= map->dm_maxsegsz)) {
1225				/* Hey, waddyaknow, they're contiguous */
1226				segs[i-1].ds_len += incr;
1227				continue;
1228			}
1229			segs[i].ds_addr = pa;
1230			segs[i].ds_len = incr;
1231			segs[i]._ds_boundary = 0;
1232			segs[i]._ds_align = 0;
1233			segs[i]._ds_mlist = NULL;
1234			i++;
1235		}
1236		uvm_vsunlock(p->p_vmspace, bp->b_data, todo);
1237 		if (buflen > 0 && i >= MAX_DMA_SEGS)
1238			/* Exceeded the size of our dmamap */
1239			return EFBIG;
1240	}
1241	map->_dm_type = DM_TYPE_UIO;
1242	map->_dm_source = (void *)uio;
1243	return (bus_dmamap_load_raw(t, map, segs, i,
1244				    (bus_size_t)len, flags));
1245#endif
1246	return 0;
1247}
1248
1249/*
1250 * Like _bus_dmamap_load(), but for raw memory allocated with
1251 * bus_dmamem_alloc().
1252 */
1253int
1254_bus_dmamap_load_raw(bus_dma_tag_t t, bus_dmamap_t map, bus_dma_segment_t *segs,
1255	int nsegs, bus_size_t size, int flags)
1256{
1257
1258	panic("_bus_dmamap_load_raw: not implemented");
1259}
1260
1261/*
1262 * Common function for unloading a DMA map.  May be called by
1263 * bus-specific DMA map unload functions.
1264 */
1265void
1266_bus_dmamap_unload(bus_dma_tag_t t, bus_dmamap_t map)
1267{
1268	int i;
1269	struct vm_page *pg;
1270	struct pglist *pglist;
1271	paddr_t pa;
1272
1273	for (i = 0; i < map->dm_nsegs; i++) {
1274		if ((pglist = map->dm_segs[i]._ds_mlist) == NULL) {
1275
1276			/*
1277			 * We were asked to load random VAs and lost the
1278			 * PA info so just blow the entire cache away.
1279			 */
1280			blast_dcache();
1281			break;
1282		}
1283		TAILQ_FOREACH(pg, pglist, pageq.queue) {
1284			pa = VM_PAGE_TO_PHYS(pg);
1285
1286			/*
1287			 * We should be flushing a subrange, but we
1288			 * don't know where the segments starts.
1289			 */
1290			dcache_flush_page_all(pa);
1291		}
1292	}
1293
1294	/* Mark the mappings as invalid. */
1295	map->dm_maxsegsz = map->_dm_maxmaxsegsz;
1296	map->dm_mapsize = 0;
1297	map->dm_nsegs = 0;
1298
1299}
1300
1301/*
1302 * Common function for DMA map synchronization.  May be called
1303 * by bus-specific DMA map synchronization functions.
1304 */
1305void
1306_bus_dmamap_sync(bus_dma_tag_t t, bus_dmamap_t map, bus_addr_t offset,
1307	bus_size_t len, int ops)
1308{
1309	int i;
1310	struct vm_page *pg;
1311	struct pglist *pglist;
1312
1313	/*
1314	 * We sync out our caches, but the bus must do the same.
1315	 *
1316	 * Actually a #Sync is expensive.  We should optimize.
1317	 */
1318	if ((ops & BUS_DMASYNC_PREREAD) || (ops & BUS_DMASYNC_PREWRITE)) {
1319
1320		/*
1321		 * Don't really need to do anything, but flush any pending
1322		 * writes anyway.
1323		 */
1324		membar_Sync();
1325	}
1326	if (ops & BUS_DMASYNC_POSTREAD) {
1327		/* Invalidate the vcache */
1328		for (i = 0; i < map->dm_nsegs; i++) {
1329			if ((pglist = map->dm_segs[i]._ds_mlist) == NULL)
1330				/* Should not really happen. */
1331				continue;
1332			TAILQ_FOREACH(pg, pglist, pageq.queue) {
1333				paddr_t start;
1334				psize_t size = PAGE_SIZE;
1335
1336				if (offset < PAGE_SIZE) {
1337					start = VM_PAGE_TO_PHYS(pg) + offset;
1338					size -= offset;
1339					if (size > len)
1340						size = len;
1341					cache_flush_phys(start, size, 0);
1342					len -= size;
1343					if (len == 0)
1344						goto done;
1345					offset = 0;
1346					continue;
1347				}
1348				offset -= size;
1349			}
1350		}
1351	}
1352 done:
1353	if (ops & BUS_DMASYNC_POSTWRITE) {
1354		/* Nothing to do.  Handled by the bus controller. */
1355	}
1356}
1357
1358extern paddr_t   vm_first_phys, vm_num_phys;
1359/*
1360 * Common function for DMA-safe memory allocation.  May be called
1361 * by bus-specific DMA memory allocation functions.
1362 */
1363int
1364_bus_dmamem_alloc(bus_dma_tag_t t, bus_size_t size, bus_size_t alignment,
1365	bus_size_t boundary, bus_dma_segment_t *segs, int nsegs, int *rsegs,
1366	int flags)
1367{
1368	vaddr_t low, high;
1369	struct pglist *pglist;
1370	int error;
1371
1372	/* Always round the size. */
1373	size = round_page(size);
1374	low = vm_first_phys;
1375	high = vm_first_phys + vm_num_phys - PAGE_SIZE;
1376
1377	if ((pglist = kmem_alloc(sizeof(*pglist),
1378	    (flags & BUS_DMA_NOWAIT) ? KM_NOSLEEP : KM_SLEEP)) == NULL)
1379		return (ENOMEM);
1380
1381	/*
1382	 * If the bus uses DVMA then ignore boundary and alignment.
1383	 */
1384	segs[0]._ds_boundary = boundary;
1385	segs[0]._ds_align = alignment;
1386	if (flags & BUS_DMA_DVMA) {
1387		boundary = 0;
1388		alignment = 0;
1389	}
1390
1391	/*
1392	 * Allocate pages from the VM system.
1393	 */
1394	error = uvm_pglistalloc(size, low, high,
1395	    alignment, boundary, pglist, nsegs, (flags & BUS_DMA_NOWAIT) == 0);
1396	if (error) {
1397		kmem_free(pglist, sizeof(*pglist));
1398		return (error);
1399	}
1400
1401	/*
1402	 * Compute the location, size, and number of segments actually
1403	 * returned by the VM code.
1404	 */
1405	segs[0].ds_addr = 0UL; /* UPA does not map things */
1406	segs[0].ds_len = size;
1407	*rsegs = 1;
1408
1409	/*
1410	 * Simply keep a pointer around to the linked list, so
1411	 * bus_dmamap_free() can return it.
1412	 *
1413	 * NOBODY SHOULD TOUCH THE pageq.queue FIELDS WHILE THESE PAGES
1414	 * ARE IN OUR CUSTODY.
1415	 */
1416	segs[0]._ds_mlist = pglist;
1417
1418	/* The bus driver should do the actual mapping */
1419	return (0);
1420}
1421
1422/*
1423 * Common function for freeing DMA-safe memory.  May be called by
1424 * bus-specific DMA memory free functions.
1425 */
1426void
1427_bus_dmamem_free(bus_dma_tag_t t, bus_dma_segment_t *segs, int nsegs)
1428{
1429	struct pglist *pglist = segs[0]._ds_mlist;
1430
1431	if (nsegs != 1)
1432		panic("bus_dmamem_free: nsegs = %d", nsegs);
1433
1434	/*
1435	 * Return the list of pages back to the VM system.
1436	 */
1437	uvm_pglistfree(pglist);
1438	kmem_free(pglist, sizeof(*pglist));
1439}
1440
1441/*
1442 * Common function for mapping DMA-safe memory.  May be called by
1443 * bus-specific DMA memory map functions.
1444 */
1445int
1446_bus_dmamem_map(bus_dma_tag_t t, bus_dma_segment_t *segs, int nsegs,
1447	size_t size, void **kvap, int flags)
1448{
1449	vaddr_t va, sva;
1450	int r;
1451	size_t oversize;
1452	u_long align;
1453
1454	if (nsegs != 1)
1455		panic("_bus_dmamem_map: nsegs = %d", nsegs);
1456
1457	align = PAGE_SIZE;
1458
1459	size = round_page(size);
1460
1461	/*
1462	 * Find a region of kernel virtual addresses that can accommodate
1463	 * our alignment requirements.
1464	 */
1465	oversize = size + align - PAGE_SIZE;
1466	r = uvm_map(kernel_map, &sva, oversize, NULL, UVM_UNKNOWN_OFFSET, 0,
1467	    UVM_MAPFLAG(UVM_PROT_NONE, UVM_PROT_NONE, UVM_INH_NONE,
1468	    UVM_ADV_NORMAL, 0));
1469	if (r != 0)
1470		return (ENOMEM);
1471
1472	/* Compute start of aligned region */
1473	va = sva;
1474	va += ((segs[0].ds_addr & (align - 1)) + align - va) & (align - 1);
1475
1476	/* Return excess virtual addresses */
1477	if (va != sva)
1478		uvm_unmap(kernel_map, sva, va);
1479	if (va + size != sva + oversize)
1480		uvm_unmap(kernel_map, va + size, sva + oversize);
1481
1482	*kvap = (void *)va;
1483	return (0);
1484}
1485
1486/*
1487 * Common function for unmapping DMA-safe memory.  May be called by
1488 * bus-specific DMA memory unmapping functions.
1489 */
1490void
1491_bus_dmamem_unmap(bus_dma_tag_t t, void *kva, size_t size)
1492{
1493
1494#ifdef DIAGNOSTIC
1495	if ((u_long)kva & PGOFSET)
1496		panic("_bus_dmamem_unmap");
1497#endif
1498
1499	size = round_page(size);
1500	uvm_unmap(kernel_map, (vaddr_t)kva, (vaddr_t)kva + size);
1501}
1502
1503/*
1504 * Common function for mmap(2)'ing DMA-safe memory.  May be called by
1505 * bus-specific DMA mmap(2)'ing functions.
1506 */
1507paddr_t
1508_bus_dmamem_mmap(bus_dma_tag_t t, bus_dma_segment_t *segs, int nsegs, off_t off,
1509	int prot, int flags)
1510{
1511	int i;
1512
1513	for (i = 0; i < nsegs; i++) {
1514#ifdef DIAGNOSTIC
1515		if (off & PGOFSET)
1516			panic("_bus_dmamem_mmap: offset unaligned");
1517		if (segs[i].ds_addr & PGOFSET)
1518			panic("_bus_dmamem_mmap: segment unaligned");
1519		if (segs[i].ds_len & PGOFSET)
1520			panic("_bus_dmamem_mmap: segment size not multiple"
1521			    " of page size");
1522#endif
1523		if (off >= segs[i].ds_len) {
1524			off -= segs[i].ds_len;
1525			continue;
1526		}
1527
1528		return (atop(segs[i].ds_addr + off));
1529	}
1530
1531	/* Page not found. */
1532	return (-1);
1533}
1534
1535
1536struct sparc_bus_dma_tag mainbus_dma_tag = {
1537	NULL,
1538	NULL,
1539	_bus_dmamap_create,
1540	_bus_dmamap_destroy,
1541	_bus_dmamap_load,
1542	_bus_dmamap_load_mbuf,
1543	_bus_dmamap_load_uio,
1544	_bus_dmamap_load_raw,
1545	_bus_dmamap_unload,
1546	_bus_dmamap_sync,
1547
1548	_bus_dmamem_alloc,
1549	_bus_dmamem_free,
1550	_bus_dmamem_map,
1551	_bus_dmamem_unmap,
1552	_bus_dmamem_mmap
1553};
1554
1555
1556/*
1557 * Base bus space handlers.
1558 */
1559static int	sparc_bus_map(bus_space_tag_t, bus_addr_t, bus_size_t, int,
1560	vaddr_t, bus_space_handle_t *);
1561static int	sparc_bus_unmap(bus_space_tag_t, bus_space_handle_t, bus_size_t);
1562static int	sparc_bus_subregion(bus_space_tag_t, bus_space_handle_t, bus_size_t,
1563	bus_size_t, bus_space_handle_t *);
1564static paddr_t	sparc_bus_mmap(bus_space_tag_t, bus_addr_t, off_t, int, int);
1565static void	*sparc_mainbus_intr_establish(bus_space_tag_t, int, int,
1566	int (*)(void *), void *, void (*)(void));
1567static int	sparc_bus_alloc(bus_space_tag_t, bus_addr_t, bus_addr_t, bus_size_t,
1568	bus_size_t, bus_size_t, int, bus_addr_t *, bus_space_handle_t *);
1569static void	sparc_bus_free(bus_space_tag_t, bus_space_handle_t, bus_size_t);
1570
1571struct extent *io_space = NULL;
1572
1573int
1574bus_space_alloc(bus_space_tag_t t, bus_addr_t rs, bus_addr_t re, bus_size_t s,
1575	bus_size_t a, bus_size_t b, int f, bus_addr_t *ap,
1576	bus_space_handle_t *hp)
1577{
1578	_BS_CALL(t, sparc_bus_alloc)(t, rs, re, s, a, b, f, ap, hp);
1579}
1580
1581void
1582bus_space_free(bus_space_tag_t t, bus_space_handle_t h, bus_size_t s)
1583{
1584	_BS_CALL(t, sparc_bus_free)(t, h, s);
1585}
1586
1587int
1588bus_space_map(bus_space_tag_t t, bus_addr_t a, bus_size_t s, int f,
1589	bus_space_handle_t *hp)
1590{
1591	_BS_CALL(t, sparc_bus_map)(t, a, s, f, 0, hp);
1592}
1593
1594void
1595bus_space_unmap(bus_space_tag_t t, bus_space_handle_t h, bus_size_t s)
1596{
1597	_BS_VOID_CALL(t, sparc_bus_unmap)(t, h, s);
1598}
1599
1600int
1601bus_space_subregion(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o,
1602	bus_size_t s, bus_space_handle_t *hp)
1603{
1604	_BS_CALL(t, sparc_bus_subregion)(t, h, o, s, hp);
1605}
1606
1607paddr_t
1608bus_space_mmap(bus_space_tag_t t, bus_addr_t a, off_t o, int p, int f)
1609{
1610	_BS_CALL(t, sparc_bus_mmap)(t, a, o, p, f);
1611}
1612
1613/*
1614 *	void bus_space_read_multi_N(bus_space_tag_t tag,
1615 *	    bus_space_handle_t bsh, bus_size_t offset,
1616 *	    uintN_t *addr, bus_size_t count);
1617 *
1618 * Read `count' 1, 2, 4, or 8 byte quantities from bus space
1619 * described by tag/handle/offset and copy into buffer provided.
1620 */
1621void
1622bus_space_read_multi_1(bus_space_tag_t t, bus_space_handle_t h,
1623	bus_size_t o, uint8_t * a, bus_size_t c)
1624{
1625	while (c-- > 0)
1626		*a++ = bus_space_read_1(t, h, o);
1627}
1628
1629void
1630bus_space_read_multi_2(bus_space_tag_t t, bus_space_handle_t h,
1631	bus_size_t o, uint16_t * a, bus_size_t c)
1632{
1633	while (c-- > 0)
1634		*a++ = bus_space_read_2(t, h, o);
1635}
1636
1637void
1638bus_space_read_multi_4(bus_space_tag_t t, bus_space_handle_t h,
1639	bus_size_t o, uint32_t * a, bus_size_t c)
1640{
1641	while (c-- > 0)
1642		*a++ = bus_space_read_4(t, h, o);
1643}
1644
1645void
1646bus_space_read_multi_8(bus_space_tag_t t, bus_space_handle_t h,
1647	bus_size_t o, uint64_t * a, bus_size_t c)
1648{
1649	while (c-- > 0)
1650		*a++ = bus_space_read_8(t, h, o);
1651}
1652
1653/*
1654 *	void bus_space_write_multi_N(bus_space_tag_t tag,
1655 *	    bus_space_handle_t bsh, bus_size_t offset,
1656 *	    const uintN_t *addr, bus_size_t count);
1657 *
1658 * Write `count' 1, 2, 4, or 8 byte quantities from the buffer
1659 * provided to bus space described by tag/handle/offset.
1660 */
1661void
1662bus_space_write_multi_1(bus_space_tag_t t,
1663	bus_space_handle_t h, bus_size_t o,
1664	const uint8_t *a, bus_size_t c)
1665{
1666	while (c-- > 0)
1667		bus_space_write_1(t, h, o, *a++);
1668}
1669
1670void
1671bus_space_write_multi_2(bus_space_tag_t t,
1672	bus_space_handle_t h, bus_size_t o,
1673	const uint16_t *a, bus_size_t c)
1674{
1675	while (c-- > 0)
1676		bus_space_write_2(t, h, o, *a++);
1677}
1678
1679void
1680bus_space_write_multi_4(bus_space_tag_t t,
1681	bus_space_handle_t h, bus_size_t o,
1682	const uint32_t *a, bus_size_t c)
1683{
1684	while (c-- > 0)
1685		bus_space_write_4(t, h, o, *a++);
1686}
1687
1688void
1689bus_space_write_multi_8(bus_space_tag_t t,
1690	bus_space_handle_t h, bus_size_t o,
1691	const uint64_t *a, bus_size_t c)
1692{
1693	while (c-- > 0)
1694		bus_space_write_8(t, h, o, *a++);
1695}
1696
1697/*
1698 *	void bus_space_set_multi_stream_N(bus_space_tag_t tag,
1699 *	    bus_space_handle_t bsh, bus_size_t offset, uintN_t val,
1700 *	    bus_size_t count);
1701 *
1702 * Write the 1, 2, 4, or 8 byte value `val' to bus space described
1703 * by tag/handle/offset `count' times.
1704 */
1705void
1706bus_space_set_multi_stream_1(bus_space_tag_t t,
1707	bus_space_handle_t h, bus_size_t o, uint8_t v,
1708	bus_size_t c)
1709{
1710	while (c-- > 0)
1711		bus_space_write_stream_1(t, h, o, v);
1712}
1713
1714void
1715bus_space_set_multi_stream_2(bus_space_tag_t t,
1716	bus_space_handle_t h, bus_size_t o, uint16_t v,
1717	bus_size_t c)
1718{
1719	while (c-- > 0)
1720		bus_space_write_stream_2(t, h, o, v);
1721}
1722
1723void
1724bus_space_set_multi_stream_4(bus_space_tag_t t,
1725	bus_space_handle_t h, bus_size_t o, uint32_t v,
1726	bus_size_t c)
1727{
1728	while (c-- > 0)
1729		bus_space_write_stream_4(t, h, o, v);
1730}
1731
1732void
1733bus_space_set_multi_stream_8(bus_space_tag_t t,
1734	bus_space_handle_t h, bus_size_t o, uint64_t v,
1735	bus_size_t c)
1736{
1737	while (c-- > 0)
1738		bus_space_write_stream_8(t, h, o, v);
1739}
1740
1741/*
1742 *	void bus_space_copy_region_stream_N(bus_space_tag_t tag,
1743 *	    bus_space_handle_t bsh1, bus_size_t off1,
1744 *	    bus_space_handle_t bsh2, bus_size_t off2,
1745 *	    bus_size_t count);
1746 *
1747 * Copy `count' 1, 2, 4, or 8 byte values from bus space starting
1748 * at tag/bsh1/off1 to bus space starting at tag/bsh2/off2.
1749 */
1750void
1751bus_space_copy_region_stream_1(bus_space_tag_t t, bus_space_handle_t h1,
1752	bus_size_t o1, bus_space_handle_t h2, bus_size_t o2, bus_size_t c)
1753{
1754	for (; c; c--, o1++, o2++)
1755	    bus_space_write_stream_1(t, h1, o1, bus_space_read_stream_1(t, h2, o2));
1756}
1757
1758void
1759bus_space_copy_region_stream_2(bus_space_tag_t t, bus_space_handle_t h1,
1760	bus_size_t o1, bus_space_handle_t h2, bus_size_t o2, bus_size_t c)
1761{
1762	for (; c; c--, o1+=2, o2+=2)
1763	    bus_space_write_stream_2(t, h1, o1, bus_space_read_stream_2(t, h2, o2));
1764}
1765
1766void
1767bus_space_copy_region_stream_4(bus_space_tag_t t, bus_space_handle_t h1,
1768	bus_size_t o1, bus_space_handle_t h2, bus_size_t o2, bus_size_t c)
1769{
1770	for (; c; c--, o1+=4, o2+=4)
1771	    bus_space_write_stream_4(t, h1, o1, bus_space_read_stream_4(t, h2, o2));
1772}
1773
1774void
1775bus_space_copy_region_stream_8(bus_space_tag_t t, bus_space_handle_t h1,
1776	bus_size_t o1, bus_space_handle_t h2, bus_size_t o2, bus_size_t c)
1777{
1778	for (; c; c--, o1+=8, o2+=8)
1779	    bus_space_write_stream_8(t, h1, o1, bus_space_read_8(t, h2, o2));
1780}
1781
1782/*
1783 *	void bus_space_set_region_stream_N(bus_space_tag_t tag,
1784 *	    bus_space_handle_t bsh, bus_size_t off,
1785 *	    uintN_t *addr, bus_size_t count);
1786 *
1787 */
1788void
1789bus_space_set_region_stream_1(bus_space_tag_t t, bus_space_handle_t h,
1790	bus_size_t o, const uint8_t v, bus_size_t c)
1791{
1792	for (; c; c--, o++)
1793		bus_space_write_stream_1(t, h, o, v);
1794}
1795
1796void
1797bus_space_set_region_stream_2(bus_space_tag_t t, bus_space_handle_t h,
1798	bus_size_t o, const uint16_t v, bus_size_t c)
1799{
1800	for (; c; c--, o+=2)
1801		bus_space_write_stream_2(t, h, o, v);
1802}
1803
1804void
1805bus_space_set_region_stream_4(bus_space_tag_t t, bus_space_handle_t h,
1806	bus_size_t o, const uint32_t v, bus_size_t c)
1807{
1808	for (; c; c--, o+=4)
1809		bus_space_write_stream_4(t, h, o, v);
1810}
1811
1812void
1813bus_space_set_region_stream_8(bus_space_tag_t t, bus_space_handle_t h,
1814	bus_size_t o, const uint64_t v, bus_size_t c)
1815{
1816	for (; c; c--, o+=8)
1817		bus_space_write_stream_8(t, h, o, v);
1818}
1819
1820
1821/*
1822 *	void bus_space_read_multi_stream_N(bus_space_tag_t tag,
1823 *	    bus_space_handle_t bsh, bus_size_t offset,
1824 *	    uintN_t *addr, bus_size_t count);
1825 *
1826 * Read `count' 1, 2, 4, or 8 byte quantities from bus space
1827 * described by tag/handle/offset and copy into buffer provided.
1828 */
1829void
1830bus_space_read_multi_stream_1(bus_space_tag_t t,
1831	bus_space_handle_t h, bus_size_t o,
1832	uint8_t *a, bus_size_t c)
1833{
1834	while (c-- > 0)
1835		*a++ = bus_space_read_stream_1(t, h, o);
1836}
1837
1838void
1839bus_space_read_multi_stream_2(bus_space_tag_t t,
1840	bus_space_handle_t h, bus_size_t o,
1841	uint16_t *a, bus_size_t c)
1842{
1843	while (c-- > 0)
1844		*a++ = bus_space_read_stream_2(t, h, o);
1845}
1846
1847void
1848bus_space_read_multi_stream_4(bus_space_tag_t t,
1849	bus_space_handle_t h, bus_size_t o,
1850	uint32_t *a, bus_size_t c)
1851{
1852	while (c-- > 0)
1853		*a++ = bus_space_read_stream_4(t, h, o);
1854}
1855
1856void
1857bus_space_read_multi_stream_8(bus_space_tag_t t,
1858	bus_space_handle_t h, bus_size_t o,
1859	uint64_t *a, bus_size_t c)
1860{
1861	while (c-- > 0)
1862		*a++ = bus_space_read_stream_8(t, h, o);
1863}
1864
1865/*
1866 *	void bus_space_read_region_stream_N(bus_space_tag_t tag,
1867 *	    bus_space_handle_t bsh, bus_size_t off,
1868 *	    uintN_t *addr, bus_size_t count);
1869 *
1870 */
1871void
1872bus_space_read_region_stream_1(bus_space_tag_t t, bus_space_handle_t h,
1873	bus_size_t o, uint8_t *a, bus_size_t c)
1874{
1875	for (; c; a++, c--, o++)
1876		*a = bus_space_read_stream_1(t, h, o);
1877}
1878void
1879bus_space_read_region_stream_2(bus_space_tag_t t, bus_space_handle_t h,
1880	bus_size_t o, uint16_t *a, bus_size_t c)
1881{
1882	for (; c; a++, c--, o+=2)
1883		*a = bus_space_read_stream_2(t, h, o);
1884 }
1885void
1886bus_space_read_region_stream_4(bus_space_tag_t t, bus_space_handle_t h,
1887	bus_size_t o, uint32_t *a, bus_size_t c)
1888{
1889	for (; c; a++, c--, o+=4)
1890		*a = bus_space_read_stream_4(t, h, o);
1891}
1892void
1893bus_space_read_region_stream_8(bus_space_tag_t t, bus_space_handle_t h,
1894	bus_size_t o, uint64_t *a, bus_size_t c)
1895{
1896	for (; c; a++, c--, o+=8)
1897		*a = bus_space_read_stream_8(t, h, o);
1898}
1899
1900/*
1901 *	void bus_space_write_multi_stream_N(bus_space_tag_t tag,
1902 *	    bus_space_handle_t bsh, bus_size_t offset,
1903 *	    const uintN_t *addr, bus_size_t count);
1904 *
1905 * Write `count' 1, 2, 4, or 8 byte quantities from the buffer
1906 * provided to bus space described by tag/handle/offset.
1907 */
1908void
1909bus_space_write_multi_stream_1(bus_space_tag_t t,
1910	bus_space_handle_t h, bus_size_t o,
1911	const uint8_t *a, bus_size_t c)
1912{
1913	while (c-- > 0)
1914		bus_space_write_stream_1(t, h, o, *a++);
1915}
1916
1917void
1918bus_space_write_multi_stream_2(bus_space_tag_t t,
1919	bus_space_handle_t h, bus_size_t o,
1920	const uint16_t *a, bus_size_t c)
1921{
1922	while (c-- > 0)
1923		bus_space_write_stream_2(t, h, o, *a++);
1924}
1925
1926void
1927bus_space_write_multi_stream_4(bus_space_tag_t t,
1928	bus_space_handle_t h, bus_size_t o,
1929	const uint32_t *a, bus_size_t c)
1930{
1931	while (c-- > 0)
1932		bus_space_write_stream_4(t, h, o, *a++);
1933}
1934
1935void
1936bus_space_write_multi_stream_8(bus_space_tag_t t,
1937	bus_space_handle_t h, bus_size_t o,
1938	const uint64_t *a, bus_size_t c)
1939{
1940	while (c-- > 0)
1941		bus_space_write_stream_8(t, h, o, *a++);
1942}
1943
1944/*
1945 *	void bus_space_copy_region_N(bus_space_tag_t tag,
1946 *	    bus_space_handle_t bsh1, bus_size_t off1,
1947 *	    bus_space_handle_t bsh2, bus_size_t off2,
1948 *	    bus_size_t count);
1949 *
1950 * Copy `count' 1, 2, 4, or 8 byte values from bus space starting
1951 * at tag/bsh1/off1 to bus space starting at tag/bsh2/off2.
1952 */
1953void
1954bus_space_copy_region_1(bus_space_tag_t t, bus_space_handle_t h1, bus_size_t o1,
1955	bus_space_handle_t h2, bus_size_t o2, bus_size_t c)
1956{
1957	for (; c; c--, o1++, o2++)
1958	    bus_space_write_1(t, h1, o1, bus_space_read_1(t, h2, o2));
1959}
1960
1961void
1962bus_space_copy_region_2(bus_space_tag_t t, bus_space_handle_t h1, bus_size_t o1,
1963	bus_space_handle_t h2, bus_size_t o2, bus_size_t c)
1964{
1965	for (; c; c--, o1+=2, o2+=2)
1966	    bus_space_write_2(t, h1, o1, bus_space_read_2(t, h2, o2));
1967}
1968
1969void
1970bus_space_copy_region_4(bus_space_tag_t t, bus_space_handle_t h1, bus_size_t o1,
1971	bus_space_handle_t h2, bus_size_t o2, bus_size_t c)
1972{
1973	for (; c; c--, o1+=4, o2+=4)
1974	    bus_space_write_4(t, h1, o1, bus_space_read_4(t, h2, o2));
1975}
1976
1977void
1978bus_space_copy_region_8(bus_space_tag_t t, bus_space_handle_t h1, bus_size_t o1,
1979	bus_space_handle_t h2, bus_size_t o2, bus_size_t c)
1980{
1981	for (; c; c--, o1+=8, o2+=8)
1982	    bus_space_write_8(t, h1, o1, bus_space_read_8(t, h2, o2));
1983}
1984
1985/*
1986 *	void bus_space_set_region_N(bus_space_tag_t tag,
1987 *	    bus_space_handle_t bsh, bus_size_t off,
1988 *	    uintN_t *addr, bus_size_t count);
1989 *
1990 */
1991void
1992bus_space_set_region_1(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o,
1993	const uint8_t v, bus_size_t c)
1994{
1995	for (; c; c--, o++)
1996		bus_space_write_1(t, h, o, v);
1997}
1998
1999void
2000bus_space_set_region_2(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o,
2001	const uint16_t v, bus_size_t c)
2002{
2003	for (; c; c--, o+=2)
2004		bus_space_write_2(t, h, o, v);
2005}
2006
2007void
2008bus_space_set_region_4(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o,
2009	const uint32_t v, bus_size_t c)
2010{
2011	for (; c; c--, o+=4)
2012		bus_space_write_4(t, h, o, v);
2013}
2014
2015void
2016bus_space_set_region_8(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o,
2017	const uint64_t v, bus_size_t c)
2018{
2019	for (; c; c--, o+=8)
2020		bus_space_write_8(t, h, o, v);
2021}
2022
2023
2024/*
2025 *	void bus_space_set_multi_N(bus_space_tag_t tag,
2026 *	    bus_space_handle_t bsh, bus_size_t offset, uintN_t val,
2027 *	    bus_size_t count);
2028 *
2029 * Write the 1, 2, 4, or 8 byte value `val' to bus space described
2030 * by tag/handle/offset `count' times.
2031 */
2032void
2033bus_space_set_multi_1(bus_space_tag_t t,
2034	bus_space_handle_t h, bus_size_t o, uint8_t v,
2035	bus_size_t c)
2036{
2037	while (c-- > 0)
2038		bus_space_write_1(t, h, o, v);
2039}
2040
2041void
2042bus_space_set_multi_2(bus_space_tag_t t,
2043	bus_space_handle_t h, bus_size_t o, uint16_t v,
2044	bus_size_t c)
2045{
2046	while (c-- > 0)
2047		bus_space_write_2(t, h, o, v);
2048}
2049
2050void
2051bus_space_set_multi_4(bus_space_tag_t t,
2052	bus_space_handle_t h, bus_size_t o, uint32_t v,
2053	bus_size_t c)
2054{
2055	while (c-- > 0)
2056		bus_space_write_4(t, h, o, v);
2057}
2058
2059void
2060bus_space_set_multi_8(bus_space_tag_t t,
2061	bus_space_handle_t h, bus_size_t o, uint64_t v,
2062	bus_size_t c)
2063{
2064	while (c-- > 0)
2065		bus_space_write_8(t, h, o, v);
2066}
2067
2068/*
2069 *	void bus_space_write_region_N(bus_space_tag_t tag,
2070 *	    bus_space_handle_t bsh, bus_size_t off,
2071 *	    uintN_t *addr, bus_size_t count);
2072 *
2073 */
2074void
2075bus_space_write_region_1(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o,
2076	const uint8_t *a, bus_size_t c)
2077{
2078	for (; c; a++, c--, o++)
2079		bus_space_write_1(t, h, o, *a);
2080}
2081
2082void
2083bus_space_write_region_2(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o,
2084	const uint16_t *a, bus_size_t c)
2085{
2086	for (; c; a++, c--, o+=2)
2087		bus_space_write_2(t, h, o, *a);
2088}
2089
2090void
2091bus_space_write_region_4(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o,
2092	const uint32_t *a, bus_size_t c)
2093{
2094	for (; c; a++, c--, o+=4)
2095		bus_space_write_4(t, h, o, *a);
2096}
2097
2098void
2099bus_space_write_region_8(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o,
2100	const uint64_t *a, bus_size_t c)
2101{
2102	for (; c; a++, c--, o+=8)
2103		bus_space_write_8(t, h, o, *a);
2104}
2105
2106
2107/*
2108 *	void bus_space_read_region_N(bus_space_tag_t tag,
2109 *	    bus_space_handle_t bsh, bus_size_t off,
2110 *	    uintN_t *addr, bus_size_t count);
2111 *
2112 */
2113void
2114bus_space_read_region_1(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o,
2115	uint8_t *a, bus_size_t c)
2116{
2117	for (; c; a++, c--, o++)
2118		*a = bus_space_read_1(t, h, o);
2119}
2120void
2121bus_space_read_region_2(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o,
2122	uint16_t *a, bus_size_t c)
2123{
2124	for (; c; a++, c--, o+=2)
2125		*a = bus_space_read_2(t, h, o);
2126 }
2127void
2128bus_space_read_region_4(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o,
2129	uint32_t *a, bus_size_t c)
2130{
2131	for (; c; a++, c--, o+=4)
2132		*a = bus_space_read_4(t, h, o);
2133}
2134void
2135bus_space_read_region_8(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o,
2136	uint64_t *a, bus_size_t c)
2137{
2138	for (; c; a++, c--, o+=8)
2139		*a = bus_space_read_8(t, h, o);
2140}
2141
2142/*
2143 *	void bus_space_write_region_stream_N(bus_space_tag_t tag,
2144 *	    bus_space_handle_t bsh, bus_size_t off,
2145 *	    uintN_t *addr, bus_size_t count);
2146 *
2147 */
2148void
2149bus_space_write_region_stream_1(bus_space_tag_t t, bus_space_handle_t h,
2150	bus_size_t o, const uint8_t *a, bus_size_t c)
2151{
2152	for (; c; a++, c--, o++)
2153		bus_space_write_stream_1(t, h, o, *a);
2154}
2155
2156void
2157bus_space_write_region_stream_2(bus_space_tag_t t, bus_space_handle_t h,
2158	bus_size_t o, const uint16_t *a, bus_size_t c)
2159{
2160	for (; c; a++, c--, o+=2)
2161		bus_space_write_stream_2(t, h, o, *a);
2162}
2163
2164void
2165bus_space_write_region_stream_4(bus_space_tag_t t, bus_space_handle_t h,
2166	bus_size_t o, const uint32_t *a, bus_size_t c)
2167{
2168	for (; c; a++, c--, o+=4)
2169		bus_space_write_stream_4(t, h, o, *a);
2170}
2171
2172void
2173bus_space_write_region_stream_8(bus_space_tag_t t, bus_space_handle_t h,
2174	bus_size_t o, const uint64_t *a, bus_size_t c)
2175{
2176	for (; c; a++, c--, o+=8)
2177		bus_space_write_stream_8(t, h, o, *a);
2178}
2179
2180/*
2181 * Allocate a new bus tag and have it inherit the methods of the
2182 * given parent.
2183 */
2184bus_space_tag_t
2185bus_space_tag_alloc(bus_space_tag_t parent, void *cookie)
2186{
2187	struct sparc_bus_space_tag *sbt;
2188
2189	sbt = kmem_zalloc(sizeof(*sbt), KM_SLEEP);
2190
2191	if (parent) {
2192		memcpy(sbt, parent, sizeof(*sbt));
2193		sbt->parent = parent;
2194		sbt->ranges = NULL;
2195		sbt->nranges = 0;
2196	}
2197
2198	sbt->cookie = cookie;
2199	return (sbt);
2200}
2201
2202/*
2203 * Generic routine to translate an address using OpenPROM `ranges'.
2204 */
2205int
2206bus_space_translate_address_generic(struct openprom_range *ranges, int nranges,
2207    bus_addr_t *bap)
2208{
2209	int i, space = BUS_ADDR_IOSPACE(*bap);
2210
2211	for (i = 0; i < nranges; i++) {
2212		struct openprom_range *rp = &ranges[i];
2213
2214		if (rp->or_child_space != space)
2215			continue;
2216
2217		/* We've found the connection to the parent bus. */
2218		*bap = BUS_ADDR(rp->or_parent_space,
2219		    rp->or_parent_base + BUS_ADDR_PADDR(*bap));
2220		return (0);
2221	}
2222
2223	return (EINVAL);
2224}
2225
2226int
2227sparc_bus_map(bus_space_tag_t t, bus_addr_t addr, bus_size_t size,
2228	int flags, vaddr_t unused, bus_space_handle_t *hp)
2229{
2230	vaddr_t v;
2231	uint64_t pa;
2232	paddr_t	pm_flags = 0;
2233	vm_prot_t pm_prot = VM_PROT_READ;
2234	int err, map_little = 0;
2235
2236	if (io_space == NULL)
2237		/*
2238		 * And set up IOSPACE extents.
2239		 */
2240		io_space = extent_create("IOSPACE",
2241					 (u_long)IODEV_BASE, (u_long)IODEV_END,
2242					 0, 0, EX_NOWAIT);
2243
2244
2245	size = round_page(size);
2246	if (size == 0) {
2247		printf("sparc_bus_map: zero size\n");
2248		return (EINVAL);
2249	}
2250	switch (t->type) {
2251	case PCI_CONFIG_BUS_SPACE:
2252		/*
2253		 * PCI config space is special.
2254		 *
2255		 * It's really big and seldom used.  In order not to run
2256		 * out of IO mappings, config space will not be mapped in,
2257		 * rather it will be accessed through MMU bypass ASI accesses.
2258		 */
2259		if (flags & BUS_SPACE_MAP_LINEAR)
2260			return (-1);
2261		hp->_ptr = addr;
2262		hp->_asi = ASI_PHYS_NON_CACHED_LITTLE;
2263		hp->_sasi = ASI_PHYS_NON_CACHED;
2264		DPRINTF(BSDB_MAP, ("\n%s: config type %x flags %x "
2265			"addr %016llx size %016llx virt %llx\n", __func__,
2266			(int)t->type, (int) flags, (unsigned long long)addr,
2267			(unsigned long long)size,
2268			(unsigned long long)hp->_ptr));
2269		return (0);
2270	case PCI_IO_BUS_SPACE:
2271		map_little = 1;
2272		break;
2273	case PCI_MEMORY_BUS_SPACE:
2274		map_little = 1;
2275		break;
2276	default:
2277		map_little = 0;
2278		break;
2279	}
2280
2281#ifdef _LP64
2282	if (!CPU_ISSUN4V) {
2283		/* If it's not LINEAR don't bother to map it.  Use phys accesses. */
2284		if ((flags & BUS_SPACE_MAP_LINEAR) == 0) {
2285			hp->_ptr = addr;
2286			if (map_little)
2287				hp->_asi = ASI_PHYS_NON_CACHED_LITTLE;
2288			else
2289				hp->_asi = ASI_PHYS_NON_CACHED;
2290			hp->_sasi = ASI_PHYS_NON_CACHED;
2291			return (0);
2292		}
2293	}
2294#endif
2295
2296	if (!(flags & BUS_SPACE_MAP_CACHEABLE))
2297		pm_flags |= PMAP_NC;
2298
2299	if ((flags & BUS_SPACE_MAP_PREFETCHABLE))
2300		pm_flags |= PMAP_WC;
2301
2302	if ((err = extent_alloc(io_space, size, PAGE_SIZE,
2303		0, EX_NOWAIT|EX_BOUNDZERO, (u_long *)&v)))
2304			panic("sparc_bus_map: cannot allocate io_space: %d", err);
2305
2306	/* note: preserve page offset */
2307	hp->_ptr = (v | ((u_long)addr & PGOFSET));
2308	hp->_sasi = ASI_PRIMARY;
2309	if (map_little)
2310		hp->_asi = ASI_PRIMARY_LITTLE;
2311	else
2312		hp->_asi = ASI_PRIMARY;
2313
2314	pa = trunc_page(addr);
2315	if (!(flags&BUS_SPACE_MAP_READONLY))
2316		pm_prot |= VM_PROT_WRITE;
2317
2318	DPRINTF(BSDB_MAP, ("\n%s: type %x flags %x addr %016llx prot %02x "
2319		"pm_flags %x size %016llx virt %llx paddr %016llx\n", __func__,
2320		(int)t->type, (int)flags, (unsigned long long)addr, pm_prot,
2321		(int)pm_flags, (unsigned long long)size,
2322		(unsigned long long)hp->_ptr, (unsigned long long)pa));
2323
2324	do {
2325		DPRINTF(BSDB_MAP, ("%s: phys %llx virt %p hp %llx\n",
2326			__func__,
2327			(unsigned long long)pa, (char *)v,
2328			(unsigned long long)hp->_ptr));
2329		pmap_kenter_pa(v, pa | pm_flags, pm_prot, 0);
2330		v += PAGE_SIZE;
2331		pa += PAGE_SIZE;
2332	} while ((size -= PAGE_SIZE) > 0);
2333	return (0);
2334}
2335
2336int
2337sparc_bus_subregion(bus_space_tag_t tag, bus_space_handle_t handle,
2338	bus_size_t offset, bus_size_t size, bus_space_handle_t *nhandlep)
2339{
2340	nhandlep->_ptr = handle._ptr + offset;
2341	nhandlep->_asi = handle._asi;
2342	nhandlep->_sasi = handle._sasi;
2343	return (0);
2344}
2345
2346int
2347sparc_bus_unmap(bus_space_tag_t t, bus_space_handle_t bh, bus_size_t size)
2348{
2349	vaddr_t va = trunc_page((vaddr_t)bh._ptr);
2350	vaddr_t endva = va + round_page(size);
2351	int error = 0;
2352
2353	if (PHYS_ASI(bh._asi)) return (0);
2354
2355	error = extent_free(io_space, va, size, EX_NOWAIT);
2356	if (error) printf("sparc_bus_unmap: extent_free returned %d\n", error);
2357
2358	pmap_remove(pmap_kernel(), va, endva);
2359	return (0);
2360}
2361
2362paddr_t
2363sparc_bus_mmap(bus_space_tag_t t, bus_addr_t paddr, off_t off, int prot,
2364	int flags)
2365{
2366	paddr_t pa;
2367	/* Devices are un-cached... although the driver should do that */
2368	pa = (paddr + off) | PMAP_NC;
2369	if (flags & BUS_SPACE_MAP_LITTLE)
2370		pa |= PMAP_LITTLE;
2371	if (flags & BUS_SPACE_MAP_PREFETCHABLE)
2372		pa |= PMAP_WC;
2373	return pa;
2374}
2375
2376
2377void *
2378sparc_mainbus_intr_establish(bus_space_tag_t t, int pil, int level,
2379	int	(*handler)(void *), void *arg, void	(*fastvec)(void) /* ignored */)
2380{
2381	struct intrhand *ih;
2382
2383	ih = intrhand_alloc();
2384	ih->ih_fun = handler;
2385	ih->ih_arg = arg;
2386	intr_establish(pil, level != IPL_VM, ih);
2387	return (ih);
2388}
2389
2390int
2391sparc_bus_alloc(bus_space_tag_t t, bus_addr_t rs, bus_addr_t re, bus_size_t s,
2392	bus_size_t a, bus_size_t b, int f, bus_addr_t *ap, bus_space_handle_t *hp)
2393{
2394	return (ENOTTY);
2395}
2396
2397void
2398sparc_bus_free(bus_space_tag_t t, bus_space_handle_t h, bus_size_t s)
2399{
2400	return;
2401}
2402
2403struct sparc_bus_space_tag mainbus_space_tag = {
2404	NULL,				/* cookie */
2405	NULL,				/* parent bus tag */
2406	NULL,				/* ranges */
2407	0,				/* nranges */
2408	UPA_BUS_SPACE,			/* type */
2409	sparc_bus_alloc,
2410	sparc_bus_free,
2411	sparc_bus_map,			/* bus_space_map */
2412	sparc_bus_unmap,		/* bus_space_unmap */
2413	sparc_bus_subregion,		/* bus_space_subregion */
2414	sparc_bus_mmap,			/* bus_space_mmap */
2415	sparc_mainbus_intr_establish	/* bus_intr_establish */
2416};
2417
2418
2419void
2420cpu_getmcontext(struct lwp *l, mcontext_t *mcp, unsigned int *flags)
2421{
2422	__greg_t *gr = mcp->__gregs;
2423	__greg_t ras_pc;
2424	const struct trapframe64 *tf = l->l_md.md_tf;
2425
2426	/* First ensure consistent stack state (see sendsig). */ /* XXX? */
2427	write_user_windows();
2428	if (rwindow_save(l)) {
2429		mutex_enter(l->l_proc->p_lock);
2430		sigexit(l, SIGILL);
2431	}
2432
2433	/* For now: Erase any random indicators for optional state. */
2434	(void)memset(mcp, 0, sizeof (*mcp));
2435
2436	/* Save general register context. */
2437#ifdef __arch64__
2438	gr[_REG_CCR] = (tf->tf_tstate & TSTATE_CCR) >> TSTATE_CCR_SHIFT;
2439#else
2440	gr[_REG_PSR] = TSTATECCR_TO_PSR(tf->tf_tstate);
2441#endif
2442	gr[_REG_PC]  = tf->tf_pc;
2443	gr[_REG_nPC] = tf->tf_npc;
2444	gr[_REG_Y]   = tf->tf_y;
2445	gr[_REG_G1]  = tf->tf_global[1];
2446	gr[_REG_G2]  = tf->tf_global[2];
2447	gr[_REG_G3]  = tf->tf_global[3];
2448	gr[_REG_G4]  = tf->tf_global[4];
2449	gr[_REG_G5]  = tf->tf_global[5];
2450	gr[_REG_G6]  = tf->tf_global[6];
2451	gr[_REG_G7]  = tf->tf_global[7];
2452	gr[_REG_O0]  = tf->tf_out[0];
2453	gr[_REG_O1]  = tf->tf_out[1];
2454	gr[_REG_O2]  = tf->tf_out[2];
2455	gr[_REG_O3]  = tf->tf_out[3];
2456	gr[_REG_O4]  = tf->tf_out[4];
2457	gr[_REG_O5]  = tf->tf_out[5];
2458	gr[_REG_O6]  = tf->tf_out[6];
2459	gr[_REG_O7]  = tf->tf_out[7];
2460#ifdef __arch64__
2461	gr[_REG_ASI] = (tf->tf_tstate & TSTATE_ASI) >> TSTATE_ASI_SHIFT;
2462#if 0 /* not yet supported */
2463	gr[_REG_FPRS] = ;
2464#endif
2465#endif /* __arch64__ */
2466
2467	if ((ras_pc = (__greg_t)ras_lookup(l->l_proc,
2468	    (void *) gr[_REG_PC])) != -1) {
2469		gr[_REG_PC] = ras_pc;
2470		gr[_REG_nPC] = ras_pc + 4;
2471	}
2472
2473	*flags |= (_UC_CPU|_UC_TLSBASE);
2474
2475	mcp->__gwins = NULL;
2476
2477
2478	/* Save FP register context, if any. */
2479	if (l->l_md.md_fpstate != NULL) {
2480		struct fpstate64 *fsp;
2481		__fpregset_t *fpr = &mcp->__fpregs;
2482
2483		/*
2484		 * If our FP context is currently held in the FPU, take a
2485		 * private snapshot - lazy FPU context switching can deal
2486		 * with it later when it becomes necessary.
2487		 * Otherwise, get it from the process's save area.
2488		 */
2489		fpusave_lwp(l, true);
2490		fsp = l->l_md.md_fpstate;
2491		memcpy(&fpr->__fpu_fr, fsp->fs_regs, sizeof (fpr->__fpu_fr));
2492		mcp->__fpregs.__fpu_q = NULL;	/* `Need more info.' */
2493		mcp->__fpregs.__fpu_fsr = fsp->fs_fsr;
2494		mcp->__fpregs.__fpu_qcnt = 0 /*fs.fs_qsize*/; /* See above */
2495		mcp->__fpregs.__fpu_q_entrysize =
2496		    (unsigned char) sizeof (*mcp->__fpregs.__fpu_q);
2497		mcp->__fpregs.__fpu_en = 1;
2498		*flags |= _UC_FPU;
2499	} else {
2500		mcp->__fpregs.__fpu_en = 0;
2501	}
2502
2503	mcp->__xrs.__xrs_id = 0;	/* Solaris extension? */
2504}
2505
2506int
2507cpu_mcontext_validate(struct lwp *l, const mcontext_t *mc)
2508{
2509	const __greg_t *gr = mc->__gregs;
2510
2511	/*
2512 	 * Only the icc bits in the psr are used, so it need not be
2513 	 * verified.  pc and npc must be multiples of 4.  This is all
2514 	 * that is required; if it holds, just do it.
2515	 */
2516	if (((gr[_REG_PC] | gr[_REG_nPC]) & 3) != 0 ||
2517	    gr[_REG_PC] == 0 || gr[_REG_nPC] == 0)
2518		return EINVAL;
2519
2520	return 0;
2521}
2522
2523int
2524cpu_setmcontext(struct lwp *l, const mcontext_t *mcp, unsigned int flags)
2525{
2526	const __greg_t *gr = mcp->__gregs;
2527	struct trapframe64 *tf = l->l_md.md_tf;
2528	struct proc *p = l->l_proc;
2529	int error;
2530
2531	/* First ensure consistent stack state (see sendsig). */
2532	write_user_windows();
2533	if (rwindow_save(l)) {
2534		mutex_enter(p->p_lock);
2535		sigexit(l, SIGILL);
2536	}
2537
2538	if ((flags & _UC_CPU) != 0) {
2539		error = cpu_mcontext_validate(l, mcp);
2540		if (error)
2541			return error;
2542
2543		/* Restore general register context. */
2544		/* take only tstate CCR (and ASI) fields */
2545#ifdef __arch64__
2546		tf->tf_tstate = (tf->tf_tstate & ~(TSTATE_CCR | TSTATE_ASI)) |
2547		    ((gr[_REG_CCR] << TSTATE_CCR_SHIFT) & TSTATE_CCR) |
2548		    ((gr[_REG_ASI] << TSTATE_ASI_SHIFT) & TSTATE_ASI);
2549#else
2550		tf->tf_tstate = (tf->tf_tstate & ~TSTATE_CCR) |
2551		    PSRCC_TO_TSTATE(gr[_REG_PSR]);
2552#endif
2553		tf->tf_pc        = (uint64_t)gr[_REG_PC];
2554		tf->tf_npc       = (uint64_t)gr[_REG_nPC];
2555		tf->tf_y         = (uint64_t)gr[_REG_Y];
2556		tf->tf_global[1] = (uint64_t)gr[_REG_G1];
2557		tf->tf_global[2] = (uint64_t)gr[_REG_G2];
2558		tf->tf_global[3] = (uint64_t)gr[_REG_G3];
2559		tf->tf_global[4] = (uint64_t)gr[_REG_G4];
2560		tf->tf_global[5] = (uint64_t)gr[_REG_G5];
2561		tf->tf_global[6] = (uint64_t)gr[_REG_G6];
2562		/* done in lwp_setprivate */
2563		/* tf->tf_global[7] = (uint64_t)gr[_REG_G7]; */
2564		tf->tf_out[0]    = (uint64_t)gr[_REG_O0];
2565		tf->tf_out[1]    = (uint64_t)gr[_REG_O1];
2566		tf->tf_out[2]    = (uint64_t)gr[_REG_O2];
2567		tf->tf_out[3]    = (uint64_t)gr[_REG_O3];
2568		tf->tf_out[4]    = (uint64_t)gr[_REG_O4];
2569		tf->tf_out[5]    = (uint64_t)gr[_REG_O5];
2570		tf->tf_out[6]    = (uint64_t)gr[_REG_O6];
2571		tf->tf_out[7]    = (uint64_t)gr[_REG_O7];
2572		/* %asi restored above; %fprs not yet supported. */
2573
2574		/* XXX mcp->__gwins */
2575
2576		if (flags & _UC_TLSBASE)
2577			lwp_setprivate(l, (void *)(uintptr_t)gr[_REG_G7]);
2578	}
2579
2580	/* Restore FP register context, if any. */
2581	if ((flags & _UC_FPU) != 0 && mcp->__fpregs.__fpu_en != 0) {
2582		struct fpstate64 *fsp;
2583		const __fpregset_t *fpr = &mcp->__fpregs;
2584
2585		/*
2586		 * If we're the current FPU owner, simply reload it from
2587		 * the supplied context.  Otherwise, store it into the
2588		 * process' FPU save area (which is used to restore from
2589		 * by lazy FPU context switching); allocate it if necessary.
2590		 */
2591		if ((fsp = l->l_md.md_fpstate) == NULL) {
2592			fsp = pool_cache_get(fpstate_cache, PR_WAITOK);
2593			l->l_md.md_fpstate = fsp;
2594		} else {
2595			/* Drop the live context on the floor. */
2596			fpusave_lwp(l, false);
2597		}
2598		/* Note: sizeof fpr->__fpu_fr <= sizeof fsp->fs_regs. */
2599		memcpy(fsp->fs_regs, &fpr->__fpu_fr, sizeof (fpr->__fpu_fr));
2600		fsp->fs_fsr = mcp->__fpregs.__fpu_fsr;
2601		fsp->fs_qsize = 0;
2602
2603#if 0
2604		/* Need more info! */
2605		mcp->__fpregs.__fpu_q = NULL;	/* `Need more info.' */
2606		mcp->__fpregs.__fpu_qcnt = 0 /*fs.fs_qsize*/; /* See above */
2607#endif
2608	}
2609
2610	/* XXX mcp->__xrs */
2611	/* XXX mcp->__asrs */
2612
2613	mutex_enter(p->p_lock);
2614	if (flags & _UC_SETSTACK)
2615		l->l_sigstk.ss_flags |= SS_ONSTACK;
2616	if (flags & _UC_CLRSTACK)
2617		l->l_sigstk.ss_flags &= ~SS_ONSTACK;
2618	mutex_exit(p->p_lock);
2619
2620	return 0;
2621}
2622
2623/*
2624 * Preempt the current process if in interrupt from user mode,
2625 * or after the current trap/syscall if in system mode.
2626 */
2627void
2628cpu_need_resched(struct cpu_info *ci, struct lwp *l, int flags)
2629{
2630
2631	ci->ci_want_ast = 1;
2632
2633#ifdef MULTIPROCESSOR
2634	if ((flags & RESCHED_REMOTE) != 0) {
2635		/* Just interrupt the target CPU, so it can notice its AST */
2636		sparc64_send_ipi(ci->ci_cpuid, sparc64_ipi_nop, 0, 0);
2637	}
2638#endif
2639}
2640
2641/*
2642 * Notify an LWP that it has a signal pending, process as soon as possible.
2643 */
2644void
2645cpu_signotify(struct lwp *l)
2646{
2647	struct cpu_info *ci = l->l_cpu;
2648
2649	ci->ci_want_ast = 1;
2650#ifdef MULTIPROCESSOR
2651	if (ci != curcpu()) {
2652		sparc64_send_ipi(ci->ci_cpuid, sparc64_ipi_nop, 0, 0);
2653	}
2654#endif
2655}
2656
2657bool
2658cpu_intr_p(void)
2659{
2660	int idepth;
2661	long pctr;
2662	lwp_t *l;
2663
2664	l = curlwp;
2665	do {
2666		pctr = lwp_pctr();
2667		idepth = l->l_cpu->ci_idepth;
2668	} while (__predict_false(pctr != lwp_pctr()));
2669
2670	return idepth >= 0;
2671}
2672
2673#ifdef MODULAR
2674void
2675module_init_md(void)
2676{
2677}
2678#endif
2679
2680int
2681mm_md_physacc(paddr_t pa, vm_prot_t prot)
2682{
2683
2684	return pmap_pa_exists(pa) ? 0 : EFAULT;
2685}
2686
2687int
2688mm_md_kernacc(void *ptr, vm_prot_t prot, bool *handled)
2689{
2690	/* XXX: Don't know where PROMs are on Ultras.  Think it's at f000000 */
2691	const vaddr_t prom_vstart = 0xf000000, prom_vend = 0xf0100000;
2692	const vaddr_t msgbufpv = (vaddr_t)msgbufp, v = (vaddr_t)ptr;
2693	const size_t msgbufsz = msgbufp->msg_bufs +
2694	    offsetof(struct kern_msgbuf, msg_bufc);
2695
2696	*handled = (v >= msgbufpv && v < msgbufpv + msgbufsz) ||
2697	    (v >= prom_vstart && v < prom_vend && (prot & VM_PROT_WRITE) == 0);
2698	return 0;
2699}
2700
2701int
2702mm_md_readwrite(dev_t dev, struct uio *uio)
2703{
2704
2705	return ENXIO;
2706}
2707
2708#ifdef __arch64__
2709void
2710sparc64_elf_mcmodel_check(struct exec_package *epp, const char *model,
2711    size_t len)
2712{
2713	/* no model specific execution for 32bit processes */
2714	if (epp->ep_flags & EXEC_32)
2715		return;
2716
2717#ifdef __USE_TOPDOWN_VM
2718	/*
2719	 * we allow TOPDOWN_VM for all processes where the binary is compiled
2720	 * with the medany or medmid code model.
2721	 */
2722	if (strncmp(model, "medany", len) == 0 ||
2723	    strncmp(model, "medmid", len) == 0)
2724		epp->ep_flags |= EXEC_TOPDOWN_VM;
2725#endif
2726}
2727#endif
2728