summaryrefslogtreecommitdiff
path: root/sys/arch
diff options
context:
space:
mode:
authorMiod Vallat <miod@cvs.openbsd.org>2002-04-27 01:52:14 +0000
committerMiod Vallat <miod@cvs.openbsd.org>2002-04-27 01:52:14 +0000
commit1d8c583bfbd54da9b80bed64cb21bd377c44dd13 (patch)
treea7e9b7b385ebc87f39407ab32baf4c406eaa13dc /sys/arch
parent39ef332c31acac15b7bf742185a421ca104b5882 (diff)
Lots of cleanup to catch up with other m68k-based ports and modern code,
including: - use netisr_dispatch - extract an allocsys() function from cpu_startup() - updated cachectl() - a few fixes in trap() and more...
Diffstat (limited to 'sys/arch')
-rw-r--r--sys/arch/mac68k/include/cpu.h23
-rw-r--r--sys/arch/mac68k/mac68k/machdep.c386
-rw-r--r--sys/arch/mac68k/mac68k/pmap_bootstrap.c19
-rw-r--r--sys/arch/mac68k/mac68k/sys_machdep.c98
-rw-r--r--sys/arch/mac68k/mac68k/trap.c63
-rw-r--r--sys/arch/mac68k/mac68k/vm_machdep.c79
6 files changed, 332 insertions, 336 deletions
diff --git a/sys/arch/mac68k/include/cpu.h b/sys/arch/mac68k/include/cpu.h
index 7507469a61b..a884cc13c27 100644
--- a/sys/arch/mac68k/include/cpu.h
+++ b/sys/arch/mac68k/include/cpu.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: cpu.h,v 1.25 2002/04/16 20:54:16 miod Exp $ */
+/* $OpenBSD: cpu.h,v 1.26 2002/04/27 01:52:10 miod Exp $ */
/* $NetBSD: cpu.h,v 1.45 1997/02/10 22:13:40 scottr Exp $ */
/*
@@ -304,16 +304,25 @@ u_int get_mapping(void);
/* locore.s */
void m68881_restore(struct fpframe *);
void m68881_save(struct fpframe *);
+void DCIA(void);
+void DCIS(void);
+void DCIU(void);
+void ICIA(void);
+void ICPA(void);
+void PCIA(void);
void TBIA(void);
void TBIAS(void);
void TBIAU(void);
void TBIS(vm_offset_t);
-void DCFP(vm_offset_t);
-void ICPP(vm_offset_t);
-void DCIU(void);
-void DCIS(void);
-void ICIA(void);
-void DCFL(vm_offset_t);
+#if defined(M68040)
+void DCFA(void);
+void DCFP(paddr_t);
+void DCFL(paddr_t);
+void DCPL(paddr_t);
+void DCPP(paddr_t);
+void ICPL(paddr_t);
+void ICPP(paddr_t);
+#endif
int suline(caddr_t, caddr_t);
void savectx(struct pcb *);
void proc_trampoline(void);
diff --git a/sys/arch/mac68k/mac68k/machdep.c b/sys/arch/mac68k/mac68k/machdep.c
index 4dc03b9d762..8108df138ac 100644
--- a/sys/arch/mac68k/mac68k/machdep.c
+++ b/sys/arch/mac68k/mac68k/machdep.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: machdep.c,v 1.98 2002/04/16 15:32:59 miod Exp $ */
+/* $OpenBSD: machdep.c,v 1.99 2002/04/27 01:52:13 miod Exp $ */
/* $NetBSD: machdep.c,v 1.207 1998/07/08 04:39:34 thorpej Exp $ */
/*
@@ -141,7 +141,7 @@ void netintr(void);
#include "ether.h"
/* The following is used externally (sysctl_hw) */
-char machine[] = "mac68k"; /* cpu "architecture" */
+char machine[] = MACHINE; /* from <machine/param.h> */
struct mac68k_machine_S mac68k_machine;
@@ -227,16 +227,17 @@ unsigned short mac68k_statclockipl = PSL_S | PSL_IPL2;
* The extent maps are not static! Machine-dependent NuBus and on-board
* I/O routines need access to them for bus address space allocation.
*/
-static long iomem_ex_storage[EXTENT_FIXED_STORAGE_SIZE(8) / sizeof(long)];
+long iomem_ex_storage[EXTENT_FIXED_STORAGE_SIZE(8) / sizeof(long)];
struct extent *iomem_ex;
int iomem_malloc_safe;
/* XXX should be in locore.s for consistency */
int astpending = 0;
-static void identifycpu(void);
-static u_long get_physical(u_int, u_long *);
+void identifycpu(void);
+u_long get_physical(u_int, u_long *);
+caddr_t allocsys(caddr_t);
void initcpu(void);
int cpu_dumpsize(void);
int cpu_dump(int (*)(dev_t, daddr_t, caddr_t, size_t), daddr_t *);
@@ -323,7 +324,7 @@ consinit(void)
void
cpu_startup(void)
{
- caddr_t v, firstaddr;
+ caddr_t v;
unsigned i;
int vers;
int base, residual;
@@ -341,10 +342,9 @@ cpu_startup(void)
* high[numranges-1] was decremented in pmap_bootstrap.
*/
for (i = 0; i < btoc(MSGBUFSIZE); i++)
- pmap_enter(pmap_kernel(), (vm_offset_t)msgbufp,
+ pmap_enter(pmap_kernel(), (vaddr_t)msgbufp + i * NBPG,
high[numranges - 1] + i * NBPG,
- VM_PROT_READ|VM_PROT_WRITE,
- VM_PROT_READ|VM_PROT_WRITE|PMAP_WIRED);
+ VM_PROT_ALL, VM_PROT_ALL|PMAP_WIRED);
pmap_update(pmap_kernel());
initmsgbuf((caddr_t)msgbufp, round_page(MSGBUFSIZE));
@@ -367,84 +367,16 @@ cpu_startup(void)
printf("this kernel.\n\n");
for (delay = 0; delay < 1000000; delay++);
}
- printf("real mem = %d\n", ctob(physmem));
+ printf("real mem = %u (%uK)\n", ctob(physmem), ctob(physmem)/1024);
/*
- * Allocate space for system data structures.
- * The first available real memory address is in "firstaddr".
- * The first available kernel virtual address is in "v".
- * As pages of kernel virtual memory are allocated, "v" is incremented.
- * As pages of memory are allocated and cleared,
- * "firstaddr" is incremented.
- * An index into the kernel page table corresponding to the
- * virtual memory address maintained in "v" is kept in "mapaddr".
+ * Find out how much space we need, allocate it,
+ * and then give everything true virtual addressses.
*/
- /*
- * Make two passes. The first pass calculates how much memory is
- * needed and allocates it. The second pass assigns virtual
- * addresses to the various data structures.
- */
- firstaddr = 0;
-again:
- v = (caddr_t)firstaddr;
-
-#define valloc(name, type, num) \
- (name) = (type *)v; v = (caddr_t)((name)+(num))
-#define valloclim(name, type, num, lim) \
- (name) = (type *)v; v = (caddr_t)((lim) = ((name)+(num)))
-#ifdef SYSVSHM
- shminfo.shmmax = shmmaxpgs;
- shminfo.shmall = shmmaxpgs;
- shminfo.shmseg = shmseg;
- valloc(shmsegs, struct shmid_ds, shminfo.shmmni);
-#endif
-#ifdef SYSVSEM
- valloc(sema, struct semid_ds, seminfo.semmni);
- valloc(sem, struct sem, seminfo.semmns);
- /* This is pretty disgusting! */
- valloc(semu, int, (seminfo.semmnu * seminfo.semusz) / sizeof(int));
-#endif
-#ifdef SYSVMSG
- valloc(msgpool, char, msginfo.msgmax);
- valloc(msgmaps, struct msgmap, msginfo.msgseg);
- valloc(msghdrs, struct msg, msginfo.msgtql);
- valloc(msqids, struct msqid_ds, msginfo.msgmni);
-#endif
- /*
- * Determine how many buffers to allocate.
- * Use 10% of memory for the first 2 Meg, 5% of the remaining
- * memory. Insure a minimum of 16 buffers.
- * We allocate 3/4 as many swap buffer headers as file i/o buffers.
- */
- if (bufpages == 0) {
- if (physmem < btoc(2 * 1024 * 1024))
- bufpages = physmem / 10;
- else
- bufpages = (btoc(2 * 1024 * 1024) + physmem) / 20;
- }
-
- if (nbuf == 0) {
- nbuf = bufpages;
- if (nbuf < 16)
- nbuf = 16;
- }
-
- valloc(buf, struct buf, nbuf);
-
- /*
- * End of first pass, size has been calculated so allocate memory
- */
- if (firstaddr == 0) {
- size = (vm_size_t)(v - firstaddr);
- firstaddr = (caddr_t)uvm_km_alloc(kernel_map, round_page(size));
- if (firstaddr == 0)
- panic("startup: no room for tables");
- goto again;
- }
- /*
- * End of second pass, addresses have been assigned
- */
- if ((vm_size_t)(v - firstaddr) != size)
+ size = (vsize_t)allocsys((caddr_t)0);
+ if ((v = (caddr_t)uvm_km_zalloc(kernel_map, round_page(size))) == 0)
+ panic("startup: no room for tables");
+ if ((allocsys(v) - v) != size)
panic("startup: table size inconsistency");
/*
@@ -452,16 +384,16 @@ again:
* in that they usually occupy more virtual memory than physical.
*/
size = MAXBSIZE * nbuf;
- if (uvm_map(kernel_map, (vm_offset_t *) &buffers, round_page(size),
+ if (uvm_map(kernel_map, (vaddr_t *) &buffers, round_page(size),
NULL, UVM_UNKNOWN_OFFSET, 0, UVM_MAPFLAG(UVM_PROT_NONE,
UVM_PROT_NONE, UVM_INH_NONE, UVM_ADV_NORMAL, 0)))
panic("startup: cannot allocate VM for buffers");
- minaddr = (vm_offset_t)buffers;
+ minaddr = (vaddr_t)buffers;
base = bufpages / nbuf;
residual = bufpages % nbuf;
for (i = 0; i < nbuf; i++) {
- vm_size_t curbufsize;
- vm_offset_t curbuf;
+ vsize_t curbufsize;
+ vaddr_t curbuf;
struct vm_page *pg;
/*
@@ -470,7 +402,7 @@ again:
* for the first "residual" buffers, and then we allocate
* "base" pages for the rest.
*/
- curbuf = (vm_offset_t) buffers + (i * MAXBSIZE);
+ curbuf = (vaddr_t) buffers + (i * MAXBSIZE);
curbufsize = PAGE_SIZE * ((i < residual) ? (base+1) : base);
while (curbufsize) {
@@ -485,6 +417,7 @@ again:
}
pmap_update(pmap_kernel());
}
+
/*
* Allocate a submap for exec arguments. This map effectively
* limits the number of processes exec'ing at any time.
@@ -498,9 +431,10 @@ again:
phys_map = uvm_km_suballoc(kernel_map, &minaddr, &maxaddr,
VM_PHYS_SIZE, 0, FALSE, NULL);
- printf("avail mem = %ld\n", ptoa(uvmexp.free));
- printf("using %d buffers containing %d bytes of memory\n",
- nbuf, bufpages * PAGE_SIZE);
+ printf("avail mem = %lu (%uK)\n", ptoa(uvmexp.free),
+ ptoa(uvmexp.free)/1024);
+ printf("using %d buffers containing %u bytes (%uK) of memory\n",
+ nbuf, bufpages * PAGE_SIZE, bufpages * PAGE_SIZE / 1024);
/*
* Set up CPU-specific registers, cache, etc.
@@ -525,6 +459,64 @@ again:
iomem_malloc_safe = 1;
}
+/*
+ * Allocate space for system data structures. We are given
+ * a starting virtual address and we return a final virtual
+ * address; along the way we set each data structure pointer.
+ *
+ * We call allocsys() with 0 to find out how much space we want,
+ * allocate that much and fill it with zeroes, and then call
+ * allocsys() again with the correct base virtual address.
+ */
+caddr_t
+allocsys(v)
+ caddr_t v;
+{
+
+#define valloc(name, type, num) \
+ (name) = (type *)v; v = (caddr_t)((name)+(num))
+#define valloclim(name, type, num, lim) \
+ (name) = (type *)v; v = (caddr_t)((lim) = ((name)+(num)))
+
+#ifdef SYSVSHM
+ shminfo.shmmax = shmmaxpgs;
+ shminfo.shmall = shmmaxpgs;
+ shminfo.shmseg = shmseg;
+ valloc(shmsegs, struct shmid_ds, shminfo.shmmni);
+#endif
+#ifdef SYSVSEM
+ valloc(sema, struct semid_ds, seminfo.semmni);
+ valloc(sem, struct sem, seminfo.semmns);
+ /* This is pretty disgusting! */
+ valloc(semu, int, (seminfo.semmnu * seminfo.semusz) / sizeof(int));
+#endif
+#ifdef SYSVMSG
+ valloc(msgpool, char, msginfo.msgmax);
+ valloc(msgmaps, struct msgmap, msginfo.msgseg);
+ valloc(msghdrs, struct msg, msginfo.msgtql);
+ valloc(msqids, struct msqid_ds, msginfo.msgmni);
+#endif
+ /*
+ * Determine how many buffers to allocate.
+ * Use 10% of memory for the first 2 Meg, then 5% of the remaining
+ * memory. Insure a minimum of 16 buffers.
+ */
+ if (bufpages == 0) {
+ if (physmem < btoc(2 * 1024 * 1024))
+ bufpages = physmem / 10;
+ else
+ bufpages = (btoc(2 * 1024 * 1024) + physmem) / 20;
+ }
+
+ if (nbuf == 0) {
+ nbuf = bufpages;
+ if (nbuf < 16)
+ nbuf = 16;
+ }
+ valloc(buf, struct buf, nbuf);
+ return (v);
+}
+
void
initcpu()
{
@@ -569,7 +561,7 @@ void via_shutdown(void);
*/
void
setregs(p, pack, stack, retval)
- register struct proc *p;
+ struct proc *p;
struct exec_package *pack;
u_long stack;
register_t *retval;
@@ -619,17 +611,16 @@ setregs(p, pack, stack, retval)
}
int waittime = -1;
-struct pcb dumppcb;
void
boot(howto)
- register int howto;
+ int howto;
{
extern u_long maxaddr;
/* take a snap shot before clobbering any registers */
- if (curproc)
- savectx((struct pcb *)curproc->p_addr);
+ if (curproc && curproc->p_addr)
+ savectx(&curproc->p_addr->u_pcb);
/* If system is cold, just halt. */
if (cold) {
@@ -639,34 +630,25 @@ boot(howto)
boothowto = howto;
if ((howto & RB_NOSYNC) == 0 && waittime < 0) {
- extern struct proc proc0;
- /* kill the panic on that boot away */
- if (curproc == NULL)
- curproc = &proc0;
-
waittime = 0;
-
- /*
- * Release inodes, sync and unmount the filesystems.
- */
vfs_shutdown();
-#ifdef notyet
/*
* If we've been adjusting the clock, the todr
* will be out of synch; adjust it now unless
* the system was sitting in ddb.
*/
if ((howto & RB_TIMEBAD) == 0) {
+#ifdef notyet
resettodr();
+#else
+#ifdef DIAGNOSTIC
+ printf("OpenBSD/mac68k does not trust itself to update the clock on shutdown.\n");
+#endif
+#endif
} else {
printf("WARNING: not updating battery clock\n");
}
-#else
-# ifdef DIAGNOSTIC
- printf("OpenBSD/mac68k does not trust itself to update the clock on shutdown.\n");
-# endif
-#endif
}
/* Disable interrupts. */
@@ -674,7 +656,6 @@ boot(howto)
/* If rebooting and a dump is requested, do it. */
if (howto & RB_DUMP) {
- savectx(&dumppcb); /* XXX this goes away soon */
dumpsys();
}
@@ -703,7 +684,7 @@ haltsys:
}
/* Map the last physical page VA = PA for doboot() */
- pmap_enter(pmap_kernel(), (vm_offset_t)maxaddr, (vm_offset_t)maxaddr,
+ pmap_enter(pmap_kernel(), (vaddr_t)maxaddr, (vaddr_t)maxaddr,
VM_PROT_ALL, VM_PROT_ALL|PMAP_WIRED);
pmap_update(pmap_kernel());
@@ -795,42 +776,35 @@ void
dumpconf()
{
cpu_kcore_hdr_t *h = &cpu_kcore_hdr;
- int chdrsize; /* size of dump header */
int nblks; /* size of dump area */
int maj;
int i;
if (dumpdev == NODEV)
return;
-
maj = major(dumpdev);
if (maj < 0 || maj >= nblkdev)
panic("dumpconf: bad dumpdev=0x%x", dumpdev);
- if (bdevsw[maj].d_psize == NULL) {
- printf ("dumpconf: returning for d_psize\n");
+ if (bdevsw[maj].d_psize == NULL)
return;
- }
nblks = (*bdevsw[maj].d_psize)(dumpdev);
- chdrsize = cpu_dumpsize();
+ if (nblks <= ctod(1))
+ return;
dumpsize = 0;
for (i = 0; h->ram_segs[i].size && i < NPHYS_RAM_SEGS; i++)
dumpsize += btoc(h->ram_segs[i].size);
+ dumpsize += cpu_dumpsize();
- /*
- * Check to see if we will fit. Note we always skip the
- * first block in case there is a disk label there.
- */
- if (nblks < (ctod(dumpsize) + chdrsize + ctod(1))) {
- dumpsize = 0;
- dumplo = -1;
- return;
- }
+ /* Always skip the first block, in case there is a label there. */
+ if (dumplo < ctod(1))
+ dumplo = ctod(1);
- /*
- * Put dump at the end of the partition.
- */
- dumplo = (nblks - 1) - ctod(dumpsize) - chdrsize;
+ /* Put dump at end of partition, and make it fit. */
+ if (dumpsize < dtoc(nblks - dumplo))
+ dumpsize = dtoc(nblks - dumplo);
+ if (dumplo < nblks - ctod(dumpsize))
+ dumplo = nblks - ctod(dumpsize);
}
void
@@ -841,7 +815,7 @@ dumpsys()
/* dump routine */
int (*dump)(dev_t, daddr_t, caddr_t, size_t);
int pg; /* page being dumped */
- vm_offset_t maddr; /* PA being dumped */
+ vaddr_t maddr; /* PA being dumped */
int seg; /* RAM segment being dumped */
int error; /* error code from (*dump)() */
extern int msgbufmapped;
@@ -895,12 +869,12 @@ dumpsys()
}
maddr = h->ram_segs[seg].start;
}
- pmap_enter(pmap_kernel(), (vm_offset_t)vmmap, maddr,
+ pmap_enter(pmap_kernel(), (vaddr_t)vmmap, maddr,
VM_PROT_READ, VM_PROT_READ|PMAP_WIRED);
pmap_update(pmap_kernel());
error = (*dump)(dumpdev, blkno, vmmap, NBPG);
- bad:
+bad:
switch (error) {
case 0:
maddr += NBPG;
@@ -968,8 +942,6 @@ microtime(tvp)
splx(s);
}
-void straytrap(int, int);
-
void
straytrap(pc, evec)
int pc;
@@ -977,9 +949,11 @@ straytrap(pc, evec)
{
printf("unexpected trap; vector offset 0x%x from 0x%x.\n",
(int) (evec & 0xfff), pc);
+#ifdef DEBUG
#ifdef DDB
Debugger();
#endif
+#endif
}
int *nofault;
@@ -988,9 +962,9 @@ int badaddr(caddr_t);
int
badaddr(addr)
- register caddr_t addr;
+ caddr_t addr;
{
- register int i;
+ int i;
label_t faultbuf;
nofault = (int *)&faultbuf;
@@ -1005,16 +979,11 @@ badaddr(addr)
int
badbaddr(addr)
- register caddr_t addr;
+ caddr_t addr;
{
- register int i;
+ int i;
label_t faultbuf;
-#ifdef lint
- i = *addr;
- if (i)
- return (0);
-#endif
nofault = (int *)&faultbuf;
if (setjmp((label_t *)nofault)) {
nofault = (int *)0;
@@ -1027,16 +996,11 @@ badbaddr(addr)
int
badwaddr(addr)
- register caddr_t addr;
+ caddr_t addr;
{
- register int i;
+ int i;
label_t faultbuf;
-#ifdef lint
- i = *addr;
- if (i)
- return (0);
-#endif
nofault = (int *)&faultbuf;
if (setjmp((label_t *)nofault)) {
nofault = (int *)0;
@@ -1049,16 +1013,11 @@ badwaddr(addr)
int
badladdr(addr)
- register caddr_t addr;
+ caddr_t addr;
{
- register int i;
+ int i;
label_t faultbuf;
-#ifdef lint
- i = *addr;
- if (i)
- return (0);
-#endif
nofault = (int *)&faultbuf;
if (setjmp((label_t *)nofault)) {
nofault = (int *)0;
@@ -1072,56 +1031,15 @@ badladdr(addr)
void
netintr()
{
-#ifdef INET
-#if NETHER
- if (netisr & (1 << NETISR_ARP)) {
- netisr &= ~(1 << NETISR_ARP);
- arpintr();
- }
-#endif
- if (netisr & (1 << NETISR_IP)) {
- netisr &= ~(1 << NETISR_IP);
- ipintr();
- }
-#endif
-#ifdef INET6
- if (netisr & (1 << NETISR_IPV6)) {
- netisr &= ~(1 << NETISR_IPV6);
- ip6intr();
- }
-#endif
-#ifdef NETATALK
- if (netisr & (1 << NETISR_ATALK)) {
- netisr &= ~(1 << NETISR_ATALK);
- atintr();
- }
-#endif
-#ifdef NS
- if (netisr & (1 << NETISR_NS)) {
- netisr &= ~(1 << NETISR_NS);
- nsintr();
- }
-#endif
-#ifdef ISO
- if (netisr & (1 << NETISR_ISO)) {
- netisr &= ~(1 << NETISR_ISO);
- clnlintr();
- }
-#endif
-#include "ppp.h"
-#if NPPP > 0
- if (netisr & (1 << NETISR_PPP)) {
- netisr &= ~(1 << NETISR_PPP);
- pppintr();
- }
-#endif
-#include "bridge.h"
-#if NBRIDGE > 0
- if (netisr & (1 << NETISR_BRIDGE)) {
- netisr &= ~(1 << NETISR_BRIDGE);
- bridgeintr();
- }
-#endif
+#define DONETISR(bit, fn) \
+ do { \
+ if (netisr & (1 << (bit))) { \
+ netisr &= ~(1 << (bit)); \
+ (fn)(); \
+ } \
+ } while (0)
+#include <net/netisr_dispatch.h>
+#undef DONETISR
}
/*
@@ -1135,10 +1053,10 @@ nmihand(frame)
{
static int nmihanddeep = 0;
- if (nmihanddeep++)
+ if (nmihanddeep)
return;
-/* regdump(&(frame.F_t), 128);
- dumptrace(); */
+ nmihanddeep = 1;
+
#ifdef DIAGNOSTIC
printf("Panic switch: PC is 0x%x.\n", frame.f_pc);
#endif
@@ -1146,6 +1064,7 @@ nmihand(frame)
if (db_console)
Debugger();
#endif
+
nmihanddeep = 0;
}
@@ -1225,8 +1144,8 @@ static char *envbuf = NULL;
/*
* getenvvars: Grab a few useful variables
*/
-void getenvvars(u_long, char *);
-static long getenv(char *);
+void getenvvars(u_long, char *);
+long getenv(char *);
void
getenvvars(flag, buf)
@@ -1302,11 +1221,13 @@ getenvvars(flag, buf)
/*
* Get end of symbols for kernel debugging
*/
+#if defined(DDB) || NKSYMS > 0
esym = getenv("END_SYM");
#ifndef SYMTAB_SPACE
if (esym == 0)
#endif
esym = (long) &end;
+#endif
/* Get MacOS time */
macos_boottime = getenv("BOOTTIME");
@@ -1332,9 +1253,9 @@ getenvvars(flag, buf)
mrg_ADBIntrPtr = (caddr_t)getenv("ADBINTERRUPT");
}
-static char toupper(char);
+char toupper(char);
-static char
+char
toupper(c)
char c;
{
@@ -1345,7 +1266,7 @@ toupper(c)
}
}
-static long
+long
getenv(str)
char *str;
{
@@ -1470,7 +1391,7 @@ getenv(str)
*
* Bob Nestor - <rnestor@metronet.com>
*/
-static romvec_t romvecs[] =
+romvec_t romvecs[] =
{
/* Vectors verified for II, IIx, IIcx, SE/30 */
{ /* 0 */
@@ -2059,7 +1980,6 @@ static romvec_t romvecs[] =
/* Please fill these in! -BG */
};
-
struct cpu_model_info cpu_models[] = {
/* The first four. */
@@ -2343,9 +2263,9 @@ identifycpu()
#endif
}
-static void get_machine_info(void);
+void get_machine_info(void);
-static void
+void
get_machine_info()
{
int i;
@@ -2629,7 +2549,7 @@ mac68k_set_io_offsets(base)
}
#if GRAYBARS
-static u_long gray_nextaddr = 0;
+u_long gray_nextaddr = 0;
void
gray_bar()
@@ -2678,7 +2598,7 @@ extern int get_pte(u_int addr, u_long pte[2], u_short * psr);
* to look through MacOS page tables.
*/
-static u_long
+u_long
get_physical(u_int addr, u_long * phys)
{
u_long pte[2], ph, mask;
@@ -2734,9 +2654,9 @@ get_physical(u_int addr, u_long * phys)
return 1;
}
-static void check_video(char *, u_long, u_long);
+void check_video(char *, u_long, u_long);
-static void
+void
check_video(id, limit, maxm)
char *id;
u_long limit, maxm;
@@ -2765,9 +2685,11 @@ check_video(id, limit, maxm)
mac68k_vidlen += 32768;
addr += 32768;
}
+#ifdef DIAGNOSTIC
printf(" %s internal video at addr 0x%x (phys 0x%x), ",
id, mac68k_vidlog, mac68k_vidphys);
printf("len 0x%x.\n", mac68k_vidlen);
+#endif
}
}
@@ -2802,7 +2724,7 @@ get_mapping(void)
high[numranges - 1] = phys + NBPG;
}
}
-#if 1
+#ifdef DIAGNOSTIC
printf("System RAM: %ld bytes in %ld pages.\n", addr, addr / NBPG);
for (i = 0; i < numranges; i++) {
printf(" Low = 0x%lx, high = 0x%lx\n", low[i], high[i]);
@@ -2815,8 +2737,10 @@ get_mapping(void)
* setmachdep() (by using intvid_info[]). Tell the user
* what we know.
*/
+#ifdef DIAGNOSTIC
printf("On-board video at addr 0x%x (phys 0x%x), len 0x%x.\n",
mac68k_vidlog, mac68k_vidphys, mac68k_vidlen);
+#endif
} else {
/*
* We should now look through all of NuBus space to find where
@@ -2911,7 +2835,9 @@ get_mapping(void)
21888, 21888);
} else if (0x60000000 <= videoaddr &&
videoaddr < 0x70000000) {
+#ifdef DIAGNOSTIC
printf("Checking for Internal Video ");
+#endif
/*
* Kludge for IIvx internal video (60b0 0000).
* PB 520 (6000 0000)
@@ -2933,15 +2859,19 @@ get_mapping(void)
check_video("AV video (0x50100100)",
1 * 1024 * 1024, 1 * 1024 * 1024);
} else {
+#ifdef DIAGNOSTIC
printf( " no internal video at address 0 -- "
"videoaddr is 0x%lx.\n", videoaddr);
+#endif
}
} else {
+#ifdef DIAGNOSTIC
printf(" Video address = 0x%lx\n", videoaddr);
printf(" Int video starts at 0x%x\n",
mac68k_vidlog);
printf(" Length = 0x%x (%d) bytes\n",
mac68k_vidlen, mac68k_vidlen);
+#endif
}
}
diff --git a/sys/arch/mac68k/mac68k/pmap_bootstrap.c b/sys/arch/mac68k/mac68k/pmap_bootstrap.c
index 0f8b35dc862..7fa50d88db2 100644
--- a/sys/arch/mac68k/mac68k/pmap_bootstrap.c
+++ b/sys/arch/mac68k/mac68k/pmap_bootstrap.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: pmap_bootstrap.c,v 1.22 2002/04/16 20:54:47 miod Exp $ */
+/* $OpenBSD: pmap_bootstrap.c,v 1.23 2002/04/27 01:52:13 miod Exp $ */
/* $NetBSD: pmap_bootstrap.c,v 1.50 1999/04/07 06:14:33 scottr Exp $ */
/*
@@ -242,19 +242,6 @@ bootstrap_mac68k(tc)
}
nextpa = load_addr + round_page((vaddr_t)esym);
-#if MFS
- if (boothowto & RB_MINIROOT) {
- int v;
- boothowto |= RB_DFLTROOT;
- nextpa = round_page(nextpa);
- if ((v = mfs_initminiroot((caddr_t) nextpa-load_addr)) == 0) {
- printf("Error loading miniroot.\n");
- }
- printf("Loaded %d byte miniroot.\n", v);
- nextpa += v;
- }
-#endif
-
if (mac68k_machine.do_graybars)
printf("Bootstrapping the pmap system.\n");
@@ -302,9 +289,9 @@ pmap_init_md()
* Mark as unavailable the regions which we have mapped in
* pmap_bootstrap().
*/
- addr = (vaddr_t)IOBase;
+ addr = (vaddr_t)MACHINE_INTIOBASE;
if (uvm_map(kernel_map, &addr,
- m68k_ptob(IIOMAPSIZE + ROMMAPSIZE + VIDMAPSIZE),
+ m68k_ptob(MACHINE_IIOMAPSIZE),
NULL, UVM_UNKNOWN_OFFSET, 0,
UVM_MAPFLAG(UVM_PROT_NONE, UVM_PROT_NONE,
UVM_INH_NONE, UVM_ADV_RANDOM,
diff --git a/sys/arch/mac68k/mac68k/sys_machdep.c b/sys/arch/mac68k/mac68k/sys_machdep.c
index 486f01fef6c..27952d4543f 100644
--- a/sys/arch/mac68k/mac68k/sys_machdep.c
+++ b/sys/arch/mac68k/mac68k/sys_machdep.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: sys_machdep.c,v 1.6 2002/03/14 01:26:36 millert Exp $ */
+/* $OpenBSD: sys_machdep.c,v 1.7 2002/04/27 01:52:13 miod Exp $ */
/* $NetBSD: sys_machdep.c,v 1.9 1996/05/05 06:18:58 briggs Exp $ */
/*
@@ -83,6 +83,8 @@
#include <sys/buf.h>
#include <sys/mount.h>
+#include <uvm/uvm_extern.h>
+
#include <sys/syscallargs.h>
#include <machine/cpu.h>
@@ -94,19 +96,98 @@
#define CC_EXTPURGE 0x80000000
/* XXX end should be */
-int cachectl(int, caddr_t, int);
-void DCIU(void);
-void ICIA(void);
+int cachectl(int, vaddr_t, int);
/*ARGSUSED1*/
int
cachectl(req, addr, len)
int req;
- caddr_t addr;
+ vaddr_t addr;
int len;
{
int error = 0;
+#if defined(M68040)
+ if (mmutype == MMU_68040) {
+ int inc = 0;
+ int doall = 0;
+ paddr_t pa = 0;
+ vaddr_t end = 0;
+
+ if (addr == 0 ||
+ ((req & ~CC_EXTPURGE) != CC_PURGE && len > 2*NBPG))
+ doall = 1;
+
+ if (!doall) {
+ end = addr + len;
+ if (len <= 1024) {
+ addr = addr & ~0xF;
+ inc = 16;
+ } else {
+ addr = addr & ~PGOFSET;
+ inc = NBPG;
+ }
+ }
+ do {
+ /*
+ * Convert to physical address if needed.
+ * If translation fails, we perform operation on
+ * entire cache (XXX is this a rational thing to do?)
+ */
+ if (!doall &&
+ (pa == 0 || ((int)addr & PGOFSET) == 0)) {
+ if (pmap_extract(
+ curproc->p_vmspace->vm_map.pmap,
+ addr, &pa) == FALSE)
+ doall = 1;
+ }
+ switch (req) {
+ case CC_EXTPURGE|CC_IPURGE:
+ case CC_IPURGE:
+ if (doall) {
+ DCFA();
+ ICPA();
+ } else if (inc == 16) {
+ DCFL(pa);
+ ICPL(pa);
+ } else if (inc == NBPG) {
+ DCFP(pa);
+ ICPP(pa);
+ }
+ break;
+
+ case CC_EXTPURGE|CC_PURGE:
+ case CC_PURGE:
+ if (doall)
+ DCFA(); /* note: flush not purge */
+ else if (inc == 16)
+ DCPL(pa);
+ else if (inc == NBPG)
+ DCPP(pa);
+ break;
+
+ case CC_EXTPURGE|CC_FLUSH:
+ case CC_FLUSH:
+ if (doall)
+ DCFA();
+ else if (inc == 16)
+ DCFL(pa);
+ else if (inc == NBPG)
+ DCFP(pa);
+ break;
+
+ default:
+ error = EINVAL;
+ break;
+ }
+ if (doall)
+ break;
+ pa += inc;
+ addr += inc;
+ } while (addr < end);
+ return(error);
+ }
+#endif
switch (req) {
case CC_EXTPURGE|CC_PURGE:
case CC_EXTPURGE|CC_FLUSH:
@@ -127,13 +208,14 @@ cachectl(req, addr, len)
return(error);
}
-int sys_sysarch(p, v, retval)
+int
+sys_sysarch(p, v, retval)
struct proc *p;
void *v;
register_t *retval;
{
-#if 0
- struct sysarch_args /* {
+#if 0 /* unused */
+ struct sys_sysarch_args /* {
syscallarg(int) op;
syscallarg(char *) parms;
} */ *uap = v;
diff --git a/sys/arch/mac68k/mac68k/trap.c b/sys/arch/mac68k/mac68k/trap.c
index 87709b31667..ce27b71adf7 100644
--- a/sys/arch/mac68k/mac68k/trap.c
+++ b/sys/arch/mac68k/mac68k/trap.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: trap.c,v 1.35 2002/03/14 01:26:36 millert Exp $ */
+/* $OpenBSD: trap.c,v 1.36 2002/04/27 01:52:13 miod Exp $ */
/* $NetBSD: trap.c,v 1.68 1998/12/22 08:47:07 scottr Exp $ */
/*
@@ -237,9 +237,6 @@ trap(type, code, v, frame)
struct frame frame;
{
extern char fubail[], subail[];
-#ifdef DDB
- extern char trap0[], trap1[], trap2[], trap12[], trap15[], illinst[];
-#endif
struct proc *p;
int i, s;
u_int ucode;
@@ -251,13 +248,6 @@ trap(type, code, v, frame)
p = curproc;
ucode = 0;
- if (USERMODE(frame.f_sr)) {
- type |= T_USER;
- sticks = p->p_sticks;
- p->p_md.md_regs = frame.f_regs;
- } else
- sticks = 0;
-
/* I have verified that this DOES happen! -gwr */
if (p == NULL)
p = &proc0;
@@ -267,9 +257,16 @@ trap(type, code, v, frame)
type, code, v);
#endif
+ if (USERMODE(frame.f_sr)) {
+ type |= T_USER;
+ sticks = p->p_sticks;
+ p->p_md.md_regs = frame.f_regs;
+ } else
+ sticks = 0;
+
switch (type) {
default:
- dopanic:
+dopanic:
printf("trap type %d, code = 0x%x, v = 0x%x\n", type, code, v);
printf("%s program counter = 0x%x\n",
(type & T_USER) ? "user" : "kernel", frame.f_pc);
@@ -288,7 +285,7 @@ trap(type, code, v, frame)
(void)kdb_trap(type, (db_regs_t *)&frame);
#endif
#ifdef KGDB
- kgdb_cont;
+kgdb_cont:
#endif
splx(s);
if (panicstr) {
@@ -355,7 +352,9 @@ copyfault:
case T_CHKINST|T_USER: /* CHK instruction trap */
ucode = frame.f_format;
+ type = FPE_FLTSUB;
i = SIGFPE;
+ v = frame.f_pc;
break;
case T_TRAPVINST|T_USER: /* TRAPV instruction trap */
@@ -461,27 +460,11 @@ copyfault:
* XXX: We should never get kernel-mode T_TRACE or T_TRAP15
* XXX: because locore.s now gives them special treatment.
*/
- case T_TRACE: /* Kernel trace trap */
- case T_TRAP15: /* SUN trace trap */
-#ifdef DDB
- if (type == T_TRAP15 ||
- ((caddr_t) frame.f_pc != trap0 &&
- (caddr_t) frame.f_pc != trap1 &&
- (caddr_t) frame.f_pc != trap2 &&
- (caddr_t) frame.f_pc != trap12 &&
- (caddr_t) frame.f_pc != trap15 &&
- (caddr_t) frame.f_pc != illinst)) {
- if (kdb_trap(type, (db_regs_t *) &frame))
- return;
- }
-#endif
+ case T_TRAP15: /* kernel breakpoint */
frame.f_sr &= ~PSL_T;
- i = SIGTRAP;
- typ = TRAP_TRACE;
- break;
+ return;
case T_TRACE|T_USER: /* user trace trap */
- case T_TRAP15|T_USER: /* Sun user trace trap */
#ifdef COMPAT_SUNOS
/*
* SunOS uses Trap #2 for a "CPU cache flush"
@@ -495,6 +478,9 @@ copyfault:
return;
}
#endif
+ /* FALLTHROUGH */
+ case T_TRACE: /* Kernel trace trap */
+ case T_TRAP15|T_USER: /* Sun user trace trap */
frame.f_sr &= ~PSL_T;
i = SIGTRAP;
typ = TRAP_TRACE;
@@ -514,7 +500,7 @@ copyfault:
* IPL while processing the SIR.
*/
spl1();
- /* fall into... */
+ /* FALLTHROUGH */
case T_SSIR: /* Software interrupt */
case T_SSIR|T_USER:
@@ -656,10 +642,8 @@ copyfault:
break;
}
}
- if (i) {
- sv.sival_ptr = (void *)v;
- trapsignal(p, i, ucode, typ, sv);
- }
+ sv.sival_ptr = (void *)v;
+ trapsignal(p, i, ucode, typ, sv);
if ((type & T_USER) == 0)
return;
out:
@@ -684,7 +668,7 @@ char wberrstr[] =
"WARNING: pid %d(%s) writeback [%s] failed, pc=%x fa=%x wba=%x wbd=%x\n";
#endif
-static int
+int
writeback(fp, docachepush)
struct frame *fp;
int docachepush;
@@ -925,7 +909,7 @@ writeback(fp, docachepush)
}
#ifdef DEBUG
-static void
+void
dumpssw(ssw)
u_short ssw;
{
@@ -952,7 +936,6 @@ dumpssw(ssw)
f7tm[ssw & SSW4_TMMASK]);
}
-static
void
dumpwb(num, s, a, d)
int num;
@@ -1100,7 +1083,7 @@ syscall(code, frame)
/* nothing to do */
break;
default:
- bad:
+bad:
if (p->p_emul->e_errno)
error = p->p_emul->e_errno[error];
frame.f_regs[D0] = error;
diff --git a/sys/arch/mac68k/mac68k/vm_machdep.c b/sys/arch/mac68k/mac68k/vm_machdep.c
index 0fe63089041..a3e95079f8a 100644
--- a/sys/arch/mac68k/mac68k/vm_machdep.c
+++ b/sys/arch/mac68k/mac68k/vm_machdep.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: vm_machdep.c,v 1.29 2002/03/14 01:26:36 millert Exp $ */
+/* $OpenBSD: vm_machdep.c,v 1.30 2002/04/27 01:52:13 miod Exp $ */
/* $NetBSD: vm_machdep.c,v 1.29 1998/07/28 18:34:55 thorpej Exp $ */
/*
@@ -88,17 +88,22 @@ cpu_fork(p1, p2, stack, stacksize, func, arg)
p2->p_md.md_flags = p1->p_md.md_flags;
- /* Sync curpcb (which is presumably p1's PCB) and copy it to p2. */
- savectx(curpcb);
+ /* Copy pcb from proc p1 to p2. */
+ if (p1 == curproc) {
+ /* Sync the PCB before we copy it. */
+ savectx(curpcb);
+ }
+#ifdef DIAGNOSTIC
+ else if (p1 != &proc0)
+ panic("cpu_fork: curproc");
+#endif
*pcb = p1->p_addr->u_pcb;
/*
- * Copy the trap frame and arrange for the child to return directly
- * through return_to_user().
+ * Copy the trap frame.
*/
tf = (struct trapframe *)((u_int)p2->p_addr + USPACE) -1;
p2->p_md.md_regs = (int *)tf;
-
*tf = *(struct trapframe *)p1->p_md.md_regs;
/*
@@ -109,7 +114,6 @@ cpu_fork(p1, p2, stack, stacksize, func, arg)
sf = (struct switchframe *)tf - 1;
sf->sf_pc = (u_int)proc_trampoline;
-
pcb->pcb_regs[6] = (int)func; /* A2 */
pcb->pcb_regs[7] = (int)arg; /* A3 */
pcb->pcb_regs[11] = (int)sf; /* SSP */
@@ -124,7 +128,7 @@ void switch_exit(struct proc *);
* free our stack and user area and switch to another process.
* Thus, we never return.
*/
-volatile void
+void
cpu_exit(p)
struct proc *p;
{
@@ -132,7 +136,6 @@ cpu_exit(p)
(void)splhigh();
uvmexp.swtch++;
switch_exit(p);
- for(;;); /* Get rid of a compile warning */
/* NOTREACHED */
}
@@ -204,11 +207,11 @@ cpu_coredump(p, vp, cred, chdr)
error = vn_rdwr(UIO_WRITE, vp, (caddr_t)&md_core, sizeof(md_core),
(off_t)(chdr->c_hdrsize + chdr->c_seghdrsize), UIO_SYSSPACE,
IO_NODELOCKED|IO_UNIT, cred, NULL, p);
+ if (error)
+ return error;
- if (!error)
- chdr->c_nseg++;
-
- return error;
+ chdr->c_nseg++;
+ return 0;
}
/*
@@ -221,24 +224,23 @@ pagemove(from, to, size)
caddr_t from, to;
size_t size;
{
- vm_offset_t pa;
+ paddr_t pa;
+ boolean_t rv;
#ifdef DEBUG
- if (size % PAGE_SIZE)
+ if ((size & PAGE_MASK) != 0)
panic("pagemove");
#endif
while (size > 0) {
- pmap_extract(pmap_kernel(), (vm_offset_t) from, &pa);
+ rv = pmap_extract(pmap_kernel(), (vaddr_t)from, &pa);
#ifdef DEBUG
-#if 0
- if (pa == 0)
+ if (rv == FALSE)
panic("pagemove 2");
- if (pmap_extract(pmap_kernel(), (vm_offset_t)to, XXX) != 0)
+ if (pmap_extract(pmap_kernel(), (vaddr_t)to, NULL) == TRUE)
panic("pagemove 3");
#endif
-#endif
pmap_kremove((vaddr_t)from, PAGE_SIZE);
- pmap_kenter_pa((vaddr_t)to, pa, VM_PROT_READ|VM_PROT_WRITE);
+ pmap_kenter_pa((vaddr_t)to, pa, VM_PROT_READ | VM_PROT_WRITE);
from += PAGE_SIZE;
to += PAGE_SIZE;
size -= PAGE_SIZE;
@@ -292,7 +294,7 @@ kvtop(addr)
{
paddr_t pa;
- if (pmap_extract(pmap_kernel(), (vm_offset_t)addr, &pa) == FALSE)
+ if (pmap_extract(pmap_kernel(), (vaddr_t)addr, &pa) == FALSE)
panic("kvtop: zero page frame");
return((int)pa);
}
@@ -308,19 +310,21 @@ kvtop(addr)
void
vmapbuf(bp, len)
struct buf *bp;
- vm_size_t len;
+ vsize_t len;
{
struct pmap *upmap, *kpmap;
- vm_offset_t uva; /* User VA (map from) */
- vm_offset_t kva; /* Kernel VA (new to) */
- vm_offset_t pa; /* physical address */
- vm_size_t off;
+ vaddr_t uva; /* User VA (map from) */
+ vaddr_t kva; /* Kernel VA (new to) */
+ vaddr_t pa; /* physical address */
+ vsize_t off;
+#ifdef DIAGNOSTIC
if ((bp->b_flags & B_PHYS) == 0)
panic("vmapbuf");
+#endif
uva = trunc_page((vaddr_t)(bp->b_saveaddr = bp->b_data));
- off = (vm_offset_t)bp->b_data - uva;
+ off = (vaddr_t)bp->b_data - uva;
len = round_page(off + len);
kva = uvm_km_valloc_wait(phys_map, len);
bp->b_data = (caddr_t)(kva + off);
@@ -330,7 +334,8 @@ vmapbuf(bp, len)
do {
if (pmap_extract(upmap, uva, &pa) == FALSE)
panic("vmapbuf: null page frame");
- pmap_enter(kpmap, kva, pa, VM_PROT_READ|VM_PROT_WRITE, PMAP_WIRED);
+ pmap_enter(kpmap, kva, pa, VM_PROT_READ|VM_PROT_WRITE,
+ PMAP_WIRED);
uva += PAGE_SIZE;
kva += PAGE_SIZE;
len -= PAGE_SIZE;
@@ -344,22 +349,22 @@ vmapbuf(bp, len)
void
vunmapbuf(bp, len)
struct buf *bp;
- vm_size_t len;
+ vsize_t len;
{
- vm_offset_t kva;
- vm_size_t off;
+ vaddr_t kva;
+ vsize_t off;
+#ifdef DIAGNOSTIC
if ((bp->b_flags & B_PHYS) == 0)
panic("vunmapbuf");
+#endif
kva = trunc_page((vaddr_t)bp->b_data);
- off = (vm_offset_t)bp->b_data - kva;
+ off = (vaddr_t)bp->b_data - kva;
len = round_page(off + len);
- /*
- * pmap_remove() is unnecessary here, as kmem_free_wakeup()
- * will do it for us.
- */
+ pmap_remove(vm_map_pmap(phys_map), kva, kva + len);
+ pmap_update(pmap_kernel());
uvm_km_free_wakeup(phys_map, kva, len);
bp->b_data = bp->b_saveaddr;
bp->b_saveaddr = 0;