diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2009-08-25 21:24:26 -0700 | 
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2009-08-25 21:24:26 -0700 | 
| commit | 4dc627d55edad85e26ae81f17634bd4590993ba0 (patch) | |
| tree | 678da065a5d77f41ab33819ea970baf994ca50e8 | |
| parent | 9c9376886622b45c32f64c4444f5628dde77dfe6 (diff) | |
| parent | d8ed1d43e17898761c7221014a15a4c7501d2ff3 (diff) | |
Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/sparc-2.6
* git://git.kernel.org/pub/scm/linux/kernel/git/davem/sparc-2.6:
  sparc64: Validate linear D-TLB misses.
  sparc64: Update defconfig.
  sparc32: Update defconfig.
  sparc32: Kill trap table freeing code.
  sparc: sys32.S incorrect compat-layer splice() system call
  sparc: Use page_fault_out_of_memory() for VM_FAULT_OOM.
  sparc64: Sign extend length arg to truncate syscalls when compat.
  sparc: Fix cleanup crash in bbc_envctrl_cleanup()
| -rw-r--r-- | arch/sparc/configs/sparc32_defconfig | 74 | ||||
| -rw-r--r-- | arch/sparc/configs/sparc64_defconfig | 59 | ||||
| -rw-r--r-- | arch/sparc/include/asm/pgtable_64.h | 12 | ||||
| -rw-r--r-- | arch/sparc/kernel/ktlb.S | 42 | ||||
| -rw-r--r-- | arch/sparc/kernel/sun4d_smp.c | 22 | ||||
| -rw-r--r-- | arch/sparc/kernel/sun4m_smp.c | 26 | ||||
| -rw-r--r-- | arch/sparc/kernel/sys32.S | 4 | ||||
| -rw-r--r-- | arch/sparc/kernel/systbls_64.S | 4 | ||||
| -rw-r--r-- | arch/sparc/mm/fault_32.c | 7 | ||||
| -rw-r--r-- | arch/sparc/mm/fault_64.c | 7 | ||||
| -rw-r--r-- | arch/sparc/mm/init_64.c | 43 | ||||
| -rw-r--r-- | arch/sparc/mm/init_64.h | 7 | ||||
| -rw-r--r-- | drivers/sbus/char/bbc_envctrl.c | 11 | 
13 files changed, 175 insertions, 143 deletions
diff --git a/arch/sparc/configs/sparc32_defconfig b/arch/sparc/configs/sparc32_defconfig index 8bcd27af724b..a0f62a808edb 100644 --- a/arch/sparc/configs/sparc32_defconfig +++ b/arch/sparc/configs/sparc32_defconfig @@ -1,7 +1,7 @@  #  # Automatically generated make config: don't edit -# Linux kernel version: 2.6.30-rc2 -# Fri Apr 17 04:04:46 2009 +# Linux kernel version: 2.6.31-rc1 +# Tue Aug 18 23:45:52 2009  #  # CONFIG_64BIT is not set  CONFIG_SPARC=y @@ -17,6 +17,7 @@ CONFIG_GENERIC_ISA_DMA=y  CONFIG_ARCH_NO_VIRT_TO_BUS=y  CONFIG_OF=y  CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config" +CONFIG_CONSTRUCTORS=y  #  # General setup @@ -74,7 +75,6 @@ CONFIG_SYSCTL_SYSCALL=y  CONFIG_KALLSYMS=y  # CONFIG_KALLSYMS_ALL is not set  # CONFIG_KALLSYMS_EXTRA_PASS is not set -# CONFIG_STRIP_ASM_SYMS is not set  CONFIG_HOTPLUG=y  CONFIG_PRINTK=y  CONFIG_BUG=y @@ -87,8 +87,13 @@ CONFIG_TIMERFD=y  CONFIG_EVENTFD=y  CONFIG_SHMEM=y  CONFIG_AIO=y + +# +# Performance Counters +#  CONFIG_VM_EVENT_COUNTERS=y  CONFIG_PCI_QUIRKS=y +# CONFIG_STRIP_ASM_SYMS is not set  CONFIG_COMPAT_BRK=y  CONFIG_SLAB=y  # CONFIG_SLUB is not set @@ -97,6 +102,10 @@ CONFIG_SLAB=y  # CONFIG_MARKERS is not set  CONFIG_HAVE_OPROFILE=y  CONFIG_HAVE_ARCH_TRACEHOOK=y + +# +# GCOV-based kernel profiling +#  # CONFIG_SLOW_WORK is not set  # CONFIG_HAVE_GENERIC_DMA_COHERENT is not set  CONFIG_SLABINFO=y @@ -109,7 +118,7 @@ CONFIG_MODULE_UNLOAD=y  # CONFIG_MODVERSIONS is not set  # CONFIG_MODULE_SRCVERSION_ALL is not set  CONFIG_BLOCK=y -# CONFIG_LBD is not set +CONFIG_LBDAF=y  # CONFIG_BLK_DEV_BSG is not set  # CONFIG_BLK_DEV_INTEGRITY is not set @@ -154,9 +163,9 @@ CONFIG_SPLIT_PTLOCK_CPUS=4  # CONFIG_PHYS_ADDR_T_64BIT is not set  CONFIG_ZONE_DMA_FLAG=1  CONFIG_BOUNCE=y -CONFIG_UNEVICTABLE_LRU=y  CONFIG_HAVE_MLOCK=y  CONFIG_HAVE_MLOCKED_PAGE_BIT=y +CONFIG_DEFAULT_MMAP_MIN_ADDR=4096  CONFIG_SUN_PM=y  # CONFIG_SPARC_LED is not set  CONFIG_SERIAL_CONSOLE=y @@ -264,6 +273,7 @@ CONFIG_IPV6_TUNNEL=m  # CONFIG_ECONET is not set  # CONFIG_WAN_ROUTER is not set  # CONFIG_PHONET is not set +# CONFIG_IEEE802154 is not set  # CONFIG_NET_SCHED is not set  # CONFIG_DCB is not set @@ -281,7 +291,11 @@ CONFIG_WIRELESS=y  CONFIG_WIRELESS_OLD_REGULATORY=y  # CONFIG_WIRELESS_EXT is not set  # CONFIG_LIB80211 is not set -# CONFIG_MAC80211 is not set + +# +# CFG80211 needs to be enabled for MAC80211 +# +CONFIG_MAC80211_DEFAULT_PS_VALUE=0  # CONFIG_WIMAX is not set  # CONFIG_RFKILL is not set  # CONFIG_NET_9P is not set @@ -335,6 +349,7 @@ CONFIG_MISC_DEVICES=y  # EEPROM support  #  # CONFIG_EEPROM_93CX6 is not set +# CONFIG_CB710_CORE is not set  CONFIG_HAVE_IDE=y  # CONFIG_IDE is not set @@ -358,10 +373,6 @@ CONFIG_BLK_DEV_SR=m  # CONFIG_BLK_DEV_SR_VENDOR is not set  CONFIG_CHR_DEV_SG=m  # CONFIG_CHR_DEV_SCH is not set - -# -# Some SCSI devices (e.g. CD jukebox) support multiple LUNs -#  # CONFIG_SCSI_MULTI_LUN is not set  # CONFIG_SCSI_CONSTANTS is not set  # CONFIG_SCSI_LOGGING is not set @@ -379,6 +390,7 @@ CONFIG_SCSI_SPI_ATTRS=y  CONFIG_SCSI_LOWLEVEL=y  # CONFIG_ISCSI_TCP is not set  # CONFIG_SCSI_CXGB3_ISCSI is not set +# CONFIG_SCSI_BNX2_ISCSI is not set  # CONFIG_BLK_DEV_3W_XXXX_RAID is not set  # CONFIG_SCSI_3W_9XXX is not set  # CONFIG_SCSI_ACARD is not set @@ -387,6 +399,7 @@ CONFIG_SCSI_LOWLEVEL=y  # CONFIG_SCSI_AIC7XXX_OLD is not set  # CONFIG_SCSI_AIC79XX is not set  # CONFIG_SCSI_AIC94XX is not set +# CONFIG_SCSI_MVSAS is not set  # CONFIG_SCSI_ARCMSR is not set  # CONFIG_MEGARAID_NEWGEN is not set  # CONFIG_MEGARAID_LEGACY is not set @@ -401,7 +414,6 @@ CONFIG_SCSI_LOWLEVEL=y  # CONFIG_SCSI_IPS is not set  # CONFIG_SCSI_INITIO is not set  # CONFIG_SCSI_INIA100 is not set -# CONFIG_SCSI_MVSAS is not set  # CONFIG_SCSI_STEX is not set  # CONFIG_SCSI_SYM53C8XX_2 is not set  # CONFIG_SCSI_QLOGIC_1280 is not set @@ -426,13 +438,16 @@ CONFIG_SCSI_SUNESP=y  #  # -# Enable only one of the two stacks, unless you know what you are doing +# You can enable one or both FireWire driver stacks. +# + +# +# See the help texts for more information.  #  # CONFIG_FIREWIRE is not set  # CONFIG_IEEE1394 is not set  # CONFIG_I2O is not set  CONFIG_NETDEVICES=y -CONFIG_COMPAT_NET_DEV_OPS=y  CONFIG_DUMMY=m  # CONFIG_BONDING is not set  # CONFIG_MACVLAN is not set @@ -463,6 +478,7 @@ CONFIG_SUNQE=m  # CONFIG_IBM_NEW_EMAC_MAL_COMMON_ERR is not set  # CONFIG_NET_PCI is not set  # CONFIG_B44 is not set +# CONFIG_KS8842 is not set  # CONFIG_ATL2 is not set  CONFIG_NETDEV_1000=y  # CONFIG_ACENIC is not set @@ -482,6 +498,7 @@ CONFIG_NETDEV_1000=y  # CONFIG_VIA_VELOCITY is not set  # CONFIG_TIGON3 is not set  # CONFIG_BNX2 is not set +# CONFIG_CNIC is not set  # CONFIG_QLA3XXX is not set  # CONFIG_ATL1 is not set  # CONFIG_ATL1E is not set @@ -629,6 +646,11 @@ CONFIG_HW_RANDOM=m  CONFIG_DEVPORT=y  # CONFIG_I2C is not set  # CONFIG_SPI is not set + +# +# PPS support +# +# CONFIG_PPS is not set  CONFIG_ARCH_WANT_OPTIONAL_GPIOLIB=y  # CONFIG_GPIOLIB is not set  # CONFIG_W1 is not set @@ -668,22 +690,7 @@ CONFIG_SSB_POSSIBLE=y  # CONFIG_HTC_PASIC3 is not set  # CONFIG_MFD_TMIO is not set  # CONFIG_REGULATOR is not set - -# -# Multimedia devices -# - -# -# Multimedia core support -# -# CONFIG_VIDEO_DEV is not set -# CONFIG_DVB_CORE is not set -# CONFIG_VIDEO_MEDIA is not set - -# -# Multimedia drivers -# -# CONFIG_DAB is not set +# CONFIG_MEDIA_SUPPORT is not set  #  # Graphics support @@ -776,6 +783,10 @@ CONFIG_RTC_DRV_M48T59=y  # CONFIG_DMADEVICES is not set  # CONFIG_AUXDISPLAY is not set  # CONFIG_UIO is not set + +# +# TI VLYNQ +#  # CONFIG_STAGING is not set  # @@ -799,10 +810,12 @@ CONFIG_FS_MBCACHE=y  # CONFIG_REISERFS_FS is not set  # CONFIG_JFS_FS is not set  CONFIG_FS_POSIX_ACL=y -CONFIG_FILE_LOCKING=y  # CONFIG_XFS_FS is not set +# CONFIG_GFS2_FS is not set  # CONFIG_OCFS2_FS is not set  # CONFIG_BTRFS_FS is not set +CONFIG_FILE_LOCKING=y +CONFIG_FSNOTIFY=y  CONFIG_DNOTIFY=y  CONFIG_INOTIFY=y  CONFIG_INOTIFY_USER=y @@ -985,6 +998,7 @@ CONFIG_KGDB=y  CONFIG_KGDB_SERIAL_CONSOLE=y  CONFIG_KGDB_TESTS=y  # CONFIG_KGDB_TESTS_ON_BOOT is not set +# CONFIG_KMEMCHECK is not set  # CONFIG_DEBUG_STACK_USAGE is not set  # CONFIG_STACK_DEBUG is not set diff --git a/arch/sparc/configs/sparc64_defconfig b/arch/sparc/configs/sparc64_defconfig index 0123a4c596ce..fdddf7a6f725 100644 --- a/arch/sparc/configs/sparc64_defconfig +++ b/arch/sparc/configs/sparc64_defconfig @@ -1,7 +1,7 @@  #  # Automatically generated make config: don't edit -# Linux kernel version: 2.6.30 -# Tue Jun 16 04:59:36 2009 +# Linux kernel version: 2.6.31-rc1 +# Tue Aug 18 23:56:02 2009  #  CONFIG_64BIT=y  CONFIG_SPARC=y @@ -26,6 +26,7 @@ CONFIG_ARCH_NO_VIRT_TO_BUS=y  CONFIG_OF=y  CONFIG_ARCH_SUPPORTS_DEBUG_PAGEALLOC=y  CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config" +CONFIG_CONSTRUCTORS=y  #  # General setup @@ -119,6 +120,11 @@ CONFIG_HAVE_KPROBES=y  CONFIG_HAVE_KRETPROBES=y  CONFIG_HAVE_ARCH_TRACEHOOK=y  CONFIG_USE_GENERIC_SMP_HELPERS=y + +# +# GCOV-based kernel profiling +# +# CONFIG_GCOV_KERNEL is not set  # CONFIG_SLOW_WORK is not set  # CONFIG_HAVE_GENERIC_DMA_COHERENT is not set  CONFIG_SLABINFO=y @@ -204,7 +210,6 @@ CONFIG_MIGRATION=y  CONFIG_PHYS_ADDR_T_64BIT=y  CONFIG_ZONE_DMA_FLAG=0  CONFIG_NR_QUICK=1 -CONFIG_UNEVICTABLE_LRU=y  CONFIG_HAVE_MLOCK=y  CONFIG_HAVE_MLOCKED_PAGE_BIT=y  CONFIG_DEFAULT_MMAP_MIN_ADDR=8192 @@ -410,6 +415,7 @@ CONFIG_MISC_DEVICES=y  #  # CONFIG_EEPROM_AT24 is not set  # CONFIG_EEPROM_LEGACY is not set +# CONFIG_EEPROM_MAX6875 is not set  # CONFIG_EEPROM_93CX6 is not set  # CONFIG_CB710_CORE is not set  CONFIG_HAVE_IDE=y @@ -562,6 +568,7 @@ CONFIG_BLK_DEV_DM=m  CONFIG_DM_CRYPT=m  CONFIG_DM_SNAPSHOT=m  CONFIG_DM_MIRROR=m +# CONFIG_DM_LOG_USERSPACE is not set  CONFIG_DM_ZERO=m  # CONFIG_DM_MULTIPATH is not set  # CONFIG_DM_DELAY is not set @@ -573,7 +580,11 @@ CONFIG_DM_ZERO=m  #  # -# Enable only one of the two stacks, unless you know what you are doing +# You can enable one or both FireWire driver stacks. +# + +# +# See the help texts for more information.  #  # CONFIG_FIREWIRE is not set  # CONFIG_IEEE1394 is not set @@ -667,6 +678,7 @@ CONFIG_E1000E=m  # CONFIG_VIA_VELOCITY is not set  CONFIG_TIGON3=m  CONFIG_BNX2=m +# CONFIG_CNIC is not set  # CONFIG_QLA3XXX is not set  # CONFIG_ATL1 is not set  # CONFIG_ATL1E is not set @@ -773,6 +785,7 @@ CONFIG_MOUSE_SERIAL=y  # CONFIG_MOUSE_APPLETOUCH is not set  # CONFIG_MOUSE_BCM5974 is not set  # CONFIG_MOUSE_VSXXXAA is not set +# CONFIG_MOUSE_SYNAPTICS_I2C is not set  # CONFIG_INPUT_JOYSTICK is not set  # CONFIG_INPUT_TABLET is not set  # CONFIG_INPUT_TOUCHSCREEN is not set @@ -870,6 +883,7 @@ CONFIG_I2C_ALGOBIT=y  #  # I2C system bus drivers (mostly embedded / system-on-chip)  # +# CONFIG_I2C_DESIGNWARE is not set  # CONFIG_I2C_OCORES is not set  # CONFIG_I2C_SIMTEC is not set @@ -898,13 +912,17 @@ CONFIG_I2C_ALGOBIT=y  # CONFIG_SENSORS_PCF8574 is not set  # CONFIG_PCF8575 is not set  # CONFIG_SENSORS_PCA9539 is not set -# CONFIG_SENSORS_MAX6875 is not set  # CONFIG_SENSORS_TSL2550 is not set  # CONFIG_I2C_DEBUG_CORE is not set  # CONFIG_I2C_DEBUG_ALGO is not set  # CONFIG_I2C_DEBUG_BUS is not set  # CONFIG_I2C_DEBUG_CHIP is not set  # CONFIG_SPI is not set + +# +# PPS support +# +# CONFIG_PPS is not set  CONFIG_ARCH_WANT_OPTIONAL_GPIOLIB=y  # CONFIG_GPIOLIB is not set  # CONFIG_W1 is not set @@ -959,6 +977,7 @@ CONFIG_HWMON=y  # CONFIG_SENSORS_SMSC47B397 is not set  # CONFIG_SENSORS_ADS7828 is not set  # CONFIG_SENSORS_THMC50 is not set +# CONFIG_SENSORS_TMP401 is not set  # CONFIG_SENSORS_VIA686A is not set  # CONFIG_SENSORS_VT1211 is not set  # CONFIG_SENSORS_VT8231 is not set @@ -994,23 +1013,9 @@ CONFIG_SSB_POSSIBLE=y  # CONFIG_MFD_WM8400 is not set  # CONFIG_MFD_WM8350_I2C is not set  # CONFIG_MFD_PCF50633 is not set +# CONFIG_AB3100_CORE is not set  # CONFIG_REGULATOR is not set - -# -# Multimedia devices -# - -# -# Multimedia core support -# -# CONFIG_VIDEO_DEV is not set -# CONFIG_DVB_CORE is not set -# CONFIG_VIDEO_MEDIA is not set - -# -# Multimedia drivers -# -# CONFIG_DAB is not set +# CONFIG_MEDIA_SUPPORT is not set  #  # Graphics support @@ -1284,7 +1289,6 @@ CONFIG_USB=y  #  # Miscellaneous USB options  # -CONFIG_USB_DEVICEFS=y  # CONFIG_USB_DEVICE_CLASS is not set  # CONFIG_USB_DYNAMIC_MINORS is not set  # CONFIG_USB_OTG is not set @@ -1296,6 +1300,7 @@ CONFIG_USB_DEVICEFS=y  # USB Host Controller Drivers  #  # CONFIG_USB_C67X00_HCD is not set +# CONFIG_USB_XHCI_HCD is not set  CONFIG_USB_EHCI_HCD=m  # CONFIG_USB_EHCI_ROOT_HUB_TT is not set  # CONFIG_USB_EHCI_TT_NEWSCHED is not set @@ -1374,7 +1379,6 @@ CONFIG_USB_STORAGE=m  # CONFIG_USB_LD is not set  # CONFIG_USB_TRANCEVIBRATOR is not set  # CONFIG_USB_IOWARRIOR is not set -# CONFIG_USB_TEST is not set  # CONFIG_USB_ISIGHTFW is not set  # CONFIG_USB_VST is not set  # CONFIG_USB_GADGET is not set @@ -1420,6 +1424,7 @@ CONFIG_RTC_INTF_DEV=y  # CONFIG_RTC_DRV_S35390A is not set  # CONFIG_RTC_DRV_FM3130 is not set  # CONFIG_RTC_DRV_RX8581 is not set +# CONFIG_RTC_DRV_RX8025 is not set  #  # SPI RTC drivers @@ -1448,6 +1453,10 @@ CONFIG_RTC_DRV_STARFIRE=y  # CONFIG_DMADEVICES is not set  # CONFIG_AUXDISPLAY is not set  # CONFIG_UIO is not set + +# +# TI VLYNQ +#  # CONFIG_STAGING is not set  # @@ -1480,11 +1489,11 @@ CONFIG_FS_MBCACHE=y  # CONFIG_REISERFS_FS is not set  # CONFIG_JFS_FS is not set  CONFIG_FS_POSIX_ACL=y -CONFIG_FILE_LOCKING=y  # CONFIG_XFS_FS is not set  # CONFIG_GFS2_FS is not set  # CONFIG_OCFS2_FS is not set  # CONFIG_BTRFS_FS is not set +CONFIG_FILE_LOCKING=y  CONFIG_FSNOTIFY=y  CONFIG_DNOTIFY=y  CONFIG_INOTIFY=y @@ -1560,7 +1569,7 @@ CONFIG_NETWORK_FILESYSTEMS=y  # CONFIG_PARTITION_ADVANCED is not set  CONFIG_MSDOS_PARTITION=y  CONFIG_SUN_PARTITION=y -CONFIG_NLS=m +CONFIG_NLS=y  CONFIG_NLS_DEFAULT="iso8859-1"  # CONFIG_NLS_CODEPAGE_437 is not set  # CONFIG_NLS_CODEPAGE_737 is not set diff --git a/arch/sparc/include/asm/pgtable_64.h b/arch/sparc/include/asm/pgtable_64.h index b049abf9902f..0ff92fa22064 100644 --- a/arch/sparc/include/asm/pgtable_64.h +++ b/arch/sparc/include/asm/pgtable_64.h @@ -726,11 +726,17 @@ extern unsigned long pte_file(pte_t);  extern pte_t pgoff_to_pte(unsigned long);  #define PTE_FILE_MAX_BITS	(64UL - PAGE_SHIFT - 1UL) -extern unsigned long *sparc64_valid_addr_bitmap; +extern unsigned long sparc64_valid_addr_bitmap[];  /* Needs to be defined here and not in linux/mm.h, as it is arch dependent */ -#define kern_addr_valid(addr)	\ -	(test_bit(__pa((unsigned long)(addr))>>22, sparc64_valid_addr_bitmap)) +static inline bool kern_addr_valid(unsigned long addr) +{ +	unsigned long paddr = __pa(addr); + +	if ((paddr >> 41UL) != 0UL) +		return false; +	return test_bit(paddr >> 22, sparc64_valid_addr_bitmap); +}  extern int page_in_phys_avail(unsigned long paddr); diff --git a/arch/sparc/kernel/ktlb.S b/arch/sparc/kernel/ktlb.S index cef8defcd7a9..3ea6e8cde8c5 100644 --- a/arch/sparc/kernel/ktlb.S +++ b/arch/sparc/kernel/ktlb.S @@ -151,12 +151,46 @@ kvmap_dtlb_4v:  	 * Must preserve %g1 and %g6 (TAG).  	 */  kvmap_dtlb_tsb4m_miss: -	sethi		%hi(kpte_linear_bitmap), %g2 -	or		%g2, %lo(kpte_linear_bitmap), %g2 +	/* Clear the PAGE_OFFSET top virtual bits, shift +	 * down to get PFN, and make sure PFN is in range. +	 */ +	sllx		%g4, 21, %g5 -	/* Clear the PAGE_OFFSET top virtual bits, then shift -	 * down to get a 256MB physical address index. +	/* Check to see if we know about valid memory at the 4MB +	 * chunk this physical address will reside within.  	 */ +	srlx		%g5, 21 + 41, %g2 +	brnz,pn		%g2, kvmap_dtlb_longpath +	 nop + +	/* This unconditional branch and delay-slot nop gets patched +	 * by the sethi sequence once the bitmap is properly setup. +	 */ +	.globl		valid_addr_bitmap_insn +valid_addr_bitmap_insn: +	ba,pt		%xcc, 2f +	 nop +	.subsection	2 +	.globl		valid_addr_bitmap_patch +valid_addr_bitmap_patch: +	sethi		%hi(sparc64_valid_addr_bitmap), %g7 +	or		%g7, %lo(sparc64_valid_addr_bitmap), %g7 +	.previous + +	srlx		%g5, 21 + 22, %g2 +	srlx		%g2, 6, %g5 +	and		%g2, 63, %g2 +	sllx		%g5, 3, %g5 +	ldx		[%g7 + %g5], %g5 +	mov		1, %g7 +	sllx		%g7, %g2, %g7 +	andcc		%g5, %g7, %g0 +	be,pn		%xcc, kvmap_dtlb_longpath + +2:	 sethi		%hi(kpte_linear_bitmap), %g2 +	or		%g2, %lo(kpte_linear_bitmap), %g2 + +	/* Get the 256MB physical address index. */  	sllx		%g4, 21, %g5  	mov		1, %g7  	srlx		%g5, 21 + 28, %g5 diff --git a/arch/sparc/kernel/sun4d_smp.c b/arch/sparc/kernel/sun4d_smp.c index 54fb02468f0d..68791cad7b74 100644 --- a/arch/sparc/kernel/sun4d_smp.c +++ b/arch/sparc/kernel/sun4d_smp.c @@ -162,9 +162,6 @@ extern void cpu_panic(void);   */  extern struct linux_prom_registers smp_penguin_ctable; -extern unsigned long trapbase_cpu1[]; -extern unsigned long trapbase_cpu2[]; -extern unsigned long trapbase_cpu3[];  void __init smp4d_boot_cpus(void)  { @@ -235,25 +232,6 @@ void __init smp4d_smp_done(void)  	*prev = first;  	local_flush_cache_all(); -	/* Free unneeded trap tables */ -	ClearPageReserved(virt_to_page(trapbase_cpu1)); -	init_page_count(virt_to_page(trapbase_cpu1)); -	free_page((unsigned long)trapbase_cpu1); -	totalram_pages++; -	num_physpages++; - -	ClearPageReserved(virt_to_page(trapbase_cpu2)); -	init_page_count(virt_to_page(trapbase_cpu2)); -	free_page((unsigned long)trapbase_cpu2); -	totalram_pages++; -	num_physpages++; - -	ClearPageReserved(virt_to_page(trapbase_cpu3)); -	init_page_count(virt_to_page(trapbase_cpu3)); -	free_page((unsigned long)trapbase_cpu3); -	totalram_pages++; -	num_physpages++; -  	/* Ok, they are spinning and ready to go. */  	smp_processors_ready = 1;  	sun4d_distribute_irqs(); diff --git a/arch/sparc/kernel/sun4m_smp.c b/arch/sparc/kernel/sun4m_smp.c index 960b113d0006..762d6eedd944 100644 --- a/arch/sparc/kernel/sun4m_smp.c +++ b/arch/sparc/kernel/sun4m_smp.c @@ -121,9 +121,6 @@ void __cpuinit smp4m_callin(void)   */  extern struct linux_prom_registers smp_penguin_ctable; -extern unsigned long trapbase_cpu1[]; -extern unsigned long trapbase_cpu2[]; -extern unsigned long trapbase_cpu3[];  void __init smp4m_boot_cpus(void)  { @@ -193,29 +190,6 @@ void __init smp4m_smp_done(void)  	*prev = first;  	local_flush_cache_all(); -	/* Free unneeded trap tables */ -	if (!cpu_isset(1, cpu_present_map)) { -		ClearPageReserved(virt_to_page(trapbase_cpu1)); -		init_page_count(virt_to_page(trapbase_cpu1)); -		free_page((unsigned long)trapbase_cpu1); -		totalram_pages++; -		num_physpages++; -	} -	if (!cpu_isset(2, cpu_present_map)) { -		ClearPageReserved(virt_to_page(trapbase_cpu2)); -		init_page_count(virt_to_page(trapbase_cpu2)); -		free_page((unsigned long)trapbase_cpu2); -		totalram_pages++; -		num_physpages++; -	} -	if (!cpu_isset(3, cpu_present_map)) { -		ClearPageReserved(virt_to_page(trapbase_cpu3)); -		init_page_count(virt_to_page(trapbase_cpu3)); -		free_page((unsigned long)trapbase_cpu3); -		totalram_pages++; -		num_physpages++; -	} -  	/* Ok, they are spinning and ready to go. */  } diff --git a/arch/sparc/kernel/sys32.S b/arch/sparc/kernel/sys32.S index f061c4dda9ef..aed94869ad6a 100644 --- a/arch/sparc/kernel/sys32.S +++ b/arch/sparc/kernel/sys32.S @@ -134,10 +134,12 @@ SIGN1(sys32_getpeername, sys_getpeername, %o0)  SIGN1(sys32_getsockname, sys_getsockname, %o0)  SIGN2(sys32_ioprio_get, sys_ioprio_get, %o0, %o1)  SIGN3(sys32_ioprio_set, sys_ioprio_set, %o0, %o1, %o2) -SIGN2(sys32_splice, sys_splice, %o0, %o1) +SIGN2(sys32_splice, sys_splice, %o0, %o2)  SIGN2(sys32_sync_file_range, compat_sync_file_range, %o0, %o5)  SIGN2(sys32_tee, sys_tee, %o0, %o1)  SIGN1(sys32_vmsplice, compat_sys_vmsplice, %o0) +SIGN1(sys32_truncate, sys_truncate, %o1) +SIGN1(sys32_ftruncate, sys_ftruncate, %o1)  	.globl		sys32_mmap2  sys32_mmap2: diff --git a/arch/sparc/kernel/systbls_64.S b/arch/sparc/kernel/systbls_64.S index 6b3ee88e253c..2ee7250ba7ae 100644 --- a/arch/sparc/kernel/systbls_64.S +++ b/arch/sparc/kernel/systbls_64.S @@ -43,8 +43,8 @@ sys_call_table32:  /*110*/	.word sys_setresgid, sys_getresgid, sys_setregid, sys_nis_syscall, sys_nis_syscall  	.word sys32_getgroups, compat_sys_gettimeofday, sys32_getrusage, sys_nis_syscall, sys_getcwd  /*120*/	.word compat_sys_readv, compat_sys_writev, compat_sys_settimeofday, sys_fchown16, sys_fchmod -	.word sys_nis_syscall, sys_setreuid16, sys_setregid16, sys_rename, sys_truncate -/*130*/	.word sys_ftruncate, sys_flock, compat_sys_lstat64, sys_nis_syscall, sys_nis_syscall +	.word sys_nis_syscall, sys_setreuid16, sys_setregid16, sys_rename, sys32_truncate +/*130*/	.word sys32_ftruncate, sys_flock, compat_sys_lstat64, sys_nis_syscall, sys_nis_syscall  	.word sys_nis_syscall, sys32_mkdir, sys_rmdir, compat_sys_utimes, compat_sys_stat64  /*140*/	.word sys32_sendfile64, sys_nis_syscall, sys32_futex, sys_gettid, compat_sys_getrlimit  	.word compat_sys_setrlimit, sys_pivot_root, sys32_prctl, sys_pciconfig_read, sys_pciconfig_write diff --git a/arch/sparc/mm/fault_32.c b/arch/sparc/mm/fault_32.c index a5e30c642ee3..b99f81c4906f 100644 --- a/arch/sparc/mm/fault_32.c +++ b/arch/sparc/mm/fault_32.c @@ -319,9 +319,10 @@ no_context:   */  out_of_memory:  	up_read(&mm->mmap_sem); -	printk("VM: killing process %s\n", tsk->comm); -	if (from_user) -		do_group_exit(SIGKILL); +	if (from_user) { +		pagefault_out_of_memory(); +		return; +	}  	goto no_context;  do_sigbus: diff --git a/arch/sparc/mm/fault_64.c b/arch/sparc/mm/fault_64.c index e5620b27c8bf..43b0da96a4fb 100644 --- a/arch/sparc/mm/fault_64.c +++ b/arch/sparc/mm/fault_64.c @@ -447,9 +447,10 @@ handle_kernel_fault:  out_of_memory:  	insn = get_fault_insn(regs, insn);  	up_read(&mm->mmap_sem); -	printk("VM: killing process %s\n", current->comm); -	if (!(regs->tstate & TSTATE_PRIV)) -		do_group_exit(SIGKILL); +	if (!(regs->tstate & TSTATE_PRIV)) { +		pagefault_out_of_memory(); +		return; +	}  	goto handle_kernel_fault;  intr_or_no_mm: diff --git a/arch/sparc/mm/init_64.c b/arch/sparc/mm/init_64.c index ed6be6ba2f4e..a70a5e1904d9 100644 --- a/arch/sparc/mm/init_64.c +++ b/arch/sparc/mm/init_64.c @@ -145,7 +145,8 @@ static void __init read_obp_memory(const char *property,  	     cmp_p64, NULL);  } -unsigned long *sparc64_valid_addr_bitmap __read_mostly; +unsigned long sparc64_valid_addr_bitmap[VALID_ADDR_BITMAP_BYTES / +					sizeof(unsigned long)];  EXPORT_SYMBOL(sparc64_valid_addr_bitmap);  /* Kernel physical address base and size in bytes.  */ @@ -1874,7 +1875,7 @@ static int pavail_rescan_ents __initdata;   * memory list again, and make sure it provides at least as much   * memory as 'pavail' does.   */ -static void __init setup_valid_addr_bitmap_from_pavail(void) +static void __init setup_valid_addr_bitmap_from_pavail(unsigned long *bitmap)  {  	int i; @@ -1897,8 +1898,7 @@ static void __init setup_valid_addr_bitmap_from_pavail(void)  				if (new_start <= old_start &&  				    new_end >= (old_start + PAGE_SIZE)) { -					set_bit(old_start >> 22, -						sparc64_valid_addr_bitmap); +					set_bit(old_start >> 22, bitmap);  					goto do_next_page;  				}  			} @@ -1919,20 +1919,21 @@ static void __init setup_valid_addr_bitmap_from_pavail(void)  	}  } +static void __init patch_tlb_miss_handler_bitmap(void) +{ +	extern unsigned int valid_addr_bitmap_insn[]; +	extern unsigned int valid_addr_bitmap_patch[]; + +	valid_addr_bitmap_insn[1] = valid_addr_bitmap_patch[1]; +	mb(); +	valid_addr_bitmap_insn[0] = valid_addr_bitmap_patch[0]; +	flushi(&valid_addr_bitmap_insn[0]); +} +  void __init mem_init(void)  {  	unsigned long codepages, datapages, initpages;  	unsigned long addr, last; -	int i; - -	i = last_valid_pfn >> ((22 - PAGE_SHIFT) + 6); -	i += 1; -	sparc64_valid_addr_bitmap = (unsigned long *) alloc_bootmem(i << 3); -	if (sparc64_valid_addr_bitmap == NULL) { -		prom_printf("mem_init: Cannot alloc valid_addr_bitmap.\n"); -		prom_halt(); -	} -	memset(sparc64_valid_addr_bitmap, 0, i << 3);  	addr = PAGE_OFFSET + kern_base;  	last = PAGE_ALIGN(kern_size) + addr; @@ -1941,15 +1942,19 @@ void __init mem_init(void)  		addr += PAGE_SIZE;  	} -	setup_valid_addr_bitmap_from_pavail(); +	setup_valid_addr_bitmap_from_pavail(sparc64_valid_addr_bitmap); +	patch_tlb_miss_handler_bitmap();  	high_memory = __va(last_valid_pfn << PAGE_SHIFT);  #ifdef CONFIG_NEED_MULTIPLE_NODES -	for_each_online_node(i) { -		if (NODE_DATA(i)->node_spanned_pages != 0) { -			totalram_pages += -				free_all_bootmem_node(NODE_DATA(i)); +	{ +		int i; +		for_each_online_node(i) { +			if (NODE_DATA(i)->node_spanned_pages != 0) { +				totalram_pages += +					free_all_bootmem_node(NODE_DATA(i)); +			}  		}  	}  #else diff --git a/arch/sparc/mm/init_64.h b/arch/sparc/mm/init_64.h index 16063870a489..c2f772dbd556 100644 --- a/arch/sparc/mm/init_64.h +++ b/arch/sparc/mm/init_64.h @@ -5,10 +5,13 @@   * marked non-static so that assembler code can get at them.   */ -#define MAX_PHYS_ADDRESS	(1UL << 42UL) -#define KPTE_BITMAP_CHUNK_SZ	(256UL * 1024UL * 1024UL) +#define MAX_PHYS_ADDRESS	(1UL << 41UL) +#define KPTE_BITMAP_CHUNK_SZ		(256UL * 1024UL * 1024UL)  #define KPTE_BITMAP_BYTES	\  	((MAX_PHYS_ADDRESS / KPTE_BITMAP_CHUNK_SZ) / 8) +#define VALID_ADDR_BITMAP_CHUNK_SZ	(4UL * 1024UL * 1024UL) +#define VALID_ADDR_BITMAP_BYTES	\ +	((MAX_PHYS_ADDRESS / VALID_ADDR_BITMAP_CHUNK_SZ) / 8)  extern unsigned long kern_linear_pte_xor[2];  extern unsigned long kpte_linear_bitmap[KPTE_BITMAP_BYTES / sizeof(unsigned long)]; diff --git a/drivers/sbus/char/bbc_envctrl.c b/drivers/sbus/char/bbc_envctrl.c index 15dab96d05e3..7c815d3327f7 100644 --- a/drivers/sbus/char/bbc_envctrl.c +++ b/drivers/sbus/char/bbc_envctrl.c @@ -537,8 +537,12 @@ int bbc_envctrl_init(struct bbc_i2c_bus *bp)  	}  	if (temp_index != 0 && fan_index != 0) {  		kenvctrld_task = kthread_run(kenvctrld, NULL, "kenvctrld"); -		if (IS_ERR(kenvctrld_task)) -			return PTR_ERR(kenvctrld_task); +		if (IS_ERR(kenvctrld_task)) { +			int err = PTR_ERR(kenvctrld_task); + +			kenvctrld_task = NULL; +			return err; +		}  	}  	return 0; @@ -561,7 +565,8 @@ void bbc_envctrl_cleanup(struct bbc_i2c_bus *bp)  	struct bbc_cpu_temperature *tp, *tpos;  	struct bbc_fan_control *fp, *fpos; -	kthread_stop(kenvctrld_task); +	if (kenvctrld_task) +		kthread_stop(kenvctrld_task);  	list_for_each_entry_safe(tp, tpos, &bp->temps, bp_list) {  		list_del(&tp->bp_list);  | 
