Subject: pkg/25736: firefox pkg don't build on amd64
To: None <gnats-bugs@gnats.NetBSD.org>
From: None <ole.hellqvist@spray.se>
List: pkgsrc-bugs
Date: 05/28/2004 05:49:52
>Number:         25736
>Category:       pkg
>Synopsis:       firefox pkg don't build on amd64
>Confidential:   no
>Severity:       serious
>Priority:       medium
>Responsible:    pkg-manager
>State:          open
>Class:          sw-bug
>Submitter-Id:   net
>Arrival-Date:   Fri May 28 05:50:00 UTC 2004
>Closed-Date:
>Last-Modified:
>Originator:     Ole
>Release:        NetBSD 2.0_BETA
>Organization:
home user
>Environment:
amd64.oxen 2.0_BETA NetBSD 2.0_BETA (GENERIC) #0: Thu Apr 22 16:47:08 PDT 2004  mthomas@cerealbox.englab.brocade.com:/u2/netbsd-2-0/amd64/obj/sys/arch/amd64/compile/GENERIC amd64

>Description:
insufficiant configuration for Amd64 in firefox pakage
"make" stops with an error ...
>How-To-Repeat:

make

>Fix:
modifying and adding pathes below:
------------------------------------------------------------------------
cat patch-ac 

--- xpcom/reflect/xptcall/src/md/unix/Makefile.in.orig  2003-08-15 06:00:23.000000000 +0200
+++ xpcom/reflect/xptcall/src/md/unix/Makefile.in       2004-05-26 22:14:13.000000000 +0200
@@ -79,6 +79,13 @@
 CPPSRCS                := xptcinvoke_unixish_x86.cpp xptcstubs_unixish_x86.cpp
 endif
 
+#
+# NetBSD/amd64
+#
+ifeq ($(OS_ARCH)$(OS_TEST),NetBSDamd64)
+CPPSRCS                := xptcinvoke_amd64_netbsd.cpp xptcstubs_amd64_netbsd.cpp
+endif
+
 ######################################################################
 # Solaris/Intel
 ######################################################################
@@ -135,7 +142,7 @@
 # NetBSD/ARM
 #
 ifeq ($(OS_ARCH),NetBSD)
-ifneq (,$(filter arm% sa110,$(OS_TEST)))
+ifneq (,$(filter arm%,$(TARGET_CPU)))
 CPPSRCS                := xptcinvoke_arm_netbsd.cpp xptcstubs_arm_netbsd.cpp
 endif
 endif
@@ -169,7 +176,7 @@
 # NetBSD/m68k
 #
 ifeq ($(OS_ARCH),NetBSD)
-ifneq (,$(filter amiga atari hp300 mac68k mvme68k next68k sun3 sun3x x68k,$(OS_TEST)))
+ifneq (,$(filter m68k,$(TARGET_CPU)))
 CPPSRCS                := xptcinvoke_netbsd_m68k.cpp xptcstubs_netbsd_m68k.cpp
 endif
 endif
@@ -296,6 +303,13 @@
 ASFILES                := xptcinvoke_asm_sparc_netbsd.s xptcstubs_asm_sparc_netbsd.s
 endif
 #
+# NetBSD/SPARC64
+#   
+ifeq ($(OS_ARCH)$(OS_TEST),NetBSDsparc64)
+CPPSRCS                := xptcinvoke_sparc64_netbsd.cpp xptcstubs_sparc64_netbsd.cpp
+ASFILES                := xptcinvoke_asm_sparc64_netbsd.s xptcstubs_asm_sparc64_netbsd.s
+endif
+#
 # Solaris/SPARC
 #
 ifeq ($(OS_ARCH),SunOS)
------------------------------------------------------------------------ 
cat patch-ba


--- nsprpub/pr/include/md/_netbsd.cfg.orig      2000-12-01 22:29:17.000000000 +0
100
+++ nsprpub/pr/include/md/_netbsd.cfg   2004-05-26 21:57:14.000000000 +0200
@@ -45,7 +45,8 @@
 
 #define PR_AF_INET6 24  /* same as AF_INET6 */
 
