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);