[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