Re: [PARISC] Fix kernel panic in check_ivt

Grant Grundler <[email protected]>
Newsgroups gmane.linux.ports.hppa
Message-ID <[email protected]>
On Mon, Jun 04, 2007 at 01:49:54AM -0400, Kyle McMartin wrote:
> 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]>

This looks good to me...please push to your git tree.
Tested on 32-bit (c3k).

Acked-by: Grant Grundler <[email protected]>

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
> [email protected]
> http://lists.parisc-linux.org/mailman/listinfo/parisc-linux
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.