Module Name: src Committed By: bouyer Date: Sat Mar 17 18:46:30 UTC 2012
Modified Files: src/doc [netbsd-5-1]: HACKS src/sys/arch/sparc64/conf [netbsd-5-1]: Makefile.sparc64 files.sparc64 src/sys/arch/sparc64/sparc64 [netbsd-5-1]: locore.s Log Message: Pull up following revision(s) (requested by nakayama in ticket #1736): sys/arch/sparc64/conf/Makefile.sparc64: revision 1.71 doc/HACKS: revision 1.123 sys/arch/sparc64/conf/files.sparc64: revision 1.138 sys/arch/sparc64/sparc64/locore.s: revision 1.340 Fix the root cause of the hack "disable optimizations for uvm_bio.c on 32 bit kernels". gcc converts a division in the calculation of UBC_UMAP_ADDR macro to multiplication (smul or combination of add/sll), and the register of its result contains a garbage in upper 32 bits (the upper 32 bits of smul/add/sll's result isn't zero cleared). Then it passes to pseg_get{,_real} through pmap_extract without the zero clear of upper 32 bits in the optimization case. So the result of pseg_get and pmap_extact sometimes gets screwed up. The hack has been resolved in the revision 1.340 of sys/arch/sparc64/sparc64/locore.s. To generate a diff of this commit: cvs rdiff -u -r1.110.2.2 -r1.110.2.2.6.1 src/doc/HACKS cvs rdiff -u -r1.67.4.1 -r1.67.4.1.2.1 \ src/sys/arch/sparc64/conf/Makefile.sparc64 cvs rdiff -u -r1.118.20.1 -r1.118.20.1.2.1 \ src/sys/arch/sparc64/conf/files.sparc64 cvs rdiff -u -r1.286.2.2 -r1.286.2.2.2.1 \ src/sys/arch/sparc64/sparc64/locore.s Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/doc/HACKS diff -u src/doc/HACKS:1.110.2.2 src/doc/HACKS:1.110.2.2.6.1 --- src/doc/HACKS:1.110.2.2 Sat Dec 6 21:27:36 2008 +++ src/doc/HACKS Sat Mar 17 18:46:29 2012 @@ -1,4 +1,4 @@ -# $NetBSD: HACKS,v 1.110.2.2 2008/12/06 21:27:36 snj Exp $ +# $NetBSD: HACKS,v 1.110.2.2.6.1 2012/03/17 18:46:29 bouyer Exp $ # # This file is intended to document workarounds for currently unsolved # (mostly) compiler bugs. @@ -542,18 +542,6 @@ port m68000 kcah -port sparc64 - - hack disable optimzations for uvm_bio.c on 32 bit kernels - cdate Sun Mar 21 14:14:04 MET 2004 - who martin - file sys/arch/sparc64/conf/Makefile.sparc64 : 1.53-1.54 - file sys/arch/sparc64/conf/files.sparc64 : 1.93 - descr - The sparc compiler miscompiles uvm_bio.c when using - any optimization. This results in ubc_release panics. - kcah - port mips hack mips-shared-linker-load-address Index: src/sys/arch/sparc64/conf/Makefile.sparc64 diff -u src/sys/arch/sparc64/conf/Makefile.sparc64:1.67.4.1 src/sys/arch/sparc64/conf/Makefile.sparc64:1.67.4.1.2.1 --- src/sys/arch/sparc64/conf/Makefile.sparc64:1.67.4.1 Fri Aug 7 18:33:48 2009 +++ src/sys/arch/sparc64/conf/Makefile.sparc64 Sat Mar 17 18:46:29 2012 @@ -1,4 +1,4 @@ -# $NetBSD: Makefile.sparc64,v 1.67.4.1 2009/08/07 18:33:48 snj Exp $ +# $NetBSD: Makefile.sparc64,v 1.67.4.1.2.1 2012/03/17 18:46:29 bouyer Exp $ #========================================================================= # @@ -57,7 +57,6 @@ CPPFLAGS+= -Dsparc64 -D__sparc64__ # 64-bit kernels CPPFLAGS+= -D_LP64 -Wa,-Av9a AFLAGS+= -Wa,-Av9a -CC_NOOPT= ${NORMAL_C} .if defined(PROF) # Profiling is only supported in the medium low memory model. CFLAGS+= -mcmodel=medlow @@ -69,10 +68,6 @@ CFLAGS+= -mcmodel=medlow # 32-bit kernels CPPFLAGS+= -m32 -Wa,-Av8plusa -mcpu=ultrasparc AFLAGS+= -Wa,-Av8plusa -# XXX -# The sparc gcc version 3.3.3 (NetBSD nb1 20040301) does not compile this -# file properly with higher optimizations -CC_NOOPT= ${NORMAL_C:C/-O./-O0/} .endif CFLAGS+= -mno-fpu AFLAGS+= -x assembler-with-cpp -traditional-cpp Index: src/sys/arch/sparc64/conf/files.sparc64 diff -u src/sys/arch/sparc64/conf/files.sparc64:1.118.20.1 src/sys/arch/sparc64/conf/files.sparc64:1.118.20.1.2.1 --- src/sys/arch/sparc64/conf/files.sparc64:1.118.20.1 Fri Oct 16 11:56:10 2009 +++ src/sys/arch/sparc64/conf/files.sparc64 Sat Mar 17 18:46:29 2012 @@ -1,4 +1,4 @@ -# $NetBSD: files.sparc64,v 1.118.20.1 2009/10/16 11:56:10 sborrill Exp $ +# $NetBSD: files.sparc64,v 1.118.20.1.2.1 2012/03/17 18:46:29 bouyer Exp $ # @(#)files.sparc64 8.1 (Berkeley) 7/19/93 # sparc64-specific configuration info @@ -251,8 +251,5 @@ file dev/md_root.c memory_disk_hooks include "arch/sparc64/conf/majors.sparc64" -# special compiler settings (no optimization if 32bit kernel) -file uvm/uvm_bio.c compile-with "${CC_NOOPT}" - # OpenFirmware convenience stuff file dev/ofw/ofw_subr.c Index: src/sys/arch/sparc64/sparc64/locore.s diff -u src/sys/arch/sparc64/sparc64/locore.s:1.286.2.2 src/sys/arch/sparc64/sparc64/locore.s:1.286.2.2.2.1 --- src/sys/arch/sparc64/sparc64/locore.s:1.286.2.2 Wed Mar 17 03:10:39 2010 +++ src/sys/arch/sparc64/sparc64/locore.s Sat Mar 17 18:46:29 2012 @@ -1,4 +1,4 @@ -/* $NetBSD: locore.s,v 1.286.2.2 2010/03/17 03:10:39 snj Exp $ */ +/* $NetBSD: locore.s,v 1.286.2.2.2.1 2012/03/17 18:46:29 bouyer Exp $ */ /* * Copyright (c) 1996-2002 Eduardo Horvath @@ -7274,6 +7274,9 @@ ENTRY(pmap_copy_page_phys) */ ENTRY(pseg_get) ! flushw ! Make sure we don't have stack probs & lose hibits of %o +#ifndef _LP64 + clruw %o1 ! Zero extend +#endif ldx [%o0 + PM_PHYS], %o2 ! pmap->pm_segs srax %o1, HOLESHIFT, %o3 ! Check for valid address