
From: Rusty Russell <rusty@rustcorp.com.au>, David Mosberger

The patch below updates the other platforms with module_arch_cleanup(). 
Also, I added more debug output to kernel/module.c since I found it useful
to be able to see the final section layout.



 arch/alpha/kernel/module.c   |    5 +++++
 arch/arm/kernel/module.c     |    5 +++++
 arch/i386/kernel/module.c    |    4 ++++
 arch/parisc/kernel/module.c  |    4 ++++
 arch/ppc/kernel/module.c     |    4 ++++
 arch/ppc64/kernel/module.c   |    4 ++++
 arch/s390/kernel/module.c    |    4 ++++
 arch/sparc/kernel/module.c   |    4 ++++
 arch/sparc64/kernel/module.c |    4 ++++
 arch/v850/kernel/module.c    |    5 +++++
 arch/x86_64/kernel/module.c  |    4 ++++
 include/linux/moduleloader.h |    3 +++
 kernel/module.c              |    5 +++++
 13 files changed, 55 insertions(+)

diff -puN arch/alpha/kernel/module.c~module_arch_cleanup-2 arch/alpha/kernel/module.c
--- 25/arch/alpha/kernel/module.c~module_arch_cleanup-2	2003-05-12 21:23:07.000000000 -0700
+++ 25-akpm/arch/alpha/kernel/module.c	2003-05-12 21:23:07.000000000 -0700
@@ -300,3 +300,8 @@ module_finalize(const Elf_Ehdr *hdr, con
 {
 	return 0;
 }
+
+void
+module_arch_cleanup(struct module *mod)
+{
+}
diff -puN arch/arm/kernel/module.c~module_arch_cleanup-2 arch/arm/kernel/module.c
--- 25/arch/arm/kernel/module.c~module_arch_cleanup-2	2003-05-12 21:23:07.000000000 -0700
+++ 25-akpm/arch/arm/kernel/module.c	2003-05-12 21:23:07.000000000 -0700
@@ -159,3 +159,8 @@ module_finalize(const Elf32_Ehdr *hdr, c
 {
 	return 0;
 }
+
+void
+module_arch_cleanup(struct module *mod)
+{
+}
diff -puN arch/i386/kernel/module.c~module_arch_cleanup-2 arch/i386/kernel/module.c
--- 25/arch/i386/kernel/module.c~module_arch_cleanup-2	2003-05-12 21:23:07.000000000 -0700
+++ 25-akpm/arch/i386/kernel/module.c	2003-05-12 21:23:07.000000000 -0700
@@ -123,3 +123,7 @@ int module_finalize(const Elf_Ehdr *hdr,
 	} 	
 	return 0;
 }
+
+void module_arch_cleanup(struct module *mod)
+{
+}
diff -puN arch/parisc/kernel/module.c~module_arch_cleanup-2 arch/parisc/kernel/module.c
--- 25/arch/parisc/kernel/module.c~module_arch_cleanup-2	2003-05-12 21:23:07.000000000 -0700
+++ 25-akpm/arch/parisc/kernel/module.c	2003-05-12 21:23:07.000000000 -0700
@@ -568,3 +568,7 @@ int module_finalize(const Elf_Ehdr *hdr,
 #endif
 	return 0;
 }
+
+void module_arch_cleanup(struct module *mod)
+{
+}
diff -puN arch/ppc64/kernel/module.c~module_arch_cleanup-2 arch/ppc64/kernel/module.c
--- 25/arch/ppc64/kernel/module.c~module_arch_cleanup-2	2003-05-12 21:23:07.000000000 -0700
+++ 25-akpm/arch/ppc64/kernel/module.c	2003-05-12 21:23:07.000000000 -0700
@@ -384,3 +384,7 @@ int module_finalize(const Elf_Ehdr *hdr,
 				me->num_exentries);
 	return 0;
 }
