diff --git a/openssl.changes b/openssl.changes
index c66ede2..ee8e432 100644
--- a/openssl.changes
+++ b/openssl.changes
@@ -1,3 +1,8 @@
+-------------------------------------------------------------------
+Wed Jun 30 08:47:39 UTC 2010 - jengelh@medozas.de
+
+- fix two compile errors on SPARC
+
 -------------------------------------------------------------------
 Tue Jun 15 09:53:54 UTC 2010 - bg@novell.com
 
diff --git a/openssl.spec b/openssl.spec
index 61bfc5e..a26f8be 100644
--- a/openssl.spec
+++ b/openssl.spec
@@ -32,7 +32,7 @@ Obsoletes:      openssl-64bit
 %endif
 #
 Version:        1.0.0
-Release:        5
+Release:        6
 Summary:        Secure Sockets and Transport Layer Security
 Url:            http://www.openssl.org/
 Source:         http://www.%{name}.org/source/%{name}-%{version}.tar.bz2
@@ -44,6 +44,7 @@ Patch0:         merge_from_0.9.8k.patch
 Patch1:         openssl-1.0.0-c_rehash-compat.diff
 Patch2:         bug610223.patch
 Patch3:         CVE-2010-1633_and_CVE-2010-0742.patch
+Patch4:         patchset-19727.diff
 BuildRoot:      %{_tmppath}/%{name}-%{version}-build
 
 %description
@@ -174,6 +175,7 @@ Authors:
 %patch1 -p1
 %patch2 -p1
 %patch3 -p1
+%patch4 -p1
 cp -p %{S:10} .
 echo "adding/overwriting some entries in the 'table' hash in Configure"
 # $dso_scheme:$shared_target:$shared_cflag:$shared_ldflag:$shared_extension:$ranlib:$arflags
@@ -249,9 +251,9 @@ $RPM_OPT_FLAGS \
 #	LD_LIBRARY_PATH=`pwd` make rehash
 #	LD_LIBRARY_PATH=`pwd` make test
 #%else
+# OpenSSL relies on uname -m (not good). Thus that little sparc line.
 	./config \
 %ifarch sparc64
-# OpenSSL relies on uname -m (not good). Thus this hack.
 		linux64-sparcv9 \
 %endif
 		$config_flags
