[BACK]Return to kvm_hppa.c CVS log [TXT][DIR] Up to [cvs.NetBSD.org] / src / lib / libkvm

Annotation of src/lib/libkvm/kvm_hppa.c, Revision 1.2

1.2     ! agc         1: /*     $NetBSD: kvm_hppa.c,v 1.1 2002/06/06 20:31:25 fredette Exp $    */
1.1       fredette    2:
                      3: /*-
                      4:  * Copyright (c) 1989, 1992, 1993
                      5:  *     The Regents of the University of California.  All rights reserved.
                      6:  *
                      7:  * This code is derived from software developed by the Computer Systems
                      8:  * Engineering group at Lawrence Berkeley Laboratory under DARPA contract
                      9:  * BG 91-66 and contributed to Berkeley.
                     10:  *
                     11:  * Redistribution and use in source and binary forms, with or without
                     12:  * modification, are permitted provided that the following conditions
                     13:  * are met:
                     14:  * 1. Redistributions of source code must retain the above copyright
                     15:  *    notice, this list of conditions and the following disclaimer.
                     16:  * 2. Redistributions in binary form must reproduce the above copyright
                     17:  *    notice, this list of conditions and the following disclaimer in the
                     18:  *    documentation and/or other materials provided with the distribution.
1.2     ! agc        19:  * 3. Neither the name of the University nor the names of its contributors
1.1       fredette   20:  *    may be used to endorse or promote products derived from this software
                     21:  *    without specific prior written permission.
                     22:  *
                     23:  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
                     24:  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
                     25:  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
                     26:  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
                     27:  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
                     28:  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
                     29:  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
                     30:  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
                     31:  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
                     32:  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
                     33:  * SUCH DAMAGE.
                     34:  */
                     35:
                     36: #include <sys/cdefs.h>
                     37: #if defined(LIBC_SCCS) && !defined(lint)
                     38: #if 0
                     39: static char sccsid[] = "@(#)kvm_hp300.c        8.1 (Berkeley) 6/4/93";
                     40: #else