-#if defined(__i386__) || defined(__arm32__) || defined(__MIPSEL__)
+#if defined(__i386__) || defined(__arm32__) || defined(__arm__) || \
+       defined(__armel__) || defined(__MIPSEL__)
 
 #define IS_LITTLE_ENDIAN 1
 #undef  IS_BIG_ENDIAN
@@ -91,7 +92,103 @@
 #define PR_ALIGN_OF_DOUBLE  4
 #define PR_ALIGN_OF_POINTER 4
 
-#elif defined(__sparc__) || defined(__MIPSEB__)
+#elif defined(__x86_64__)
+
+#define IS_LITTLE_ENDIAN 1
+#undef  IS_BIG_ENDIAN
+#define IS_64
+
+#define PR_BYTES_PER_BYTE   1
+#define PR_BYTES_PER_SHORT  2
+#define PR_BYTES_PER_INT    4
+#define PR_BYTES_PER_INT64  8
+#define PR_BYTES_PER_LONG   8
+#define PR_BYTES_PER_FLOAT  4
+#define PR_BYTES_PER_DOUBLE 8
+#define PR_BYTES_PER_WORD   8
+#define PR_BYTES_PER_DWORD  8
+
+#define PR_BITS_PER_BYTE    8
+#define PR_BITS_PER_SHORT   16
+#define PR_BITS_PER_INT     32
+#define PR_BITS_PER_INT64   64
+#define PR_BITS_PER_LONG    64
+#define PR_BITS_PER_FLOAT   32
+#define PR_BITS_PER_DOUBLE  64
+#define PR_BITS_PER_WORD    64
+
+#define PR_BITS_PER_BYTE_LOG2   3
+#define PR_BITS_PER_SHORT_LOG2  4
+#define PR_BITS_PER_INT_LOG2    5
+#define PR_BITS_PER_INT64_LOG2  6
+#define PR_BITS_PER_LONG_LOG2   6
+#define PR_BITS_PER_FLOAT_LOG2  5
+#define PR_BITS_PER_DOUBLE_LOG2 6
+#define PR_BITS_PER_WORD_LOG2   6
+
+#define PR_ALIGN_OF_SHORT   2
+#define PR_ALIGN_OF_INT     4
+#define PR_ALIGN_OF_LONG    8
+#define PR_ALIGN_OF_INT64   8
+#define PR_ALIGN_OF_FLOAT   4
+#define PR_ALIGN_OF_DOUBLE  8
+#define PR_ALIGN_OF_POINTER 8
+#define PR_ALIGN_OF_WORD    8
+
+#define PR_BYTES_PER_WORD_LOG2  3
+#define PR_BYTES_PER_DWORD_LOG2 3
+
+#define HAVE_LONG_LONG
+#define HAVE_ALIGNED_DOUBLES
+#define HAVE_ALIGNED_LONGLONGS
+
+#elif defined(__sparc_v9__)
+
+#undef IS_LITTLE_ENDIAN
+#define  IS_BIG_ENDIAN 1
+#define HAVE_LONG_LONG
+#define  HAVE_ALIGNED_DOUBLES
+#define  HAVE_ALIGNED_LONGLONGS
+
+#define PR_BYTES_PER_BYTE   1
+#define PR_BYTES_PER_SHORT  2
+#define PR_BYTES_PER_INT    4
+#define PR_BYTES_PER_INT64  8
+#define PR_BYTES_PER_LONG   8
+#define PR_BYTES_PER_FLOAT  4
+#define PR_BYTES_PER_DOUBLE 8
+#define PR_BYTES_PER_WORD   8
+#define PR_BYTES_PER_DWORD  8
+#define PR_BYTES_PER_WORD_LOG2   3
+#define PR_BYTES_PER_DWORD_LOG2  3
+
+#define PR_BITS_PER_BYTE    8
+#define PR_BITS_PER_SHORT   16
+#define PR_BITS_PER_INT     32
+#define PR_BITS_PER_INT64   64
+#define PR_BITS_PER_LONG    64
+#define PR_BITS_PER_FLOAT   32
+#define PR_BITS_PER_DOUBLE  64
+#define PR_BITS_PER_WORD    64
+
+#define PR_BITS_PER_BYTE_LOG2   3
+#define PR_BITS_PER_SHORT_LOG2  4
+#define PR_BITS_PER_INT_LOG2    5
+#define PR_BITS_PER_INT64_LOG2  6
+#define PR_BITS_PER_LONG_LOG2   6
+#define PR_BITS_PER_FLOAT_LOG2  5
+#define PR_BITS_PER_DOUBLE_LOG2 6
+#define PR_BITS_PER_WORD_LOG2   6
+
+#define PR_ALIGN_OF_SHORT   2
+#define PR_ALIGN_OF_INT     4
+#define PR_ALIGN_OF_LONG    8
+#define PR_ALIGN_OF_INT64   8 
+#define PR_ALIGN_OF_FLOAT   4 
+#define PR_ALIGN_OF_DOUBLE  8 
+#define PR_ALIGN_OF_POINTER 8 
+
+#elif defined(__sparc__) || defined(__MIPSEB__) || defined(__armeb__)
 
 #undef IS_LITTLE_ENDIAN
 #define  IS_BIG_ENDIAN 1

