diff mbox series

parisc: Fix address in HPMC IVA

Message ID 20181006171129.GA12046@mx3210.localdomain (mailing list archive)
State Accepted, archived
Headers show
Series parisc: Fix address in HPMC IVA | expand

Commit Message

John David Anglin Oct. 6, 2018, 5:11 p.m. UTC
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
0000000040209024: 206a2004
0000000040209028: 34630ac0
000000004020902c: e860c002
0000000040209030:  8000240
0000000040209034: 1bdddce6
0000000040209038:   215560
000000004020903c:      1a0


Signed-off-by: John David Anglin <dave.anglin@bell.net>

Comments

Helge Deller Oct. 6, 2018, 6:22 p.m. UTC | #1
On 06.10.2018 19:11, John David Anglin wrote:
> 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
> 0000000040209024: 206a2004
> 0000000040209028: 34630ac0
> 000000004020902c: e860c002
> 0000000040209030:  8000240
> 0000000040209034: 1bdddce6
> 0000000040209038:   215560

It still seems to be wrong.
Shouldn't it be: 15d000  (4015d000-40000000) ?


> 000000004020903c:      1a0
> 
> diff --git a/arch/parisc/kernel/entry.S b/arch/parisc/kernel/entry.S
> index 1b4732e20137..9aec7673b8c3 100644
> --- a/arch/parisc/kernel/entry.S
> +++ b/arch/parisc/kernel/entry.S
> @@ -185,7 +185,7 @@
>  	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
>  
> diff --git a/arch/parisc/kernel/traps.c b/arch/parisc/kernel/traps.c
> index 4309ad31a874..2cb35e1e0099 100644
> --- a/arch/parisc/kernel/traps.c
> +++ b/arch/parisc/kernel/traps.c
> @@ -827,7 +827,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);

I think this needs to be __pa(.os_hpmc), *if* .os_hpmc would be exported.
That's why I suggested to use 
dereference_function_descriptor(&os_hpmc);

Helge
John David Anglin Oct. 6, 2018, 8:32 p.m. UTC | #2
On 2018-10-06 2:22 PM, Helge Deller wrote:
>> 0000000040209038:   215560
> It still seems to be wrong.
> Shouldn't it be: 15d000  (4015d000-40000000) ?
The above address was for a kernel build with a different config.  I did
check that os_hpmc was at virtual address 40215560 for that build. 
However, I
have lost the uncompressed vmlinux file (still have vmlinuz).  I could 
recheck
but I think the patch gives the correct address.

Dave
John David Anglin Oct. 6, 2018, 9:36 p.m. UTC | #3
On 2018-10-06 4:32 PM, John David Anglin wrote:
> On 2018-10-06 2:22 PM, Helge Deller wrote:
>>> 0000000040209038:   215560
>> It still seems to be wrong.
>> Shouldn't it be: 15d000  (4015d000-40000000) ?
> The above address was for a kernel build with a different config. I did
> check that os_hpmc was at virtual address 40215560 for that build. 
> However, I
> have lost the uncompressed vmlinux file (still have vmlinuz).  I could 
> recheck
> but I think the patch gives the correct address.
I added a print statement to recheck the address computation.  It seems 
correct:

[    0.000000] Physical address of os_hpmc is 0x207000
[    0.000000] Linux version 4.14.74+ (dave@atlas) (gcc version 8.2.0 
(GCC)) #2 SMP Sat Oct 6 17:23:02 EDT 2018

0000000040207000 <os_hpmc>:
     40207000:   08 1a 02 43     copy r26,r3
     40207004:   01 c0 08 a4     mfctl iva,r4

Dave
diff mbox series

Patch

diff --git a/arch/parisc/kernel/entry.S b/arch/parisc/kernel/entry.S
index 1b4732e20137..9aec7673b8c3 100644
--- a/arch/parisc/kernel/entry.S
+++ b/arch/parisc/kernel/entry.S
@@ -185,7 +185,7 @@ 
 	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
 
diff --git a/arch/parisc/kernel/traps.c b/arch/parisc/kernel/traps.c
index 4309ad31a874..2cb35e1e0099 100644
--- a/arch/parisc/kernel/traps.c
+++ b/arch/parisc/kernel/traps.c
@@ -827,7 +827,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;