summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@home.transmeta.com>2002-09-13 04:05:50 -0700
committerLinus Torvalds <torvalds@home.transmeta.com>2002-09-13 04:05:50 -0700
commitd1a75a97b0d3b9bc4e6a95f4e7854e7a7a986976 (patch)
tree323f2436f538f9ea43593259529280331b8ee732
parent2c66151cbc2cc68465489fdf64d16bd1c6ca4d0e (diff)
parent4be8d6018dc67c03d5118a280e27859bd55164d3 (diff)
Merge master.kernel.org:/home/davem/BK/sparc-2.5
into home.transmeta.com:/home/torvalds/v2.5/linux
-rw-r--r--arch/sparc/config.in5
-rw-r--r--arch/sparc/defconfig305
-rw-r--r--arch/sparc/kernel/Makefile2
-rwxr-xr-xarch/sparc/kernel/check_asm.sh3
-rw-r--r--arch/sparc/kernel/ebus.c4
-rw-r--r--arch/sparc/kernel/entry.S3
-rw-r--r--arch/sparc/kernel/init_task.c2
-rw-r--r--arch/sparc/kernel/pcic.c200
-rw-r--r--arch/sparc/kernel/process.c6
-rw-r--r--arch/sparc/kernel/setup.c128
-rw-r--r--arch/sparc/kernel/signal.c148
-rw-r--r--arch/sparc/kernel/sparc-stub.c14
-rw-r--r--arch/sparc/kernel/systbls.S2
-rw-r--r--arch/sparc/kernel/tadpole.c13
-rw-r--r--arch/sparc/kernel/tick14.c12
-rw-r--r--arch/sparc/kernel/time.c88
-rw-r--r--arch/sparc/kernel/unaligned.c9
-rw-r--r--arch/sparc/mm/srmmu.c8
-rw-r--r--arch/sparc/mm/sun4c.c7
-rw-r--r--arch/sparc/prom/misc.c10
-rw-r--r--arch/sparc64/defconfig18
-rw-r--r--arch/sparc64/kernel/entry.S66
-rw-r--r--arch/sparc64/kernel/init_task.c2
-rw-r--r--arch/sparc64/kernel/pci.c2
-rw-r--r--arch/sparc64/kernel/power.c3
-rw-r--r--arch/sparc64/kernel/process.c1
-rw-r--r--arch/sparc64/kernel/setup.c30
-rw-r--r--arch/sparc64/kernel/signal.c117
-rw-r--r--arch/sparc64/kernel/signal32.c185
-rw-r--r--arch/sparc64/kernel/sys_sparc32.c46
-rw-r--r--arch/sparc64/kernel/systbls.S4
-rw-r--r--arch/sparc64/kernel/time.c56
-rw-r--r--arch/sparc64/mm/init.c8
-rw-r--r--arch/sparc64/prom/misc.c2
-rw-r--r--drivers/serial/sunsu.c3
-rw-r--r--drivers/serial/sunzilog.c46
-rw-r--r--include/asm-sparc/hardirq.h8
-rw-r--r--include/asm-sparc/highmem.h13
-rw-r--r--include/asm-sparc/ide.h102
-rw-r--r--include/asm-sparc/irq.h2
-rw-r--r--include/asm-sparc/kmap_types.h2
-rw-r--r--include/asm-sparc/spinlock.h2
-rw-r--r--include/asm-sparc/system.h24
-rw-r--r--include/asm-sparc/unistd.h2
-rw-r--r--include/asm-sparc64/hardirq.h2
-rw-r--r--include/asm-sparc64/ide.h131
-rw-r--r--include/asm-sparc64/spinlock.h2
-rw-r--r--include/asm-sparc64/unistd.h2
-rw-r--r--kernel/signal.c13
49 files changed, 679 insertions, 1184 deletions
diff --git a/arch/sparc/config.in b/arch/sparc/config.in
index a4fc5f52534d..a9aaeb8c0a46 100644
--- a/arch/sparc/config.in
+++ b/arch/sparc/config.in
@@ -59,6 +59,9 @@ endmenu
mainmenu_option next_comment
comment 'Console drivers'
bool 'PROM console' CONFIG_PROM_CONSOLE
+if [ "$CONFIG_PROM_CONSOLE" != "y" ]; then
+ define_bool CONFIG_DUMMY_CONSOLE y
+fi
source drivers/video/Config.in
endmenu
@@ -214,6 +217,8 @@ if [ "$CONFIG_UNIX98_PTYS" = "y" ]; then
fi
endmenu
+source drivers/input/Config.in
+
source fs/Config.in
if [ "$CONFIG_EXPERIMENTAL" = "y" ]; then
diff --git a/arch/sparc/defconfig b/arch/sparc/defconfig
index 9a2e2f92ad61..8b7cd298a510 100644
--- a/arch/sparc/defconfig
+++ b/arch/sparc/defconfig
@@ -3,6 +3,12 @@
#
CONFIG_UID16=y
CONFIG_HIGHMEM=y
+CONFIG_GENERIC_ISA_DMA=y
+
+#
+# Code maturity level options
+#
+CONFIG_EXPERIMENTAL=y
#
# General setup
@@ -13,11 +19,6 @@ CONFIG_SYSVIPC=y
CONFIG_SYSCTL=y
#
-# Code maturity level options
-#
-CONFIG_EXPERIMENTAL=y
-
-#
# Loadable module support
#
CONFIG_MODULES=y
@@ -29,6 +30,7 @@ CONFIG_KMOD=y
#
CONFIG_VT=y
CONFIG_VT_CONSOLE=y
+CONFIG_HW_CONSOLE=y
# CONFIG_SMP is not set
CONFIG_SPARC32=y
# CONFIG_ISA is not set
@@ -37,20 +39,15 @@ CONFIG_SPARC32=y
# CONFIG_PCMCIA is not set
CONFIG_SBUS=y
CONFIG_SBUSCHAR=y
-CONFIG_BUSMOUSE=y
-CONFIG_SUN_MOUSE=y
-CONFIG_SERIAL=y
-CONFIG_SUN_SERIAL=y
CONFIG_SERIAL_CONSOLE=y
-CONFIG_SUN_KEYBOARD=y
-CONFIG_SUN_CONSOLE=y
CONFIG_SUN_AUXIO=y
CONFIG_SUN_IO=y
CONFIG_RWSEM_GENERIC_SPINLOCK=y
# CONFIG_RWSEM_XCHGADD_ALGORITHM is not set
CONFIG_SUN_PM=y
# CONFIG_SUN4 is not set
-# CONFIG_PCI is not set
+CONFIG_PCI=y
+# CONFIG_PCI_NAMES is not set
CONFIG_SUN_OPENPROMFS=m
CONFIG_KCORE_ELF=y
CONFIG_BINFMT_AOUT=y
@@ -67,29 +64,13 @@ CONFIG_SUNOS_EMUL=y
#
# Console drivers
#
-CONFIG_PROM_CONSOLE=y
+# CONFIG_PROM_CONSOLE is not set
+CONFIG_DUMMY_CONSOLE=y
#
# Frame-buffer support
#
-CONFIG_FB=y
-CONFIG_DUMMY_CONSOLE=y
-# CONFIG_FB_CYBER2000 is not set
-CONFIG_FB_SBUS=y
-CONFIG_FB_CGSIX=y
-CONFIG_FB_BWTWO=y
-CONFIG_FB_CGTHREE=y
-CONFIG_FB_TCX=y
-CONFIG_FB_CGFOURTEEN=y
-# CONFIG_FB_P9100 is not set
-CONFIG_FB_LEO=y
-# CONFIG_FB_VIRTUAL is not set
-# CONFIG_FBCON_ADVANCED is not set
-CONFIG_FBCON_MFB=y
-CONFIG_FBCON_CFB8=y
-CONFIG_FBCON_FONTWIDTH8_ONLY=y
-CONFIG_FONT_SUN8x16=y
-# CONFIG_FBCON_FONTS is not set
+# CONFIG_FB is not set
#
# Memory Technology Devices (MTD)
@@ -97,15 +78,41 @@ CONFIG_FONT_SUN8x16=y
# CONFIG_MTD is not set
#
+# Serial drivers
+#
+# CONFIG_SERIAL_8250 is not set
+# CONFIG_SERIAL_8250_CONSOLE is not set
+# CONFIG_SERIAL_8250_CS is not set
+# CONFIG_SERIAL_8250_EXTENDED is not set
+# CONFIG_SERIAL_8250_MANY_PORTS is not set
+# CONFIG_SERIAL_8250_SHARE_IRQ is not set
+# CONFIG_SERIAL_8250_DETECT_IRQ is not set
+# CONFIG_SERIAL_8250_MULTIPORT is not set
+# CONFIG_SERIAL_8250_RSA is not set
+
+#
+# Non-8250 serial port support
+#
+CONFIG_SERIAL_SUNCORE=y
+CONFIG_SERIAL_CORE_CONSOLE=y
+CONFIG_SERIAL_SUNZILOG=y
+CONFIG_SERIAL_SUNSU=y
+# CONFIG_SERIAL_SUNSAB is not set
+CONFIG_SERIAL_CORE=y
+CONFIG_SERIAL_CORE_CONSOLE=y
+
+#
# Misc Linux/SPARC drivers
#
CONFIG_SUN_OPENPROMIO=m
CONFIG_SUN_MOSTEK_RTC=y
# CONFIG_SUN_BPP is not set
# CONFIG_SUN_VIDEOPIX is not set
-CONFIG_SUN_AURORA=m
+# CONFIG_SUN_AURORA is not set
# CONFIG_TADPOLE_TS102_UCTRL is not set
# CONFIG_SUN_JSFLASH is not set
+CONFIG_APM_RTC_IS_GMT=y
+# CONFIG_RTC is not set
#
# Linux/SPARC audio subsystem (EXPERIMENTAL)
@@ -119,9 +126,9 @@ CONFIG_SUN_AURORA=m
#
# Block devices
#
-CONFIG_BLK_DEV_FD=y
+# CONFIG_BLK_DEV_FD is not set
CONFIG_BLK_DEV_LOOP=m
-CONFIG_BLK_DEV_NBD=m
+# CONFIG_BLK_DEV_NBD is not set
#
# Multi-device support (RAID and LVM)
@@ -139,6 +146,31 @@ CONFIG_BLK_DEV_RAM_SIZE=4096
CONFIG_BLK_DEV_INITRD=y
#
+# ATA/ATAPI/MFM/RLL support
+#
+# CONFIG_IDE is not set
+# CONFIG_BLK_DEV_HD is not set
+
+#
+# ISDN subsystem
+#
+# CONFIG_ISDN_BOOL is not set
+
+#
+# SCSI support
+#
+# CONFIG_SCSI is not set
+
+#
+# Fibre Channel support
+#
+# CONFIG_FC4 is not set
+# CONFIG_FC4_SOC is not set
+# CONFIG_FC4_SOCAL is not set
+# CONFIG_SCSI_PLUTO is not set
+# CONFIG_SCSI_FCAL is not set
+
+#
# Networking options
#
CONFIG_PACKET=y
@@ -150,30 +182,35 @@ CONFIG_UNIX=y
CONFIG_INET=y
# CONFIG_IP_MULTICAST is not set
# CONFIG_IP_ADVANCED_ROUTER is not set
-# CONFIG_IP_PNP is not set
+CONFIG_IP_PNP=y
+CONFIG_IP_PNP_DHCP=y
+# CONFIG_IP_PNP_BOOTP is not set
+# CONFIG_IP_PNP_RARP is not set
# CONFIG_NET_IPIP is not set
# CONFIG_NET_IPGRE is not set
# CONFIG_ARPD is not set
# CONFIG_INET_ECN is not set
# CONFIG_SYN_COOKIES is not set
CONFIG_IPV6=m
-# CONFIG_KHTTPD is not set
-# CONFIG_ATM is not set
-# CONFIG_VLAN_8021Q is not set
#
-#
+# SCTP Configuration (EXPERIMENTAL)
#
-CONFIG_IPX=m
-# CONFIG_IPX_INTERN is not set
-CONFIG_ATALK=m
-CONFIG_DECNET=m
-CONFIG_DECNET_SIOCGIFCONF=y
-# CONFIG_DECNET_ROUTER is not set
+CONFIG_IPV6_SCTP__=m
+CONFIG_IP_SCTP=m
+# CONFIG_SCTP_ADLER32 is not set
+# CONFIG_SCTP_DBG_MSG is not set
+CONFIG_SCTP_DBG_OBJCNT=y
+# CONFIG_ATM is not set
+# CONFIG_VLAN_8021Q is not set
+# CONFIG_LLC is not set
+# CONFIG_IPX is not set
+# CONFIG_ATALK is not set
+# CONFIG_DEV_APPLETALK is not set
+# CONFIG_DECNET is not set
# CONFIG_BRIDGE is not set
# CONFIG_X25 is not set
# CONFIG_LAPB is not set
-# CONFIG_LLC is not set
# CONFIG_NET_DIVERT is not set
# CONFIG_ECONET is not set
# CONFIG_WAN_ROUTER is not set
@@ -184,83 +221,22 @@ CONFIG_DECNET_SIOCGIFCONF=y
# QoS and/or fair queueing
#
# CONFIG_NET_SCHED is not set
-# CONFIG_IDE is not set
-# CONFIG_BLK_DEV_IDE_MODES is not set
-# CONFIG_BLK_DEV_HD is not set
-
-#
-# ISDN subsystem
-#
-# CONFIG_ISDN is not set
-
-#
-# SCSI support
-#
-CONFIG_SCSI=y
-
-#
-# SCSI support type (disk, tape, CDrom)
-#
-CONFIG_BLK_DEV_SD=y
-CONFIG_SD_EXTRA_DEVS=40
-CONFIG_CHR_DEV_ST=y
-# CONFIG_CHR_DEV_OSST is not set
-CONFIG_BLK_DEV_SR=y
-CONFIG_BLK_DEV_SR_VENDOR=y
-CONFIG_SR_EXTRA_DEVS=2
-CONFIG_CHR_DEV_SG=m
-
-#
-# Some SCSI devices (e.g. CD jukebox) support multiple LUNs
-#
-CONFIG_SCSI_MULTI_LUN=y
-CONFIG_SCSI_CONSTANTS=y
-# CONFIG_SCSI_LOGGING is not set
-
-#
-# SCSI low-level drivers
-#
-CONFIG_SCSI_SUNESP=y
-CONFIG_SCSI_QLOGICPTI=m
-
-#
-# Fibre Channel support
-#
-CONFIG_FC4=m
-
-#
-# FC4 drivers
-#
-CONFIG_FC4_SOC=m
-CONFIG_FC4_SOCAL=m
-
-#
-# FC4 targets
-#
-CONFIG_SCSI_PLUTO=m
-CONFIG_SCSI_FCAL=m
#
# Network device support
#
CONFIG_NETDEVICES=y
CONFIG_DUMMY=m
-CONFIG_BONDING=m
-# CONFIG_TUN is not set
-CONFIG_PPP=m
-CONFIG_PPP_ASYNC=m
-CONFIG_PPP_SYNC_TTY=m
-CONFIG_PPP_DEFLATE=m
-CONFIG_PPP_BSDCOMP=m
-CONFIG_SLIP=m
-CONFIG_SLIP_COMPRESSED=y
-CONFIG_SLIP_SMART=y
-# CONFIG_SLIP_MODE_SLIP6 is not set
-CONFIG_SUNLANCE=y
-CONFIG_HAPPYMEAL=m
-CONFIG_SUNBMAC=m
+# CONFIG_BONDING is not set
+CONFIG_TUN=m
+# CONFIG_PPP is not set
+# CONFIG_SLIP is not set
+CONFIG_SUNLANCE=m
+CONFIG_HAPPYMEAL=y
+# CONFIG_SUNBMAC is not set
CONFIG_SUNQE=m
-CONFIG_MYRI_SBUS=m
+# CONFIG_MYRI_SBUS is not set
+CONFIG_VORTEX=m
#
# Unix98 PTY support
@@ -272,6 +248,8 @@ CONFIG_UNIX98_PTY_COUNT=256
# File systems
#
# CONFIG_QUOTA is not set
+# CONFIG_QFMT_V1 is not set
+# CONFIG_QFMT_V2 is not set
CONFIG_AUTOFS_FS=m
CONFIG_AUTOFS4_FS=m
# CONFIG_REISERFS_FS is not set
@@ -279,17 +257,17 @@ CONFIG_AUTOFS4_FS=m
# CONFIG_REISERFS_PROC_INFO is not set
# CONFIG_ADFS_FS is not set
# CONFIG_ADFS_FS_RW is not set
-CONFIG_AFFS_FS=m
+# CONFIG_AFFS_FS is not set
# CONFIG_HFS_FS is not set
# CONFIG_BFS_FS is not set
-CONFIG_EXT3_FS=m
-CONFIG_JBD=m
+# CONFIG_EXT3_FS is not set
+# CONFIG_JBD is not set
# CONFIG_JBD_DEBUG is not set
-CONFIG_FAT_FS=m
-CONFIG_MSDOS_FS=m
+# CONFIG_FAT_FS is not set
+# CONFIG_MSDOS_FS is not set
# CONFIG_UMSDOS_FS is not set
-CONFIG_VFAT_FS=m
-CONFIG_EFS_FS=m
+# CONFIG_VFAT_FS is not set
+# CONFIG_EFS_FS is not set
# CONFIG_JFFS_FS is not set
# CONFIG_JFFS2_FS is not set
# CONFIG_CRAMFS is not set
@@ -298,12 +276,15 @@ CONFIG_RAMFS=y
CONFIG_ISO9660_FS=m
# CONFIG_JOLIET is not set
# CONFIG_ZISOFS is not set
-CONFIG_MINIX_FS=m
+# CONFIG_JFS_FS is not set
+# CONFIG_JFS_DEBUG is not set
+# CONFIG_JFS_STATISTICS is not set
+# CONFIG_MINIX_FS is not set
# CONFIG_VXFS_FS is not set
# CONFIG_NTFS_FS is not set
# CONFIG_NTFS_DEBUG is not set
# CONFIG_NTFS_RW is not set
-CONFIG_HPFS_FS=m
+# CONFIG_HPFS_FS is not set
CONFIG_PROC_FS=y
# CONFIG_DEVFS_FS is not set
# CONFIG_DEVFS_MOUNT is not set
@@ -313,26 +294,27 @@ CONFIG_DEVPTS_FS=y
# CONFIG_QNX4FS_RW is not set
CONFIG_ROMFS_FS=m
CONFIG_EXT2_FS=y
-CONFIG_SYSV_FS=m
+# CONFIG_SYSV_FS is not set
# CONFIG_UDF_FS is not set
# CONFIG_UDF_RW is not set
-CONFIG_UFS_FS=m
+# CONFIG_UFS_FS is not set
# CONFIG_UFS_FS_WRITE is not set
#
# Network File Systems
#
-CONFIG_CODA_FS=m
-CONFIG_INTERMEZZO_FS=m
+# CONFIG_CODA_FS is not set
+# CONFIG_INTERMEZZO_FS is not set
CONFIG_NFS_FS=y
# CONFIG_NFS_V3 is not set
-# CONFIG_ROOT_NFS is not set
-CONFIG_NFSD=m
+CONFIG_ROOT_NFS=y
+# CONFIG_NFSD is not set
# CONFIG_NFSD_V3 is not set
+# CONFIG_NFSD_TCP is not set
CONFIG_SUNRPC=y
CONFIG_LOCKD=y
-CONFIG_SMB_FS=m
-# CONFIG_SMB_NLS_DEFAULT is not set
+# CONFIG_EXPORTFS is not set
+# CONFIG_SMB_FS is not set
# CONFIG_NCP_FS is not set
# CONFIG_NCPFS_PACKET_SIGNING is not set
# CONFIG_NCPFS_IOCTL_LOCKING is not set
@@ -343,7 +325,6 @@ CONFIG_SMB_FS=m
# CONFIG_NCPFS_NLS is not set
# CONFIG_NCPFS_EXTRAS is not set
# CONFIG_ZISOFS_FS is not set
-# CONFIG_ZLIB_FS_INFLATE is not set
#
# Partition Types
@@ -351,49 +332,8 @@ CONFIG_SMB_FS=m
# CONFIG_PARTITION_ADVANCED is not set
CONFIG_MSDOS_PARTITION=y
CONFIG_SUN_PARTITION=y
-CONFIG_SMB_NLS=y
-CONFIG_NLS=y
-
-#
-# Native Language Support
-#
-CONFIG_NLS_DEFAULT="iso8859-1"
-# CONFIG_NLS_CODEPAGE_437 is not set
-# CONFIG_NLS_CODEPAGE_737 is not set
-# CONFIG_NLS_CODEPAGE_775 is not set
-# CONFIG_NLS_CODEPAGE_850 is not set
-# CONFIG_NLS_CODEPAGE_852 is not set
-# CONFIG_NLS_CODEPAGE_855 is not set
-# CONFIG_NLS_CODEPAGE_857 is not set
-# CONFIG_NLS_CODEPAGE_860 is not set
-# CONFIG_NLS_CODEPAGE_861 is not set
-# CONFIG_NLS_CODEPAGE_862 is not set
-# CONFIG_NLS_CODEPAGE_863 is not set
-# CONFIG_NLS_CODEPAGE_864 is not set
-# CONFIG_NLS_CODEPAGE_865 is not set
-# CONFIG_NLS_CODEPAGE_866 is not set
-# CONFIG_NLS_CODEPAGE_869 is not set
-# CONFIG_NLS_CODEPAGE_936 is not set
-# CONFIG_NLS_CODEPAGE_950 is not set
-# CONFIG_NLS_CODEPAGE_932 is not set
-# CONFIG_NLS_CODEPAGE_949 is not set
-# CONFIG_NLS_CODEPAGE_874 is not set
-# CONFIG_NLS_ISO8859_8 is not set
-# CONFIG_NLS_CODEPAGE_1251 is not set
-# CONFIG_NLS_ISO8859_1 is not set
-# CONFIG_NLS_ISO8859_2 is not set
-# CONFIG_NLS_ISO8859_3 is not set
-# CONFIG_NLS_ISO8859_4 is not set
-# CONFIG_NLS_ISO8859_5 is not set
-# CONFIG_NLS_ISO8859_6 is not set
-# CONFIG_NLS_ISO8859_7 is not set
-# CONFIG_NLS_ISO8859_9 is not set
-# CONFIG_NLS_ISO8859_13 is not set
-# CONFIG_NLS_ISO8859_14 is not set
-# CONFIG_NLS_ISO8859_15 is not set
-# CONFIG_NLS_KOI8_R is not set
-# CONFIG_NLS_KOI8_U is not set
-# CONFIG_NLS_UTF8 is not set
+# CONFIG_SMB_NLS is not set
+# CONFIG_NLS is not set
#
# Bluetooth support
@@ -408,9 +348,18 @@ CONFIG_NLS_DEFAULT="iso8859-1"
#
# Kernel hacking
#
-# CONFIG_MAGIC_SYSRQ is not set
+CONFIG_DEBUG_SLAB=y
+CONFIG_MAGIC_SYSRQ=y
+CONFIG_DEBUG_SPINLOCK=y
+
+#
+# Security options
+#
+CONFIG_SECURITY_CAPABILITIES=y
#
# Library routines
#
CONFIG_CRC32=y
+# CONFIG_ZLIB_INFLATE is not set
+# CONFIG_ZLIB_DEFLATE is not set
diff --git a/arch/sparc/kernel/Makefile b/arch/sparc/kernel/Makefile
index a0dd353b33a8..b197ace97454 100644
--- a/arch/sparc/kernel/Makefile
+++ b/arch/sparc/kernel/Makefile
@@ -13,7 +13,7 @@ export-objs := sparc_ksyms.o
IRQ_OBJS := irq.o sun4m_irq.o sun4c_irq.o sun4d_irq.o
obj-y := entry.o wof.o wuf.o etrap.o rtrap.o traps.o ${IRQ_OBJS} \
process.o signal.o ioport.o setup.o idprom.o \
- sys_sparc.o sunos_asm.o sparc-stub.o systbls.o \
+ sys_sparc.o sunos_asm.o systbls.o \
time.o windows.o cpu.o devices.o sclow.o \
tadpole.o tick14.o ptrace.o sys_solaris.o \
unaligned.o muldiv.o pcic.o semaphore.o sparc_ksyms.o
diff --git a/arch/sparc/kernel/check_asm.sh b/arch/sparc/kernel/check_asm.sh
index f9157e44dc9c..a4d5e6d95708 100755
--- a/arch/sparc/kernel/check_asm.sh
+++ b/arch/sparc/kernel/check_asm.sh
@@ -11,8 +11,7 @@ case $1 in
echo " sizeof(struct $2_struct)," >> $4
;;
-ints)
- sed -n -e '/check_asm_data:/,/\.size/p' <$2 | sed -e 's/check_asm_data://' -e 's/\.size.*//' -e 's/\.ident.*//' -e 's/\.long[ ]\([0-9]*\)/\1,/' >>$3
- ;;
+ sed -n -e '/check_asm_data:/,/\.size/p' <$2 | sed -e 's/check_asm_data://' -e 's/\.size.*//' -e 's/\.ident.*//' -e 's/\.global.*//' -e 's/\.long[ ]\([0-9]*\)/\1,/' >>$3 ;;
*)
exit 1
;;
diff --git a/arch/sparc/kernel/ebus.c b/arch/sparc/kernel/ebus.c
index c19065bb2cf0..b9688ce7793c 100644
--- a/arch/sparc/kernel/ebus.c
+++ b/arch/sparc/kernel/ebus.c
@@ -24,8 +24,6 @@
struct linux_ebus *ebus_chain = 0;
-extern void rs_init(void);
-
/* We are together with pcic.c under CONFIG_PCI. */
extern unsigned int pcic_pin_to_irq(unsigned int, char *name);
@@ -361,6 +359,4 @@ void __init ebus_init(void)
ebus->next = 0;
++num_ebus;
}
-
- rs_init();
}
diff --git a/arch/sparc/kernel/entry.S b/arch/sparc/kernel/entry.S
index 55ae4fd75358..0e3396ed5cfd 100644
--- a/arch/sparc/kernel/entry.S
+++ b/arch/sparc/kernel/entry.S
@@ -53,6 +53,7 @@ in_trap_handler:
.text
.align 4
+#if 0 /* kgdb is dropped from 2.5.33 */
! This function is called when any SPARC trap (except window overflow or
! underflow) occurs. It makes sure that the invalid register window is still
! available before jumping into C code. It will also restore the world if you
@@ -119,7 +120,7 @@ C_LABEL(trap_low):
STORE_PT_PRIV(sp, l0, l1, l2)
RESTORE_ALL
-
+#endif
#ifdef CONFIG_BLK_DEV_FD
.text
diff --git a/arch/sparc/kernel/init_task.c b/arch/sparc/kernel/init_task.c
index 74c7841e5a28..e11f88ebbecc 100644
--- a/arch/sparc/kernel/init_task.c
+++ b/arch/sparc/kernel/init_task.c
@@ -7,7 +7,7 @@
static struct fs_struct init_fs = INIT_FS;
static struct files_struct init_files = INIT_FILES;
-static struct signal_struct init_signals = INIT_SIGNALS;
+static struct signal_struct init_signals = INIT_SIGNALS(init_signals);
struct mm_struct init_mm = INIT_MM(init_mm);
struct task_struct init_task = INIT_TASK(init_task);
diff --git a/arch/sparc/kernel/pcic.c b/arch/sparc/kernel/pcic.c
index b542a666eca1..209639ceef91 100644
--- a/arch/sparc/kernel/pcic.c
+++ b/arch/sparc/kernel/pcic.c
@@ -1,5 +1,5 @@
-/* $Id: pcic.c,v 1.23 2002/01/23 14:33:55 davem Exp $
- * pcic.c: Sparc/PCI controller support
+/*
+ * pcic.c: MicroSPARC-IIep PCI controller support
*
* Copyright (C) 1998 V. Roganov and G. Raiko
*
@@ -16,6 +16,7 @@
#include <linux/init.h>
#include <linux/mm.h>
#include <linux/slab.h>
+#include <linux/jiffies.h>
#include <asm/ebus.h>
#include <asm/sbus.h> /* for sanity check... */
@@ -193,48 +194,26 @@ static void pci_do_settimeofday(struct timeval *tv);
#define CONFIG_CMD(bus, device_fn, where) (0x80000000 | (((unsigned int)bus) << 16) | (((unsigned int)device_fn) << 8) | (where & ~3))
-static int pcic_read_config(struct pci_bus *bus, unsigned int devfn,
- int where, int size, u32 *value)
+static int pcic_read_config_dword(unsigned int busno, unsigned int devfn,
+ int where, u32 *value)
{
- unsigned int v;
- unsigned char busnum = bus->number;
struct linux_pcic *pcic;
unsigned long flags;
- /* unsigned char where; */
- switch (size) {
- case 1:
- pcic_read_config(bus, devfn, where&~3, 4, &v);
- *value = 0xff & (v >> (8*(where & 3)));
- return PCIBIOS_SUCCESSFUL;
- break;
-
- case 2:
- if (where&1) return PCIBIOS_BAD_REGISTER_NUMBER;
-
- pcic_read_config(bus, devfn, where&~3, 4, &v);
- *value = 0xffff & (v >> (8*(where & 3)));
- return PCIBIOS_SUCCESSFUL;
- break;
- }
-
- /* size == 4, i.e. dword */
- if (where&3) return PCIBIOS_BAD_REGISTER_NUMBER;
- if (busnum != 0) return PCIBIOS_DEVICE_NOT_FOUND;
pcic = &pcic0;
- save_and_cli(flags);
+ local_irq_save(flags);
#if 0 /* does not fail here */
pcic_speculative = 1;
pcic_trapped = 0;
#endif
- writel(CONFIG_CMD(busnum,devfn,where), pcic->pcic_config_space_addr);
+ writel(CONFIG_CMD(busno, devfn, where), pcic->pcic_config_space_addr);
#if 0 /* does not fail here */
nop();
if (pcic_trapped) {
- restore_flags(flags);
+ local_irq_restore(flags);
*value = ~0;
- return PCIBIOS_SUCCESSFUL;
+ return 0;
}
#endif
pcic_speculative = 2;
@@ -243,50 +222,77 @@ static int pcic_read_config(struct pci_bus *bus, unsigned int devfn,
nop();
if (pcic_trapped) {
pcic_speculative = 0;
- restore_flags(flags);
+ local_irq_restore(flags);
*value = ~0;
- return PCIBIOS_SUCCESSFUL;
+ return 0;
}
pcic_speculative = 0;
- restore_flags(flags);
- return PCIBIOS_SUCCESSFUL;
+ local_irq_restore(flags);
+ return 0;
}
-static int pcic_write_config(struct pci_bus *bus, unsigned int devfn,
- int where, int size, u32 value)
+static int pcic_read_config(struct pci_bus *bus, unsigned int devfn,
+ int where, int size, u32 *val)
{
unsigned int v;
- unsigned char busnum = bus->number;
- struct linux_pcic *pcic;
- unsigned long flags;
+ if (bus->number != 0) return -EINVAL;
switch (size) {
case 1:
- pcic_read_config(bus, devfn, where&~3, 4, &v);
- v = (v & ~(0xff << (8*(where&3)))) |
- ((0xff&(unsigned)value) << (8*(where&3)));
- return pcic_write_config(bus, devfn, where&~3, 4, v);
- break;
-
+ pcic_read_config_dword(bus->number, devfn, where&~3, &v);
+ *val = 0xff & (v >> (8*(where & 3)));
+ return 0;
case 2:
- if (where&1) return PCIBIOS_BAD_REGISTER_NUMBER;
- pcic_read_config(bus, devfn, where&~3, 4, &v);
- v = (v & ~(0xffff << (8*(where&3)))) |
- ((0xffff&(unsigned)value) << (8*(where&3)));
- return pcic_write_config(bus, devfn, where&~3, 4, v);
- break;
+ if (where&1) return -EINVAL;
+ pcic_read_config_dword(bus->number, devfn, where&~3, &v);
+ *val = 0xffff & (v >> (8*(where & 3)));
+ return 0;
+ case 4:
+ if (where&3) return -EINVAL;
+ pcic_read_config_dword(bus->number, devfn, where&~3, val);
+ return 0;
}
+ return -EINVAL;
+}
+
+static int pcic_write_config_dword(unsigned int busno, unsigned int devfn,
+ int where, u32 value)
+{
+ struct linux_pcic *pcic;
+ unsigned long flags;
- /* size == 4, i.e. dword */
- if (where&3) return PCIBIOS_BAD_REGISTER_NUMBER;
- if (busnum != 0) return PCIBIOS_DEVICE_NOT_FOUND;
pcic = &pcic0;
- save_and_cli(flags);
- writel(CONFIG_CMD(busnum,devfn,where), pcic->pcic_config_space_addr);
+ local_irq_save(flags);
+ writel(CONFIG_CMD(busno, devfn, where), pcic->pcic_config_space_addr);
writel(value, pcic->pcic_config_space_data + (where&4));
- restore_flags(flags);
- return PCIBIOS_SUCCESSFUL;
+ local_irq_restore(flags);
+ return 0;
+}
+
+static int pcic_write_config(struct pci_bus *bus, unsigned int devfn,
+ int where, int size, u32 val)
+{
+ unsigned int v;
+
+ if (bus->number != 0) return -EINVAL;
+ switch (size) {
+ case 1:
+ pcic_read_config_dword(bus->number, devfn, where&~3, &v);
+ v = (v & ~(0xff << (8*(where&3)))) |
+ ((0xff&val) << (8*(where&3)));
+ return pcic_write_config_dword(bus->number, devfn, where&~3, v);
+ case 2:
+ if (where&1) return -EINVAL;
+ pcic_read_config_dword(bus->number, devfn, where&~3, &v);
+ v = (v & ~(0xffff << (8*(where&3)))) |
+ ((0xffff&val) << (8*(where&3)));
+ return pcic_write_config_dword(bus->number, devfn, where&~3, v);
+ case 4:
+ if (where&3) return -EINVAL;
+ return pcic_write_config_dword(bus->number, devfn, where, val);
+ }
+ return -EINVAL;
}
static struct pci_ops pcic_ops = {
@@ -420,7 +426,7 @@ static void __init pcic_pbm_scan_bus(struct linux_pcic *pcic)
/*
* Main entry point from the PCI subsystem.
*/
-static int __init pcibios_init(void)
+static int __init pcic_init(void)
{
struct linux_pcic *pcic;
@@ -623,7 +629,7 @@ void __init pcibios_fixup_bus(struct pci_bus *bus)
{
struct list_head *walk;
int i, has_io, has_mem;
- unsigned short cmd;
+ unsigned int cmd;
struct linux_pcic *pcic;
/* struct linux_pbm_info* pbm = &pcic->pbm; */
int node;
@@ -663,19 +669,21 @@ void __init pcibios_fixup_bus(struct pci_bus *bus)
} else if (f & IORESOURCE_MEM)
has_mem = 1;
}
- pcic_read_config_word(dev, PCI_COMMAND, &cmd);
+ pcic_read_config(dev->bus, dev->devfn, PCI_COMMAND, 2, &cmd);
if (has_io && !(cmd & PCI_COMMAND_IO)) {
printk("PCIC: Enabling I/O for device %02x:%02x\n",
dev->bus->number, dev->devfn);
cmd |= PCI_COMMAND_IO;
- pcic_write_config_word(dev, PCI_COMMAND, cmd);
+ pcic_write_config(dev->bus, dev->devfn,
+ PCI_COMMAND, 2, cmd);
}
if (has_mem && !(cmd & PCI_COMMAND_MEMORY)) {
printk("PCIC: Enabling memory for device %02x:%02x\n",
dev->bus->number, dev->devfn);
cmd |= PCI_COMMAND_MEMORY;
- pcic_write_config_word(dev, PCI_COMMAND, cmd);
- }
+ pcic_write_config(dev->bus, dev->devfn,
+ PCI_COMMAND, 2, cmd);
+ }
node = pdev_to_pnode(&pcic->pbm, dev);
if(node == 0)
@@ -785,46 +793,54 @@ static __inline__ unsigned long do_gettimeoffset(void)
return offset + count;
}
-extern volatile unsigned long wall_jiffies;
+extern unsigned long wall_jiffies;
+extern rwlock_t xtime_lock;
static void pci_do_gettimeofday(struct timeval *tv)
{
- unsigned long flags;
-
- save_and_cli(flags);
- *tv = xtime;
- tv->tv_usec += do_gettimeoffset();
+ unsigned long flags;
+ unsigned long usec, sec;
- /*
- * xtime is atomically updated in timer_bh. The difference
- * between jiffies and wall_jiffies is nonzero if the timer
- * bottom half hasnt executed yet.
- */
- if ((jiffies - wall_jiffies) != 0)
- tv->tv_usec += USECS_PER_JIFFY;
+ read_lock_irqsave(&xtime_lock, flags);
+ usec = do_gettimeoffset();
+ {
+ unsigned long lost = jiffies - wall_jiffies;
+ if (lost)
+ usec += lost * (1000000 / HZ);
+ }
+ sec = xtime.tv_sec;
+ usec += (xtime.tv_nsec / 1000);
+ read_unlock_irqrestore(&xtime_lock, flags);
- restore_flags(flags);
+ while (usec >= 1000000) {
+ usec -= 1000000;
+ sec++;
+ }
- if (tv->tv_usec >= 1000000) {
- tv->tv_usec -= 1000000;
- tv->tv_sec++;
- }
+ tv->tv_sec = sec;
+ tv->tv_usec = usec;
}
static void pci_do_settimeofday(struct timeval *tv)
{
- cli();
+ /*
+ * This is revolting. We need to set "xtime" correctly. However, the
+ * value in this location is the value at the most recent update of
+ * wall time. Discover what correction gettimeofday() would have
+ * made, and then undo it!
+ */
tv->tv_usec -= do_gettimeoffset();
- if(tv->tv_usec < 0) {
+ tv->tv_usec -= (jiffies - wall_jiffies) * (1000000 / HZ);
+ while (tv->tv_usec < 0) {
tv->tv_usec += 1000000;
tv->tv_sec--;
}
- xtime = *tv;
+ xtime.tv_sec = tv->tv_sec;
+ xtime.tv_nsec = (tv->tv_usec * 1000);
time_adjust = 0; /* stop active adjtime() */
time_status |= STA_UNSYNC;
time_maxerror = NTP_PHASE_LIMIT;
time_esterror = NTP_PHASE_LIMIT;
- sti();
}
#if 0
@@ -853,7 +869,7 @@ void pcibios_align_resource(void *data, struct resource *res,
{
}
-int pcibios_enable_device(struct pci_dev *pdev)
+int pcibios_enable_device(struct pci_dev *pdev, int mask)
{
return 0;
}
@@ -898,9 +914,9 @@ static void pcic_disable_irq(unsigned int irq_nr)
unsigned long mask, flags;
mask = get_irqmask(irq_nr);
- save_and_cli(flags);
+ local_irq_save(flags);
writel(mask, pcic0.pcic_regs+PCI_SYS_INT_TARGET_MASK_SET);
- restore_flags(flags);
+ local_irq_restore(flags);
}
static void pcic_enable_irq(unsigned int irq_nr)
@@ -908,9 +924,9 @@ static void pcic_enable_irq(unsigned int irq_nr)
unsigned long mask, flags;
mask = get_irqmask(irq_nr);
- save_and_cli(flags);
+ local_irq_save(flags);
writel(mask, pcic0.pcic_regs+PCI_SYS_INT_TARGET_MASK_CLEAR);
- restore_flags(flags);
+ local_irq_restore(flags);
}
static void pcic_clear_profile_irq(int cpu)
@@ -1021,4 +1037,4 @@ void insl(unsigned long addr, void *dst, unsigned long count) {
#endif
-subsys_initcall(pcibios_init);
+subsys_initcall(pcic_init);
diff --git a/arch/sparc/kernel/process.c b/arch/sparc/kernel/process.c
index 04908ae9ada3..07bc2c68a2f0 100644
--- a/arch/sparc/kernel/process.c
+++ b/arch/sparc/kernel/process.c
@@ -94,7 +94,7 @@ int cpu_idle(void)
extern unsigned long sun4c_kernel_faults;
extern void sun4c_grow_kernel_ring(void);
- save_and_cli(flags);
+ local_irq_save(flags);
now = jiffies;
count -= (now - last_jiffies);
last_jiffies = now;
@@ -110,7 +110,7 @@ int cpu_idle(void)
sun4c_grow_kernel_ring();
}
}
- restore_flags(flags);
+ local_irq_restore(flags);
}
while((!need_resched()) && pm_idle) {
@@ -144,8 +144,6 @@ int cpu_idle(void)
extern char reboot_command [];
-extern int serial_console;
-
extern void (*prom_palette)(int);
void machine_halt(void)
diff --git a/arch/sparc/kernel/setup.c b/arch/sparc/kernel/setup.c
index 2e7179430026..e5eb2a20d63c 100644
--- a/arch/sparc/kernel/setup.c
+++ b/arch/sparc/kernel/setup.c
@@ -34,7 +34,6 @@
#include <asm/segment.h>
#include <asm/system.h>
#include <asm/io.h>
-#include <asm/kgdb.h>
#include <asm/processor.h>
#include <asm/oplib.h>
#include <asm/page.h>
@@ -67,8 +66,6 @@ struct screen_info screen_info = {
*/
extern unsigned long trapbase;
-extern int serial_console;
-extern void breakpoint(void);
void (*prom_palette)(int);
asmlinkage void sys_sync(void); /* it's really int */
@@ -105,28 +102,15 @@ void prom_sync_me(void)
return;
}
-extern void rs_kgdb_hook(int tty_num); /* sparc/serial.c */
-
unsigned int boot_flags __initdata = 0;
#define BOOTME_DEBUG 0x1
#define BOOTME_SINGLE 0x2
-#define BOOTME_KGDBA 0x4
-#define BOOTME_KGDBB 0x8
-#define BOOTME_KGDB 0xc
static int console_fb __initdata = 0;
/* Exported for mm/init.c:paging_init. */
unsigned long cmdline_memory_size __initdata = 0;
-void kernel_enter_debugger(void)
-{
- if (boot_flags & BOOTME_KGDB) {
- printk("KGDB: Entered\n");
- breakpoint();
- }
-}
-
static void
prom_console_write(struct console *con, const char *s, unsigned n)
{
@@ -142,11 +126,6 @@ static struct console prom_debug_console = {
int obp_system_intr(void)
{
- if (boot_flags & BOOTME_KGDB) {
- printk("KGDB: system interrupted\n");
- breakpoint();
- return 1;
- }
if (boot_flags & BOOTME_DEBUG) {
printk("OBP: system interrupted\n");
prom_halt();
@@ -196,24 +175,6 @@ static void __init boot_flags_init(char *commands)
commands++;
while (*commands && *commands != ' ')
process_switch(*commands++);
- } else if (strlen(commands) >= 9
- && !strncmp(commands, "kgdb=tty", 8)) {
- switch (commands[8]) {
-#ifdef CONFIG_SUN_SERIAL
- case 'a':
- boot_flags |= BOOTME_KGDBA;
- prom_printf("KGDB: Using serial line /dev/ttya.\n");
- break;
- case 'b':
- boot_flags |= BOOTME_KGDBB;
- prom_printf("KGDB: Using serial line /dev/ttyb.\n");
- break;
-#endif
- default:
- printk("KGDB: Unknown tty line.\n");
- break;
- }
- commands += 9;
} else {
if (!strncmp(commands, "console=", 8)) {
commands += 8;
@@ -378,65 +339,48 @@ void __init setup_arch(char **cmdline_p)
prom_setsync(prom_sync_me);
- {
-#if !CONFIG_SUN_SERIAL
- serial_console = 0;
+#ifndef CONFIG_SERIAL_CONSOLE /* Not CONFIG_SERIAL_SUNCORE: to be gone. */
+ serial_console = 0;
#else
- switch (console_fb) {
- case 0: /* Let get our io devices from prom */
- {
- int idev = prom_query_input_device();
- int odev = prom_query_output_device();
- if (idev == PROMDEV_IKBD && odev == PROMDEV_OSCREEN) {
- serial_console = 0;
- } else if (idev == PROMDEV_ITTYA && odev == PROMDEV_OTTYA) {
- serial_console = 1;
- } else if (idev == PROMDEV_ITTYB && odev == PROMDEV_OTTYB) {
- serial_console = 2;
- } else if (idev == PROMDEV_I_UNK && odev == PROMDEV_OTTYA) {
- prom_printf("MrCoffee ttya\n");
- serial_console = 1;
- } else if (idev == PROMDEV_I_UNK && odev == PROMDEV_OSCREEN) {
- serial_console = 0;
- prom_printf("MrCoffee keyboard\n");
- } else {
- prom_printf("Inconsistent or unknown console\n");
- prom_printf("You cannot mix serial and non serial input/output devices\n");
- prom_halt();
- }
+ switch (console_fb) {
+ case 0: /* Let get our io devices from prom */
+ {
+ int idev = prom_query_input_device();
+ int odev = prom_query_output_device();
+ if (idev == PROMDEV_IKBD && odev == PROMDEV_OSCREEN) {
+ serial_console = 0;
+ } else if (idev == PROMDEV_ITTYA && odev == PROMDEV_OTTYA) {
+ serial_console = 1;
+ } else if (idev == PROMDEV_ITTYB && odev == PROMDEV_OTTYB) {
+ serial_console = 2;
+ } else if (idev == PROMDEV_I_UNK && odev == PROMDEV_OTTYA) {
+ prom_printf("MrCoffee ttya\n");
+ serial_console = 1;
+ } else if (idev == PROMDEV_I_UNK && odev == PROMDEV_OSCREEN) {
+ serial_console = 0;
+ prom_printf("MrCoffee keyboard\n");
+ } else {
+ prom_printf("Inconsistent or unknown console\n");
+ prom_printf("You cannot mix serial and non serial input/output devices\n");
+ prom_halt();
}
- break;
- case 1: serial_console = 0; break; /* Force one of the framebuffers as console */
- case 2: serial_console = 1; break; /* Force ttya as console */
- case 3: serial_console = 2; break; /* Force ttyb as console */
}
-#endif
- }
-
- if ((boot_flags & BOOTME_KGDBA)) {
- rs_kgdb_hook(0);
- }
- if ((boot_flags & BOOTME_KGDBB)) {
- rs_kgdb_hook(1);
+ break;
+ case 1: serial_console = 0; break; /* Force one of the framebuffers as console */
+ case 2: serial_console = 1; break; /* Force ttya as console */
+ case 3: serial_console = 2; break; /* Force ttyb as console */
}
+#endif
if((boot_flags&BOOTME_DEBUG) && (linux_dbvec!=0) &&
((*(short *)linux_dbvec) != -1)) {
printk("Booted under KADB. Syncing trap table.\n");
(*(linux_dbvec->teach_debugger))();
}
- if((boot_flags & BOOTME_KGDB)) {
- set_debug_traps();
- prom_printf ("Breakpoint!\n");
- breakpoint();
- }
init_mm.context = (unsigned long) NO_CONTEXT;
init_task.thread.kregs = &fake_swapper_regs;
- if (serial_console)
- conswitchp = NULL;
-
paging_init();
}
@@ -514,3 +458,19 @@ struct seq_operations cpuinfo_op = {
.stop = c_stop,
.show = show_cpuinfo,
};
+
+extern int stop_a_enabled;
+
+void sun_do_break(void)
+{
+ if (!stop_a_enabled)
+ return;
+
+ printk("\n");
+ flush_user_windows();
+
+ prom_cmdline();
+}
+
+int serial_console;
+int stop_a_enabled = 1;
diff --git a/arch/sparc/kernel/signal.c b/arch/sparc/kernel/signal.c
index 8435bc85c35f..f1d1a47020b8 100644
--- a/arch/sparc/kernel/signal.c
+++ b/arch/sparc/kernel/signal.c
@@ -38,11 +38,6 @@ extern void fpload(unsigned long *fpregs, unsigned long *fsr);
asmlinkage int do_signal(sigset_t *oldset, struct pt_regs * regs,
unsigned long orig_o0, int restart_syscall);
-/* This turned off for production... */
-/* #define DEBUG_SIGNALS 1 */
-/* #define DEBUG_SIGNALS_TRACE 1 */
-/* #define DEBUG_SIGNALS_MAPS 1 */
-
/* Signal frames: the original one (compatible with SunOS):
*
* Set up a signal frame... Make the stack look the way SunOS
@@ -470,12 +465,6 @@ setup_frame(struct sigaction *sa, struct pt_regs *regs, int signr, sigset_t *old
synchronize_user_stack();
sframep = (struct signal_sframe *)get_sigframe(sa, regs, SF_ALIGNEDSZ);
if (invalid_frame_pointer (sframep, sizeof(*sframep))){
-#ifdef DEBUG_SIGNALS /* fills up the console logs during crashme runs, yuck... */
- printk("%s [%d]: User has trashed signal stack\n",
- current->comm, current->pid);
- printk("Sigstack ptr %p handler at pc<%08lx> for sig<%d>\n",
- sframep, pc, signr);
-#endif
/* Don't change signal code and address, so that
* post mortem debuggers can have a look.
*/
@@ -635,13 +624,8 @@ new_setup_frame(struct k_sigaction *ka, struct pt_regs *regs,
if (invalid_frame_pointer (sf, sigframe_size))
goto sigill_and_return;
- if (current->thread.w_saved != 0) {
-#ifdef DEBUG_SIGNALS
- printk ("%s [%d]: Invalid user stack frame for "
- "signal delivery.\n", current->comm, current->pid);
-#endif
+ if (current->thread.w_saved != 0)
goto sigill_and_return;
- }
/* 2. Save the current process state */
err = __copy_to_user(&sf->info.si_regs, regs, sizeof (struct pt_regs));
@@ -795,12 +779,8 @@ setup_svr4_frame(struct sigaction *sa, unsigned long pc, unsigned long npc,
synchronize_user_stack();
sfp = (svr4_signal_frame_t *) get_sigframe(sa, regs, SVR4_SF_ALIGNED + REGWIN_SZ);
- if (invalid_frame_pointer (sfp, sizeof (*sfp))){
-#ifdef DEBUG_SIGNALS
- printk ("Invalid stack frame\n");
-#endif
+ if (invalid_frame_pointer (sfp, sizeof (*sfp)))
goto sigill_and_return;
- }
/* Start with a clean frame pointer and fill it */
err = __clear_user(sfp, sizeof (*sfp));
@@ -883,9 +863,6 @@ setup_svr4_frame(struct sigaction *sa, unsigned long pc, unsigned long npc,
regs->pc = (unsigned long) sa->sa_handler;
regs->npc = (regs->pc + 4);
-#ifdef DEBUG_SIGNALS
- printk ("Solaris-frame: %x %x\n", (int) regs->pc, (int) regs->npc);
-#endif
/* Arguments passed to signal handler */
if (regs->u_regs [14]){
struct reg_window *rw = (struct reg_window *) regs->u_regs [14];
@@ -1090,61 +1067,6 @@ static inline void syscall_restart(unsigned long orig_i0, struct pt_regs *regs,
}
}
-#ifdef DEBUG_SIGNALS_MAPS
-
-#define MAPS_LINE_FORMAT "%08lx-%08lx %s %08lx %02x:%02x %lu "
-
-static inline void read_maps (void)
-{
- struct vm_area_struct * map, * next;
- char * buffer;
- ssize_t i;
-
- buffer = (char*)__get_free_page(GFP_KERNEL);
- if (!buffer)
- return;
-
- for (map = current->mm->mmap ; map ; map = next ) {
- /* produce the next line */
- char *line;
- char str[5], *cp = str;
- int flags;
- dev_t dev;
- unsigned long ino;
-
- /*
- * Get the next vma now (but it won't be used if we sleep).
- */
- next = map->vm_next;
- flags = map->vm_flags;
-
- *cp++ = flags & VM_READ ? 'r' : '-';
- *cp++ = flags & VM_WRITE ? 'w' : '-';
- *cp++ = flags & VM_EXEC ? 'x' : '-';
- *cp++ = flags & VM_MAYSHARE ? 's' : 'p';
- *cp++ = 0;
-
- dev = 0;
- ino = 0;
- if (map->vm_file != NULL) {
- dev = map->vm_file->f_dentry->d_inode->i_dev;
- ino = map->vm_file->f_dentry->d_inode->i_ino;
- line = d_path(map->vm_file->f_dentry,
- map->vm_file->f_vfsmnt,
- buffer, PAGE_SIZE);
- }
- printk(MAPS_LINE_FORMAT, map->vm_start, map->vm_end, str, map->vm_pgoff << PAGE_SHIFT,
- MAJOR(dev), MINOR(dev), ino);
- if (map->vm_file != NULL)
- printk("%s\n", line);
- else
- printk("\n");
- }
- free_page((unsigned long)buffer);
- return;
-}
-#endif
-
/* Note that 'init' is a special process: it doesn't get signals it doesn't
* want to handle. Thus you cannot kill init even with a SIGKILL even by
* mistake.
@@ -1152,7 +1074,6 @@ static inline void read_maps (void)
asmlinkage int do_signal(sigset_t *oldset, struct pt_regs * regs,
unsigned long orig_i0, int restart_syscall)
{
- unsigned long signr;
struct k_sigaction *ka;
siginfo_t info;
@@ -1171,9 +1092,21 @@ asmlinkage int do_signal(sigset_t *oldset, struct pt_regs * regs,
oldset = &current->blocked;
for (;;) {
- spin_lock_irq(&current->sigmask_lock);
- signr = dequeue_signal(&current->blocked, &info);
- spin_unlock_irq(&current->sigmask_lock);
+ sigset_t *mask = &current->blocked;
+ unsigned long signr = 0;
+
+ local_irq_disable();
+ if (current->sig->shared_pending.head) {
+ spin_lock(&current->sig->siglock);
+ signr = dequeue_signal(&current->sig->shared_pending, mask, &info);
+ spin_unlock(&current->sig->siglock);
+ }
+ if (!signr) {
+ spin_lock(&current->sigmask_lock);
+ signr = dequeue_signal(&current->pending, mask, &info);
+ spin_unlock(&current->sigmask_lock);
+ }
+ local_irq_enable();
if (!signr)
break;
@@ -1193,7 +1126,7 @@ asmlinkage int do_signal(sigset_t *oldset, struct pt_regs * regs,
restart_syscall = 0;
}
current->exit_code = signr;
- current->state = TASK_STOPPED;
+ set_current_state(TASK_STOPPED);
/* This happens to be SMP safe so no need to
* grab master kernel lock even in this case.
@@ -1254,52 +1187,27 @@ asmlinkage int do_signal(sigset_t *oldset, struct pt_regs * regs,
if (is_orphaned_pgrp(current->pgrp))
continue;
- case SIGSTOP:
- if (current->ptrace & PT_PTRACED)
- continue;
- current->state = TASK_STOPPED;
+ case SIGSTOP: {
+ struct signal_struct *sig;
+ set_current_state(TASK_STOPPED);
current->exit_code = signr;
-
- /* notify_parent() is SMP safe */
- if(!(current->parent->sig->action[SIGCHLD-1].sa.sa_flags &
- SA_NOCLDSTOP))
+ sig = current->parent->sig;
+ if (sig && !(sig->action[SIGCHLD-1].sa.sa_flags &
+ SA_NOCLDSTOP))
notify_parent(current, SIGCHLD);
schedule();
continue;
+ }
case SIGQUIT: case SIGILL: case SIGTRAP:
case SIGABRT: case SIGFPE: case SIGSEGV:
case SIGBUS: case SIGSYS: case SIGXCPU: case SIGXFSZ:
if (do_coredump(signr, regs))
exit_code |= 0x80;
-#ifdef DEBUG_SIGNALS
- /* Very useful to debug dynamic linker problems */
- printk ("Sig %ld going for %s[%d]...\n", signr, current->comm, current->pid);
- show_regs (regs);
-#ifdef DEBUG_SIGNALS_TRACE
- {
- struct reg_window *rw = (struct reg_window *)regs->u_regs[UREG_FP];
- unsigned int ins[8];
-
- while (rw &&
- !(((unsigned long) rw) & 0x3)) {
- copy_from_user(ins, &rw->ins[0], sizeof(ins));
- printk("Caller[%08x](%08x,%08x,%08x,%08x,%08x,%08x)\n", ins[7], ins[0], ins[1], ins[2], ins[3], ins[4], ins[5]);
- rw = (struct reg_window *)(unsigned long)ins[6];
- }
- }
-#endif
-#ifdef DEBUG_SIGNALS_MAPS
- printk("Maps:\n");
- read_maps();
-#endif
-#endif
- /* fall through */
+ /* FALLTHRU */
+
default:
- sigaddset(&current->pending.signal, signr);
- recalc_sigpending();
- current->flags |= PF_SIGNALED;
- do_exit(exit_code);
+ sig_exit(signr, exit_code, &info);
/* NOT REACHED */
}
}
diff --git a/arch/sparc/kernel/sparc-stub.c b/arch/sparc/kernel/sparc-stub.c
index 6a7e105f9d62..e84f815e6903 100644
--- a/arch/sparc/kernel/sparc-stub.c
+++ b/arch/sparc/kernel/sparc-stub.c
@@ -188,22 +188,16 @@ static inline void copy_ttentry(struct tt_entry *src, struct tt_entry *dest)
/* Initialize the kgdb_savettable so that debugging can commence */
static void eh_init(void)
{
- int i, flags;
+ int i;
- save_and_cli(flags);
for(i=0; i < 256; i++)
copy_ttentry(&sparc_ttable[i], &kgdb_savettable[i]);
- restore_flags(flags);
}
/* Install an exception handler for kgdb */
static void exceptionHandler(int tnum, trapfunc_t trap_entry)
{
unsigned long te_addr = (unsigned long) trap_entry;
- int flags;
-
- /* We are dorking with a live trap table, all irqs off */
- save_and_cli(flags);
/* Make new vector */
sparc_ttable[tnum].inst_one =
@@ -212,8 +206,6 @@ static void exceptionHandler(int tnum, trapfunc_t trap_entry)
sparc_ttable[tnum].inst_two = SPARC_RD_PSR_L0;
sparc_ttable[tnum].inst_three = SPARC_NOP;
sparc_ttable[tnum].inst_four = SPARC_NOP;
-
- restore_flags(flags);
}
/* Convert ch from a hex digit to an int */
@@ -406,7 +398,7 @@ set_debug_traps(void)
struct hard_trap_info *ht;
unsigned long flags;
- save_and_cli(flags);
+ local_irq_save(flags);
#if 0
/* Have to sort this out. This cannot be done after initialization. */
BTFIXUPSET_CALL(flush_cache_all, flush_cache_all_nop, BTFIXUPCALL_NOP);
@@ -438,7 +430,7 @@ set_debug_traps(void)
#endif
initialized = 1; /* connect! */
- restore_flags(flags);
+ local_irq_restore(flags);
}
/* Convert the SPARC hardware trap type code to a unix signal number. */
diff --git a/arch/sparc/kernel/systbls.S b/arch/sparc/kernel/systbls.S
index 6a7a3adb11cf..87584f41612d 100644
--- a/arch/sparc/kernel/systbls.S
+++ b/arch/sparc/kernel/systbls.S
@@ -55,7 +55,7 @@ sys_call_table:
/*170*/ .long sys_lsetxattr, sys_fsetxattr, sys_getxattr, sys_lgetxattr, sys_getdents
/*175*/ .long sys_setsid, sys_fchdir, sys_fgetxattr, sys_listxattr, sys_llistxattr
/*180*/ .long sys_flistxattr, sys_removexattr, sys_lremovexattr, sys_sigpending, sys_query_module
-/*185*/ .long sys_setpgid, sys_fremovexattr, sys_tkill, sys_nis_syscall, sys_newuname
+/*185*/ .long sys_setpgid, sys_fremovexattr, sys_tkill, sys_exit_group, sys_newuname
/*190*/ .long sys_init_module, sys_personality, sys_nis_syscall, sys_nis_syscall, sys_nis_syscall
/*195*/ .long sys_nis_syscall, sys_nis_syscall, sys_getppid, sparc_sigaction, sys_sgetmask
/*200*/ .long sys_ssetmask, sys_sigsuspend, sys_newlstat, sys_uselib, old_readdir
diff --git a/arch/sparc/kernel/tadpole.c b/arch/sparc/kernel/tadpole.c
index a972686213b6..f476a5f4af6a 100644
--- a/arch/sparc/kernel/tadpole.c
+++ b/arch/sparc/kernel/tadpole.c
@@ -56,6 +56,9 @@ static void clk_slow(void)
"g2", "g3", "g4", "g5");
}
+/*
+ * Tadpole is guaranteed to be UP, using local_irq_save.
+ */
static void tsu_clockstop(void)
{
unsigned int mcsr;
@@ -64,28 +67,28 @@ static void tsu_clockstop(void)
if (!clk_ctrl)
return;
if (!(clk_state & CLOCK_INIT_DONE)) {
- save_and_cli(flags);
+ local_irq_save(flags);
clk_init();
clk_state |= CLOCK_INIT_DONE; /* all done */
- restore_flags(flags);
+ local_irq_restore(flags);
return;
}
if (!(clk_ctrl[2] & 1))
return; /* no speed up yet */
- save_and_cli(flags);
+ local_irq_save(flags);
/* if SCSI DMA in progress, don't slow clock */
mcsr = ldphys(MACIO_SCSI_CSR_ADDR);
if ((mcsr&MACIO_EN_DMA) != 0) {
- restore_flags(flags);
+ local_irq_restore(flags);
return;
}
/* TODO... the minimum clock setting ought to increase the
* memory refresh interval..
*/
clk_slow();
- restore_flags(flags);
+ local_irq_restore(flags);
}
static void swift_clockstop(void)
diff --git a/arch/sparc/kernel/tick14.c b/arch/sparc/kernel/tick14.c
index 8023443f737c..387b0f792c42 100644
--- a/arch/sparc/kernel/tick14.c
+++ b/arch/sparc/kernel/tick14.c
@@ -29,32 +29,30 @@ extern unsigned long lvl14_save[5];
static unsigned long *linux_lvl14 = NULL;
static unsigned long obp_lvl14[4];
+/*
+ * Call with timer IRQ closed.
+ * First time we do it with disable_irq, later prom code uses spin_lock_irq().
+ */
void install_linux_ticker(void)
{
- unsigned long flags;
if (!linux_lvl14)
return;
- save_and_cli(flags);
linux_lvl14[0] = lvl14_save[0];
linux_lvl14[1] = lvl14_save[1];
linux_lvl14[2] = lvl14_save[2];
linux_lvl14[3] = lvl14_save[3];
- restore_flags(flags);
}
void install_obp_ticker(void)
{
- unsigned long flags;
-
+
if (!linux_lvl14)
return;
- save_and_cli(flags);
linux_lvl14[0] = obp_lvl14[0];
linux_lvl14[1] = obp_lvl14[1];
linux_lvl14[2] = obp_lvl14[2];
linux_lvl14[3] = obp_lvl14[3];
- restore_flags(flags);
}
void claim_ticker14(void (*handler)(int, void *, struct pt_regs *),
diff --git a/arch/sparc/kernel/time.c b/arch/sparc/kernel/time.c
index 1cb4ed19e5e7..395bc29b0034 100644
--- a/arch/sparc/kernel/time.c
+++ b/arch/sparc/kernel/time.c
@@ -43,6 +43,8 @@
extern rwlock_t xtime_lock;
+extern unsigned long wall_jiffies;
+
u64 jiffies_64;
enum sparc_clock_type sp_clock_typ;
@@ -114,6 +116,9 @@ __volatile__ unsigned int *master_l10_limit;
* timer_interrupt() needs to keep up the real-time clock,
* as well as call the "do_timer()" routine every clocktick
*/
+
+#define TICK_SIZE (tick_nsec / 1000)
+
void timer_interrupt(int irq, void *dev_id, struct pt_regs * regs)
{
/* last time the cmos clock got updated */
@@ -142,8 +147,8 @@ void timer_interrupt(int irq, void *dev_id, struct pt_regs * regs)
/* Determine when to update the Mostek clock. */
if ((time_status & STA_UNSYNC) == 0 &&
xtime.tv_sec > last_rtc_update + 660 &&
- xtime.tv_usec >= 500000 - ((unsigned) tick) / 2 &&
- xtime.tv_usec <= 500000 + ((unsigned) tick) / 2) {
+ (xtime.tv_nsec / 1000) >= 500000 - ((unsigned) TICK_SIZE) / 2 &&
+ (xtime.tv_nsec / 1000) <= 500000 + ((unsigned) TICK_SIZE) / 2) {
if (set_rtc_mmss(xtime.tv_sec) == 0)
last_rtc_update = xtime.tv_sec;
else
@@ -400,7 +405,7 @@ void __init sbus_time_init(void)
mon = MSTK_REG_MONTH(mregs);
year = MSTK_CVT_YEAR( MSTK_REG_YEAR(mregs) );
xtime.tv_sec = mktime(year, mon, day, hour, min, sec);
- xtime.tv_usec = 0;
+ xtime.tv_nsec = 0;
mregs->creg &= ~MSTK_CREG_READ;
spin_unlock_irq(&mostek_lock);
#ifdef CONFIG_SUN4
@@ -431,7 +436,7 @@ void __init sbus_time_init(void)
intersil_start(iregs);
xtime.tv_sec = mktime(year, mon, day, hour, min, sec);
- xtime.tv_usec = 0;
+ xtime.tv_nsec = 0;
printk("%u/%u/%u %u:%u:%u\n",day,mon,year,hour,min,sec);
}
#endif
@@ -467,48 +472,33 @@ extern __inline__ unsigned long do_gettimeoffset(void)
return offset + count;
}
-/* This need not obtain the xtime_lock as it is coded in
- * an implicitly SMP safe way already.
+/* Ok, my cute asm atomicity trick doesn't work anymore.
+ * There are just too many variables that need to be protected
+ * now (both members of xtime, wall_jiffies, et al.)
*/
void do_gettimeofday(struct timeval *tv)
{
- /* Load doubles must be used on xtime so that what we get
- * is guarenteed to be atomic, this is why we can run this
- * with interrupts on full blast. Don't touch this... -DaveM
- */
- __asm__ __volatile__(
- "sethi %hi(master_l10_counter), %o1\n\t"
- "ld [%o1 + %lo(master_l10_counter)], %g3\n\t"
- "sethi %hi(xtime), %g2\n"
- "1:\n\t"
- "ldd [%g2 + %lo(xtime)], %o4\n\t"
- "ld [%g3], %o1\n\t"
- "ldd [%g2 + %lo(xtime)], %o2\n\t"
- "xor %o4, %o2, %o2\n\t"
- "xor %o5, %o3, %o3\n\t"
- "orcc %o2, %o3, %g0\n\t"
- "bne 1b\n\t"
- " cmp %o1, 0\n\t"
- "bge 1f\n\t"
- " srl %o1, 0xa, %o1\n\t"
- "sethi %hi(tick), %o3\n\t"
- "ld [%o3 + %lo(tick)], %o3\n\t"
- "sethi %hi(0x1fffff), %o2\n\t"
- "or %o2, %lo(0x1fffff), %o2\n\t"
- "add %o5, %o3, %o5\n\t"
- "and %o1, %o2, %o1\n"
- "1:\n\t"
- "add %o5, %o1, %o5\n\t"
- "sethi %hi(1000000), %o2\n\t"
- "or %o2, %lo(1000000), %o2\n\t"
- "cmp %o5, %o2\n\t"
- "bl,a 1f\n\t"
- " st %o4, [%o0 + 0x0]\n\t"
- "add %o4, 0x1, %o4\n\t"
- "sub %o5, %o2, %o5\n\t"
- "st %o4, [%o0 + 0x0]\n"
- "1:\n\t"
- "st %o5, [%o0 + 0x4]\n");
+ unsigned long flags;
+ unsigned long usec, sec;
+
+ read_lock_irqsave(&xtime_lock, flags);
+ usec = do_gettimeoffset();
+ {
+ unsigned long lost = jiffies - wall_jiffies;
+ if (lost)
+ usec += lost * (1000000 / HZ);
+ }
+ sec = xtime.tv_sec;
+ usec += (xtime.tv_nsec / 1000);
+ read_unlock_irqrestore(&xtime_lock, flags);
+
+ while (usec >= 1000000) {
+ usec -= 1000000;
+ sec++;
+ }
+
+ tv->tv_sec = sec;
+ tv->tv_usec = usec;
}
void do_settimeofday(struct timeval *tv)
@@ -520,12 +510,20 @@ void do_settimeofday(struct timeval *tv)
static void sbus_do_settimeofday(struct timeval *tv)
{
+ /*
+ * This is revolting. We need to set "xtime" correctly. However, the
+ * value in this location is the value at the most recent update of
+ * wall time. Discover what correction gettimeofday() would have
+ * made, and then undo it!
+ */
tv->tv_usec -= do_gettimeoffset();
- if(tv->tv_usec < 0) {
+ tv->tv_usec -= (jiffies - wall_jiffies) * (1000000 / HZ);
+ while (tv->tv_usec < 0) {
tv->tv_usec += 1000000;
tv->tv_sec--;
}
- xtime = *tv;
+ xtime.tv_sec = tv->tv_sec;
+ xtime.tv_nsec = (tv->tv_usec * 1000);
time_adjust = 0; /* stop active adjtime() */
time_status |= STA_UNSYNC;
time_maxerror = NTP_PHASE_LIMIT;
diff --git a/arch/sparc/kernel/unaligned.c b/arch/sparc/kernel/unaligned.c
index 5f90082c1efa..d2f1b3363cb5 100644
--- a/arch/sparc/kernel/unaligned.c
+++ b/arch/sparc/kernel/unaligned.c
@@ -506,9 +506,18 @@ asmlinkage void user_unaligned_trap(struct pt_regs *regs, unsigned int insn)
break;
case both:
+#if 0 /* unsupported */
do_atomic(fetch_reg_addr(((insn>>25)&0x1f), regs),
(unsigned long *) addr,
user_unaligned_trap_fault);
+#else
+ /*
+ * This was supported in 2.4. However, we question
+ * the value of SWAP instruction across word boundaries.
+ */
+ printk("Unaligned SWAP unsupported.\n");
+ goto kill_user;
+#endif
break;
default:
diff --git a/arch/sparc/mm/srmmu.c b/arch/sparc/mm/srmmu.c
index f7dcd0932bec..f2c3f08c247b 100644
--- a/arch/sparc/mm/srmmu.c
+++ b/arch/sparc/mm/srmmu.c
@@ -1212,7 +1212,6 @@ extern int linux_num_cpus;
void (*poke_srmmu)(void) __initdata = NULL;
extern unsigned long bootmem_init(unsigned long *pages_avail);
-extern void sun_serial_setup(void);
void __init srmmu_paging_init(void)
{
@@ -1281,13 +1280,6 @@ void __init srmmu_paging_init(void)
flush_cache_all();
flush_tlb_all();
- /*
- * This does not logically belong here, but we need to
- * call it at the moment we are able to use the bootmem
- * allocator.
- */
- sun_serial_setup();
-
sparc_context_init(num_contexts);
kmap_init();
diff --git a/arch/sparc/mm/sun4c.c b/arch/sparc/mm/sun4c.c
index 2fb85bac38b4..206dd0b6cf29 100644
--- a/arch/sparc/mm/sun4c.c
+++ b/arch/sparc/mm/sun4c.c
@@ -2001,7 +2001,6 @@ extern void sparc_context_init(int);
extern unsigned long end;
extern unsigned long bootmem_init(unsigned long *pages_avail);
extern unsigned long last_valid_pfn;
-extern void sun_serial_setup(void);
void __init sun4c_paging_init(void)
{
@@ -2018,12 +2017,6 @@ void __init sun4c_paging_init(void)
last_valid_pfn = bootmem_init(&pages_avail);
end_pfn = last_valid_pfn;
- /* This does not logically belong here, but we need to
- * call it at the moment we are able to use the bootmem
- * allocator.
- */
- sun_serial_setup();
-
sun4c_probe_mmu();
invalid_segment = (num_segmaps - 1);
sun4c_init_mmu_entry_pool();
diff --git a/arch/sparc/prom/misc.c b/arch/sparc/prom/misc.c
index 42e82f33a25c..0bcd09af481a 100644
--- a/arch/sparc/prom/misc.c
+++ b/arch/sparc/prom/misc.c
@@ -12,6 +12,7 @@
#include <asm/openprom.h>
#include <asm/oplib.h>
#include <asm/auxio.h>
+#include <asm/system.h>
extern void restore_current(void);
@@ -47,7 +48,6 @@ prom_feval(char *fstring)
/* We want to do this more nicely some day. */
extern void (*prom_palette)(int);
-extern int serial_console;
/* Drop into the prom, with the chance to continue with the 'go'
* prom command.
@@ -55,20 +55,18 @@ extern int serial_console;
void
prom_cmdline(void)
{
- extern void kernel_enter_debugger(void);
extern void install_obp_ticker(void);
extern void install_linux_ticker(void);
unsigned long flags;
-
- kernel_enter_debugger();
+
if(!serial_console && prom_palette)
prom_palette (1);
- install_obp_ticker();
spin_lock_irqsave(&prom_lock, flags);
+ install_obp_ticker();
(*(romvec->pv_abort))();
restore_current();
- spin_unlock_irqrestore(&prom_lock, flags);
install_linux_ticker();
+ spin_unlock_irqrestore(&prom_lock, flags);
#ifdef CONFIG_SUN_AUXIO
TURN_ON_LED;
#endif
diff --git a/arch/sparc64/defconfig b/arch/sparc64/defconfig
index d310bc37154f..d2fac836318d 100644
--- a/arch/sparc64/defconfig
+++ b/arch/sparc64/defconfig
@@ -204,6 +204,8 @@ CONFIG_BLK_DEV_IDE=y
#
# Please see Documentation/ide.txt for help/info on IDE drives
#
+# CONFIG_BLK_DEV_HD_IDE is not set
+# CONFIG_BLK_DEV_HD is not set
CONFIG_BLK_DEV_IDEDISK=y
# CONFIG_IDEDISK_MULTI_MODE is not set
# CONFIG_IDEDISK_STROKE is not set
@@ -218,7 +220,7 @@ CONFIG_BLK_DEV_IDEDISK=y
# CONFIG_BLK_DEV_TIVO is not set
# CONFIG_BLK_DEV_IDECS is not set
CONFIG_BLK_DEV_IDECD=y
-# CONFIG_BLK_DEV_IDETAPE is not set
+# CONFIG_BLK_DEV_IDECD_BAILOUT is not set
# CONFIG_BLK_DEV_IDEFLOPPY is not set
# CONFIG_BLK_DEV_IDESCSI is not set
# CONFIG_IDE_TASK_IOCTL is not set
@@ -229,8 +231,8 @@ CONFIG_BLK_DEV_IDECD=y
# CONFIG_BLK_DEV_CMD640 is not set
# CONFIG_BLK_DEV_CMD640_ENHANCED is not set
# CONFIG_BLK_DEV_ISAPNP is not set
-# CONFIG_BLK_DEV_RZ1000 is not set
CONFIG_BLK_DEV_IDEPCI=y
+# CONFIG_BLK_DEV_GENERIC is not set
# CONFIG_IDEPCI_SHARE_IRQ is not set
CONFIG_BLK_DEV_IDEDMA_PCI=y
# CONFIG_BLK_DEV_OFFBOARD is not set
@@ -239,29 +241,29 @@ CONFIG_IDEDMA_PCI_AUTO=y
CONFIG_IDEDMA_ONLYDISK=y
CONFIG_BLK_DEV_IDEDMA=y
# CONFIG_IDEDMA_PCI_WIP is not set
-# CONFIG_BLK_DEV_IDEDMA_TIMEOUT is not set
# CONFIG_IDEDMA_NEW_DRIVE_LISTINGS is not set
+CONFIG_BLK_DEV_ADMA=y
# CONFIG_BLK_DEV_AEC62XX is not set
-# CONFIG_AEC62XX_TUNING is not set
CONFIG_BLK_DEV_ALI15X3=y
# CONFIG_WDC_ALI15X3 is not set
# CONFIG_BLK_DEV_AMD74XX is not set
# CONFIG_AMD74XX_OVERRIDE is not set
CONFIG_BLK_DEV_CMD64X=y
-# CONFIG_BLK_DEV_CMD680 is not set
# CONFIG_BLK_DEV_CY82C693 is not set
# CONFIG_BLK_DEV_CS5530 is not set
# CONFIG_BLK_DEV_HPT34X is not set
# CONFIG_HPT34X_AUTODMA is not set
# CONFIG_BLK_DEV_HPT366 is not set
+# CONFIG_BLK_DEV_NFORCE is not set
CONFIG_BLK_DEV_NS87415=y
# CONFIG_BLK_DEV_OPTI621 is not set
-# CONFIG_BLK_DEV_ADMA100 is not set
-# CONFIG_BLK_DEV_PDC202XX is not set
+# CONFIG_BLK_DEV_PDC202XX_OLD is not set
# CONFIG_PDC202XX_BURST is not set
+# CONFIG_BLK_DEV_PDC202XX_NEW is not set
# CONFIG_PDC202XX_FORCE is not set
# CONFIG_BLK_DEV_RZ1000 is not set
# CONFIG_BLK_DEV_SVWKS is not set
+# CONFIG_BLK_DEV_SIIMAGE is not set
# CONFIG_BLK_DEV_SIS5513 is not set
# CONFIG_BLK_DEV_SLC90E66 is not set
# CONFIG_BLK_DEV_TRM290 is not set
@@ -954,7 +956,7 @@ CONFIG_USB_AUERSWALD=m
CONFIG_USB_RIO500=m
# CONFIG_USB_BRLVGER is not set
CONFIG_USB_LCD=m
-CONFIG_USB_SPEEDTOUCH=m
+# CONFIG_USB_SPEEDTOUCH is not set
#
# Bluetooth support
diff --git a/arch/sparc64/kernel/entry.S b/arch/sparc64/kernel/entry.S
index 1a7f7354d117..0751c54ea8cb 100644
--- a/arch/sparc64/kernel/entry.S
+++ b/arch/sparc64/kernel/entry.S
@@ -1795,69 +1795,3 @@ __flushw_user:
restore %g0, %g0, %g0
2: retl
nop
-
-/* This need not obtain the xtime_lock as it is coded in
- * an implicitly SMP safe way already.
- */
- .align 64
- .globl do_gettimeofday
-do_gettimeofday: /* %o0 = timevalp */
- /* Load doubles must be used on xtime so that what we get
- * is guarenteed to be atomic, this is why we can run this
- * with interrupts on full blast. Don't touch this... -DaveM
- *
- * Note with time_t changes to the timeval type, I must now use
- * nucleus atomic quad 128-bit loads.
- *
- * If xtime was stored recently, I've seen crap from the
- * quad load on Cheetah. Putting a membar SYNC before
- * the quad load seems to make the problem go away. -DaveM
- * (we should nop out workarounds like this on spitfire)
- */
- sethi %hi(timer_tick_offset), %g3
- sethi %hi(xtime), %g2
- sethi %hi(timer_tick_compare), %g1
- ldx [%g3 + %lo(timer_tick_offset)], %g3
- or %g2, %lo(xtime), %g2
- or %g1, %lo(timer_tick_compare), %g1
-1: membar #Sync
- ldda [%g2] ASI_NUCLEUS_QUAD_LDD, %o4
- BRANCH_IF_ANY_CHEETAH(o2,o1,2f)
- ba,pt %xcc, 3f
- rd %tick, %o1
-2: ba,pt %xcc, 3f
- rd %asr24, %o1
-3: ldx [%g1], %g7
- membar #Sync
- ldda [%g2] ASI_NUCLEUS_QUAD_LDD, %o2
- xor %o4, %o2, %o2
- xor %o5, %o3, %o3
- orcc %o2, %o3, %g0
- bne,pn %xcc, 1b
- sethi %hi(wall_jiffies), %o2
- sethi %hi(jiffies), %o3
- ldx [%o2 + %lo(wall_jiffies)], %o2
- ldx [%o3 + %lo(jiffies)], %o3
- sub %o3, %o2, %o2
- sethi %hi(timer_ticks_per_usec_quotient), %o3
- add %g3, %o1, %o1
- ldx [%o3 + %lo(timer_ticks_per_usec_quotient)], %o3
- sub %o1, %g7, %o1
- mulx %o3, %o1, %o1
- brz,pt %o2, 1f
- srlx %o1, 32, %o1
- sethi %hi(10000), %g2
- or %g2, %lo(10000), %g2
- add %o1, %g2, %o1
-1: sethi %hi(1000000), %o2
- srlx %o5, 32, %o5
- or %o2, %lo(1000000), %o2
- add %o5, %o1, %o5
- cmp %o5, %o2
- bl,a,pn %xcc, 1f
- stx %o4, [%o0 + 0x0]
- add %o4, 0x1, %o4
- sub %o5, %o2, %o5
- stx %o4, [%o0 + 0x0]
-1: retl
- st %o5, [%o0 + 0x8]
diff --git a/arch/sparc64/kernel/init_task.c b/arch/sparc64/kernel/init_task.c
index 1def381802c6..08a63433120b 100644
--- a/arch/sparc64/kernel/init_task.c
+++ b/arch/sparc64/kernel/init_task.c
@@ -8,7 +8,7 @@
static struct fs_struct init_fs = INIT_FS;
static struct files_struct init_files = INIT_FILES;
-static struct signal_struct init_signals = INIT_SIGNALS;
+static struct signal_struct init_signals = INIT_SIGNALS(init_signals);
struct mm_struct init_mm = INIT_MM(init_mm);
/* .text section in head.S is aligned at 2 page boundry and this gets linked
diff --git a/arch/sparc64/kernel/pci.c b/arch/sparc64/kernel/pci.c
index ef5c0f604910..1a2f15996a2e 100644
--- a/arch/sparc64/kernel/pci.c
+++ b/arch/sparc64/kernel/pci.c
@@ -365,7 +365,7 @@ void pcibios_align_resource(void *data, struct resource *res,
{
}
-int pcibios_enable_device(struct pci_dev *pdev)
+int pcibios_enable_device(struct pci_dev *pdev, int mask)
{
return 0;
}
diff --git a/arch/sparc64/kernel/power.c b/arch/sparc64/kernel/power.c
index 627083abd1cf..9aee3eb553c2 100644
--- a/arch/sparc64/kernel/power.c
+++ b/arch/sparc64/kernel/power.c
@@ -11,6 +11,7 @@
#include <linux/signal.h>
#include <linux/delay.h>
+#include <asm/system.h>
#include <asm/ebus.h>
#define __KERNEL_SYSCALLS__
@@ -37,8 +38,6 @@ extern void machine_halt(void);
extern void machine_alt_power_off(void);
static void (*poweroff_method)(void) = machine_alt_power_off;
-extern int serial_console;
-
void machine_power_off(void)
{
if (!serial_console) {
diff --git a/arch/sparc64/kernel/process.c b/arch/sparc64/kernel/process.c
index ab54ef260099..d2cac7fe44ca 100644
--- a/arch/sparc64/kernel/process.c
+++ b/arch/sparc64/kernel/process.c
@@ -110,7 +110,6 @@ int cpu_idle(void)
extern char reboot_command [];
extern void (*prom_palette)(int);
-extern int serial_console;
extern void (*prom_keyboard)(void);
void machine_halt(void)
diff --git a/arch/sparc64/kernel/setup.c b/arch/sparc64/kernel/setup.c
index f898042c2cb3..c6a4e8309ca8 100644
--- a/arch/sparc64/kernel/setup.c
+++ b/arch/sparc64/kernel/setup.c
@@ -314,12 +314,9 @@ int prom_callback(long *args)
return 0;
}
-extern void rs_kgdb_hook(int tty_num); /* sparc/serial.c */
-
unsigned int boot_flags = 0;
#define BOOTME_DEBUG 0x1
#define BOOTME_SINGLE 0x2
-#define BOOTME_KGDB 0x4
static int console_fb __initdata = 0;
@@ -389,26 +386,6 @@ static void __init boot_flags_init(char *commands)
commands++;
while (*commands && *commands != ' ')
process_switch(*commands++);
- } else if (strlen(commands) >= 9
- && !strncmp(commands, "kgdb=tty", 8)) {
- boot_flags |= BOOTME_KGDB;
- switch (commands[8]) {
-#ifdef CONFIG_SUN_SERIAL
- case 'a':
- rs_kgdb_hook(0);
- prom_printf("KGDB: Using serial line /dev/ttya.\n");
- break;
- case 'b':
- rs_kgdb_hook(1);
- prom_printf("KGDB: Using serial line /dev/ttyb.\n");
- break;
-#endif
- default:
- printk("KGDB: Unknown tty line.\n");
- boot_flags &= ~BOOTME_KGDB;
- break;
- }
- commands += 9;
} else {
if (!strncmp(commands, "console=", 8)) {
commands += 8;
@@ -484,7 +461,6 @@ extern void paging_init(void);
void __init setup_arch(char **cmdline_p)
{
- extern int serial_console; /* in console.c, of course */
unsigned long highest_paddr;
int i;
@@ -568,7 +544,6 @@ void __init setup_arch(char **cmdline_p)
}
#endif
-#ifdef CONFIG_SUN_SERIAL
switch (console_fb) {
case 0: /* Let's get our io devices from prom */
{
@@ -597,10 +572,7 @@ void __init setup_arch(char **cmdline_p)
case 3: /* Force ttyb as console */
serial_console = 2;
break;
- }
-#else
- serial_console = 0;
-#endif
+ };
if (serial_console)
conswitchp = NULL;
diff --git a/arch/sparc64/kernel/signal.c b/arch/sparc64/kernel/signal.c
index 9cc20dc19033..84e5344fee22 100644
--- a/arch/sparc64/kernel/signal.c
+++ b/arch/sparc64/kernel/signal.c
@@ -36,11 +36,6 @@
static int do_signal(sigset_t *oldset, struct pt_regs * regs,
unsigned long orig_o0, int ret_from_syscall);
-/* This turned off for production... */
-/* #define DEBUG_SIGNALS 1 */
-/* #define DEBUG_SIGNALS_TRACE 1 */
-/* #define DEBUG_SIGNALS_MAPS 1 */
-
int copy_siginfo_to_user(siginfo_t *to, siginfo_t *from)
{
if (!access_ok (VERIFY_WRITE, to, sizeof(siginfo_t)))
@@ -535,13 +530,8 @@ setup_rt_frame(struct k_sigaction *ka, struct pt_regs *regs,
if (invalid_frame_pointer (sf, sigframe_size))
goto sigill;
- if (get_thread_wsaved() != 0) {
-#ifdef DEBUG_SIGNALS
- printk ("%s[%d]: Invalid user stack frame for "
- "signal delivery.\n", current->comm, current->pid);
-#endif
+ if (get_thread_wsaved() != 0)
goto sigill;
- }
/* 2. Save the current process state */
err = copy_to_user(&sf->regs, regs, sizeof (*regs));
@@ -631,62 +621,6 @@ static inline void syscall_restart(unsigned long orig_i0, struct pt_regs *regs,
}
}
-#ifdef DEBUG_SIGNALS_MAPS
-
-#define MAPS_LINE_FORMAT "%016lx-%016lx %s %016lx %02x:%02x %lu "
-
-static inline void read_maps (void)
-{
- struct vm_area_struct * map, * next;
- char * buffer;
- ssize_t i;
-
- buffer = (char*)__get_free_page(GFP_KERNEL);
- if (!buffer)
- return;
-
- for (map = current->mm->mmap ; map ; map = next ) {
- /* produce the next line */
- char *line;
- char str[5], *cp = str;
- int flags;
- dev_t dev;
- unsigned long ino;
-
- /*
- * Get the next vma now (but it won't be used if we sleep).
- */
- next = map->vm_next;
- flags = map->vm_flags;
-
- *cp++ = flags & VM_READ ? 'r' : '-';
- *cp++ = flags & VM_WRITE ? 'w' : '-';
- *cp++ = flags & VM_EXEC ? 'x' : '-';
- *cp++ = flags & VM_MAYSHARE ? 's' : 'p';
- *cp++ = 0;
-
- dev = 0;
- ino = 0;
- if (map->vm_file != NULL) {
- dev = map->vm_file->f_dentry->d_inode->i_dev;
- ino = map->vm_file->f_dentry->d_inode->i_ino;
- line = d_path(map->vm_file->f_dentry,
- map->vm_file->f_vfsmnt,
- buffer, PAGE_SIZE);
- }
- printk(MAPS_LINE_FORMAT, map->vm_start, map->vm_end, str, map->vm_pgoff << PAGE_SHIFT,
- MAJOR(dev), MINOR(dev), ino);
- if (map->vm_file != NULL)
- printk("%s\n", line);
- else
- printk("\n");
- }
- free_page((unsigned long)buffer);
- return;
-}
-
-#endif
-
/* Note that 'init' is a special process: it doesn't get signals it doesn't
* want to handle. Thus you cannot kill init even with a SIGKILL even by
* mistake.
@@ -694,7 +628,6 @@ static inline void read_maps (void)
static int do_signal(sigset_t *oldset, struct pt_regs * regs,
unsigned long orig_i0, int restart_syscall)
{
- unsigned long signr;
siginfo_t info;
struct k_sigaction *ka;
@@ -709,9 +642,21 @@ static int do_signal(sigset_t *oldset, struct pt_regs * regs,
}
#endif
for (;;) {
- spin_lock_irq(&current->sigmask_lock);
- signr = dequeue_signal(&current->blocked, &info);
- spin_unlock_irq(&current->sigmask_lock);
+ sigset_t *mask = &current->blocked;
+ unsigned long signr = 0;
+
+ local_irq_disable();
+ if (current->sig->shared_pending.head) {
+ spin_lock(&current->sig->siglock);
+ signr = dequeue_signal(&current->sig->shared_pending, mask, &info);
+ spin_unlock(&current->sig->siglock);
+ }
+ if (!signr) {
+ spin_lock(&current->sigmask_lock);
+ signr = dequeue_signal(&current->pending, mask, &info);
+ spin_unlock(&current->sigmask_lock);
+ }
+ local_irq_enable();
if (!signr)
break;
@@ -732,7 +677,7 @@ static int do_signal(sigset_t *oldset, struct pt_regs * regs,
}
current->exit_code = signr;
- current->state = TASK_STOPPED;
+ set_current_state(TASK_STOPPED);
notify_parent(current, SIGCHLD);
schedule();
if (!(signr = current->exit_code))
@@ -787,8 +732,7 @@ static int do_signal(sigset_t *oldset, struct pt_regs * regs,
case SIGSTOP: {
struct signal_struct *sig;
-
- current->state = TASK_STOPPED;
+ set_current_state(TASK_STOPPED);
current->exit_code = signr;
sig = current->parent->sig;
if (sig && !(sig->action[SIGCHLD-1].sa.sa_flags &
@@ -803,29 +747,8 @@ static int do_signal(sigset_t *oldset, struct pt_regs * regs,
case SIGBUS: case SIGSYS: case SIGXCPU: case SIGXFSZ:
if (do_coredump(signr, regs))
exit_code |= 0x80;
-#ifdef DEBUG_SIGNALS
- /* Very useful to debug the dynamic linker */
- printk ("Sig %d going...\n", (int)signr);
- show_regs (regs);
-#ifdef DEBUG_SIGNALS_TRACE
- {
- struct reg_window *rw = (struct reg_window *)(regs->u_regs[UREG_FP] + STACK_BIAS);
- unsigned long ins[8];
-
- while (rw &&
- !(((unsigned long) rw) & 0x3)) {
- copy_from_user(ins, &rw->ins[0], sizeof(ins));
- printk("Caller[%016lx](%016lx,%016lx,%016lx,%016lx,%016lx,%016lx)\n", ins[7], ins[0], ins[1], ins[2], ins[3], ins[4], ins[5]);
- rw = (struct reg_window *)(unsigned long)(ins[6] + STACK_BIAS);
- }
- }
-#endif
-#ifdef DEBUG_SIGNALS_MAPS
- printk("Maps:\n");
- read_maps();
-#endif
-#endif
- /* fall through */
+ /* FALLTHRU */
+
default:
sig_exit(signr, exit_code, &info);
/* NOT REACHED */
diff --git a/arch/sparc64/kernel/signal32.c b/arch/sparc64/kernel/signal32.c
index 47246310aa15..0a373040d7ad 100644
--- a/arch/sparc64/kernel/signal32.c
+++ b/arch/sparc64/kernel/signal32.c
@@ -34,12 +34,6 @@
int do_signal32(sigset_t *oldset, struct pt_regs *regs,
unsigned long orig_o0, int ret_from_syscall);
-/* This turned off for production... */
-/* #define DEBUG_SIGNALS 1 */
-/* #define DEBUG_SIGNALS_TRACE 1 */
-/* #define DEBUG_SIGNALS_MAPS 1 */
-/* #define DEBUG_SIGNALS_TLB 1 */
-
/* Signal frames: the original one (compatible with SunOS):
*
* Set up a signal frame... Make the stack look the way SunOS
@@ -525,12 +519,6 @@ setup_frame32(struct sigaction *sa, struct pt_regs *regs, int signr, sigset_t *o
sframep = (struct signal_sframe32 *)get_sigframe(sa, regs, SF_ALIGNEDSZ);
if (invalid_frame_pointer (sframep, sizeof(*sframep))){
-#ifdef DEBUG_SIGNALS /* fills up the console logs during crashme runs, yuck... */
- printk("%s [%d]: User has trashed signal stack\n",
- current->comm, current->pid);
- printk("Sigstack ptr %p handler at pc<%016lx> for sig<%d>\n",
- sframep, pc, signr);
-#endif
/* Don't change signal code and address, so that
* post mortem debuggers can have a look.
*/
@@ -696,21 +684,11 @@ static inline void new_setup_frame32(struct k_sigaction *ka, struct pt_regs *reg
sf = (struct new_signal_frame32 *)get_sigframe(&ka->sa, regs, sigframe_size);
- if (invalid_frame_pointer (sf, sigframe_size)) {
-#ifdef DEBUG_SIGNALS
- printk("new_setup_frame32(%s:%d): invalid_frame_pointer(%p, %d)\n",
- current->comm, current->pid, sf, sigframe_size);
-#endif
+ if (invalid_frame_pointer (sf, sigframe_size))
goto sigill;
- }
- if (get_thread_wsaved() != 0) {
-#ifdef DEBUG_SIGNALS
- printk ("%s[%d]: Invalid user stack frame for "
- "signal delivery.\n", current->comm, current->pid);
-#endif
+ if (get_thread_wsaved() != 0)
goto sigill;
- }
/* 2. Save the current process state */
if (test_thread_flag(TIF_32BIT)) {
@@ -835,12 +813,8 @@ setup_svr4_frame32(struct sigaction *sa, unsigned long pc, unsigned long npc,
regs->u_regs[UREG_FP] &= 0x00000000ffffffffUL;
sfp = (svr4_signal_frame_t *) get_sigframe(sa, regs, REGWIN_SZ + SVR4_SF_ALIGNED);
- if (invalid_frame_pointer (sfp, sizeof (*sfp))){
-#ifdef DEBUG_SIGNALS
- printk ("Invalid stack frame\n");
-#endif
+ if (invalid_frame_pointer (sfp, sizeof (*sfp)))
do_exit(SIGILL);
- }
/* Start with a clean frame pointer and fill it */
err = clear_user(sfp, sizeof (*sfp));
@@ -939,9 +913,6 @@ setup_svr4_frame32(struct sigaction *sa, unsigned long pc, unsigned long npc,
regs->tnpc &= 0xffffffff;
}
-#ifdef DEBUG_SIGNALS
- printk ("Solaris-frame: %x %x\n", (int) regs->tpc, (int) regs->tnpc);
-#endif
/* Arguments passed to signal handler */
if (regs->u_regs [14]){
struct reg_window32 *rw = (struct reg_window32 *)
@@ -975,12 +946,9 @@ svr4_getcontext(svr4_ucontext_t *uc, struct pt_regs *regs)
synchronize_user_stack();
save_and_clear_fpu();
- if (get_thread_wsaved()) {
-#ifdef DEBUG_SIGNALS
- printk ("Uh oh, w_saved is not zero (%d)\n", (int) get_thread_wsaved());
-#endif
+ if (get_thread_wsaved())
do_exit (SIGSEGV);
- }
+
err = clear_user(uc, sizeof (*uc));
/* Setup convenience variables */
@@ -1047,12 +1015,9 @@ asmlinkage int svr4_setcontext(svr4_ucontext_t *c, struct pt_regs *regs)
*/
flush_user_windows();
- if (get_thread_wsaved()) {
-#ifdef DEBUG_SIGNALS
- printk ("Uh oh, w_saved is: 0x%x\n", get_thread_wsaved());
-#endif
+ if (get_thread_wsaved())
goto sigsegv;
- }
+
if (((unsigned long) c) & 3){
printk ("Unaligned structure passed\n");
goto sigsegv;
@@ -1067,12 +1032,8 @@ asmlinkage int svr4_setcontext(svr4_ucontext_t *c, struct pt_regs *regs)
gr = &c->mcontext.greg;
err = __get_user(pc, &((*gr)[SVR4_PC]));
err |= __get_user(npc, &((*gr)[SVR4_NPC]));
- if ((pc | npc) & 3) {
-#ifdef DEBUG_SIGNALS
- printk ("setcontext, PC or nPC were bogus\n");
-#endif
+ if ((pc | npc) & 3)
goto sigsegv;
- }
/* Retrieve information from passed ucontext */
/* note that nPC is ored a 1, this is used to inform entry.S */
@@ -1148,21 +1109,11 @@ static inline void setup_rt_frame32(struct k_sigaction *ka, struct pt_regs *regs
sf = (struct rt_signal_frame32 *)get_sigframe(&ka->sa, regs, sigframe_size);
- if (invalid_frame_pointer (sf, sigframe_size)) {
-#ifdef DEBUG_SIGNALS
- printk("rt_setup_frame32(%s:%d): invalid_frame_pointer(%p, %d)\n",
- current->comm, current->pid, sf, sigframe_size);
-#endif
+ if (invalid_frame_pointer (sf, sigframe_size))
goto sigill;
- }
- if (get_thread_wsaved() != 0) {
-#ifdef DEBUG_SIGNALS
- printk ("%s[%d]: Invalid user stack frame for "
- "signal delivery.\n", current->comm, current->pid);
-#endif
+ if (get_thread_wsaved() != 0)
goto sigill;
- }
/* 2. Save the current process state */
if (test_thread_flag(TIF_32BIT)) {
@@ -1317,62 +1268,6 @@ static inline void syscall_restart32(unsigned long orig_i0, struct pt_regs *regs
}
}
-#ifdef DEBUG_SIGNALS_MAPS
-
-#define MAPS_LINE_FORMAT "%016lx-%016lx %s %016lx %02x:%02x %lu "
-
-static inline void read_maps (void)
-{
- struct vm_area_struct * map, * next;
- char * buffer;
- ssize_t i;
-
- buffer = (char*)__get_free_page(GFP_KERNEL);
- if (!buffer)
- return;
-
- for (map = current->mm->mmap ; map ; map = next ) {
- /* produce the next line */
- char *line;
- char str[5], *cp = str;
- int flags;
- dev_t dev;
- unsigned long ino;
-
- /*
- * Get the next vma now (but it won't be used if we sleep).
- */
- next = map->vm_next;
- flags = map->vm_flags;
-
- *cp++ = flags & VM_READ ? 'r' : '-';
- *cp++ = flags & VM_WRITE ? 'w' : '-';
- *cp++ = flags & VM_EXEC ? 'x' : '-';
- *cp++ = flags & VM_MAYSHARE ? 's' : 'p';
- *cp++ = 0;
-
- dev = 0;
- ino = 0;
- if (map->vm_file != NULL) {
- dev = map->vm_file->f_dentry->d_inode->i_dev;
- ino = map->vm_file->f_dentry->d_inode->i_ino;
- line = d_path(map->vm_file->f_dentry,
- map->vm_file->f_vfsmnt,
- buffer, PAGE_SIZE);
- }
- printk(MAPS_LINE_FORMAT, map->vm_start, map->vm_end, str, map->vm_pgoff << PAGE_SHIFT,
- MAJOR(dev), MINOR(dev), ino);
- if (map->vm_file != NULL)
- printk("%s\n", line);
- else
- printk("\n");
- }
- free_page((unsigned long)buffer);
- return;
-}
-
-#endif
-
/* Note that 'init' is a special process: it doesn't get signals it doesn't
* want to handle. Thus you cannot kill init even with a SIGKILL even by
* mistake.
@@ -1380,16 +1275,27 @@ static inline void read_maps (void)
int do_signal32(sigset_t *oldset, struct pt_regs * regs,
unsigned long orig_i0, int restart_syscall)
{
- unsigned long signr;
struct k_sigaction *ka;
siginfo_t info;
int svr4_signal = current->personality == PER_SVR4;
for (;;) {
- spin_lock_irq(&current->sigmask_lock);
- signr = dequeue_signal(&current->blocked, &info);
- spin_unlock_irq(&current->sigmask_lock);
+ sigset_t *mask = &current->blocked;
+ unsigned long signr = 0;
+
+ local_irq_disable();
+ if (current->sig->shared_pending.head) {
+ spin_lock(&current->sig->siglock);
+ signr = dequeue_signal(&current->sig->shared_pending, mask, &info);
+ spin_unlock(&current->sig->siglock);
+ }
+ if (!signr) {
+ spin_lock(&current->sigmask_lock);
+ signr = dequeue_signal(&current->pending, mask, &info);
+ spin_unlock(&current->sigmask_lock);
+ }
+ local_irq_enable();
if (!signr)
break;
@@ -1410,7 +1316,7 @@ int do_signal32(sigset_t *oldset, struct pt_regs * regs,
}
current->exit_code = signr;
- current->state = TASK_STOPPED;
+ set_current_state(TASK_STOPPED);
notify_parent(current, SIGCHLD);
schedule();
if (!(signr = current->exit_code))
@@ -1465,8 +1371,7 @@ int do_signal32(sigset_t *oldset, struct pt_regs * regs,
case SIGSTOP: {
struct signal_struct *sig;
-
- current->state = TASK_STOPPED;
+ set_current_state(TASK_STOPPED);
current->exit_code = signr;
sig = current->parent->sig;
if (sig && !(sig->action[SIGCHLD-1].sa.sa_flags &
@@ -1480,40 +1385,8 @@ int do_signal32(sigset_t *oldset, struct pt_regs * regs,
case SIGBUS: case SIGSYS: case SIGXCPU: case SIGXFSZ:
if (do_coredump(signr, regs))
exit_code |= 0x80;
-#ifdef DEBUG_SIGNALS
- /* Very useful to debug dynamic linker problems */
- printk ("Sig %ld going for %s[%d]...\n", signr, current->comm, current->pid);
- /* On SMP we are only interested in the current
- * CPU's registers.
- */
- __show_regs (regs);
-#ifdef DEBUG_SIGNALS_TLB
- do {
- extern void sparc_ultra_dump_itlb(void);
- extern void sparc_ultra_dump_dtlb(void);
- sparc_ultra_dump_dtlb();
- sparc_ultra_dump_itlb();
- } while (0);
-#endif
-#ifdef DEBUG_SIGNALS_TRACE
- {
- struct reg_window32 *rw = (struct reg_window32 *)(regs->u_regs[UREG_FP] & 0xffffffff);
- unsigned int ins[8];
-
- while (rw &&
- !(((unsigned long) rw) & 0x3)) {
- copy_from_user(ins, &rw->ins[0], sizeof(ins));
- printk("Caller[%08x](%08x,%08x,%08x,%08x,%08x,%08x)\n", ins[7], ins[0], ins[1], ins[2], ins[3], ins[4], ins[5]);
- rw = (struct reg_window32 *)(unsigned long)ins[6];
- }
- }
-#endif
-#ifdef DEBUG_SIGNALS_MAPS
- printk("Maps:\n");
- read_maps();
-#endif
-#endif
- /* fall through */
+ /* FALLTHRU */
+
default:
sig_exit(signr, exit_code, &info);
/* NOT REACHED */
diff --git a/arch/sparc64/kernel/sys_sparc32.c b/arch/sparc64/kernel/sys_sparc32.c
index 7be1895eedb3..764bdbdd4e32 100644
--- a/arch/sparc64/kernel/sys_sparc32.c
+++ b/arch/sparc64/kernel/sys_sparc32.c
@@ -1921,30 +1921,42 @@ sys32_rt_sigtimedwait(sigset_t32 *uthese, siginfo_t32 *uinfo,
return -EINVAL;
}
- spin_lock_irq(&current->sigmask_lock);
- sig = dequeue_signal(&these, &info);
+ spin_lock_irq(&current->sig->siglock);
+ spin_lock(&current->sigmask_lock);
+ sig = dequeue_signal(&current->sig->shared_pending, &these, &info);
+ if (!sig)
+ sig = dequeue_signal(&current->pending, &these, &info);
if (!sig) {
- /* None ready -- temporarily unblock those we're interested
- in so that we'll be awakened when they arrive. */
- sigset_t oldblocked = current->blocked;
- sigandsets(&current->blocked, &current->blocked, &these);
- recalc_sigpending();
- spin_unlock_irq(&current->sigmask_lock);
-
timeout = MAX_SCHEDULE_TIMEOUT;
if (uts)
timeout = (timespec_to_jiffies(&ts)
+ (ts.tv_sec || ts.tv_nsec));
- current->state = TASK_INTERRUPTIBLE;
- timeout = schedule_timeout(timeout);
-
- spin_lock_irq(&current->sigmask_lock);
- sig = dequeue_signal(&these, &info);
- current->blocked = oldblocked;
- recalc_sigpending();
+ if (timeout) {
+ /* None ready -- temporarily unblock those we're
+ * interested while we are sleeping in so that we'll
+ * be awakened when they arrive. */
+ current->real_blocked = current->blocked;
+ sigandsets(&current->blocked, &current->blocked, &these);
+ recalc_sigpending();
+ spin_unlock(&current->sigmask_lock);
+ spin_unlock_irq(&current->sig->siglock);
+
+ current->state = TASK_INTERRUPTIBLE;
+ timeout = schedule_timeout(timeout);
+
+ spin_lock_irq(&current->sig->siglock);
+ spin_lock(&current->sigmask_lock);
+ sig = dequeue_signal(&current->sig->shared_pending, &these, &info);
+ if (!sig)
+ sig = dequeue_signal(&current->pending, &these, &info);
+ current->blocked = current->real_blocked;
+ siginitset(&current->real_blocked, 0);
+ recalc_sigpending();
+ }
}
- spin_unlock_irq(&current->sigmask_lock);
+ spin_unlock(&current->sigmask_lock);
+ spin_unlock_irq(&current->sig->siglock);
if (sig) {
ret = sig;
diff --git a/arch/sparc64/kernel/systbls.S b/arch/sparc64/kernel/systbls.S
index af3513e58ae1..0aaced635a7d 100644
--- a/arch/sparc64/kernel/systbls.S
+++ b/arch/sparc64/kernel/systbls.S
@@ -56,7 +56,7 @@ sys_call_table32:
/*170*/ .word sys_lsetxattr, sys_fsetxattr, sys_getxattr, sys_lgetxattr, sys32_getdents
.word sys_setsid, sys_fchdir, sys_fgetxattr, sys_listxattr, sys_llistxattr
/*180*/ .word sys_flistxattr, sys_removexattr, sys_lremovexattr, sys32_sigpending, sys32_query_module
- .word sys_setpgid, sys_fremovexattr, sys_tkill, sys_nis_syscall, sparc64_newuname
+ .word sys_setpgid, sys_fremovexattr, sys_tkill, sys_exit_group, sparc64_newuname
/*190*/ .word sys32_init_module, sparc64_personality, sys_nis_syscall, sys_nis_syscall, sys_nis_syscall
.word sys_nis_syscall, sys_nis_syscall, sys_getppid, sys32_sigaction, sys_sgetmask
/*200*/ .word sys_ssetmask, sys_sigsuspend, sys32_newlstat, sys_uselib, old32_readdir
@@ -115,7 +115,7 @@ sys_call_table:
/*170*/ .word sys_lsetxattr, sys_fsetxattr, sys_getxattr, sys_lgetxattr, sys_getdents
.word sys_setsid, sys_fchdir, sys_fgetxattr, sys_listxattr, sys_llistxattr
/*180*/ .word sys_flistxattr, sys_removexattr, sys_lremovexattr, sys_nis_syscall, sys_query_module
- .word sys_setpgid, sys_fremovexattr, sys_tkill, sys_nis_syscall, sparc64_newuname
+ .word sys_setpgid, sys_fremovexattr, sys_tkill, sys_exit_group, sparc64_newuname
/*190*/ .word sys_init_module, sparc64_personality, sys_nis_syscall, sys_nis_syscall, sys_nis_syscall
.word sys_nis_syscall, sys_nis_syscall, sys_getppid, sys_nis_syscall, sys_sgetmask
/*200*/ .word sys_ssetmask, sys_nis_syscall, sys_newlstat, sys_uselib, sys_nis_syscall
diff --git a/arch/sparc64/kernel/time.c b/arch/sparc64/kernel/time.c
index bfeb62e5bac3..20f758eb9978 100644
--- a/arch/sparc64/kernel/time.c
+++ b/arch/sparc64/kernel/time.c
@@ -44,6 +44,8 @@ unsigned long mstk48t02_regs = 0UL;
unsigned long ds1287_regs = 0UL;
#endif
+extern unsigned long wall_jiffies;
+
u64 jiffies_64;
static unsigned long mstk48t08_regs = 0UL;
@@ -61,6 +63,8 @@ unsigned long timer_tick_offset;
unsigned long timer_tick_compare;
unsigned long timer_ticks_per_usec_quotient;
+#define TICK_SIZE (tick_nsec / 1000)
+
static __inline__ void timer_check_rtc(void)
{
/* last time the cmos clock got updated */
@@ -69,8 +73,8 @@ static __inline__ void timer_check_rtc(void)
/* Determine when to update the Mostek clock. */
if ((time_status & STA_UNSYNC) == 0 &&
xtime.tv_sec > last_rtc_update + 660 &&
- xtime.tv_usec >= 500000 - ((unsigned) tick) / 2 &&
- xtime.tv_usec <= 500000 + ((unsigned) tick) / 2) {
+ (xtime.tv_nsec / 1000) >= 500000 - ((unsigned) TICK_SIZE) / 2 &&
+ (xtime.tv_nsec / 1000) <= 500000 + ((unsigned) TICK_SIZE) / 2) {
if (set_rtc_mmss(xtime.tv_sec) == 0)
last_rtc_update = xtime.tv_sec;
else
@@ -390,7 +394,7 @@ static void __init set_system_time(void)
}
xtime.tv_sec = mktime(year, mon, day, hour, min, sec);
- xtime.tv_usec = 0;
+ xtime.tv_nsec = 0;
if (mregs) {
tmp = mostek_read(mregs + MOSTEK_CREG);
@@ -428,7 +432,7 @@ void __init clock_probe(void)
(unsigned int) (long) &unix_tod);
prom_feval(obp_gettod);
xtime.tv_sec = unix_tod;
- xtime.tv_usec = 0;
+ xtime.tv_nsec = 0;
return;
}
@@ -658,22 +662,58 @@ void do_settimeofday(struct timeval *tv)
return;
write_lock_irq(&xtime_lock);
-
+ /*
+ * This is revolting. We need to set "xtime" correctly. However, the
+ * value in this location is the value at the most recent update of
+ * wall time. Discover what correction gettimeofday() would have
+ * made, and then undo it!
+ */
tv->tv_usec -= do_gettimeoffset();
- if(tv->tv_usec < 0) {
+ tv->tv_usec -= (jiffies - wall_jiffies) * (1000000 / HZ);
+
+ while (tv->tv_usec < 0) {
tv->tv_usec += 1000000;
tv->tv_sec--;
}
- xtime = *tv;
+ xtime.tv_sec = tv->tv_sec;
+ xtime.tv_nsec = (tv->tv_usec * 1000);
time_adjust = 0; /* stop active adjtime() */
time_status |= STA_UNSYNC;
time_maxerror = NTP_PHASE_LIMIT;
time_esterror = NTP_PHASE_LIMIT;
-
write_unlock_irq(&xtime_lock);
}
+/* Ok, my cute asm atomicity trick doesn't work anymore.
+ * There are just too many variables that need to be protected
+ * now (both members of xtime, wall_jiffies, et al.)
+ */
+void do_gettimeofday(struct timeval *tv)
+{
+ unsigned long flags;
+ unsigned long usec, sec;
+
+ read_lock_irqsave(&xtime_lock, flags);
+ usec = do_gettimeoffset();
+ {
+ unsigned long lost = jiffies - wall_jiffies;
+ if (lost)
+ usec += lost * (1000000 / HZ);
+ }
+ sec = xtime.tv_sec;
+ usec += (xtime.tv_nsec / 1000);
+ read_unlock_irqrestore(&xtime_lock, flags);
+
+ while (usec >= 1000000) {
+ usec -= 1000000;
+ sec++;
+ }
+
+ tv->tv_sec = sec;
+ tv->tv_usec = usec;
+}
+
static int set_rtc_mmss(unsigned long nowtime)
{
int real_seconds, real_minutes, chip_minutes;
diff --git a/arch/sparc64/mm/init.c b/arch/sparc64/mm/init.c
index 68d33e579009..b3233175628b 100644
--- a/arch/sparc64/mm/init.c
+++ b/arch/sparc64/mm/init.c
@@ -1515,14 +1515,6 @@ void __init paging_init(void)
pages_avail = 0;
last_valid_pfn = end_pfn = bootmem_init(&pages_avail);
-#ifdef CONFIG_SUN_SERIAL
- /* This does not logically belong here, but we need to
- * call it at the moment we are able to use the bootmem
- * allocator.
- */
- sun_serial_setup();
-#endif
-
/* Inherit non-locked OBP mappings. */
inherit_prom_mappings();
diff --git a/arch/sparc64/prom/misc.c b/arch/sparc64/prom/misc.c
index 5a58b70944ab..7315aa68e963 100644
--- a/arch/sparc64/prom/misc.c
+++ b/arch/sparc64/prom/misc.c
@@ -14,6 +14,7 @@
#include <linux/delay.h>
#include <asm/openprom.h>
#include <asm/oplib.h>
+#include <asm/system.h>
/* Reset and reboot the machine with the command 'bcommand'. */
void prom_reboot(char *bcommand)
@@ -33,7 +34,6 @@ void prom_feval(char *fstring)
/* We want to do this more nicely some day. */
extern void (*prom_palette)(int);
-extern int serial_console;
#ifdef CONFIG_SMP
extern void smp_capture(void);
diff --git a/drivers/serial/sunsu.c b/drivers/serial/sunsu.c
index b7c46004d06b..68dab24849ef 100644
--- a/drivers/serial/sunsu.c
+++ b/drivers/serial/sunsu.c
@@ -34,6 +34,7 @@
#include <linux/serio.h>
#endif
#include <linux/init.h>
+#include <linux/delay.h>
#include <asm/io.h>
#include <asm/irq.h>
@@ -1019,6 +1020,8 @@ static void sunsu_autoconfig(struct uart_sunsu_port *up)
if (!up->port_node || !up->su_type)
return;
+ up->port.iotype = SERIAL_IO_MEM;
+
/*
* First we look for Ebus-bases su's
*/
diff --git a/drivers/serial/sunzilog.c b/drivers/serial/sunzilog.c
index f2c96c676842..6031aa921067 100644
--- a/drivers/serial/sunzilog.c
+++ b/drivers/serial/sunzilog.c
@@ -382,13 +382,6 @@ static void sunzilog_receive_chars(struct uart_sunzilog_port *up,
sun_do_break();
return;
}
-#ifndef CONFIG_SPARC64
- /* Look for kgdb 'stop' character. */
- if (ZS_IS_KGDB(up) && (ch == '\003')) {
- breakpoint();
- return;
- }
-#endif
/* A real serial line, record the character and status. */
*tty->flip.char_buf_ptr = ch;
@@ -1152,11 +1145,11 @@ static struct zilog_layout * __init get_zs_sun4u(int chip)
static struct zilog_layout * __init get_zs_sun4cmd(int chip)
{
struct linux_prom_irqs irq_info[2];
- unsigned long mapped_addr;
- int zsnode, chipid, cpunode;
+ unsigned long mapped_addr = 0;
+ int zsnode, chipid, cpunode, bbnode;
if (sparc_cpu_model == sun4d) {
- int bbnode, walk, no;
+ int walk, no;
zsnode = 0;
bbnode = 0;
@@ -1249,7 +1242,7 @@ static struct zilog_layout * __init get_zs_sun4cmd(int chip)
} else if (zilog_irq != irq_info[0].pri) {
prom_printf("SunZilog: Inconsistent IRQ layout for Zilog %d.\n",
chip);
- promt_halt();
+ prom_halt();
}
break;
}
@@ -1290,7 +1283,7 @@ static struct zilog_layout * __init get_zs(int chip)
zilog_irq = 12;
res.end = (res.start + (8 - 1));
res.flags = IORESOURCE_IO;
- return sbus_ioremap(&res, 0, 8, "SunZilog");
+ return (struct zilog_layout *) sbus_ioremap(&res, 0, 8, "SunZilog");
}
return get_zs_sun4cmd(chip);
@@ -1649,13 +1642,10 @@ static int __init sunzilog_init(void)
/* Sun4 Zilog setup is hard coded, no probing to do. */
if (sparc_cpu_model == sun4) {
NUM_SUNZILOG = 2;
- goto no_probe;
- }
-
- node = prom_getchild(prom_root_node);
- if (sparc_cpu_model == sun4d) {
+ } else if (sparc_cpu_model == sun4d) {
int bbnode;
+ node = prom_getchild(prom_root_node);
NUM_SUNZILOG = 0;
while (node &&
(node = prom_searchsiblings(node, "cpu-unit"))) {
@@ -1664,7 +1654,6 @@ static int __init sunzilog_init(void)
NUM_SUNZILOG += 2;
node = prom_getsibling(node);
}
- goto no_probe;
} else if (sparc_cpu_model == sun4u) {
int central_node;
@@ -1675,27 +1664,28 @@ static int __init sunzilog_init(void)
if (central_node != 0 && central_node != -1)
node = prom_searchsiblings(prom_getchild(central_node), "fhc");
else
- node = prom_searchsiblings(node, "sbus");
+ node = prom_searchsiblings(prom_getchild(prom_root_node), "sbus");
if (node != 0 && node != -1)
node = prom_getchild(node);
if (node == 0 || node == -1)
return -ENODEV;
+
+ node = prom_searchsiblings(node, "zs");
+ if (!node)
+ return -ENODEV;
+
+ NUM_SUNZILOG = 2;
} else {
+ node = prom_getchild(prom_root_node);
node = prom_searchsiblings(node, "obio");
if (node)
node = prom_getchild(node);
+ if (!node)
+ return -ENODEV;
+
NUM_SUNZILOG = 2;
- goto no_probe;
}
- node = prom_searchsiblings(node, "zs");
- if (!node)
- return -ENODEV;
-
- NUM_SUNZILOG = 2;
-
-no_probe:
-
sunzilog_alloc_tables();
sunzilog_ports_init();
diff --git a/include/asm-sparc/hardirq.h b/include/asm-sparc/hardirq.h
index f77ee7e415cf..8057289e0f3e 100644
--- a/include/asm-sparc/hardirq.h
+++ b/include/asm-sparc/hardirq.h
@@ -39,8 +39,8 @@ typedef struct {
* - ( bit 26 is the PREEMPT_ACTIVE flag. )
*
* PREEMPT_MASK: 0x000000ff
- * HARDIRQ_MASK: 0x0000ff00
- * SOFTIRQ_MASK: 0x00ff0000
+ * SOFTIRQ_MASK: 0x0000ff00
+ * HARDIRQ_MASK: 0x00ff0000
*/
#define PREEMPT_BITS 8
@@ -90,8 +90,10 @@ typedef struct {
#define irq_enter() (preempt_count() += HARDIRQ_OFFSET)
#if CONFIG_PREEMPT
+# define in_atomic() (preempt_count() != kernel_locked())
# define IRQ_EXIT_OFFSET (HARDIRQ_OFFSET-1)
#else
+# define in_atomic() (preempt_count() != 0)
# define IRQ_EXIT_OFFSET HARDIRQ_OFFSET
#endif
#define irq_exit() \
@@ -121,7 +123,7 @@ do { \
#ifndef CONFIG_SMP
-#define synchronize_irq() barrier()
+#define synchronize_irq(irq) barrier()
#else /* (CONFIG_SMP) */
diff --git a/include/asm-sparc/highmem.h b/include/asm-sparc/highmem.h
index 2ba438ea6111..e9bf972142f8 100644
--- a/include/asm-sparc/highmem.h
+++ b/include/asm-sparc/highmem.h
@@ -148,6 +148,19 @@ static inline void kunmap_atomic(void *kvaddr, enum km_type type)
dec_preempt_count();
}
+static inline struct page *kmap_atomic_to_page(void *ptr)
+{
+ unsigned long idx, vaddr = (unsigned long)ptr;
+ pte_t *pte;
+
+ if (vaddr < FIX_KMAP_BEGIN)
+ return virt_to_page(ptr);
+
+ idx = ((vaddr - FIX_KMAP_BEGIN) >> PAGE_SHIFT);
+ pte = kmap_pte + idx;
+ return pte_page(*pte);
+}
+
#endif /* __KERNEL__ */
#endif /* _ASM_HIGHMEM_H */
diff --git a/include/asm-sparc/ide.h b/include/asm-sparc/ide.h
index b2b585d3ca35..c8a97fd7ef6a 100644
--- a/include/asm-sparc/ide.h
+++ b/include/asm-sparc/ide.h
@@ -81,92 +81,30 @@ static __inline__ void ide_init_default_hwifs(void)
* The following are not needed for the non-m68k ports
*/
#define ide_ack_intr(hwif) (1)
-#define ide_fix_driveid(id) do {} while (0)
#define ide_release_lock(lock) do {} while (0)
#define ide_get_lock(lock, hdlr, data) do {} while (0)
-/* From m68k code... */
-
-#ifdef insl
-#undef insl
-#endif
-#ifdef outsl
-#undef outsl
-#endif
-#ifdef insw
-#undef insw
-#endif
-#ifdef outsw
-#undef outsw
-#endif
-
-#define insl(data_reg, buffer, wcount) insw(data_reg, buffer, (wcount)<<1)
-#define outsl(data_reg, buffer, wcount) outsw(data_reg, buffer, (wcount)<<1)
-
-#define insw(port, buf, nr) ide_insw((port), (buf), (nr))
-#define outsw(port, buf, nr) ide_outsw((port), (buf), (nr))
-
-static __inline__ void ide_insw(unsigned long port,
- void *dst,
- unsigned long count)
-{
- volatile unsigned short *data_port;
- /* unsigned long end = (unsigned long)dst + (count << 1); */ /* P3 */
- u16 *ps = dst;
- u32 *pi;
-
- data_port = (volatile unsigned short *)port;
-
- if(((unsigned long)ps) & 0x2) {
- *ps++ = *data_port;
- count--;
- }
- pi = (u32 *)ps;
- while(count >= 2) {
- u32 w;
-
- w = (*data_port) << 16;
- w |= (*data_port);
- *pi++ = w;
- count -= 2;
- }
- ps = (u16 *)pi;
- if(count)
- *ps++ = *data_port;
-
- /* __flush_dcache_range((unsigned long)dst, end); */ /* P3 see hme */
-}
-
-static __inline__ void ide_outsw(unsigned long port,
- const void *src,
- unsigned long count)
-{
- volatile unsigned short *data_port;
- /* unsigned long end = (unsigned long)src + (count << 1); */
- const u16 *ps = src;
- const u32 *pi;
-
- data_port = (volatile unsigned short *)port;
-
- if(((unsigned long)src) & 0x2) {
- *data_port = *ps++;
- count--;
- }
- pi = (const u32 *)ps;
- while(count >= 2) {
- u32 w;
-
- w = *pi++;
- *data_port = (w >> 16);
- *data_port = w;
- count -= 2;
- }
- ps = (const u16 *)pi;
- if(count)
- *data_port = *ps;
+/* XXX Known to be broken. Axboe will fix the problems this
+ * XXX has by making seperate IN/OUT macros for IDE_DATA
+ * XXX register and rest of IDE regs and also using
+ * XXX ide_ioreg_t instead of u32 for ports. -DaveM
+ */
- /* __flush_dcache_range((unsigned long)src, end); */ /* P3 see hme */
-}
+#define HAVE_ARCH_IN_BYTE
+#define IN_BYTE(p) (*((volatile u8 *)(p)))
+#define IN_WORD(p) (*((volatile u16 *)(p)))
+#define IN_LONG(p) (*((volatile u32 *)(p)))
+#define IN_BYTE_P IN_BYTE
+#define IN_WORD_P IN_WORD
+#define IN_LONG_P IN_LONG
+
+#define HAVE_ARCH_OUT_BYTE
+#define OUT_BYTE(b,p) ((*((volatile u8 *)(p))) = (b))
+#define OUT_WORD(w,p) ((*((volatile u16 *)(p))) = (w))
+#define OUT_LONG(l,p) ((*((volatile u32 *)(p))) = (l))
+#define OUT_BYTE_P OUT_BYTE
+#define OUT_WORD_P OUT_WORD
+#define OUT_LONG_P OUT_LONG
#endif /* __KERNEL__ */
diff --git a/include/asm-sparc/irq.h b/include/asm-sparc/irq.h
index 6008023a5651..0e8693264787 100644
--- a/include/asm-sparc/irq.h
+++ b/include/asm-sparc/irq.h
@@ -21,6 +21,8 @@ BTFIXUPDEF_CALL(char *, __irq_itoa, unsigned int)
#define NR_IRQS 15
+#define irq_cannonicalize(irq) (irq)
+
/* Dave Redman (djhr@tadpole.co.uk)
* changed these to function pointers.. it saves cycles and will allow
* the irq dependencies to be split into different files at a later date
diff --git a/include/asm-sparc/kmap_types.h b/include/asm-sparc/kmap_types.h
index c5bb34018e95..82431edeb2a1 100644
--- a/include/asm-sparc/kmap_types.h
+++ b/include/asm-sparc/kmap_types.h
@@ -11,6 +11,8 @@ enum km_type {
KM_BIO_DST_IRQ,
KM_PTE0,
KM_PTE1,
+ KM_IRQ0,
+ KM_IRQ1,
KM_TYPE_NR
};
diff --git a/include/asm-sparc/spinlock.h b/include/asm-sparc/spinlock.h
index ae9016d0d7f4..99ee46411786 100644
--- a/include/asm-sparc/spinlock.h
+++ b/include/asm-sparc/spinlock.h
@@ -42,6 +42,7 @@ typedef struct _rwlock_debug rwlock_t;
#define RW_LOCK_UNLOCKED (rwlock_t) { 0, 0, {0} }
#define rwlock_init(lp) do { *(lp)= RW_LOCK_UNLOCKED; } while(0)
+#define rwlock_is_locked(lp) ((lp)->lock != 0)
extern void _do_read_lock(rwlock_t *rw, char *str);
extern void _do_read_unlock(rwlock_t *rw, char *str);
@@ -141,6 +142,7 @@ typedef struct { volatile unsigned int lock; } rwlock_t;
#define RW_LOCK_UNLOCKED (rwlock_t) { 0 }
#define rwlock_init(lp) do { *(lp)= RW_LOCK_UNLOCKED; } while(0)
+#define rwlock_is_locked(lp) ((lp)->lock != 0)
/* Sort of like atomic_t's on Sparc, but even more clever.
diff --git a/include/asm-sparc/system.h b/include/asm-sparc/system.h
index b9599127fad1..07e3a99188a2 100644
--- a/include/asm-sparc/system.h
+++ b/include/asm-sparc/system.h
@@ -56,6 +56,17 @@ extern unsigned long empty_zero_page;
extern struct linux_romvec *romvec;
#define halt() romvec->pv_halt()
+extern void sun_do_break(void);
+extern int serial_console;
+extern int stop_a_enabled;
+
+static __inline__ int con_is_present(void)
+{
+ return serial_console ? 0 : 1;
+}
+
+extern struct pt_regs *kbd_pt_regs;
+
/* When a context switch happens we must flush all user windows so that
* the windows of the current process are flushed onto its stack. This
* way the windows are all clean for the next process and the stack
@@ -113,6 +124,7 @@ extern void fpsave(unsigned long *fpregs, unsigned long *fsr,
"restore; restore; restore; restore; restore; restore; restore"); \
} while(0)
#define finish_arch_switch(rq, next) do{ }while(0)
+#define task_running(rq, p) ((rq)->curr == (p))
/* Much care has gone into this code, do not touch it.
*
@@ -263,6 +275,15 @@ extern __inline__ unsigned long read_psr_and_cli(void)
#define local_irq_save(flags) ((flags) = read_psr_and_cli())
#define local_irq_restore(flags) setipl((flags))
+/* On sparc32 IRQ flags are the PSR register in the PSR_PIL
+ * field.
+ */
+#define irqs_disabled() \
+({ unsigned long flags; \
+ local_save_flags(flags);\
+ (flags & PSR_PIL) != 0; \
+})
+
#ifdef CONFIG_SMP
extern unsigned char global_irq_holder;
@@ -282,9 +303,6 @@ extern void __global_restore_flags(unsigned long flags);
#define cli() local_irq_disable()
#define sti() local_irq_enable()
-#define save_flags(x) local_save_flags(x)
-#define restore_flags(x) local_irq_restore(x)
-#define save_and_cli(x) local_irq_save(x)
#endif
diff --git a/include/asm-sparc/unistd.h b/include/asm-sparc/unistd.h
index e89bb817c80f..5d3ba06ceb4c 100644
--- a/include/asm-sparc/unistd.h
+++ b/include/asm-sparc/unistd.h
@@ -203,7 +203,7 @@
#define __NR_setpgid 185 /* Common */
#define __NR_fremovexattr 186 /* SunOS: pathconf */
#define __NR_tkill 187 /* SunOS: fpathconf */
-/* #define __NR_sysconf 188 SunOS Specific */
+#define __NR_exit_group 188 /* Linux specific, sysconf undef SunOS */
#define __NR_uname 189 /* Linux Specific */
#define __NR_init_module 190 /* Linux Specific */
#define __NR_personality 191 /* Linux Specific */
diff --git a/include/asm-sparc64/hardirq.h b/include/asm-sparc64/hardirq.h
index 88e27b030c6d..6b6e67e52372 100644
--- a/include/asm-sparc64/hardirq.h
+++ b/include/asm-sparc64/hardirq.h
@@ -85,8 +85,10 @@ typedef struct {
#define irq_enter() (preempt_count() += HARDIRQ_OFFSET)
#if CONFIG_PREEMPT
+# define in_atomic() (preempt_count() != kernel_locked())
# define IRQ_EXIT_OFFSET (HARDIRQ_OFFSET-1)
#else
+# define in_atomic() (preempt_count() != 0)
# define IRQ_EXIT_OFFSET HARDIRQ_OFFSET
#endif
#define irq_exit() \
diff --git a/include/asm-sparc64/ide.h b/include/asm-sparc64/ide.h
index fd1d19740f4b..8adfd4967c1c 100644
--- a/include/asm-sparc64/ide.h
+++ b/include/asm-sparc64/ide.h
@@ -78,112 +78,63 @@ static __inline__ void ide_init_default_hwifs(void)
* The following are not needed for the non-m68k ports
*/
#define ide_ack_intr(hwif) (1)
-#define ide_fix_driveid(id) do {} while (0)
#define ide_release_lock(lock) do {} while (0)
#define ide_get_lock(lock, hdlr, data) do {} while (0)
-/* From m68k code... */
-
-#ifdef insl
-#undef insl
-#endif
-#ifdef outsl
-#undef outsl
-#endif
-#ifdef insw
-#undef insw
-#endif
-#ifdef outsw
-#undef outsw
-#endif
-
-#define insl(data_reg, buffer, wcount) insw(data_reg, buffer, (wcount)<<1)
-#define outsl(data_reg, buffer, wcount) outsw(data_reg, buffer, (wcount)<<1)
-
-#define insw(port, buf, nr) ide_insw((port), (buf), (nr))
-#define outsw(port, buf, nr) ide_outsw((port), (buf), (nr))
-
-static __inline__ unsigned int inw_be(unsigned long addr)
-{
- unsigned int ret;
+/* XXX Known to be broken. Axboe will fix the problems this
+ * XXX has by making seperate IN/OUT macros for IDE_DATA
+ * XXX register and rest of IDE regs and also using
+ * XXX ide_ioreg_t instead of u32 for ports. -DaveM
+ */
- __asm__ __volatile__("lduha [%1] %2, %0"
+#define HAVE_ARCH_IN_BYTE
+static __inline__ u8 IN_BYTE(ide_ioreg_t addr)
+{ u8 ret;
+ __asm__ __volatile__("lduba [%1] %2, %0\t/* ide_in_byte */"
: "=r" (ret)
: "r" (addr), "i" (ASI_PHYS_BYPASS_EC_E));
-
return ret;
}
+static __inline__ u16 IN_WORD(ide_ioreg_t addr)
+{ u16 ret;
+ __asm__ __volatile__("lduha [%1] %2, %0\t/* ide_in_word */"
+ : "=r" (ret)
+ : "r" (addr), "i" (ASI_PHYS_BYPASS_EC_E));
+ return ret;
+}
+static __inline__ u16 IN_LONG(ide_ioreg_t addr)
+{ u32 ret;
+ __asm__ __volatile__("lduwa [%1] %2, %0\t/* ide_in_long */"
+ : "=r" (ret)
+ : "r" (addr), "i" (ASI_PHYS_BYPASS_EC_E));
+ return ret;
+}
+#define IN_BYTE_P IN_BYTE
+#define IN_WORD_P IN_WORD
+#define IN_LONG_P IN_LONG
-static __inline__ void ide_insw(unsigned long port,
- void *dst,
- unsigned long count)
+#define HAVE_ARCH_OUT_BYTE
+static __inline__ void OUT_BYTE(u8 byte, ide_ioreg_t addr)
{
-#if (L1DCACHE_SIZE > PAGE_SIZE) /* is there D$ aliasing problem */
- unsigned long end = (unsigned long)dst + (count << 1);
-#endif
- u16 *ps = dst;
- u32 *pi;
-
- if(((u64)ps) & 0x2) {
- *ps++ = inw_be(port);
- count--;
- }
- pi = (u32 *)ps;
- while(count >= 2) {
- u32 w;
-
- w = inw_be(port) << 16;
- w |= inw_be(port);
- *pi++ = w;
- count -= 2;
- }
- ps = (u16 *)pi;
- if(count)
- *ps++ = inw_be(port);
-
-#if (L1DCACHE_SIZE > PAGE_SIZE) /* is there D$ aliasing problem */
- __flush_dcache_range((unsigned long)dst, end);
-#endif
+ __asm__ __volatile__("stba %r0, [%1] %2\t/* ide_out_byte */"
+ : /* no outputs */
+ : "Jr" (byte), "r" (addr), "i" (ASI_PHYS_BYPASS_EC_E));
}
-
-static __inline__ void outw_be(unsigned short w, unsigned long addr)
+static __inline__ void OUT_WORD(u16 word, ide_ioreg_t addr)
{
- __asm__ __volatile__("stha %0, [%1] %2"
+ __asm__ __volatile__("stha %r0, [%1] %2\t/* ide_out_word */"
: /* no outputs */
- : "r" (w), "r" (addr), "i" (ASI_PHYS_BYPASS_EC_E));
+ : "Jr" (word), "r" (addr), "i" (ASI_PHYS_BYPASS_EC_E));
}
-
-static __inline__ void ide_outsw(unsigned long port,
- const void *src,
- unsigned long count)
+static __inline__ void OUT_LONG(u32 _long, ide_ioreg_t addr)
{
-#if (L1DCACHE_SIZE > PAGE_SIZE) /* is there D$ aliasing problem */
- unsigned long end = (unsigned long)src + (count << 1);
-#endif
- const u16 *ps = src;
- const u32 *pi;
-
- if(((u64)src) & 0x2) {
- outw_be(*ps++, port);
- count--;
- }
- pi = (const u32 *)ps;
- while(count >= 2) {
- u32 w;
-
- w = *pi++;
- outw_be((w >> 16), port);
- outw_be(w, port);
- count -= 2;
- }
- ps = (const u16 *)pi;
- if(count)
- outw_be(*ps, port);
-
-#if (L1DCACHE_SIZE > PAGE_SIZE) /* is there D$ aliasing problem */
- __flush_dcache_range((unsigned long)src, end);
-#endif
+ __asm__ __volatile__("stwa %r0, [%1] %2\t/* ide_out_long */"
+ : /* no outputs */
+ : "Jr" (_long), "r" (addr), "i" (ASI_PHYS_BYPASS_EC_E));
}
+#define OUT_BYTE_P OUT_BYTE
+#define OUT_WORD_P OUT_WORD
+#define OUT_LONG_P OUT_LONG
#endif /* __KERNEL__ */
diff --git a/include/asm-sparc64/spinlock.h b/include/asm-sparc64/spinlock.h
index 34c221d282a1..48c93f17bb4f 100644
--- a/include/asm-sparc64/spinlock.h
+++ b/include/asm-sparc64/spinlock.h
@@ -112,6 +112,7 @@ extern int _spin_trylock (spinlock_t *lock);
typedef unsigned int rwlock_t;
#define RW_LOCK_UNLOCKED 0
#define rwlock_init(lp) do { *(lp) = RW_LOCK_UNLOCKED; } while(0)
+#define rwlock_is_locked(x) (*(x) != RW_LOCK_UNLOCKED)
extern void __read_lock(rwlock_t *);
extern void __read_unlock(rwlock_t *);
@@ -132,6 +133,7 @@ typedef struct {
} rwlock_t;
#define RW_LOCK_UNLOCKED (rwlock_t) { 0, 0, 0xff, { 0, 0, 0, 0 } }
#define rwlock_init(lp) do { *(lp) = RW_LOCK_UNLOCKED; } while(0)
+#define rwlock_is_locked(x) ((x)->lock != 0)
extern void _do_read_lock(rwlock_t *rw, char *str);
extern void _do_read_unlock(rwlock_t *rw, char *str);
diff --git a/include/asm-sparc64/unistd.h b/include/asm-sparc64/unistd.h
index 2b09e8888220..d7eb4d220b79 100644
--- a/include/asm-sparc64/unistd.h
+++ b/include/asm-sparc64/unistd.h
@@ -203,7 +203,7 @@
#define __NR_setpgid 185 /* Common */
#define __NR_fremovexattr 186 /* SunOS: pathconf */
#define __NR_tkill 187 /* SunOS: fpathconf */
-/* #define __NR_sysconf 188 SunOS Specific */
+#define __NR_exit_group 188 /* Linux specific, sysconf undef SunOS */
#define __NR_uname 189 /* Linux Specific */
#define __NR_init_module 190 /* Linux Specific */
#define __NR_personality 191 /* Linux Specific */
diff --git a/kernel/signal.c b/kernel/signal.c
index c2dc0ca60a8b..cea84861722b 100644
--- a/kernel/signal.c
+++ b/kernel/signal.c
@@ -73,12 +73,21 @@ int max_queued_signals = 1024;
----------------------------------------------------------
*/
+/* Some systems do not have a SIGSTKFLT and the kernel never
+ * generates such signals anyways.
+ */
+#ifdef SIGSTKFLT
+#define M_SIGSTKFLT M(SIGSTKFLT)
+#else
+#define M_SIGSTKFLT 0
+#endif
+
#define M(sig) (1UL << (sig))
#define SIG_USER_SPECIFIC_MASK (\
M(SIGILL) | M(SIGTRAP) | M(SIGABRT) | M(SIGBUS) | \
M(SIGFPE) | M(SIGSEGV) | M(SIGPIPE) | M(SIGXFSZ) | \
- M(SIGPROF) | M(SIGSYS) | M(SIGSTKFLT) | M(SIGCONT) )
+ M(SIGPROF) | M(SIGSYS) | M_SIGSTKFLT | M(SIGCONT) )
#define SIG_USER_LOAD_BALANCE_MASK (\
M(SIGHUP) | M(SIGINT) | M(SIGQUIT) | M(SIGUSR1) | \
@@ -95,7 +104,7 @@ int max_queued_signals = 1024;
M(SIGKILL) | M(SIGUSR1) | M(SIGSEGV) | M(SIGUSR2) | \
M(SIGPIPE) | M(SIGALRM) | M(SIGTERM) | M(SIGXCPU) | \
M(SIGXFSZ) | M(SIGVTALRM) | M(SIGPROF) | M(SIGPOLL) | \
- M(SIGSYS) | M(SIGSTKFLT) | M(SIGPWR) | M(SIGCONT) | \
+ M(SIGSYS) | M_SIGSTKFLT | M(SIGPWR) | M(SIGCONT) | \
M(SIGSTOP) | M(SIGTSTP) | M(SIGTTIN) | M(SIGTTOU) )
#define SIG_KERNEL_ONLY_MASK (\