parisc: Fix address in HPMC IVA
authorJohn David Anglin <dave.anglin@bell.net>
Sat, 6 Oct 2018 17:11:30 +0000 (13:11 -0400)
committerHelge Deller <deller@gmx.de>
Wed, 17 Oct 2018 06:18:01 +0000 (08:18 +0200)
Helge noticed that the address of the os_hpmc handler was not being
correctly calculated in the hpmc macro.  As a result, PDCE_CHECK would
fail to call os_hpmc:

<Cpu2> e800009802e00000  0000000000000000  CC_ERR_CHECK_HPMC
<Cpu2> 37000f7302e00000  8040004000000000  CC_ERR_CPU_CHECK_SUMMARY
<Cpu2> f600105e02e00000  fffffff0f0c00000  CC_MC_HPMC_MONARCH_SELECTED
<Cpu2> 140003b202e00000  000000000000000b  CC_ERR_HPMC_STATE_ENTRY
<Cpu2> 5600100b02e00000  00000000000001a0  CC_MC_OS_HPMC_LEN_ERR
<Cpu2> 5600106402e00000  fffffff0f0438e70  CC_MC_BR_TO_OS_HPMC_FAILED
<Cpu2> e800009802e00000  0000000000000000  CC_ERR_CHECK_HPMC
<Cpu2> 37000f7302e00000  8040004000000000  CC_ERR_CPU_CHECK_SUMMARY
<Cpu2> 4000109f02e00000  0000000000000000  CC_MC_HPMC_INITIATED
<Cpu2> 4000101902e00000  0000000000000000  CC_MC_MULTIPLE_HPMCS
<Cpu2> 030010d502e00000  0000000000000000  CC_CPU_STOP

The address problem can be seen by dumping the fault vector:

0000000040159000 <fault_vector_20>:
    40159000:   63 6f 77 73     stb r15,-2447(dp)
    40159004:   20 63 61 6e     ldil L%b747000,r3
    40159008:   20 66 6c 79     ldil L%-1c3b3000,r3
        ...
    40159020:   08 00 02 40     nop
    40159024:   20 6e 60 02     ldil L%15d000,r3
    40159028:   34 63 00 00     ldo 0(r3),r3
    4015902c:   e8 60 c0 02     bv,n r0(r3)
    40159030:   08 00 02 40     nop
    40159034:   00 00 00 00     break 0,0
    40159038:   c0 00 70 00     bb,*< r0,sar,40159840 <fault_vector_20+0x840>
    4015903c:   00 00 00 00     break 0,0

Location 40159038 should contain the physical address of os_hpmc:

000000004015d000 <os_hpmc>:
    4015d000:   08 1a 02 43     copy r26,r3
    4015d004:   01 c0 08 a4     mfctl iva,r4
    4015d008:   48 85 00 68     ldw 34(r4),r5

This patch moves the address setup into initialize_ivt to resolve the
above problem.  I tested the change by dumping the HPMC entry after setup:

0000000040209020:  8000240
0000000040209024206a2004
000000004020902834630ac0
000000004020902ce860c002
0000000040209030:  8000240
00000000402090341bdddce6
0000000040209038:   15d000
000000004020903c:      1a0

Signed-off-by: John David Anglin <dave.anglin@bell.net>
Cc: <stable@vger.kernel.org>
Signed-off-by: Helge Deller <deller@gmx.de>
arch/parisc/kernel/entry.S
arch/parisc/kernel/traps.c

index 0d662f0e7b70bd8e3684892d208096a8fa5492e8..7c85a91b4710b53c10c5c9adb1d068be124b72f6 100644 (file)
        bv,n    0(%r3)
        nop
        .word   0               /* checksum (will be patched) */
-       .word   PA(os_hpmc)     /* address of handler */
+       .word   0               /* address of handler */
        .word   0               /* length of handler */
        .endm
 
index bb65676dc41ca6c2a2df0143c714631aaa1c5dbf..472a818e8c17a0c3413d1c0116f55bc02e4b25dd 100644 (file)
@@ -802,7 +802,8 @@ void __init initialize_ivt(const void *iva)
         *    the Length/4 words starting at Address is zero.
         */
 
-       /* Compute Checksum for HPMC handler */
+       /* Setup IVA and compute checksum for HPMC handler */
+       ivap[6] = (u32)__pa(os_hpmc);
        length = os_hpmc_size;
        ivap[7] = length;