------------------------------------------------------------------------

cat patch-bb

--- nsprpub/pr/include/md/_netbsd.h.orig        2003-09-11 19:24:53.000000000 +0
200
+++ nsprpub/pr/include/md/_netbsd.h     2004-05-26 22:06:08.000000000 +0200
@@ -42,18 +42,28 @@
 #define _PR_SI_SYSNAME  "NetBSD"
 #if defined(__i386__)
 #define _PR_SI_ARCHITECTURE "x86"
+#elif defined(__x86_64__)
+#define _PR_SI_ARCHITECTURE "x86-64"
 #elif defined(__alpha__)
 #define _PR_SI_ARCHITECTURE "alpha"
 #elif defined(__m68k__)
 #define _PR_SI_ARCHITECTURE "m68k"
 #elif defined(__powerpc__)
 #define _PR_SI_ARCHITECTURE "powerpc"
+#elif defined(__sparc_v9__)
+#define _PR_SI_ARCHITECTURE "sparc64"
 #elif defined(__sparc__)
 #define _PR_SI_ARCHITECTURE "sparc"
 #elif defined(__mips__)
 #define _PR_SI_ARCHITECTURE "mips"
 #elif defined(__arm32__)
 #define _PR_SI_ARCHITECTURE "arm32"
+#elif defined(__arm__)
+#define _PR_SI_ARCHITECTURE "arm"
+#elif defined(__armel__)
+#define _PR_SI_ARCHITECTURE "armel"
+#elif defined(__armeb__)
+#define _PR_SI_ARCHITECTURE "armeb"
 #endif
 
 #if defined(__ELF__)
@@ -86,6 +96,12 @@
 #define _PR_INET6_PROBE
 #endif
 
+#if __NetBSD_Version__ >= 106370000
+/* NetBSD 1.6ZK */
+#define _PR_HAVE_GETPROTO_R
+#define _PR_HAVE_GETPROTO_R_INT
+#endif
+
 #define USE_SETJMP
 
 #ifndef _PR_PTHREADS
@@ -108,7 +124,17 @@
 }
 #define        _MD_GET_SP(_thread)     CONTEXT(_thread)[2]
 #endif
-#ifdef __sparc__
+#ifdef __sparc_v9__
+#define _MD_INIT_CONTEXT(_thread, _sp, _main, status)                  \
+{                                                                      \
+    sigsetjmp(CONTEXT(_thread), 1);                                    \
+    CONTEXT(_thread)[1] = (unsigned char*) ((_sp) - 176 - 0x7ff);      \
+    CONTEXT(_thread)[2] = (long) _main;                                \
+    CONTEXT(_thread)[3] = (long) _main + 4;                            \
+    *status = PR_TRUE;                                                 \
+}
+#define        _MD_GET_SP(_thread)     (CONTEXT(_thread)[2]+0x7ff)
+#elif defined(__sparc__)
 #define _MD_INIT_CONTEXT(_thread, _sp, _main, status)                  \
 {                                                                      \
     sigsetjmp(CONTEXT(_thread), 1);                                    \
@@ -150,7 +176,7 @@
 }
 #define        _MD_GET_SP(_thread)     CONTEXT(_thread)[32]
 #endif
