Project

General

Profile

Statistics
| Revision:

root / lab4 / .minix-src / include / sys / ksyms.h @ 14

History | View | Annotate | Download (4.85 KB)

1 13 up20180614
/*        $NetBSD: ksyms.h,v 1.33 2015/09/06 06:01:02 dholland Exp $        */
2
3
/*
4
 * Copyright (c) 2001, 2003 Anders Magnusson (ragge@ludd.luth.se).
5
 * All rights reserved.
6
 *
7
 * Redistribution and use in source and binary forms, with or without
8
 * modification, are permitted provided that the following conditions
9
 * are met:
10
 * 1. Redistributions of source code must retain the above copyright
11
 *    notice, this list of conditions and the following disclaimer.
12
 * 2. Redistributions in binary form must reproduce the above copyright
13
 *    notice, this list of conditions and the following disclaimer in the
14
 *    documentation and/or other materials provided with the distribution.
15
 * 3. The name of the author may not be used to endorse or promote products
16
 *    derived from this software without specific prior written permission
17
 *
18
 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
19
 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
20
 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
21
 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
22
 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
23
 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
24
 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
25
 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
26
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
27
 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28
 */
29
30
#ifndef _SYS_KSYMS_H_
31
#define _SYS_KSYMS_H_
32
33
#ifdef _KSYMS_PRIVATE
34
#include <sys/exec_elf.h>
35
#include <sys/ioccom.h>
36
#include <sys/queue.h>
37
38
struct ksyms_symtab {
39
        TAILQ_ENTRY(ksyms_symtab) sd_queue; /* All active tables */
40
        const char *sd_name;        /* Name of this table */
41
        Elf_Sym *sd_symstart;        /* Address of symbol table */
42
        uintptr_t sd_minsym;        /* symbol with minimum value */
43
        uintptr_t sd_maxsym;        /* symbol with maximum value */
44
        char *sd_strstart;        /* Address of corresponding string table */
45
        int sd_usroffset;        /* Real address for userspace */
46
        int sd_symsize;                /* Size in bytes of symbol table */
47
        int sd_strsize;                /* Size of string table */
48
        int sd_nglob;                /* Number of global symbols */
49
        bool sd_gone;                /* dead but around for open() */
50
        void *sd_ctfstart;        /* Address of CTF contents */
51
        int sd_ctfsize;                /* Size in bytes of CTF contents */
52
        uint32_t *sd_nmap;        /* Name map for sorted symbols */
53
        int sd_nmapsize;        /* Total span of map */
54
};
55
56
/*
57
 * Static allocated ELF header.
58
 * Basic info is filled in at attach, sizes at open.
59
 */
60
#define        SHNOTE                1
61
#define        SYMTAB                2
62
#define        STRTAB                3
63
#define        SHSTRTAB        4
64
#define        SHBSS                5
65
#define        SHCTF                6
66
#define        NSECHDR                7
67
68
#define        NPRGHDR                1
69
#define        SHSTRSIZ        64
70
71
struct ksyms_hdr {
72
        Elf_Ehdr        kh_ehdr;
73
        Elf_Phdr        kh_phdr[NPRGHDR];
74
        Elf_Shdr        kh_shdr[NSECHDR];
75
        char                 kh_strtab[SHSTRSIZ];
76
        /* 0=NameSize, 1=DescSize, 2=Tag, 3="NetB", 4="SD\0\0", 5=Version */
77
        int32_t                kh_note[6];
78
};
79
#endif        /* _KSYMS_PRIVATE */
80
81
/*
82
 * Do a lookup of a symbol using the in-kernel lookup algorithm.
83
 */
84
struct ksyms_ogsymbol {
85
        const char *kg_name;
86
        union {
87
                void *ku_sym;                 /* Normally Elf_Sym */
88
                unsigned long *ku_value;
89
        } _un;
90
#define        kg_sym _un.ku_sym
91
#define        kg_value _un.ku_value
92
};
93
94
#ifdef ELFSIZE
95
struct ksyms_gsymbol {
96
        const char *kg_name;
97
        union {
98
                Elf_Sym ku_sym;
99
        } _un;
100
};
101
#endif
102
103
struct ksyms_gvalue {
104
        const char *kv_name;
105
        uint64_t kv_value;
106
};
107
108
#define        OKIOCGSYMBOL        _IOW('l', 1, struct ksyms_ogsymbol)
109
#define        OKIOCGVALUE        _IOW('l', 2, struct ksyms_ogsymbol)
110
#define        KIOCGSIZE        _IOR('l', 3, int)
111
#define        KIOCGVALUE        _IOWR('l', 4, struct ksyms_gvalue)
112
#define        KIOCGSYMBOL        _IOWR('l', 5, struct ksyms_gsymbol)
113
114
115
#if defined(_KERNEL) || defined(_KMEMUSER)
116
/*
117
 * Definitions used in ksyms_getname() and ksyms_getval().
118
 */
119
#define        KSYMS_CLOSEST        0001        /* Nearest lower match */
120
#define        KSYMS_EXACT        0002        /* Only exact match allowed */
121
#define KSYMS_EXTERN        0000        /* Only external symbols (pseudo) */
122
#define KSYMS_PROC        0100        /* Procedures only */
123
#define KSYMS_ANY        0200        /* Also local symbols (DDB use only) */
124
125
typedef int (*ksyms_callback_t)(const char *, int, void *,
126
        uint32_t, int, void *);
127
128
/*
129
 * Prototypes
130
 */
131
132
int ksyms_getname(const char **, const char **, vaddr_t, int);
133
int ksyms_getval(const char *, const char *, unsigned long *, int);
134
int ksyms_getval_unlocked(const char *, const char *, unsigned long *, int);
135
struct ksyms_symtab *ksyms_get_mod(const char *);
136
int ksyms_mod_foreach(const char *mod, ksyms_callback_t, void *);
137
int ksyms_addsymtab(const char *, void *, vsize_t, char *, vsize_t);
138
int ksyms_delsymtab(const char *);
139
void ksyms_init(void);
140
void ksyms_addsyms_elf(int, void *, void *);
141
void ksyms_addsyms_explicit(void *, void *, size_t, void *, size_t);
142
int ksyms_sift(char *, char *, int);
143
void ksyms_modload(const char *, void *, vsize_t, char *, vsize_t);
144
void ksyms_modunload(const char *);
145
146
#endif /* _KERNEL */
147
#endif /* _SYS_KSYMS_H_ */