fix UNO bridges for ppc and ppc64

f41
David Tardon 13 years ago
parent 9ac316ca15
commit 16611a273c

@ -0,0 +1,54 @@
From 032084d8582ef8eb04724d2488f3e381ac8054d2 Mon Sep 17 00:00:00 2001
From: David Tardon <dtardon@redhat.com>
Date: Mon, 23 Apr 2012 13:19:39 +0200
Subject: [PATCH] do not let gcc use registers we are setting ourselves
gcc uses a register for the function call--and it tried r9 here...
---
.../source/cpp_uno/gcc3_linux_powerpc/uno2cpp.cxx | 16 +++++++++++++---
1 files changed, 13 insertions(+), 3 deletions(-)
diff --git a/bridges/source/cpp_uno/gcc3_linux_powerpc/uno2cpp.cxx b/bridges/source/cpp_uno/gcc3_linux_powerpc/uno2cpp.cxx
index 34e8c63..f409bf7 100644
--- a/bridges/source/cpp_uno/gcc3_linux_powerpc/uno2cpp.cxx
+++ b/bridges/source/cpp_uno/gcc3_linux_powerpc/uno2cpp.cxx
@@ -67,7 +67,6 @@ static void callVirtualMethod(
// of floating point registers f1 to f8
unsigned long * mfunc; // actual function to be invoked
- void (*ptr)();
int gpr[8]; // storage for gpregisters, map to r3-r10
int off; // offset used to find function
#ifndef __NO_FPRS__
@@ -243,7 +242,8 @@ static void callVirtualMethod(
mfunc = *((unsigned long **)pAdjustedThisPtr); // get the address of the vtable
mfunc = (unsigned long *)((char *)mfunc + off); // get the address from the vtable entry at offset
mfunc = *((unsigned long **)mfunc); // the function is stored at the address
- ptr = (void (*)())mfunc;
+ typedef void (*FunctionCall)(sal_uInt32, sal_uInt32, sal_uInt32, sal_uInt32, sal_uInt32, sal_uInt32, sal_uInt32, sal_uInt32);
+ FunctionCall ptr = (FunctionCall)mfunc;
/* Set up the machine registers and invoke the function */
@@ -272,7 +272,17 @@ static void callVirtualMethod(
: "0", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12"
);
- (*ptr)();
+ // tell gcc that r3 to r10 are not available to it for doing the TOC and exception munge on the func call
+ register sal_uInt32 r3 __asm__("r3");
+ register sal_uInt32 r4 __asm__("r4");
+ register sal_uInt32 r5 __asm__("r5");
+ register sal_uInt32 r6 __asm__("r6");
+ register sal_uInt32 r7 __asm__("r7");
+ register sal_uInt32 r8 __asm__("r8");
+ register sal_uInt32 r9 __asm__("r9");
+ register sal_uInt32 r10 __asm__("r10");
+
+ (*ptr)(r3, r4, r5, r6, r7, r8, r9, r10);
__asm__ __volatile__ (
"mr %0, 3\n\t"
--
1.7.7.6

@ -0,0 +1,57 @@
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

@ -141,6 +141,8 @@ Patch27: 0001-Resolves-rhbz-806663-SlideshowImpl-can-outlive-SdMod.patch
Patch28: 0001-desktop-do-not-complain-about-soffice-command-line-o.patch
Patch29: 0001-Resolves-fdo-48096-torn-off-popups-trigger-keyboard-.patch
Patch30: 0001-fdo-38088-better-CSV-import-default-separators.patch
Patch31: 0001-save-register-arguments-first.patch
Patch32: 0001-do-not-let-gcc-use-registers-we-are-setting-ourselve.patch
%{!?python_sitearch: %global python_sitearch %(%{__python} -c "from distutils.sysconfig import get_python_lib; print(get_python_lib(1))")}
%define instdir %{_libdir}
@ -993,6 +995,8 @@ mv -f redhat.soc extras/source/palettes/standard.soc
%patch28 -p1 -b .do-not-complain-about-soffice-command-line-o.patch
%patch29 -p1 -b .fdo48096-torn-off-popups-trigger-keyboard-.patch
%patch30 -p1 -b .fdo-38088-better-CSV-import-default-separators.patch
%patch31 -p1 -b .save-register-arguments-first.patch
%patch32 -p1 -b .do-not-let-gcc-use-registers-we-are-setting-ourselve.patch
# TODO: check this
# these are horribly incomplete--empty translations and copied english
@ -2282,6 +2286,7 @@ update-desktop-database %{_datadir}/applications &> /dev/null || :
%changelog
* Mon Apr 23 2012 David Tardon <dtardon@redhat.com> - 3.5.3.1-2
- rebuild for icu
- fix UNO bridges for ppc and ppc64
* Thu Apr 19 2012 David Tardon <dtardon@redhat.com> - 3.5.3.1-1
- 3.5.3 rc1

Loading…
Cancel
Save