From 34e1fb2c5a0141161dcd1b5fb419e43cae20681e Mon Sep 17 00:00:00 2001 From: Joel Sherrill Date: Wed, 24 Oct 2012 15:38:22 -0500 Subject: [PATCH] Add support for kvm.h in RTEMS terms The implementation uses an array of strings and variable names. The names are weak symbolic references to the items we have seen calls to kvm services with. --- .gitignore | 1 + freebsd-userspace/Makefile | 8 +- freebsd-userspace/rtems/generate_kvm_symbols | 108 +++++++++++++++++++ freebsd-userspace/rtems/kvm_private.h | 13 +++ freebsd-userspace/rtems/rtems-kvm.c | 107 ++++++++++++++++++ 5 files changed, 236 insertions(+), 1 deletion(-) create mode 100755 freebsd-userspace/rtems/generate_kvm_symbols create mode 100644 freebsd-userspace/rtems/kvm_private.h create mode 100644 freebsd-userspace/rtems/rtems-kvm.c diff --git a/.gitignore b/.gitignore index f4295e39..ed02e83d 100644 --- a/.gitignore +++ b/.gitignore @@ -66,3 +66,4 @@ rtemsbsd/v850/include/freebsd/machine/pci_cfgreg.h freebsd-userspace/lib/libc/net/nslexer.c freebsd-userspace/lib/libc/net/nsparser.c freebsd-userspace/lib/libc/net/nsparser.i +freebsd-userspace/rtems/rtems-kvm-symbols.c diff --git a/freebsd-userspace/Makefile b/freebsd-userspace/Makefile index 554ca649..cef8546e 100644 --- a/freebsd-userspace/Makefile +++ b/freebsd-userspace/Makefile @@ -163,6 +163,8 @@ C_FILES += lib/libipsec/policy_parse.c # RTEMS Specific Files # C_FILES += rtems/rtems-net-setup.c C_FILES += rtems/syslog.c +C_FILES += rtems/rtems-kvm.c +C_FILES += rtems/rtems-kvm-symbols.c C_FILES += rtems/rtems-syslog-initialize.c C_FILES += rtems/rtems-getprogname.c C_FILES += rtems/rtems-uthread_main_np.c @@ -270,7 +272,8 @@ NETSTAT = commands/usr.bin/netstat/netstat.rel COMMAND_RELS = $(NETSTAT) $(IFCONFIG) -GEN_FILES = include/rpc/rpcb_prot.h +GEN_FILES = rtems/rtems-kvm-symbols.c +GEN_FILES += include/rpc/rpcb_prot.h GEN_FILES += commands/sbin/route/keywords.h # lib/libc/net GEN_FILES += lib/libc/net/nslexer.c @@ -295,6 +298,9 @@ $(IFCONFIG): $(IFCONFIG_C_O_FILES) $(NETSTAT): $(NETSTAT_C_O_FILES) $(LD) -r -o $@ $^ +rtems/rtems-kvm-symbols.c: rtems/generate_kvm_symbols + ./rtems/generate_kvm_symbols >rtems/rtems-kvm-symbols.c + include/rpc/rpcb_prot.h: include/rpc/rpcb_prot.x rm -f include/rpc/rpcb_prot.h rpcgen -h -o include/rpc/rpcb_prot.h include/rpc/rpcb_prot.x diff --git a/freebsd-userspace/rtems/generate_kvm_symbols b/freebsd-userspace/rtems/generate_kvm_symbols new file mode 100755 index 00000000..b26259c7 --- /dev/null +++ b/freebsd-userspace/rtems/generate_kvm_symbols @@ -0,0 +1,108 @@ +#! /bin/sh +# +# This file generates the symbol table for the kvm subsystem. The +# table is limited to the ones we believe are needed. + +symbols="" +while read sym +do + symbols="${symbols} ${sym}" +done < + +typedef struct { + const char *symbol; + uintptr_t value; +} kvm_symval_t; + +kvm_symval_t rtems_kvm_symbols[]; + +#endif diff --git a/freebsd-userspace/rtems/rtems-kvm.c b/freebsd-userspace/rtems/rtems-kvm.c new file mode 100644 index 00000000..e5e55374 --- /dev/null +++ b/freebsd-userspace/rtems/rtems-kvm.c @@ -0,0 +1,107 @@ +#include "port_before.h" +#include +#include +#include +#include + +#include "kvm_private.h" + +char * +kvm_geterr( + kvm_t *kd +) +{ + return "KVM error"; + // return (kd->errbuf); +} + +kvm_t * +kvm_openfiles( + const char *uf, + const char *mf, + const char *sf __unused, + int flag, + char *errout +) +{ + return (kvm_t *)kvm_openfiles; +} + +int +kvm_nlist(kvm_t *kd, struct nlist *nl) +{ + struct nlist *p; + int nvalid; + int error; + kvm_symval_t *kvm; + + assert( kd != NULL ); + assert( nl != NULL ); + + nvalid = 0; +again: + for (p = nl; p->n_name && p->n_name[0]; ++p) { + if (p->n_type != N_UNDF) + continue; + if (p->n_name[0] != '_') + continue; + + for (kvm=rtems_kvm_symbols; kvm->symbol[0]; ++kvm) { + if (!strcmp(p->n_name, kvm->symbol)) { + p->n_type = N_TEXT; + p->n_other = 0; + p->n_desc = 0; + p->n_value = kvm->value; + if (kvm->value) { + ++nvalid; + printf("kvm: %s = %p\n", p->n_name, (void*)kvm->value); + } + break; + } + } + if (! kvm->symbol[0]) { + printf("kvm: did not know about %s\n", p->n_name); + } + } + + error = ((p - nl) - nvalid); + return (error); + +} + + +ssize_t +kvm_read(kd, kva, buf, len) + kvm_t *kd; + u_long kva; + void *buf; + size_t len; +{ + assert( kd != NULL ); + assert( buf != NULL ); + + if ( kva == 0 ) + return (-1); + +#ifdef __rtems__ + // printf( "%d from %p to %p\n", len, (void*)kva, buf); +#endif +#if 0 + /* + * Use a byte-wide copy to avoid alignment issues. + */ + { + unsigned char *s; + unsigned char *d; + size_t c; + + s = (void *)kva; + d = buf; + for (c=0; c