2 * Copyright 2000, International Business Machines Corporation and others.
5 * This software has been released under the terms of the IBM Public
6 * License. For details, see the LICENSE file in the top-level source
7 * directory or online at http://www.openafs.org/dl/license10.html
11 * export - EXPORT kernel extension
14 /* Unsafe: conflicts with _KERNEL inclusion of headers below */
15 /* #include <afs/param.h> */
16 /* #include <afsconfig.h> */
19 #include "sys/types.h"
22 #include "sys/errno.h"
23 #include "sys/device.h"
26 #include "sys/malloc.h"
32 sym_t
*toc_syms
; /* symbol table */
33 int toc_nsyms
; /* # of symbols */
34 caddr_t toc_strs
; /* string table */
35 int toc_size
; /* size of toc_syms */
38 * export - entry point to EXPORT kernel extension
41 * cmd - add/delete command
42 * uiop - uio vector describing any config params
51 monster
= lockl(&kernel_lock
, LOCK_SHORT
);
54 case CFG_INIT
: /* add EXPORT */
55 if (err
= config(uiop
))
59 case CFG_TERM
: /* remove EXPORT */
60 if (err
= export_cleanup())
69 if (monster
!= LOCK_NEST
)
70 unlockl(&kernel_lock
);
76 * config - process configuration data
86 if (err
= uiomove((char *)&conf
, sizeof(conf
), UIO_WRITE
, uiop
))
89 toc_nsyms
= conf
.nsyms
;
90 toc_size
= conf
.symt_sz
+ conf
.str_sz
;
92 if (toc_nsyms
* sizeof(sym_t
) != conf
.symt_sz
|| toc_size
> (1024 * 1024))
99 toc_syms
= (sym_t
*) xmalloc(toc_size
, 2, kernel_heap
);
104 toc_strs
= (char *)&toc_syms
[toc_nsyms
];
107 * copy in the symbol table and the string table
109 if (err
= copyin(conf
.symtab
, toc_syms
, conf
.symt_sz
)
110 || (err
= copyin(conf
.strtab
, toc_strs
, conf
.str_sz
))) {
111 xmfree(toc_syms
, kernel_heap
);
117 * `TOC' format in kernel has offsets relocated to point directly
118 * into the string table.
120 for (sym
= toc_syms
; sym
< &toc_syms
[toc_nsyms
]; ++sym
)
122 if (sym
->n_zeroes
== 0)
124 sym
->n_nptr
= sym
->n_offset
+ toc_strs
;
130 * export_cleanup - cleanup EXPORT prior to removing kernel extension
136 * get rid of the symbol table
139 xmfree(toc_syms
, kernel_heap
);
149 * import_kfunc - import a kernel function that was mistakenly left
150 * off the exports list
153 * We are assuming that the functions we are importing from the
154 * kernel really are within the kernel. If they are actually
155 * exported from some other kernel extension (but referenced in
156 * the /unix symbol table) we are in trouble.
164 import_kfunc(struct k_func
* kfp
)
169 static caddr_t
*g_toc
;
174 sym
= sym_lookup("ktoc", 0);
176 sym
= sym_lookup("g_toc", 0);
179 printf("\nimport: can't ascertain kernel's TOC\n");
182 myg_toc
= sym
->n_value
;
185 sym
= sym_lookup(kfp
->name
, 0);
187 printf("\nimport: function `%s' not found\n", kfp
->name
);
191 kfp
->fdesc
[0] = sym
->n_value
;
192 kfp
->fdesc
[1] = *myg_toc
;
196 *(u_int64
**) kfp
->fpp
= kfp
->fdesc
;
198 *(u_int
**) kfp
->fpp
= kfp
->fdesc
;
205 * import_kvar - import a kernel variable that was mistakenly left
206 * off the exports list
208 import_kvar(struct k_var
* kvp
, caddr_t
* toc
)
214 switch (setjmpx(&jmpbuf
)) {
222 sym
= sym_lookup(kvp
->name
, 0);
224 printf("\nimport: variable `%s' not found\n", kvp
->name
);
229 * look through the caller's TOC for the reference to his surrogate
232 while (*toc
!= kvp
->varp
)
235 printf("import(%s): replacing my TOC at 0x%x: 0x%8x with 0x%8x\n",
236 kvp
->name
, toc
, *toc
, sym
->n_value
);
239 * replace reference to surrogate with reference real
241 pri
= i_disable(INTMAX
);
242 *toc
= (caddr_t
) sym
->n_value
;
252 * Call vanilla syscalls
254 #ifndef AFS_AIX51_ENV
255 osetgroups(ngroups
, gidset
)
261 error
= setgroups(ngroups
, gidset
);
267 #ifdef AFS_64BIT_KERNEL
268 okioctl(fdes
, cmd
, arg
, ext
, arg2
, arg3
)
269 #else /* AFS_64BIT_KERNEL */
270 okioctl32(fdes
, cmd
, arg
, ext
, arg2
, arg3
)
271 #endif /* AFS_64BIT_KERNEL */
273 caddr_t ext
, arg
, arg2
, arg3
;
275 okioctl(fdes
, cmd
, arg
, ext
)
283 #ifdef AFS_64BIT_KERNEL
284 error
= kioctl(fdes
, cmd
, arg
, ext
, arg2
, arg3
);
285 #else /* AFS_64BIT_KERNEL */
286 error
= kioctl32(fdes
, cmd
, arg
, ext
, arg2
, arg3
);
287 #endif /* AFS_64BIT_KERNEL */
289 error
= kioctl(fdes
, cmd
, arg
, ext
);
297 struct sigcontext
*sigctx
;
300 #include <sys/user.h>
301 u
.u_sigflags
[signo
] |= SA_FULLDUMP
; /* XXX */
302 error
= core(signo
, sigctx
);