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