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
nexedi
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
Expand all
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
This diff is collapsed.
Click to expand it.
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