summaryrefslogtreecommitdiff
path: root/bridges
diff options
context:
space:
mode:
authorDavid Tardon <dtardon@redhat.com>2012-04-23 09:47:41 +0200
committerDavid Tardon <dtardon@redhat.com>2012-04-23 13:47:00 +0200
commitc4c9484a1f55266c92e83406ddee3715affed7f6 (patch)
tree1c8afd40be32e5ec69037a3dce3e3f7aa4bbf9b1 /bridges
parent62a318eea86feb9340970c71eac8555535d09b78 (diff)
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 .-)
Diffstat (limited to 'bridges')
-rw-r--r--bridges/source/cpp_uno/gcc3_linux_powerpc64/cpp2uno.cxx16
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 425c5b530b7f..3cb94dd43595 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