source: rtems-libbsd/freebsd-userspace/rtems/rtems-kvm.c @ 34e1fb2

4.1155-freebsd-126-freebsd-12freebsd-9.3
Last change on this file since 34e1fb2 was 34e1fb2, checked in by Joel Sherrill <joel.sherrill@…>, on 10/24/12 at 20:38:22

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.

  • Property mode set to 100644
File size: 1.6 KB
Line 
1#include "port_before.h"
2#include <sys/cdefs.h>
3#include <kvm.h>
4#include <nlist.h>
5#include <assert.h>
6
7#include "kvm_private.h"
8
9char *
10kvm_geterr(
11        kvm_t *kd
12)
13{
14        return "KVM error";
15        // return (kd->errbuf);
16}
17
18kvm_t *
19kvm_openfiles(
20        const char *uf,
21        const char *mf,
22        const char *sf __unused,
23        int flag,
24        char *errout
25)
26{
27  return (kvm_t *)kvm_openfiles;
28}
29
30int
31kvm_nlist(kvm_t *kd, struct nlist *nl)
32{
33        struct nlist *p;
34        int nvalid;
35        int error;
36        kvm_symval_t *kvm;
37
38        assert( kd != NULL );
39        assert( nl != NULL );
40
41        nvalid = 0;
42again:
43        for (p = nl; p->n_name && p->n_name[0]; ++p) {
44                if (p->n_type != N_UNDF)
45                        continue;
46                if (p->n_name[0] != '_')
47                        continue;
48             
49                for (kvm=rtems_kvm_symbols; kvm->symbol[0]; ++kvm) {
50                        if (!strcmp(p->n_name, kvm->symbol)) {
51                                p->n_type = N_TEXT;
52                                p->n_other = 0;
53                                p->n_desc = 0;
54                                p->n_value = kvm->value;
55                                if (kvm->value) {
56                                        ++nvalid;
57                        printf("kvm: %s = %p\n", p->n_name, (void*)kvm->value);
58                                }
59                                break;
60                        }
61                }
62                if (! kvm->symbol[0]) {
63                        printf("kvm: did not know about %s\n", p->n_name);
64                }
65        }
66
67        error = ((p - nl) - nvalid);
68        return (error);
69
70}
71
72
73ssize_t
74kvm_read(kd, kva, buf, len)
75        kvm_t *kd;
76        u_long kva;
77        void *buf;
78        size_t len;
79{
80        assert( kd != NULL );
81        assert( buf != NULL );
82
83        if ( kva == 0 )
84                return (-1);
85
86#ifdef __rtems__
87        // printf( "%d from %p to %p\n", len, (void*)kva, buf);
88#endif
89#if 0
90        /*
91         * Use a byte-wide copy to avoid alignment issues.
92         */
93        {
94                unsigned char *s;
95                unsigned char *d;
96                size_t c;
97
98                s = (void *)kva;
99                d = buf;
100                for (c=0; c<len ; c++)
101                        *d++ = *s++;
102        }
103#else
104        memcpy(buf, (void *)kva, len);
105#endif
106        return len;
107}
Note: See TracBrowser for help on using the repository browser.