parisc: Fix argument pointer in real64_call_asm()
authorHelge Deller <deller@gmx.de>
Wed, 3 May 2023 14:39:56 +0000 (16:39 +0200)
committerHelge Deller <deller@gmx.de>
Wed, 3 May 2023 15:43:26 +0000 (17:43 +0200)
Fix the argument pointer (ap) to point to real-mode memory
instead of virtual memory.

It's interesting that this issue hasn't shown up earlier, as this could
have happened with any 64-bit PDC ROM code.

I just noticed it because I suddenly faced a HPMC while trying to execute
the 64-bit STI ROM code of an Visualize-FXe graphics card for the STI
text console.

Signed-off-by: Helge Deller <deller@gmx.de>
Cc: <stable@vger.kernel.org>
arch/parisc/kernel/real2.S

index 4dc12c4..509d18b 100644 (file)
@@ -235,9 +235,6 @@ ENTRY_CFI(real64_call_asm)
        /* save fn */
        copy    %arg2, %r31
 
-       /* set up the new ap */
-       ldo     64(%arg1), %r29
-
        /* load up the arg registers from the saved arg area */
        /* 32-bit calling convention passes first 4 args in registers */
        ldd     0*REG_SZ(%arg1), %arg0          /* note overwriting arg0 */
@@ -249,7 +246,9 @@ ENTRY_CFI(real64_call_asm)
        ldd     7*REG_SZ(%arg1), %r19
        ldd     1*REG_SZ(%arg1), %arg1          /* do this one last! */
 
+       /* set up real-mode stack and real-mode ap */
        tophys_r1 %sp
+       ldo     -16(%sp), %r29                  /* Reference param save area */
 
        b,l     rfi_virt2real,%r2
        nop