You already have part of this work in 2.4.9-ac3, from an older version
of the patch via the mips group. The real work was done by Maciej W.
Rozycki, I just merged up to 2.4.9-ac3.
Move arch specific module initialisation code into arch_init_modules().
More rigorous error checking on module archdata for mips.
Index: 9.13/kernel/module.c
--- 9.13/kernel/module.c Mon, 13 Aug 2001 14:14:10 +1000 kaos
(linux-2.4/j/45_module.c 1.1.2.1.3.1.3.1 644)
+++ 9.13(w)/kernel/module.c Wed, 29 Aug 2001 10:11:37 +1000 kaos
(linux-2.4/j/45_module.c 1.1.2.1.3.1.3.1 644)
@@ -246,9 +246,7 @@ void __init init_modules(void)
{
kernel_module.nsyms = __stop___ksymtab - __start___ksymtab;
-#ifdef __alpha__
- __asm__("stq $29,%0" : "=m"(kernel_module.gp));
-#endif
+ arch_init_modules(&kernel_module);
}
/*
@@ -440,12 +438,6 @@ sys_init_module(const char *name_user, s
printk(KERN_ERR "init_module: mod->flags invalid.\n");
goto err2;
}
-#ifdef __alpha__
- if (!mod_bound(mod->gp - 0x8000, 0, mod)) {
- printk(KERN_ERR "init_module: mod->gp out of bounds.\n");
- goto err2;
- }
-#endif
if (mod_member_present(mod, can_unload)
&& mod->can_unload && !mod_bound(mod->can_unload, 0, mod)) {
printk(KERN_ERR "init_module: mod->can_unload out of
bounds.\n");
Index: 9.13/include/asm-s390/module.h
--- 9.13/include/asm-s390/module.h Fri, 05 Jan 2001 13:42:29 +1100 kaos
(linux-2.4/m/1_module.h 1.1 644)
+++ 9.13(w)/include/asm-s390/module.h Wed, 29 Aug 2001 10:11:37 +1000 kaos
(linux-2.4/m/1_module.h 1.1 644)
@@ -7,5 +7,6 @@
#define module_map(x) vmalloc(x)
#define module_unmap(x) vfree(x)
#define module_arch_init(x) (0)
+#define arch_init_modules(x) do { } while (0)
#endif /* _ASM_S390_MODULE_H */
Index: 9.13/include/asm-mips64/module.h
--- 9.13/include/asm-mips64/module.h Mon, 27 Aug 2001 09:52:57 +1000 kaos
(linux-2.4/n/42_module.h 1.2 644)
+++ 9.13(w)/include/asm-mips64/module.h Wed, 29 Aug 2001 10:31:21 +1000 kaos
(linux-2.4/n/42_module.h 1.2 644)
@@ -26,9 +26,12 @@ mips64_module_init(struct module *mod)
{
struct archdata *archdata;
- if (!mod_member_present(mod, archdata_start) || !mod->archdata_start)
+ 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 &&
@@ -40,7 +43,7 @@ mips64_module_init(struct module *mod)
(unsigned long)archdata->dbe_table_end) %
sizeof(struct exception_table_entry))) {
printk(KERN_ERR
- "arch_init_module: archdata->dbe_table_* invalid.\n");
+ "module_arch_init: archdata->dbe_table_* invalid.\n");
return 1;
}
Index: 9.13/include/asm-ia64/module.h
--- 9.13/include/asm-ia64/module.h Wed, 18 Apr 2001 11:00:10 +1000 kaos
(linux-2.4/s/14_module.h 1.1.1.2 644)
+++ 9.13(w)/include/asm-ia64/module.h Wed, 29 Aug 2001 10:11:37 +1000 kaos
(linux-2.4/s/14_module.h 1.1.1.2 644)
@@ -14,6 +14,7 @@
#define module_map(x) vmalloc(x)
#define module_unmap(x) ia64_module_unmap(x)
#define module_arch_init(x) ia64_module_init(x)
+#define ia64_module_inits(x) do { } while (0)
/*
* This must match in size and layout the data created by
@@ -46,27 +47,27 @@ ia64_module_init(struct module *mod)
if (archdata->unw_table)
{
- printk(KERN_ERR "arch_init_module: archdata->unw_table must be
zero.\n");
+ printk(KERN_ERR "module_arch_init: archdata->unw_table must be
zero.\n");
return 1;
}
if (!mod_bound(archdata->gp, 0, mod))
{
- printk(KERN_ERR "arch_init_module: archdata->gp out of
bounds.\n");
+ printk(KERN_ERR "module_arch_init: archdata->gp out of
bounds.\n");
return 1;
}
if (!mod_bound(archdata->unw_start, 0, mod))
{
- printk(KERN_ERR "arch_init_module: archdata->unw_start out of
bounds.\n");
+ printk(KERN_ERR "module_arch_init: archdata->unw_start out of
bounds.\n");
return 1;
}
if (!mod_bound(archdata->unw_end, 0, mod))
{
- printk(KERN_ERR "arch_init_module: archdata->unw_end out of
bounds.\n");
+ printk(KERN_ERR "module_arch_init: archdata->unw_end out of
bounds.\n");
return 1;
}
if (!mod_bound(archdata->segment_base, 0, mod))
{
- printk(KERN_ERR "arch_init_module: archdata->unw_table out of
bounds.\n");
+ printk(KERN_ERR "module_arch_init: archdata->unw_table out of
bounds.\n");
return 1;
}
Index: 9.13/include/asm-sh/module.h
--- 9.13/include/asm-sh/module.h Fri, 05 Jan 2001 13:42:29 +1100 kaos
(linux-2.4/u/27_module.h 1.1 644)
+++ 9.13(w)/include/asm-sh/module.h Wed, 29 Aug 2001 10:11:37 +1000 kaos
(linux-2.4/u/27_module.h 1.1 644)
@@ -7,5 +7,6 @@
#define module_map(x) vmalloc(x)
#define module_unmap(x) vfree(x)
#define module_arch_init(x) (0)
+#define arch_init_modules(x) do { } while (0)
#endif /* _ASM_SH_MODULE_H */
Index: 9.13/include/asm-arm/module.h
--- 9.13/include/asm-arm/module.h Fri, 05 Jan 2001 13:42:29 +1100 kaos
(linux-2.4/y/5_module.h 1.1 644)
+++ 9.13(w)/include/asm-arm/module.h Wed, 29 Aug 2001 10:11:37 +1000 kaos
(linux-2.4/y/5_module.h 1.1 644)
@@ -7,5 +7,6 @@
#define module_map(x) vmalloc(x)
#define module_unmap(x) vfree(x)
#define module_arch_init(x) (0)
+#define arch_init_modules(x) do { } while (0)
#endif /* _ASM_ARM_MODULE_H */
Index: 9.13/include/asm-sparc64/module.h
--- 9.13/include/asm-sparc64/module.h Fri, 05 Jan 2001 13:42:29 +1100 kaos
(linux-2.4/C/9_module.h 1.1 644)
+++ 9.13(w)/include/asm-sparc64/module.h Wed, 29 Aug 2001 10:11:37 +1000 kaos
(linux-2.4/C/9_module.h 1.1 644)
@@ -7,5 +7,6 @@
extern void * module_map (unsigned long size);
extern void module_unmap (void *addr);
#define module_arch_init(x) (0)
+#define arch_init_modules(x) do { } while (0)
#endif /* _ASM_SPARC64_MODULE_H */
Index: 9.13/include/asm-ppc/module.h
--- 9.13/include/asm-ppc/module.h Wed, 23 May 2001 11:55:33 +1000 kaos
(linux-2.4/E/30_module.h 1.2 644)
+++ 9.13(w)/include/asm-ppc/module.h Wed, 29 Aug 2001 10:11:37 +1000 kaos
(linux-2.4/E/30_module.h 1.2 644)
@@ -10,5 +10,6 @@
#define module_map(x) vmalloc(x)
#define module_unmap(x) vfree(x)
#define module_arch_init(x) (0)
+#define arch_init_modules(x) do { } while (0)
#endif /* _ASM_PPC_MODULE_H */
Index: 9.13/include/asm-sparc/module.h
--- 9.13/include/asm-sparc/module.h Fri, 05 Jan 2001 13:42:29 +1100 kaos
(linux-2.4/J/0_module.h 1.1 644)
+++ 9.13(w)/include/asm-sparc/module.h Wed, 29 Aug 2001 10:11:37 +1000 kaos
(linux-2.4/J/0_module.h 1.1 644)
@@ -7,5 +7,6 @@
#define module_map(x) vmalloc(x)
#define module_unmap(x) vfree(x)
#define module_arch_init(x) (0)
+#define arch_init_modules(x) do { } while (0)
#endif /* _ASM_SPARC_MODULE_H */
Index: 9.13/include/asm-m68k/module.h
--- 9.13/include/asm-m68k/module.h Fri, 05 Jan 2001 13:42:29 +1100 kaos
(linux-2.4/L/50_module.h 1.1 644)
+++ 9.13(w)/include/asm-m68k/module.h Wed, 29 Aug 2001 10:11:37 +1000 kaos
(linux-2.4/L/50_module.h 1.1 644)
@@ -7,5 +7,6 @@
#define module_map(x) vmalloc(x)
#define module_unmap(x) vfree(x)
#define module_arch_init(x) (0)
+#define arch_init_modules(x) do { } while (0)
#endif /* _ASM_M68K_MODULE_H */
Index: 9.13/include/asm-alpha/module.h
--- 9.13/include/asm-alpha/module.h Fri, 05 Jan 2001 13:42:29 +1100 kaos
(linux-2.4/O/27_module.h 1.1 644)
+++ 9.13(w)/include/asm-alpha/module.h Wed, 29 Aug 2001 10:11:37 +1000 kaos
(linux-2.4/O/27_module.h 1.1 644)
@@ -6,6 +6,23 @@
#define module_map(x) vmalloc(x)
#define module_unmap(x) vfree(x)
-#define module_arch_init(x) (0)
+#define module_arch_init(x) alpha_module_init(x)
+#define arch_init_modules(x) alpha_init_modules(x)
+
+static inline int
+alpha_module_init(struct module *mod)
+{
+ if (!mod_bound(mod->gp - 0x8000, 0, mod)) {
+ printk(KERN_ERR "module_arch_init: mod->gp out of bounds.\n");
+ return 1;
+ }
+ return 0;
+}
+
+static inline void
+alpha_init_modules(struct module *mod)
+{
+ __asm__("stq $29,%0" : "=m" (mod->gp));
+}
#endif /* _ASM_ALPHA_MODULE_H */
Index: 9.13/include/asm-mips/module.h
--- 9.13/include/asm-mips/module.h Tue, 28 Aug 2001 12:42:15 +1000 kaos
(linux-2.4/Q/30_module.h 1.2 644)
+++ 9.13(w)/include/asm-mips/module.h Wed, 29 Aug 2001 10:31:50 +1000 kaos
(linux-2.4/Q/30_module.h 1.2 644)
@@ -26,9 +26,12 @@ mips_module_init(struct module *mod)
{
struct archdata *archdata;
- if (!mod_member_present(mod, archdata_start) || !mod->archdata_start)
+ 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 &&
@@ -40,7 +43,7 @@ mips_module_init(struct module *mod)
(unsigned long)archdata->dbe_table_end) %
sizeof(struct exception_table_entry))) {
printk(KERN_ERR
- "arch_init_module: archdata->dbe_table_* invalid.\n");
+ "module_arch_init: archdata->dbe_table_* invalid.\n");
return 1;
}
Index: 9.13/include/asm-i386/module.h
--- 9.13/include/asm-i386/module.h Fri, 05 Jan 2001 13:42:29 +1100 kaos
(linux-2.4/T/10_module.h 1.1 644)
+++ 9.13(w)/include/asm-i386/module.h Wed, 29 Aug 2001 10:11:37 +1000 kaos
(linux-2.4/T/10_module.h 1.1 644)
@@ -7,5 +7,6 @@
#define module_map(x) vmalloc(x)
#define module_unmap(x) vfree(x)
#define module_arch_init(x) (0)
+#define arch_init_modules(x) do { } while (0)
#endif /* _ASM_I386_MODULE_H */
Index: 9.13/include/linux/module.h
--- 9.13/include/linux/module.h Sun, 04 Feb 2001 17:53:11 +1100 kaos
(linux-2.4/c/b/46_module.h 1.1.1.1 644)
+++ 9.13(w)/include/linux/module.h Wed, 29 Aug 2001 10:11:37 +1000 kaos
(linux-2.4/c/b/46_module.h 1.1.1.1 644)
@@ -130,6 +130,16 @@ struct module_info
((unsigned long)(&((struct module *)0L)->member + 1) \
<= (mod)->size_of_struct)
+/*
+ * Ditto for archdata. Assumes mod->archdata_start and mod->archdata_end
+ * are validated elsewhere.
+ */
+#define mod_archdata_member_present(mod, type, member) \
+ (((unsigned long)(&((type *)0L)->member) + \
+ sizeof(((type *)0L)->member)) <= \
+ ((mod)->archdata_end - (mod)->archdata_start))
+
+
/* Check if an address p with number of entries n is within the body of module
m */
#define mod_bound(p, n, m) ((unsigned long)(p) >= ((unsigned long)(m) +
((m)->size_of_struct)) && \
(unsigned long)((p)+(n)) <= (unsigned long)(m) + (m)->size)
Index: 9.13/arch/mips64/sgi-ip27/ip27-berr.c
--- 9.13/arch/mips64/sgi-ip27/ip27-berr.c Mon, 27 Aug 2001 09:52:57 +1000 kaos
(linux-2.4/o/c/10_ip27-berr. 1.2 644)
+++ 9.13(w)/arch/mips64/sgi-ip27/ip27-berr.c Wed, 29 Aug 2001 10:32:56 +1000
kaos (linux-2.4/o/c/10_ip27-berr. 1.2 644)
@@ -66,8 +66,9 @@ search_dbe_table(unsigned long addr)
spin_lock_irqsave(&modlist_lock, flags);
for (mp = module_list; mp != NULL; mp = mp->next) {
- if (!mod_member_present(mp, archdata_start) ||
- !mp->archdata_start)
+ if (!mod_member_present(mp, archdata_end) ||
+ !mod_archdata_member_present(mp, struct archdata,
+ dbe_table_end))
continue;
ap = (struct archdata *)(mod->archdata_start);
Index: 9.13/arch/mips64/sgi-ip22/ip22-berr.c
--- 9.13/arch/mips64/sgi-ip22/ip22-berr.c Mon, 27 Aug 2001 09:52:57 +1000 kaos
(linux-2.4/o/c/24_ip22-berr. 1.2 644)
+++ 9.13(w)/arch/mips64/sgi-ip22/ip22-berr.c Wed, 29 Aug 2001 10:33:33 +1000
kaos (linux-2.4/o/c/24_ip22-berr. 1.2 644)
@@ -63,8 +63,9 @@ search_dbe_table(unsigned long addr)
spin_lock_irqsave(&modlist_lock, flags);
for (mp = module_list; mp != NULL; mp = mp->next) {
- if (!mod_member_present(mp, archdata_start) ||
- !mp->archdata_start)
+ if (!mod_member_present(mp, archdata_end) ||
+ !mod_archdata_member_present(mp, struct archdata,
+ dbe_table_end))
continue;
ap = (struct archdata *)(mod->archdata_start);
Index: 9.13/arch/mips/kernel/traps.c
--- 9.13/arch/mips/kernel/traps.c Tue, 28 Aug 2001 12:42:15 +1000 kaos
(linux-2.4/M/c/26_traps.c 1.1.2.1.1.2 644)
+++ 9.13(w)/arch/mips/kernel/traps.c Wed, 29 Aug 2001 10:35:46 +1000 kaos
(linux-2.4/M/c/26_traps.c 1.1.2.1.1.2 644)
@@ -267,8 +267,9 @@ search_dbe_table(unsigned long addr)
spin_lock_irqsave(&modlist_lock, flags);
for (mp = module_list; mp != NULL; mp = mp->next) {
- if (!mod_member_present(mp, archdata_start) ||
- !mp->archdata_start)
+ if (!mod_member_present(mp, archdata_end) ||
+ !mod_archdata_member_present(mp, struct archdata,
+ dbe_table_end))
continue;
ap = (struct archdata *)(mp->archdata_start);
Index: 9.13/include/asm-cris/module.h
--- 9.13/include/asm-cris/module.h Fri, 09 Feb 2001 12:54:37 +1100 kaos
(linux-2.4/o/d/11_module.h 1.1 644)
+++ 9.13(w)/include/asm-cris/module.h Wed, 29 Aug 2001 10:11:37 +1000 kaos
(linux-2.4/o/d/11_module.h 1.1 644)
@@ -7,5 +7,6 @@
#define module_map(x) vmalloc(x)
#define module_unmap(x) vfree(x)
#define module_arch_init(x) (0)
+#define arch_init_modules(x) do { } while (0)
#endif /* _ASM_CRIS_MODULE_H */
Index: 9.13/include/asm-s390x/module.h
--- 9.13/include/asm-s390x/module.h Sat, 17 Feb 2001 11:35:44 +1100 kaos
(linux-2.4/r/d/47_module.h 1.1 644)
+++ 9.13(w)/include/asm-s390x/module.h Wed, 29 Aug 2001 10:11:37 +1000 kaos
(linux-2.4/r/d/47_module.h 1.1 644)
@@ -7,5 +7,6 @@
#define module_map(x) vmalloc(x)
#define module_unmap(x) vfree(x)
#define module_arch_init(x) (0)
+#define arch_init_modules(x) do { } while (0)
#endif /* _ASM_S390_MODULE_H */
|