[PARISC] Fix kernel panic in check_ivt

Kyle McMartin <[email protected]>
Newsgroups gmane.linux.ports.hppa
Message-ID <[email protected]>
From: Kyle McMartin <[email protected]>

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 <[email protected]>
---
 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
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.