[parisc-linux] [PARISC] Fix kernel panic in check_ivt

Kyle McMartin kyle at parisc-linux.org
Sun Jun 3 23:49:54 MDT 2007


From: Kyle McMartin <kyle at parisc-linux.org>

check_ivt had some seriously broken code wrt function pointers on
parisc64. Instead of referencing the hpmc code via a function pointer,
export symbols and reference it as a const array.

Thanks to jda for pointing out the broken 64-bit func ptr handling.

Signed-off-by: Kyle McMartin <kyle at parisc-linux.org>
---
 arch/parisc/kernel/hpmc.S  |    7 ++++---
 arch/parisc/kernel/traps.c |    8 ++++----
 2 files changed, 8 insertions(+), 7 deletions(-)

diff --git a/arch/parisc/kernel/hpmc.S b/arch/parisc/kernel/hpmc.S
index d8baa15..abda491 100644
--- a/arch/parisc/kernel/hpmc.S
+++ b/arch/parisc/kernel/hpmc.S
@@ -79,6 +79,8 @@ END(hpmc_pim_data)
 	.text
 
 	.import intr_save, code
+	.export __os_hpmc, data
+__os_hpmc:
 ENTRY(os_hpmc)
 
 	/*
@@ -295,8 +297,7 @@ os_hpmc_6:
 	b .
 	nop
 ENDPROC(os_hpmc)
-
-	/* this label used to compute os_hpmc checksum */
-ENTRY(os_hpmc_end)
+__os_hpmc_end:
+	.export __os_hpmc_end, data 	/* this label used to compute os_hpmc checksum */
 
 	nop
diff --git a/arch/parisc/kernel/traps.c b/arch/parisc/kernel/traps.c
index 0ba1d3d..e8b977a 100644
--- a/arch/parisc/kernel/traps.c
+++ b/arch/parisc/kernel/traps.c
@@ -807,8 +807,8 @@ int __init check_ivt(void *iva)
 	u32 *ivap;
 	u32 *hpmcp;
 	u32 length;
-	extern void os_hpmc(void);
-	extern void os_hpmc_end(void);
+	extern const u32 __os_hpmc[];
+	extern const u32 __os_hpmc_end[];
 
 	if (strcmp((char *)iva, "cows can fly"))
 		return -1;
@@ -820,10 +820,10 @@ int __init check_ivt(void *iva)
 
 	/* Compute Checksum for HPMC handler */
 
-	length = (u32)((unsigned long)os_hpmc_end - (unsigned long)os_hpmc);
+	length = __os_hpmc_end - __os_hpmc;
 	ivap[7] = length;
 
-	hpmcp = (u32 *)os_hpmc;
+	hpmcp = (u32 *)__os_hpmc;
 
 	for (i=0; i<length/4; i++)
 	    check += *hpmcp++;
-- 
1.5.1.3




More information about the parisc-linux mailing list