Message ID | 20181006171129.GA12046@mx3210.localdomain (mailing list archive) |
---|---|
State | Accepted, archived |
Headers | show |
Series | parisc: Fix address in HPMC IVA | expand |
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
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
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 --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;
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>