affa333537
Mozilla Thunderbird is a redesign of the Mozilla mail component. The goal is to produce a cross platform stand alone mail application using the XUL user interface language. This version uses the gtk2 toolkit. This package tracks 24 ESR release branch.
119 lines
3.8 KiB
Text
119 lines
3.8 KiB
Text
$NetBSD: patch-xa,v 1.1 2013/11/13 13:27:45 ryoon Exp $
|
|
|
|
NetBSD/sparc64 xptcall support code. From pkgsrc/www/firefox3/files/
|
|
|
|
--- mozilla/xpcom/reflect/xptcall/src/md/unix/xptcinvoke_asm_sparc64_netbsd.s.orig 2012-08-31 13:21:49.000000000 +0000
|
|
+++ mozilla/xpcom/reflect/xptcall/src/md/unix/xptcinvoke_asm_sparc64_netbsd.s
|
|
@@ -0,0 +1,112 @@
|
|
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*-
|
|
+ *
|
|
+ * The contents of this file are subject to the Netscape Public
|
|
+ * License Version 1.1 (the "License"); you may not use this file
|
|
+ * except in compliance with the License. You may obtain a copy of
|
|
+ * the License at http://www.mozilla.org/NPL/
|
|
+ *
|
|
+ * Software distributed under the License is distributed on an "AS
|
|
+ * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
|
|
+ * implied. See the License for the specific language governing
|
|
+ * rights and limitations under the License.
|
|
+ *
|
|
+ * The Original Code is mozilla.org code.
|
|
+ *
|
|
+ * The Initial Developer of the Original Code is Netscape
|
|
+ * Communications Corporation. Portions created by Netscape are
|
|
+ * Copyright (C) 1998 Netscape Communications Corporation. All
|
|
+ * Rights Reserved.
|
|
+ *
|
|
+ * Contributor(s):
|
|
+ */
|
|
+
|
|
+/* Platform specific code to invoke XPCOM methods on native objects */
|
|
+ .global NS_InvokeByIndex_P
|
|
+ .type NS_InvokeByIndex_P, #function
|
|
+/*
|
|
+ NS_InvokeByIndex_P(nsISupports* that, PRUint32 methodIndex,
|
|
+ PRUint32 paramCount, nsXPTCVariant* params);
|
|
+
|
|
+*/
|
|
+/*
|
|
+ * Note: To simplify stack handling we allocate an extra stack
|
|
+ * frame here. In principle invoke_copy_to_stack() could
|
|
+ * save the parameters our caller's frame and we could
|
|
+ * reclaim the stackframe and do a tail call to the
|
|
+ * function. However, this gets complicated....
|
|
+ *
|
|
+ * The vtable consist of be:
|
|
+ *
|
|
+ * struct {
|
|
+ * short __delta;
|
|
+ * short __index;
|
|
+ * union {
|
|
+ * P __pfn;
|
|
+ * short __delta2;
|
|
+ * } __pfn_or_delta2;
|
|
+ * };
|
|
+ *
|
|
+ * See gcc/cp/cp-tree.h
|
|
+ */
|
|
+
|
|
+NS_InvokeByIndex_P:
|
|
+ save %sp,-(128 + 64),%sp ! room for the register window and
|
|
+ ! struct pointer, rounded up to 0 % 64
|
|
+ sll %i2,4,%l0 ! assume the worst case
|
|
+ ! paramCount * 2 * 8 bytes
|
|
+ cmp %l0, 0 ! are there any args? If not,
|
|
+ be .invoke ! no need to copy args to stack
|
|
+ nop
|
|
+
|
|
+ sub %sp,%l0,%sp ! create the additional stack space
|
|
+ add %sp,0x7ff+136,%o0 ! step past the register window, the
|
|
+ ! struct result pointer and the 'this' slot
|
|
+ mov %i2,%o1 ! paramCount
|
|
+ call invoke_copy_to_stack
|
|
+ mov %i3,%o2 ! params
|
|
+
|
|
+!
|
|
+! load arguments from stack into the outgoing registers
|
|
+! BIAS is 0x7ff (2047)
|
|
+!
|
|
+
|
|
+! load the %o1..5 64bit (extended word) output registers registers
|
|
+ ldx [%sp + 0x7ff + 136],%o1 ! %i1
|
|
+ ldx [%sp + 0x7ff + 144],%o2 ! %i2
|
|
+ ldx [%sp + 0x7ff + 152],%o3 ! %i3
|
|
+ ldx [%sp + 0x7ff + 160],%o4 ! %i4
|
|
+ ldx [%sp + 0x7ff + 168],%o5 ! %i5
|
|
+
|
|
+! load the even number double registers starting with %f2
|
|
+ ldd [%sp + 0x7ff + 136],%f2
|
|
+ ldd [%sp + 0x7ff + 144],%f4
|
|
+ ldd [%sp + 0x7ff + 152],%f6
|
|
+ ldd [%sp + 0x7ff + 160],%f8
|
|
+ ldd [%sp + 0x7ff + 168],%f10
|
|
+ ldd [%sp + 0x7ff + 176],%f12
|
|
+ ldd [%sp + 0x7ff + 184],%f14
|
|
+ ldd [%sp + 0x7ff + 192],%f16
|
|
+ ldd [%sp + 0x7ff + 200],%f18
|
|
+ ldd [%sp + 0x7ff + 208],%f20
|
|
+ ldd [%sp + 0x7ff + 216],%f22
|
|
+ ldd [%sp + 0x7ff + 224],%f24
|
|
+ ldd [%sp + 0x7ff + 232],%f26
|
|
+ ldd [%sp + 0x7ff + 240],%f28
|
|
+ ldd [%sp + 0x7ff + 248],%f30
|
|
+
|
|
+!
|
|
+! calculate the target address from the vtable
|
|
+!
|
|
+.invoke:
|
|
+ sll %i1,3,%l0 ! index *= 8
|
|
+ ldx [%i0],%l1 ! *this --> address of vtable
|
|
+ ldx [%l0 + %l1],%l0 ! this->vtable[index] --> address
|
|
+
|
|
+ jmpl %l0,%o7 ! call the routine
|
|
+ mov %i0,%o0 ! move 'this' pointer to out register
|
|
+
|
|
+ mov %o0,%i0 ! propagate return value
|
|
+ ret
|
|
+ restore
|
|
+
|
|
+ .size NS_InvokeByIndex_P, .-NS_InvokeByIndex_P
|