diff --git a/patchset-19727.diff b/patchset-19727.diff
new file mode 100644
index 0000000..c35578f
--- /dev/null
+++ b/patchset-19727.diff
@@ -0,0 +1,189 @@
+Index: openssl/crypto/sha/asm/sha1-sparcv9.pl
+RCS File: /v/openssl/cvs/openssl/crypto/sha/asm/sha1-sparcv9.pl,v
+rcsdiff -q -kk '-r1.2' '-r1.2.2.1' -u '/v/openssl/cvs/openssl/crypto/sha/asm/sha1-sparcv9.pl,v' 2>/dev/null
+--- sha1-sparcv9.pl	2007/05/10 06:48:28	1.2
++++ sha1-sparcv9.pl	2010/07/01 07:57:20	1.2.2.1
+@@ -276,6 +276,7 @@
+ .type	sha1_block_data_order,#function
+ .size	sha1_block_data_order,(.-sha1_block_data_order)
+ .asciz	"SHA1 block transform for SPARCv9, CRYPTOGAMS by <appro\@openssl.org>"
++.align	4
+ ___
+ 
+ $code =~ s/\`([^\`]*)\`/eval $1/gem;
+Index: openssl/crypto/sha/asm/sha1-sparcv9a.pl
+RCS File: /v/openssl/cvs/openssl/crypto/sha/asm/sha1-sparcv9a.pl,v
+rcsdiff -q -kk '-r1.4' '-r1.4.2.1' -u '/v/openssl/cvs/openssl/crypto/sha/asm/sha1-sparcv9a.pl,v' 2>/dev/null
+--- sha1-sparcv9a.pl	2009/03/17 18:31:08	1.4
++++ sha1-sparcv9a.pl	2010/07/01 07:57:20	1.4.2.1
+@@ -539,6 +539,7 @@
+ .type	sha1_block_data_order,#function
+ .size	sha1_block_data_order,(.-sha1_block_data_order)
+ .asciz	"SHA1 block transform for SPARCv9a, CRYPTOGAMS by <appro\@openssl.org>"
++.align	4
+ ___
+ 
+ # Purpose of these subroutines is to explicitly encode VIS instructions,
+Index: openssl/crypto/sha/asm/sha512-sparcv9.pl
+RCS File: /v/openssl/cvs/openssl/crypto/sha/asm/sha512-sparcv9.pl,v
+rcsdiff -q -kk '-r1.4' '-r1.4.2.1' -u '/v/openssl/cvs/openssl/crypto/sha/asm/sha512-sparcv9.pl,v' 2>/dev/null
+--- sha512-sparcv9.pl	2009/03/17 18:31:08	1.4
++++ sha512-sparcv9.pl	2010/07/01 07:57:20	1.4.2.1
+@@ -586,6 +586,7 @@
+ .type	sha${label}_block_data_order,#function
+ .size	sha${label}_block_data_order,(.-sha${label}_block_data_order)
+ .asciz	"SHA${label} block transform for SPARCv9, CRYPTOGAMS by <appro\@openssl.org>"
++.align	4
+ ___
+ 
+ $code =~ s/\`([^\`]*)\`/eval $1/gem;
+Index: openssl/crypto/sparccpuid.S
+RCS File: /v/openssl/cvs/openssl/crypto/sparccpuid.S,v
+rcsdiff -q -kk '-r1.5.2.2' '-r1.5.2.3' -u '/v/openssl/cvs/openssl/crypto/sparccpuid.S,v' 2>/dev/null
+--- sparccpuid.S	2010/04/10 13:37:06	1.5.2.2
++++ sparccpuid.S	2010/07/01 07:57:19	1.5.2.3
+@@ -225,13 +225,33 @@
+ 	xor	%o0,%o0,%o0
+ 	.word	0x91410000	!rd	%tick,%o0
+ 	retl
+-	.word	0x93323020	!srlx	%o2,32,%o1
++	.word	0x93323020	!srlx	%o0,32,%o1
+ .notick:
+ 	retl
+ 	xor	%o1,%o1,%o1
+ .type	_sparcv9_rdtick,#function
+ .size	_sparcv9_rdtick,.-_sparcv9_rdtick
+ 
++.global	_sparcv9_rdwrasi
++.align	8
++_sparcv9_rdwrasi:
++	.word	0x9340c000	!rd	%asi,%o1
++	.word	0x87820000	!wr	%o0,%g0,%asi
++	retl
++	mov	%o1,%o0
++.type	_sparcv9_rdwrasi,#function
++.size	_sparcv9_rdwrasi,.-_sparcv9_rdwrasi
++
++.global	_sparcv9_vis1_probe
++.align	8
++_sparcv9_vis1_probe:
++	.word	0x81b00c20	!fzeros	%f0
++	.word	0xc19ba002+BIAS	!ldda	[%sp+BIAS+2]%asi,%f0
++	retl
++	nop
++.type	_sparcv9_vis1_probe,#function
++.size	_sparcv9_vis1_probe,.-_sparcv9_vis1_probe
++
+ .global	OPENSSL_cleanse
+ .align	32
+ OPENSSL_cleanse:
+Index: openssl/crypto/sparcv9cap.c
+RCS File: /v/openssl/cvs/openssl/crypto/sparcv9cap.c,v
+rcsdiff -q -kk '-r1.6' '-r1.6.2.1' -u '/v/openssl/cvs/openssl/crypto/sparcv9cap.c,v' 2>/dev/null
+--- sparcv9cap.c	2007/06/20 13:02:34	1.6
++++ sparcv9cap.c	2010/07/01 07:57:19	1.6.2.1
+@@ -1,6 +1,8 @@
+ #include <stdio.h>
+ #include <stdlib.h>
+ #include <string.h>
++#include <setjmp.h>
++#include <signal.h>
+ #include <sys/time.h>
+ #include <openssl/bn.h>
+ 
+@@ -9,6 +11,7 @@
+ #define SPARCV9_VIS1		(1<<2)
+ #define SPARCV9_VIS2		(1<<3)	/* reserved */
+ #define SPARCV9_FMADD		(1<<4)	/* reserved for SPARC64 V */
++
+ static int OPENSSL_sparcv9cap_P=SPARCV9_TICK_PRIVILEGED;
+ 
+ int bn_mul_mont(BN_ULONG *rp, const BN_ULONG *ap, const BN_ULONG *bp, const BN_ULONG *np,const BN_ULONG *n0, int num)
+@@ -23,10 +26,12 @@
+ 		return bn_mul_mont_int(rp,ap,bp,np,n0,num);
+ 	}
+ 
++unsigned long	_sparcv9_rdtick(void);
++unsigned long	_sparcv9_rdwrasi(unsigned long);
++void		_sparcv9_vis1_probe(void);
++
+ unsigned long OPENSSL_rdtsc(void)
+ 	{
+-	unsigned long _sparcv9_rdtick(void);
+-
+ 	if (OPENSSL_sparcv9cap_P&SPARCV9_TICK_PRIVILEGED)
+ #if defined(__sun) && defined(__SVR4)
+ 		return gethrtime();
+@@ -137,9 +142,16 @@
+ 
+ #else
+ 
++static sigjmp_buf common_jmp;
++static void common_handler(int sig) { siglongjmp(common_jmp,sig); }
++
+ void OPENSSL_cpuid_setup(void)
+ 	{
+ 	char *e;
++	struct sigaction	common_act,ill_oact,bus_oact;
++	sigset_t		all_masked,oset;
++	unsigned long		oasi;
++	int			sig;
+  
+ 	if ((e=getenv("OPENSSL_sparcv9cap")))
+ 		{
+@@ -149,6 +161,55 @@
+ 
+ 	/* For now we assume that the rest supports UltraSPARC-I* only */
+ 	OPENSSL_sparcv9cap_P |= SPARCV9_PREFER_FPU|SPARCV9_VIS1;
++
++	sigfillset(&all_masked);
++	sigdelset(&all_masked,SIGILL);
++	sigdelset(&all_masked,SIGTRAP);
++#ifdef SIGEMT
++	sigdelset(&all_masked,SIGEMT);
++#endif
++	sigdelset(&all_masked,SIGFPE);
++	sigdelset(&all_masked,SIGBUS);
++	sigdelset(&all_masked,SIGSEGV);
++	sigprocmask(SIG_SETMASK,&all_masked,&oset);
++
++	memset(&common_act,0,sizeof(common_act));
++	common_act.sa_handler = common_handler;
++	common_act.sa_mask    = all_masked;
++
++	sigaction(SIGILL,&common_act,&ill_oact);
++	sigaction(SIGBUS,&common_act,&bus_oact);/* T1 fails 16-bit ldda */
++	oasi = _sparcv9_rdwrasi(0xD2);		/* ASI_FL16_P */
++	if ((sig=sigsetjmp(common_jmp,0)) == 0)
++		{
++		_sparcv9_vis1_probe();
++		OPENSSL_sparcv9cap_P |= SPARCV9_VIS1;
++		}
++	else if (sig == SIGBUS)			/* T1 fails 16-bit ldda */
++		{
++		OPENSSL_sparcv9cap_P &= ~SPARCV9_PREFER_FPU;
++		}
++	else
++		{
++		OPENSSL_sparcv9cap_P &= ~SPARCV9_VIS1;
++		}
++	_sparcv9_rdwrasi(oasi);
++	sigaction(SIGBUS,&bus_oact,NULL);
++	sigaction(SIGILL,&ill_oact,NULL);
++
++	sigaction(SIGILL,&common_act,&ill_oact);
++	if (sigsetjmp(common_jmp,0) == 0)
++		{
++		_sparcv9_rdtick();
++		OPENSSL_sparcv9cap_P &= ~SPARCV9_TICK_PRIVILEGED;
++		}
++	else
++		{
++		OPENSSL_sparcv9cap_P |= SPARCV9_TICK_PRIVILEGED;
++		}
++	sigaction(SIGILL,&ill_oact,NULL);
++
++	sigprocmask(SIG_SETMASK,&oset,NULL);
+ 	}
+ 
+ #endif