Subject: [patch] linux 2.4.8: __dbe_table resync

From: "Maciej W. Rozycki" <[email-masked]>
Date: Thu, 6 Sep 2001 14:08:43 +0200 (MET DST)

Ralf,

 This is an update to the current implementation of __dbe_table handling. 
The code matches one in 2.4.9-ac9 with an exception of a small fix that
goes to Alan independently and is already taken into account here.  Please
apply.

  Maciej

-- 
+  Maciej W. Rozycki, Technical University of Gdansk, Poland   +
+--------------------------------------------------------------+
+        e-mail: [email-masked], PGP key available        +

patch-mips-2.4.8-20010903-dbe-14
diff -up --recursive --new-file linux-mips-2.4.8-20010903.macro/arch/mips/kernel/traps.c linux-mips-2.4.8-20010903/arch/mips/kernel/traps.c
--- linux-mips-2.4.8-20010903.macro/arch/mips/kernel/traps.c	Sat Aug 25 04:27:08 2001
+++ linux-mips-2.4.8-20010903/arch/mips/kernel/traps.c	Wed Sep  5 22:49:24 2001
@@ -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);
 
diff -up --recursive --new-file linux-mips-2.4.8-20010903.macro/arch/mips64/sgi-ip22/ip22-berr.c linux-mips-2.4.8-20010903/arch/mips64/sgi-ip22/ip22-berr.c
--- linux-mips-2.4.8-20010903.macro/arch/mips64/sgi-ip22/ip22-berr.c	Wed Aug 22 04:26:17 2001
+++ linux-mips-2.4.8-20010903/arch/mips64/sgi-ip22/ip22-berr.c	Wed Sep  5 22:49:24 2001
@@ -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);
 
diff -up --recursive --new-file linux-mips-2.4.8-20010903.macro/arch/mips64/sgi-ip27/ip27-berr.c linux-mips-2.4.8-20010903/arch/mips64/sgi-ip27/ip27-berr.c
--- linux-mips-2.4.8-20010903.macro/arch/mips64/sgi-ip27/ip27-berr.c	Wed Aug 22 04:26:17 2001
+++ linux-mips-2.4.8-20010903/arch/mips64/sgi-ip27/ip27-berr.c	Wed Sep  5 22:49:24 2001
@@ -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);
 
diff -up --recursive --new-file linux-mips-2.4.8-20010903.macro/include/asm-alpha/module.h linux-mips-2.4.8-20010903/include/asm-alpha/module.h
--- linux-mips-2.4.8-20010903.macro/include/asm-alpha/module.h	Wed Aug 22 04:27:42 2001
+++ linux-mips-2.4.8-20010903/include/asm-alpha/module.h	Wed Sep  5 22:49:24 2001
@@ -13,7 +13,7 @@ static inline int
 alpha_module_init(struct module *mod)
 {
         if (!mod_bound(mod->gp - 0x8000, 0, mod)) {
-                printk(KERN_ERR "arch_init_module: mod->gp out of bounds.\n");
+                printk(KERN_ERR "module_arch_init: mod->gp out of bounds.\n");
                 return 1;
         }
 	return 0;
diff -up --recursive --new-file linux-mips-2.4.8-20010903.macro/include/asm-ia64/module.h linux-mips-2.4.8-20010903/include/asm-ia64/module.h
--- linux-mips-2.4.8-20010903.macro/include/asm-ia64/module.h	Wed Aug 22 04:27:44 2001
+++ linux-mips-2.4.8-20010903/include/asm-ia64/module.h	Wed Sep  5 22:58:19 2001
@@ -47,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;
 	}
 
diff -up --recursive --new-file linux-mips-2.4.8-20010903.macro/include/asm-mips/module.h linux-mips-2.4.8-20010903/include/asm-mips/module.h
--- linux-mips-2.4.8-20010903.macro/include/asm-mips/module.h	Wed Aug 22 04:27:47 2001
+++ linux-mips-2.4.8-20010903/include/asm-mips/module.h	Wed Sep  5 22:49:24 2001
@@ -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;
 	}
 
diff -up --recursive --new-file linux-mips-2.4.8-20010903.macro/include/asm-mips64/module.h linux-mips-2.4.8-20010903/include/asm-mips64/module.h
--- linux-mips-2.4.8-20010903.macro/include/asm-mips64/module.h	Wed Aug 22 04:27:48 2001
+++ linux-mips-2.4.8-20010903/include/asm-mips64/module.h	Wed Sep  5 22:49:24 2001
@@ -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;
 	}
 
diff -up --recursive --new-file linux-mips-2.4.8-20010903.macro/include/linux/module.h linux-mips-2.4.8-20010903/include/linux/module.h
--- linux-mips-2.4.8-20010903.macro/include/linux/module.h	Mon Jul 16 02:13:58 2001
+++ linux-mips-2.4.8-20010903/include/linux/module.h	Fri Aug 24 00:50:22 2001
@@ -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)

---

From: Ralf Baechle <[email-masked]>
Date: Thu, 6 Sep 2001 15:21:23 +0200

> goes to Alan independently and is already taken into account here.  Please

Applied.

  Ralf