svn commit: r260022 - head/lib/libkvm
Marcel Moolenaar
marcel at FreeBSD.org
Sat Dec 28 23:01:58 UTC 2013
Author: marcel
Date: Sat Dec 28 23:01:57 2013
New Revision: 260022
URL: http://svnweb.freebsd.org/changeset/base/260022
Log:
Allow building a cross libkvm by setting TARGET_ARCH. The library so
produced will be called libkvm-${ARCH} instead of libkvm. This allows
installing it alongside the native version.
For symbol lookups, use ps_pglobal_lookup() instead of __fdnlist()
when building a cross libkvm. It is assumed that the cross tool that
uses the cross libkvm also provides an implementation for this
proc_services function.
Note that this commit does not change any of the architecture-specific
code for cross-compilation.
Modified:
head/lib/libkvm/Makefile
head/lib/libkvm/kvm.c
Modified: head/lib/libkvm/Makefile
==============================================================================
--- head/lib/libkvm/Makefile Sat Dec 28 22:52:46 2013 (r260021)
+++ head/lib/libkvm/Makefile Sat Dec 28 23:01:57 2013 (r260022)
@@ -1,23 +1,35 @@
# @(#)Makefile 8.1 (Berkeley) 6/4/93
# $FreeBSD$
+.if defined(TARGET_ARCH)
+TARGET_CPUARCH=${TARGET_ARCH:C/mips(n32|64)?(el)?/mips/:C/arm(v6)?(eb)?/arm/:C/powerpc64/powerpc/}
+.else
+TARGET_ARCH=${MACHINE_ARCH}
+TARGET_CPUARCH=${MACHINE_CPUARCH}
+.endif
+
+.if ${TARGET_ARCH} != ${MACHINE_ARCH}
+LIB= kvm-${TARGET_ARCH}
+CFLAGS+=-DCROSS_LIBKVM
+.else
LIB= kvm
+.endif
+
SHLIBDIR?= /lib
SHLIB_MAJOR= 6
CFLAGS+=-DLIBC_SCCS -I${.CURDIR}
-.if exists(${.CURDIR}/kvm_${MACHINE_ARCH}.c)
-KVM_ARCH=${MACHINE_ARCH}
+.if exists(${.CURDIR}/kvm_${TARGET_ARCH}.c)
+KVM_ARCH=${TARGET_ARCH}
.else
-KVM_ARCH=${MACHINE_CPUARCH}
+KVM_ARCH=${TARGET_CPUARCH}
.endif
WARNS?= 3
SRCS= kvm.c kvm_${KVM_ARCH}.c kvm_cptime.c kvm_file.c kvm_getloadavg.c \
kvm_getswapinfo.c kvm_pcpu.c kvm_proc.c kvm_vnet.c
-.if ${MACHINE_CPUARCH} == "amd64" || ${MACHINE_CPUARCH} == "i386" || \
- ${MACHINE_CPUARCH} == "arm" || ${MACHINE_CPUARCH} == "mips"
+.if exists(${.CURDIR}/kvm_minidump_${KVM_ARCH}.c)
SRCS+= kvm_minidump_${KVM_ARCH}.c
.endif
INCS= kvm.h
Modified: head/lib/libkvm/kvm.c
==============================================================================
--- head/lib/libkvm/kvm.c Sat Dec 28 22:52:46 2013 (r260021)
+++ head/lib/libkvm/kvm.c Sat Dec 28 23:01:57 2013 (r260022)
@@ -73,9 +73,44 @@ static char sccsid[] = "@(#)kvm.c 8.2 (B
#include "kvm_private.h"
+#ifndef CROSS_LIBKVM
+
/* from src/lib/libc/gen/nlist.c */
int __fdnlist(int, struct nlist *);
+#define kvm_fdnlist __fdnlist
+
+#else
+
+#include <proc_service.h>
+
+static int
+kvm_fdnlist(int fd, struct nlist *list)
+{
+ psaddr_t addr;
+ ps_err_e pserr;
+ int nfail;
+
+ nfail = 0;
+ while (list->n_name != NULL && list->n_name[0] != '\0') {
+ list->n_other = 0;
+ list->n_desc = 0;
+ pserr = ps_pglobal_lookup(NULL, NULL, list->n_name, &addr);
+ if (pserr != PS_OK) {
+ nfail++;
+ list->n_value = 0;
+ list->n_type = 0;
+ } else {
+ list->n_value = addr;
+ list->n_type = N_DATA | N_EXT;
+ }
+ list++;
+ }
+ return (nfail);
+}
+
+#endif /* CROSS_LIBKVM */
+
char *
kvm_geterr(kvm_t *kd)
{
@@ -341,7 +376,7 @@ kvm_fdnlist_prefix(kvm_t *kd, struct nli
/* Do lookup on the reduced list. */
np = n;
- unresolved = __fdnlist(kd->nlfd, np);
+ unresolved = kvm_fdnlist(kd->nlfd, np);
/* Check if we could resolve further symbols and update the list. */
if (unresolved >= 0 && unresolved < missing) {
@@ -398,7 +433,7 @@ _kvm_nlist(kvm_t *kd, struct nlist *nl,
* slow library call.
*/
if (!ISALIVE(kd)) {
- error = __fdnlist(kd->nlfd, nl);
+ error = kvm_fdnlist(kd->nlfd, nl);
if (error <= 0) /* Hard error or success. */
return (error);
More information about the svn-src-head
mailing list