diff options
| author | Linus Torvalds <torvalds@home.transmeta.com> | 2002-09-13 04:05:50 -0700 |
|---|---|---|
| committer | Linus Torvalds <torvalds@home.transmeta.com> | 2002-09-13 04:05:50 -0700 |
| commit | d1a75a97b0d3b9bc4e6a95f4e7854e7a7a986976 (patch) | |
| tree | 323f2436f538f9ea43593259529280331b8ee732 | |
| parent | 2c66151cbc2cc68465489fdf64d16bd1c6ca4d0e (diff) | |
| parent | 4be8d6018dc67c03d5118a280e27859bd55164d3 (diff) | |
Merge master.kernel.org:/home/davem/BK/sparc-2.5
into home.transmeta.com:/home/torvalds/v2.5/linux
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 = ¤t->blocked; for (;;) { - spin_lock_irq(¤t->sigmask_lock); - signr = dequeue_signal(¤t->blocked, &info); - spin_unlock_irq(¤t->sigmask_lock); + sigset_t *mask = ¤t->blocked; + unsigned long signr = 0; + + local_irq_disable(); + if (current->sig->shared_pending.head) { + spin_lock(¤t->sig->siglock); + signr = dequeue_signal(¤t->sig->shared_pending, mask, &info); + spin_unlock(¤t->sig->siglock); + } + if (!signr) { + spin_lock(¤t->sigmask_lock); + signr = dequeue_signal(¤t->pending, mask, &info); + spin_unlock(¤t->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(¤t->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(¤t->sigmask_lock); - signr = dequeue_signal(¤t->blocked, &info); - spin_unlock_irq(¤t->sigmask_lock); + sigset_t *mask = ¤t->blocked; + unsigned long signr = 0; + + local_irq_disable(); + if (current->sig->shared_pending.head) { + spin_lock(¤t->sig->siglock); + signr = dequeue_signal(¤t->sig->shared_pending, mask, &info); + spin_unlock(¤t->sig->siglock); + } + if (!signr) { + spin_lock(¤t->sigmask_lock); + signr = dequeue_signal(¤t->pending, mask, &info); + spin_unlock(¤t->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(¤t->sigmask_lock); - signr = dequeue_signal(¤t->blocked, &info); - spin_unlock_irq(¤t->sigmask_lock); + sigset_t *mask = ¤t->blocked; + unsigned long signr = 0; + + local_irq_disable(); + if (current->sig->shared_pending.head) { + spin_lock(¤t->sig->siglock); + signr = dequeue_signal(¤t->sig->shared_pending, mask, &info); + spin_unlock(¤t->sig->siglock); + } + if (!signr) { + spin_lock(¤t->sigmask_lock); + signr = dequeue_signal(¤t->pending, mask, &info); + spin_unlock(¤t->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(¤t->sigmask_lock); - sig = dequeue_signal(&these, &info); + spin_lock_irq(¤t->sig->siglock); + spin_lock(¤t->sigmask_lock); + sig = dequeue_signal(¤t->sig->shared_pending, &these, &info); + if (!sig) + sig = dequeue_signal(¤t->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(¤t->blocked, ¤t->blocked, &these); - recalc_sigpending(); - spin_unlock_irq(¤t->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(¤t->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(¤t->blocked, ¤t->blocked, &these); + recalc_sigpending(); + spin_unlock(¤t->sigmask_lock); + spin_unlock_irq(¤t->sig->siglock); + + current->state = TASK_INTERRUPTIBLE; + timeout = schedule_timeout(timeout); + + spin_lock_irq(¤t->sig->siglock); + spin_lock(¤t->sigmask_lock); + sig = dequeue_signal(¤t->sig->shared_pending, &these, &info); + if (!sig) + sig = dequeue_signal(¤t->pending, &these, &info); + current->blocked = current->real_blocked; + siginitset(¤t->real_blocked, 0); + recalc_sigpending(); + } } - spin_unlock_irq(¤t->sigmask_lock); + spin_unlock(¤t->sigmask_lock); + spin_unlock_irq(¤t->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 (\ |