1.2     ! agc        41: __RCSID("$NetBSD: kvm_hppa.c,v 1.1 2002/06/06 20:31:25 fredette Exp $");
1.1       fredette   42: #endif
                     43: #endif /* LIBC_SCCS and not lint */
                     44:
                     45: /*
                     46:  * hppa machine dependent routines for kvm.
                     47:  * XXX fredette - largely unimplemented so far.  what is here
                     48:  * is lifted and disabled.
                     49:  */
                     50:
                     51: #include <sys/param.h>
                     52: #include <sys/user.h>
                     53: #include <sys/proc.h>
                     54: #include <sys/stat.h>
                     55: #include <sys/kcore.h>
                     56: #include <machine/kcore.h>
                     57: #include <stdlib.h>
                     58: #include <unistd.h>
                     59: #include <nlist.h>
                     60: #include <kvm.h>
                     61:
                     62: #include <uvm/uvm_extern.h>
                     63:
                     64: #include <limits.h>
                     65: #include <db.h>
                     66:
                     67: #include "kvm_private.h"
                     68:
                     69: #include <machine/pmap.h>
                     70: #include <machine/pte.h>
                     71: #include <machine/vmparam.h>
                     72:
                     73: #ifndef btop
                     74: #define        btop(x)         (((unsigned)(x)) >> PGSHIFT)    /* XXX */
                     75: #define        ptob(x)         ((caddr_t)((x) << PGSHIFT))     /* XXX */
                     76: #endif
                     77:
                     78: void
                     79: _kvm_freevtop(kd)
                     80:        kvm_t *kd;
                     81: {
                     82:
                     83:        /* Not actually used for anything right now, but safe. */
                     84:        if (kd->vmst != 0)
                     85:                free(kd->vmst);
                     86: }
                     87:
                     88: /*ARGSUSED*/
                     89: int
                     90: _kvm_initvtop(kd)
                     91:        kvm_t *kd;
                     92: {
                     93:
                     94:        return (0);
                     95: }
                     96:
                     97: /*
                     98:  * Translate a kernel virtual address to a physical address.
                     99:  */
                    100: int
                    101: _kvm_kvatop(kd, va, pa)
                    102:        kvm_t *kd;
                    103:        u_long va;
                    104:        u_long *pa;
                    105: {
                    106: #if 0
                    107:        cpu_kcore_hdr_t *cpu_kh;
                    108:        u_long page_off;
                    109:        pd_entry_t pde;
                    110:        pt_entry_t pte;
                    111:        u_long pde_pa, pte_pa;
                    112: #endif
                    113:
                    114:        if (ISALIVE(kd)) {
                    115:                _kvm_err(kd, 0, "vatop called in live kernel!");
                    116:                return (0);
                    117:        }
                    118:
                    119:        _kvm_syserr(kd, 0, "could not read PTE");
                    120:
                    121: #if 0
                    122:        cpu_kh = kd->cpu_data;
                    123:        page_off = va & PGOFSET;
                    124:
                    125:        /*
                    126:         * Find and read the page directory entry.
                    127:         */
                    128:        pde_pa = cpu_kh->ptdpaddr + (pdei(va) * sizeof(pd_entry_t));
                    129:        if (pread(kd->pmfd, (void *)&pde, sizeof(pde),
                    130:            _kvm_pa2off(kd, pde_pa)) != sizeof(pde)) {
                    131:                _kvm_syserr(kd, 0, "could not read PDE");
                    132:                goto lose;
                    133:        }
                    134:
                    135:        /*
                    136:         * Find and read the page table entry.
                    137:         */
                    138:        if ((pde & PG_V) == 0) {
                    139:                _kvm_err(kd, 0, "invalid translation (invalid PDE)");
                    140:                goto lose;
                    141:        }
                    142:        pte_pa = (pde & PG_FRAME) + (ptei(va) * sizeof(pt_entry_t));
                    143:        if (pread(kd->pmfd, (void *) &pte, sizeof(pte),
                    144:            _kvm_pa2off(kd, pte_pa)) != sizeof(pte)) {
                    145:                _kvm_syserr(kd, 0, "could not read PTE");
                    146:                goto lose;
                    147:        }
                    148:
                    149:        /*
                    150:         * Validate the PTE and return the physical address.
                    151:         */
                    152:        if ((pte & PG_V) == 0) {
                    153:                _kvm_err(kd, 0, "invalid translation (invalid PTE)");
                    154:                goto lose;
                    155:        }
                    156:        *pa = (pte & PG_FRAME) + page_off;
                    157:        return (int)(NBPG - page_off);
                    158:
                    159:  lose:
                    160: #endif
                    161:        *pa = (u_long)~0L;
                    162:        return (0);
                    163: }
                    164:
                    165: /*
                    166:  * Translate a physical address to a file-offset in the crash dump.
                    167:  */
                    168: off_t
                    169: _kvm_pa2off(kd, pa)
                    170:        kvm_t *kd;
                    171:        u_long pa;
                    172: {
                    173: #if 0
                    174:        cpu_kcore_hdr_t *cpu_kh;
                    175:        phys_ram_seg_t *ramsegs;
                    176:        off_t off;
                    177:        int i;
                    178:
                    179:        cpu_kh = kd->cpu_data;
                    180:        ramsegs = (void *)((char *)(void *)cpu_kh + ALIGN(sizeof *cpu_kh));
                    181:
                    182:        off = 0;
                    183:        for (i = 0; i < cpu_kh->nmemsegs; i++) {
                    184:                if (pa >= ramsegs[i].start &&
                    185:                    (pa - ramsegs[i].start) < ramsegs[i].size) {
                    186:                        off += (pa - ramsegs[i].start);
                    187:                        break;
                    188:                }
                    189:                off += ramsegs[i].size;
                    190:        }
                    191:
                    192:        return (kd->dump_off + off);
                    193: #endif
                    194:        return 0;
                    195: }
                    196:
                    197: /*
                    198:  * Machine-dependent initialization for ALL open kvm descriptors,
                    199:  * not just those for a kernel crash dump.  Some architectures
                    200:  * have to deal with these NOT being constants!  (i.e. m68k)
                    201:  */
                    202: int
                    203: _kvm_mdopen(kd)
                    204:        kvm_t   *kd;
                    205: {
                    206:
                    207:        kd->usrstack = USRSTACK;
                    208:        kd->min_uva = VM_MIN_ADDRESS;
                    209:        kd->max_uva = VM_MAXUSER_ADDRESS;
                    210:
                    211:        return (0);
                    212: }

CVSweb <webmaster@jp.NetBSD.org>