kgdb_hppa.c revision 1.2
11.2Slukem/* $NetBSD: kgdb_hppa.c,v 1.2 2003/07/15 02:29:39 lukem Exp $ */ 21.1Sfredette 31.1Sfredette/* 41.1Sfredette * Copyright (c) 1990, 1993 51.1Sfredette * The Regents of the University of California. All rights reserved. 61.1Sfredette * 71.1Sfredette * This software was developed by the Computer Systems Engineering group 81.1Sfredette * at Lawrence Berkeley Laboratory under DARPA contract BG 91-66 and 91.1Sfredette * contributed to Berkeley. 101.1Sfredette * 111.1Sfredette * All advertising materials mentioning features or use of this software 121.1Sfredette * must display the following acknowledgement: 131.1Sfredette * This product includes software developed by the University of 141.1Sfredette * California, Lawrence Berkeley Laboratories. 151.1Sfredette * 161.1Sfredette * Redistribution and use in source and binary forms, with or without 171.1Sfredette * modification, are permitted provided that the following conditions 181.1Sfredette * are met: 191.1Sfredette * 1. Redistributions of source code must retain the above copyright 201.1Sfredette * notice, this list of conditions and the following disclaimer. 211.1Sfredette * 2. Redistributions in binary form must reproduce the above copyright 221.1Sfredette * notice, this list of conditions and the following disclaimer in the 231.1Sfredette * documentation and/or other materials provided with the distribution. 241.1Sfredette * 3. All advertising materials mentioning features or use of this software 251.1Sfredette * must display the following acknowledgement: 261.1Sfredette * This product includes software developed by the University of 271.1Sfredette * California, Berkeley and its contributors. 281.1Sfredette * 4. Neither the name of the University nor the names of its contributors 291.1Sfredette * may be used to endorse or promote products derived from this software 301.1Sfredette * without specific prior written permission. 311.1Sfredette * 321.1Sfredette * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 331.1Sfredette * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 341.1Sfredette * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 351.1Sfredette * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 361.1Sfredette * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 371.1Sfredette * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 381.1Sfredette * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 391.1Sfredette * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 401.1Sfredette * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 411.1Sfredette * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 421.1Sfredette * SUCH DAMAGE. 431.1Sfredette * 441.1Sfredette * @(#)kgdb_stub.c 8.4 (Berkeley) 1/12/94 451.1Sfredette */ 461.1Sfredette 471.1Sfredette/* 481.1Sfredette * Machine-dependent (hppa) part of the KGDB remote "stub" 491.1Sfredette */ 501.2Slukem 511.2Slukem#include <sys/cdefs.h> 521.2Slukem__KERNEL_RCSID(0, "$NetBSD: kgdb_hppa.c,v 1.2 2003/07/15 02:29:39 lukem Exp $"); 531.1Sfredette 541.1Sfredette#include <sys/param.h> 551.1Sfredette#include <sys/kgdb.h> 561.1Sfredette 571.1Sfredette#include <machine/frame.h> 581.1Sfredette#include <machine/trap.h> 591.1Sfredette 601.1Sfredette/* 611.1Sfredette * Determine if the memory at va..(va+len) is valid. 621.1Sfredette */ 631.1Sfredetteint 641.1Sfredettekgdb_acc(va, ulen) 651.1Sfredette vaddr_t va; 661.1Sfredette size_t ulen; 671.1Sfredette{ 681.1Sfredette 691.1Sfredette /* Just let the trap handler deal with it. */ 701.1Sfredette return (1); 711.1Sfredette} 721.1Sfredette 731.1Sfredette/* 741.1Sfredette * Translate a trap number into a unix compatible signal value. 751.1Sfredette * (gdb only understands unix signal numbers). 761.1Sfredette */ 771.1Sfredetteint 781.1Sfredettekgdb_signal(type) 791.1Sfredette int type; 801.1Sfredette{ 811.1Sfredette int sigval; 821.1Sfredette 831.1Sfredette switch (type) { 841.1Sfredette 851.1Sfredette case T_HPMC: 861.1Sfredette case T_POWERFAIL: 871.1Sfredette case T_LPMC: 881.1Sfredette case T_INTERRUPT: 891.1Sfredette sigval = SIGINT; 901.1Sfredette break; 911.1Sfredette 921.1Sfredette case T_NONEXIST: 931.1Sfredette case T_ILLEGAL: 941.1Sfredette case T_PRIV_OP: 951.1Sfredette case T_PRIV_REG: 961.1Sfredette case T_IPROT: 971.1Sfredette sigval = SIGILL; 981.1Sfredette break; 991.1Sfredette 1001.1Sfredette case T_IBREAK: 1011.1Sfredette case T_DBREAK: 1021.1Sfredette case T_TAKENBR: 1031.1Sfredette case T_RECOVERY: 1041.1Sfredette sigval = SIGTRAP; 1051.1Sfredette break; 1061.1Sfredette 1071.1Sfredette case T_EMULATION: 1081.1Sfredette sigval = SIGEMT; 1091.1Sfredette break; 1101.1Sfredette 1111.1Sfredette case T_DATALIGN: 1121.1Sfredette sigval = SIGBUS; 1131.1Sfredette break; 1141.1Sfredette 1151.1Sfredette case T_DATACC: 1161.1Sfredette case T_DATAPID: 1171.1Sfredette case T_ITLBMISS: 1181.1Sfredette case T_DTLBMISS: 1191.1Sfredette case T_ITLBMISSNA: 1201.1Sfredette case T_DTLBMISSNA: 1211.1Sfredette case T_DPROT: 1221.1Sfredette sigval = SIGSEGV; 1231.1Sfredette break; 1241.1Sfredette 1251.1Sfredette#if 0 1261.1Sfredette case T_OVERFLOW: /* overflow */ 1271.1Sfredette case T_CONDITION: /* conditional */ 1281.1Sfredette case T_EXCEPTION: /* assist exception */ 1291.1Sfredette case T_TLB_DIRTY: /* TLB dirty bit */ 1301.1Sfredette case T_PAGEREF: /* page reference */ 1311.1Sfredette case T_HIGHERPL: /* higher-privelege transfer */ 1321.1Sfredette case T_LOWERPL: /* lower-privilege transfer */ 1331.1Sfredette#endif 1341.1Sfredette default: 1351.1Sfredette sigval = SIGILL; 1361.1Sfredette break; 1371.1Sfredette } 1381.1Sfredette return (sigval); 1391.1Sfredette} 1401.1Sfredette 1411.1Sfredette/* 1421.1Sfredette * Definitions exported from gdb. 1431.1Sfredette */ 1441.1Sfredette 1451.1Sfredette/* 1461.1Sfredette * Translate the values stored in the kernel regs struct to/from 1471.1Sfredette * the format understood by gdb. 1481.1Sfredette * 1491.1Sfredette * When configured for the PA, GDB is set up to expect a buffer 1501.1Sfredette * of registers in the HP/UX struct save_state format, described 1511.1Sfredette * in HP/UX's machine/save_state.h header. The register order is 1521.1Sfredette * very different from our struct trapframe, so we have to do some 1531.1Sfredette * moving around of values. 1541.1Sfredette * 1551.1Sfredette * The constants in the macro below should correspond to the 1561.1Sfredette * register numbers in gdb's config/pa/tm-pa.h register macros. 1571.1Sfredette */ 1581.1Sfredette#define KGDB_MOVEREGS \ 1591.1Sfredette /* 0 is the "save state flags", which gdb doesn't use */ \ 1601.1Sfredette KGDB_MOVEREG(1, tf_r1); \ 1611.1Sfredette KGDB_MOVEREG(2, tf_rp); /* r2 */ \ 1621.1Sfredette KGDB_MOVEREG(3, tf_r3); /* frame pointer when -g */ \ 1631.1Sfredette KGDB_MOVEREG(4, tf_r4); \ 1641.1Sfredette KGDB_MOVEREG(5, tf_r5); \ 1651.1Sfredette KGDB_MOVEREG(6, tf_r6); \ 1661.1Sfredette KGDB_MOVEREG(7, tf_r7); \ 1671.1Sfredette KGDB_MOVEREG(8, tf_r8); \ 1681.1Sfredette KGDB_MOVEREG(9, tf_r9); \ 1691.1Sfredette KGDB_MOVEREG(10, tf_r10); \ 1701.1Sfredette KGDB_MOVEREG(11, tf_r11); \ 1711.1Sfredette KGDB_MOVEREG(12, tf_r12); \ 1721.1Sfredette KGDB_MOVEREG(13, tf_r13); \ 1731.1Sfredette KGDB_MOVEREG(14, tf_r14); \ 1741.1Sfredette KGDB_MOVEREG(15, tf_r15); \ 1751.1Sfredette KGDB_MOVEREG(16, tf_r16); \ 1761.1Sfredette KGDB_MOVEREG(17, tf_r17); \ 1771.1Sfredette KGDB_MOVEREG(18, tf_r18); \ 1781.1Sfredette KGDB_MOVEREG(19, tf_t4); /* r19 */ \ 1791.1Sfredette KGDB_MOVEREG(20, tf_t3); /* r20 */ \ 1801.1Sfredette KGDB_MOVEREG(21, tf_t2); /* r21 */ \ 1811.1Sfredette KGDB_MOVEREG(22, tf_t1); /* r22 */ \ 1821.1Sfredette KGDB_MOVEREG(23, tf_arg3); /* r23 */ \ 1831.1Sfredette KGDB_MOVEREG(24, tf_arg2); /* r24 */ \ 1841.1Sfredette KGDB_MOVEREG(25, tf_arg1); /* r25 */ \ 1851.1Sfredette KGDB_MOVEREG(26, tf_arg0); /* r26 */ \ 1861.1Sfredette KGDB_MOVEREG(27, tf_dp); /* r27 */ \ 1871.1Sfredette KGDB_MOVEREG(28, tf_ret0); /* r28 */ \ 1881.1Sfredette KGDB_MOVEREG(29, tf_ret1); /* r29 */ \ 1891.1Sfredette KGDB_MOVEREG(30, tf_sp); /* r30 */ \ 1901.1Sfredette KGDB_MOVEREG(31, tf_r31); \ 1911.1Sfredette KGDB_MOVEREG(32, tf_sar); /* cr11 */ \ 1921.1Sfredette KGDB_MOVEREG(33, tf_iioq_head); /* cr18 */ \ 1931.1Sfredette KGDB_MOVEREG(34, tf_iisq_head); /* cr17 */ \ 1941.1Sfredette KGDB_MOVEREG(35, tf_iioq_tail); \ 1951.1Sfredette KGDB_MOVEREG(36, tf_iisq_tail); \ 1961.1Sfredette KGDB_MOVEREG(37, tf_eiem); /* cr15 */ \ 1971.1Sfredette KGDB_MOVEREG(38, tf_iir); /* cr19 */ \ 1981.1Sfredette KGDB_MOVEREG(39, tf_isr); /* cr20 */ \ 1991.1Sfredette KGDB_MOVEREG(40, tf_ior); /* cr21 */ \ 2001.1Sfredette KGDB_MOVEREG(41, tf_ipsw); /* cr22 */ \ 2011.1Sfredette /* 42 should be cr31, which we don't have available */ \ 2021.1Sfredette KGDB_MOVEREG(43, tf_sr4); \ 2031.1Sfredette KGDB_MOVEREG(44, tf_sr0); \ 2041.1Sfredette KGDB_MOVEREG(45, tf_sr1); \ 2051.1Sfredette KGDB_MOVEREG(46, tf_sr2); \ 2061.1Sfredette KGDB_MOVEREG(47, tf_sr3); \ 2071.1Sfredette KGDB_MOVEREG(48, tf_sr5); \ 2081.1Sfredette KGDB_MOVEREG(49, tf_sr6); \ 2091.1Sfredette KGDB_MOVEREG(50, tf_sr7); \ 2101.1Sfredette KGDB_MOVEREG(51, tf_rctr); /* cr0 */ \ 2111.1Sfredette KGDB_MOVEREG(52, tf_pidr1); /* cr8 */ \ 2121.1Sfredette KGDB_MOVEREG(53, tf_pidr2); /* cr9 */ \ 2131.1Sfredette KGDB_MOVEREG(54, tf_ccr); /* cr10 */ \ 2141.1Sfredette KGDB_MOVEREG(55, tf_pidr3); /* cr12 */ \ 2151.1Sfredette KGDB_MOVEREG(56, tf_pidr4); /* cr13 */ \ 2161.1Sfredette KGDB_MOVEREG(57, tf_hptm); /* cr24 - DDB */ \ 2171.1Sfredette KGDB_MOVEREG(58, tf_vtop); /* cr25 - DDB */ \ 2181.1Sfredette /* 59 should be cr26, which we don't have available */ \ 2191.1Sfredette /* 60 should be cr27, which we don't have available */ \ 2201.1Sfredette KGDB_MOVEREG(61, tf_cr28); /* - DDB */ \ 2211.1Sfredette /* 62 should be cr29, which we don't have available */ \ 2221.1Sfredette KGDB_MOVEREG(63, tf_cr30) /* uaddr */ 2231.1Sfredette 2241.1Sfredettevoid 2251.1Sfredettekgdb_getregs(regs, gdb_regs) 2261.1Sfredette db_regs_t *regs; 2271.1Sfredette kgdb_reg_t *gdb_regs; 2281.1Sfredette{ 2291.1Sfredette#define KGDB_MOVEREG(i, f) gdb_regs[i] = regs->f 2301.1Sfredette KGDB_MOVEREGS; 2311.1Sfredette#undef KGDB_MOVEREG 2321.1Sfredette} 2331.1Sfredette 2341.1Sfredettevoid 2351.1Sfredettekgdb_setregs(regs, gdb_regs) 2361.1Sfredette db_regs_t *regs; 2371.1Sfredette kgdb_reg_t *gdb_regs; 2381.1Sfredette{ 2391.1Sfredette#define KGDB_MOVEREG(i, f) regs->f = gdb_regs[i] 2401.1Sfredette KGDB_MOVEREGS; 2411.1Sfredette#undef KGDB_MOVEREG 2421.1Sfredette} 2431.1Sfredette 2441.1Sfredette/* 2451.1Sfredette * Trap into kgdb to wait for debugger to connect, 2461.1Sfredette * noting on the console why nothing else is going on. 2471.1Sfredette */ 2481.1Sfredettevoid 2491.1Sfredettekgdb_connect(verbose) 2501.1Sfredette int verbose; 2511.1Sfredette{ 2521.1Sfredette 2531.1Sfredette if (kgdb_dev < 0) 2541.1Sfredette return; 2551.1Sfredette 2561.1Sfredette if (verbose) 2571.1Sfredette printf("kgdb waiting..."); 2581.1Sfredette 2591.1Sfredette __asm __volatile ("break %0, %1" 2601.1Sfredette :: "i" (HPPA_BREAK_KERNEL), "i" (HPPA_BREAK_KGDB)); 2611.1Sfredette 2621.1Sfredette if (verbose) 2631.1Sfredette printf("connected.\n"); 2641.1Sfredette 2651.1Sfredette kgdb_debug_panic = 1; 2661.1Sfredette} 2671.1Sfredette 2681.1Sfredette/* 2691.1Sfredette * Decide what to do on panic. 2701.1Sfredette * (This is called by panic, like Debugger()) 2711.1Sfredette */ 2721.1Sfredettevoid 2731.1Sfredettekgdb_panic() 2741.1Sfredette{ 2751.1Sfredette if (kgdb_dev >= 0 && kgdb_debug_panic) { 2761.1Sfredette printf("entering kgdb\n"); 2771.1Sfredette kgdb_connect(kgdb_active == 0); 2781.1Sfredette } 2791.1Sfredette} 280