1/* $NetBSD: machdep.c,v 1.8 2019/10/27 11:21:52 martin Exp $ */ 2 3/* 4 * Copyright (c) 1992 OMRON Corporation. 5 * 6 * This code is derived from software contributed to Berkeley by 7 * OMRON Corporation. 8 * 9 * Redistribution and use in source and binary forms, with or without 10 * modification, are permitted provided that the following conditions 11 * are met: 12 * 1. Redistributions of source code must retain the above copyright 13 * notice, this list of conditions and the following disclaimer. 14 * 2. Redistributions in binary form must reproduce the above copyright 15 * notice, this list of conditions and the following disclaimer in the 16 * documentation and/or other materials provided with the distribution. 17 * 3. All advertising materials mentioning features or use of this software 18 * must display the following acknowledgement: 19 * This product includes software developed by the University of 20 * California, Berkeley and its contributors. 21 * 4. Neither the name of the University nor the names of its contributors 22 * may be used to endorse or promote products derived from this software 23 * without specific prior written permission. 24 * 25 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 26 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 27 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 28 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 29 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 30 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 31 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 32 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 33 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 34 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 35 * SUCH DAMAGE. 36 * 37 * @(#)machdep.c 8.1 (Berkeley) 6/10/93 38 */ 39/* 40 * Copyright (c) 1992, 1993 41 * The Regents of the University of California. All rights reserved. 42 * 43 * This code is derived from software contributed to Berkeley by 44 * OMRON Corporation. 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.1 (Berkeley) 6/10/93 71 */ 72 73#include <sys/param.h> 74#include <luna68k/include/reg.h> 75#include <luna68k/stand/boot/samachdep.h> 76 77static void dumpmem(int *, int, int); 78 79void 80straytrap(int addr) 81{ 82 83 printf("stray trap, addr 0x%x\n", addr); 84} 85 86int *nofault = 0; 87 88int 89badaddr(volatile void *addr) 90{ 91 label_t faultbuf; 92 93#ifdef lint 94 int i; 95 i = *addr; if (i) return 0; 96#endif 97 nofault = (int *)&faultbuf; 98 if (setjmp((label_t *)nofault)) { 99 nofault = NULL; 100 return 1; 101 } 102 (void)*(volatile short *)addr; 103 nofault = NULL; 104 return 0; 105} 106 107void 108regdump(int *rp /* must not be register */, int sbytes) 109{ 110 static int doingdump = 0; 111 int i; 112 int s; 113 114 if (doingdump) 115 return; 116 s = splhigh(); 117 doingdump = 1; 118#if 0 119 printf("pid = %d, pc = %s, ", u.u_procp->p_pid, hexstr(rp[PC], 8)); 120#endif 121 printf("pc = %s, ", hexstr(rp[PC], 8)); 122 printf("ps = %s, ", hexstr(rp[PS], 4)); 123 printf("sfc = %s, ", hexstr(getsfc(), 4)); 124 printf("dfc = %s\n", hexstr(getdfc(), 4)); 125#if 0 126 printf("p0 = %x@%s, ", 127 u.u_pcb.pcb_p0lr, hexstr((int)u.u_pcb.pcb_p0br, 8)); 128 printf("p1 = %x@%s\n\n", 129 u.u_pcb.pcb_p1lr, hexstr((int)u.u_pcb.pcb_p1br, 8)); 130#endif 131 printf("Registers:\n "); 132 for (i = 0; i < 8; i++) 133 printf(" %d", i); 134 printf("\ndreg:"); 135 for (i = 0; i < 8; i++) 136 printf(" %s", hexstr(rp[i], 8)); 137 printf("\nareg:"); 138 for (i = 0; i < 8; i++) 139 printf(" %s", hexstr(rp[i+8], 8)); 140 if (sbytes > 0) { 141#if 0 142 if (rp[PS] & PSL_S) { 143#endif 144 printf("\n\nKernel stack (%s):", 145 hexstr((int)(((int *)&rp) - 1), 8)); 146 dumpmem(((int *)&rp) - 1, sbytes, 0); 147#if 0 148 } else { 149 printf("\n\nUser stack (%s):", hexstr(rp[SP], 8)); 150 dumpmem((int *)rp[SP], sbytes, 1); 151 } 152#endif 153 } 154 doingdump = 0; 155 splx(s); 156} 157 158/* #define KSADDR ((int *)&(((char *)&u)[(UPAGES-1)*NBPG])) */ 159 160static void 161dumpmem(int *ptr, int sz, int ustack) 162{ 163 int i, val; 164 165 for (i = 0; i < sz; i++) { 166 if ((i & 7) == 0) 167 printf("\n%s: ", hexstr((int)ptr, 6)); 168 else 169 printf(" "); 170#if 0 171 if (ustack == 1) { 172 if (ufetch_int((void *)(ptr++), (u_int *)&val) != 0) 173 break; 174 } else { 175 if (ustack == 0 && 176 (ptr < KSADDR || ptr > KSADDR+(NBPG/4-1))) 177 break; 178#endif 179 val = *ptr++; 180#if 0 181 } 182#endif 183 printf("%s", hexstr(val, 8)); 184 } 185 printf("\n"); 186} 187 188char * 189hexstr(int val, int len) 190{ 191 static char nbuf[9]; 192 int x, i; 193 194 if (len > 8) 195 return ""; 196 nbuf[len] = '\0'; 197 for (i = len-1; i >= 0; --i) { 198 x = val & 0xF; 199 if (x > 9) 200 nbuf[i] = x - 10 + 'A'; 201 else 202 nbuf[i] = x + '0'; 203 val >>= 4; 204 } 205 return nbuf; 206} 207