|
|
1.1 root 1: /*
2: * Copyright (c) 2000 Apple Computer, Inc. All rights reserved.
3: *
4: * @APPLE_LICENSE_HEADER_START@
5: *
6: * The contents of this file constitute Original Code as defined in and
7: * are subject to the Apple Public Source License Version 1.1 (the
8: * "License"). You may not use this file except in compliance with the
9: * License. Please obtain a copy of the License at
10: * http://www.apple.com/publicsource and read it before using this file.
11: *
12: * This Original Code and all software distributed under the License are
13: * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
14: * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
15: * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
16: * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the
17: * License for the specific language governing rights and limitations
18: * under the License.
19: *
20: * @APPLE_LICENSE_HEADER_END@
21: */
22: /*
23: * @OSF_FREE_COPYRIGHT@
24: */
25: /*
26: * @APPLE_FREE_COPYRIGHT@
27: */
28:
29: /*
30: * Author: Bill Angell, Apple
31: * Date: 6/97
32: *
33: * exceptions and certain C functions write into a trace table which
34: * can be examined via the machine 'lt' command under kdb
35: */
36:
37:
38: #include <string.h> /* For strcpy() */
39: #include <mach/boolean.h>
40: #include <machine/db_machdep.h>
41:
42: #include <ddb/db_access.h>
43: #include <ddb/db_lex.h>
44: #include <ddb/db_output.h>
45: #include <ddb/db_command.h>
46: #include <ddb/db_sym.h>
47: #include <ddb/db_task_thread.h>
48: #include <ddb/db_command.h> /* For db_option() */
49: #include <ddb/db_examine.h>
50: #include <ddb/db_expr.h>
51: #include <kern/thread.h>
52: #include <kern/task.h>
53: #include <mach/vm_param.h>
54: #include <ppc/Firmware.h>
55: #include <ppc/low_trace.h>
56: #include <ppc/db_low_trace.h>
57: #include <ppc/mappings.h>
58: #include <ppc/pmap.h>
59: #include <ppc/mem.h>
60: #include <ppc/pmap_internals.h>
61: #include <ppc/savearea.h>
62:
63: void db_dumpphys(struct phys_entry *pp); /* Dump from physent */
64: void db_dumppca(struct mapping *mp); /* PCA */
65: void db_dumpmapping(struct mapping *mp); /* Dump out a mapping */
66:
67: db_addr_t db_low_trace_prev = 0;
68:
69: /*
70: * Print out the low level trace table:
71: *
72: * Displays the entry and 15 before it in newest to oldest order
73: *
74: * lt [entaddr]
75:
76: * If entaddr is omitted, it starts with the most current
77: * If entaddr = 0, it starts with the most current and does the whole table
78: */
79: void db_low_trace(db_expr_t addr, int have_addr, db_expr_t count, char * modif) {
80:
81: int c, i;
82: unsigned int tempx, cnt;
83: unsigned int xbuf[8];
84: unsigned int xTraceCurr, xTraceStart, xTraceEnd, cxltr, xxltr;
85: db_addr_t next_addr;
86: LowTraceRecord xltr;
87: unsigned char cmark;
88:
89: cnt = 16; /* Default to 16 entries */
90:
91: ReadReal(((unsigned int)&traceCurr)&0x00000FFF, &xbuf[0]); /* Get trace pointers (it's been moved to page 0) */
92: xTraceCurr=xbuf[0]; /* Transfer current pointer */
93: xTraceStart=xbuf[1]; /* Transfer start of table */
94: xTraceEnd=xbuf[2]; /* Transfer end of table */
95:
96: if(addr == -1) cnt = 0x7FFFFFFF; /* Max the count */
97:
98: if(!addr || (addr == -1)) {
99: addr=xTraceCurr-sizeof(LowTraceRecord); /* Start at the newest */
100: if((unsigned int)addr<xTraceStart) addr=xTraceEnd-sizeof(LowTraceRecord); /* Wrap low back to high */
101: }
102:
103: if((unsigned int)addr<xTraceStart||(unsigned int)addr>=xTraceEnd) { /* In the table? */
104: db_printf("address not in low memory trace table\n"); /* Tell the fool */
105: return; /* Leave... */
106: }
107:
108: if((unsigned int)addr&0x0000003F) { /* Proper alignment? */
109: db_printf("address not aligned on trace entry boundary (0x40)\n"); /* Tell 'em */
110: return; /* Leave... */
111: }
112:
113: xxltr=(unsigned int)addr; /* Set the start */
114: cxltr=((xTraceCurr==xTraceStart ? xTraceEnd : xTraceCurr)-sizeof(LowTraceRecord)); /* Get address of newest entry */
115:
116: db_low_trace_prev = addr; /* Starting point */
117:
118: for(i=0; i < cnt; i++) { /* Dump the 16 (or all) entries */
119:
120: ReadReal(xxltr, (unsigned int *)&xltr); /* Get the first half */
121: ReadReal(xxltr+32, &(((unsigned int *)&xltr)[8])); /* Get the second half */
122:
123: db_printf("\n%s%08X %1X %08X %08X - %04X\n", (xxltr!=cxltr ? " " : "*"),
124: xxltr,
125: xltr.LTR_cpu, xltr.LTR_timeHi, xltr.LTR_timeLo,
126: (xltr.LTR_excpt&0x8000 ? 0xFFFF : xltr.LTR_excpt*64)); /* Print the first line */
127: db_printf(" %08X %08X %08X %08X %08X %08X %08X\n",
128: xltr.LTR_cr, xltr.LTR_srr0, xltr.LTR_srr1, xltr.LTR_dar, xltr.LTR_save, xltr.LTR_lr, xltr.LTR_ctr);
129: db_printf(" %08X %08X %08X %08X %08X %08X\n",
130: xltr.LTR_r0, xltr.LTR_r1, xltr.LTR_r2, xltr.LTR_r3, xltr.LTR_r4, xltr.LTR_r5);
131:
132: if((cnt != 16) && (xxltr == xTraceCurr)) break; /* If whole table dump, exit when we hit start again... */
133:
134: xxltr-=sizeof(LowTraceRecord); /* Back it on up */
135: if(xxltr<xTraceStart)
136: xxltr=(xTraceEnd-sizeof(LowTraceRecord)); /* Wrap low back to high */
137:
138: }
139: db_next = (db_expr_t)(xxltr);
140: return;
141: }
142:
143:
144: /*
145: * Print out 256 bytes
146: *
147: *
148: * dl [entaddr]
149: */
150: void db_display_long(db_expr_t addr, int have_addr, db_expr_t count, char * modif) {
151:
152: int i;
153:
154: for(i=0; i<8; i++) { /* Print 256 bytes */
155: db_printf("%08X %08X %08X %08X %08X %08X %08X %08X %08X\n", addr, /* Print a line */
156: ((unsigned long *)addr)[0], ((unsigned long *)addr)[1], ((unsigned long *)addr)[2], ((unsigned long *)addr)[3],
157: ((unsigned long *)addr)[4], ((unsigned long *)addr)[5], ((unsigned long *)addr)[6], ((unsigned long *)addr)[7]);
158: addr=(db_expr_t)((unsigned int)addr+0x00000020); /* Point to next address */
159: }
160: db_next = addr;
161:
162:
163: }
164:
165: /*
166: * Print out 256 bytes of real storage
167: *
168: * Displays the entry and 15 before it in newest to oldest order
169: *
170: * dr [entaddr]
171: */
172: void db_display_real(db_expr_t addr, int have_addr, db_expr_t count, char * modif) {
173:
174: int i;
175: unsigned int xbuf[8];
176:
177: for(i=0; i<8; i++) { /* Print 256 bytes */
178: ReadReal((unsigned int)addr, &xbuf[0]); /* Get the real storage data */
179: db_printf("%08X %08X %08X %08X %08X %08X %08X %08X %08X\n", addr, /* Print a line */
180: xbuf[0], xbuf[1], xbuf[2], xbuf[3],
181: xbuf[4], xbuf[5], xbuf[6], xbuf[7]);
182: addr=(db_expr_t)((unsigned int)addr+0x00000020); /* Point to next address */
183: }
184: db_next = addr;
185:
186:
187: }
188:
189: unsigned int dvspace = 0;
190:
191: /*
192: * Print out virtual to real translation information
193: *
194: *
195: * dm vaddr [space] (defaults to last entered)
196: */
197: void db_display_mappings(db_expr_t addr, int have_addr, db_expr_t count, char * modif) {
198:
199: int i;
200: unsigned int xspace;
201:
202: mapping *mp, *mpv;
203: vm_offset_t pa;
204:
205: if (db_expression(&xspace)) dvspace = xspace; /* Get the space or set default */
206:
207: db_printf("mapping information for %08X in space %08X:\n", addr, dvspace);
208: mp = hw_lock_phys_vir(dvspace, addr); /* Lock the physical entry for this mapping */
209: if(!mp) { /* Did we find one? */
210: db_printf("Not mapped\n");
211: return; /* Didn't find any, return FALSE... */
212: }
213: if((unsigned int)mp&1) { /* Did we timeout? */
214: db_printf("Timeout locking physical entry for virtual address (%08X)\n", addr); /* Yeah, scream about it! */
215: return; /* Bad hair day, return FALSE... */
216: }
217: printf("dumpaddr: space=%08X; vaddr=%08X\n", dvspace, addr); /* Say what address were dumping */
218: mpv = hw_cpv(mp); /* Get virtual address of mapping */
219: dumpmapping(mpv);
220: if(mpv->physent) {
221: hw_unlock_bit((unsigned int *)&mpv->physent->phys_link, PHYS_LOCK); /* Unlock physical entry associated with mapping */
222: }
223: return; /* Tell them we did it */
224:
225:
226: }
227:
228: /*
229: * Prints out a mapping control block
230: *
231: */
232:
233: void db_dumpmapping(struct mapping *mp) { /* Dump out a mapping */
234:
235: db_printf("Dump of mapping block: %08X\n", mp); /* Header */
236: db_printf(" next: %08X\n", mp->next);
237: db_printf(" hashnext: %08X\n", mp->hashnext);
238: db_printf(" PTEhash: %08X\n", mp->PTEhash);
239: db_printf(" PTEent: %08X\n", mp->PTEent);
240: db_printf(" physent: %08X\n", mp->physent);
241: db_printf(" PTEv: %08X\n", mp->PTEv);
242: db_printf(" PTEr: %08X\n", mp->PTEr);
243: db_printf(" pmap: %08X\n", mp->pmap);
244:
245: if(mp->physent) { /* Print physent if it exists */
246: db_printf("Associated physical entry: %08X %08X\n", mp->physent->phys_link, mp->physent->pte1);
247: }
248: else {
249: db_printf("Associated physical entry: none\n");
250: }
251:
252: db_dumppca(mp); /* Dump out the PCA information */
253:
254: return;
255: }
256:
257: /*
258: * Prints out a PTEG control area
259: *
260: */
261:
262: void db_dumppca(struct mapping *mp) { /* PCA */
263:
264: PCA *pca;
265: unsigned int *pteg;
266:
267: pca = (PCA *)((unsigned int)mp->PTEhash&-64); /* Back up to the start of the PCA */
268: pteg=(unsigned int *)((unsigned int)pca-(((hash_table_base&0x0000FFFF)+1)<<16));
269: db_printf(" Dump of PCA: %08X\n", pca); /* Header */
270: db_printf(" PCAlock: %08X\n", pca->PCAlock);
271: db_printf(" PCAallo: %08X\n", pca->flgs.PCAallo);
272: db_printf(" PCAhash: %08X %08X %08X %08X\n", pca->PCAhash[0], pca->PCAhash[1], pca->PCAhash[2], pca->PCAhash[3]);
273: db_printf(" %08X %08X %08X %08X\n", pca->PCAhash[4], pca->PCAhash[5], pca->PCAhash[6], pca->PCAhash[7]);
274: db_printf("Dump of PTEG: %08X\n", pteg); /* Header */
275: db_printf(" %08X %08X %08X %08X\n", pteg[0], pteg[1], pteg[2], pteg[3]);
276: db_printf(" %08X %08X %08X %08X\n", pteg[4], pteg[5], pteg[6], pteg[7]);
277: db_printf(" %08X %08X %08X %08X\n", pteg[8], pteg[9], pteg[10], pteg[11]);
278: db_printf(" %08X %08X %08X %08X\n", pteg[12], pteg[13], pteg[14], pteg[15]);
279: return;
280: }
281:
282: /*
283: * Dumps starting with a physical entry
284: */
285:
286: void db_dumpphys(struct phys_entry *pp) { /* Dump from physent */
287:
288: mapping *mp;
289: PCA *pca;
290: unsigned int *pteg;
291:
292: db_printf("Dump from physical entry %08X: %08X %08X\n", pp, pp->phys_link, pp->pte1);
293: mp = hw_cpv(pp->phys_link);
294: while(mp) {
295: db_dumpmapping(mp);
296: db_dumppca(mp);
297: mp = hw_cpv(mp->next);
298: }
299:
300: return;
301: }
302:
303:
304: /*
305: * Print out 256 bytes of virtual storage
306: *
307: *
308: * dv [entaddr] [space]
309: * address must be on 32-byte boundary. It will be rounded down if not
310: */
311: void db_display_virtual(db_expr_t addr, int have_addr, db_expr_t count, char * modif) {
312:
313: int i, size, lines, rlines;
314: unsigned int xbuf[8];
315: unsigned int xspace;
316:
317: mapping *mp, *mpv;
318: vm_offset_t pa;
319:
320: if (db_expression(&xspace)) dvspace = xspace; /* Get the space or set default */
321:
322: addr&=-32;
323:
324: size = 4096 - (addr & 0x00000FFF); /* Bytes left on page */
325: lines = size / 32; /* Number of lines in first or only part */
326: if(lines > 8) lines = 8;
327: rlines = 8 - lines;
328: if(rlines < 0) lines = 0;
329:
330: db_printf("Dumping %08X (space=%08X); ", addr, dvspace);
331: mp = hw_lock_phys_vir(dvspace, addr); /* Lock the physical entry for this mapping */
332: if(!mp) { /* Did we find one? */
333: db_printf("Not mapped\n");
334: return; /* Didn't find any, return FALSE... */
335: }
336: if((unsigned int)mp&1) { /* Did we timeout? */
337: db_printf("Timeout locking physical entry for virtual address (%08X)\n", addr); /* Yeah, scream about it! */
338: return; /* Bad hair day, return FALSE... */
339: }
340: mpv = hw_cpv(mp); /* Get virtual address of mapping */
341: if(!mpv->physent) { /* Was there a physical entry? */
342: pa = (vm_offset_t)((mpv->PTEr & -PAGE_SIZE) | ((unsigned int)addr & (PAGE_SIZE-1))); /* Get physical address from physent */
343: }
344: else {
345: pa = (vm_offset_t)((mpv->physent->pte1 & -PAGE_SIZE) | ((unsigned int)addr & (PAGE_SIZE-1))); /* Get physical address from physent */
346: hw_unlock_bit((unsigned int *)&mpv->physent->phys_link, PHYS_LOCK); /* Unlock the physical entry */
347: }
348: db_printf("phys=%08X\n", pa);
349: for(i=0; i<lines; i++) { /* Print n bytes */
350: ReadReal((unsigned int)pa, &xbuf[0]); /* Get the real storage data */
351: db_printf("%08X %08X %08X %08X %08X %08X %08X %08X %08X\n", addr, /* Print a line */
352: xbuf[0], xbuf[1], xbuf[2], xbuf[3],
353: xbuf[4], xbuf[5], xbuf[6], xbuf[7]);
354: addr=(db_expr_t)((unsigned int)addr+0x00000020); /* Point to next address */
355: pa=(unsigned int)pa+0x00000020; /* Point to next address */
356: }
357: db_next = addr;
358:
359: if(!rlines) return;
360:
361: db_printf("Dumping %08X (space=%08X); ", addr, dvspace);
362: mp = hw_lock_phys_vir(dvspace, addr); /* Lock the physical entry for this mapping */
363: if(!mp) { /* Did we find one? */
364: db_printf("Not mapped\n");
365: return; /* Didn't find any, return FALSE... */
366: }
367: if((unsigned int)mp&1) { /* Did we timeout? */
368: db_printf("Timeout locking physical entry for virtual address (%08X)\n", addr); /* Yeah, scream about it! */
369: return; /* Bad hair day, return FALSE... */
370: }
371: mpv = hw_cpv(mp); /* Get virtual address of mapping */
372: if(!mpv->physent) { /* Was there a physical entry? */
373: pa = (vm_offset_t)((mpv->PTEr & -PAGE_SIZE) | ((unsigned int)addr & (PAGE_SIZE-1))); /* Get physical address from physent */
374: }
375: else {
376: pa = (vm_offset_t)((mpv->physent->pte1 & -PAGE_SIZE) | ((unsigned int)addr & (PAGE_SIZE-1))); /* Get physical address from physent */
377: hw_unlock_bit((unsigned int *)&mp->physent->phys_link, PHYS_LOCK); /* Unlock the physical entry */
378: }
379: db_printf("phys=%08X\n", pa);
380: for(i=0; i<rlines; i++) { /* Print n bytes */
381: ReadReal((unsigned int)pa, &xbuf[0]); /* Get the real storage data */
382: db_printf("%08X %08X %08X %08X %08X %08X %08X %08X %08X\n", addr, /* Print a line */
383: xbuf[0], xbuf[1], xbuf[2], xbuf[3],
384: xbuf[4], xbuf[5], xbuf[6], xbuf[7]);
385: addr=(db_expr_t)((unsigned int)addr+0x00000020); /* Point to next address */
386: pa=(unsigned int)pa+0x00000020; /* Point to next address */
387: }
388: db_next = addr;
389:
390:
391: }
392:
393:
394: /*
395: * Print out savearea stuff
396: *
397: *
398: * ds
399: */
400:
401: #define chainmax 32
402:
403: void db_display_save(db_expr_t addr, int have_addr, db_expr_t count, char * modif) {
404:
405: int i, j, totsaves, tottasks, taskact, chainsize;
406: processor_set_t pset;
407: task_t task;
408: thread_act_t act;
409: savearea *save;
410:
411: tottasks = 0;
412: totsaves = 0;
413:
414: for(pset = (processor_set_t)all_psets.next; pset != (processor_set_t)&all_psets; pset = (processor_set_t)pset->all_psets.next) { /* Go through PSETs */
415: for(task = (task_t)pset->tasks.next; task != (task_t)&pset->tasks.next; task = (task_t)task->pset_tasks.next) { /* Go through the tasks */
416: taskact = 0; /* Reset activation count */
417: db_printf("\nTask %4d @%08X:\n", tottasks, task); /* Show where we're at */
418: for(act = (thread_act_t)task->thr_acts.next; act != (thread_act_t)&task->thr_acts; act = (thread_act_t)act->thr_acts.next) { /* Go through activations */
419: db_printf(" Act %4d @%08X - p: %08X fp: %08X fl: %08X fc: %d vp: %08X vl: %08X vp: %d\n",
420: taskact, act, act->mact.pcb, act->mact.FPU_pcb, act->mact.FPU_lvl, act->mact.FPU_cpu,
421: act->mact.VMX_pcb, act->mact.VMX_lvl, act->mact.VMX_cpu);
422:
423:
424: save = (savearea *)act->mact.pcb; /* Set the start of the normal chain */
425: chainsize = 0;
426: while(save) { /* Do them all */
427: totsaves++; /* Count savearea */
428: db_printf(" Norm %08X: %08X %08X - tot = %d\n", save, save->save_srr0, save->save_srr1, totsaves);
429: save = save->save_prev; /* Next one */
430: if(chainsize++ > chainmax) { /* See if we might be in a loop */
431: db_printf(" Chain terminated by count (%d) before %08X\n", chainmax, save);
432: break;
433: }
434: }
435:
436: save = (savearea *)act->mact.FPU_pcb; /* Set the start of the floating point chain */
437: chainsize = 0;
438: while(save) { /* Do them all */
439: if(!(save->save_flags & SAVattach)) totsaves++; /* Count savearea only if not a normal one also */
440: db_printf(" FPU %08X: %08X - tot = %d\n", save, save->save_level_fp, totsaves);
441: save = save->save_prev_float; /* Next one */
442: if(chainsize++ > chainmax) { /* See if we might be in a loop */
443: db_printf(" Chain terminated by count (%d) before %08X\n", chainmax, save);
444: break;
445: }
446: }
447:
448: save = (savearea *)act->mact.VMX_pcb; /* Set the start of the floating point chain */
449: chainsize = 0;
450: while(save) { /* Do them all */
451: if(!(save->save_flags & (SAVattach | SAVfpuvalid))) totsaves++; /* Count savearea only if not a normal one also */
452: db_printf(" Vec %08X: %08X - tot = %d\n", save, save->save_level_vec, totsaves);
453: save = save->save_prev_vector; /* Next one */
454: if(chainsize++ > chainmax) { /* See if we might be in a loop */
455: db_printf(" Chain terminated by count (%d) before %08X\n", chainmax, save);
456: break;
457: }
458: }
459: taskact++;
460: }
461: tottasks++;
462: }
463: }
464:
465: db_printf("Total saveareas accounted for: %d\n", totsaves);
466: return;
467: }
468:
469: /*
470: * Print out extra registers
471: *
472: *
473: * dx
474: */
475:
476: extern unsigned int dbfloats[33][2];
477: extern unsigned int dbvecs[33][4];
478: extern unsigned int dbspecrs[40];
479:
480: void db_display_xregs(db_expr_t addr, int have_addr, db_expr_t count, char * modif) {
481:
482: int i, j, pents;
483:
484: stSpecrs(dbspecrs); /* Save special registers */
485: db_printf("PIR: %08X\n", dbspecrs[0]);
486: db_printf("PVR: %08X\n", dbspecrs[1]);
487: db_printf("SDR1: %08X\n", dbspecrs[22]);
488: db_printf("DBAT: %08X %08X %08X %08X\n", dbspecrs[2], dbspecrs[3], dbspecrs[4], dbspecrs[5]);
489: db_printf(" %08X %08X %08X %08X\n", dbspecrs[6], dbspecrs[7], dbspecrs[8], dbspecrs[9]);
490: db_printf("IBAT: %08X %08X %08X %08X\n", dbspecrs[10], dbspecrs[11], dbspecrs[12], dbspecrs[13]);
491: db_printf(" %08X %08X %08X %08X\n", dbspecrs[14], dbspecrs[15], dbspecrs[16], dbspecrs[17]);
492: db_printf("SPRG: %08X %08X %08X %08X\n", dbspecrs[18], dbspecrs[19], dbspecrs[20], dbspecrs[21]);
493: for(i = 0; i < 16; i += 8) { /* Print 8 at a time */
494: db_printf("SR%02d: %08X %08X %08X %08X %08X %08X %08X %08X\n", i,
495: dbspecrs[23+i], dbspecrs[24+i], dbspecrs[25+i], dbspecrs[26+i],
496: dbspecrs[27+i], dbspecrs[28+i], dbspecrs[29+i], dbspecrs[30+i]);
497: }
498:
499: db_printf("\n");
500:
501:
502: stFloat(dbfloats); /* Save floating point registers */
503: for(i = 0; i < 32; i += 4) { /* Print 4 at a time */
504: db_printf("F%02d: %08X %08X %08X %08X %08X %08X %08X %08X\n", i,
505: dbfloats[i][0], dbfloats[i][1], dbfloats[i+1][0], dbfloats[i+1][1],
506: dbfloats[i+2][0], dbfloats[i+2][1], dbfloats[i+3][0], dbfloats[i+3][1]);
507: }
508: db_printf("FCR: %08X %08X\n", dbfloats[32][0], dbfloats[32][1]); /* Print FSCR */
509:
510: if(!stVectors(dbvecs)) return; /* Return if not Altivec capable */
511:
512: for(i = 0; i < 32; i += 2) { /* Print 2 at a time */
513: db_printf("V%02d: %08X %08X %08X %08X %08X %08X %08X %08X\n", i,
514: dbvecs[i][0], dbvecs[i][1], dbvecs[i][2], dbvecs[i][3],
515: dbvecs[i+1][0], dbvecs[i+1][1], dbvecs[i+1][2], dbvecs[i+1][3]);
516: }
517: db_printf("VCR: %08X %08X %08X %08X\n", dbvecs[32][0], dbvecs[32][1], dbvecs[32][2], dbvecs[32][3]); /* Print VSCR */
518:
519: return; /* Tell them we did it */
520:
521:
522: }
523:
524:
525: /*
526: * Print out physical to vm system stuff
527: *
528: *
529: * dp
530: */
531: void db_display_phys(db_expr_t addr, int have_addr, db_expr_t count, char * modif) {
532:
533: #if 0
534: int i, j, pents;
535: mapping *mp;
536: vm_offset_t pa;
537: struct phys_entry *pp;
538:
539: for (i = 0; i < pmap_mem_regions_count; i++) { /* Step through the phys tables */
540: for(j = 0; j < (pmap_mem_regions[i].end - pmap_mem_regions[i].start); j ++) { /* Step through phys ents */
541: pa = pmap_mem_regions[i].start + (j << 12); /* Get paddr */
542: pp = &pmap_mem_regions[i].phys_table[j]; /* Get phys_ent */
543: db_printf(
544:
545: }
546: }
547: db_printf("pa=%08X\n",
548: if (pa < pmap_mem_regions[i].start)
549: continue;
550: if (pa >= pmap_mem_regions[i].end)
551: return PHYS_NULL;
552:
553: entry = &pmap_mem_regions[i].phys_table[(pa - pmap_mem_regions[i].start) >> PPC_PGSHIFT];
554: return entry;
555: }
556:
557:
558:
559: mp = hw_lock_phys_vir(dvspace, addr); /* Lock the physical entry for this mapping */
560: if(!mp) { /* Did we find one? */
561: db_printf("Not mapped\n");
562: return; /* Didn't find any, return FALSE... */
563: }
564: if((unsigned int)mp&1) { /* Did we timeout? */
565: db_printf("Timeout locking physical entry for virtual address (%08X)\n", addr); /* Yeah, scream about it! */
566: return; /* Bad hair day, return FALSE... */
567: }
568: printf("dumpaddr: space=%08X; vaddr=%08X\n", dvspace, addr); /* Say what address were dumping */
569: dumpmapping(mp);
570: if(mp->physent) {
571: db_dumppca(mp);
572: hw_unlock_bit(&mp->physent->pte1, PHYS_LOCK); /* Unlock physical entry associated with mapping */
573: }
574:
575: #endif
576:
577: return; /* Tell them we did it */
578:
579:
580: }
581:
582:
583:
584: void Dumbo(void);
585: void Dumbo(void){
586: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.