Blob Blame History Raw
From f4c5fe13fd1484aa1bf37910841c689877740602 Mon Sep 17 00:00:00 2001
From: David Tardon <dtardon@redhat.com>
Date: Mon, 23 Apr 2012 09:47:41 +0200
Subject: [PATCH] save register arguments first

The "mr" stores r11 to indeterminate register (r9 in my case) before
storing it into the output variable, thus overwriting one of our input
arguments... This later leads to nice segfault in
testtools/source/bridgetest ...

I suppose there is a better way to get the variable, but I do not know
it .-)
---
 .../cpp_uno/gcc3_linux_powerpc64/cpp2uno.cxx       |   16 ++++++++--------
 1 files changed, 8 insertions(+), 8 deletions(-)

diff --git a/bridges/source/cpp_uno/gcc3_linux_powerpc64/cpp2uno.cxx b/bridges/source/cpp_uno/gcc3_linux_powerpc64/cpp2uno.cxx
index 425c5b5..3cb94dd 100644
--- a/bridges/source/cpp_uno/gcc3_linux_powerpc64/cpp2uno.cxx
+++ b/bridges/source/cpp_uno/gcc3_linux_powerpc64/cpp2uno.cxx
@@ -504,13 +504,6 @@ static typelib_TypeClass cpp_mediate(
 
 extern "C" void privateSnippetExecutor( ... )
 {
-    volatile long nOffsetAndIndex;
-
-    //mr %r3, %r11            # move into arg1 the 64bit value passed from OOo
-    __asm__ __volatile__ (
-                "mr     %0,    11\n\t"
-                : "=r" (nOffsetAndIndex) : );
-
     sal_uInt64 gpreg[ppc64::MAX_GPR_REGS];
     double fpreg[ppc64::MAX_SSE_REGS];
 
@@ -537,11 +530,18 @@ extern "C" void privateSnippetExecutor( ... )
         "stfd 12, 88(%1)\t\n"
         "stfd 13, 96(%1)\t\n"
     : : "r" (gpreg), "r" (fpreg)
-        : "r0", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10",
+        : "r0", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11",
           "fr1", "fr2", "fr3", "fr4", "fr5", "fr6", "fr7", "fr8", "fr9",
           "fr10", "fr11", "fr12", "fr13"
     );
 
+    volatile long nOffsetAndIndex;
+
+    //mr %r3, %r11            # move into arg1 the 64bit value passed from OOo
+    __asm__ __volatile__ (
+                "mr     %0,    11\n\t"
+                : "=r" (nOffsetAndIndex) : );
+
     volatile long sp;
 
     //stack pointer
-- 
1.7.7.6