+
+void module_arch_cleanup(struct module *mod)
+{
+}
diff -puN arch/ppc/kernel/module.c~module_arch_cleanup-2 arch/ppc/kernel/module.c
--- 25/arch/ppc/kernel/module.c~module_arch_cleanup-2	2003-05-12 21:23:07.000000000 -0700
+++ 25-akpm/arch/ppc/kernel/module.c	2003-05-12 21:23:07.000000000 -0700
@@ -269,3 +269,7 @@ int module_finalize(const Elf_Ehdr *hdr,
 {
 	return 0;
 }
+
+void module_arch_cleanup(struct module *mod)
+{
+}
diff -puN arch/s390/kernel/module.c~module_arch_cleanup-2 arch/s390/kernel/module.c
--- 25/arch/s390/kernel/module.c~module_arch_cleanup-2	2003-05-12 21:23:07.000000000 -0700
+++ 25-akpm/arch/s390/kernel/module.c	2003-05-12 21:23:07.000000000 -0700
@@ -386,3 +386,7 @@ int module_finalize(const Elf_Ehdr *hdr,
 		kfree(me->arch.syminfo);
 	return 0;
 }
+
+void module_arch_cleanup(struct module *mod)
+{
+}
diff -puN arch/sparc64/kernel/module.c~module_arch_cleanup-2 arch/sparc64/kernel/module.c
--- 25/arch/sparc64/kernel/module.c~module_arch_cleanup-2	2003-05-12 21:23:07.000000000 -0700
+++ 25-akpm/arch/sparc64/kernel/module.c	2003-05-12 21:23:07.000000000 -0700
@@ -273,3 +273,7 @@ int module_finalize(const Elf_Ehdr *hdr,
 {
 	return 0;
 }
+
+void module_arch_cleanup(struct module *mod)
+{
+}
diff -puN arch/sparc/kernel/module.c~module_arch_cleanup-2 arch/sparc/kernel/module.c
--- 25/arch/sparc/kernel/module.c~module_arch_cleanup-2	2003-05-12 21:23:07.000000000 -0700
+++ 25-akpm/arch/sparc/kernel/module.c	2003-05-12 21:23:07.000000000 -0700
@@ -145,3 +145,7 @@ int module_finalize(const Elf_Ehdr *hdr,
 {
 	return 0;
 }
+
+void module_arch_cleanup(struct module *mod)
+{
+}
diff -puN arch/v850/kernel/module.c~module_arch_cleanup-2 arch/v850/kernel/module.c
--- 25/arch/v850/kernel/module.c~module_arch_cleanup-2	2003-05-12 21:23:07.000000000 -0700
+++ 25-akpm/arch/v850/kernel/module.c	2003-05-12 21:23:07.000000000 -0700
@@ -230,3 +230,8 @@ int apply_relocate_add (Elf32_Shdr *sech
 
 	return 0;
 }
+
+void
+module_arch_cleanup(struct module *mod)
+{
+}
diff -puN arch/x86_64/kernel/module.c~module_arch_cleanup-2 arch/x86_64/kernel/module.c
--- 25/arch/x86_64/kernel/module.c~module_arch_cleanup-2	2003-05-12 21:23:07.000000000 -0700
+++ 25-akpm/arch/x86_64/kernel/module.c	2003-05-12 21:23:07.000000000 -0700
@@ -231,3 +231,7 @@ int module_finalize(const Elf_Ehdr *hdr,
 {
 	return 0;
 }
+
+void module_arch_cleanup(struct module *mod)
+{
+}
diff -puN include/linux/moduleloader.h~module_arch_cleanup-2 include/linux/moduleloader.h
--- 25/include/linux/moduleloader.h~module_arch_cleanup-2	2003-05-12 21:23:07.000000000 -0700
+++ 25-akpm/include/linux/moduleloader.h	2003-05-12 21:23:07.000000000 -0700
@@ -41,4 +41,7 @@ int module_finalize(const Elf_Ehdr *hdr,
 		    const Elf_Shdr *sechdrs,
 		    struct module *mod);
 
+/* Any cleanup needed when module leaves. */
+void module_arch_cleanup(struct module *mod);
+
 #endif
diff -puN kernel/module.c~module_arch_cleanup-2 kernel/module.c
--- 25/kernel/module.c~module_arch_cleanup-2	2003-05-12 21:23:07.000000000 -0700
+++ 25-akpm/kernel/module.c	2003-05-12 21:23:07.000000000 -0700
@@ -910,6 +910,9 @@ static void free_module(struct module *m
 	list_del(&mod->list);
 	spin_unlock_irq(&modlist_lock);
 
+	/* Arch-specific cleanup. */
+	module_arch_cleanup(mod);
+
 	/* Module unload stuff */
 	module_unload_free(mod);
 
@@ -1276,6 +1279,7 @@ static struct module *load_module(void _
 	mod->module_init = ptr;
 
 	/* Transfer each section which specifies SHF_ALLOC */
+	DEBUGP("final section addresses:\n");
 	for (i = 0; i < hdr->e_shnum; i++) {
 		void *dest;
 
@@ -1293,6 +1297,7 @@ static struct module *load_module(void _
 			       sechdrs[i].sh_size);
 		/* Update sh_addr to point to copy in image. */
 		sechdrs[i].sh_addr = (unsigned long)dest;
+		DEBUGP("\t0x%lx %s\n", sechdrs[i].sh_addr, secstrings + sechdrs[i].sh_name);
 	}
 	/* Module has been moved. */
 	mod = (void *)sechdrs[modindex].sh_addr;

_
