[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