[LWN Logo]

Date: Sat, 17 Oct 1998 06:58:02 -0700
From: "David S. Miller" <davem@dm.cobaltmicro.com>
To: sparc-list@redhat.com
Subject: Re: Netscape 4.5 for S/Linux released

   Date: Sat, 17 Oct 1998 08:38:27 -0500 (CDT)
   From: "J. Scott Kasten" <skasten@mtsinet.com>

   The discussion about building Debian binaries and such will be moot
   in a couple days anyway.  I'm getting with friends this weekend to
   package and test install the Netscape 5.0a1 (mozilla) RH 5.1 built
   binaries and OS patches.

Let me save you some time:

1) It won't work without the sparc __longjmp.S glibc fix, and for the
   same reason that the sparc netscape-4.05 aborts.

2) It won't work if linked against Lesstif on Sparc, you will need to
   use real Motif libraries or fix the bugs on Sparc in Lesstif.

I hope this helps, Jakub and myself went this route a few times in the
last few months.

For everyone's benefit, here is the glibc fix you will need, this has
been in UltraPenguin for a few months now and also will allow
netscape-4.05 to work:

--- glibc-2.0.7/sysdeps/sparc/sparc32/__longjmp.S.jj	Mon May  4 14:51:43 1998
+++ glibc-2.0.7/sysdeps/sparc/sparc32/__longjmp.S	Wed Aug 12 15:20:48 1998
@@ -1,4 +1,4 @@
-/* Copyright (C) 1991, 1993, 1996, 1997 Free Software Foundation, Inc.
+/* Copyright (C) 1991, 1993, 1996, 1997, 1998 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
 
    The GNU C Library is free software; you can redistribute it and/or
@@ -20,18 +20,26 @@
 
 #define _ASM 1
 #include <jmp_buf.h>
-#define ENV(reg) [%g1 + (reg * 4)]
+#define ENV(base,reg) [%base + (reg * 4)]
+#define ST_FLUSH_WINDOWS 3
+#define RW_FP [%fp + 0x38]
 
 ENTRY(__longjmp)
 	/* Store our arguments in global registers so we can still
 	   use them while unwinding frames and their register windows.  */
+
+	ld ENV(o0,JB_FP), %g3	/* Cache target FP in register %g3.  */
 	mov %o0, %g1		/* ENV in %g1 */
      	orcc %o1, %g0, %g2	/* VAL in %g2 */
      	be,a 0f			/* Branch if zero; else skip delay slot.  */
 	 mov 1, %g2		/* Delay slot only hit if zero: VAL = 1.  */
 0:
-	/* Cache target FP in register %g3.  */
-	ld ENV(JB_FP), %g3
+	xor %fp, %g3, %o0
+	add %fp, 512, %o1
+	andncc %o0, 4095, %o0
+	bne LOC(thread)
+	 cmp %o1, %g3
+	bl LOC(thread)
 
 	/* Now we will loop, unwinding the register windows up the stack
 	   until the restored %fp value matches the target value in %g3.  */
@@ -41,23 +49,39 @@ LOC(loop):
 	bl,a LOC(loop)		/* Loop while current fp is below target.  */
 	 restore		/* Unwind register window in delay slot.  */
 	be,a LOC(found)		/* Better have hit it exactly.  */
-	 ld ENV(JB_SP), %o0	/* Delay slot: extract target SP.  */
+	 ld ENV(g1,JB_SP), %o0	/* Delay slot: extract target SP.  */
 
-LOC(bogus):
-	/* Get here only if the jmp_buf or stack is clobbered.  */
-	call C_SYMBOL_NAME(abort)
-	 nop
-	unimp 0
+LOC(thread):
+	/*
+	 * Do a "flush register windows trap".  The trap handler in the
+	 * kernel writes all the register windows to their stack slots, and
+	 * marks them all as invalid (needing to be sucked up from the
+	 * stack when used).  This ensures that all information needed to
+	 * unwind to these callers is in memory, not in the register
+	 * windows.
+	 */
+	ta	ST_FLUSH_WINDOWS
+	ld	ENV(g1,JB_PC), %o7 /* Set return PC. */
+	ld	ENV(g1,JB_SP), %fp /* Set saved SP on restore below. */
+	sub	%fp, 64, %sp	/* Allocate a register frame. */
+	st	%g3, RW_FP	/* Set saved FP on restore below. */
+	retl
+	 restore %g2, 0, %o0    /* Restore values from above register frame. */
 
 LOC(found):
 	/* We have unwound register windows so %fp matches the target.  */
 	cmp %o0, %sp		/* Check jmp_buf SP vs register window.  */
 	bge,a LOC(sp_ok)	/* Saved must not be deeper than register.  */
 	 mov %o0, %sp		/* OK, install new SP.  */
-	b,a LOC(bogus)		/* Bogus, we lose.  */
+
+LOC(bogus):
+	/* Get here only if the jmp_buf or stack is clobbered.  */
+	call C_SYMBOL_NAME(abort)
+	 nop
+	unimp 0
 
 LOC(sp_ok):
-	ld ENV(JB_PC), %o0	/* Extract target return PC.  */
+	ld ENV(g1,JB_PC), %o0	/* Extract target return PC.  */
 	jmp %o0 + 8		/* Return there.  */
 	 mov %g2, %o0		/* Delay slot: set return value.  */
 

-- 
To unsubscribe: mail -s unsubscribe sparc-list-request@redhat.com < /dev/null