kvm_arm.c (194186) | kvm_arm.c (217744) |
---|---|
1/*- 2 * Copyright (c) 2005 Olivier Houchard 3 * Copyright (c) 1989, 1992, 1993 4 * The Regents of the University of California. All rights reserved. 5 * 6 * This code is derived from software developed by the Computer Systems 7 * Engineering group at Lawrence Berkeley Laboratory under DARPA contract 8 * BG 91-66 and contributed to Berkeley. --- 22 unchanged lines hidden (view full) --- 31 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 32 */ 33 34/* 35 * ARM machine dependent routines for kvm. 36 */ 37 38#include <sys/cdefs.h> | 1/*- 2 * Copyright (c) 2005 Olivier Houchard 3 * Copyright (c) 1989, 1992, 1993 4 * The Regents of the University of California. All rights reserved. 5 * 6 * This code is derived from software developed by the Computer Systems 7 * Engineering group at Lawrence Berkeley Laboratory under DARPA contract 8 * BG 91-66 and contributed to Berkeley. --- 22 unchanged lines hidden (view full) --- 31 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 32 */ 33 34/* 35 * ARM machine dependent routines for kvm. 36 */ 37 38#include <sys/cdefs.h> |
39__FBSDID("$FreeBSD: head/lib/libkvm/kvm_arm.c 194186 2009-06-14 12:42:06Z ed $"); | 39__FBSDID("$FreeBSD: head/lib/libkvm/kvm_arm.c 217744 2011-01-23 11:08:28Z uqs $"); |
40 41#include <sys/param.h> 42#include <sys/elf32.h> 43#include <sys/mman.h> 44 45#include <vm/vm.h> 46#include <vm/vm_param.h> 47#include <vm/pmap.h> --- 71 unchanged lines hidden (view full) --- 119 kd->vmst = NULL; 120 } 121} 122 123int 124_kvm_initvtop(kvm_t *kd) 125{ 126 struct vmstate *vm; | 40 41#include <sys/param.h> 42#include <sys/elf32.h> 43#include <sys/mman.h> 44 45#include <vm/vm.h> 46#include <vm/vm_param.h> 47#include <vm/pmap.h> --- 71 unchanged lines hidden (view full) --- 119 kd->vmst = NULL; 120 } 121} 122 123int 124_kvm_initvtop(kvm_t *kd) 125{ 126 struct vmstate *vm; |
127 struct nlist nlist[2]; | 127 struct nlist nl[2]; |
128 u_long kernbase, physaddr, pa; 129 pd_entry_t *l1pt; 130 Elf32_Ehdr *ehdr; 131 size_t hdrsz; 132 char minihdr[8]; 133 134 if (!kd->rawdump) { 135 if (pread(kd->pmfd, &minihdr, 8, 0) == 8) { --- 13 unchanged lines hidden (view full) --- 149 kd->vmst = vm; 150 vm->l1pt = NULL; 151 if (_kvm_maphdrs(kd, sizeof(Elf32_Ehdr)) == -1) 152 return (-1); 153 ehdr = kd->vmst->mmapbase; 154 hdrsz = ehdr->e_phoff + ehdr->e_phentsize * ehdr->e_phnum; 155 if (_kvm_maphdrs(kd, hdrsz) == -1) 156 return (-1); | 128 u_long kernbase, physaddr, pa; 129 pd_entry_t *l1pt; 130 Elf32_Ehdr *ehdr; 131 size_t hdrsz; 132 char minihdr[8]; 133 134 if (!kd->rawdump) { 135 if (pread(kd->pmfd, &minihdr, 8, 0) == 8) { --- 13 unchanged lines hidden (view full) --- 149 kd->vmst = vm; 150 vm->l1pt = NULL; 151 if (_kvm_maphdrs(kd, sizeof(Elf32_Ehdr)) == -1) 152 return (-1); 153 ehdr = kd->vmst->mmapbase; 154 hdrsz = ehdr->e_phoff + ehdr->e_phentsize * ehdr->e_phnum; 155 if (_kvm_maphdrs(kd, hdrsz) == -1) 156 return (-1); |
157 nlist[0].n_name = "kernbase"; 158 nlist[1].n_name = NULL; 159 if (kvm_nlist(kd, nlist) != 0) | 157 nl[0].n_name = "kernbase"; 158 nl[1].n_name = NULL; 159 if (kvm_nlist(kd, nl) != 0) |
160 kernbase = KERNBASE; 161 else | 160 kernbase = KERNBASE; 161 else |
162 kernbase = nlist[0].n_value; | 162 kernbase = nl[0].n_value; |
163 | 163 |
164 nlist[0].n_name = "physaddr"; 165 if (kvm_nlist(kd, nlist) != 0) { | 164 nl[0].n_name = "physaddr"; 165 if (kvm_nlist(kd, nl) != 0) { |
166 _kvm_err(kd, kd->program, "couldn't get phys addr"); 167 return (-1); 168 } | 166 _kvm_err(kd, kd->program, "couldn't get phys addr"); 167 return (-1); 168 } |
169 physaddr = nlist[0].n_value; 170 nlist[0].n_name = "kernel_l1pa"; 171 if (kvm_nlist(kd, nlist) != 0) { | 169 physaddr = nl[0].n_value; 170 nl[0].n_name = "kernel_l1pa"; 171 if (kvm_nlist(kd, nl) != 0) { |
172 _kvm_err(kd, kd->program, "bad namelist"); 173 return (-1); 174 } | 172 _kvm_err(kd, kd->program, "bad namelist"); 173 return (-1); 174 } |
175 if (kvm_read(kd, (nlist[0].n_value - kernbase + physaddr), &pa, | 175 if (kvm_read(kd, (nl[0].n_value - kernbase + physaddr), &pa, |
176 sizeof(pa)) != sizeof(pa)) { 177 _kvm_err(kd, kd->program, "cannot read kernel_l1pa"); 178 return (-1); 179 } 180 l1pt = _kvm_malloc(kd, L1_TABLE_SIZE); 181 if (kvm_read(kd, pa, l1pt, L1_TABLE_SIZE) != L1_TABLE_SIZE) { 182 _kvm_err(kd, kd->program, "cannot read l1pt"); 183 free(l1pt); --- 16 unchanged lines hidden (view full) --- 200#define l1pte_valid(pde) ((pde) != 0) 201#define l2pte_valid(pte) ((pte) != 0) 202#define l2pte_index(v) (((v) & L2_ADDR_BITS) >> L2_S_SHIFT) 203 204 205int 206_kvm_kvatop(kvm_t *kd, u_long va, off_t *pa) 207{ | 176 sizeof(pa)) != sizeof(pa)) { 177 _kvm_err(kd, kd->program, "cannot read kernel_l1pa"); 178 return (-1); 179 } 180 l1pt = _kvm_malloc(kd, L1_TABLE_SIZE); 181 if (kvm_read(kd, pa, l1pt, L1_TABLE_SIZE) != L1_TABLE_SIZE) { 182 _kvm_err(kd, kd->program, "cannot read l1pt"); 183 free(l1pt); --- 16 unchanged lines hidden (view full) --- 200#define l1pte_valid(pde) ((pde) != 0) 201#define l2pte_valid(pte) ((pte) != 0) 202#define l2pte_index(v) (((v) & L2_ADDR_BITS) >> L2_S_SHIFT) 203 204 205int 206_kvm_kvatop(kvm_t *kd, u_long va, off_t *pa) 207{ |
208 u_long offset = va & (PAGE_SIZE - 1); | |
209 struct vmstate *vm = kd->vmst; 210 pd_entry_t pd; 211 pt_entry_t pte; 212 u_long pte_pa; 213 214 if (kd->vmst->minidump) 215 return (_kvm_minidump_kvatop(kd, va, pa)); 216 --- 22 unchanged lines hidden (view full) --- 239 } 240 if ((pte & L2_TYPE_MASK) == L2_TYPE_L) { 241 *pa = (pte & L2_L_FRAME) | (va & L2_L_OFFSET); 242 return (_kvm_pa2off(kd, *pa, pa, L2_L_SIZE)); 243 } 244 *pa = (pte & L2_S_FRAME) | (va & L2_S_OFFSET); 245 return (_kvm_pa2off(kd, *pa, pa, PAGE_SIZE)); 246invalid: | 208 struct vmstate *vm = kd->vmst; 209 pd_entry_t pd; 210 pt_entry_t pte; 211 u_long pte_pa; 212 213 if (kd->vmst->minidump) 214 return (_kvm_minidump_kvatop(kd, va, pa)); 215 --- 22 unchanged lines hidden (view full) --- 238 } 239 if ((pte & L2_TYPE_MASK) == L2_TYPE_L) { 240 *pa = (pte & L2_L_FRAME) | (va & L2_L_OFFSET); 241 return (_kvm_pa2off(kd, *pa, pa, L2_L_SIZE)); 242 } 243 *pa = (pte & L2_S_FRAME) | (va & L2_S_OFFSET); 244 return (_kvm_pa2off(kd, *pa, pa, PAGE_SIZE)); 245invalid: |
247 _kvm_err(kd, 0, "Invalid address (%x)", va); | 246 _kvm_err(kd, 0, "Invalid address (%lx)", va); |
248 return 0; 249} 250 251/* 252 * Machine-dependent initialization for ALL open kvm descriptors, 253 * not just those for a kernel crash dump. Some architectures 254 * have to deal with these NOT being constants! (i.e. m68k) 255 */ | 247 return 0; 248} 249 250/* 251 * Machine-dependent initialization for ALL open kvm descriptors, 252 * not just those for a kernel crash dump. Some architectures 253 * have to deal with these NOT being constants! (i.e. m68k) 254 */ |
255#ifdef FBSD_NOT_YET |
|
256int | 256int |
257_kvm_mdopen(kd) 258 kvm_t *kd; | 257_kvm_mdopen(kvm_t *kd) |
259{ 260 | 258{ 259 |
261#ifdef FBSD_NOT_YET | |
262 kd->usrstack = USRSTACK; 263 kd->min_uva = VM_MIN_ADDRESS; 264 kd->max_uva = VM_MAXUSER_ADDRESS; | 260 kd->usrstack = USRSTACK; 261 kd->min_uva = VM_MIN_ADDRESS; 262 kd->max_uva = VM_MAXUSER_ADDRESS; |
265#endif | |
266 267 return (0); 268} | 263 264 return (0); 265} |
266#endif |
|