diff options
author | jhb <jhb@FreeBSD.org> | 2015-11-27 18:58:26 +0000 |
---|---|---|
committer | jhb <jhb@FreeBSD.org> | 2015-11-27 18:58:26 +0000 |
commit | ab35544b83d7494b58b4327d7a9e6d66da7ab579 (patch) | |
tree | 0b881610c55721cfde72c0eaeb1df3d9d654fd26 /lib/libkvm/kvm_pcpu.c | |
parent | fd20cedd093bc1221cdc050bac05276a1b9a36ba (diff) | |
download | FreeBSD-src-ab35544b83d7494b58b4327d7a9e6d66da7ab579.zip FreeBSD-src-ab35544b83d7494b58b4327d7a9e6d66da7ab579.tar.gz |
Add support to libkvm for reading vmcores from other architectures.
- Add a kvaddr_type to represent kernel virtual addresses instead of
unsigned long.
- Add a struct kvm_nlist which is a stripped down version of struct nlist
that uses kvaddr_t for n_value.
- Add a kvm_native() routine that returns true if an open kvm descriptor
is for a native kernel and memory image.
- Add a kvm_open2() function similar to kvm_openfiles(). It drops the
unused 'swapfile' argument and adds a new function pointer argument for
a symbol resolving function. Native kernels still use _fdnlist() from
libc to resolve symbols if a resolver function is not supplied, but cross
kernels require a resolver.
- Add a kvm_nlist2() function similar to kvm_nlist() except that it uses
struct kvm_nlist instead of struct nlist.
- Add a kvm_read2() function similar to kvm_read() except that it uses
kvaddr_t instead of unsigned long for the kernel virtual address.
- Add a new kvm_arch switch of routines needed by a vmcore backend.
Each backend is responsible for implementing kvm_read2() for a given
vmcore format.
- Use libelf to read headers from ELF kernels and cores (except for
powerpc cores).
- Add internal helper routines for the common page offset hash table used
by the minidump backends.
- Port all of the existing kvm backends to implement a kvm_arch switch and
to be cross-friendly by using private constants instead of ones that
vary by platform (e.g. PAGE_SIZE). Static assertions are present when
a given backend is compiled natively to ensure the private constants
match the real ones.
- Enable all of the existing vmcore backends on all platforms. This means
that libkvm on any platform should be able to perform KVA translation
and read data from a vmcore of any platform.
Tested on: amd64, i386, sparc64 (marius)
Differential Revision: https://reviews.freebsd.org/D3341
Diffstat (limited to 'lib/libkvm/kvm_pcpu.c')
-rw-r--r-- | lib/libkvm/kvm_pcpu.c | 14 |
1 files changed, 11 insertions, 3 deletions
diff --git a/lib/libkvm/kvm_pcpu.c b/lib/libkvm/kvm_pcpu.c index c4d3176..eaea7e4 100644 --- a/lib/libkvm/kvm_pcpu.c +++ b/lib/libkvm/kvm_pcpu.c @@ -216,7 +216,7 @@ _kvm_dpcpu_setcpu(kvm_t *kd, u_int cpu, int report_error) static int _kvm_dpcpu_init(kvm_t *kd) { - struct nlist nl[] = { + struct kvm_nlist nl[] = { #define NLIST_START_SET_PCPU 0 { .n_name = "___start_" DPCPU_SETNAME }, #define NLIST_STOP_SET_PCPU 1 @@ -232,6 +232,12 @@ _kvm_dpcpu_init(kvm_t *kd) u_int dpcpu_maxcpus; /* + * XXX: This only works for native kernels for now. + */ + if (!kvm_native(kd)) + return (-1); + + /* * Locate and cache locations of important symbols using the internal * version of _kvm_nlist, turning off initialization to avoid * recursion in case of unresolveable symbols. @@ -279,8 +285,8 @@ _kvm_dpcpu_initialized(kvm_t *kd, int intialize) * Check whether the value is within the dpcpu symbol range and only if so * adjust the offset relative to the current offset. */ -uintptr_t -_kvm_dpcpu_validaddr(kvm_t *kd, uintptr_t value) +kvaddr_t +_kvm_dpcpu_validaddr(kvm_t *kd, kvaddr_t value) { if (value == 0) @@ -319,6 +325,8 @@ ssize_t kvm_read_zpcpu(kvm_t *kd, u_long base, void *buf, size_t size, int cpu) { + if (!kvm_native(kd)) + return (-1); return (kvm_read(kd, (uintptr_t)(base + sizeof(struct pcpu) * cpu), buf, size)); } |