-#ifdef __arm32__
+#if defined(__arm32__) || defined(__arm__) || defined(__armel__) || defined(__a
rmeb__)
 #define _MD_INIT_CONTEXT(_thread, _sp, _main, status)                  \
 {                                                                      \
     sigsetjmp(CONTEXT(_thread), 1);                                    \

----------------------------------------------------------------------
cat patch-ca

--- xpcom/reflect/xptcall/src/md/unix/xptcinvoke_amd64_netbsd.cpp.orig  1970-01-
01 01:00:00.000000000 +0100
+++ xpcom/reflect/xptcall/src/md/unix/xptcinvoke_amd64_netbsd.cpp       2004-05-
23 12:10:24.000000000 +0200
@@ -0,0 +1,174 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+// Platform specific code to invoke XPCOM methods on native objects
+
+#include "xptcprivate.h"
+
+// 6 integral parameters are passed in registers
+const PRUint32 GPR_COUNT = 6;
+
+// 8 floating point parameters are passed in SSE registers
+const PRUint32 FPR_COUNT = 8;
+
+// Remember that these 'words' are 64-bit long
+static inline void
+invoke_count_words(PRUint32 paramCount, nsXPTCVariant * s,
+                   PRUint32 & nr_gpr, PRUint32 & nr_fpr, PRUint32 & nr_stack)
+{
+    nr_gpr = 1; // skip one GP register for 'that'
+    nr_fpr = 0;
+    nr_stack = 0;
+
+    /* Compute number of eightbytes of class MEMORY.  */
+    for (uint32 i = 0; i < paramCount; i++, s++) {
+        if (!s->IsPtrData()
+            && (s->type == nsXPTType::T_FLOAT || s->type == nsXPTType::T_DOUBLE
)) {
+            if (nr_fpr < FPR_COUNT)
+                nr_fpr++;
+            else
+                nr_stack++;
+        }
+        else {
+            if (nr_gpr < GPR_COUNT)
+                nr_gpr++;
+            else
+                nr_stack++;
+        }
+    }
+}
+
+static void
+invoke_copy_to_stack(PRUint64 * d, PRUint32 paramCount, nsXPTCVariant * s,
+                     PRUint64 * gpregs, double * fpregs)
+{
+    PRUint32 nr_gpr = 1; // skip one GP register for 'that'
+    PRUint32 nr_fpr = 0;
+    PRUint64 value;
+
+    for (uint32 i = 0; i < paramCount; i++, s++) {
+        if (s->IsPtrData())
+            value = (PRUint64) s->ptr;
+        else {
+            switch (s->type) {
+            case nsXPTType::T_FLOAT:                                break;
+            case nsXPTType::T_DOUBLE:                               break;
+            case nsXPTType::T_I8:     value = s->val.i8;            break;
+            case nsXPTType::T_I16:    value = s->val.i16;           break;
+            case nsXPTType::T_I32:    value = s->val.i32;           break;
+            case nsXPTType::T_I64:    value = s->val.i64;           break;
+            case nsXPTType::T_U8:     value = s->val.u8;            break;
+            case nsXPTType::T_U16:    value = s->val.u16;           break;
+            case nsXPTType::T_U32:    value = s->val.u32;           break;
+            case nsXPTType::T_U64:    value = s->val.u64;           break;
+            case nsXPTType::T_BOOL:   value = s->val.b;             break;
+            case nsXPTType::T_CHAR:   value = s->val.c;             break;
+            case nsXPTType::T_WCHAR:  value = s->val.wc;            break;
+            default:                  value = (PRUint64) s->val.p;  break;
+            }
+        }
+
+        if (!s->IsPtrData() && s->type == nsXPTType::T_DOUBLE) {
+            if (nr_fpr < FPR_COUNT)
+                fpregs[nr_fpr++] = s->val.d;
+            else {
+                *((double *)d) = s->val.d;
+                d++;
+            }
+        }
+        else if (!s->IsPtrData() && s->type == nsXPTType::T_FLOAT) {
+            if (nr_fpr < FPR_COUNT)
+                // The value in %xmm register is already prepared to
+                // be retrieved as a float. Therefore, we pass the
+                // value verbatim, as a double without conversion.
+                fpregs[nr_fpr++] = s->val.d;
+            else {
+                *((float *)d) = s->val.f;
+                d++;
+            }
+        }
+        else {
+            if (nr_gpr < GPR_COUNT)
+                gpregs[nr_gpr++] = value;
+            else
+                *d++ = value;
+        }
+    }
+}
+
+extern "C"
+XPTC_PUBLIC_API(nsresult)
+XPTC_InvokeByIndex(nsISupports * that, PRUint32 methodIndex,
+                   PRUint32 paramCount, nsXPTCVariant * params)
+{
+    PRUint32 nr_gpr, nr_fpr, nr_stack;
+    invoke_count_words(paramCount, params, nr_gpr, nr_fpr, nr_stack);
+    
+    // Stack, if used, must be 16-bytes aligned
+    if (nr_stack)
+        nr_stack = (nr_stack + 1) & ~1;
+
+    // Load parameters to stack, if necessary
+    PRUint64 *stack = (PRUint64 *) __builtin_alloca(nr_stack * 8);
+    PRUint64 gpregs[GPR_COUNT];
+    double fpregs[FPR_COUNT];
+    invoke_copy_to_stack(stack, paramCount, params, gpregs, fpregs);
+
+    // Load FPR registers from fpregs[]
+    register double d0 asm("xmm0");
+    register double d1 asm("xmm1");
+    register double d2 asm("xmm2");
+    register double d3 asm("xmm3");
+    register double d4 asm("xmm4");
+    register double d5 asm("xmm5");
+    register double d6 asm("xmm6");
+    register double d7 asm("xmm7");
+
+    switch (nr_fpr) {
+#define ARG_FPR(N) \
+    case N+1: d##N = fpregs[N];
+        ARG_FPR(7);
+        ARG_FPR(6);
+        ARG_FPR(5);
+        ARG_FPR(4);
+        ARG_FPR(3);
+        ARG_FPR(2);
+        ARG_FPR(1);
+        ARG_FPR(0);
+    case 0:;
+#undef ARG_FPR
+    }
+    
+    // Load GPR registers from gpregs[]
+    register PRUint64 a0 asm("rdi");
+    register PRUint64 a1 asm("rsi");
+    register PRUint64 a2 asm("rdx");
+    register PRUint64 a3 asm("rcx");
+    register PRUint64 a4 asm("r8");
+    register PRUint64 a5 asm("r9");
+    
+    switch (nr_gpr) {
+#define ARG_GPR(N) \
+    case N+1: a##N = gpregs[N];
+        ARG_GPR(5);
+        ARG_GPR(4);
+        ARG_GPR(3);
+        ARG_GPR(2);
+        ARG_GPR(1);
+    case 1: a0 = (PRUint64) that;
+    case 0:;
+#undef ARG_GPR
+    }
+
+    // Ensure that assignments to SSE registers won't be optimized away
+    asm("" ::
+        "x" (d0), "x" (d1), "x" (d2), "x" (d3),
+        "x" (d4), "x" (d5), "x" (d6), "x" (d7));
+    
+    // Get pointer to method
+    PRUint64 methodAddress = *((PRUint64 *)that);
+    methodAddress += 8 * methodIndex;
+    methodAddress = *((PRUint64 *)methodAddress);
+    
+    typedef PRUint32 (*Method)(PRUint64, PRUint64, PRUint64, PRUint64, PRUint64
, PRUint64);
+    PRUint32 result = ((Method)methodAddress)(a0, a1, a2, a3, a4, a5);
+    return result;
+}

-------------------------------------------------------------------------

 cat patch-cb

--- xpcom/reflect/xptcall/src/md/unix/xptcstubs_amd64_netbsd.cpp.orig   1970-01-
01 01:00:00.000000000 +0100
+++ xpcom/reflect/xptcall/src/md/unix/xptcstubs_amd64_netbsd.cpp        2004-05-
23 12:10:42.000000000 +0200
@@ -0,0 +1,206 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+
+// Implement shared vtbl methods.
+
+#include "xptcprivate.h"
+
+// The Linux/x86-64 ABI passes the first 6 integral parameters and the
+// first 8 floating point parameters in registers (rdi, rsi, rdx, rcx,
+// r8, r9 and xmm0-xmm7), no stack space is allocated for these by the
+// caller.  The rest of the parameters are passed in the callers stack
+// area.
+
+const PRUint32 PARAM_BUFFER_COUNT   = 16;
+const PRUint32 GPR_COUNT            = 6;
+const PRUint32 FPR_COUNT            = 8;
+
+// PrepareAndDispatch() is called by SharedStub() and calls the actual method.
+//
+// - 'args[]' contains the arguments passed on stack
+// - 'gpregs[]' contains the arguments passed in integer registers
+// - 'fpregs[]' contains the arguments passed in floating point registers
+// 
+// The parameters are mapped into an array of type 'nsXPTCMiniVariant'
+// and then the method gets called.
+
+extern "C" nsresult
+PrepareAndDispatch(nsXPTCStubBase * self, PRUint32 methodIndex,
+                   PRUint64 * args, PRUint64 * gpregs, double *fpregs)
+{
+    nsXPTCMiniVariant paramBuffer[PARAM_BUFFER_COUNT];
+    nsXPTCMiniVariant* dispatchParams = NULL;
+    nsIInterfaceInfo* iface_info = NULL;
+    const nsXPTMethodInfo* info;
+    PRUint32 paramCount;
+    PRUint32 i;
+    nsresult result = NS_ERROR_FAILURE;
+
+    NS_ASSERTION(self,"no self");
+
+    self->GetInterfaceInfo(&iface_info);
+    NS_ASSERTION(iface_info,"no interface info");
+    if (! iface_info)
+        return NS_ERROR_UNEXPECTED;
+
+    iface_info->GetMethodInfo(PRUint16(methodIndex), &info);
+    NS_ASSERTION(info,"no method info");
+    if (! info)
+        return NS_ERROR_UNEXPECTED;
+
+    paramCount = info->GetParamCount();
+
+    // setup variant array pointer
+    if(paramCount > PARAM_BUFFER_COUNT)
+        dispatchParams = new nsXPTCMiniVariant[paramCount];
+    else
+        dispatchParams = paramBuffer;
+
+    NS_ASSERTION(dispatchParams,"no place for params");
+    if (! dispatchParams)
+        return NS_ERROR_OUT_OF_MEMORY;
+
+
+    PRUint64* ap = args;
+    PRUint32 nr_gpr = 1;    // skip one GPR register for 'that'
+    PRUint32 nr_fpr = 0;
+    PRUint64 value;
+
+    for(i = 0; i < paramCount; i++) {
+        const nsXPTParamInfo& param = info->GetParam(i);
+        const nsXPTType& type = param.GetType();
+        nsXPTCMiniVariant* dp = &dispatchParams[i];
+       
+        if (!param.IsOut() && type == nsXPTType::T_DOUBLE) {
+            if (nr_fpr < FPR_COUNT)
+                dp->val.d = fpregs[nr_fpr++];
+            else
+                dp->val.d = *(double*) ap++;
+            continue;
+        }
+        else if (!param.IsOut() && type == nsXPTType::T_FLOAT) {
+            if (nr_fpr < FPR_COUNT)
+                // The value in %xmm register is already prepared to
+                // be retrieved as a float. Therefore, we pass the
+                // value verbatim, as a double without conversion.
+                dp->val.d = *(double*) ap++;
+            else
+                dp->val.f = *(float*) ap++;
+            continue;
+        }
+        else {
+            if (nr_gpr < GPR_COUNT)
+                value = gpregs[nr_gpr++];
+            else
+                value = *ap++;
+        }
+
+        if (param.IsOut() || !type.IsArithmetic()) {
+            dp->val.p = (void*) value;
+            continue;
+        }
+
+        switch (type) {
+        case nsXPTType::T_I8:      dp->val.i8  = (PRInt8)   value; break;
+        case nsXPTType::T_I16:     dp->val.i16 = (PRInt16)  value; break;
+        case nsXPTType::T_I32:     dp->val.i32 = (PRInt32)  value; break;
+        case nsXPTType::T_I64:     dp->val.i64 = (PRInt64)  value; break;
+        case nsXPTType::T_U8:      dp->val.u8  = (PRUint8)  value; break;
+        case nsXPTType::T_U16:     dp->val.u16 = (PRUint16) value; break;
+        case nsXPTType::T_U32:     dp->val.u32 = (PRUint32) value; break;
+        case nsXPTType::T_U64:     dp->val.u64 = (PRUint64) value; break;
+        case nsXPTType::T_BOOL:    dp->val.b   = (PRBool)   value; break;
+        case nsXPTType::T_CHAR:    dp->val.c   = (char)     value; break;
+        case nsXPTType::T_WCHAR:   dp->val.wc  = (wchar_t)  value; break;
+
+        default:
+            NS_ASSERTION(0, "bad type");
+            break;
+        }
+    }
+
+    result = self->CallMethod((PRUint16) methodIndex, info, dispatchParams);
+
+    NS_RELEASE(iface_info);
+
+    if (dispatchParams != paramBuffer)
+        delete [] dispatchParams;
+
+    return result;
+}
+
+#if defined(__GXX_ABI_VERSION) && __GXX_ABI_VERSION >= 100 /* G++ V3 ABI */
+// Linux/x86-64 uses gcc >= 3.1
+#define STUB_ENTRY(n) \
+asm(".section  \".text\"\n\t" \
+    ".align    2\n\t" \
+    ".if       " #n " < 10\n\t" \
+    ".globl    _ZN14nsXPTCStubBase5Stub" #n "Ev\n\t" \
+    ".type     _ZN14nsXPTCStubBase5Stub" #n "Ev,@function\n" \
+    "_ZN14nsXPTCStubBase5Stub" #n "Ev:\n\t" \
+    ".elseif   " #n " < 100\n\t" \
+    ".globl    _ZN14nsXPTCStubBase6Stub" #n "Ev\n\t" \
+    ".type     _ZN14nsXPTCStubBase6Stub" #n "Ev,@function\n" \
+    "_ZN14nsXPTCStubBase6Stub" #n "Ev:\n\t" \
+    ".elseif    " #n " < 1000\n\t" \
+    ".globl     _ZN14nsXPTCStubBase7Stub" #n "Ev\n\t" \
+    ".type      _ZN14nsXPTCStubBase7Stub" #n "Ev,@function\n" \
+    "_ZN14nsXPTCStubBase7Stub" #n "Ev:\n\t" \
+    ".else\n\t" \
+    ".err      \"stub number " #n " >= 1000 not yet supported\"\n\t" \
+    ".endif\n\t" \
+    "movl      $" #n ", %eax\n\t" \
+    "jmp       SharedStub\n\t" \
+    ".if       " #n " < 10\n\t" \
+    ".size     _ZN14nsXPTCStubBase5Stub" #n "Ev,.-_ZN14nsXPTCStubBase5Stub" #n 
"Ev\n\t" \
+    ".elseif   " #n " < 100\n\t" \
+    ".size     _ZN14nsXPTCStubBase6Stub" #n "Ev,.-_ZN14nsXPTCStubBase6Stub" #n 
"Ev\n\t" \
+    ".else\n\t" \
+    ".size     _ZN14nsXPTCStubBase7Stub" #n "Ev,.-_ZN14nsXPTCStubBase7Stub" #n 
"Ev\n\t" \
+    ".endif");
+
+// static nsresult SharedStub(PRUint32 methodIndex)
+asm(".section   \".text\"\n\t"
+    ".align     2\n\t"
+    ".type      SharedStub,@function\n\t"
+    "SharedStub:\n\t"
+    // make room for gpregs (48), fpregs (64)
+    "pushq      %rbp\n\t"
+    "movq       %rsp,%rbp\n\t"
+    "subq       $112,%rsp\n\t"
+    // save GP registers
+    "movq       %rdi,-112(%rbp)\n\t"
+    "movq       %rsi,-104(%rbp)\n\t"
+    "movq       %rdx, -96(%rbp)\n\t"
+    "movq       %rcx, -88(%rbp)\n\t"
+    "movq       %r8 , -80(%rbp)\n\t"
+    "movq       %r9 , -72(%rbp)\n\t"
+    "leaq       -112(%rbp),%rcx\n\t"
+    // save FP registers
+    "movsd      %xmm0,-64(%rbp)\n\t"
+    "movsd      %xmm1,-56(%rbp)\n\t"
+    "movsd      %xmm2,-48(%rbp)\n\t"
+    "movsd      %xmm3,-40(%rbp)\n\t"
+    "movsd      %xmm4,-32(%rbp)\n\t"
+    "movsd      %xmm5,-24(%rbp)\n\t"
+    "movsd      %xmm6,-16(%rbp)\n\t"
+    "movsd      %xmm7, -8(%rbp)\n\t"
+    "leaq       -64(%rbp),%r8\n\t"
+    // rdi has the 'self' pointer already
+    "movl       %eax,%esi\n\t"
+    "leaq       16(%rbp),%rdx\n\t"
+    "call       PrepareAndDispatch\n\t"
+    "leave\n\t"
+    "ret\n\t"
+    ".size      SharedStub,.-SharedStub");
+
+#define SENTINEL_ENTRY(n) \
+nsresult nsXPTCStubBase::Sentinel##n() \
+{ \
+    NS_ASSERTION(0,"nsXPTCStubBase::Sentinel called"); \
+    return NS_ERROR_NOT_IMPLEMENTED; \
+}
+
+#include "xptcstubsdef.inc"
+
+#else
+#error "can't find a compiler to use"
+#endif /* __GNUC__ */

-----------------------------------------------------------------------

cat patch-cc

--- nsprpub/pr/src/io/prprf.c.orig      2003-02-27 00:53:42.000000000 +0100
+++ nsprpub/pr/src/io/prprf.c   2004-05-26 22:43:12.000000000 +0200
@@ -616,8 +616,9 @@
            cn++;
            continue;
        }
