[PARISC] Fix kernel panic in check_ivt
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>
This commit is contained in:
Родитель
3bb457af4f
Коммит
c3d4ed4e3e
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
|
|
Загрузка…
Ссылка в новой задаче