[PARISC] Fix kernel panic in check_ivt
Kyle McMartin [Mon, 4 Jun 2007 06:26:52 +0000 (02:26 -0400)]
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@parisc-linux.org>

arch/parisc/kernel/hpmc.S
arch/parisc/kernel/traps.c

index d8baa15..43b41df 100644 (file)
@@ -295,8 +295,5 @@ os_hpmc_6:
        b .
        nop
 ENDPROC(os_hpmc)
-
-       /* this label used to compute os_hpmc checksum */
-ENTRY(os_hpmc_end)
-
+ENTRY(os_hpmc_end)     /* this label used to compute os_hpmc checksum */
        nop
index 0ba1d3d..c3ec9f1 100644 (file)
@@ -802,13 +802,14 @@ void handle_interruption(int code, struct pt_regs *regs)
 
 int __init check_ivt(void *iva)
 {
+       extern const u32 os_hpmc[];
+       extern const u32 os_hpmc_end[];
+
        int i;
        u32 check = 0;
        u32 *ivap;
        u32 *hpmcp;
        u32 length;
-       extern void os_hpmc(void);
-       extern void os_hpmc_end(void);
 
        if (strcmp((char *)iva, "cows can fly"))
                return -1;
@@ -820,7 +821,7 @@ 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;