1 /* $NetBSD: machdep.c,v 1.9 2024/09/25 09:39:11 rin 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 77 static void dumpmem(int *, int, int); 78 79 void 80 straytrap(int addr) 81 { 82 83 printf("stray trap, addr 0x%x\n", addr); 84 } 85 86 int *nofault = 0; 87 88 int 89 badaddr(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 107 void 108 regdump(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 145 /* 146 * XXXGCC12 147 * Dereference to `(int *)(&rp) - 1` (SR in H/W exception frame) is 148 * blamed by GCC12 and later. Just silence as done for m68k/regdump.c. 149 */ 150 #pragma GCC diagnostic push 151 #pragma GCC diagnostic ignored "-Warray-bounds" 152 153 printf("\n\nKernel stack (%s):", 154 hexstr((int)(((int *)&rp) - 1), 8)); 155 dumpmem(((int *)&rp) - 1, sbytes, 0); 156 157 #pragma GCC diagnostic pop 158 159 #if 0 160 } else { 161 printf("\n\nUser stack (%s):", hexstr(rp[SP], 8)); 162 dumpmem((int *)rp[SP], sbytes, 1); 163 } 164 #endif 165 } 166 doingdump = 0; 167 splx(s); 168 } 169 170 /* #define KSADDR ((int *)&(((char *)&u)[(UPAGES-1)*NBPG])) */ 171 172 static void 173 dumpmem(int *ptr, int sz, int ustack) 174 { 175 int i, val; 176 177 for (i = 0; i < sz; i++) { 178 if ((i & 7) == 0) 179 printf("\n%s: ", hexstr((int)ptr, 6)); 180 else 181 printf(" "); 182 #if 0 183 if (ustack == 1) { 184 if (ufetch_int((void *)(ptr++), (u_int *)&val) != 0) 185 break; 186 } else { 187 if (ustack == 0 && 188 (ptr < KSADDR || ptr > KSADDR+(NBPG/4-1))) 189 break; 190 #endif 191 val = *ptr++; 192 #if 0 193 } 194 #endif 195 printf("%s", hexstr(val, 8)); 196 } 197 printf("\n"); 198 } 199 200 char * 201 hexstr(int val, int len) 202 { 203 static char nbuf[9]; 204 int x, i; 205 206 if (len > 8) 207 return ""; 208 nbuf[len] = '\0'; 209 for (i = len-1; i >= 0; --i) { 210 x = val & 0xF; 211 if (x > 9) 212 nbuf[i] = x - 10 + 'A'; 213 else 214 nbuf[i] = x + '0'; 215 val >>= 4; 216 } 217 return nbuf; 218 } 219