1 /*	$NetBSD: kobj_impl.h,v 1.5 2016/07/20 13:36:19 maxv Exp $	*/
2 
3 /*-
4  * Copyright (c) 2008, 2009 The NetBSD Foundation, Inc.
5  * All rights reserved.
6  *
7  * This code is derived from software developed for The NetBSD Foundation
8  * by Andrew Doran.
9  *
10  * Redistribution and use in source and binary forms, with or without
11  * modification, are permitted provided that the following conditions
12  * are met:
13  * 1. Redistributions of source code must retain the above copyright
14  *    notice, this list of conditions and the following disclaimer.
15  * 2. Redistributions in binary form must reproduce the above copyright
16  *    notice, this list of conditions and the following disclaimer in the
17  *    documentation and/or other materials provided with the distribution.
18  *
19  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
20  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
21  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
22  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
23  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
24  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
27  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29  * POSSIBILITY OF SUCH DAMAGE.
30  */
31 
32 /*-
33  * Copyright (c) 1998-2000 Doug Rabson
34  * Copyright (c) 2004 Peter Wemm
35  * All rights reserved.
36  *
37  * Redistribution and use in source and binary forms, with or without
38  * modification, are permitted provided that the following conditions
39  * are met:
40  * 1. Redistributions of source code must retain the above copyright
41  *    notice, this list of conditions and the following disclaimer.
42  * 2. Redistributions in binary form must reproduce the above copyright
43  *    notice, this list of conditions and the following disclaimer in the
44  *    documentation and/or other materials provided with the distribution.
45  *
46  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
47  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
48  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
49  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
50  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
51  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
52  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
53  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
54  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
55  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
56  * SUCH DAMAGE.
57  */
58 
59 /*
60  * Data structures private to kobj, shared only with kernel grovellers.
61  */
62 
63 #ifndef _SYS_KOBJ_IMPL_H_
64 #define	_SYS_KOBJ_IMPL_H_
65 
66 #define	ELFSIZE		ARCH_ELFSIZE
67 
68 #include <sys/systm.h>
69 #include <sys/kobj.h>
70 #include <sys/exec.h>
71 #include <sys/exec_elf.h>
72 #include <sys/module.h>
73 
74 typedef struct {
75 	void		*addr;
76 	Elf_Off		size;
77 	int		flags;
78 	int		sec;		/* Original section */
79 	const char	*name;
80 } progent_t;
81 
82 typedef struct {
83 	Elf_Rel		*rel;
84 	int 		nrel;
85 	int 		sec;
86 	size_t		size;
87 } relent_t;
88 
89 typedef struct {
90 	Elf_Rela	*rela;
91 	int		nrela;
92 	int		sec;
93 	size_t		size;
94 } relaent_t;
95 
96 typedef enum kobjtype {
97 	KT_UNSET,
98 	KT_VNODE,
99 	KT_MEMORY
100 } kobjtype_t;
101 
102 typedef int (*kobj_read_fn)(kobj_t, void **, size_t, off_t, bool);
103 typedef void (*kobj_close_fn)(kobj_t);
104 
105 struct kobj {
106 	char		ko_name[MAXMODNAME];
107 	kobjtype_t	ko_type;
108 	void		*ko_source;
109 	ssize_t		ko_memsize;
110 	vaddr_t		ko_text_address;	/* Address of text segment */
111 	vaddr_t		ko_data_address;	/* Address of data segment */
112 	vaddr_t		ko_rodata_address;	/* Address of rodata segment */
113 	Elf_Shdr	*ko_shdr;
114 	progent_t	*ko_progtab;
115 	relaent_t	*ko_relatab;
116 	relent_t	*ko_reltab;
117 	Elf_Sym		*ko_symtab;	/* Symbol table */
118 	char		*ko_strtab;	/* String table */
119 	char		*ko_shstrtab;	/* Section name string table */
120 	size_t		ko_text_size;	/* Size of text segment */
121 	size_t		ko_data_size;	/* Size of data/bss segment */
122 	size_t		ko_rodata_size;	/* Size of rodata segment */
123 	size_t		ko_symcnt;	/* Number of symbols */
124 	size_t		ko_strtabsz;	/* Number of bytes in string table */
125 	size_t		ko_shstrtabsz;	/* Number of bytes in scn str table */
126 	size_t		ko_shdrsz;
127 	int		ko_nrel;
128 	int		ko_nrela;
129 	int		ko_nprogtab;
130 	bool		ko_ksyms;
131 	bool		ko_loaded;
132 	kobj_read_fn	ko_read;
133 	kobj_close_fn	ko_close;
134 };
135 
136 #ifdef _KERNEL
137 int	kobj_load(kobj_t);
138 void	kobj_setname(kobj_t, const char *);
139 #endif
140 
141 #endif	/* _SYS_KOBJ_IMPL_H_ */
142