File:  [DragonFly] / src / lib / libkvm / Attic / kvm_alpha.c
Revision 1.3: download - view: text, annotated - select for diffs
Sun Apr 11 21:28:03 2004 UTC (10 years ago) by cpressey
Branches: MAIN
CVS tags: HEAD, DragonFly_Stable, DragonFly_Snap29Sep2004, DragonFly_Snap13Sep2004, DragonFly_RELEASE_1_6_Slip, DragonFly_RELEASE_1_6, DragonFly_RELEASE_1_4_Slip, DragonFly_RELEASE_1_4, DragonFly_RELEASE_1_2_Slip, DragonFly_RELEASE_1_2, DragonFly_1_0_REL, DragonFly_1_0_RC1, DragonFly_1_0A_REL
Style(9) cleanup.

- Convert K&R-style function definitions to ANSI style.
- Remove `register' keywords.
- Use stdarg.h instead of varargs.h for variable numbers of arguments.
- #define _KERNEL_STRUCTURES when accessing kernel structures.
- No functional changes.

    1: /* $FreeBSD: src/lib/libkvm/kvm_alpha.c,v 1.4 1999/12/27 07:14:56 peter Exp $ */
    2: /* $DragonFly: src/lib/libkvm/kvm_alpha.c,v 1.3 2004/04/11 21:28:03 cpressey Exp $ */
    3: /*	$NetBSD: kvm_alpha.c,v 1.7.2.1 1997/11/02 20:34:26 mellon Exp $	*/
    4: 
    5: /*
    6:  * Copyright (c) 1994, 1995 Carnegie-Mellon University.
    7:  * All rights reserved.
    8:  *
    9:  * Author: Chris G. Demetriou
   10:  * 
   11:  * Permission to use, copy, modify and distribute this software and
   12:  * its documentation is hereby granted, provided that both the copyright
   13:  * notice and this permission notice appear in all copies of the
   14:  * software, derivative works or modified versions, and any portions
   15:  * thereof, and that both notices appear in supporting documentation.
   16:  * 
   17:  * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS" 
   18:  * CONDITION.  CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND 
   19:  * FOR ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
   20:  * 
   21:  * Carnegie Mellon requests users of this software to return to
   22:  *
   23:  *  Software Distribution Coordinator  or  Software.Distribution@CS.CMU.EDU
   24:  *  School of Computer Science
   25:  *  Carnegie Mellon University
   26:  *  Pittsburgh PA 15213-3890
   27:  *
   28:  * any improvements or extensions that they make and grant Carnegie the
   29:  * rights to redistribute these changes.
   30:  */
   31: 
   32: #include <sys/param.h>
   33: #include <sys/user.h>
   34: #include <sys/proc.h>
   35: #include <sys/stat.h>
   36: #include <sys/types.h>
   37: #include <sys/uio.h>
   38: #include <unistd.h>
   39: #include <nlist.h>
   40: #include <kvm.h>
   41: 
   42: #include <vm/vm.h>
   43: #include <vm/vm_param.h>
   44: 
   45: #include <limits.h>
   46: #include <stdlib.h>
   47: #include <machine/pmap.h>
   48: #include "kvm_private.h"
   49: 
   50: static off_t   _kvm_pa2off(kvm_t *kd, u_long pa);
   51: 
   52: struct vmstate {
   53: 	u_int64_t       lev1map_pa;             /* PA of Lev1map */
   54:         u_int64_t       page_size;              /* Page size */
   55:         u_int64_t       nmemsegs;               /* Number of RAM segm */
   56: };
   57: 
   58: void
   59: _kvm_freevtop(kvm_t *kd)
   60: {
   61: 	/* Not actually used for anything right now, but safe. */
   62: 	if (kd->vmst != 0)
   63: 		free(kd->vmst);
   64: }
   65: 
   66: int
   67: _kvm_initvtop(kvm_t *kd)
   68: {
   69: 	struct vmstate *vm;
   70: 	struct nlist nlist[2];
   71: 	u_long pa;
   72: 
   73: 	vm = (struct vmstate *)_kvm_malloc(kd, sizeof(*vm));
   74: 	if (vm == 0) {
   75: 		_kvm_err(kd, kd->program, "cannot allocate vm");
   76: 		return (-1);
   77: 	}
   78: 	kd->vmst = vm;
   79: 	vm->page_size = ALPHA_PGBYTES;
   80: 
   81: 	nlist[0].n_name = "_Lev1map";
   82: 	nlist[1].n_name = 0;
   83: 
   84: 	if (kvm_nlist(kd, nlist) != 0) {
   85: 		_kvm_err(kd, kd->program, "bad namelist");
   86: 		return (-1);
   87: 	}
   88: 
   89: 	if(!ISALIVE(kd)) {
   90: 		if (kvm_read(kd, (nlist[0].n_value), &pa, sizeof(pa)) != sizeof(pa)) {
   91: 			_kvm_err(kd, kd->program, "cannot read Lev1map");
   92: 			return (-1);
   93: 		}
   94: 	} else 
   95: 		if (kvm_read(kd, (nlist[0].n_value), &pa, sizeof(pa)) != sizeof(pa)) {
   96: 			_kvm_err(kd, kd->program, "cannot read Lev1map");
   97: 			return (-1);
   98: 		}
   99: 	vm->lev1map_pa = pa;
  100: 	return (0);
  101: 
  102: }
  103: 
  104: int
  105: _kvm_kvatop(kvm_t *kd, u_long va, u_long *pa)
  106: {
  107: 	u_int64_t       lev1map_pa;             /* PA of Lev1map */
  108:         u_int64_t       page_size;
  109: 	int rv, page_off;
  110: 	alpha_pt_entry_t pte;
  111: 	off_t pteoff;
  112: 	struct vmstate *vm;
  113: 	vm = kd->vmst ;
  114: 	
  115: 
  116:         if (ISALIVE(kd)) {
  117:                 _kvm_err(kd, 0, "vatop called in live kernel!");
  118:                 return(0);
  119:         }
  120: 	lev1map_pa = vm->lev1map_pa;
  121: 	page_size  = vm->page_size;
  122: 
  123: 	page_off = va & (page_size - 1);
  124: 	if (va >= ALPHA_K0SEG_BASE && va <= ALPHA_K0SEG_END) {
  125: 		/*
  126: 		 * Direct-mapped address: just convert it.
  127: 		 */
  128: 
  129: 		*pa = ALPHA_K0SEG_TO_PHYS(va);
  130: 		rv = page_size - page_off;
  131: 	} else if (va >= ALPHA_K1SEG_BASE && va <= ALPHA_K1SEG_END) {
  132: 		/*
  133: 		 * Real kernel virtual address: do the translation.
  134: 		 */
  135: #define PTMASK			((1 << ALPHA_PTSHIFT) - 1)
  136: #define pmap_lev1_index(va)	(((va) >> ALPHA_L1SHIFT) & PTMASK)
  137: #define pmap_lev2_index(va)	(((va) >> ALPHA_L2SHIFT) & PTMASK)
  138: #define pmap_lev3_index(va)	(((va) >> ALPHA_L3SHIFT) & PTMASK)
  139: 
  140: 		/* Find and read the L1 PTE. */
  141: 		pteoff = lev1map_pa +
  142: 			pmap_lev1_index(va)  * sizeof(alpha_pt_entry_t);
  143: 		if (lseek(kd->pmfd, _kvm_pa2off(kd, pteoff), 0) == -1 ||
  144: 		    read(kd->pmfd, (char *)&pte, sizeof(pte)) != sizeof(pte)) {
  145: 			_kvm_syserr(kd, 0, "could not read L1 PTE");
  146: 			goto lose;
  147: 		}
  148: 
  149: 		/* Find and read the L2 PTE. */
  150: 		if ((pte & ALPHA_PTE_VALID) == 0) {
  151: 			_kvm_err(kd, 0, "invalid translation (invalid L1 PTE)");
  152: 			goto lose;
  153: 		}
  154: 		pteoff = ALPHA_PTE_TO_PFN(pte) * page_size +
  155: 		    pmap_lev2_index(va) * sizeof(alpha_pt_entry_t);
  156: 		if (lseek(kd->pmfd, _kvm_pa2off(kd, pteoff), 0) == -1 ||
  157: 		    read(kd->pmfd, (char *)&pte, sizeof(pte)) != sizeof(pte)) {
  158: 			_kvm_syserr(kd, 0, "could not read L2 PTE");
  159: 			goto lose;
  160: 		}
  161: 
  162: 		/* Find and read the L3 PTE. */
  163: 		if ((pte & ALPHA_PTE_VALID) == 0) {
  164: 			_kvm_err(kd, 0, "invalid translation (invalid L2 PTE)");
  165: 			goto lose;
  166: 		}
  167: 		pteoff = ALPHA_PTE_TO_PFN(pte) * page_size +
  168: 		    pmap_lev3_index(va) * sizeof(alpha_pt_entry_t);
  169: 		if (lseek(kd->pmfd, _kvm_pa2off(kd, pteoff), 0) == -1 ||
  170: 		    read(kd->pmfd, (char *)&pte, sizeof(pte)) != sizeof(pte)) {
  171: 			_kvm_syserr(kd, 0, "could not read L3 PTE");
  172: 			goto lose;
  173: 		}
  174: 
  175: 		/* Fill in the PA. */
  176: 		if ((pte & ALPHA_PTE_VALID) == 0) {
  177: 			_kvm_err(kd, 0, "invalid translation (invalid L3 PTE)");
  178: 			goto lose;
  179: 		}
  180: 		*pa = ALPHA_PTE_TO_PFN(pte) * page_size + page_off;
  181: 		rv = page_size - page_off;
  182: 	} else {
  183: 		/*
  184: 		 * Bogus address (not in KV space): punt.
  185: 		 */
  186: 
  187: 		_kvm_err(kd, 0, "invalid kernel virtual address");
  188: lose:
  189: 		*pa = -1;
  190: 		rv = 0;
  191: 	}
  192: 
  193: 	return (rv);
  194: }
  195: 
  196: /*
  197:  * Translate a physical address to a file-offset in the crash-dump.
  198:  */
  199: off_t   
  200: _kvm_pa2off(kvm_t *kd, u_long pa)
  201: {
  202: 	return ALPHA_K0SEG_TO_PHYS(pa);
  203: }