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