summaryrefslogtreecommitdiff
path: root/www/seamonkey/patches/patch-xa
blob: 72431cb754a5ffef4f8f1f1e4d593bc2eaa2f1bc (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
$NetBSD: patch-xa,v 1.7 2013/01/07 21:55:30 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-11-23 07:42:33.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