Skip to content

Commit

Permalink
[PARISC] Fix kernel panic in check_ivt
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Kyle McMartin authored and Kyle McMartin committed Jun 4, 2007
1 parent 3bb457a commit c3d4ed4
Show file tree
Hide file tree
Showing 2 changed files with 5 additions and 7 deletions.
5 changes: 1 addition & 4 deletions arch/parisc/kernel/hpmc.S
Original file line number Diff line number Diff line change
Expand Up @@ -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
7 changes: 4 additions & 3 deletions arch/parisc/kernel/traps.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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;
Expand Down

0 comments on commit c3d4ed4

Please sign in to comment.