#ifndef _ASM_MIPS64_MODULE_H #define _ASM_MIPS64_MODULE_H /* * This file contains the mips64 architecture specific module code. */ #include #include #define module_map(x) vmalloc(x) #define module_unmap(x) vfree(x) #define module_arch_init(x) mips64_module_init(x) #define arch_init_modules(x) mips64_init_modules(x) /* * This must match in size and layout the data created by * modutils/obj/obj-mips64.c */ struct archdata { const struct exception_table_entry *dbe_table_start; const struct exception_table_entry *dbe_table_end; }; static inline int mips64_module_init(struct module *mod) { struct archdata *archdata; if (!mod_member_present(mod, archdata_end)) return 0; archdata = (struct archdata *)(mod->archdata_start); if (!mod_archdata_member_present(mod, struct archdata, dbe_table_end)) return 0; if (archdata->dbe_table_start > archdata->dbe_table_end || (archdata->dbe_table_start && !((unsigned long)archdata->dbe_table_start >= ((unsigned long)mod + mod->size_of_struct) && ((unsigned long)archdata->dbe_table_end < (unsigned long)mod + mod->size))) || (((unsigned long)archdata->dbe_table_start - (unsigned long)archdata->dbe_table_end) % sizeof(struct exception_table_entry))) { printk(KERN_ERR "module_arch_init: archdata->dbe_table_* invalid.\n"); return 1; } return 0; } static inline void mips64_init_modules(struct module *mod) { extern const struct exception_table_entry __start___dbe_table[]; extern const struct exception_table_entry __stop___dbe_table[]; static struct archdata archdata = { dbe_table_start: __start___dbe_table, dbe_table_end: __stop___dbe_table, }; mod->archdata_start = (char *)&archdata; mod->archdata_end = mod->archdata_start + sizeof(archdata); } #endif /* _ASM_MIPS64_MODULE_H */