1#ifndef _ASM_MIPS64_MODULE_H 2#define _ASM_MIPS64_MODULE_H 3/* 4 * This file contains the mips64 architecture specific module code. 5 */ 6 7#include <linux/module.h> 8#include <asm/uaccess.h> 9 10#define module_map(x) vmalloc(x) 11#define module_unmap(x) vfree(x) 12#define module_arch_init(x) mips64_module_init(x) 13#define arch_init_modules(x) mips64_init_modules(x) 14 15/* 16 * This must match in size and layout the data created by 17 * modutils/obj/obj-mips64.c 18 */ 19struct archdata { 20 const struct exception_table_entry *dbe_table_start; 21 const struct exception_table_entry *dbe_table_end; 22}; 23 24static inline int 25mips64_module_init(struct module *mod) 26{ 27 struct archdata *archdata; 28 29 if (!mod_member_present(mod, archdata_end)) 30 return 0; 31 32 archdata = (struct archdata *)(mod->archdata_start); 33 if (!mod_archdata_member_present(mod, struct archdata, dbe_table_end)) 34 return 0; 35 36 if (archdata->dbe_table_start > archdata->dbe_table_end || 37 (archdata->dbe_table_start && 38 !((unsigned long)archdata->dbe_table_start >= 39 ((unsigned long)mod + mod->size_of_struct) && 40 ((unsigned long)archdata->dbe_table_end < 41 (unsigned long)mod + mod->size))) || 42 (((unsigned long)archdata->dbe_table_start - 43 (unsigned long)archdata->dbe_table_end) % 44 sizeof(struct exception_table_entry))) { 45 printk(KERN_ERR 46 "module_arch_init: archdata->dbe_table_* invalid.\n"); 47 return 1; 48 } 49 50 return 0; 51} 52 53static inline void 54mips64_init_modules(struct module *mod) 55{ 56 extern const struct exception_table_entry __start___dbe_table[]; 57 extern const struct exception_table_entry __stop___dbe_table[]; 58 static struct archdata archdata = { 59 .dbe_table_start = __start___dbe_table, 60 .dbe_table_end = __stop___dbe_table, 61 }; 62 63 mod->archdata_start = (char *)&archdata; 64 mod->archdata_end = mod->archdata_start + sizeof(archdata); 65} 66 67#endif /* _ASM_MIPS64_MODULE_H */ 68