recording file death
[deliverable/binutils-gdb.git] / gdb / hppah-tdep.c
1 /* Machine-dependent code which would otherwise be in inflow.c and core.c,
2 for GDB, the GNU debugger. This code is for the HP PA-RISC cpu.
3 Copyright 1986, 1987, 1989, 1990, 1991, 1992 Free Software Foundation, Inc.
4
5 Contributed by the Center for Software Science at the
6 University of Utah (pa-gdb-bugs@cs.utah.edu).
7
8 This file is part of GDB.
9
10 This program is free software; you can redistribute it and/or modify
11 it under the terms of the GNU General Public License as published by
12 the Free Software Foundation; either version 2 of the License, or
13 (at your option) any later version.
14
15 This program is distributed in the hope that it will be useful,
16 but WITHOUT ANY WARRANTY; without even the implied warranty of
17 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 GNU General Public License for more details.
19
20 You should have received a copy of the GNU General Public License
21 along with this program; if not, write to the Free Software
22 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
23
24 #include "defs.h"
25 #include "frame.h"
26 #include "inferior.h"
27 #include "value.h"
28
29 /* For argument passing to the inferior */
30 #include "symtab.h"
31
32 #ifdef USG
33 #include <sys/types.h>
34 #endif
35
36 #include <sys/param.h>
37 #include <sys/dir.h>
38 #include <signal.h>
39 #include <sys/ioctl.h>
40
41 #ifdef COFF_ENCAPSULATE
42 #include "a.out.encap.h"
43 #else
44 #include <a.out.h>
45 #endif
46 #ifndef N_SET_MAGIC
47 #define N_SET_MAGIC(exec, val) ((exec).a_magic = (val))
48 #endif
49
50 /*#include <sys/user.h> After a.out.h */
51 #include <sys/file.h>
52 #include <sys/stat.h>
53 #include <machine/psl.h>
54
55 #ifdef KERNELDEBUG
56 #include <sys/vmmac.h>
57 #include <machine/machparam.h>
58 #include <machine/vmparam.h>
59 #include <machine/pde.h>
60 #include <machine/cpu.h>
61 #include <machine/iomod.h>
62 #include <machine/pcb.h>
63 #include <machine/rpb.h>
64 #include <ctype.h>
65
66 extern int kernel_debugging;
67 extern CORE_ADDR startup_file_start;
68 extern CORE_ADDR startup_file_end;
69
70 #define KERNOFF ((unsigned)KERNBASE)
71 #define INKERNEL(x) ((x) >= KERNOFF && (x) < KERNOFF + ctob(slr))
72
73 static int ok_to_cache();
74 static void set_kernel_boundaries();
75
76 int devmem = 0;
77 int vtophys_ready = 0;
78 int kerneltype;
79 #define OS_BSD 1
80 #define OS_MACH 2
81 #endif
82
83 #include "gdbcore.h"
84 #include "gdbcmd.h"
85
86 extern int errno;
87 \f
88
89
90
91
92
93 /* Last modification time of executable file.
94 Also used in source.c to compare against mtime of a source file. */
95
96 extern int exec_mtime;
97
98 /* Virtual addresses of bounds of the two areas of memory in the core file. */
99
100 /* extern CORE_ADDR data_start; */
101 extern CORE_ADDR data_end;
102 extern CORE_ADDR stack_start;
103 extern CORE_ADDR stack_end;
104
105 /* Virtual addresses of bounds of two areas of memory in the exec file.
106 Note that the data area in the exec file is used only when there is no core file. */
107
108 extern CORE_ADDR text_start;
109 extern CORE_ADDR text_end;
110
111 extern CORE_ADDR exec_data_start;
112 extern CORE_ADDR exec_data_end;
113
114 /* Address in executable file of start of text area data. */
115
116 extern int text_offset;
117
118 /* Address in executable file of start of data area data. */
119
120 extern int exec_data_offset;
121
122 /* Address in core file of start of data area data. */
123
124 extern int data_offset;
125
126 /* Address in core file of start of stack area data. */
127
128 extern int stack_offset;
129
130 struct header file_hdr;
131 struct som_exec_auxhdr exec_hdr;
132 \f
133 #ifdef KERNELDEBUG
134 /*
135 * Kernel debugging routines.
136 */
137
138 static struct pcb pcb;
139 static struct pde *pdir;
140 static struct hte *htbl;
141 static u_int npdir, nhtbl;
142
143 static CORE_ADDR
144 ksym_lookup(name)
145 char *name;
146 {
147 struct symbol *sym;
148 int i;
149
150 if ((i = lookup_misc_func(name)) < 0)
151 error("kernel symbol `%s' not found.", name);
152
153 return (misc_function_vector[i].address);
154 }
155
156 /*
157 * (re-)set the variables that tell "inside_entry_file" where to end
158 * a stack backtrace.
159 */
160 void
161 set_kernel_boundaries()
162 {
163 switch (kerneltype) {
164 case OS_MACH:
165 startup_file_start = ksym_lookup("$syscall");
166 startup_file_end = ksym_lookup("trap");
167 break;
168 case OS_BSD:
169 startup_file_start = ksym_lookup("syscallinit");
170 startup_file_end = ksym_lookup("$syscallexit");
171 break;
172 }
173 }
174
175 /*
176 * return true if 'len' bytes starting at 'addr' can be read out as
177 * longwords and/or locally cached (this is mostly for memory mapped
178 * i/o register access when debugging remote kernels).
179 */
180 static int
181 ok_to_cache(addr, len)
182 {
183 static CORE_ADDR ioptr;
184
185 if (! ioptr)
186 ioptr = ksym_lookup("ioptr");
187
188 if (addr >= ioptr && addr < SPA_HIGH)
189 return (0);
190
191 return (1);
192 }
193
194 static
195 physrd(addr, dat, len)
196 u_int addr;
197 char *dat;
198 {
199 if (lseek(corechan, addr, L_SET) == -1)
200 return (-1);
201 if (read(corechan, dat, len) != len)
202 return (-1);
203
204 return (0);
205 }
206
207 /*
208 * When looking at kernel data space through /dev/mem or with a core file, do
209 * virtual memory mapping.
210 */
211 static CORE_ADDR
212 vtophys(space, addr)
213 unsigned space;
214 CORE_ADDR addr;
215 {
216 struct pde *pptr;
217 u_int hindx, vpageno, ppageno;
218 CORE_ADDR phys = ~0;
219
220 if (!vtophys_ready) {
221 phys = addr; /* XXX for kvread */
222 } else if (kerneltype == OS_BSD) {
223 /* make offset into a virtual page no */
224 vpageno = btop(addr);
225 /*
226 * Determine index into hash table, initialize pptr to this
227 * entry (since first word of pte & hte are same), and set
228 * physical page number for first entry in chain.
229 */
230 hindx = pdirhash(space, addr) & (nhtbl-1);
231 pptr = (struct pde *) &htbl[hindx];
232 ppageno = pptr->pde_next;
233 while (1) {
234 if (pptr->pde_end)
235 break;
236 pptr = &pdir[ppageno];
237 /*
238 * If space id & virtual page number match, return
239 * "next PDIR entry of previous PDIR entry" as the
240 * physical page or'd with offset into page.
241 */
242 if (pptr->pde_space == space &&
243 pptr->pde_page == vpageno) {
244 phys = (CORE_ADDR) ((u_int)ptob(ppageno) |
245 (addr & PGOFSET));
246 break;
247 }
248 ppageno = pptr->pde_next;
249 }
250 }
251 #ifdef MACHKERNELDEBUG
252 else if (kerneltype == OS_MACH) {
253 mach_vtophys(space, addr, &phys);
254 }
255 #endif
256 #if 0
257 printf("vtophys(%x.%x) -> %x\n", space, addr, phys);
258 #endif
259 return (phys);
260 }
261
262 static
263 kvread(addr)
264 CORE_ADDR addr;
265 {
266 CORE_ADDR paddr;
267
268 paddr = vtophys(0, addr);
269 if (paddr != ~0)
270 if (physrd(paddr, (char *)&addr, sizeof(addr)) == 0)
271 return (addr);
272
273 return (~0);
274 }
275
276 static void
277 read_pcb(addr)
278 u_int addr;
279 {
280 int i, off;
281 extern char registers[];
282 static int reg2pcb[] = {
283 /* RPB */
284 -1, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17,
285 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33,
286 45, 52, 51, 75, 74, 49, 53, 54, 55, 56, -1, 70, 66, 67, 68, 69,
287 71, 72, 73, 34, 42, 43, 44, 46, 47, 58, 59, 60, -1, -1, -1, -1,
288 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
289 -1, -1, -1, -1,
290 /* BSD */
291 -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
292 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30,
293 43, 64, 67, 68, 67, 47, 51, 52, 53, 54, -1, 35, 31, 32, 33, 34,
294 36, 37, 38, 39, 40, 41, 42, 44, 45, 56, 57, 58,102,103,104, -1,
295 70, 71, 72, 73, 74, 75, 76, 77, 78, 80, 82, 84, 86, 88, 90, 92,
296 94, 96, 98, 100,
297 /* Mach */
298 -1, -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13,
299 14, 15, 16, -1, -1, -1, -1, -1, -1, -1, -1, 17, -1, -1, 18, -1,
300 25, -1, -1, -1, -1, 30, -1, -1, -1, -1, -1, 20, -1, -1, -1, 19,
301 21, 22, 23, 24, 26, 27, -1, 28, 29, -1, -1, -1, -1, -1, -1, -1,
302 34, 35, 36, 37, 38, 39, 40, 41, -1, -1, -1, -1, -1, -1, -1, -1,
303 42, 44, 46, 48
304 };
305 static struct rpb *rpbaddr = (struct rpb *) 0;
306 static u_int rpbpcbaddr = 0;
307
308 if (!remote_debugging) {
309 /*
310 * If we are debugging a post-mortem and this is the first
311 * call of read_pcb, read the RPB. Also assoicate the
312 * thread/proc running at the time with the RPB.
313 */
314 if (!devmem && rpbpcbaddr == 0) {
315 CORE_ADDR raddr = ksym_lookup("rpb");
316 int usepcb = 1;
317
318 if (raddr != ~0) {
319 rpbaddr = (struct rpb *) malloc(sizeof *rpbaddr);
320 if (!physrd(raddr, (char *)rpbaddr, sizeof *rpbaddr)) {
321 rpbpcbaddr = addr;
322 usepcb = 0;
323 }
324 }
325 if (usepcb) {
326 error("cannot read rpb, using pcb for registers\n");
327 if (rpbaddr)
328 free((char *)rpbaddr);
329 rpbpcbaddr = ~0;
330 }
331 }
332 if (physrd (addr, (char *)&pcb, sizeof pcb))
333 error ("cannot read pcb at %x.\n", addr);
334 } else {
335 if (remote_read_inferior_memory(addr, (char *)&pcb, sizeof pcb))
336 error ("cannot read pcb at %x.\n", addr);
337 }
338
339 if (kerneltype == OS_BSD) {
340 printf("p0br %lx p0lr %lx p1br %lx p1lr %lx\n",
341 pcb.pcb_p0br, pcb.pcb_p0lr, pcb.pcb_p1br, pcb.pcb_p1lr);
342 off = NUM_REGS;
343 } else {
344 printf("pcb %lx psw %lx ksp %lx\n",
345 addr, ((int *)&pcb)[31], ((int *)&pcb)[32]);
346 off = NUM_REGS * 2;
347 }
348 /*
349 * get the register values out of the sys pcb and
350 * store them where `read_register' will find them.
351 */
352 bzero(registers, REGISTER_BYTES);
353 for (i = 0; i < NUM_REGS; ++i)
354 if (reg2pcb[i+off] != -1)
355 supply_register(i, &((int *)&pcb)[reg2pcb[i+off]]);
356 /*
357 * If the RPB is valid for this thread/proc use the register values
358 * contained there.
359 */
360 if (addr == rpbpcbaddr) {
361 off = 0;
362 for (i = 0; i < NUM_REGS; ++i)
363 if (reg2pcb[i+off] != -1)
364 supply_register(i, &((int *)rpbaddr)[reg2pcb[i+off]]);
365 }
366 }
367
368 void
369 setup_kernel_debugging()
370 {
371 struct stat stb;
372 CORE_ADDR addr;
373
374 fstat(corechan, &stb);
375 devmem = 0;
376 if ((stb.st_mode & S_IFMT) == S_IFCHR && stb.st_rdev == makedev(2, 0))
377 devmem = 1;
378
379 /* XXX */
380 if (lookup_misc_func("Sysmap") < 0)
381 kerneltype = OS_MACH;
382 else
383 kerneltype = OS_BSD;
384
385 if (kerneltype == OS_BSD) {
386 int len, err = 0;
387
388 /*
389 * Hash table and PDIR are equivalently mapped
390 */
391 nhtbl = kvread(ksym_lookup("nhtbl"));
392 if (nhtbl != ~0) {
393 len = nhtbl * sizeof(*htbl);
394 htbl = (struct hte *) malloc(len);
395 if (htbl) {
396 addr = kvread(ksym_lookup("htbl"));
397 if (physrd(addr, (char *)htbl, len))
398 err++;
399 } else
400 err++;
401 } else
402 err++;
403 npdir = kvread(ksym_lookup("npdir"));
404 if (npdir != ~0) {
405 len = npdir * sizeof(*pdir);
406 pdir = (struct pde *) malloc(len);
407 if (pdir) {
408 addr = kvread(ksym_lookup("pdir"));
409 if (physrd(addr, (char *)pdir, len))
410 err++;
411 } else
412 err++;
413 } else
414 err++;
415 if (err) {
416 error("cannot read PDIR/HTBL");
417 return;
418 }
419 vtophys_ready = 1;
420
421 /*
422 * pcb where "panic" saved registers in first thing in
423 * current u-area. The current u-area is pointed to by
424 * "uptr".
425 */
426 addr = kvread(ksym_lookup("uptr"));
427 if (addr == ~0) {
428 error("cannot read current u-area address");
429 return;
430 }
431 read_pcb(vtophys(0, addr)); /* XXX space */
432 if (!devmem) {
433 /* find stack frame */
434 CORE_ADDR panicstr;
435 char buf[256];
436 register char *cp;
437
438 panicstr = kvread(ksym_lookup("panicstr"));
439 if (panicstr == ~0)
440 return;
441 kernel_core_file_hook(panicstr, buf, sizeof(buf));
442 for (cp = buf; cp < &buf[sizeof(buf)] && *cp; cp++)
443 if (!isascii(*cp) || (!isprint(*cp) && !isspace(*cp)))
444 *cp = '?';
445 if (*cp)
446 *cp = '\0';
447 printf("panic: %s\n", buf);
448 }
449 }
450 #ifdef MACHKERNELDEBUG
451 else {
452 int *thread;
453
454 /*
455 * Set up address translation
456 */
457 if (mach_vtophys_init() == 0) {
458 error("cannot initialize vtophys for Mach");
459 return;
460 }
461 vtophys_ready = 1;
462
463 /*
464 * Locate active thread and read PCB
465 * XXX MAJOR HACK
466 * - assumes uni-processor
467 * - assumes position of pcb to avoid mach includes
468 */
469 thread = (int *)kvread(ksym_lookup("active_threads"));
470 addr = kvread(&thread[9]); /* XXX: pcb addr */
471 read_pcb(vtophys(0, addr));
472 }
473 #endif
474 }
475
476 vtop_command(arg)
477 char *arg;
478 {
479 u_int sp, off, pa;
480
481 if (!arg)
482 error_no_arg("kernel virtual address");
483 if (!kernel_debugging)
484 error("not debugging kernel");
485
486 sp = 0; /* XXX */
487 off = (u_int) parse_and_eval_address(arg);
488 pa = vtophys(sp, off);
489 printf("%lx.%lx -> ", sp, off);
490 if (pa == ~0)
491 printf("<invalid>\n");
492 else
493 printf("%lx\n", pa);
494 }
495
496 set_paddr_command(arg)
497 char *arg;
498 {
499 u_int addr;
500
501 if (!arg) {
502 if (kerneltype == OS_BSD)
503 error_no_arg("ps-style address for new process");
504 else
505 error_no_arg("thread structure virtual address");
506 }
507 if (!kernel_debugging)
508 error("not debugging kernel");
509
510 addr = (u_int) parse_and_eval_address(arg);
511 if (kerneltype == OS_BSD)
512 addr = ctob(addr);
513 else {
514 addr = kvread(&(((int *)addr)[9])); /* XXX: pcb addr */
515 addr = vtophys(0, addr); /* XXX space */
516 }
517 read_pcb(addr);
518
519 flush_cached_frames();
520 set_current_frame(create_new_frame(read_register(FP_REGNUM), read_pc()));
521 select_frame(get_current_frame(), 0);
522 }
523
524 /*
525 * read len bytes from kernel virtual address 'addr' into local
526 * buffer 'buf'. Return 0 if read ok, 1 otherwise. On read
527 * errors, portion of buffer not read is zeroed.
528 */
529 kernel_core_file_hook(addr, buf, len)
530 CORE_ADDR addr;
531 char *buf;
532 int len;
533 {
534 int i;
535 CORE_ADDR paddr;
536
537 while (len > 0) {
538 paddr = vtophys(0, addr); /* XXX space */
539 if (paddr == ~0) {
540 bzero(buf, len);
541 return (1);
542 }
543 /* we can't read across a page boundary */
544 i = min(len, NBPG - (addr & PGOFSET));
545 if (physrd(paddr, buf, i)) {
546 bzero(buf, len);
547 return (1);
548 }
549 buf += i;
550 addr += i;
551 len -= i;
552 }
553 return (0);
554 }
555 #endif
556
557
558 \f
559
560
561
562 /* Routines to extract various sized constants out of hppa
563 instructions. */
564
565 /* This assumes that no garbage lies outside of the lower bits of
566 value. */
567
568 int
569 sign_extend (val, bits)
570 unsigned val, bits;
571 {
572 return (int)(val >> bits - 1 ? (-1 << bits) | val : val);
573 }
574
575 /* For many immediate values the sign bit is the low bit! */
576
577 int
578 low_sign_extend (val, bits)
579 unsigned val, bits;
580 {
581 return (int)((val & 0x1 ? (-1 << (bits - 1)) : 0) | val >> 1);
582 }
583 /* extract the immediate field from a ld{bhw}s instruction */
584
585
586
587 unsigned
588 get_field (val, from, to)
589 unsigned val, from, to;
590 {
591 val = val >> 31 - to;
592 return val & ((1 << 32 - from) - 1);
593 }
594
595 unsigned
596 set_field (val, from, to, new_val)
597 unsigned *val, from, to;
598 {
599 unsigned mask = ~((1 << (to - from + 1)) << (31 - from));
600 return *val = *val & mask | (new_val << (31 - from));
601 }
602
603 /* extract a 3-bit space register number from a be, ble, mtsp or mfsp */
604
605 extract_3 (word)
606 unsigned word;
607 {
608 return GET_FIELD (word, 18, 18) << 2 | GET_FIELD (word, 16, 17);
609 }
610
611 extract_5_load (word)
612 unsigned word;
613 {
614 return low_sign_extend (word >> 16 & MASK_5, 5);
615 }
616
617 /* extract the immediate field from a st{bhw}s instruction */
618
619 int
620 extract_5_store (word)
621 unsigned word;
622 {
623 return low_sign_extend (word & MASK_5, 5);
624 }
625
626 /* extract an 11 bit immediate field */
627
628 int
629 extract_11 (word)
630 unsigned word;
631 {
632 return low_sign_extend (word & MASK_11, 11);
633 }
634
635 /* extract a 14 bit immediate field */
636
637 int
638 extract_14 (word)
639 unsigned word;
640 {
641 return low_sign_extend (word & MASK_14, 14);
642 }
643
644 /* deposit a 14 bit constant in a word */
645
646 unsigned
647 deposit_14 (opnd, word)
648 int opnd;
649 unsigned word;
650 {
651 unsigned sign = (opnd < 0 ? 1 : 0);
652
653 return word | ((unsigned)opnd << 1 & MASK_14) | sign;
654 }
655
656 /* extract a 21 bit constant */
657
658 int
659 extract_21 (word)
660 unsigned word;
661 {
662 int val;
663
664 word &= MASK_21;
665 word <<= 11;
666 val = GET_FIELD (word, 20, 20);
667 val <<= 11;
668 val |= GET_FIELD (word, 9, 19);
669 val <<= 2;
670 val |= GET_FIELD (word, 5, 6);
671 val <<= 5;
672 val |= GET_FIELD (word, 0, 4);
673 val <<= 2;
674 val |= GET_FIELD (word, 7, 8);
675 return sign_extend (val, 21) << 11;
676 }
677
678 /* deposit a 21 bit constant in a word. Although 21 bit constants are
679 usually the top 21 bits of a 32 bit constant, we assume that only
680 the low 21 bits of opnd are relevant */
681
682 unsigned
683 deposit_21 (opnd, word)
684 unsigned opnd, word;
685 {
686 unsigned val = 0;
687
688 val |= GET_FIELD (opnd, 11 + 14, 11 + 18);
689 val <<= 2;
690 val |= GET_FIELD (opnd, 11 + 12, 11 + 13);
691 val <<= 2;
692 val |= GET_FIELD (opnd, 11 + 19, 11 + 20);
693 val <<= 11;
694 val |= GET_FIELD (opnd, 11 + 1, 11 + 11);
695 val <<= 1;
696 val |= GET_FIELD (opnd, 11 + 0, 11 + 0);
697 return word | val;
698 }
699
700 /* extract a 12 bit constant from branch instructions */
701
702 int
703 extract_12 (word)
704 unsigned word;
705 {
706 return sign_extend (GET_FIELD (word, 19, 28) |
707 GET_FIELD (word, 29, 29) << 10 |
708 (word & 0x1) << 11, 12) << 2;
709 }
710
711 /* extract a 17 bit constant from branch instructions, returning the
712 19 bit signed value. */
713
714 int
715 extract_17 (word)
716 unsigned word;
717 {
718 return sign_extend (GET_FIELD (word, 19, 28) |
719 GET_FIELD (word, 29, 29) << 10 |
720 GET_FIELD (word, 11, 15) << 11 |
721 (word & 0x1) << 16, 17) << 2;
722 }
723
724
725 CORE_ADDR
726 frame_saved_pc (frame)
727 FRAME frame;
728 {
729 if (get_current_frame () == frame)
730 {
731 struct frame_saved_regs saved_regs;
732 CORE_ADDR pc = get_frame_pc (frame);
733
734 get_frame_saved_regs (frame, &saved_regs);
735 if (pc >= millicode_start && pc < millicode_end)
736 return read_register (31);
737 else if (saved_regs.regs[RP_REGNUM])
738 return read_memory_integer (saved_regs.regs[RP_REGNUM], 4);
739 else
740 return read_register (RP_REGNUM);
741 }
742 return read_memory_integer (frame->frame - 20, 4) & ~0x3;
743 }
744
745
746 /* To see if a frame chain is valid, see if the caller looks like it
747 was compiled with gcc. */
748
749 int frame_chain_valid (chain, thisframe)
750 FRAME_ADDR chain;
751 FRAME thisframe;
752 {
753 if (chain && (chain > 0x60000000
754 /* || remote_debugging -this is no longer used */
755 #ifdef KERNELDEBUG
756 || kernel_debugging
757 #endif
758 ))
759 {
760 CORE_ADDR pc = get_pc_function_start (FRAME_SAVED_PC (thisframe));
761
762 if (!inside_entry_file (pc))
763 return 0;
764 /* look for stw rp, -20(0,sp); copy 4,1; copy sp, 4 */
765 if (read_memory_integer (pc, 4) == 0x6BC23FD9)
766 pc = pc + 4;
767
768 if (read_memory_integer (pc, 4) == 0x8040241 &&
769 read_memory_integer (pc + 4, 4) == 0x81E0244)
770 return 1;
771 else
772 return 0;
773 }
774 else
775 return 0;
776 }
777
778 /* Some helper functions. gcc_p returns 1 if the function beginning at
779 pc appears to have been compiled with gcc. hpux_cc_p returns 1 if
780 fn was compiled with hpux cc. gcc functions look like :
781
782 stw rp,-0x14(sp) ; optional
783 or r4,r0,r1
784 or sp,r0,r4
785 stwm r1,framesize(sp)
786
787 hpux cc functions look like:
788
789 stw rp,-0x14(sp) ; optional.
790 stwm r3,framesiz(sp)
791 */
792
793 gcc_p (pc)
794 CORE_ADDR pc;
795 {
796 if (read_memory_integer (pc, 4) == 0x6BC23FD9)
797 pc = pc + 4;
798
799 if (read_memory_integer (pc, 4) == 0x8040241 &&
800 read_memory_integer (pc + 4, 4) == 0x81E0244)
801 return 1;
802 return 0;
803 }
804
805
806 find_dummy_frame_regs (frame, frame_saved_regs)
807 struct frame_info *frame;
808 struct frame_saved_regs *frame_saved_regs;
809 {
810 CORE_ADDR fp = frame->frame;
811 int i;
812
813 frame_saved_regs->regs[RP_REGNUM] = fp - 20 & ~0x3;
814 frame_saved_regs->regs[FP_REGNUM] = fp;
815 frame_saved_regs->regs[1] = fp + 8;
816 frame_saved_regs->regs[3] = fp + 12;
817 for (fp += 16, i = 3; i < 30; fp += 4, i++)
818 frame_saved_regs->regs[i] = fp;
819 frame_saved_regs->regs[31] = fp;
820 fp += 4;
821 for (i = FP0_REGNUM; i < NUM_REGS; i++, fp += 8)
822 frame_saved_regs->regs[i] = fp;
823 /* depend on last increment of fp */
824 frame_saved_regs->regs[IPSW_REGNUM] = fp - 4;
825 frame_saved_regs->regs[SAR_REGNUM] = fp;
826 fp += 4;
827 frame_saved_regs->regs[PCOQ_TAIL_REGNUM] = fp;
828 frame_saved_regs->regs[PCSQ_TAIL_REGNUM] = fp;
829 }
830
831 CORE_ADDR
832 hp_push_arguments (nargs, args, sp, struct_return, struct_addr)
833 int nargs;
834 value *args;
835 CORE_ADDR sp;
836 int struct_return;
837 CORE_ADDR struct_addr;
838 {
839 /* array of arguments' offsets */
840 int *offset = (int *)alloca(nargs);
841 int cum = 0;
842 int i, alignment;
843
844 for (i = 0; i < nargs; i++)
845 {
846 cum += TYPE_LENGTH (VALUE_TYPE (args[i]));
847 /* value must go at proper alignment. Assume alignment is a
848 power of two.*/
849 alignment = hp_alignof (VALUE_TYPE (args[i]));
850 if (cum % alignment)
851 cum = (cum + alignment) & -alignment;
852 offset[i] = -cum;
853 }
854 for (i == 0; i < nargs; i++)
855 {
856 write_memory (sp + offset[i], VALUE_CONTENTS (args[i]), sizeof(int));
857 }
858 sp += min ((cum + 7) & -8, 48);
859 if (struct_return)
860 write_register (28, struct_addr);
861 return sp + 48;
862 }
863
864 /* return the alignment of a type in bytes. Structures have the maximum
865 alignment required by their fields. */
866
867 int
868 hp_alignof (arg)
869 struct type *arg;
870 {
871 int max_align, align, i;
872 switch (TYPE_CODE (arg))
873 {
874 case TYPE_CODE_PTR:
875 case TYPE_CODE_INT:
876 case TYPE_CODE_FLT:
877 return TYPE_LENGTH (arg);
878 case TYPE_CODE_ARRAY:
879 return hp_alignof (TYPE_FIELD_TYPE (arg, 0));
880 case TYPE_CODE_STRUCT:
881 case TYPE_CODE_UNION:
882 max_align = 2;
883 for (i = 0; i < TYPE_NFIELDS (arg); i++)
884 {
885 /* Bit fields have no real alignment. */
886 if (!TYPE_FIELD_BITPOS (arg, i))
887 {
888 align = hp_alignof (TYPE_FIELD_TYPE (arg, i));
889 max_align = max (max_align, align);
890 }
891 }
892 return max_align;
893 default:
894 return 4;
895 }
896 }
897
898 /* Print the register regnum, or all registers if regnum is -1 */
899
900 pa_do_registers_info (regnum, fpregs)
901 int regnum;
902 int fpregs;
903 {
904 char raw_regs [REGISTER_BYTES];
905 int i;
906
907 for (i = 0; i < NUM_REGS; i++)
908 read_relative_register_raw_bytes (i, raw_regs + REGISTER_BYTE (i));
909 if (regnum = -1)
910 pa_print_registers (raw_regs, regnum);
911 else if (regnum < FP0_REGNUM)
912 {
913 printf ("%s %x\n", reg_names[regnum], *(long *)(raw_regs +
914 REGISTER_BYTE (regnum)));
915 }
916 else
917 pa_print_fp_reg (regnum);
918 }
919
920 pa_print_registers (raw_regs, regnum)
921 char *raw_regs;
922 int regnum;
923 {
924 int i;
925
926 for (i = 0; i < 18; i++)
927 printf ("%8.8s: %8x %8.8s: %8x %8.8s: %8x %8.8s: %8x\n",
928 reg_names[i],
929 *(int *)(raw_regs + REGISTER_BYTE (i)),
930 reg_names[i + 18],
931 *(int *)(raw_regs + REGISTER_BYTE (i + 18)),
932 reg_names[i + 36],
933 *(int *)(raw_regs + REGISTER_BYTE (i + 36)),
934 reg_names[i + 54],
935 *(int *)(raw_regs + REGISTER_BYTE (i + 54)));
936 for (i = 72; i < NUM_REGS; i++)
937 pa_print_fp_reg (i);
938 }
939
940 pa_print_fp_reg (i)
941 int i;
942 {
943 unsigned char raw_buffer[MAX_REGISTER_RAW_SIZE];
944 unsigned char virtual_buffer[MAX_REGISTER_VIRTUAL_SIZE];
945 REGISTER_TYPE val;
946
947 /* Get the data in raw format, then convert also to virtual format. */
948 read_relative_register_raw_bytes (i, raw_buffer);
949 REGISTER_CONVERT_TO_VIRTUAL (i, raw_buffer, virtual_buffer);
950
951 fputs_filtered (reg_names[i], stdout);
952 print_spaces_filtered (15 - strlen (reg_names[i]), stdout);
953
954 val_print (REGISTER_VIRTUAL_TYPE (i), virtual_buffer, 0, stdout, 0,
955 1, 0, Val_pretty_default);
956 printf_filtered ("\n");
957
958 }
959
960 /*
961 * Virtual to physical translation routines for Utah's Mach 3.0
962 */
963 #ifdef MACHKERNELDEBUG
964
965 #define STATIC
966
967 #if 0 /* too many includes to resolve, too much crap */
968 #include <kern/queue.h>
969 #include <vm/pmap.h>
970 #include <mach/vm_prot.h>
971 #else
972 /* queue.h */
973 struct queue_entry {
974 struct queue_entry *next; /* next element */
975 struct queue_entry *prev; /* previous element */
976 };
977
978 typedef struct queue_entry *queue_t;
979 typedef struct queue_entry queue_head_t;
980 typedef struct queue_entry queue_chain_t;
981 typedef struct queue_entry *queue_entry_t;
982
983 /* pmap.h */
984 #define HP800_HASHSIZE 1024
985 #define HP800_HASHSIZE_LOG2 10
986
987 #define pmap_hash(space, offset) \
988 (((unsigned) (space) << 5 ^ \
989 ((unsigned) (offset) >> 19 | (unsigned) (space) << 13) ^ \
990 (unsigned) (offset) >> 11) & (HP800_HASHSIZE-1))
991
992 struct mapping {
993 queue_head_t hash_link; /* hash table links */
994 queue_head_t phys_link; /* for mappings of a given PA */
995 space_t space; /* virtual space */
996 unsigned offset; /* virtual page number */
997 unsigned tlbpage; /* physical page (for TLB load) */
998 unsigned tlbprot; /* prot/access rights (for TLB load) */
999 struct pmap *pmap; /* pmap mapping belongs to */
1000 };
1001
1002 struct phys_entry {
1003 queue_head_t phys_link; /* head of mappings of a given PA */
1004 struct mapping *writer; /* mapping with R/W access */
1005 unsigned tlbprot; /* TLB format protection */
1006 };
1007
1008 #endif
1009
1010 #define atop(a) ((unsigned)(a) >> 11)
1011 #define ptoa(p) ((unsigned)(p) << 11)
1012 #define trunc_page(a) ((unsigned)(a) & ~2047)
1013
1014 STATIC long equiv_end;
1015 STATIC queue_head_t *Ovtop_table, *vtop_table, *Ofree_mapping, free_mapping;
1016 STATIC struct phys_entry *Ophys_table, *phys_table;
1017 STATIC long vm_last_phys, vm_first_phys;
1018 STATIC struct mapping *firstmap, *lastmap, *Omap_table, *map_table;
1019 STATIC unsigned Omlow, Omhigh, Omhead, Ovlow, Ovhigh, Oplow, Ophigh;
1020 STATIC unsigned mlow, mhigh, mhead, vlow, vhigh, plow, phigh;
1021 STATIC int vtopsize, physsize, mapsize;
1022 STATIC int kmemfd;
1023
1024 #define IS_OVTOPPTR(p) ((unsigned)(p) >= Ovlow && (unsigned)(p) < Ovhigh)
1025 #define IS_OMAPPTR(p) ((unsigned)(p) >= Omlow && (unsigned)(p) < Omhigh)
1026 #define IS_OPHYSPTR(p) ((unsigned)(p) >= Oplow && (unsigned)(p) < Ophigh)
1027 #define IS_VTOPPTR(p) ((unsigned)(p) >= vlow && (unsigned)(p) < vhigh)
1028 #define IS_MAPPTR(p) ((unsigned)(p) >= mlow && (unsigned)(p) < mhigh)
1029 #define IS_PHYSPTR(p) ((unsigned)(p) >= plow && (unsigned)(p) < phigh)
1030
1031 struct mapstate {
1032 char unused;
1033 char flags;
1034 short hashix;
1035 short physix;
1036 } *mapstate;
1037
1038 /* flags */
1039 #define M_ISFREE 1
1040 #define M_ISHASH 2
1041 #define M_ISPHYS 4
1042
1043 mach_vtophys_init()
1044 {
1045 int errors = 0;
1046
1047 if (!readdata())
1048 errors++;
1049 if (!verifydata())
1050 errors++;
1051 if (!errors)
1052 return(1);
1053 fflush(stdout);
1054 fprintf(stderr,
1055 "translate: may not be able to translate all addresses\n");
1056 return(0);
1057 }
1058
1059 mach_vtophys(space, off, pa)
1060 unsigned space, off, *pa;
1061 {
1062 register int i;
1063 register queue_t qp;
1064 register struct mapping *mp;
1065 int poff;
1066
1067 /*
1068 * Kernel IO or equivilently mapped, one to one.
1069 */
1070 if (space == 0 && (long)off < equiv_end) {
1071 *pa = off;
1072 return(1);
1073 }
1074 /*
1075 * Else look it up in specified space
1076 */
1077 poff = off - trunc_page(off);
1078 off = trunc_page(off);
1079 qp = &vtop_table[pmap_hash(space, off)];
1080 for (mp = (struct mapping *)qp->next;
1081 qp != (queue_entry_t)mp;
1082 mp = (struct mapping *)mp->hash_link.next) {
1083 if (mp->space == space && mp->offset == off) {
1084 *pa = (mp->tlbpage << 7) | poff;
1085 return(1);
1086 }
1087 }
1088 return(0);
1089 }
1090
1091 STATIC
1092 readdata()
1093 {
1094 char *tmp, *mach_malloc();
1095 long size;
1096
1097 /* easy scalars */
1098 mach_read("equiv_end", ~0, (char *)&equiv_end, sizeof equiv_end);
1099 mach_read("vm_first_phys", ~0,
1100 (char *)&vm_first_phys, sizeof vm_first_phys);
1101 mach_read("vm_last_phys", ~0,
1102 (char *)&vm_last_phys, sizeof vm_last_phys);
1103 mach_read("firstmap", ~0, (char *)&firstmap, sizeof firstmap);
1104 mach_read("lastmap", ~0, (char *)&lastmap, sizeof lastmap);
1105
1106 /* virtual to physical hash table */
1107 vtopsize = HP800_HASHSIZE;
1108 size = vtopsize * sizeof(queue_head_t);
1109 tmp = mach_malloc("vtop table", size);
1110 mach_read("vtop_table", ~0, (char *)&Ovtop_table, sizeof Ovtop_table);
1111 mach_read("vtop table", (CORE_ADDR)Ovtop_table, tmp, size);
1112 vtop_table = (queue_head_t *) tmp;
1113
1114 /* inverted page table */
1115 physsize = atop(vm_last_phys - vm_first_phys);
1116 size = physsize * sizeof(struct phys_entry);
1117 tmp = mach_malloc("phys table", size);
1118 mach_read("phys_table", ~0, (char *)&Ophys_table, sizeof Ophys_table);
1119 mach_read("phys table", (CORE_ADDR)Ophys_table, tmp, size);
1120 phys_table = (struct phys_entry *) tmp;
1121
1122 /* mapping structures */
1123 Ofree_mapping = (queue_head_t *) ksym_lookup("free_mapping");
1124 mach_read("free mapping", (CORE_ADDR)Ofree_mapping,
1125 (char *) &free_mapping, sizeof free_mapping);
1126 Omap_table = firstmap;
1127 mapsize = lastmap - firstmap;
1128 size = mapsize * sizeof(struct mapping);
1129 tmp = mach_malloc("mapping table", size);
1130 mach_read("mapping table", (CORE_ADDR)Omap_table, tmp, size);
1131 map_table = (struct mapping *) tmp;
1132
1133 /* set limits */
1134 Ovlow = (unsigned) Ovtop_table;
1135 Ovhigh = (unsigned) &Ovtop_table[vtopsize];
1136 Oplow = (unsigned) Ophys_table;
1137 Ophigh = (unsigned) &Ophys_table[physsize];
1138 Omhead = (unsigned) Ofree_mapping;
1139 Omlow = (unsigned) firstmap;
1140 Omhigh = (unsigned) lastmap;
1141 mlow = (unsigned) map_table;
1142 mhigh = (unsigned) &map_table[mapsize];
1143 mhead = (unsigned) &free_mapping;
1144 vlow = (unsigned) vtop_table;
1145 vhigh = (unsigned) &vtop_table[vtopsize];
1146 plow = (unsigned) phys_table;
1147 phigh = (unsigned) &phys_table[physsize];
1148
1149 #if 0
1150 fprintf(stderr, "Ovtop [%#x-%#x) Ophys [%#x-%#x) Omap %#x [%#x-%#x)\n",
1151 Ovlow, Ovhigh, Oplow, Ophigh, Omhead, Omlow, Omhigh);
1152 fprintf(stderr, "vtop [%#x-%#x) phys [%#x-%#x) map %#x [%#x-%#x)\n",
1153 vlow, vhigh, plow, phigh, mhead, mlow, mhigh);
1154 #endif
1155 return(adjustdata());
1156 }
1157
1158 STATIC unsigned
1159 ptrcvt(ptr)
1160 unsigned ptr;
1161 {
1162 unsigned ret;
1163 char *str;
1164
1165 if (ptr == 0) {
1166 ret = ptr;
1167 str = "null";
1168 } else if (IS_OVTOPPTR(ptr)) {
1169 ret = vlow + (ptr - Ovlow);
1170 str = "vtop";
1171 } else if (IS_OPHYSPTR(ptr)) {
1172 ret = plow + (ptr - Oplow);
1173 str = "phys";
1174 } else if (IS_OMAPPTR(ptr)) {
1175 ret = mlow + (ptr - Omlow);
1176 str = "map";
1177 } else if (ptr == Omhead) {
1178 ret = mhead;
1179 str = "maphead";
1180 } else {
1181 error("bogus pointer %#x", ptr);
1182 str = "wild";
1183 ret = ptr;
1184 }
1185 #if 0
1186 fprintf(stderr, "%x (%s) -> %x\n", ptr, str, ret);
1187 #endif
1188 return(ret);
1189 }
1190
1191 STATIC int
1192 adjustdata()
1193 {
1194 register int i, lim;
1195 queue_head_t *nq;
1196 struct phys_entry *np;
1197 struct mapping *nm;
1198
1199 /* hash table */
1200 lim = vtopsize;
1201 for (nq = vtop_table; nq < &vtop_table[lim]; nq++) {
1202 nq->next = (queue_entry_t) ptrcvt((unsigned)nq->next);
1203 nq->prev = (queue_entry_t) ptrcvt((unsigned)nq->prev);
1204 }
1205
1206 /* IPT */
1207 lim = physsize;
1208 for (np = phys_table; np < &phys_table[lim]; np++) {
1209 np->phys_link.next = (queue_entry_t)
1210 ptrcvt((unsigned)np->phys_link.next);
1211 np->phys_link.prev = (queue_entry_t)
1212 ptrcvt((unsigned)np->phys_link.prev);
1213 np->writer = (struct mapping *) ptrcvt((unsigned)np->writer);
1214 }
1215
1216 /* mapping table */
1217 free_mapping.next = (queue_entry_t)ptrcvt((unsigned)free_mapping.next);
1218 free_mapping.prev = (queue_entry_t)ptrcvt((unsigned)free_mapping.prev);
1219 lim = mapsize;
1220 for (nm = map_table; nm < &map_table[lim]; nm++) {
1221 nm->hash_link.next = (queue_entry_t)
1222 ptrcvt((unsigned)nm->hash_link.next);
1223 nm->hash_link.prev = (queue_entry_t)
1224 ptrcvt((unsigned)nm->hash_link.prev);
1225 nm->phys_link.next = (queue_entry_t)
1226 ptrcvt((unsigned)nm->phys_link.next);
1227 nm->phys_link.prev = (queue_entry_t)
1228 ptrcvt((unsigned)nm->phys_link.prev);
1229 }
1230 return(1);
1231 }
1232
1233 /*
1234 * Consistency checks, make sure:
1235 *
1236 * 1. all mappings are accounted for
1237 * 2. no cycles
1238 * 3. no wild pointers
1239 * 4. consisent TLB state
1240 */
1241 STATIC int
1242 verifydata()
1243 {
1244 register struct mapstate *ms;
1245 register int i;
1246 int errors = 0;
1247
1248 mapstate = (struct mapstate *)
1249 mach_malloc("map state", mapsize * sizeof(struct mapstate));
1250 for (ms = mapstate; ms < &mapstate[mapsize]; ms++) {
1251 ms->flags = 0;
1252 ms->hashix = ms->physix = -2;
1253 }
1254
1255 /*
1256 * Check the free list
1257 */
1258 checkhashchain(&free_mapping, M_ISFREE, -1);
1259 /*
1260 * Check every hash chain
1261 */
1262 for (i = 0; i < vtopsize; i++)
1263 checkhashchain(&vtop_table[i], M_ISHASH, i);
1264 /*
1265 * Check every phys chain
1266 */
1267 for (i = 0; i < physsize; i++)
1268 checkphyschain(&phys_table[i].phys_link, M_ISPHYS, i);
1269 /*
1270 * Cycle through mapstate looking for anomolies
1271 */
1272 ms = mapstate;
1273 for (i = 0; i < mapsize; i++) {
1274 switch (ms->flags) {
1275 case M_ISFREE:
1276 case M_ISHASH|M_ISPHYS:
1277 break;
1278 case 0:
1279 merror(ms, "not found");
1280 errors++;
1281 break;
1282 case M_ISHASH:
1283 merror(ms, "in vtop but not phys");
1284 errors++;
1285 break;
1286 case M_ISPHYS:
1287 merror(ms, "in phys but not vtop");
1288 errors++;
1289 break;
1290 default:
1291 merror(ms, "totally bogus");
1292 errors++;
1293 break;
1294 }
1295 ms++;
1296 }
1297 return(errors ? 0 : 1);
1298 }
1299
1300 STATIC void
1301 checkhashchain(qhp, flag, ix)
1302 queue_entry_t qhp;
1303 {
1304 register queue_entry_t qp, pqp;
1305 register struct mapping *mp;
1306 struct mapstate *ms;
1307
1308 qp = qhp->next;
1309 /*
1310 * First element is not a mapping structure,
1311 * chain must be empty.
1312 */
1313 if (!IS_MAPPTR(qp)) {
1314 if (qp != qhp || qp != qhp->prev)
1315 fatal("bad vtop_table header pointer");
1316 } else {
1317 pqp = qhp;
1318 do {
1319 mp = (struct mapping *) qp;
1320 qp = &mp->hash_link;
1321 if (qp->prev != pqp)
1322 fatal("bad hash_link prev pointer");
1323 ms = &mapstate[mp-map_table];
1324 ms->flags |= flag;
1325 ms->hashix = ix;
1326 pqp = (queue_entry_t) mp;
1327 qp = qp->next;
1328 } while (IS_MAPPTR(qp));
1329 if (qp != qhp)
1330 fatal("bad hash_link next pointer");
1331 }
1332 }
1333
1334 STATIC void
1335 checkphyschain(qhp, flag, ix)
1336 queue_entry_t qhp;
1337 {
1338 register queue_entry_t qp, pqp;
1339 register struct mapping *mp;
1340 struct mapstate *ms;
1341
1342 qp = qhp->next;
1343 /*
1344 * First element is not a mapping structure,
1345 * chain must be empty.
1346 */
1347 if (!IS_MAPPTR(qp)) {
1348 if (qp != qhp || qp != qhp->prev)
1349 fatal("bad phys_table header pointer");
1350 } else {
1351 pqp = qhp;
1352 do {
1353 mp = (struct mapping *) qp;
1354 qp = &mp->phys_link;
1355 if (qp->prev != pqp)
1356 fatal("bad phys_link prev pointer");
1357 ms = &mapstate[mp-map_table];
1358 ms->flags |= flag;
1359 ms->physix = ix;
1360 pqp = (queue_entry_t) mp;
1361 qp = qp->next;
1362 } while (IS_MAPPTR(qp));
1363 if (qp != qhp)
1364 fatal("bad phys_link next pointer");
1365 }
1366 }
1367
1368 STATIC void
1369 merror(ms, str)
1370 struct mapstate *ms;
1371 char *str;
1372 {
1373 terminal_ours();
1374 fflush(stdout);
1375 fprintf(stderr,
1376 "vtophys: %s: %c%c%c, hashix %d, physix %d, mapping %x\n",
1377 str,
1378 (ms->flags & M_ISFREE) ? 'F' : '-',
1379 (ms->flags & M_ISHASH) ? 'H' : '-',
1380 (ms->flags & M_ISPHYS) ? 'P' : '-',
1381 ms->hashix, ms->physix, &map_table[ms-mapstate]);
1382 return_to_top_level();
1383 }
1384
1385 STATIC int
1386 mach_read(str, from, top, size)
1387 char *str;
1388 CORE_ADDR from;
1389 char *top;
1390 int size;
1391 {
1392 CORE_ADDR paddr;
1393
1394 if (from == ~0)
1395 from = ksym_lookup(str);
1396 paddr = vtophys(0, from);
1397 if (paddr == ~0 || physrd(paddr, top, size) != 0)
1398 fatal("cannot read %s", str);
1399 }
1400
1401 STATIC char *
1402 mach_malloc(str, size)
1403 char *str;
1404 int size;
1405 {
1406 char *ptr = (char *) malloc(size);
1407
1408 if (ptr == 0)
1409 fatal("no memory for %s", str);
1410 return(ptr);
1411 }
1412 #endif
1413
1414 #ifdef KERNELDEBUG
1415 void
1416 _initialize_hp9k8_dep()
1417 {
1418 add_com ("process-address", class_obscure, set_paddr_command,
1419 "The process identified by (ps-style) ADDR becomes the\n\
1420 \"current\" process context for kernel debugging.");
1421 add_com_alias ("paddr", "process-address", class_obscure, 0);
1422 add_com ("virtual-to-physical", class_obscure, vtop_command,
1423 "Translates the kernel virtual address ADDR into a physical address.");
1424 add_com_alias ("vtop", "virtual-to-physical", class_obscure, 0);
1425 }
1426 #endif
This page took 0.101286 seconds and 4 git commands to generate.