[parisc-linux] [PARISC] Fix kernel panic in check_ivt
Grant Grundler
grundler at parisc-linux.org
Mon Jun 4 00:04:07 MDT 2007
On Mon, Jun 04, 2007 at 01:49:54AM -0400, Kyle McMartin wrote:
> 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>
This looks good to me...please push to your git tree.
Tested on 32-bit (c3k).
Acked-by: Grant Grundler <grundler at parisc-linux.org>
thanks (jda and kyle),
grant
> ---
> 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
>
> _______________________________________________
> parisc-linux mailing list
> parisc-linux at lists.parisc-linux.org
> http://lists.parisc-linux.org/mailman/listinfo/parisc-linux
More information about the parisc-linux
mailing list