-
+#ifndef __x86_64__
        VARARGS_ASSIGN(nas[cn].ap, ap);
+#endif 
 
        switch( nas[cn].type ){
        case TYPE_INT16:

------------------------------------------------------------------------
 cat patch-cd

--- directory/c-sdk/ldap/libraries/liblber/lber-int.h.orig      2004-05-27 18:00:30.000000000 +0200
+++ directory/c-sdk/ldap/libraries/liblber/lber-int.h   2004-05-27 18:08:07.000000000 +0200
@@ -236,12 +236,13 @@
             (((_l)&0xff0000)>>8) + (((_l)&0xff000000)>>24))
 #define LBER_NTOHL(_l) LBER_HTONL(_l)
 
-#elif !defined(__alpha) || defined(VMS)
+#elif (!defined(__alpha) || defined(VMS)) && !defined(__x86_64__)
 
 #define LBER_HTONL( l )        htonl( l )
 #define LBER_NTOHL( l )        ntohl( l )
 
-#else /* __alpha */
+#else /* __alpha || __x86_64__  */
+
 /*
  * htonl and ntohl on the DEC Alpha under OSF 1 seem to only swap the
  * lower-order 32-bits of a (64-bit) long, so we define correct versions
@@ -252,8 +253,7 @@
 
 #define LBER_NTOHL( l )        (((long)ntohl( (l) & 0x00000000FFFFFFFF )) << 32 \
                        | ntohl( ( (l) & 0xFFFFFFFF00000000 ) >> 32 ))
-#endif /* __alpha */
-
+#endif /* __alpha || __x86_64__  */
 
 /* function prototypes */
 #ifdef LDAP_DEBUG

-----------------------------------------------------------------------

After putting these (four new, three changed ) patches the "firefox"
runs without any problem until you run into some "html" documents with
bugs, then it it will crash ..
But I think this should a next step to solve. Maybe someone else has some knowledge about this!?  

Most of the patches are based on "Bugzilla bug 236599" 
The patches in this report are made for OpenBSD and they are based on
patches for Linux. I would find it very likely that the setting for NetBSD are a subject for improvment ...

Best Regards /Ole
 
>Release-Note:
>Audit-Trail:
>Unformatted: