Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
L
linux
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
Kirill Smelkov
linux
Commits
d1a75a97
Commit
d1a75a97
authored
Sep 13, 2002
by
Linus Torvalds
Browse files
Options
Browse Files
Download
Plain Diff
Merge master.kernel.org:/home/davem/BK/sparc-2.5
into home.transmeta.com:/home/torvalds/v2.5/linux
parents
2c66151c
4be8d601
Changes
49
Show whitespace changes
Inline
Side-by-side
Showing
49 changed files
with
679 additions
and
1184 deletions
+679
-1184
arch/sparc/config.in
arch/sparc/config.in
+5
-0
arch/sparc/defconfig
arch/sparc/defconfig
+127
-178
arch/sparc/kernel/Makefile
arch/sparc/kernel/Makefile
+1
-1
arch/sparc/kernel/check_asm.sh
arch/sparc/kernel/check_asm.sh
+1
-2
arch/sparc/kernel/ebus.c
arch/sparc/kernel/ebus.c
+0
-4
arch/sparc/kernel/entry.S
arch/sparc/kernel/entry.S
+2
-1
arch/sparc/kernel/init_task.c
arch/sparc/kernel/init_task.c
+1
-1
arch/sparc/kernel/pcic.c
arch/sparc/kernel/pcic.c
+108
-92
arch/sparc/kernel/process.c
arch/sparc/kernel/process.c
+2
-4
arch/sparc/kernel/setup.c
arch/sparc/kernel/setup.c
+44
-84
arch/sparc/kernel/signal.c
arch/sparc/kernel/signal.c
+28
-120
arch/sparc/kernel/sparc-stub.c
arch/sparc/kernel/sparc-stub.c
+3
-11
arch/sparc/kernel/systbls.S
arch/sparc/kernel/systbls.S
+1
-1
arch/sparc/kernel/tadpole.c
arch/sparc/kernel/tadpole.c
+8
-5
arch/sparc/kernel/tick14.c
arch/sparc/kernel/tick14.c
+5
-7
arch/sparc/kernel/time.c
arch/sparc/kernel/time.c
+43
-45
arch/sparc/kernel/unaligned.c
arch/sparc/kernel/unaligned.c
+9
-0
arch/sparc/mm/srmmu.c
arch/sparc/mm/srmmu.c
+0
-8
arch/sparc/mm/sun4c.c
arch/sparc/mm/sun4c.c
+0
-7
arch/sparc/prom/misc.c
arch/sparc/prom/misc.c
+4
-6
arch/sparc64/defconfig
arch/sparc64/defconfig
+10
-8
arch/sparc64/kernel/entry.S
arch/sparc64/kernel/entry.S
+0
-66
arch/sparc64/kernel/init_task.c
arch/sparc64/kernel/init_task.c
+1
-1
arch/sparc64/kernel/pci.c
arch/sparc64/kernel/pci.c
+1
-1
arch/sparc64/kernel/power.c
arch/sparc64/kernel/power.c
+1
-2
arch/sparc64/kernel/process.c
arch/sparc64/kernel/process.c
+0
-1
arch/sparc64/kernel/setup.c
arch/sparc64/kernel/setup.c
+1
-29
arch/sparc64/kernel/signal.c
arch/sparc64/kernel/signal.c
+20
-97
arch/sparc64/kernel/signal32.c
arch/sparc64/kernel/signal32.c
+29
-156
arch/sparc64/kernel/sys_sparc32.c
arch/sparc64/kernel/sys_sparc32.c
+29
-17
arch/sparc64/kernel/systbls.S
arch/sparc64/kernel/systbls.S
+2
-2
arch/sparc64/kernel/time.c
arch/sparc64/kernel/time.c
+48
-8
arch/sparc64/mm/init.c
arch/sparc64/mm/init.c
+0
-8
arch/sparc64/prom/misc.c
arch/sparc64/prom/misc.c
+1
-1
drivers/serial/sunsu.c
drivers/serial/sunsu.c
+3
-0
drivers/serial/sunzilog.c
drivers/serial/sunzilog.c
+18
-28
include/asm-sparc/hardirq.h
include/asm-sparc/hardirq.h
+5
-3
include/asm-sparc/highmem.h
include/asm-sparc/highmem.h
+13
-0
include/asm-sparc/ide.h
include/asm-sparc/ide.h
+20
-82
include/asm-sparc/irq.h
include/asm-sparc/irq.h
+2
-0
include/asm-sparc/kmap_types.h
include/asm-sparc/kmap_types.h
+2
-0
include/asm-sparc/spinlock.h
include/asm-sparc/spinlock.h
+2
-0
include/asm-sparc/system.h
include/asm-sparc/system.h
+21
-3
include/asm-sparc/unistd.h
include/asm-sparc/unistd.h
+1
-1
include/asm-sparc64/hardirq.h
include/asm-sparc64/hardirq.h
+2
-0
include/asm-sparc64/ide.h
include/asm-sparc64/ide.h
+41
-90
include/asm-sparc64/spinlock.h
include/asm-sparc64/spinlock.h
+2
-0
include/asm-sparc64/unistd.h
include/asm-sparc64/unistd.h
+1
-1
kernel/signal.c
kernel/signal.c
+11
-2
No files found.
arch/sparc/config.in
View file @
d1a75a97
...
...
@@ -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
...
...
arch/sparc/defconfig
View file @
d1a75a97
...
...
@@ -3,6 +3,12 @@
#
CONFIG_UID16=y
CONFIG_HIGHMEM=y
CONFIG_GENERIC_ISA_DMA=y
#
# Code maturity level options
#
CONFIG_EXPERIMENTAL=y
#
# General setup
...
...
@@ -12,11 +18,6 @@ CONFIG_SYSVIPC=y
# CONFIG_BSD_PROCESS_ACCT is not set
CONFIG_SYSCTL=y
#
# Code maturity level options
#
CONFIG_EXPERIMENTAL=y
#
# Loadable module support
#
...
...
@@ -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,35 +64,43 @@ 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)
#
# 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
#
...
...
@@ -103,9 +108,11 @@ 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)
...
...
@@ -138,6 +145,31 @@ CONFIG_BLK_DEV_RAM=y
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
#
...
...
@@ -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
arch/sparc/kernel/Makefile
View file @
d1a75a97
...
...
@@ -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 s
parc-stub.o s
ystbls.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
...
...
arch/sparc/kernel/check_asm.sh
View file @
d1a75a97
...
...
@@ -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
;;
...
...
arch/sparc/kernel/ebus.c
View file @
d1a75a97
...
...
@@ -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
();
}
arch/sparc/kernel/entry.S
View file @
d1a75a97
...
...
@@ -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
...
...
arch/sparc/kernel/init_task.c
View file @
d1a75a97
...
...
@@ -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
);
...
...
arch/sparc/kernel/pcic.c
View file @
d1a75a97
/*
$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
siz
e
,
u32
*
value
)
static
int
pcic_read_config
_dword
(
unsigned
int
busno
,
unsigned
int
devfn
,
int
wher
e
,
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
(
busn
um
,
devfn
,
where
),
pcic
->
pcic_config_space_addr
);
writel
(
CONFIG_CMD
(
busn
o
,
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
(
busn
um
,
devfn
,
where
),
pcic
->
pcic_config_space_addr
);
local_irq_save
(
flags
);
writel
(
CONFIG_CMD
(
busn
o
,
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
pci
bios
_init
(
void
)
static
int
__init
pci
c
_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
shor
t
cmd
;
unsigned
in
t
cmd
;
struct
linux_pcic
*
pcic
;
/* struct linux_pbm_info* pbm = &pcic->pbm; */
int
node
;
...
...
@@ -663,18 +669,20 @@ 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
);
...
...
@@ -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
;
unsigned
long
usec
,
sec
;
save_and_cli
(
flags
);
*
tv
=
xtime
;
tv
->
tv_usec
+=
do_gettimeoffset
();
/*
* 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
;
restore_flags
(
flags
);
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
);
if
(
tv
->
tv_
usec
>=
1000000
)
{
tv
->
tv_
usec
-=
1000000
;
tv
->
tv_
sec
++
;
while
(
usec
>=
1000000
)
{
usec
-=
1000000
;
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
(
pci
bios
_init
);
subsys_initcall
(
pci
c
_init
);
arch/sparc/kernel/process.c
View file @
d1a75a97
...
...
@@ -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
)
...
...
arch/sparc/kernel/setup.c
View file @
d1a75a97
...
...
@@ -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,8 +339,7 @@ void __init setup_arch(char **cmdline_p)
prom_setsync
(
prom_sync_me
);
{
#if !CONFIG_SUN_SERIAL
#ifndef CONFIG_SERIAL_CONSOLE
/* Not CONFIG_SERIAL_SUNCORE: to be gone. */
serial_console
=
0
;
#else
switch
(
console_fb
)
{
...
...
@@ -411,32 +371,16 @@ void __init setup_arch(char **cmdline_p)
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
);
}
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
;
arch/sparc/kernel/signal.c
View file @
d1a75a97
...
...
@@ -38,11 +38,6 @@ extern void fpload(unsigned long *fpregs, unsigned long *fsr);
asmlinkage
int
do_signal
(
sigset_t
*
oldset
,
struct
pt_regs
*
regs
,
unsigned
long
orig_o0
,
int
restart_syscall
);
/* This turned off for production... */
/* #define DEBUG_SIGNALS 1 */
/* #define DEBUG_SIGNALS_TRACE 1 */
/* #define DEBUG_SIGNALS_MAPS 1 */
/* Signal frames: the original one (compatible with SunOS):
*
* Set up a signal frame... Make the stack look the way SunOS
...
...
@@ -470,12 +465,6 @@ setup_frame(struct sigaction *sa, struct pt_regs *regs, int signr, sigset_t *old
synchronize_user_stack
();
sframep
=
(
struct
signal_sframe
*
)
get_sigframe
(
sa
,
regs
,
SF_ALIGNEDSZ
);
if
(
invalid_frame_pointer
(
sframep
,
sizeof
(
*
sframep
))){
#ifdef DEBUG_SIGNALS
/* fills up the console logs during crashme runs, yuck... */
printk
(
"%s [%d]: User has trashed signal stack
\n
"
,
current
->
comm
,
current
->
pid
);
printk
(
"Sigstack ptr %p handler at pc<%08lx> for sig<%d>
\n
"
,
sframep
,
pc
,
signr
);
#endif
/* Don't change signal code and address, so that
* post mortem debuggers can have a look.
*/
...
...
@@ -635,13 +624,8 @@ new_setup_frame(struct k_sigaction *ka, struct pt_regs *regs,
if
(
invalid_frame_pointer
(
sf
,
sigframe_size
))
goto
sigill_and_return
;
if
(
current
->
thread
.
w_saved
!=
0
)
{
#ifdef DEBUG_SIGNALS
printk
(
"%s [%d]: Invalid user stack frame for "
"signal delivery.
\n
"
,
current
->
comm
,
current
->
pid
);
#endif
if
(
current
->
thread
.
w_saved
!=
0
)
goto
sigill_and_return
;
}
/* 2. Save the current process state */
err
=
__copy_to_user
(
&
sf
->
info
.
si_regs
,
regs
,
sizeof
(
struct
pt_regs
));
...
...
@@ -795,12 +779,8 @@ setup_svr4_frame(struct sigaction *sa, unsigned long pc, unsigned long npc,
synchronize_user_stack
();
sfp
=
(
svr4_signal_frame_t
*
)
get_sigframe
(
sa
,
regs
,
SVR4_SF_ALIGNED
+
REGWIN_SZ
);
if
(
invalid_frame_pointer
(
sfp
,
sizeof
(
*
sfp
))){
#ifdef DEBUG_SIGNALS
printk
(
"Invalid stack frame
\n
"
);
#endif
if
(
invalid_frame_pointer
(
sfp
,
sizeof
(
*
sfp
)))
goto
sigill_and_return
;
}
/* Start with a clean frame pointer and fill it */
err
=
__clear_user
(
sfp
,
sizeof
(
*
sfp
));
...
...
@@ -883,9 +863,6 @@ setup_svr4_frame(struct sigaction *sa, unsigned long pc, unsigned long npc,
regs
->
pc
=
(
unsigned
long
)
sa
->
sa_handler
;
regs
->
npc
=
(
regs
->
pc
+
4
);
#ifdef DEBUG_SIGNALS
printk
(
"Solaris-frame: %x %x
\n
"
,
(
int
)
regs
->
pc
,
(
int
)
regs
->
npc
);
#endif
/* Arguments passed to signal handler */
if
(
regs
->
u_regs
[
14
]){
struct
reg_window
*
rw
=
(
struct
reg_window
*
)
regs
->
u_regs
[
14
];
...
...
@@ -1090,61 +1067,6 @@ static inline void syscall_restart(unsigned long orig_i0, struct pt_regs *regs,
}
}
#ifdef DEBUG_SIGNALS_MAPS
#define MAPS_LINE_FORMAT "%08lx-%08lx %s %08lx %02x:%02x %lu "
static
inline
void
read_maps
(
void
)
{
struct
vm_area_struct
*
map
,
*
next
;
char
*
buffer
;
ssize_t
i
;
buffer
=
(
char
*
)
__get_free_page
(
GFP_KERNEL
);
if
(
!
buffer
)
return
;
for
(
map
=
current
->
mm
->
mmap
;
map
;
map
=
next
)
{
/* produce the next line */
char
*
line
;
char
str
[
5
],
*
cp
=
str
;
int
flags
;
dev_t
dev
;
unsigned
long
ino
;
/*
* Get the next vma now (but it won't be used if we sleep).
*/
next
=
map
->
vm_next
;
flags
=
map
->
vm_flags
;
*
cp
++
=
flags
&
VM_READ
?
'r'
:
'-'
;
*
cp
++
=
flags
&
VM_WRITE
?
'w'
:
'-'
;
*
cp
++
=
flags
&
VM_EXEC
?
'x'
:
'-'
;
*
cp
++
=
flags
&
VM_MAYSHARE
?
's'
:
'p'
;
*
cp
++
=
0
;
dev
=
0
;
ino
=
0
;
if
(
map
->
vm_file
!=
NULL
)
{
dev
=
map
->
vm_file
->
f_dentry
->
d_inode
->
i_dev
;
ino
=
map
->
vm_file
->
f_dentry
->
d_inode
->
i_ino
;
line
=
d_path
(
map
->
vm_file
->
f_dentry
,
map
->
vm_file
->
f_vfsmnt
,
buffer
,
PAGE_SIZE
);
}
printk
(
MAPS_LINE_FORMAT
,
map
->
vm_start
,
map
->
vm_end
,
str
,
map
->
vm_pgoff
<<
PAGE_SHIFT
,
MAJOR
(
dev
),
MINOR
(
dev
),
ino
);
if
(
map
->
vm_file
!=
NULL
)
printk
(
"%s
\n
"
,
line
);
else
printk
(
"
\n
"
);
}
free_page
((
unsigned
long
)
buffer
);
return
;
}
#endif
/* Note that 'init' is a special process: it doesn't get signals it doesn't
* want to handle. Thus you cannot kill init even with a SIGKILL even by
* mistake.
...
...
@@ -1152,7 +1074,6 @@ static inline void read_maps (void)
asmlinkage
int
do_signal
(
sigset_t
*
oldset
,
struct
pt_regs
*
regs
,
unsigned
long
orig_i0
,
int
restart_syscall
)
{
unsigned
long
signr
;
struct
k_sigaction
*
ka
;
siginfo_t
info
;
...
...
@@ -1171,9 +1092,21 @@ asmlinkage int do_signal(sigset_t *oldset, struct pt_regs * regs,
oldset
=
&
current
->
blocked
;
for
(;;)
{
spin_lock_irq
(
&
current
->
sigmask_lock
);
signr
=
dequeue_signal
(
&
current
->
blocked
,
&
info
);
spin_unlock_irq
(
&
current
->
sigmask_lock
);
sigset_t
*
mask
=
&
current
->
blocked
;
unsigned
long
signr
=
0
;
local_irq_disable
();
if
(
current
->
sig
->
shared_pending
.
head
)
{
spin_lock
(
&
current
->
sig
->
siglock
);
signr
=
dequeue_signal
(
&
current
->
sig
->
shared_pending
,
mask
,
&
info
);
spin_unlock
(
&
current
->
sig
->
siglock
);
}
if
(
!
signr
)
{
spin_lock
(
&
current
->
sigmask_lock
);
signr
=
dequeue_signal
(
&
current
->
pending
,
mask
,
&
info
);
spin_unlock
(
&
current
->
sigmask_lock
);
}
local_irq_enable
();
if
(
!
signr
)
break
;
...
...
@@ -1193,7 +1126,7 @@ asmlinkage int do_signal(sigset_t *oldset, struct pt_regs * regs,
restart_syscall
=
0
;
}
current
->
exit_code
=
signr
;
current
->
state
=
TASK_STOPPED
;
set_current_state
(
TASK_STOPPED
)
;
/* This happens to be SMP safe so no need to
* grab master kernel lock even in this case.
...
...
@@ -1254,52 +1187,27 @@ asmlinkage int do_signal(sigset_t *oldset, struct pt_regs * regs,
if
(
is_orphaned_pgrp
(
current
->
pgrp
))
continue
;
case
SIGSTOP
:
if
(
current
->
ptrace
&
PT_PTRACED
)
continue
;
current
->
state
=
TASK_STOPPED
;
case
SIGSTOP
:
{
struct
signal_struct
*
sig
;
set_current_state
(
TASK_STOPPED
);
current
->
exit_code
=
signr
;
/* notify_parent() is SMP safe */
if
(
!
(
current
->
parent
->
sig
->
action
[
SIGCHLD
-
1
].
sa
.
sa_flags
&
sig
=
current
->
parent
->
sig
;
if
(
sig
&&
!
(
sig
->
action
[
SIGCHLD
-
1
].
sa
.
sa_flags
&
SA_NOCLDSTOP
))
notify_parent
(
current
,
SIGCHLD
);
schedule
();
continue
;
}
case
SIGQUIT
:
case
SIGILL
:
case
SIGTRAP
:
case
SIGABRT
:
case
SIGFPE
:
case
SIGSEGV
:
case
SIGBUS
:
case
SIGSYS
:
case
SIGXCPU
:
case
SIGXFSZ
:
if
(
do_coredump
(
signr
,
regs
))
exit_code
|=
0x80
;
#ifdef DEBUG_SIGNALS
/* Very useful to debug dynamic linker problems */
printk
(
"Sig %ld going for %s[%d]...
\n
"
,
signr
,
current
->
comm
,
current
->
pid
);
show_regs
(
regs
);
#ifdef DEBUG_SIGNALS_TRACE
{
struct
reg_window
*
rw
=
(
struct
reg_window
*
)
regs
->
u_regs
[
UREG_FP
];
unsigned
int
ins
[
8
];
while
(
rw
&&
!
(((
unsigned
long
)
rw
)
&
0x3
))
{
copy_from_user
(
ins
,
&
rw
->
ins
[
0
],
sizeof
(
ins
));
printk
(
"Caller[%08x](%08x,%08x,%08x,%08x,%08x,%08x)
\n
"
,
ins
[
7
],
ins
[
0
],
ins
[
1
],
ins
[
2
],
ins
[
3
],
ins
[
4
],
ins
[
5
]);
rw
=
(
struct
reg_window
*
)(
unsigned
long
)
ins
[
6
];
}
}
#endif
#ifdef DEBUG_SIGNALS_MAPS
printk
(
"Maps:
\n
"
);
read_maps
();
#endif
#endif
/* fall through */
/* FALLTHRU */
default:
sigaddset
(
&
current
->
pending
.
signal
,
signr
);
recalc_sigpending
();
current
->
flags
|=
PF_SIGNALED
;
do_exit
(
exit_code
);
sig_exit
(
signr
,
exit_code
,
&
info
);
/* NOT REACHED */
}
}
...
...
arch/sparc/kernel/sparc-stub.c
View file @
d1a75a97
...
...
@@ -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. */
...
...
arch/sparc/kernel/systbls.S
View file @
d1a75a97
...
...
@@ -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
...
...
arch/sparc/kernel/tadpole.c
View file @
d1a75a97
...
...
@@ -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
)
...
...
arch/sparc/kernel/tick14.c
View file @
d1a75a97
...
...
@@ -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
*
),
...
...
arch/sparc/kernel/time.c
View file @
d1a75a97
...
...
@@ -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_
u
sec
=
0
;
xtime
.
tv_
n
sec
=
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_
u
sec
=
0
;
xtime
.
tv_
n
sec
=
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
;
...
...
arch/sparc/kernel/unaligned.c
View file @
d1a75a97
...
...
@@ -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:
...
...
arch/sparc/mm/srmmu.c
View file @
d1a75a97
...
...
@@ -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
();
...
...
arch/sparc/mm/sun4c.c
View file @
d1a75a97
...
...
@@ -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
();
...
...
arch/sparc/prom/misc.c
View file @
d1a75a97
...
...
@@ -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
...
...
arch/sparc64/defconfig
View file @
d1a75a97
...
...
@@ -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_IDE
TAPE
is not set
# CONFIG_BLK_DEV_IDE
CD_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
...
...
arch/sparc64/kernel/entry.S
View file @
d1a75a97
...
...
@@ -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
,2
f
)
ba
,
pt
%
xcc
,
3
f
rd
%
tick
,
%
o1
2
:
ba
,
pt
%
xcc
,
3
f
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
,
1
b
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
,
1
f
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
,
1
f
stx
%
o4
,
[%
o0
+
0x0
]
add
%
o4
,
0x1
,
%
o4
sub
%
o5
,
%
o2
,
%
o5
stx
%
o4
,
[%
o0
+
0x0
]
1
:
retl
st
%
o5
,
[%
o0
+
0x8
]
arch/sparc64/kernel/init_task.c
View file @
d1a75a97
...
...
@@ -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
...
...
arch/sparc64/kernel/pci.c
View file @
d1a75a97
...
...
@@ -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
;
}
...
...
arch/sparc64/kernel/power.c
View file @
d1a75a97
...
...
@@ -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
)
{
...
...
arch/sparc64/kernel/process.c
View file @
d1a75a97
...
...
@@ -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
)
...
...
arch/sparc64/kernel/setup.c
View file @
d1a75a97
...
...
@@ -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
;
...
...
arch/sparc64/kernel/signal.c
View file @
d1a75a97
...
...
@@ -36,11 +36,6 @@
static
int
do_signal
(
sigset_t
*
oldset
,
struct
pt_regs
*
regs
,
unsigned
long
orig_o0
,
int
ret_from_syscall
);
/* This turned off for production... */
/* #define DEBUG_SIGNALS 1 */
/* #define DEBUG_SIGNALS_TRACE 1 */
/* #define DEBUG_SIGNALS_MAPS 1 */
int
copy_siginfo_to_user
(
siginfo_t
*
to
,
siginfo_t
*
from
)
{
if
(
!
access_ok
(
VERIFY_WRITE
,
to
,
sizeof
(
siginfo_t
)))
...
...
@@ -535,13 +530,8 @@ setup_rt_frame(struct k_sigaction *ka, struct pt_regs *regs,
if
(
invalid_frame_pointer
(
sf
,
sigframe_size
))
goto
sigill
;
if
(
get_thread_wsaved
()
!=
0
)
{
#ifdef DEBUG_SIGNALS
printk
(
"%s[%d]: Invalid user stack frame for "
"signal delivery.
\n
"
,
current
->
comm
,
current
->
pid
);
#endif
if
(
get_thread_wsaved
()
!=
0
)
goto
sigill
;
}
/* 2. Save the current process state */
err
=
copy_to_user
(
&
sf
->
regs
,
regs
,
sizeof
(
*
regs
));
...
...
@@ -631,62 +621,6 @@ static inline void syscall_restart(unsigned long orig_i0, struct pt_regs *regs,
}
}
#ifdef DEBUG_SIGNALS_MAPS
#define MAPS_LINE_FORMAT "%016lx-%016lx %s %016lx %02x:%02x %lu "
static
inline
void
read_maps
(
void
)
{
struct
vm_area_struct
*
map
,
*
next
;
char
*
buffer
;
ssize_t
i
;
buffer
=
(
char
*
)
__get_free_page
(
GFP_KERNEL
);
if
(
!
buffer
)
return
;
for
(
map
=
current
->
mm
->
mmap
;
map
;
map
=
next
)
{
/* produce the next line */
char
*
line
;
char
str
[
5
],
*
cp
=
str
;
int
flags
;
dev_t
dev
;
unsigned
long
ino
;
/*
* Get the next vma now (but it won't be used if we sleep).
*/
next
=
map
->
vm_next
;
flags
=
map
->
vm_flags
;
*
cp
++
=
flags
&
VM_READ
?
'r'
:
'-'
;
*
cp
++
=
flags
&
VM_WRITE
?
'w'
:
'-'
;
*
cp
++
=
flags
&
VM_EXEC
?
'x'
:
'-'
;
*
cp
++
=
flags
&
VM_MAYSHARE
?
's'
:
'p'
;
*
cp
++
=
0
;
dev
=
0
;
ino
=
0
;
if
(
map
->
vm_file
!=
NULL
)
{
dev
=
map
->
vm_file
->
f_dentry
->
d_inode
->
i_dev
;
ino
=
map
->
vm_file
->
f_dentry
->
d_inode
->
i_ino
;
line
=
d_path
(
map
->
vm_file
->
f_dentry
,
map
->
vm_file
->
f_vfsmnt
,
buffer
,
PAGE_SIZE
);
}
printk
(
MAPS_LINE_FORMAT
,
map
->
vm_start
,
map
->
vm_end
,
str
,
map
->
vm_pgoff
<<
PAGE_SHIFT
,
MAJOR
(
dev
),
MINOR
(
dev
),
ino
);
if
(
map
->
vm_file
!=
NULL
)
printk
(
"%s
\n
"
,
line
);
else
printk
(
"
\n
"
);
}
free_page
((
unsigned
long
)
buffer
);
return
;
}
#endif
/* Note that 'init' is a special process: it doesn't get signals it doesn't
* want to handle. Thus you cannot kill init even with a SIGKILL even by
* mistake.
...
...
@@ -694,7 +628,6 @@ static inline void read_maps (void)
static
int
do_signal
(
sigset_t
*
oldset
,
struct
pt_regs
*
regs
,
unsigned
long
orig_i0
,
int
restart_syscall
)
{
unsigned
long
signr
;
siginfo_t
info
;
struct
k_sigaction
*
ka
;
...
...
@@ -709,9 +642,21 @@ static int do_signal(sigset_t *oldset, struct pt_regs * regs,
}
#endif
for
(;;)
{
spin_lock_irq
(
&
current
->
sigmask_lock
);
signr
=
dequeue_signal
(
&
current
->
blocked
,
&
info
);
spin_unlock_irq
(
&
current
->
sigmask_lock
);
sigset_t
*
mask
=
&
current
->
blocked
;
unsigned
long
signr
=
0
;
local_irq_disable
();
if
(
current
->
sig
->
shared_pending
.
head
)
{
spin_lock
(
&
current
->
sig
->
siglock
);
signr
=
dequeue_signal
(
&
current
->
sig
->
shared_pending
,
mask
,
&
info
);
spin_unlock
(
&
current
->
sig
->
siglock
);
}
if
(
!
signr
)
{
spin_lock
(
&
current
->
sigmask_lock
);
signr
=
dequeue_signal
(
&
current
->
pending
,
mask
,
&
info
);
spin_unlock
(
&
current
->
sigmask_lock
);
}
local_irq_enable
();
if
(
!
signr
)
break
;
...
...
@@ -732,7 +677,7 @@ static int do_signal(sigset_t *oldset, struct pt_regs * regs,
}
current
->
exit_code
=
signr
;
current
->
state
=
TASK_STOPPED
;
set_current_state
(
TASK_STOPPED
)
;
notify_parent
(
current
,
SIGCHLD
);
schedule
();
if
(
!
(
signr
=
current
->
exit_code
))
...
...
@@ -787,8 +732,7 @@ static int do_signal(sigset_t *oldset, struct pt_regs * regs,
case
SIGSTOP
:
{
struct
signal_struct
*
sig
;
current
->
state
=
TASK_STOPPED
;
set_current_state
(
TASK_STOPPED
);
current
->
exit_code
=
signr
;
sig
=
current
->
parent
->
sig
;
if
(
sig
&&
!
(
sig
->
action
[
SIGCHLD
-
1
].
sa
.
sa_flags
&
...
...
@@ -803,29 +747,8 @@ static int do_signal(sigset_t *oldset, struct pt_regs * regs,
case
SIGBUS
:
case
SIGSYS
:
case
SIGXCPU
:
case
SIGXFSZ
:
if
(
do_coredump
(
signr
,
regs
))
exit_code
|=
0x80
;
#ifdef DEBUG_SIGNALS
/* Very useful to debug the dynamic linker */
printk
(
"Sig %d going...
\n
"
,
(
int
)
signr
);
show_regs
(
regs
);
#ifdef DEBUG_SIGNALS_TRACE
{
struct
reg_window
*
rw
=
(
struct
reg_window
*
)(
regs
->
u_regs
[
UREG_FP
]
+
STACK_BIAS
);
unsigned
long
ins
[
8
];
while
(
rw
&&
!
(((
unsigned
long
)
rw
)
&
0x3
))
{
copy_from_user
(
ins
,
&
rw
->
ins
[
0
],
sizeof
(
ins
));
printk
(
"Caller[%016lx](%016lx,%016lx,%016lx,%016lx,%016lx,%016lx)
\n
"
,
ins
[
7
],
ins
[
0
],
ins
[
1
],
ins
[
2
],
ins
[
3
],
ins
[
4
],
ins
[
5
]);
rw
=
(
struct
reg_window
*
)(
unsigned
long
)(
ins
[
6
]
+
STACK_BIAS
);
}
}
#endif
#ifdef DEBUG_SIGNALS_MAPS
printk
(
"Maps:
\n
"
);
read_maps
();
#endif
#endif
/* fall through */
/* FALLTHRU */
default:
sig_exit
(
signr
,
exit_code
,
&
info
);
/* NOT REACHED */
...
...
arch/sparc64/kernel/signal32.c
View file @
d1a75a97
...
...
@@ -34,12 +34,6 @@
int
do_signal32
(
sigset_t
*
oldset
,
struct
pt_regs
*
regs
,
unsigned
long
orig_o0
,
int
ret_from_syscall
);
/* This turned off for production... */
/* #define DEBUG_SIGNALS 1 */
/* #define DEBUG_SIGNALS_TRACE 1 */
/* #define DEBUG_SIGNALS_MAPS 1 */
/* #define DEBUG_SIGNALS_TLB 1 */
/* Signal frames: the original one (compatible with SunOS):
*
* Set up a signal frame... Make the stack look the way SunOS
...
...
@@ -525,12 +519,6 @@ setup_frame32(struct sigaction *sa, struct pt_regs *regs, int signr, sigset_t *o
sframep
=
(
struct
signal_sframe32
*
)
get_sigframe
(
sa
,
regs
,
SF_ALIGNEDSZ
);
if
(
invalid_frame_pointer
(
sframep
,
sizeof
(
*
sframep
))){
#ifdef DEBUG_SIGNALS
/* fills up the console logs during crashme runs, yuck... */
printk
(
"%s [%d]: User has trashed signal stack
\n
"
,
current
->
comm
,
current
->
pid
);
printk
(
"Sigstack ptr %p handler at pc<%016lx> for sig<%d>
\n
"
,
sframep
,
pc
,
signr
);
#endif
/* Don't change signal code and address, so that
* post mortem debuggers can have a look.
*/
...
...
@@ -696,21 +684,11 @@ static inline void new_setup_frame32(struct k_sigaction *ka, struct pt_regs *reg
sf
=
(
struct
new_signal_frame32
*
)
get_sigframe
(
&
ka
->
sa
,
regs
,
sigframe_size
);
if
(
invalid_frame_pointer
(
sf
,
sigframe_size
))
{
#ifdef DEBUG_SIGNALS
printk
(
"new_setup_frame32(%s:%d): invalid_frame_pointer(%p, %d)
\n
"
,
current
->
comm
,
current
->
pid
,
sf
,
sigframe_size
);
#endif
if
(
invalid_frame_pointer
(
sf
,
sigframe_size
))
goto
sigill
;
}
if
(
get_thread_wsaved
()
!=
0
)
{
#ifdef DEBUG_SIGNALS
printk
(
"%s[%d]: Invalid user stack frame for "
"signal delivery.
\n
"
,
current
->
comm
,
current
->
pid
);
#endif
if
(
get_thread_wsaved
()
!=
0
)
goto
sigill
;
}
/* 2. Save the current process state */
if
(
test_thread_flag
(
TIF_32BIT
))
{
...
...
@@ -835,12 +813,8 @@ setup_svr4_frame32(struct sigaction *sa, unsigned long pc, unsigned long npc,
regs
->
u_regs
[
UREG_FP
]
&=
0x00000000ffffffffUL
;
sfp
=
(
svr4_signal_frame_t
*
)
get_sigframe
(
sa
,
regs
,
REGWIN_SZ
+
SVR4_SF_ALIGNED
);
if
(
invalid_frame_pointer
(
sfp
,
sizeof
(
*
sfp
))){
#ifdef DEBUG_SIGNALS
printk
(
"Invalid stack frame
\n
"
);
#endif
if
(
invalid_frame_pointer
(
sfp
,
sizeof
(
*
sfp
)))
do_exit
(
SIGILL
);
}
/* Start with a clean frame pointer and fill it */
err
=
clear_user
(
sfp
,
sizeof
(
*
sfp
));
...
...
@@ -939,9 +913,6 @@ setup_svr4_frame32(struct sigaction *sa, unsigned long pc, unsigned long npc,
regs
->
tnpc
&=
0xffffffff
;
}
#ifdef DEBUG_SIGNALS
printk
(
"Solaris-frame: %x %x
\n
"
,
(
int
)
regs
->
tpc
,
(
int
)
regs
->
tnpc
);
#endif
/* Arguments passed to signal handler */
if
(
regs
->
u_regs
[
14
]){
struct
reg_window32
*
rw
=
(
struct
reg_window32
*
)
...
...
@@ -975,12 +946,9 @@ svr4_getcontext(svr4_ucontext_t *uc, struct pt_regs *regs)
synchronize_user_stack
();
save_and_clear_fpu
();
if
(
get_thread_wsaved
())
{
#ifdef DEBUG_SIGNALS
printk
(
"Uh oh, w_saved is not zero (%d)
\n
"
,
(
int
)
get_thread_wsaved
());
#endif
if
(
get_thread_wsaved
())
do_exit
(
SIGSEGV
);
}
err
=
clear_user
(
uc
,
sizeof
(
*
uc
));
/* Setup convenience variables */
...
...
@@ -1047,12 +1015,9 @@ asmlinkage int svr4_setcontext(svr4_ucontext_t *c, struct pt_regs *regs)
*/
flush_user_windows
();
if
(
get_thread_wsaved
())
{
#ifdef DEBUG_SIGNALS
printk
(
"Uh oh, w_saved is: 0x%x
\n
"
,
get_thread_wsaved
());
#endif
if
(
get_thread_wsaved
())
goto
sigsegv
;
}
if
(((
unsigned
long
)
c
)
&
3
){
printk
(
"Unaligned structure passed
\n
"
);
goto
sigsegv
;
...
...
@@ -1067,12 +1032,8 @@ asmlinkage int svr4_setcontext(svr4_ucontext_t *c, struct pt_regs *regs)
gr
=
&
c
->
mcontext
.
greg
;
err
=
__get_user
(
pc
,
&
((
*
gr
)[
SVR4_PC
]));
err
|=
__get_user
(
npc
,
&
((
*
gr
)[
SVR4_NPC
]));
if
((
pc
|
npc
)
&
3
)
{
#ifdef DEBUG_SIGNALS
printk
(
"setcontext, PC or nPC were bogus
\n
"
);
#endif
if
((
pc
|
npc
)
&
3
)
goto
sigsegv
;
}
/* Retrieve information from passed ucontext */
/* note that nPC is ored a 1, this is used to inform entry.S */
...
...
@@ -1148,21 +1109,11 @@ static inline void setup_rt_frame32(struct k_sigaction *ka, struct pt_regs *regs
sf
=
(
struct
rt_signal_frame32
*
)
get_sigframe
(
&
ka
->
sa
,
regs
,
sigframe_size
);
if
(
invalid_frame_pointer
(
sf
,
sigframe_size
))
{
#ifdef DEBUG_SIGNALS
printk
(
"rt_setup_frame32(%s:%d): invalid_frame_pointer(%p, %d)
\n
"
,
current
->
comm
,
current
->
pid
,
sf
,
sigframe_size
);
#endif
if
(
invalid_frame_pointer
(
sf
,
sigframe_size
))
goto
sigill
;
}
if
(
get_thread_wsaved
()
!=
0
)
{
#ifdef DEBUG_SIGNALS
printk
(
"%s[%d]: Invalid user stack frame for "
"signal delivery.
\n
"
,
current
->
comm
,
current
->
pid
);
#endif
if
(
get_thread_wsaved
()
!=
0
)
goto
sigill
;
}
/* 2. Save the current process state */
if
(
test_thread_flag
(
TIF_32BIT
))
{
...
...
@@ -1317,62 +1268,6 @@ static inline void syscall_restart32(unsigned long orig_i0, struct pt_regs *regs
}
}
#ifdef DEBUG_SIGNALS_MAPS
#define MAPS_LINE_FORMAT "%016lx-%016lx %s %016lx %02x:%02x %lu "
static
inline
void
read_maps
(
void
)
{
struct
vm_area_struct
*
map
,
*
next
;
char
*
buffer
;
ssize_t
i
;
buffer
=
(
char
*
)
__get_free_page
(
GFP_KERNEL
);
if
(
!
buffer
)
return
;
for
(
map
=
current
->
mm
->
mmap
;
map
;
map
=
next
)
{
/* produce the next line */
char
*
line
;
char
str
[
5
],
*
cp
=
str
;
int
flags
;
dev_t
dev
;
unsigned
long
ino
;
/*
* Get the next vma now (but it won't be used if we sleep).
*/
next
=
map
->
vm_next
;
flags
=
map
->
vm_flags
;
*
cp
++
=
flags
&
VM_READ
?
'r'
:
'-'
;
*
cp
++
=
flags
&
VM_WRITE
?
'w'
:
'-'
;
*
cp
++
=
flags
&
VM_EXEC
?
'x'
:
'-'
;
*
cp
++
=
flags
&
VM_MAYSHARE
?
's'
:
'p'
;
*
cp
++
=
0
;
dev
=
0
;
ino
=
0
;
if
(
map
->
vm_file
!=
NULL
)
{
dev
=
map
->
vm_file
->
f_dentry
->
d_inode
->
i_dev
;
ino
=
map
->
vm_file
->
f_dentry
->
d_inode
->
i_ino
;
line
=
d_path
(
map
->
vm_file
->
f_dentry
,
map
->
vm_file
->
f_vfsmnt
,
buffer
,
PAGE_SIZE
);
}
printk
(
MAPS_LINE_FORMAT
,
map
->
vm_start
,
map
->
vm_end
,
str
,
map
->
vm_pgoff
<<
PAGE_SHIFT
,
MAJOR
(
dev
),
MINOR
(
dev
),
ino
);
if
(
map
->
vm_file
!=
NULL
)
printk
(
"%s
\n
"
,
line
);
else
printk
(
"
\n
"
);
}
free_page
((
unsigned
long
)
buffer
);
return
;
}
#endif
/* Note that 'init' is a special process: it doesn't get signals it doesn't
* want to handle. Thus you cannot kill init even with a SIGKILL even by
* mistake.
...
...
@@ -1380,16 +1275,27 @@ static inline void read_maps (void)
int
do_signal32
(
sigset_t
*
oldset
,
struct
pt_regs
*
regs
,
unsigned
long
orig_i0
,
int
restart_syscall
)
{
unsigned
long
signr
;
struct
k_sigaction
*
ka
;
siginfo_t
info
;
int
svr4_signal
=
current
->
personality
==
PER_SVR4
;
for
(;;)
{
spin_lock_irq
(
&
current
->
sigmask_lock
);
signr
=
dequeue_signal
(
&
current
->
blocked
,
&
info
);
spin_unlock_irq
(
&
current
->
sigmask_lock
);
sigset_t
*
mask
=
&
current
->
blocked
;
unsigned
long
signr
=
0
;
local_irq_disable
();
if
(
current
->
sig
->
shared_pending
.
head
)
{
spin_lock
(
&
current
->
sig
->
siglock
);
signr
=
dequeue_signal
(
&
current
->
sig
->
shared_pending
,
mask
,
&
info
);
spin_unlock
(
&
current
->
sig
->
siglock
);
}
if
(
!
signr
)
{
spin_lock
(
&
current
->
sigmask_lock
);
signr
=
dequeue_signal
(
&
current
->
pending
,
mask
,
&
info
);
spin_unlock
(
&
current
->
sigmask_lock
);
}
local_irq_enable
();
if
(
!
signr
)
break
;
...
...
@@ -1410,7 +1316,7 @@ int do_signal32(sigset_t *oldset, struct pt_regs * regs,
}
current
->
exit_code
=
signr
;
current
->
state
=
TASK_STOPPED
;
set_current_state
(
TASK_STOPPED
)
;
notify_parent
(
current
,
SIGCHLD
);
schedule
();
if
(
!
(
signr
=
current
->
exit_code
))
...
...
@@ -1465,8 +1371,7 @@ int do_signal32(sigset_t *oldset, struct pt_regs * regs,
case
SIGSTOP
:
{
struct
signal_struct
*
sig
;
current
->
state
=
TASK_STOPPED
;
set_current_state
(
TASK_STOPPED
);
current
->
exit_code
=
signr
;
sig
=
current
->
parent
->
sig
;
if
(
sig
&&
!
(
sig
->
action
[
SIGCHLD
-
1
].
sa
.
sa_flags
&
...
...
@@ -1480,40 +1385,8 @@ int do_signal32(sigset_t *oldset, struct pt_regs * regs,
case
SIGBUS
:
case
SIGSYS
:
case
SIGXCPU
:
case
SIGXFSZ
:
if
(
do_coredump
(
signr
,
regs
))
exit_code
|=
0x80
;
#ifdef DEBUG_SIGNALS
/* Very useful to debug dynamic linker problems */
printk
(
"Sig %ld going for %s[%d]...
\n
"
,
signr
,
current
->
comm
,
current
->
pid
);
/* On SMP we are only interested in the current
* CPU's registers.
*/
__show_regs
(
regs
);
#ifdef DEBUG_SIGNALS_TLB
do
{
extern
void
sparc_ultra_dump_itlb
(
void
);
extern
void
sparc_ultra_dump_dtlb
(
void
);
sparc_ultra_dump_dtlb
();
sparc_ultra_dump_itlb
();
}
while
(
0
);
#endif
#ifdef DEBUG_SIGNALS_TRACE
{
struct
reg_window32
*
rw
=
(
struct
reg_window32
*
)(
regs
->
u_regs
[
UREG_FP
]
&
0xffffffff
);
unsigned
int
ins
[
8
];
/* FALLTHRU */
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 */
default:
sig_exit
(
signr
,
exit_code
,
&
info
);
/* NOT REACHED */
...
...
arch/sparc64/kernel/sys_sparc32.c
View file @
d1a75a97
...
...
@@ -1921,30 +1921,42 @@ sys32_rt_sigtimedwait(sigset_t32 *uthese, siginfo_t32 *uinfo,
return
-
EINVAL
;
}
spin_lock_irq
(
&
current
->
sigmask_lock
);
sig
=
dequeue_signal
(
&
these
,
&
info
);
spin_lock_irq
(
&
current
->
sig
->
siglock
);
spin_lock
(
&
current
->
sigmask_lock
);
sig
=
dequeue_signal
(
&
current
->
sig
->
shared_pending
,
&
these
,
&
info
);
if
(
!
sig
)
sig
=
dequeue_signal
(
&
current
->
pending
,
&
these
,
&
info
);
if
(
!
sig
)
{
/* None ready -- temporarily unblock those we're interested
in so that we'll be awakened when they arrive. */
sigset_t
oldblocked
=
current
->
blocked
;
sigandsets
(
&
current
->
blocked
,
&
current
->
blocked
,
&
these
);
recalc_sigpending
();
spin_unlock_irq
(
&
current
->
sigmask_lock
);
timeout
=
MAX_SCHEDULE_TIMEOUT
;
if
(
uts
)
timeout
=
(
timespec_to_jiffies
(
&
ts
)
+
(
ts
.
tv_sec
||
ts
.
tv_nsec
));
if
(
timeout
)
{
/* None ready -- temporarily unblock those we're
* interested while we are sleeping in so that we'll
* be awakened when they arrive. */
current
->
real_blocked
=
current
->
blocked
;
sigandsets
(
&
current
->
blocked
,
&
current
->
blocked
,
&
these
);
recalc_sigpending
();
spin_unlock
(
&
current
->
sigmask_lock
);
spin_unlock_irq
(
&
current
->
sig
->
siglock
);
current
->
state
=
TASK_INTERRUPTIBLE
;
timeout
=
schedule_timeout
(
timeout
);
spin_lock_irq
(
&
current
->
sigmask_lock
);
sig
=
dequeue_signal
(
&
these
,
&
info
);
current
->
blocked
=
oldblocked
;
spin_lock_irq
(
&
current
->
sig
->
siglock
);
spin_lock
(
&
current
->
sigmask_lock
);
sig
=
dequeue_signal
(
&
current
->
sig
->
shared_pending
,
&
these
,
&
info
);
if
(
!
sig
)
sig
=
dequeue_signal
(
&
current
->
pending
,
&
these
,
&
info
);
current
->
blocked
=
current
->
real_blocked
;
siginitset
(
&
current
->
real_blocked
,
0
);
recalc_sigpending
();
}
spin_unlock_irq
(
&
current
->
sigmask_lock
);
}
spin_unlock
(
&
current
->
sigmask_lock
);
spin_unlock_irq
(
&
current
->
sig
->
siglock
);
if
(
sig
)
{
ret
=
sig
;
...
...
arch/sparc64/kernel/systbls.S
View file @
d1a75a97
...
...
@@ -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
...
...
arch/sparc64/kernel/time.c
View file @
d1a75a97
...
...
@@ -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_
u
sec
=
0
;
xtime
.
tv_
n
sec
=
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_
u
sec
=
0
;
xtime
.
tv_
n
sec
=
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
;
...
...
arch/sparc64/mm/init.c
View file @
d1a75a97
...
...
@@ -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
();
...
...
arch/sparc64/prom/misc.c
View file @
d1a75a97
...
...
@@ -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
);
...
...
drivers/serial/sunsu.c
View file @
d1a75a97
...
...
@@ -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
*/
...
...
drivers/serial/sunzilog.c
View file @
d1a75a97
...
...
@@ -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
);
prom
t
_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,26 +1664,27 @@ 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
);
NUM_SUNZILOG
=
2
;
goto
no_probe
;
}
node
=
prom_searchsiblings
(
node
,
"zs"
);
if
(
!
node
)
return
-
ENODEV
;
NUM_SUNZILOG
=
2
;
no_probe:
}
sunzilog_alloc_tables
();
...
...
include/asm-sparc/hardirq.h
View file @
d1a75a97
...
...
@@ -39,8 +39,8 @@ typedef struct {
* - ( bit 26 is the PREEMPT_ACTIVE flag. )
*
* PREEMPT_MASK: 0x000000ff
*
HARD
IRQ_MASK: 0x0000ff00
*
SOFT
IRQ_MASK: 0x00ff0000
*
SOFT
IRQ_MASK: 0x0000ff00
*
HARD
IRQ_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) */
...
...
include/asm-sparc/highmem.h
View file @
d1a75a97
...
...
@@ -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 */
include/asm-sparc/ide.h
View file @
d1a75a97
...
...
@@ -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__ */
...
...
include/asm-sparc/irq.h
View file @
d1a75a97
...
...
@@ -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
...
...
include/asm-sparc/kmap_types.h
View file @
d1a75a97
...
...
@@ -11,6 +11,8 @@ enum km_type {
KM_BIO_DST_IRQ
,
KM_PTE0
,
KM_PTE1
,
KM_IRQ0
,
KM_IRQ1
,
KM_TYPE_NR
};
...
...
include/asm-sparc/spinlock.h
View file @
d1a75a97
...
...
@@ -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.
...
...
include/asm-sparc/system.h
View file @
d1a75a97
...
...
@@ -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
...
...
include/asm-sparc/unistd.h
View file @
d1a75a97
...
...
@@ -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 */
...
...
include/asm-sparc64/hardirq.h
View file @
d1a75a97
...
...
@@ -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() \
...
...
include/asm-sparc64/ide.h
View file @
d1a75a97
...
...
@@ -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__ */
...
...
include/asm-sparc64/spinlock.h
View file @
d1a75a97
...
...
@@ -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
);
...
...
include/asm-sparc64/unistd.h
View file @
d1a75a97
...
...
@@ -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 */
...
...
kernel/signal.c
View file @
d1a75a97
...
...
@@ -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 (\
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment