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
bd59127c
Commit
bd59127c
authored
Aug 25, 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
633afd73
482cf40c
Changes
51
Hide whitespace changes
Inline
Side-by-side
Showing
51 changed files
with
994 additions
and
390 deletions
+994
-390
arch/i386/kernel/process.c
arch/i386/kernel/process.c
+1
-1
arch/sparc/kernel/irq.c
arch/sparc/kernel/irq.c
+1
-0
arch/sparc/kernel/process.c
arch/sparc/kernel/process.c
+14
-0
arch/sparc/kernel/ptrace.c
arch/sparc/kernel/ptrace.c
+9
-0
arch/sparc/kernel/sun4c_irq.c
arch/sparc/kernel/sun4c_irq.c
+1
-1
arch/sparc/kernel/sun4d_irq.c
arch/sparc/kernel/sun4d_irq.c
+1
-1
arch/sparc/kernel/sun4m_irq.c
arch/sparc/kernel/sun4m_irq.c
+1
-1
arch/sparc/kernel/systbls.S
arch/sparc/kernel/systbls.S
+1
-1
arch/sparc/mm/fault.c
arch/sparc/mm/fault.c
+1
-0
arch/sparc64/defconfig
arch/sparc64/defconfig
+72
-75
arch/sparc64/kernel/chmc.c
arch/sparc64/kernel/chmc.c
+1
-1
arch/sparc64/kernel/cpu.c
arch/sparc64/kernel/cpu.c
+2
-0
arch/sparc64/kernel/devices.c
arch/sparc64/kernel/devices.c
+2
-1
arch/sparc64/kernel/dtlb_base.S
arch/sparc64/kernel/dtlb_base.S
+1
-1
arch/sparc64/kernel/entry.S
arch/sparc64/kernel/entry.S
+190
-3
arch/sparc64/kernel/etrap.S
arch/sparc64/kernel/etrap.S
+50
-2
arch/sparc64/kernel/head.S
arch/sparc64/kernel/head.S
+91
-19
arch/sparc64/kernel/irq.c
arch/sparc64/kernel/irq.c
+3
-2
arch/sparc64/kernel/process.c
arch/sparc64/kernel/process.c
+16
-0
arch/sparc64/kernel/ptrace.c
arch/sparc64/kernel/ptrace.c
+10
-1
arch/sparc64/kernel/setup.c
arch/sparc64/kernel/setup.c
+2
-2
arch/sparc64/kernel/smp.c
arch/sparc64/kernel/smp.c
+13
-7
arch/sparc64/kernel/sys_sparc32.c
arch/sparc64/kernel/sys_sparc32.c
+20
-5
arch/sparc64/kernel/systbls.S
arch/sparc64/kernel/systbls.S
+2
-2
arch/sparc64/kernel/trampoline.S
arch/sparc64/kernel/trampoline.S
+33
-8
arch/sparc64/kernel/traps.c
arch/sparc64/kernel/traps.c
+148
-13
arch/sparc64/kernel/ttable.S
arch/sparc64/kernel/ttable.S
+9
-3
arch/sparc64/lib/blockops.S
arch/sparc64/lib/blockops.S
+11
-8
arch/sparc64/mm/fault.c
arch/sparc64/mm/fault.c
+1
-0
arch/sparc64/mm/init.c
arch/sparc64/mm/init.c
+42
-15
arch/sparc64/mm/modutil.c
arch/sparc64/mm/modutil.c
+26
-15
arch/sparc64/mm/ultra.S
arch/sparc64/mm/ultra.S
+162
-137
drivers/video/aty/mach64_cursor.c
drivers/video/aty/mach64_cursor.c
+1
-1
drivers/video/cgfourteenfb.c
drivers/video/cgfourteenfb.c
+1
-1
drivers/video/cgsixfb.c
drivers/video/cgsixfb.c
+1
-1
drivers/video/cgthreefb.c
drivers/video/cgthreefb.c
+1
-1
drivers/video/sbusfb.c
drivers/video/sbusfb.c
+0
-35
include/asm-sparc/ide.h
include/asm-sparc/ide.h
+13
-5
include/asm-sparc/pgtable.h
include/asm-sparc/pgtable.h
+1
-1
include/asm-sparc/unistd.h
include/asm-sparc/unistd.h
+1
-1
include/asm-sparc64/asi.h
include/asm-sparc64/asi.h
+1
-0
include/asm-sparc64/dcr.h
include/asm-sparc64/dcr.h
+3
-1
include/asm-sparc64/elf.h
include/asm-sparc64/elf.h
+2
-1
include/asm-sparc64/head.h
include/asm-sparc64/head.h
+3
-0
include/asm-sparc64/ide.h
include/asm-sparc64/ide.h
+14
-5
include/asm-sparc64/smp.h
include/asm-sparc64/smp.h
+1
-1
include/asm-sparc64/spitfire.h
include/asm-sparc64/spitfire.h
+10
-8
include/asm-sparc64/unistd.h
include/asm-sparc64/unistd.h
+1
-1
include/linux/fb.h
include/linux/fb.h
+1
-0
include/linux/sched.h
include/linux/sched.h
+1
-1
kernel/fork.c
kernel/fork.c
+1
-1
No files found.
arch/i386/kernel/process.c
View file @
bd59127c
...
...
@@ -625,7 +625,7 @@ int copy_thread(int nr, unsigned long clone_flags, unsigned long esp,
* Does the userspace VM want the TID cleared on mm_release()?
*/
if
(
clone_flags
&
CLONE_CLEARTID
)
p
->
user_tid
=
(
long
*
)
childregs
->
edx
;
p
->
user_tid
=
(
int
*
)
childregs
->
edx
;
return
0
;
}
...
...
arch/sparc/kernel/irq.c
View file @
bd59127c
...
...
@@ -12,6 +12,7 @@
*/
#include <linux/config.h>
#include <linux/sched.h>
#include <linux/ptrace.h>
#include <linux/errno.h>
#include <linux/linkage.h>
...
...
arch/sparc/kernel/process.c
View file @
bd59127c
...
...
@@ -508,6 +508,8 @@ int copy_thread(int nr, unsigned long clone_flags, unsigned long sp,
#endif
}
p
->
user_tid
=
NULL
;
/* Calculate offset to stack_frame & pt_regs */
stack_offset
=
THREAD_SIZE
-
TRACEREG_SZ
;
...
...
@@ -581,6 +583,16 @@ int copy_thread(int nr, unsigned long clone_flags, unsigned long sp,
/* Set the return value for the parent. */
regs
->
u_regs
[
UREG_I1
]
=
0
;
if
(
!
(
clone_flags
&
(
CLONE_SETTID
|
CLONE_CLEARTID
)))
return
0
;
if
(
clone_flags
&
CLONE_SETTID
)
if
(
put_user
(
p
->
pid
,
(
int
*
)
childregs
->
u_regs
[
UREG_G2
]))
return
-
EFAULT
;
if
(
clone_flags
&
CLONE_CLEARTID
)
p
->
user_tid
=
(
int
*
)
childregs
->
u_regs
[
UREG_G2
];
return
0
;
}
...
...
@@ -681,6 +693,8 @@ asmlinkage int sparc_execve(struct pt_regs *regs)
error
=
do_execve
(
filename
,
(
char
**
)
regs
->
u_regs
[
base
+
UREG_I1
],
(
char
**
)
regs
->
u_regs
[
base
+
UREG_I2
],
regs
);
putname
(
filename
);
if
(
error
==
0
)
current
->
ptrace
&=
~
PT_DTRACE
;
out:
return
error
;
}
...
...
arch/sparc/kernel/ptrace.c
View file @
bd59127c
...
...
@@ -17,6 +17,7 @@
#include <linux/user.h>
#include <linux/smp.h>
#include <linux/smp_lock.h>
#include <linux/security.h>
#include <asm/pgtable.h>
#include <asm/system.h>
...
...
@@ -283,11 +284,19 @@ asmlinkage void do_ptrace(struct pt_regs *regs)
}
#endif
if
(
request
==
PTRACE_TRACEME
)
{
int
ret
;
/* are we already being traced? */
if
(
current
->
ptrace
&
PT_PTRACED
)
{
pt_error_return
(
regs
,
EPERM
);
goto
out
;
}
ret
=
security_ops
->
ptrace
(
current
->
parent
,
current
);
if
(
ret
)
{
pt_error_return
(
regs
,
-
ret
);
goto
out
;
}
/* set the ptrace bit in the process flags. */
current
->
ptrace
|=
PT_PTRACED
;
pt_succ_return
(
regs
,
0
);
...
...
arch/sparc/kernel/sun4c_irq.c
View file @
bd59127c
...
...
@@ -10,12 +10,12 @@
*/
#include <linux/config.h>
#include <linux/ptrace.h>
#include <linux/errno.h>
#include <linux/linkage.h>
#include <linux/kernel_stat.h>
#include <linux/signal.h>
#include <linux/sched.h>
#include <linux/ptrace.h>
#include <linux/interrupt.h>
#include <linux/slab.h>
#include <linux/init.h>
...
...
arch/sparc/kernel/sun4d_irq.c
View file @
bd59127c
...
...
@@ -7,12 +7,12 @@
*/
#include <linux/config.h>
#include <linux/ptrace.h>
#include <linux/errno.h>
#include <linux/linkage.h>
#include <linux/kernel_stat.h>
#include <linux/signal.h>
#include <linux/sched.h>
#include <linux/ptrace.h>
#include <linux/interrupt.h>
#include <linux/slab.h>
#include <linux/random.h>
...
...
arch/sparc/kernel/sun4m_irq.c
View file @
bd59127c
...
...
@@ -10,12 +10,12 @@
*/
#include <linux/config.h>
#include <linux/ptrace.h>
#include <linux/errno.h>
#include <linux/linkage.h>
#include <linux/kernel_stat.h>
#include <linux/signal.h>
#include <linux/sched.h>
#include <linux/ptrace.h>
#include <linux/smp.h>
#include <linux/interrupt.h>
#include <linux/slab.h>
...
...
arch/sparc/kernel/systbls.S
View file @
bd59127c
...
...
@@ -49,7 +49,7 @@ sys_call_table:
/*
140
*/
.
long
sys_sendfile64
,
sys_nis_syscall
,
sys_futex
,
sys_gettid
,
sys_getrlimit
/*
145
*/
.
long
sys_setrlimit
,
sys_pivot_root
,
sys_prctl
,
sys_pciconfig_read
,
sys_pciconfig_write
/*
150
*/
.
long
sys_nis_syscall
,
sys_nis_syscall
,
sys_nis_syscall
,
sys_poll
,
sys_getdents64
/*
155
*/
.
long
sys_fcntl64
,
sys_
nis_syscall
,
sys_statfs
,
sys_fstatfs
,
sys_oldumount
/*
155
*/
.
long
sys_fcntl64
,
sys_
security
,
sys_statfs
,
sys_fstatfs
,
sys_oldumount
/*
160
*/
.
long
sys_sched_setaffinity
,
sys_sched_getaffinity
,
sys_getdomainname
,
sys_setdomainname
,
sys_nis_syscall
/*
165
*/
.
long
sys_quotactl
,
sys_nis_syscall
,
sys_mount
,
sys_ustat
,
sys_setxattr
/*
170
*/
.
long
sys_lsetxattr
,
sys_fsetxattr
,
sys_getxattr
,
sys_lgetxattr
,
sys_getdents
...
...
arch/sparc/mm/fault.c
View file @
bd59127c
...
...
@@ -10,6 +10,7 @@
#include <linux/string.h>
#include <linux/types.h>
#include <linux/sched.h>
#include <linux/ptrace.h>
#include <linux/mman.h>
#include <linux/threads.h>
...
...
arch/sparc64/defconfig
View file @
bd59127c
...
...
@@ -95,7 +95,9 @@ CONFIG_DUMMY_CONSOLE=y
# CONFIG_FB_CYBER2000 is not set
# CONFIG_FB_RIVA is not set
# CONFIG_FB_MATROX is not set
# CONFIG_FB_ATY is not set
CONFIG_FB_ATY=y
CONFIG_FB_ATY_GX=y
CONFIG_FB_ATY_CT=y
# CONFIG_FB_RADEON is not set
# CONFIG_FB_ATY128 is not set
# CONFIG_FB_SIS is not set
...
...
@@ -111,9 +113,12 @@ CONFIG_FB_CGSIX=y
# CONFIG_FB_CGTHREE is not set
# CONFIG_FB_LEO is not set
CONFIG_FB_PCI=y
# CONFIG_FB_ATY is not set
CONFIG_FB_ATY=y
CONFIG_FB_ATY_CT=y
# CONFIG_FB_VIRTUAL is not set
# CONFIG_FBCON_ADVANCED is not set
CONFIG_FBCON_CFB24=y
CONFIG_FBCON_ACCEL=y
CONFIG_FBCON_FONTWIDTH8_ONLY=y
CONFIG_FONT_SUN8x16=y
# CONFIG_FBCON_FONTS is not set
...
...
@@ -185,79 +190,6 @@ CONFIG_MD_RAID1=m
# CONFIG_BLK_DEV_RAM is not set
# CONFIG_BLK_DEV_INITRD is not set
#
# Networking options
#
CONFIG_PACKET=y
CONFIG_PACKET_MMAP=y
CONFIG_NETLINK_DEV=y
# CONFIG_NETFILTER is not set
# CONFIG_FILTER is not set
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_NET_IPIP is not set
# CONFIG_NET_IPGRE is not set
CONFIG_ARPD=y
CONFIG_INET_ECN=y
# CONFIG_SYN_COOKIES is not set
CONFIG_IPV6=m
# CONFIG_ATM is not set
CONFIG_VLAN_8021Q=m
#
#
#
CONFIG_IPX=m
# CONFIG_IPX_INTERN is not set
CONFIG_ATALK=m
#
# Appletalk devices
#
# CONFIG_DEV_APPLETALK is not set
CONFIG_DECNET=m
CONFIG_DECNET_SIOCGIFCONF=y
# CONFIG_DECNET_ROUTER is not set
# CONFIG_BRIDGE is not set
# CONFIG_X25 is not set
# CONFIG_LAPB is not set
CONFIG_LLC=m
CONFIG_LLC_UI=y
# CONFIG_NET_DIVERT is not set
# CONFIG_ECONET is not set
# CONFIG_WAN_ROUTER is not set
# CONFIG_NET_FASTROUTE is not set
# CONFIG_NET_HW_FLOWCONTROL is not set
#
# QoS and/or fair queueing
#
CONFIG_NET_SCHED=y
CONFIG_NET_SCH_CBQ=m
CONFIG_NET_SCH_HTB=m
CONFIG_NET_SCH_CSZ=m
CONFIG_NET_SCH_PRIO=m
CONFIG_NET_SCH_RED=m
CONFIG_NET_SCH_SFQ=m
CONFIG_NET_SCH_TEQL=m
CONFIG_NET_SCH_TBF=m
CONFIG_NET_SCH_GRED=m
CONFIG_NET_SCH_DSMARK=m
CONFIG_NET_QOS=y
CONFIG_NET_ESTIMATOR=y
CONFIG_NET_CLS=y
CONFIG_NET_CLS_TCINDEX=m
CONFIG_NET_CLS_ROUTE4=m
CONFIG_NET_CLS_ROUTE=y
CONFIG_NET_CLS_FW=m
CONFIG_NET_CLS_U32=m
CONFIG_NET_CLS_RSVP=m
CONFIG_NET_CLS_RSVP6=m
CONFIG_NET_CLS_POLICE=y
#
# ATA/ATAPI/MFM/RLL device support
#
...
...
@@ -421,6 +353,71 @@ CONFIG_IEEE1394_CMP=m
CONFIG_IEEE1394_AMDTP=m
# CONFIG_IEEE1394_VERBOSEDEBUG is not set
#
# Networking options
#
CONFIG_PACKET=y
CONFIG_PACKET_MMAP=y
CONFIG_NETLINK_DEV=y
# CONFIG_NETFILTER is not set
# CONFIG_FILTER is not set
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_NET_IPIP is not set
# CONFIG_NET_IPGRE is not set
CONFIG_ARPD=y
CONFIG_INET_ECN=y
# CONFIG_SYN_COOKIES is not set
CONFIG_IPV6=m
# CONFIG_ATM is not set
CONFIG_VLAN_8021Q=m
CONFIG_LLC=m
CONFIG_LLC_UI=y
CONFIG_IPX=m
# CONFIG_IPX_INTERN is not set
CONFIG_ATALK=m
# CONFIG_DEV_APPLETALK is not set
CONFIG_DECNET=m
CONFIG_DECNET_SIOCGIFCONF=y
# CONFIG_DECNET_ROUTER is not set
# CONFIG_BRIDGE is not set
# CONFIG_X25 is not set
# CONFIG_LAPB is not set
# CONFIG_NET_DIVERT is not set
# CONFIG_ECONET is not set
# CONFIG_WAN_ROUTER is not set
# CONFIG_NET_FASTROUTE is not set
# CONFIG_NET_HW_FLOWCONTROL is not set
#
# QoS and/or fair queueing
#
CONFIG_NET_SCHED=y
CONFIG_NET_SCH_CBQ=m
CONFIG_NET_SCH_HTB=m
CONFIG_NET_SCH_CSZ=m
CONFIG_NET_SCH_PRIO=m
CONFIG_NET_SCH_RED=m
CONFIG_NET_SCH_SFQ=m
CONFIG_NET_SCH_TEQL=m
CONFIG_NET_SCH_TBF=m
CONFIG_NET_SCH_GRED=m
CONFIG_NET_SCH_DSMARK=m
CONFIG_NET_QOS=y
CONFIG_NET_ESTIMATOR=y
CONFIG_NET_CLS=y
CONFIG_NET_CLS_TCINDEX=m
CONFIG_NET_CLS_ROUTE4=m
CONFIG_NET_CLS_ROUTE=y
CONFIG_NET_CLS_FW=m
CONFIG_NET_CLS_U32=m
CONFIG_NET_CLS_RSVP=m
CONFIG_NET_CLS_RSVP6=m
CONFIG_NET_CLS_POLICE=y
#
# Network device support
#
...
...
arch/sparc64/kernel/chmc.c
View file @
bd59127c
...
...
@@ -424,7 +424,7 @@ static int __init chmc_init(void)
int
index
;
/* This driver is only for cheetah platforms. */
if
(
tlb_type
!=
cheetah
)
if
(
tlb_type
!=
cheetah
&&
tlb_type
!=
cheetah_plus
)
return
-
ENODEV
;
index
=
probe_for_string
(
"memory-controller"
,
0
);
...
...
arch/sparc64/kernel/cpu.c
View file @
bd59127c
...
...
@@ -33,6 +33,7 @@ struct cpu_fp_info linux_sparc_fpu[] = {
{
0x17
,
0x12
,
0
,
"UltraSparc IIi integrated FPU"
},
{
0x17
,
0x13
,
0
,
"UltraSparc IIe integrated FPU"
},
{
0x3e
,
0x14
,
0
,
"UltraSparc III integrated FPU"
},
{
0x3e
,
0x15
,
0
,
"UltraSparc III+ integrated FPU"
},
};
#define NSPARCFPU (sizeof(linux_sparc_fpu)/sizeof(struct cpu_fp_info))
...
...
@@ -44,6 +45,7 @@ struct cpu_iu_info linux_sparc_chips[] = {
{
0x17
,
0x12
,
"TI UltraSparc IIi"
},
{
0x17
,
0x13
,
"TI UltraSparc IIe"
},
{
0x3e
,
0x14
,
"TI UltraSparc III (Cheetah)"
},
{
0x3e
,
0x15
,
"TI UltraSparc III+ (Cheetah+)"
},
};
#define NSPARCCHIPS (sizeof(linux_sparc_chips)/sizeof(struct cpu_iu_info))
...
...
arch/sparc64/kernel/devices.c
View file @
bd59127c
...
...
@@ -63,7 +63,8 @@ void __init device_scan(void)
if
(
tlb_type
==
spitfire
)
{
prom_getproperty
(
scan
,
"upa-portid"
,
(
char
*
)
&
thismid
,
sizeof
(
thismid
));
}
else
if
(
tlb_type
==
cheetah
)
{
}
else
if
(
tlb_type
==
cheetah
||
tlb_type
==
cheetah_plus
)
{
prom_getproperty
(
scan
,
"portid"
,
(
char
*
)
&
thismid
,
sizeof
(
thismid
));
}
...
...
arch/sparc64/kernel/dtlb_base.S
View file @
bd59127c
...
...
@@ -73,7 +73,7 @@ from_tl1_trap:
CREATE_VPTE_OFFSET1
(%
g4
,
%
g6
)
!
Create
VPTE
offset
be
,
pn
%
xcc
,
3
f
!
Yep
,
special
processing
CREATE_VPTE_OFFSET2
(%
g4
,
%
g6
)
!
Create
VPTE
offset
cmp
%
g5
,
3
!
Last
trap
level
?
cmp
%
g5
,
4
!
Last
trap
level
?
be
,
pn
%
xcc
,
longpath
!
Yep
,
cannot
risk
VPTE
miss
nop
!
delay
slot
...
...
arch/sparc64/kernel/entry.S
View file @
bd59127c
...
...
@@ -774,7 +774,14 @@ __do_instruction_access_exception_tl1:
membar
#
Sync
sethi
%
hi
(
109
f
),
%
g7
ba
,
pt
%
xcc
,
etraptl1
or
%
g7
,
%
lo
(
109
f
),
%
g7
!
Merge
in
below
109
:
or
%
g7
,
%
lo
(
109
b
),
%
g7
mov
%
l4
,
%
o1
mov
%
l5
,
%
o2
call
instruction_access_exception_tl1
add
%
sp
,
STACK_BIAS
+
REGWIN_SZ
,
%
o0
ba
,
pt
%
xcc
,
rtrap
clr
%
l6
__do_instruction_access_exception
:
rdpr
%
pstate
,
%
g4
wrpr
%
g4
,
PSTATE_MG
|
PSTATE_AG
,
%
pstate
...
...
@@ -1074,6 +1081,181 @@ cheetah_deferred_trap_vector_tl1:
jmpl
%
g2
+
%
lo
(
cheetah_deferred_trap
),
%
g0
mov
1
,
%
g1
/
*
Cheetah
+
specific
traps
.
These
are
for
the
new
I
/
D
cache
parity
*
error
traps
.
The
first
argument
to
cheetah_plus_parity_handler
*
is
encoded
as
follows
:
*
*
Bit0
:
0
=
dcache
,
1
=
icache
*
Bit1
:
0
=
recoverable
,
1
=
unrecoverable
*/
.
globl
cheetah_plus_dcpe_trap_vector
,
cheetah_plus_dcpe_trap_vector_tl1
cheetah_plus_dcpe_trap_vector
:
membar
#
Sync
sethi
%
hi
(
do_cheetah_plus_data_parity
),
%
g7
jmpl
%
g7
+
%
lo
(
do_cheetah_plus_data_parity
),
%
g0
nop
nop
nop
nop
nop
do_cheetah_plus_data_parity
:
ba
,
pt
%
xcc
,
etrap
rd
%
pc
,
%
g7
mov
0x0
,
%
o0
call
cheetah_plus_parity_error
add
%
sp
,
STACK_BIAS
+
REGWIN_SZ
,
%
o1
ba
,
pt
%
xcc
,
rtrap
clr
%
l6
cheetah_plus_dcpe_trap_vector_tl1
:
membar
#
Sync
wrpr
PSTATE_IG
| PSTATE_PEF |
PSTATE_PRIV
,
%
pstate
sethi
%
hi
(
do_dcpe_tl1
),
%
g3
jmpl
%
g3
+
%
lo
(
do_dcpe_tl1
),
%
g0
nop
nop
nop
nop
.
globl
cheetah_plus_icpe_trap_vector
,
cheetah_plus_icpe_trap_vector_tl1
cheetah_plus_icpe_trap_vector
:
membar
#
Sync
sethi
%
hi
(
do_cheetah_plus_insn_parity
),
%
g7
jmpl
%
g7
+
%
lo
(
do_cheetah_plus_insn_parity
),
%
g0
nop
nop
nop
nop
nop
do_cheetah_plus_insn_parity
:
ba
,
pt
%
xcc
,
etrap
rd
%
pc
,
%
g7
mov
0x1
,
%
o0
call
cheetah_plus_parity_error
add
%
sp
,
STACK_BIAS
+
REGWIN_SZ
,
%
o1
ba
,
pt
%
xcc
,
rtrap
clr
%
l6
cheetah_plus_icpe_trap_vector_tl1
:
membar
#
Sync
wrpr
PSTATE_IG
| PSTATE_PEF |
PSTATE_PRIV
,
%
pstate
sethi
%
hi
(
do_icpe_tl1
),
%
g3
jmpl
%
g3
+
%
lo
(
do_icpe_tl1
),
%
g0
nop
nop
nop
nop
/
*
If
we
take
one
of
these
traps
when
tl
>=
1
,
then
we
*
jump
to
interrupt
globals
.
If
some
trap
level
above
us
*
was
also
using
interrupt
globals
,
we
cannot
recover
.
*
We
may
use
all
interrupt
global
registers
except
%
g6
.
*/
.
globl
do_dcpe_tl1
,
do_icpe_tl1
do_dcpe_tl1
:
rdpr
%
tl
,
%
g1
!
Save
original
trap
level
mov
1
,
%
g2
!
Setup
TSTATE
checking
loop
sethi
%
hi
(
TSTATE_IG
),
%
g3
!
TSTATE
mask
bit
1
:
wrpr
%
g2
,
%
tl
!
Set
trap
level
to
check
rdpr
%
tstate
,
%
g4
!
Read
TSTATE
for
this
level
andcc
%
g4
,
%
g3
,
%
g0
!
Interrupt
globals
in
use
?
bne
,
a
,
pn
%
xcc
,
do_dcpe_tl1_fatal
!
Yep
,
irrecoverable
wrpr
%
g1
,
%
tl
!
Restore
original
trap
level
add
%
g2
,
1
,
%
g2
!
Next
trap
level
cmp
%
g2
,
%
g1
!
Hit
them
all
yet
?
ble
,
pt
%
icc
,
1
b
!
Not
yet
nop
wrpr
%
g1
,
%
tl
!
Restore
original
trap
level
do_dcpe_tl1_nonfatal
:
/
*
Ok
we
may
use
interrupt
globals
safely
.
*/
/
*
Reset
D
-
cache
parity
*/
sethi
%
hi
(
1
<<
16
),
%
g1
!
D
-
cache
size
mov
(
1
<<
5
),
%
g2
!
D
-
cache
line
size
sub
%
g1
,
%
g2
,
%
g1
!
Move
down
1
cacheline
1
:
srl
%
g1
,
14
,
%
g3
!
Compute
UTAG
membar
#
Sync
stxa
%
g3
,
[%
g1
]
ASI_DCACHE_UTAG
membar
#
Sync
sub
%
g2
,
8
,
%
g3
!
64
-
bit
data
word
within
line
2
:
membar
#
Sync
stxa
%
g0
,
[%
g1
+
%
g3
]
ASI_DCACHE_DATA
membar
#
Sync
subcc
%
g3
,
8
,
%
g3
!
Next
64
-
bit
data
word
bge
,
pt
%
icc
,
2
b
nop
subcc
%
g1
,
%
g2
,
%
g1
!
Next
cacheline
bge
,
pt
%
icc
,
1
b
nop
ba
,
pt
%
xcc
,
dcpe_icpe_tl1_common
nop
do_dcpe_tl1_fatal
:
sethi
%
hi
(
1
f
),
%
g7
ba
,
pt
%
xcc
,
etraptl1
1
:
or
%
g7
,
%
lo
(
1
b
),
%
g7
mov
0x2
,
%
o0
call
cheetah_plus_parity_error
add
%
sp
,
STACK_BIAS
+
REGWIN_SZ
,
%
o1
ba
,
pt
%
xcc
,
rtrap
clr
%
l6
do_icpe_tl1
:
rdpr
%
tl
,
%
g1
!
Save
original
trap
level
mov
1
,
%
g2
!
Setup
TSTATE
checking
loop
sethi
%
hi
(
TSTATE_IG
),
%
g3
!
TSTATE
mask
bit
1
:
wrpr
%
g2
,
%
tl
!
Set
trap
level
to
check
rdpr
%
tstate
,
%
g4
!
Read
TSTATE
for
this
level
andcc
%
g4
,
%
g3
,
%
g0
!
Interrupt
globals
in
use
?
bne
,
a
,
pn
%
xcc
,
do_icpe_tl1_fatal
!
Yep
,
irrecoverable
wrpr
%
g1
,
%
tl
!
Restore
original
trap
level
add
%
g2
,
1
,
%
g2
!
Next
trap
level
cmp
%
g2
,
%
g1
!
Hit
them
all
yet
?
ble
,
pt
%
icc
,
1
b
!
Not
yet
nop
wrpr
%
g1
,
%
tl
!
Restore
original
trap
level
do_icpe_tl1_nonfatal
:
/
*
Ok
we
may
use
interrupt
globals
safely
.
*/
/
*
Flush
I
-
cache
*/
sethi
%
hi
(
1
<<
15
),
%
g1
!
I
-
cache
size
mov
(
1
<<
5
),
%
g2
!
I
-
cache
line
size
sub
%
g1
,
%
g2
,
%
g1
1
:
or
%
g1
,
(
2
<<
3
),
%
g3
stxa
%
g0
,
[%
g3
]
ASI_IC_TAG
membar
#
Sync
subcc
%
g1
,
%
g2
,
%
g1
bge
,
pt
%
icc
,
1
b
nop
ba
,
pt
%
xcc
,
dcpe_icpe_tl1_common
nop
do_icpe_tl1_fatal
:
sethi
%
hi
(
1
f
),
%
g7
ba
,
pt
%
xcc
,
etraptl1
1
:
or
%
g7
,
%
lo
(
1
b
),
%
g7
mov
0x3
,
%
o0
call
cheetah_plus_parity_error
add
%
sp
,
STACK_BIAS
+
REGWIN_SZ
,
%
o1
ba
,
pt
%
xcc
,
rtrap
clr
%
l6
dcpe_icpe_tl1_common
:
/
*
Flush
D
-
cache
,
re
-
enable
D
/
I
caches
in
DCU
and
finally
*
retry
the
trapping
instruction
.
*/
sethi
%
hi
(
1
<<
16
),
%
g1
!
D
-
cache
size
mov
(
1
<<
5
),
%
g2
!
D
-
cache
line
size
sub
%
g1
,
%
g2
,
%
g1
1
:
stxa
%
g0
,
[%
g1
]
ASI_DCACHE_TAG
membar
#
Sync
subcc
%
g1
,
%
g2
,
%
g1
bge
,
pt
%
icc
,
1
b
nop
ldxa
[%
g0
]
ASI_DCU_CONTROL_REG
,
%
g1
or
%
g1
,
(
DCU_DC
|
DCU_IC
),
%
g1
stxa
%
g1
,
[%
g0
]
ASI_DCU_CONTROL_REG
membar
#
Sync
retry
/
*
Cheetah
FECC
trap
handling
,
we
get
here
from
tl
{
0
,
1
}
_fecc
*
in
the
trap
table
.
That
code
has
done
a
memory
barrier
*
and
has
disabled
both
the
I
-
cache
and
D
-
cache
in
the
DCU
...
...
@@ -1639,12 +1821,17 @@ do_gettimeofday: /* %o0 = timevalp */
or
%
g2
,
%
lo
(
xtime
),
%
g2
or
%
g1
,
%
lo
(
timer_tick_compare
),
%
g1
1
:
rdpr
%
ver
,
%
o2
sethi
%
hi
(
0x003e0014
),
%
o1
sethi
%
hi
(
CHEETAH_ID
),
%
o1
srlx
%
o2
,
32
,
%
o2
or
%
o1
,
%
lo
(
0x003e0014
),
%
o1
or
%
o1
,
%
lo
(
CHEETAH_ID
),
%
o1
membar
#
Sync
ldda
[%
g2
]
ASI_NUCLEUS_QUAD_LDD
,
%
o4
cmp
%
o2
,
%
o1
be
,
a
,
pn
%
xcc
,
3
f
rd
%
asr24
,
%
o1
sethi
%
hi
(
CHEETAH_PLUS_ID
),
%
o1
or
%
o1
,
%
lo
(
CHEETAH_PLUS_ID
),
%
o1
cmp
%
o2
,
%
o1
bne
,
pt
%
xcc
,
2
f
nop
ba
,
pt
%
xcc
,
3
f
...
...
arch/sparc64/kernel/etrap.S
View file @
bd59127c
...
...
@@ -109,8 +109,56 @@ etrap_irq:
stb
%
g0
,
[%
l4
+
%
l3
]
!
Store
Group
nop
etraptl1
:
rdpr
%
tstate
,
%
g1
!
Single
Group
+
4
bubbles
sub
%
sp
,
REGWIN_SZ
+
TRACEREG_SZ
-
STACK_BIAS
,
%
g2
!
IEU1
etraptl1
:
/
*
Save
tstate
/
tpc
/
tnpc
of
TL
1
-->
4
and
the
tl
register
itself
.
*
We
place
this
right
after
pt_regs
on
the
trap
stack
.
The
layout
*
is
:
*
0x00
TL1
's TSTATE
*
0x08
TL1
's TPC
*
0x10
TL1
's TNPC
*
...
*
0x58
TL4
's TNPC
*
0x60
TL
*/
sub
%
sp
,
(
24
*
8
)
+
8
,
%
g2
rdpr
%
tl
,
%
g1
wrpr
%
g0
,
1
,
%
tl
rdpr
%
tstate
,
%
g3
stx
%
g3
,
[%
g2
+
STACK_BIAS
+
0x00
]
rdpr
%
tpc
,
%
g3
stx
%
g3
,
[%
g2
+
STACK_BIAS
+
0x08
]
rdpr
%
tnpc
,
%
g3
stx
%
g3
,
[%
g2
+
STACK_BIAS
+
0x10
]
wrpr
%
g0
,
2
,
%
tl
rdpr
%
tstate
,
%
g3
stx
%
g3
,
[%
g2
+
STACK_BIAS
+
0x18
]
rdpr
%
tpc
,
%
g3
stx
%
g3
,
[%
g2
+
STACK_BIAS
+
0x20
]
rdpr
%
tnpc
,
%
g3
stx
%
g3
,
[%
g2
+
STACK_BIAS
+
0x28
]
wrpr
%
g0
,
3
,
%
tl
rdpr
%
tstate
,
%
g3
stx
%
g3
,
[%
g2
+
STACK_BIAS
+
0x30
]
rdpr
%
tpc
,
%
g3
stx
%
g3
,
[%
g2
+
STACK_BIAS
+
0x38
]
rdpr
%
tnpc
,
%
g3
stx
%
g3
,
[%
g2
+
STACK_BIAS
+
0x40
]
wrpr
%
g0
,
4
,
%
tl
rdpr
%
tstate
,
%
g3
stx
%
g3
,
[%
g2
+
STACK_BIAS
+
0x48
]
rdpr
%
tpc
,
%
g3
stx
%
g3
,
[%
g2
+
STACK_BIAS
+
0x50
]
rdpr
%
tnpc
,
%
g3
stx
%
g3
,
[%
g2
+
STACK_BIAS
+
0x58
]
wrpr
%
g1
,
%
tl
stx
%
g1
,
[%
g2
+
STACK_BIAS
+
0x60
]
rdpr
%
tstate
,
%
g1
!
Single
Group
+
4
bubbles
sub
%
g2
,
REGWIN_SZ
+
TRACEREG_SZ
-
STACK_BIAS
,
%
g2
!
IEU1
ba
,
pt
%
xcc
,
1
b
!
CTI
Group
andcc
%
g1
,
TSTATE_PRIV
,
%
g0
!
IEU0
...
...
arch/sparc64/kernel/head.S
View file @
bd59127c
...
...
@@ -79,24 +79,34 @@ sparc_ramdisk_size:
*/
sparc64_boot
:
rdpr
%
ver
,
%
g1
sethi
%
hi
(
0x003e0014
),
%
g5
sethi
%
hi
(
CHEETAH_ID
),
%
g5
srlx
%
g1
,
32
,
%
g1
or
%
g5
,
%
lo
(
0x003e0014
),
%
g5
or
%
g5
,
%
lo
(
CHEETAH_ID
),
%
g5
cmp
%
g1
,
%
g5
be
,
pn
%
icc
,
cheetah_boot
sethi
%
hi
(
CHEETAH_PLUS_ID
),
%
g5
or
%
g5
,
%
lo
(
CHEETAH_PLUS_ID
),
%
g5
cmp
%
g1
,
%
g5
bne
,
pt
%
icc
,
spitfire_boot
nop
cheetah_plus_boot
:
/
*
Preserve
OBP
choosen
DCU
and
DCR
register
settings
.
*/
ba
,
pt
%
xcc
,
cheetah_generic_boot
nop
cheetah_boot
:
mov
DCR_BPE
| DCR_RPE |
DCR_SI
| DCR_IFPOE |
DCR_MS
,
%
g1
wr
%
g1
,
%
asr18
sethi
%
uhi
(
DCU_ME
| DCU_RE |
/*
DCU_PE
|*/ DCU_HPE |
DCU_SPE
| DCU_SL |
DCU_WE
),
%
g5
or
%
g5
,
%
ulo
(
DCU_ME
| DCU_RE |
/*
DCU_PE
|*/ DCU_HPE |
DCU_SPE
| DCU_SL |
DCU_WE
),
%
g5
sethi
%
uhi
(
DCU_ME
|DCU_RE|DCU_HPE|DCU_SPE|DCU_SL
|
DCU_WE
),
%
g5
or
%
g5
,
%
ulo
(
DCU_ME
|DCU_RE|DCU_HPE|DCU_SPE|DCU_SL
|
DCU_WE
),
%
g5
sllx
%
g5
,
32
,
%
g5
or
%
g5
,
DCU_DM
| DCU_IM |
DCU_DC
|
DCU_IC
,
%
g5
stxa
%
g5
,
[%
g0
]
ASI_DCU_CONTROL_REG
membar
#
Sync
cheetah_generic_boot
:
mov
TSB_EXTENSION_P
,
%
g3
stxa
%
g0
,
[%
g3
]
ASI_DMMU
stxa
%
g0
,
[%
g3
]
ASI_IMMU
...
...
@@ -149,6 +159,7 @@ cheetah_boot:
add
%
l0
,
(
1
<<
3
),
%
l0
cheetah_got_tlbentry
:
ldxa
[%
l0
]
ASI_ITLB_DATA_ACCESS
,
%
g0
ldxa
[%
l0
]
ASI_ITLB_DATA_ACCESS
,
%
g1
membar
#
Sync
and
%
g1
,
%
g3
,
%
g1
...
...
@@ -200,6 +211,36 @@ cheetah_got_tlbentry:
blu
,
pt
%
xcc
,
1
b
add
%
l0
,
(
1
<<
3
),
%
l0
/
*
On
Cheetah
+,
have
to
check
second
DTLB
.
*/
rdpr
%
ver
,
%
g1
srlx
%
g1
,
32
,
%
g1
sethi
%
hi
(
CHEETAH_PLUS_ID
),
%
l0
or
%
l0
,
%
lo
(
CHEETAH_PLUS_ID
),
%
l0
cmp
%
g1
,
%
l0
bne
,
pt
%
icc
,
9
f
nop
set
3
<<
16
,
%
l0
1
:
ldxa
[%
l0
]
ASI_DTLB_TAG_READ
,
%
g1
membar
#
Sync
andn
%
g1
,
%
l2
,
%
g1
cmp
%
g1
,
%
g3
blu
,
pn
%
xcc
,
2
f
cmp
%
g1
,
%
g7
bgeu
,
pn
%
xcc
,
2
f
nop
stxa
%
g0
,
[%
l7
]
ASI_DMMU
membar
#
Sync
stxa
%
g0
,
[%
l0
]
ASI_DTLB_DATA_ACCESS
membar
#
Sync
2
:
and
%
l0
,
(
511
<<
3
),
%
g1
cmp
%
g1
,
(
511
<<
3
)
blu
,
pt
%
xcc
,
1
b
add
%
l0
,
(
1
<<
3
),
%
l0
9
:
/
*
Now
lock
the
TTE
we
created
into
ITLB
-
0
and
DTLB
-
0
,
*
entry
15
(
and
maybe
14
too
)
.
*/
...
...
@@ -429,20 +470,26 @@ sun4u_init:
membar
#
Sync
rdpr
%
ver
,
%
g1
sethi
%
hi
(
0x003e0014
),
%
g5
sethi
%
hi
(
CHEETAH_ID
),
%
g5
srlx
%
g1
,
32
,
%
g1
or
%
g5
,
%
lo
(
0x003e0014
),
%
g5
or
%
g5
,
%
lo
(
CHEETAH_ID
),
%
g5
cmp
%
g1
,
%
g5
be
,
pn
%
icc
,
cheetah_tlb_fixup
sethi
%
hi
(
CHEETAH_PLUS_ID
),
%
g5
or
%
g5
,
%
lo
(
CHEETAH_PLUS_ID
),
%
g5
cmp
%
g1
,
%
g5
bne
,
pt
%
icc
,
spitfire_tlb_fixup
nop
cheetah_tlb_fixup
:
set
(
0
<<
16
)
|
(
15
<<
3
),
%
g7
ldxa
[%
g7
]
ASI_ITLB_DATA_ACCESS
,
%
g0
ldxa
[%
g7
]
ASI_ITLB_DATA_ACCESS
,
%
g1
andn
%
g1
,
(
_PAGE_G
),
%
g1
stxa
%
g1
,
[%
g7
]
ASI_ITLB_DATA_ACCESS
membar
#
Sync
ldxa
[%
g7
]
ASI_DTLB_DATA_ACCESS
,
%
g0
ldxa
[%
g7
]
ASI_DTLB_DATA_ACCESS
,
%
g1
andn
%
g1
,
(
_PAGE_G
),
%
g1
stxa
%
g1
,
[%
g7
]
ASI_DTLB_DATA_ACCESS
...
...
@@ -452,9 +499,17 @@ cheetah_tlb_fixup:
flush
%
g3
membar
#
Sync
/
*
Set
TLB
type
to
cheetah
.
*/
mov
1
,
%
g2
sethi
%
hi
(
tlb_type
),
%
g5
sethi
%
hi
(
CHEETAH_PLUS_ID
),
%
g5
or
%
g5
,
%
lo
(
CHEETAH_PLUS_ID
),
%
g5
rdpr
%
ver
,
%
g2
srlx
%
g2
,
32
,
%
g2
cmp
%
g2
,
%
g5
bne
,
a
,
pt
%
icc
,
1
f
mov
1
,
%
g2
/*
Set
TLB
type
to
cheetah
.
*/
mov
2
,
%
g2
/*
Set
TLB
type
to
cheetah
+
.
*/
1
:
sethi
%
hi
(
tlb_type
),
%
g5
stw
%
g2
,
[%
g5
+
%
lo
(
tlb_type
)]
/
*
Patch
copy
/
page
operations
to
cheetah
optimized
versions
.
*/
...
...
@@ -462,6 +517,8 @@ cheetah_tlb_fixup:
nop
call
cheetah_patch_pgcopyops
nop
call
cheetah_patch_cachetlbops
nop
ba
,
pt
%
xcc
,
tlb_fixup_done
nop
...
...
@@ -575,18 +632,23 @@ setup_tba: /* i0 = is_starfire */
or
%
g2
,
KERN_LOWBITS
,
%
g2
rdpr
%
ver
,
%
g3
sethi
%
hi
(
0x003e0014
),
%
g7
sethi
%
hi
(
CHEETAH_ID
),
%
g7
srlx
%
g3
,
32
,
%
g3
or
%
g7
,
%
lo
(
0x003e0014
),
%
g7
or
%
g7
,
%
lo
(
CHEETAH_ID
),
%
g7
cmp
%
g3
,
%
g7
be
,
pn
%
icc
,
cheetah_vpte_base
sethi
%
hi
(
CHEETAH_PLUS_ID
),
%
g7
or
%
g7
,
%
lo
(
CHEETAH_PLUS_ID
),
%
g7
cmp
%
g3
,
%
g7
bne
,
pt
%
icc
,
1
f
bne
,
pt
%
icc
,
spitfire_vpte_base
nop
cheetah_vpte_base
:
sethi
%
uhi
(
VPTE_BASE_CHEETAH
),
%
g3
or
%
g3
,
%
ulo
(
VPTE_BASE_CHEETAH
),
%
g3
ba
,
pt
%
xcc
,
2
f
sllx
%
g3
,
32
,
%
g3
1
:
spitfire_vpte_base
:
sethi
%
uhi
(
VPTE_BASE_SPITFIRE
),
%
g3
or
%
g3
,
%
ulo
(
VPTE_BASE_SPITFIRE
),
%
g3
sllx
%
g3
,
32
,
%
g3
...
...
@@ -614,13 +676,18 @@ setup_tba: /* i0 = is_starfire */
not_starfire
:
rdpr
%
ver
,
%
g1
sethi
%
hi
(
0x003e0014
),
%
g5
sethi
%
hi
(
CHEETAH_ID
),
%
g5
srlx
%
g1
,
32
,
%
g1
or
%
g7
,
%
lo
(
0x003e0014
),
%
g5
or
%
g5
,
%
lo
(
CHEETAH_ID
),
%
g5
cmp
%
g1
,
%
g5
be
,
pn
%
icc
,
is_cheetah
sethi
%
hi
(
CHEETAH_PLUS_ID
),
%
g5
or
%
g5
,
%
lo
(
CHEETAH_PLUS_ID
),
%
g5
cmp
%
g1
,
%
g5
bne
,
pt
%
icc
,
not_cheetah
nop
is_cheetah
:
ldxa
[%
g0
]
ASI_SAFARI_CONFIG
,
%
g1
srlx
%
g1
,
17
,
%
g1
ba
,
pt
%
xcc
,
set_worklist
...
...
@@ -644,14 +711,19 @@ set_worklist:
wr
%
g0
,
0
,
%
tick_cmpr
rdpr
%
ver
,
%
g1
sethi
%
hi
(
0x003e0014
),
%
g5
sethi
%
hi
(
CHEETAH_ID
),
%
g5
srlx
%
g1
,
32
,
%
g1
or
%
g
7
,
%
lo
(
0x003e0014
),
%
g5
or
%
g
5
,
%
lo
(
CHEETAH_ID
),
%
g5
cmp
%
g1
,
%
g5
bne
,
pt
%
icc
,
1
f
be
,
pn
%
icc
,
1
f
sethi
%
hi
(
CHEETAH_PLUS_ID
),
%
g5
or
%
g5
,
%
lo
(
CHEETAH_PLUS_ID
),
%
g5
cmp
%
g1
,
%
g5
bne
,
pt
%
icc
,
2
f
nop
/
*
Disable
STICK_INT
interrupts
.
*/
1
:
sethi
%
hi
(
0x80000000
),
%
g1
sllx
%
g1
,
32
,
%
g1
wr
%
g1
,
%
asr25
...
...
@@ -659,7 +731,7 @@ set_worklist:
/
*
Ok
,
we
're done setting up all the state our trap mechanims needs,
*
now
get
back
into
normal
globals
and
let
the
PROM
know
what
is
up
.
*/
1
:
2
:
wrpr
%
g0
,
%
g0
,
%
wstate
wrpr
%
o1
,
PSTATE_IE
,
%
pstate
...
...
arch/sparc64/kernel/irq.c
View file @
bd59127c
...
...
@@ -7,6 +7,7 @@
*/
#include <linux/config.h>
#include <linux/sched.h>
#include <linux/ptrace.h>
#include <linux/errno.h>
#include <linux/kernel_stat.h>
...
...
@@ -162,7 +163,7 @@ void enable_irq(unsigned int irq)
if
(
imap
==
0UL
)
return
;
if
(
tlb_type
==
cheetah
)
{
if
(
tlb_type
==
cheetah
||
tlb_type
==
cheetah_plus
)
{
/* We set it to our Safari AID. */
__asm__
__volatile__
(
"ldxa [%%g0] %1, %0"
:
"=r"
(
tid
)
...
...
@@ -1068,7 +1069,7 @@ static int retarget_one_irq(struct irqaction *p, int goal_cpu)
goal_cpu
=
0
;
}
if
(
tlb_type
==
cheetah
)
{
if
(
tlb_type
==
cheetah
||
tlb_type
==
cheetah_plus
)
{
tid
=
goal_cpu
<<
26
;
tid
&=
IMAP_AID_SAFARI
;
}
else
if
(
this_is_starfire
==
0
)
{
...
...
arch/sparc64/kernel/process.c
View file @
bd59127c
...
...
@@ -591,6 +591,8 @@ int copy_thread(int nr, unsigned long clone_flags, unsigned long sp,
p
->
thread
.
smp_lock_pc
=
0
;
#endif
p
->
user_tid
=
NULL
;
/* Calculate offset to stack_frame & pt_regs */
child_trap_frame
=
((
char
*
)
t
)
+
(
THREAD_SIZE
-
(
TRACEREG_SZ
+
REGWIN_SZ
));
memcpy
(
child_trap_frame
,
(((
struct
reg_window
*
)
regs
)
-
1
),
(
TRACEREG_SZ
+
REGWIN_SZ
));
...
...
@@ -647,6 +649,19 @@ int copy_thread(int nr, unsigned long clone_flags, unsigned long sp,
/* Set the second return value for the parent. */
regs
->
u_regs
[
UREG_I1
]
=
0
;
if
(
!
(
clone_flags
&
(
CLONE_SETTID
|
CLONE_CLEARTID
)))
return
0
;
if
(
t
->
flags
&
_TIF_32BIT
)
t
->
kregs
->
u_regs
[
UREG_G2
]
&=
0xffffffff
;
if
(
clone_flags
&
CLONE_SETTID
)
if
(
put_user
(
p
->
pid
,
(
int
*
)
t
->
kregs
->
u_regs
[
UREG_G2
]))
return
-
EFAULT
;
if
(
clone_flags
&
CLONE_CLEARTID
)
p
->
user_tid
=
(
int
*
)
t
->
kregs
->
u_regs
[
UREG_G2
];
return
0
;
}
...
...
@@ -791,6 +806,7 @@ asmlinkage int sparc_execve(struct pt_regs *regs)
current_thread_info
()
->
xfsr
[
0
]
=
0
;
current_thread_info
()
->
fpsaved
[
0
]
=
0
;
regs
->
tstate
&=
~
TSTATE_PEF
;
current
->
ptrace
&=
~
PT_DTRACE
;
}
out:
return
error
;
...
...
arch/sparc64/kernel/ptrace.c
View file @
bd59127c
...
...
@@ -18,6 +18,7 @@
#include <linux/user.h>
#include <linux/smp.h>
#include <linux/smp_lock.h>
#include <linux/security.h>
#include <asm/asi.h>
#include <asm/pgtable.h>
...
...
@@ -132,11 +133,19 @@ asmlinkage void do_ptrace(struct pt_regs *regs)
}
#endif
if
(
request
==
PTRACE_TRACEME
)
{
int
ret
;
/* are we already being traced? */
if
(
current
->
ptrace
&
PT_PTRACED
)
{
pt_error_return
(
regs
,
EPERM
);
goto
out
;
}
ret
=
security_ops
->
ptrace
(
current
->
parent
,
current
);
if
(
ret
)
{
pt_error_return
(
regs
,
-
ret
);
goto
out
;
}
/* set the ptrace bit in the process flags. */
current
->
ptrace
|=
PT_PTRACED
;
pt_succ_return
(
regs
,
0
);
...
...
@@ -570,7 +579,7 @@ asmlinkage void do_ptrace(struct pt_regs *regs)
{
unsigned
long
va
;
if
(
tlb_type
==
cheetah
)
{
if
(
tlb_type
==
cheetah
||
tlb_type
==
cheetah_plus
)
{
for
(
va
=
0
;
va
<
(
1
<<
16
);
va
+=
(
1
<<
5
))
spitfire_put_dcache_tag
(
va
,
0x0
);
/* No need to mess with I-cache on Cheetah. */
...
...
arch/sparc64/kernel/setup.c
View file @
bd59127c
...
...
@@ -193,7 +193,7 @@ int prom_callback(long *args)
if
(
tlb_type
==
spitfire
)
tte
=
spitfire_get_dtlb_data
(
SPITFIRE_HIGHEST_LOCKED_TLBENT
);
else
if
(
tlb_type
==
cheetah
)
else
if
(
tlb_type
==
cheetah
||
tlb_type
==
cheetah_plus
)
tte
=
cheetah_get_ldtlb_data
(
CHEETAH_HIGHEST_LOCKED_TLBENT
);
res
=
PROM_TRUE
;
...
...
@@ -506,7 +506,7 @@ void __init setup_arch(char **cmdline_p)
extern
unsigned
int
irqsz_patchme
[
1
];
irqsz_patchme
[
0
]
|=
((
i
==
SMP_CACHE_BYTES
)
?
SMP_CACHE_BYTES_SHIFT
:
\
SMP_CACHE_BYTES_SHIFT
+
1
);
flushi
((
long
)
&
irqsz_patchme
[
1
]);
flushi
((
long
)
&
irqsz_patchme
[
0
]);
}
else
{
prom_printf
(
"Unexpected size of irq_stat[] elements
\n
"
);
prom_halt
();
...
...
arch/sparc64/kernel/smp.c
View file @
bd59127c
...
...
@@ -558,9 +558,9 @@ extern unsigned long xcall_flush_tlb_page;
extern
unsigned
long
xcall_flush_tlb_mm
;
extern
unsigned
long
xcall_flush_tlb_range
;
extern
unsigned
long
xcall_flush_tlb_kernel_range
;
extern
unsigned
long
xcall_flush_tlb_all
;
extern
unsigned
long
xcall_
tlbcachesync
;
extern
unsigned
long
xcall_flush_cache_all
;
extern
unsigned
long
xcall_flush_tlb_all
_spitfire
;
extern
unsigned
long
xcall_
flush_tlb_all_cheetah
;
extern
unsigned
long
xcall_flush_cache_all
_spitfire
;
extern
unsigned
long
xcall_report_regs
;
extern
unsigned
long
xcall_receive_signal
;
extern
unsigned
long
xcall_flush_dcache_page_cheetah
;
...
...
@@ -676,13 +676,19 @@ void smp_report_regs(void)
void
smp_flush_cache_all
(
void
)
{
smp_cross_call
(
&
xcall_flush_cache_all
,
0
,
0
,
0
);
__flush_cache_all
();
/* Cheetah need do nothing. */
if
(
tlb_type
==
spitfire
)
{
smp_cross_call
(
&
xcall_flush_cache_all_spitfire
,
0
,
0
,
0
);
__flush_cache_all
();
}
}
void
smp_flush_tlb_all
(
void
)
{
smp_cross_call
(
&
xcall_flush_tlb_all
,
0
,
0
,
0
);
if
(
tlb_type
==
spitfire
)
smp_cross_call
(
&
xcall_flush_tlb_all_spitfire
,
0
,
0
,
0
);
else
smp_cross_call
(
&
xcall_flush_tlb_all_cheetah
,
0
,
0
,
0
);
__flush_tlb_all
();
}
...
...
@@ -1115,7 +1121,7 @@ static void __init smp_tune_scheduling(void)
* of moving a process from one cpu to another).
*/
printk
(
"SMP: Calibrating ecache flush... "
);
if
(
tlb_type
==
cheetah
)
{
if
(
tlb_type
==
cheetah
||
tlb_type
==
cheetah_plus
)
{
cacheflush_time
=
cheetah_tune_scheduling
();
goto
report
;
}
...
...
arch/sparc64/kernel/sys_sparc32.c
View file @
bd59127c
...
...
@@ -57,6 +57,7 @@
#include <asm/uaccess.h>
#include <asm/fpumacro.h>
#include <asm/semaphore.h>
#include <asm/mmu_context.h>
#include <net/scm.h>
...
...
@@ -2873,26 +2874,30 @@ do_execve32(char * filename, u32 * argv, u32 * envp, struct pt_regs * regs)
int
retval
;
int
i
;
bprm
.
p
=
PAGE_SIZE
*
MAX_ARG_PAGES
-
sizeof
(
void
*
);
memset
(
bprm
.
page
,
0
,
MAX_ARG_PAGES
*
sizeof
(
bprm
.
page
[
0
]));
file
=
open_exec
(
filename
);
retval
=
PTR_ERR
(
file
);
if
(
IS_ERR
(
file
))
return
retval
;
bprm
.
p
=
PAGE_SIZE
*
MAX_ARG_PAGES
-
sizeof
(
void
*
);
memset
(
bprm
.
page
,
0
,
MAX_ARG_PAGES
*
sizeof
(
bprm
.
page
[
0
]));
bprm
.
file
=
file
;
bprm
.
filename
=
filename
;
bprm
.
sh_bang
=
0
;
bprm
.
loader
=
0
;
bprm
.
exec
=
0
;
bprm
.
security
=
NULL
;
bprm
.
mm
=
mm_alloc
();
retval
=
-
ENOMEM
;
if
(
!
bprm
.
mm
)
goto
out_file
;
retval
=
init_new_context
(
current
,
bprm
.
mm
);
if
(
retval
<
0
)
goto
out_mm
;
bprm
.
argc
=
count32
(
argv
,
bprm
.
p
/
sizeof
(
u32
));
if
((
retval
=
bprm
.
argc
)
<
0
)
goto
out_mm
;
...
...
@@ -2901,6 +2906,10 @@ do_execve32(char * filename, u32 * argv, u32 * envp, struct pt_regs * regs)
if
((
retval
=
bprm
.
envc
)
<
0
)
goto
out_mm
;
retval
=
security_ops
->
bprm_alloc_security
(
&
bprm
);
if
(
retval
)
goto
out
;
retval
=
prepare_binprm
(
&
bprm
);
if
(
retval
<
0
)
goto
out
;
...
...
@@ -2919,9 +2928,11 @@ do_execve32(char * filename, u32 * argv, u32 * envp, struct pt_regs * regs)
goto
out
;
retval
=
search_binary_handler
(
&
bprm
,
regs
);
if
(
retval
>=
0
)
if
(
retval
>=
0
)
{
/* execve success */
security_ops
->
bprm_free_security
(
&
bprm
);
return
retval
;
}
out:
/* Something went wrong, return the inode and free the argument pages*/
...
...
@@ -2931,6 +2942,9 @@ do_execve32(char * filename, u32 * argv, u32 * envp, struct pt_regs * regs)
__free_page
(
page
);
}
if
(
bprm
.
security
)
security_ops
->
bprm_free_security
(
&
bprm
);
out_mm:
mmdrop
(
bprm
.
mm
);
...
...
@@ -2971,6 +2985,7 @@ asmlinkage int sparc32_execve(struct pt_regs *regs)
current_thread_info
()
->
xfsr
[
0
]
=
0
;
current_thread_info
()
->
fpsaved
[
0
]
=
0
;
regs
->
tstate
&=
~
TSTATE_PEF
;
current
->
ptrace
&=
~
PT_DTRACE
;
}
out:
return
error
;
...
...
arch/sparc64/kernel/systbls.S
View file @
bd59127c
...
...
@@ -50,7 +50,7 @@ sys_call_table32:
/*
140
*/
.
word
sys32_sendfile64
,
sys_nis_syscall
,
sys_futex
,
sys_gettid
,
sys32_getrlimit
.
word
sys32_setrlimit
,
sys_pivot_root
,
sys32_prctl
,
sys32_pciconfig_read
,
sys32_pciconfig_write
/*
150
*/
.
word
sys_nis_syscall
,
sys_nis_syscall
,
sys_nis_syscall
,
sys_poll
,
sys_getdents64
.
word
sys32_fcntl64
,
sys_
nis_syscall
,
sys32_statfs
,
sys32_fstatfs
,
sys_oldumount
.
word
sys32_fcntl64
,
sys_
security
,
sys32_statfs
,
sys32_fstatfs
,
sys_oldumount
/*
160
*/
.
word
sys32_sched_setaffinity
,
sys32_sched_getaffinity
,
sys_getdomainname
,
sys_setdomainname
,
sys_nis_syscall
.
word
sys_quotactl
,
sys_nis_syscall
,
sys32_mount
,
sys_ustat
,
sys_setxattr
/*
170
*/
.
word
sys_lsetxattr
,
sys_fsetxattr
,
sys_getxattr
,
sys_lgetxattr
,
sys32_getdents
...
...
@@ -109,7 +109,7 @@ sys_call_table:
/*
140
*/
.
word
sys_sendfile64
,
sys_getpeername
,
sys_futex
,
sys_gettid
,
sys_getrlimit
.
word
sys_setrlimit
,
sys_pivot_root
,
sys_prctl
,
sys_pciconfig_read
,
sys_pciconfig_write
/*
150
*/
.
word
sys_getsockname
,
sys_nis_syscall
,
sys_nis_syscall
,
sys_poll
,
sys_getdents64
.
word
sys_nis_syscall
,
sys_
nis_syscall
,
sys_statfs
,
sys_fstatfs
,
sys_oldumount
.
word
sys_nis_syscall
,
sys_
security
,
sys_statfs
,
sys_fstatfs
,
sys_oldumount
/*
160
*/
.
word
sys_sched_setaffinity
,
sys_sched_getaffinity
,
sys_getdomainname
,
sys_setdomainname
,
sys_utrap_install
.
word
sys_quotactl
,
sys_nis_syscall
,
sys_mount
,
sys_ustat
,
sys_setxattr
/*
170
*/
.
word
sys_lsetxattr
,
sys_fsetxattr
,
sys_getxattr
,
sys_lgetxattr
,
sys_getdents
...
...
arch/sparc64/kernel/trampoline.S
View file @
bd59127c
...
...
@@ -34,13 +34,22 @@ sparc64_cpu_startup:
flushw
rdpr
%
ver
,
%
g1
sethi
%
hi
(
0x003e0014
),
%
g5
sethi
%
hi
(
CHEETAH_ID
),
%
g5
srlx
%
g1
,
32
,
%
g1
or
%
g5
,
%
lo
(
0x003e0014
),
%
g5
or
%
g5
,
%
lo
(
CHEETAH_ID
),
%
g5
cmp
%
g1
,
%
g5
be
,
pn
%
icc
,
cheetah_startup
sethi
%
hi
(
CHEETAH_PLUS_ID
),
%
g5
or
%
g5
,
%
lo
(
CHEETAH_PLUS_ID
),
%
g5
cmp
%
g1
,
%
g5
bne
,
pt
%
icc
,
spitfire_startup
nop
cheetah_plus_startup
:
/
*
Preserve
OBP
choosen
DCU
and
DCR
register
settings
.
*/
ba
,
pt
%
xcc
,
cheetah_generic_startup
nop
cheetah_startup
:
mov
DCR_BPE
| DCR_RPE |
DCR_SI
| DCR_IFPOE |
DCR_MS
,
%
g1
wr
%
g1
,
%
asr18
...
...
@@ -52,6 +61,7 @@ cheetah_startup:
stxa
%
g5
,
[%
g0
]
ASI_DCU_CONTROL_REG
membar
#
Sync
cheetah_generic_startup
:
mov
TSB_EXTENSION_P
,
%
g3
stxa
%
g0
,
[%
g3
]
ASI_DMMU
stxa
%
g0
,
[%
g3
]
ASI_IMMU
...
...
@@ -118,9 +128,14 @@ startup_continue:
stx
%
g2
,
[%
sp
+
2047
+
128
+
0x30
]
rdpr
%
ver
,
%
g1
sethi
%
hi
(
0x003e0014
),
%
g5
sethi
%
hi
(
CHEETAH_ID
),
%
g5
srlx
%
g1
,
32
,
%
g1
or
%
g5
,
%
lo
(
0x003e0014
),
%
g5
or
%
g5
,
%
lo
(
CHEETAH_ID
),
%
g5
cmp
%
g1
,
%
g5
be
,
a
,
pn
%
icc
,
1
f
mov
15
,
%
g2
sethi
%
hi
(
CHEETAH_PLUS_ID
),
%
g5
or
%
g5
,
%
lo
(
CHEETAH_PLUS_ID
),
%
g5
cmp
%
g1
,
%
g5
bne
,
a
,
pt
%
icc
,
1
f
mov
63
,
%
g2
...
...
@@ -153,9 +168,14 @@ startup_continue:
stx
%
g2
,
[%
sp
+
2047
+
128
+
0x30
]
rdpr
%
ver
,
%
g1
sethi
%
hi
(
0x003e0014
),
%
g5
sethi
%
hi
(
CHEETAH_ID
),
%
g5
srlx
%
g1
,
32
,
%
g1
or
%
g5
,
%
lo
(
0x003e0014
),
%
g5
or
%
g5
,
%
lo
(
CHEETAH_ID
),
%
g5
cmp
%
g1
,
%
g5
be
,
a
,
pn
%
icc
,
1
f
mov
15
,
%
g2
sethi
%
hi
(
CHEETAH_PLUS_ID
),
%
g5
or
%
g5
,
%
lo
(
CHEETAH_PLUS_ID
),
%
g5
cmp
%
g1
,
%
g5
bne
,
a
,
pt
%
icc
,
1
f
mov
63
,
%
g2
...
...
@@ -225,13 +245,18 @@ startup_continue:
or
%
g2
,
KERN_LOWBITS
,
%
g2
rdpr
%
ver
,
%
g3
sethi
%
hi
(
0x003e0014
),
%
g7
sethi
%
hi
(
CHEETAH_ID
),
%
g7
srlx
%
g3
,
32
,
%
g3
or
%
g7
,
%
lo
(
0x003e0014
),
%
g7
or
%
g7
,
%
lo
(
CHEETAH_ID
),
%
g7
cmp
%
g3
,
%
g7
be
,
pn
%
icc
,
9
f
sethi
%
hi
(
CHEETAH_PLUS_ID
),
%
g7
or
%
g7
,
%
lo
(
CHEETAH_PLUS_ID
),
%
g7
cmp
%
g3
,
%
g7
bne
,
pt
%
icc
,
1
f
nop
9
:
sethi
%
uhi
(
VPTE_BASE_CHEETAH
),
%
g3
or
%
g3
,
%
ulo
(
VPTE_BASE_CHEETAH
),
%
g3
ba
,
pt
%
xcc
,
2
f
...
...
arch/sparc64/kernel/traps.c
View file @
bd59127c
...
...
@@ -37,6 +37,33 @@
#include <linux/kmod.h>
#endif
/* When an irrecoverable trap occurs at tl > 0, the trap entry
* code logs the trap state registers at every level in the trap
* stack. It is found at (pt_regs + sizeof(pt_regs)) and the layout
* is as follows:
*/
struct
tl1_traplog
{
struct
{
unsigned
long
tstate
;
unsigned
long
tpc
;
unsigned
long
tnpc
;
}
trapstack
[
4
];
unsigned
long
tl
;
};
static
void
dump_tl1_traplog
(
struct
tl1_traplog
*
p
)
{
int
i
;
printk
(
"TRAPLOG: Error at trap level 0x%lx, dumping track stack.
\n
"
,
p
->
tl
);
for
(
i
=
0
;
i
<
4
;
i
++
)
{
printk
(
"TRAPLOG: Trap level %d TSTATE[%016lx] TPC[%016lx] TNPC[%016lx]
\n
"
,
i
+
1
,
p
->
trapstack
[
i
].
tstate
,
p
->
trapstack
[
i
].
tpc
,
p
->
trapstack
[
i
].
tnpc
);
}
}
void
bad_trap
(
struct
pt_regs
*
regs
,
long
lvl
)
{
char
buffer
[
32
];
...
...
@@ -66,8 +93,10 @@ void bad_trap (struct pt_regs *regs, long lvl)
void
bad_trap_tl1
(
struct
pt_regs
*
regs
,
long
lvl
)
{
char
buffer
[
24
];
char
buffer
[
32
];
dump_tl1_traplog
((
struct
tl1_traplog
*
)(
regs
+
1
));
sprintf
(
buffer
,
"Bad trap %lx at tl>0"
,
lvl
);
die_if_kernel
(
buffer
,
regs
);
}
...
...
@@ -80,8 +109,8 @@ void do_BUG(const char *file, int line)
}
#endif
void
instruction_access_exception
(
struct
pt_regs
*
regs
,
unsigned
long
sfsr
,
unsigned
long
sfar
)
void
instruction_access_exception
(
struct
pt_regs
*
regs
,
unsigned
long
sfsr
,
unsigned
long
sfar
)
{
siginfo_t
info
;
...
...
@@ -102,6 +131,13 @@ void instruction_access_exception (struct pt_regs *regs,
force_sig_info
(
SIGSEGV
,
&
info
,
current
);
}
void
instruction_access_exception_tl1
(
struct
pt_regs
*
regs
,
unsigned
long
sfsr
,
unsigned
long
sfar
)
{
dump_tl1_traplog
((
struct
tl1_traplog
*
)(
regs
+
1
));
instruction_access_exception
(
regs
,
sfsr
,
sfar
);
}
void
data_access_exception
(
struct
pt_regs
*
regs
,
unsigned
long
sfsr
,
unsigned
long
sfar
)
{
...
...
@@ -167,7 +203,7 @@ static void clean_and_reenable_l1_caches(void)
LSU_CONTROL_IM
|
LSU_CONTROL_DM
),
"i"
(
ASI_LSU_CONTROL
)
:
"memory"
);
}
else
if
(
tlb_type
==
cheetah
)
{
}
else
if
(
tlb_type
==
cheetah
||
tlb_type
==
cheetah_plus
)
{
/* Flush D-cache */
for
(
va
=
0
;
va
<
(
1
<<
16
);
va
+=
(
1
<<
5
))
{
__asm__
__volatile__
(
"stxa %%g0, [%0] %1
\n\t
"
...
...
@@ -201,7 +237,7 @@ void do_dae(struct pt_regs *regs)
pci_poke_faulted
=
1
;
/* Why the fuck did they have to change this? */
if
(
tlb_type
==
cheetah
)
if
(
tlb_type
==
cheetah
||
tlb_type
==
cheetah_plus
)
regs
->
tpc
+=
4
;
regs
->
tnpc
=
regs
->
tpc
+
4
;
...
...
@@ -390,10 +426,14 @@ static __inline__ struct cheetah_err_info *cheetah_get_error_log(unsigned long a
return
p
;
}
extern
unsigned
int
tl0_icpe
[],
tl1_icpe
[];
extern
unsigned
int
tl0_dcpe
[],
tl1_dcpe
[];
extern
unsigned
int
tl0_fecc
[],
tl1_fecc
[];
extern
unsigned
int
tl0_cee
[],
tl1_cee
[];
extern
unsigned
int
tl0_iae
[],
tl1_iae
[];
extern
unsigned
int
tl0_dae
[],
tl1_dae
[];
extern
unsigned
int
cheetah_plus_icpe_trap_vector
[],
cheetah_plus_icpe_trap_vector_tl1
[];
extern
unsigned
int
cheetah_plus_dcpe_trap_vector
[],
cheetah_plus_dcpe_trap_vector_tl1
[];
extern
unsigned
int
cheetah_fecc_trap_vector
[],
cheetah_fecc_trap_vector_tl1
[];
extern
unsigned
int
cheetah_cee_trap_vector
[],
cheetah_cee_trap_vector_tl1
[];
extern
unsigned
int
cheetah_deferred_trap_vector
[],
cheetah_deferred_trap_vector_tl1
[];
...
...
@@ -487,6 +527,12 @@ void __init cheetah_ecache_flush_init(void)
memcpy
(
tl1_iae
,
cheetah_deferred_trap_vector_tl1
,
(
8
*
4
));
memcpy
(
tl0_dae
,
cheetah_deferred_trap_vector
,
(
8
*
4
));
memcpy
(
tl1_dae
,
cheetah_deferred_trap_vector_tl1
,
(
8
*
4
));
if
(
tlb_type
==
cheetah_plus
)
{
memcpy
(
tl0_dcpe
,
cheetah_plus_dcpe_trap_vector
,
(
8
*
4
));
memcpy
(
tl1_dcpe
,
cheetah_plus_dcpe_trap_vector_tl1
,
(
8
*
4
));
memcpy
(
tl0_icpe
,
cheetah_plus_icpe_trap_vector
,
(
8
*
4
));
memcpy
(
tl1_icpe
,
cheetah_plus_icpe_trap_vector_tl1
,
(
8
*
4
));
}
flushi
(
PAGE_OFFSET
);
}
...
...
@@ -567,9 +613,22 @@ unsigned long __init cheetah_tune_scheduling(void)
*
* So we must only flush the I-cache when it is disabled.
*/
static
void
__cheetah_flush_icache
(
void
)
{
unsigned
long
i
;
/* Clear the valid bits in all the tags. */
for
(
i
=
0
;
i
<
(
1
<<
15
);
i
+=
(
1
<<
5
))
{
__asm__
__volatile__
(
"stxa %%g0, [%0] %1
\n\t
"
"membar #Sync"
:
/* no outputs */
:
"r"
(
i
|
(
2
<<
3
)),
"i"
(
ASI_IC_TAG
));
}
}
static
void
cheetah_flush_icache
(
void
)
{
unsigned
long
dcu_save
,
i
;
unsigned
long
dcu_save
;
/* Save current DCU, disable I-cache. */
__asm__
__volatile__
(
"ldxa [%%g0] %1, %0
\n\t
"
...
...
@@ -580,13 +639,7 @@ static void cheetah_flush_icache(void)
:
"i"
(
ASI_DCU_CONTROL_REG
),
"i"
(
DCU_IC
)
:
"g1"
);
/* Clear the valid bits in all the tags. */
for
(
i
=
0
;
i
<
(
1
<<
16
);
i
+=
(
1
<<
5
))
{
__asm__
__volatile__
(
"stxa %%g0, [%0] %1
\n\t
"
"membar #Sync"
:
/* no outputs */
:
"r"
(
i
|
(
2
<<
3
)),
"i"
(
ASI_IC_TAG
));
}
__cheetah_flush_icache
();
/* Restore DCU register */
__asm__
__volatile__
(
"stxa %0, [%%g0] %1
\n\t
"
...
...
@@ -607,6 +660,34 @@ static void cheetah_flush_dcache(void)
}
}
/* In order to make the even parity correct we must do two things.
* First, we clear DC_data_parity and set DC_utag to an appropriate value.
* Next, we clear out all 32-bytes of data for that line. Data of
* all-zero + tag parity value of zero == correct parity.
*/
static
void
cheetah_plus_zap_dcache_parity
(
void
)
{
unsigned
long
i
;
for
(
i
=
0
;
i
<
(
1
<<
16
);
i
+=
(
1
<<
5
))
{
unsigned
long
tag
=
(
i
>>
14
);
unsigned
long
j
;
__asm__
__volatile__
(
"membar #Sync
\n\t
"
"stxa %0, [%1] %2
\n\t
"
"membar #Sync"
:
/* no outputs */
:
"r"
(
tag
),
"r"
(
i
),
"i"
(
ASI_DCACHE_UTAG
));
for
(
j
=
i
;
j
<
i
+
(
1
<<
5
);
j
+=
(
1
<<
3
))
__asm__
__volatile__
(
"membar #Sync
\n\t
"
"stxa %%g0, [%0] %1
\n\t
"
"membar #Sync"
:
/* no outputs */
:
"r"
(
j
),
"i"
(
ASI_DCACHE_DATA
));
}
}
/* Conversion tables used to frob Cheetah AFSR syndrome values into
* something palatable to the memory controller driver get_unumber
* routine.
...
...
@@ -1327,6 +1408,46 @@ void cheetah_deferred_handler(struct pt_regs *regs, unsigned long afsr, unsigned
panic
(
"Irrecoverable deferred error trap.
\n
"
);
}
/* Handle a D/I cache parity error trap. TYPE is encoded as:
*
* Bit0: 0=dcache,1=icache
* Bit1: 0=recoverable,1=unrecoverable
*
* The hardware has disabled both the I-cache and D-cache in
* the %dcr register.
*/
void
cheetah_plus_parity_error
(
int
type
,
struct
pt_regs
*
regs
)
{
if
(
type
&
0x1
)
__cheetah_flush_icache
();
else
cheetah_plus_zap_dcache_parity
();
cheetah_flush_dcache
();
/* Re-enable I-cache/D-cache */
__asm__
__volatile__
(
"ldxa [%%g0] %0, %%g1
\n\t
"
"or %%g1, %1, %%g1
\n\t
"
"stxa %%g1, [%%g0] %0
\n\t
"
"membar #Sync"
:
/* no outputs */
:
"i"
(
ASI_DCU_CONTROL_REG
),
"i"
(
DCU_DC
|
DCU_IC
)
:
"g1"
);
if
(
type
&
0x2
)
{
printk
(
KERN_EMERG
"CPU[%d]: Cheetah+ %c-cache parity error at TPC[%016lx]
\n
"
,
smp_processor_id
(),
(
type
&
0x1
)
?
'I'
:
'D'
,
regs
->
tpc
);
panic
(
"Irrecoverable Cheetah+ parity error."
);
}
printk
(
KERN_WARNING
"CPU[%d]: Cheetah+ %c-cache parity error at TPC[%016lx]
\n
"
,
smp_processor_id
(),
(
type
&
0x1
)
?
'I'
:
'D'
,
regs
->
tpc
);
}
void
do_fpe_common
(
struct
pt_regs
*
regs
)
{
if
(
regs
->
tstate
&
TSTATE_PRIV
)
{
...
...
@@ -1604,56 +1725,67 @@ void do_cee(struct pt_regs *regs)
void
do_cee_tl1
(
struct
pt_regs
*
regs
)
{
dump_tl1_traplog
((
struct
tl1_traplog
*
)(
regs
+
1
));
die_if_kernel
(
"TL1: Cache Error Exception"
,
regs
);
}
void
do_dae_tl1
(
struct
pt_regs
*
regs
)
{
dump_tl1_traplog
((
struct
tl1_traplog
*
)(
regs
+
1
));
die_if_kernel
(
"TL1: Data Access Exception"
,
regs
);
}
void
do_iae_tl1
(
struct
pt_regs
*
regs
)
{
dump_tl1_traplog
((
struct
tl1_traplog
*
)(
regs
+
1
));
die_if_kernel
(
"TL1: Instruction Access Exception"
,
regs
);
}
void
do_div0_tl1
(
struct
pt_regs
*
regs
)
{
dump_tl1_traplog
((
struct
tl1_traplog
*
)(
regs
+
1
));
die_if_kernel
(
"TL1: DIV0 Exception"
,
regs
);
}
void
do_fpdis_tl1
(
struct
pt_regs
*
regs
)
{
dump_tl1_traplog
((
struct
tl1_traplog
*
)(
regs
+
1
));
die_if_kernel
(
"TL1: FPU Disabled"
,
regs
);
}
void
do_fpieee_tl1
(
struct
pt_regs
*
regs
)
{
dump_tl1_traplog
((
struct
tl1_traplog
*
)(
regs
+
1
));
die_if_kernel
(
"TL1: FPU IEEE Exception"
,
regs
);
}
void
do_fpother_tl1
(
struct
pt_regs
*
regs
)
{
dump_tl1_traplog
((
struct
tl1_traplog
*
)(
regs
+
1
));
die_if_kernel
(
"TL1: FPU Other Exception"
,
regs
);
}
void
do_ill_tl1
(
struct
pt_regs
*
regs
)
{
dump_tl1_traplog
((
struct
tl1_traplog
*
)(
regs
+
1
));
die_if_kernel
(
"TL1: Illegal Instruction Exception"
,
regs
);
}
void
do_irq_tl1
(
struct
pt_regs
*
regs
)
{
dump_tl1_traplog
((
struct
tl1_traplog
*
)(
regs
+
1
));
die_if_kernel
(
"TL1: IRQ Exception"
,
regs
);
}
void
do_lddfmna_tl1
(
struct
pt_regs
*
regs
)
{
dump_tl1_traplog
((
struct
tl1_traplog
*
)(
regs
+
1
));
die_if_kernel
(
"TL1: LDDF Exception"
,
regs
);
}
void
do_stdfmna_tl1
(
struct
pt_regs
*
regs
)
{
dump_tl1_traplog
((
struct
tl1_traplog
*
)(
regs
+
1
));
die_if_kernel
(
"TL1: STDF Exception"
,
regs
);
}
...
...
@@ -1664,6 +1796,7 @@ void do_paw(struct pt_regs *regs)
void
do_paw_tl1
(
struct
pt_regs
*
regs
)
{
dump_tl1_traplog
((
struct
tl1_traplog
*
)(
regs
+
1
));
die_if_kernel
(
"TL1: Phys Watchpoint Exception"
,
regs
);
}
...
...
@@ -1674,11 +1807,13 @@ void do_vaw(struct pt_regs *regs)
void
do_vaw_tl1
(
struct
pt_regs
*
regs
)
{
dump_tl1_traplog
((
struct
tl1_traplog
*
)(
regs
+
1
));
die_if_kernel
(
"TL1: Virt Watchpoint Exception"
,
regs
);
}
void
do_tof_tl1
(
struct
pt_regs
*
regs
)
{
dump_tl1_traplog
((
struct
tl1_traplog
*
)(
regs
+
1
));
die_if_kernel
(
"TL1: Tag Overflow Exception"
,
regs
);
}
...
...
arch/sparc64/kernel/ttable.S
View file @
bd59127c
...
...
@@ -7,6 +7,8 @@
#include <linux/config.h>
.
globl
sparc64_ttable_tl0
,
sparc64_ttable_tl1
.
globl
tl0_icpe
,
tl1_icpe
.
globl
tl0_dcpe
,
tl1_dcpe
.
globl
tl0_fecc
,
tl1_fecc
.
globl
tl0_cee
,
tl1_cee
.
globl
tl0_iae
,
tl1_iae
...
...
@@ -79,7 +81,9 @@ tl0_damiss:
tl0_daprot
:
#include "dtlb_prot.S"
tl0_fecc
:
BTRAP
(0
x70
)
/*
Fast
-
ECC
on
Cheetah
*/
tl0_resv071
:
BTRAP
(0
x71
)
BTRAP
(
0x72
)
BTRAP
(
0x73
)
BTRAP
(
0x74
)
BTRAP
(
0x75
)
tl0_dcpe
:
BTRAP
(0
x71
)
/*
D
-
cache
Parity
Error
on
Cheetah
+
*/
tl0_icpe
:
BTRAP
(0
x72
)
/*
I
-
cache
Parity
Error
on
Cheetah
+
*/
tl0_resv073
:
BTRAP
(0
x73
)
BTRAP
(
0x74
)
BTRAP
(
0x75
)
tl0_resv076
:
BTRAP
(0
x76
)
BTRAP
(
0x77
)
BTRAP
(
0x78
)
BTRAP
(
0x79
)
BTRAP
(
0x7a
)
BTRAP
(
0x7b
)
tl0_resv07c
:
BTRAP
(0
x7c
)
BTRAP
(
0x7d
)
BTRAP
(
0x7e
)
BTRAP
(
0x7f
)
tl0_s0n
:
SPILL_0_NORMAL
...
...
@@ -235,8 +239,10 @@ tl1_damiss:
#include "dtlb_backend.S"
tl1_daprot
:
#include "dtlb_prot.S"
tl1_fecc
:
BTRAP
(0
x70
)
/*
Fast
-
ECC
on
Cheetah
*/
tl1_resc071
:
BTRAPTL1
(0
x71
)
BTRAPTL1
(
0x72
)
BTRAPTL1
(
0x73
)
tl1_fecc
:
BTRAPTL1
(0
x70
)
/*
Fast
-
ECC
on
Cheetah
*/
tl1_dcpe
:
BTRAPTL1
(0
x71
)
/*
D
-
cache
Parity
Error
on
Cheetah
+
*/
tl1_icpe
:
BTRAPTL1
(0
x72
)
/*
I
-
cache
Parity
Error
on
Cheetah
+
*/
tl1_resv073
:
BTRAPTL1
(0
x73
)
tl1_resv074
:
BTRAPTL1
(0
x74
)
BTRAPTL1
(
0x75
)
BTRAPTL1
(
0x76
)
BTRAPTL1
(
0x77
)
tl1_resv078
:
BTRAPTL1
(0
x78
)
BTRAPTL1
(
0x79
)
BTRAPTL1
(
0x7a
)
BTRAPTL1
(
0x7b
)
tl1_resv07c
:
BTRAPTL1
(0
x7c
)
BTRAPTL1
(
0x7d
)
BTRAPTL1
(
0x7e
)
BTRAPTL1
(
0x7f
)
...
...
arch/sparc64/lib/blockops.S
View file @
bd59127c
...
...
@@ -66,14 +66,14 @@ cheetah_patch_1:
ldx
[%
g6
+
TI_FLAGS
],
%
g3
/
*
Spitfire
Errata
#
32
workaround
*/
mov
0x8
,
%
o4
mov
PRIMARY_CONTEXT
,
%
o4
stxa
%
g0
,
[%
o4
]
ASI_DMMU
membar
#
Sync
ldxa
[%
o3
]
ASI_DTLB_TAG_READ
,
%
o4
/
*
Spitfire
Errata
#
32
workaround
*/
mov
0x8
,
%
o5
mov
PRIMARY_CONTEXT
,
%
o5
stxa
%
g0
,
[%
o5
]
ASI_DMMU
membar
#
Sync
...
...
@@ -85,14 +85,14 @@ cheetah_patch_1:
add
%
o3
,
(
TLBTEMP_ENTSZ
),
%
o3
/
*
Spitfire
Errata
#
32
workaround
*/
mov
0x8
,
%
g5
mov
PRIMARY_CONTEXT
,
%
g5
stxa
%
g0
,
[%
g5
]
ASI_DMMU
membar
#
Sync
ldxa
[%
o3
]
ASI_DTLB_TAG_READ
,
%
g5
/
*
Spitfire
Errata
#
32
workaround
*/
mov
0x8
,
%
g7
mov
PRIMARY_CONTEXT
,
%
g7
stxa
%
g0
,
[%
g7
]
ASI_DMMU
membar
#
Sync
...
...
@@ -109,7 +109,9 @@ cheetah_patch_1:
rdpr
%
ver
,
%
g3
sllx
%
g3
,
16
,
%
g3
srlx
%
g3
,
32
+
16
,
%
g3
cmp
%
g3
,
0x14
cmp
%
g3
,
0x14
!
CHEETAH_ID
be
,
pn
%
icc
,
cheetah_copy_user_page
cmp
%
g3
,
0x15
!
CHEETAH_PLUS_ID
bne
,
pt
%
icc
,
spitfire_copy_user_page
nop
...
...
@@ -357,14 +359,14 @@ cheetah_patch_2:
wrpr
%
g3
,
PSTATE_IE
,
%
pstate
/
*
Spitfire
Errata
#
32
workaround
*/
mov
0x8
,
%
g5
mov
PRIMARY_CONTEXT
,
%
g5
stxa
%
g0
,
[%
g5
]
ASI_DMMU
membar
#
Sync
ldxa
[%
o3
]
ASI_DTLB_TAG_READ
,
%
g5
/
*
Spitfire
Errata
#
32
workaround
*/
mov
0x8
,
%
g7
mov
PRIMARY_CONTEXT
,
%
g7
stxa
%
g0
,
[%
g7
]
ASI_DMMU
membar
#
Sync
...
...
@@ -409,7 +411,8 @@ clear_page_common:
retl
nop
1
:
stxa
%
g5
,
[%
o2
]
ASI_DMMU
1
:
stxa
%
g5
,
[%
o2
]
ASI_DMMU
stxa
%
g7
,
[%
o3
]
ASI_DTLB_DATA_ACCESS
membar
#
Sync
jmpl
%
o7
+
0x8
,
%
g0
...
...
arch/sparc64/mm/fault.c
View file @
bd59127c
...
...
@@ -9,6 +9,7 @@
#include <linux/string.h>
#include <linux/types.h>
#include <linux/sched.h>
#include <linux/ptrace.h>
#include <linux/mman.h>
#include <linux/signal.h>
...
...
arch/sparc64/mm/init.c
View file @
bd59127c
...
...
@@ -345,6 +345,8 @@ void mmu_info(struct seq_file *m)
{
if
(
tlb_type
==
cheetah
)
seq_printf
(
m
,
"MMU Type
\t
: Cheetah
\n
"
);
else
if
(
tlb_type
==
cheetah_plus
)
seq_printf
(
m
,
"MMU Type
\t
: Cheetah+
\n
"
);
else
if
(
tlb_type
==
spitfire
)
seq_printf
(
m
,
"MMU Type
\t
: Spitfire
\n
"
);
else
...
...
@@ -514,6 +516,7 @@ static void inherit_prom_mappings(void)
break
;
case
cheetah
:
case
cheetah_plus
:
phys_page
=
cheetah_get_litlb_data
(
sparc64_highest_locked_tlbent
());
break
;
};
...
...
@@ -539,7 +542,7 @@ static void inherit_prom_mappings(void)
"i"
(
ASI_DMMU
),
"i"
(
ASI_DTLB_DATA_ACCESS
),
"i"
(
ASI_IMMU
),
"i"
(
ASI_ITLB_DATA_ACCESS
)
:
"memory"
);
}
else
if
(
tlb_type
==
cheetah
)
{
}
else
if
(
tlb_type
==
cheetah
||
tlb_type
==
cheetah_plus
)
{
/* Lock this into i/d tlb-0 entry 11 */
__asm__
__volatile__
(
"stxa %%g0, [%2] %3
\n\t
"
...
...
@@ -684,9 +687,9 @@ static void __flush_nucleus_vptes(void)
spitfire_put_dtlb_data
(
i
,
0x0UL
);
}
}
}
else
if
(
tlb_type
==
cheetah
)
{
}
else
if
(
tlb_type
==
cheetah
||
tlb_type
==
cheetah_plus
)
{
for
(
i
=
0
;
i
<
512
;
i
++
)
{
unsigned
long
tag
=
cheetah_get_dtlb_tag
(
i
);
unsigned
long
tag
=
cheetah_get_dtlb_tag
(
i
,
2
);
if
((
tag
&
~
PAGE_MASK
)
==
0
&&
(
tag
&
PAGE_MASK
)
>=
prom_reserved_base
)
{
...
...
@@ -694,7 +697,21 @@ static void __flush_nucleus_vptes(void)
"membar #Sync"
:
/* no outputs */
:
"r"
(
TLB_TAG_ACCESS
),
"i"
(
ASI_DMMU
));
cheetah_put_dtlb_data
(
i
,
0x0UL
);
cheetah_put_dtlb_data
(
i
,
0x0UL
,
2
);
}
if
(
tlb_type
!=
cheetah_plus
)
continue
;
tag
=
cheetah_get_dtlb_tag
(
i
,
3
);
if
((
tag
&
~
PAGE_MASK
)
==
0
&&
(
tag
&
PAGE_MASK
)
>=
prom_reserved_base
)
{
__asm__
__volatile__
(
"stxa %%g0, [%0] %1
\n\t
"
"membar #Sync"
:
/* no outputs */
:
"r"
(
TLB_TAG_ACCESS
),
"i"
(
ASI_DMMU
));
cheetah_put_dtlb_data
(
i
,
0x0UL
,
3
);
}
}
}
else
{
...
...
@@ -743,7 +760,7 @@ void prom_world(int enter)
if
(
tlb_type
==
spitfire
)
spitfire_put_dtlb_data
(
prom_dtlb
[
i
].
tlb_ent
,
prom_dtlb
[
i
].
tlb_data
);
else
if
(
tlb_type
==
cheetah
)
else
if
(
tlb_type
==
cheetah
||
tlb_type
==
cheetah_plus
)
cheetah_put_ldtlb_data
(
prom_dtlb
[
i
].
tlb_ent
,
prom_dtlb
[
i
].
tlb_data
);
}
...
...
@@ -756,7 +773,7 @@ void prom_world(int enter)
if
(
tlb_type
==
spitfire
)
spitfire_put_itlb_data
(
prom_itlb
[
i
].
tlb_ent
,
prom_itlb
[
i
].
tlb_data
);
else
if
(
tlb_type
==
cheetah
)
else
if
(
tlb_type
==
cheetah
||
tlb_type
==
cheetah_plus
)
cheetah_put_litlb_data
(
prom_itlb
[
i
].
tlb_ent
,
prom_itlb
[
i
].
tlb_data
);
}
...
...
@@ -891,7 +908,7 @@ void inherit_locked_prom_mappings(int save_p)
break
;
}
}
}
else
if
(
tlb_type
==
cheetah
)
{
}
else
if
(
tlb_type
==
cheetah
||
tlb_type
==
cheetah_plus
)
{
int
high
=
CHEETAH_HIGHEST_LOCKED_TLBENT
-
bigkernel
;
for
(
i
=
0
;
i
<
high
;
i
++
)
{
...
...
@@ -963,7 +980,7 @@ void prom_reload_locked(void)
if
(
tlb_type
==
spitfire
)
spitfire_put_dtlb_data
(
prom_dtlb
[
i
].
tlb_ent
,
prom_dtlb
[
i
].
tlb_data
);
else
if
(
tlb_type
==
cheetah
)
else
if
(
tlb_type
==
cheetah
||
tlb_type
==
cheetah_plus
)
cheetah_put_ldtlb_data
(
prom_dtlb
[
i
].
tlb_ent
,
prom_dtlb
[
i
].
tlb_data
);
}
...
...
@@ -1064,7 +1081,7 @@ void __flush_tlb_all(void)
spitfire_put_itlb_data
(
i
,
0x0UL
);
}
}
}
else
if
(
tlb_type
==
cheetah
)
{
}
else
if
(
tlb_type
==
cheetah
||
tlb_type
==
cheetah_plus
)
{
cheetah_flush_dtlb_all
();
cheetah_flush_itlb_all
();
}
...
...
@@ -1208,7 +1225,7 @@ void sparc_ultra_dump_itlb(void)
slot
+
2
,
spitfire_get_itlb_tag
(
slot
+
2
),
spitfire_get_itlb_data
(
slot
+
2
));
}
}
else
if
(
tlb_type
==
cheetah
)
{
}
else
if
(
tlb_type
==
cheetah
||
tlb_type
==
cheetah_plus
)
{
printk
(
"Contents of itlb0:
\n
"
);
for
(
slot
=
0
;
slot
<
16
;
slot
+=
2
)
{
printk
(
"%2x:%016lx,%016lx %2x:%016lx,%016lx
\n
"
,
...
...
@@ -1246,7 +1263,7 @@ void sparc_ultra_dump_dtlb(void)
slot
+
2
,
spitfire_get_dtlb_tag
(
slot
+
2
),
spitfire_get_dtlb_data
(
slot
+
2
));
}
}
else
if
(
tlb_type
==
cheetah
)
{
}
else
if
(
tlb_type
==
cheetah
||
tlb_type
==
cheetah_plus
)
{
printk
(
"Contents of dtlb0:
\n
"
);
for
(
slot
=
0
;
slot
<
16
;
slot
+=
2
)
{
printk
(
"%2x:%016lx,%016lx %2x:%016lx,%016lx
\n
"
,
...
...
@@ -1259,9 +1276,19 @@ void sparc_ultra_dump_dtlb(void)
for
(
slot
=
0
;
slot
<
512
;
slot
+=
2
)
{
printk
(
"%2x:%016lx,%016lx %2x:%016lx,%016lx
\n
"
,
slot
,
cheetah_get_dtlb_tag
(
slot
),
cheetah_get_dtlb_data
(
slot
),
cheetah_get_dtlb_tag
(
slot
,
2
),
cheetah_get_dtlb_data
(
slot
,
2
),
slot
+
1
,
cheetah_get_dtlb_tag
(
slot
+
1
),
cheetah_get_dtlb_data
(
slot
+
1
));
cheetah_get_dtlb_tag
(
slot
+
1
,
2
),
cheetah_get_dtlb_data
(
slot
+
1
,
2
));
}
if
(
tlb_type
==
cheetah_plus
)
{
printk
(
"Contents of dtlb3:
\n
"
);
for
(
slot
=
0
;
slot
<
512
;
slot
+=
2
)
{
printk
(
"%2x:%016lx,%016lx %2x:%016lx,%016lx
\n
"
,
slot
,
cheetah_get_dtlb_tag
(
slot
,
3
),
cheetah_get_dtlb_data
(
slot
,
3
),
slot
+
1
,
cheetah_get_dtlb_tag
(
slot
+
1
,
3
),
cheetah_get_dtlb_data
(
slot
+
1
,
3
));
}
}
}
}
...
...
@@ -1439,7 +1466,7 @@ void __init paging_init(void)
"i"
(
ASI_DMMU
),
"i"
(
ASI_DTLB_DATA_ACCESS
),
"r"
(
60
<<
3
)
:
"memory"
);
}
}
else
if
(
tlb_type
==
cheetah
)
{
}
else
if
(
tlb_type
==
cheetah
||
tlb_type
==
cheetah_plus
)
{
__asm__
__volatile__
(
" stxa %1, [%0] %3
\n
"
" stxa %2, [%5] %4
\n
"
...
...
@@ -1745,7 +1772,7 @@ void __init mem_init(void)
initpages
<<
(
PAGE_SHIFT
-
10
),
PAGE_OFFSET
,
(
last_valid_pfn
<<
PAGE_SHIFT
));
if
(
tlb_type
==
cheetah
)
if
(
tlb_type
==
cheetah
||
tlb_type
==
cheetah_plus
)
cheetah_ecache_flush_init
();
}
...
...
arch/sparc64/mm/modutil.c
View file @
bd59127c
...
...
@@ -5,10 +5,9 @@
* Based upon code written by Linus Torvalds and others.
*/
#warning "major untested changes to this file --hch (2002/08/05)"
#include <linux/slab.h>
#include <linux/vmalloc.h>
#include <linux/mm.h>
#include <asm/uaccess.h>
#include <asm/system.h>
...
...
@@ -30,13 +29,13 @@ void module_unmap (void * addr)
for
(
p
=
&
modvmlist
;
(
tmp
=
*
p
)
;
p
=
&
tmp
->
next
)
{
if
(
tmp
->
addr
==
addr
)
{
*
p
=
tmp
->
next
;
goto
found
;
}
}
printk
(
"Trying to unmap nonexistent module vm area (%p)
\n
"
,
addr
);
return
;
found:
unmap_vm_area
(
tmp
);
for
(
i
=
0
;
i
<
tmp
->
nr_pages
;
i
++
)
{
...
...
@@ -53,14 +52,13 @@ void module_unmap (void * addr)
void
*
module_map
(
unsigned
long
size
)
{
struct
vm_struct
**
p
,
*
tmp
,
*
area
;
struct
vm_struct
*
area
;
struct
page
**
pages
;
void
*
addr
;
unsigned
int
nr_pages
,
array_size
,
i
;
size
=
PAGE_ALIGN
(
size
);
if
(
!
size
||
size
>
MODULES_LEN
)
return
NULL
;
if
(
!
size
||
size
>
MODULES_LEN
)
return
NULL
;
addr
=
(
void
*
)
MODULES_VADDR
;
for
(
p
=
&
modvmlist
;
(
tmp
=
*
p
)
;
p
=
&
tmp
->
next
)
{
...
...
@@ -68,10 +66,12 @@ void * module_map (unsigned long size)
break
;
addr
=
(
void
*
)
(
tmp
->
size
+
(
unsigned
long
)
tmp
->
addr
);
}
if
((
unsigned
long
)
addr
+
size
>=
MODULES_END
)
return
NULL
;
if
((
unsigned
long
)
addr
+
size
>=
MODULES_END
)
return
NULL
;
area
=
(
struct
vm_struct
*
)
kmalloc
(
sizeof
(
*
area
),
GFP_KERNEL
);
if
(
!
area
)
return
NULL
;
if
(
!
area
)
return
NULL
;
area
->
size
=
size
+
PAGE_SIZE
;
area
->
addr
=
addr
;
area
->
next
=
*
p
;
...
...
@@ -80,27 +80,38 @@ void * module_map (unsigned long size)
area
->
phys_addr
=
0
;
*
p
=
area
;
nr_pages
=
(
size
+
PAGE_SIZE
)
>>
PAGE_SHIFT
;
nr_pages
=
size
>>
PAGE_SHIFT
;
array_size
=
(
nr_pages
*
sizeof
(
struct
page
*
));
area
->
nr_pages
=
nr_pages
;
area
->
pages
=
pages
=
kmalloc
(
array_size
,
(
gfp_mask
&
~
__GFP_HIGHMEM
)
);
area
->
pages
=
pages
=
kmalloc
(
array_size
,
GFP_KERNEL
);
if
(
!
area
->
pages
)
return
NULL
;
goto
fail
;
memset
(
area
->
pages
,
0
,
array_size
);
for
(
i
=
0
;
i
<
area
->
nr_pages
;
i
++
)
{
area
->
pages
[
i
]
=
alloc_page
(
gfp_mask
);
area
->
pages
[
i
]
=
alloc_page
(
GFP_KERNEL
);
if
(
unlikely
(
!
area
->
pages
[
i
]))
goto
fail
;
}
if
(
map_vm_area
(
area
,
prot
,
&
pages
))
if
(
map_vm_area
(
area
,
PAGE_KERNEL
,
&
pages
))
{
unmap_vm_area
(
area
);
goto
fail
;
}
return
area
->
addr
;
fail:
vfree
(
area
->
addr
);
if
(
area
->
pages
)
{
for
(
i
=
0
;
i
<
area
->
nr_pages
;
i
++
)
{
if
(
area
->
pages
[
i
])
__free_page
(
area
->
pages
[
i
]);
}
kfree
(
area
->
pages
);
}
kfree
(
area
);
return
NULL
;
}
}
arch/sparc64/mm/ultra.S
View file @
bd59127c
...
...
@@ -14,21 +14,12 @@
#include <asm/head.h>
#include <asm/thread_info.h>
/
*
Basically
,
all
this
madness
has
to
do
with
the
*
fact
that
Cheetah
does
not
support
IMMU
flushes
*
out
of
the
secondary
context
.
Someone
needs
to
*
throw
a
south
lake
birthday
party
for
the
folks
/
*
Basically
,
most
of
the
Spitfire
vs
.
Cheetah
madness
*
has
to
do
with
the
fact
that
Cheetah
does
not
support
*
IMMU
flushes
out
of
the
secondary
context
.
Someone
needs
*
t
o
t
hrow
a
south
lake
birthday
party
for
the
folks
*
in
Microelectronics
who
refused
to
fix
this
shit
.
*/
#define BRANCH_IF_CHEETAH(tmp1, tmp2, label) \
rdpr
%
ver
,
%
tmp1
; \
sethi
%
hi
(
0x003e0014
),
%
tmp2
; \
srlx
%
tmp1
,
32
,
%
tmp1
; \
or
%
tmp2
,
%
lo
(
0x003e0014
),
%
tmp2
; \
cmp
%
tmp1
,
%
tmp2
; \
be
,
pn
%
icc
,
label
; \
nop
; \
nop
;
/
*
This
file
is
meant
to
be
read
efficiently
by
the
CPU
,
not
humans
.
*
Staraj
sie
tego
nikomu
nie
pierdolnac
...
...
...
@@ -37,9 +28,7 @@
.
align
32
.
globl
__flush_tlb_page
,
__flush_tlb_mm
,
__flush_tlb_range
__flush_tlb_page
:
/
*
%
o0
=(
ctx
&
TAG_CONTEXT_BITS
),
%
o1
=
page
&
PAGE_MASK
,
%
o2
=
SECONDARY_CONTEXT
*/
/*
IC1
*/
BRANCH_IF_CHEETAH
(
g2
,
g3
,
__cheetah_flush_tlb_page
)
__spitfire_flush_tlb_page
:
/*
IC2
*/
ldxa
[%
o2
]
ASI_DMMU
,
%
g2
ldxa
[%
o2
]
ASI_DMMU
,
%
g2
cmp
%
g2
,
%
o0
bne
,
pn
%
icc
,
__spitfire_flush_tlb_page_slow
or
%
o1
,
0x10
,
%
g3
...
...
@@ -47,27 +36,17 @@ __spitfire_flush_tlb_page:
stxa
%
g0
,
[%
g3
]
ASI_IMMU_DEMAP
retl
flush
%
g6
__cheetah_flush_tlb_page
:
/*
IC3
*/
rdpr
%
pstate
,
%
g5
andn
%
g5
,
PSTATE_IE
,
%
g2
wrpr
%
g2
,
0x0
,
%
pstate
wrpr
%
g0
,
1
,
%
tl
mov
PRIMARY_CONTEXT
,
%
o2
ldxa
[%
o2
]
ASI_DMMU
,
%
g2
stxa
%
o0
,
[%
o2
]
ASI_DMMU
stxa
%
g0
,
[%
o1
]
ASI_DMMU_DEMAP
/*
IC4
*/
stxa
%
g0
,
[%
o1
]
ASI_IMMU_DEMAP
stxa
%
g2
,
[%
o2
]
ASI_DMMU
flush
%
g6
wrpr
%
g0
,
0
,
%
tl
retl
wrpr
%
g5
,
0x0
,
%
pstate
nop
nop
nop
nop
nop
nop
nop
nop
__flush_tlb_mm
:
/
*
%
o0
=(
ctx
&
TAG_CONTEXT_BITS
),
%
o1
=
SECONDARY_CONTEXT
*/
/*
IC5
*/
BRANCH_IF_CHEETAH
(
g2
,
g3
,
__cheetah_flush_tlb_mm
)
__spitfire_flush_tlb_mm
:
/*
IC6
*/
ldxa
[%
o1
]
ASI_DMMU
,
%
g2
ldxa
[%
o1
]
ASI_DMMU
,
%
g2
cmp
%
g2
,
%
o0
bne
,
pn
%
icc
,
__spitfire_flush_tlb_mm_slow
mov
0x50
,
%
g3
...
...
@@ -75,30 +54,20 @@ __spitfire_flush_tlb_mm:
stxa
%
g0
,
[%
g3
]
ASI_IMMU_DEMAP
retl
flush
%
g6
__cheetah_flush_tlb_mm
:
/*
IC7
*/
rdpr
%
pstate
,
%
g5
andn
%
g5
,
PSTATE_IE
,
%
g2
wrpr
%
g2
,
0x0
,
%
pstate
wrpr
%
g0
,
1
,
%
tl
mov
PRIMARY_CONTEXT
,
%
o2
mov
0x40
,
%
g3
ldxa
[%
o2
]
ASI_DMMU
,
%
g2
stxa
%
o0
,
[%
o2
]
ASI_DMMU
/*
IC8
*/
stxa
%
g0
,
[%
g3
]
ASI_DMMU_DEMAP
stxa
%
g0
,
[%
g3
]
ASI_IMMU_DEMAP
stxa
%
g2
,
[%
o2
]
ASI_DMMU
flush
%
g6
wrpr
%
g0
,
0
,
%
tl
retl
wrpr
%
g5
,
0x0
,
%
pstate
nop
nop
nop
nop
nop
nop
nop
nop
__flush_tlb_range
:
/
*
%
o0
=(
ctx
&
TAG_CONTEXT_BITS
),
%
o1
=
start
&
PAGE_MASK
,
%
o2
=
SECONDARY_CONTEXT
,
*
%
o3
=
end
&
PAGE_MASK
,
%
o4
=
PAGE_SIZE
,
%
o5
=(
end
-
start
)
*/
/*
IC9
*/
BRANCH_IF_CHEETAH
(
g2
,
g3
,
__cheetah_flush_tlb_range
)
__spitfire_flush_tlb_range
:
#define TLB_MAGIC 207 /* Students, do you know how I calculated this? -DaveM */
/*
IC10
*/
cmp
%
o5
,
%
o4
cmp
%
o5
,
%
o4
bleu
,
pt
%
xcc
,
__flush_tlb_page
srlx
%
o5
,
PAGE_SHIFT
,
%
g5
cmp
%
g5
,
TLB_MAGIC
...
...
@@ -107,7 +76,7 @@ __spitfire_flush_tlb_range:
ldxa
[%
o2
]
ASI_DMMU
,
%
g2
cmp
%
g2
,
%
o0
__spitfire_flush_tlb_range_page_by_page
:
/*
IC11
*/
bne
,
pn
%
icc
,
__spitfire_flush_tlb_range_pbp_slow
bne
,
pn
%
icc
,
__spitfire_flush_tlb_range_pbp_slow
sub
%
o5
,
%
o4
,
%
o5
1
:
stxa
%
g0
,
[%
g5
+
%
o5
]
ASI_DMMU_DEMAP
stxa
%
g0
,
[%
g5
+
%
o5
]
ASI_IMMU_DEMAP
...
...
@@ -116,10 +85,9 @@ __spitfire_flush_tlb_range_page_by_page:
retl
flush
%
g6
__spitfire_flush_tlb_range_constant_time
:
/
*
%
o0
=
ctx
,
%
o1
=
start
,
%
o3
=
end
*/
/*
IC12
*/
rdpr
%
pstate
,
%
g1
rdpr
%
pstate
,
%
g1
wrpr
%
g1
,
PSTATE_IE
,
%
pstate
mov
TLB_TAG_ACCESS
,
%
g3
/
*
XXX
Spitfire
dependency
...
*/
mov
((
SPITFIRE_HIGHEST_LOCKED_TLBENT
-
1
)
<<
3
),
%
g2
/
*
Spitfire
Errata
#
32
workaround
.
*/
...
...
@@ -131,7 +99,7 @@ __spitfire_flush_tlb_range_constant_time: /* %o0=ctx, %o1=start, %o3=end */
and
%
o4
,
TAG_CONTEXT_BITS
,
%
o5
cmp
%
o5
,
%
o0
bne
,
pt
%
icc
,
2
f
/*
IC13
*/
andn
%
o4
,
TAG_CONTEXT_BITS
,
%
o4
andn
%
o4
,
TAG_CONTEXT_BITS
,
%
o4
cmp
%
o4
,
%
o1
blu
,
pt
%
xcc
,
2
f
cmp
%
o4
,
%
o3
...
...
@@ -139,7 +107,7 @@ __spitfire_flush_tlb_range_constant_time: /* %o0=ctx, %o1=start, %o3=end */
2
:
ldxa
[%
g2
]
ASI_DTLB_TAG_READ
,
%
o4
and
%
o4
,
TAG_CONTEXT_BITS
,
%
o5
cmp
%
o5
,
%
o0
/*
IC14
*/
andn
%
o4
,
TAG_CONTEXT_BITS
,
%
o4
andn
%
o4
,
TAG_CONTEXT_BITS
,
%
o4
bne
,
pt
%
icc
,
3
f
cmp
%
o4
,
%
o1
blu
,
pt
%
xcc
,
3
f
...
...
@@ -147,7 +115,7 @@ __spitfire_flush_tlb_range_constant_time: /* %o0=ctx, %o1=start, %o3=end */
blu
,
pn
%
xcc
,
5
f
nop
3
:
brnz
,
pt
%
g2
,
1
b
/*
IC15
*/
sub
%
g2
,
(
1
<<
3
),
%
g2
sub
%
g2
,
(
1
<<
3
),
%
g2
retl
wrpr
%
g1
,
0x0
,
%
pstate
4
:
stxa
%
g0
,
[%
g3
]
ASI_IMMU
...
...
@@ -163,7 +131,7 @@ __spitfire_flush_tlb_range_constant_time: /* %o0=ctx, %o1=start, %o3=end */
nop
5
:
stxa
%
g0
,
[%
g3
]
ASI_DMMU
/*
IC16
*/
stxa
%
g0
,
[%
g2
]
ASI_DTLB_DATA_ACCESS
stxa
%
g0
,
[%
g2
]
ASI_DTLB_DATA_ACCESS
flush
%
g6
/
*
Spitfire
Errata
#
32
workaround
.
*/
...
...
@@ -175,33 +143,6 @@ __spitfire_flush_tlb_range_constant_time: /* %o0=ctx, %o1=start, %o3=end */
nop
.
align
32
__cheetah_flush_tlb_range
:
cmp
%
o5
,
%
o4
bleu
,
pt
%
xcc
,
__cheetah_flush_tlb_page
nop
/*
IC17
*/
rdpr
%
pstate
,
%
g5
andn
%
g5
,
PSTATE_IE
,
%
g2
wrpr
%
g2
,
0x0
,
%
pstate
wrpr
%
g0
,
1
,
%
tl
mov
PRIMARY_CONTEXT
,
%
o2
sub
%
o5
,
%
o4
,
%
o5
ldxa
[%
o2
]
ASI_DMMU
,
%
g2
stxa
%
o0
,
[%
o2
]
ASI_DMMU
/*
IC18
*/
1
:
stxa
%
g0
,
[%
o1
+
%
o5
]
ASI_DMMU_DEMAP
stxa
%
g0
,
[%
o1
+
%
o5
]
ASI_IMMU_DEMAP
membar
#
Sync
brnz
,
pt
%
o5
,
1
b
sub
%
o5
,
%
o4
,
%
o5
stxa
%
g2
,
[%
o2
]
ASI_DMMU
flush
%
g6
wrpr
%
g0
,
0
,
%
tl
retl
/*
IC19
*/
wrpr
%
g5
,
0x0
,
%
pstate
.
align
32
.
globl
__flush_tlb_kernel_range
__flush_tlb_kernel_range
:
/
*
%
o0
=
start
,
%
o1
=
end
*/
cmp
%
o0
,
%
o1
...
...
@@ -226,7 +167,7 @@ __spitfire_flush_tlb_mm_slow:
stxa
%
g0
,
[%
g3
]
ASI_IMMU_DEMAP
flush
%
g6
stxa
%
g2
,
[%
o1
]
ASI_DMMU
/*
IC18
*/
flush
%
g6
flush
%
g6
retl
wrpr
%
g1
,
0
,
%
pstate
...
...
@@ -236,7 +177,7 @@ __spitfire_flush_tlb_page_slow:
stxa
%
o0
,
[%
o2
]
ASI_DMMU
stxa
%
g0
,
[%
g3
]
ASI_DMMU_DEMAP
stxa
%
g0
,
[%
g3
]
ASI_IMMU_DEMAP
/*
IC20
*/
flush
%
g6
flush
%
g6
stxa
%
g2
,
[%
o2
]
ASI_DMMU
flush
%
g6
retl
...
...
@@ -246,7 +187,7 @@ __spitfire_flush_tlb_range_pbp_slow:
rdpr
%
pstate
,
%
g1
wrpr
%
g1
,
PSTATE_IE
,
%
pstate
stxa
%
o0
,
[%
o2
]
ASI_DMMU
/*
IC21
*/
2
:
stxa
%
g0
,
[%
g5
+
%
o5
]
ASI_DMMU_DEMAP
stxa
%
g0
,
[%
g5
+
%
o5
]
ASI_IMMU_DEMAP
brnz
,
pt
%
o5
,
2
b
...
...
@@ -255,7 +196,7 @@ __spitfire_flush_tlb_range_pbp_slow:
stxa
%
g2
,
[%
o2
]
ASI_DMMU
flush
%
g6
retl
/*
IC22
*/
wrpr
%
g1
,
0x0
,
%
pstate
wrpr
%
g1
,
0x0
,
%
pstate
/*
*
The
following
code
flushes
one
page_size
worth
.
...
...
@@ -318,32 +259,6 @@ iflush2:sub %o1, 0x20, %g3
flush
%
g6
ba
,
a
,
pt
%
xcc
,
3
b
.
align
64
.
globl
__flush_dcache_page
__flush_dcache_page
:
/
*
%
o0
=
kaddr
,
%
o1
=
flush_icache
*/
sethi
%
uhi
(
PAGE_OFFSET
),
%
g1
sllx
%
g1
,
32
,
%
g1
sub
%
o0
,
%
g1
,
%
o0
rdpr
%
ver
,
%
g1
sethi
%
hi
(
0x003e0014
),
%
g2
srlx
%
g1
,
32
,
%
g1
or
%
g2
,
%
lo
(
0x003e0014
),
%
g2
cmp
%
g1
,
%
g2
bne
,
pt
%
icc
,
flush_dcpage_spitfire
nop
flush_dcpage_cheetah
:
sethi
%
hi
(
PAGE_SIZE
),
%
o4
1
:
subcc
%
o4
,
(
1
<<
5
),
%
o4
stxa
%
g0
,
[%
o0
+
%
o4
]
ASI_DCACHE_INVALIDATE
bne
,
pt
%
icc
,
1
b
nop
membar
#
Sync
/
*
I
-
cache
flush
never
needed
on
Cheetah
,
see
callers
.
*/
retl
nop
#if (PAGE_SHIFT == 13)
#define DTAG_MASK 0x3
#elif (PAGE_SHIFT == 16)
...
...
@@ -354,7 +269,12 @@ flush_dcpage_cheetah:
#define DTAG_MASK 0x3ff
#endif
flush_dcpage_spitfire
:
.
align
64
.
globl
__flush_dcache_page
__flush_dcache_page
:
/
*
%
o0
=
kaddr
,
%
o1
=
flush_icache
*/
sethi
%
uhi
(
PAGE_OFFSET
),
%
g1
sllx
%
g1
,
32
,
%
g1
sub
%
o0
,
%
g1
,
%
o0
clr
%
o4
srlx
%
o0
,
11
,
%
o0
sethi
%
hi
(
1
<<
14
),
%
o2
...
...
@@ -435,6 +355,121 @@ __update_mmu_cache: /* %o0=hw_context, %o1=address, %o2=pte, %o3=fault_code */
or
%
o5
,
%
o0
,
%
o5
ba
,
a
,
pt
%
xcc
,
__prefill_itlb
/
*
Cheetah
specific
versions
,
patched
at
boot
time
.
*/
__cheetah_flush_tlb_page
:
/
*
14
insns
*/
rdpr
%
pstate
,
%
g5
andn
%
g5
,
PSTATE_IE
,
%
g2
wrpr
%
g2
,
0x0
,
%
pstate
wrpr
%
g0
,
1
,
%
tl
mov
PRIMARY_CONTEXT
,
%
o2
ldxa
[%
o2
]
ASI_DMMU
,
%
g2
stxa
%
o0
,
[%
o2
]
ASI_DMMU
stxa
%
g0
,
[%
o1
]
ASI_DMMU_DEMAP
stxa
%
g0
,
[%
o1
]
ASI_IMMU_DEMAP
stxa
%
g2
,
[%
o2
]
ASI_DMMU
flush
%
g6
wrpr
%
g0
,
0
,
%
tl
retl
wrpr
%
g5
,
0x0
,
%
pstate
__cheetah_flush_tlb_mm
:
/
*
15
insns
*/
rdpr
%
pstate
,
%
g5
andn
%
g5
,
PSTATE_IE
,
%
g2
wrpr
%
g2
,
0x0
,
%
pstate
wrpr
%
g0
,
1
,
%
tl
mov
PRIMARY_CONTEXT
,
%
o2
mov
0x40
,
%
g3
ldxa
[%
o2
]
ASI_DMMU
,
%
g2
stxa
%
o0
,
[%
o2
]
ASI_DMMU
stxa
%
g0
,
[%
g3
]
ASI_DMMU_DEMAP
stxa
%
g0
,
[%
g3
]
ASI_IMMU_DEMAP
stxa
%
g2
,
[%
o2
]
ASI_DMMU
flush
%
g6
wrpr
%
g0
,
0
,
%
tl
retl
wrpr
%
g5
,
0x0
,
%
pstate
__cheetah_flush_tlb_range
:
/
*
20
insns
*/
cmp
%
o5
,
%
o4
blu
,
pt
%
xcc
,
9
f
rdpr
%
pstate
,
%
g5
andn
%
g5
,
PSTATE_IE
,
%
g2
wrpr
%
g2
,
0x0
,
%
pstate
wrpr
%
g0
,
1
,
%
tl
mov
PRIMARY_CONTEXT
,
%
o2
sub
%
o5
,
%
o4
,
%
o5
ldxa
[%
o2
]
ASI_DMMU
,
%
g2
stxa
%
o0
,
[%
o2
]
ASI_DMMU
1
:
stxa
%
g0
,
[%
o1
+
%
o5
]
ASI_DMMU_DEMAP
stxa
%
g0
,
[%
o1
+
%
o5
]
ASI_IMMU_DEMAP
membar
#
Sync
brnz
,
pt
%
o5
,
1
b
sub
%
o5
,
%
o4
,
%
o5
stxa
%
g2
,
[%
o2
]
ASI_DMMU
flush
%
g6
wrpr
%
g0
,
0
,
%
tl
9
:
retl
wrpr
%
g5
,
0x0
,
%
pstate
flush_dcpage_cheetah
:
/
*
11
insns
*/
sethi
%
uhi
(
PAGE_OFFSET
),
%
g1
sllx
%
g1
,
32
,
%
g1
sub
%
o0
,
%
g1
,
%
o0
sethi
%
hi
(
PAGE_SIZE
),
%
o4
1
:
subcc
%
o4
,
(
1
<<
5
),
%
o4
stxa
%
g0
,
[%
o0
+
%
o4
]
ASI_DCACHE_INVALIDATE
membar
#
Sync
bne
,
pt
%
icc
,
1
b
nop
retl
/*
I
-
cache
flush
never
needed
on
Cheetah
,
see
callers
.
*/
nop
cheetah_patch_one
:
1
:
lduw
[%
o1
],
%
g1
stw
%
g1
,
[%
o0
]
flush
%
o0
subcc
%
o2
,
1
,
%
o2
add
%
o1
,
4
,
%
o1
bne
,
pt
%
icc
,
1
b
add
%
o0
,
4
,
%
o0
retl
nop
.
globl
cheetah_patch_cachetlbops
cheetah_patch_cachetlbops
:
save
%
sp
,
-
128
,
%
sp
sethi
%
hi
(
__flush_tlb_page
),
%
o0
or
%
o0
,
%
lo
(
__flush_tlb_page
),
%
o0
sethi
%
hi
(
__cheetah_flush_tlb_page
),
%
o1
or
%
o1
,
%
lo
(
__cheetah_flush_tlb_page
),
%
o1
call
cheetah_patch_one
mov
14
,
%
o2
sethi
%
hi
(
__flush_tlb_mm
),
%
o0
or
%
o0
,
%
lo
(
__flush_tlb_mm
),
%
o0
sethi
%
hi
(
__cheetah_flush_tlb_mm
),
%
o1
or
%
o1
,
%
lo
(
__cheetah_flush_tlb_mm
),
%
o1
call
cheetah_patch_one
mov
15
,
%
o2
sethi
%
hi
(
__flush_tlb_range
),
%
o0
or
%
o0
,
%
lo
(
__flush_tlb_range
),
%
o0
sethi
%
hi
(
__cheetah_flush_tlb_range
),
%
o1
or
%
o1
,
%
lo
(
__cheetah_flush_tlb_range
),
%
o1
call
cheetah_patch_one
mov
20
,
%
o2
sethi
%
hi
(
__flush_dcache_page
),
%
o0
or
%
o0
,
%
lo
(
__flush_dcache_page
),
%
o0
sethi
%
hi
(
flush_dcpage_cheetah
),
%
o1
or
%
o1
,
%
lo
(
flush_dcpage_cheetah
),
%
o1
call
cheetah_patch_one
mov
11
,
%
o2
ret
restore
#ifdef CONFIG_SMP
/
*
These
are
all
called
by
the
slaves
of
a
cross
call
,
at
*
trap
level
1
,
with
interrupts
fully
disabled
.
...
...
@@ -538,7 +573,7 @@ xcall_report_regs:
rdpr
%
pil
,
%
g2
wrpr
%
g0
,
15
,
%
pil
sethi
%
hi
(
109
f
),
%
g7
b
,
pt
%
xcc
,
etrap
b
,
pt
%
xcc
,
etrap
_irq
109
:
or
%
g7
,
%
lo
(
109
b
),
%
g7
call
__show_regs
add
%
sp
,
STACK_BIAS
+
REGWIN_SZ
,
%
o0
...
...
@@ -553,9 +588,9 @@ xcall_flush_dcache_page_cheetah: /* %g1 == physical page address */
sethi
%
hi
(
PAGE_SIZE
),
%
g3
1
:
subcc
%
g3
,
(
1
<<
5
),
%
g3
stxa
%
g0
,
[%
g1
+
%
g3
]
ASI_DCACHE_INVALIDATE
membar
#
Sync
bne
,
pt
%
icc
,
1
b
nop
membar
#
Sync
retry
nop
...
...
@@ -601,7 +636,7 @@ xcall_promstop:
rdpr
%
pil
,
%
g2
wrpr
%
g0
,
15
,
%
pil
sethi
%
hi
(
109
f
),
%
g7
b
,
pt
%
xcc
,
etrap
b
,
pt
%
xcc
,
etrap
_irq
109
:
or
%
g7
,
%
lo
(
109
b
),
%
g7
flushw
call
prom_stopself
...
...
@@ -618,10 +653,8 @@ errata32_hwbug:
.
text
/
*
These
two
are
not
performance
critical
...
*/
.
globl
xcall_flush_tlb_all
xcall_flush_tlb_all
:
BRANCH_IF_CHEETAH
(
g2
,
g3
,
__cheetah_xcall_flush_tlb_all
)
__spitfire_xcall_flush_tlb_all
:
.
globl
xcall_flush_tlb_all_spitfire
xcall_flush_tlb_all_spitfire
:
/
*
Spitfire
Errata
#
32
workaround
.
*/
sethi
%
hi
(
errata32_hwbug
),
%
g4
stx
%
g0
,
[%
g4
+
%
lo
(
errata32_hwbug
)]
...
...
@@ -663,16 +696,15 @@ __spitfire_xcall_flush_tlb_all:
flush
%
g6
retry
__cheetah_xcall_flush_tlb_all
:
.
globl
xcall_flush_tlb_all_cheetah
xcall_flush_tlb_all_cheetah
:
mov
0x80
,
%
g2
stxa
%
g0
,
[%
g2
]
ASI_DMMU_DEMAP
stxa
%
g0
,
[%
g2
]
ASI_IMMU_DEMAP
retry
.
globl
xcall_flush_cache_all
xcall_flush_cache_all
:
BRANCH_IF_CHEETAH
(
g2
,
g3
,
__cheetah_xcall_flush_cache_all
)
__spitfire_xcall_flush_cache_all
:
.
globl
xcall_flush_cache_all_spitfire
xcall_flush_cache_all_spitfire
:
sethi
%
hi
(
16383
),
%
g2
or
%
g2
,
%
lo
(
16383
),
%
g2
clr
%
g3
...
...
@@ -685,13 +717,6 @@ __spitfire_xcall_flush_cache_all:
flush
%
g6
retry
/
*
Cheetah
's caches are fully coherent in the sense that
*
caches
are
flushed
here
.
We
need
to
verify
this
and
*
really
just
not
even
send
out
the
xcall
at
the
top
level
.
*/
__cheetah_xcall_flush_cache_all
:
retry
/
*
These
just
get
rescheduled
to
PIL
vectors
.
*/
.
globl
xcall_call_function
xcall_call_function
:
...
...
drivers/video/aty/mach64_cursor.c
View file @
bd59127c
...
...
@@ -252,7 +252,7 @@ struct aty_cursor *__init aty_init_cursor(struct fb_info *info)
cursor
->
offset
=
info
->
fix
.
smem_len
;
#ifdef __sparc__
addr
=
info
->
screen_base
-
0x800000
+
cursor
->
offset
;
addr
=
(
unsigned
long
)
info
->
screen_base
-
0x800000
+
cursor
->
offset
;
cursor
->
ram
=
(
u8
*
)
addr
;
#else
#ifdef __BIG_ENDIAN
...
...
drivers/video/cgfourteenfb.c
View file @
bd59127c
...
...
@@ -203,7 +203,7 @@ static void cg14_margins (struct fb_info_sbusfb *fb, struct display *p,
int
x_margin
,
int
y_margin
)
{
fb
->
info
.
screen_base
+=
(
y_margin
-
fb
->
y_margin
)
*
p
->
line_length
+
(
x_margin
-
fb
->
x_margin
);
fb
->
info
.
fix
.
line_length
+
(
x_margin
-
fb
->
x_margin
);
}
static
void
cg14_setcursormap
(
struct
fb_info_sbusfb
*
fb
,
u8
*
red
,
u8
*
green
,
u8
*
blue
)
...
...
drivers/video/cgsixfb.c
View file @
bd59127c
...
...
@@ -673,7 +673,7 @@ static void cg6_reset (struct fb_info_sbusfb *fb)
static
void
cg6_margins
(
struct
fb_info_sbusfb
*
fb
,
struct
display
*
p
,
int
x_margin
,
int
y_margin
)
{
fb
->
info
.
screen_base
+=
(
y_margin
-
fb
->
y_margin
)
*
p
->
line_length
+
(
x_margin
-
fb
->
x_margin
);
fb
->
info
.
fix
.
line_length
+
(
x_margin
-
fb
->
x_margin
);
}
static
int
__init
cg6_rasterimg
(
struct
fb_info
*
info
,
int
start
)
...
...
drivers/video/cgthreefb.c
View file @
bd59127c
...
...
@@ -140,7 +140,7 @@ static void cg3_margins (struct fb_info_sbusfb *fb, struct display *p,
int
x_margin
,
int
y_margin
)
{
fb
->
info
.
screen_base
+=
(
y_margin
-
fb
->
y_margin
)
*
p
->
line_length
+
(
x_margin
-
fb
->
x_margin
);
fb
->
info
.
fix
.
line_length
+
(
x_margin
-
fb
->
x_margin
);
}
static
u8
cg3regvals_66hz
[]
__initdata
=
{
/* 1152 x 900, 66 Hz */
...
...
drivers/video/sbusfb.c
View file @
bd59127c
...
...
@@ -78,10 +78,6 @@ static int sbusfb_open(struct fb_info *info, int user);
static
int
sbusfb_release
(
struct
fb_info
*
info
,
int
user
);
static
int
sbusfb_mmap
(
struct
fb_info
*
info
,
struct
file
*
file
,
struct
vm_area_struct
*
vma
);
static
int
sbusfb_get_fix
(
struct
fb_fix_screeninfo
*
fix
,
int
con
,
struct
fb_info
*
info
);
static
int
sbusfb_get_var
(
struct
fb_var_screeninfo
*
var
,
int
con
,
struct
fb_info
*
info
);
static
int
sbusfb_set_var
(
struct
fb_var_screeninfo
*
var
,
int
con
,
struct
fb_info
*
info
);
static
int
sbusfb_get_cmap
(
struct
fb_cmap
*
cmap
,
int
kspc
,
int
con
,
...
...
@@ -115,8 +111,6 @@ static struct fb_ops sbusfb_ops = {
.
owner
=
THIS_MODULE
,
.
fb_open
=
sbusfb_open
,
.
fb_release
=
sbusfb_release
,
.
fb_get_fix
=
sbusfb_get_fix
,
.
fb_get_var
=
sbusfb_get_var
,
.
fb_set_var
=
sbusfb_set_var
,
.
fb_get_cmap
=
sbusfb_get_cmap
,
.
fb_set_cmap
=
sbusfb_set_cmap
,
...
...
@@ -303,31 +297,6 @@ static void sbusfb_disp_setup(struct display *p)
sbusfb_clear_margin
(
p
,
0
);
}
/*
* Get the Fixed Part of the Display
*/
static
int
sbusfb_get_fix
(
struct
fb_fix_screeninfo
*
fix
,
int
con
,
struct
fb_info
*
info
)
{
struct
fb_info_sbusfb
*
fb
=
sbusfbinfo
(
info
);
memcpy
(
fix
,
&
fb
->
fix
,
sizeof
(
struct
fb_fix_screeninfo
));
return
0
;
}
/*
* Get the User Defined Part of the Display
*/
static
int
sbusfb_get_var
(
struct
fb_var_screeninfo
*
var
,
int
con
,
struct
fb_info
*
info
)
{
struct
fb_info_sbusfb
*
fb
=
sbusfbinfo
(
info
);
memcpy
(
var
,
&
fb
->
var
,
sizeof
(
struct
fb_var_screeninfo
));
return
0
;
}
/*
* Set the User Defined Part of the Display
...
...
@@ -1084,10 +1053,6 @@ static void __init sbusfb_init_fb(int node, int parent, int fbtype,
fb
->
dispsw
.
clear_margins
=
NULL
;
disp
->
var
=
*
var
;
disp
->
visual
=
fix
->
visual
;
disp
->
type
=
fix
->
type
;
disp
->
type_aux
=
fix
->
type_aux
;
disp
->
line_length
=
fix
->
line_length
;
if
(
fb
->
blank
)
disp
->
can_soft_blank
=
1
;
...
...
include/asm-sparc/ide.h
View file @
bd59127c
...
...
@@ -66,16 +66,24 @@ static __inline__ void ide_init_default_hwifs(void)
for
(
index
=
0
;
index
<
MAX_HWIFS
;
index
++
)
{
ide_init_hwif_ports
(
&
hw
,
ide_default_io_base
(
index
),
0
,
NULL
);
hw
.
irq
=
ide_default_irq
(
ide_default_io_base
(
index
));
ide_register_hw
(
&
hw
);
ide_register_hw
(
&
hw
,
NULL
);
}
#endif
}
#undef SUPPORT_SLOW_DATA_PORTS
#define SUPPORT_SLOW_DATA_PORTS 0
#define ide_request_irq(irq,hand,flg,dev,id) request_irq((irq),(hand),(flg),(dev),(id))
#define ide_free_irq(irq,dev_id) free_irq((irq), (dev_id))
#define ide_check_region(from,extent) check_region((from), (extent))
#define ide_request_region(from,extent,name) request_region((from), (extent), (name))
#define ide_release_region(from,extent) release_region((from), (extent))
#undef HD_DATA
#define HD_DATA ((ide_ioreg_t)0)
/*
* 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... */
...
...
include/asm-sparc/pgtable.h
View file @
bd59127c
...
...
@@ -181,7 +181,7 @@ extern unsigned long empty_zero_page;
#define BAD_PAGETABLE __bad_pagetable()
#define BAD_PAGE __bad_page()
#define ZERO_PAGE(vaddr) (virt_to_page(empty_zero_page))
#define ZERO_PAGE(vaddr) (virt_to_page(
&
empty_zero_page))
/*
*/
...
...
include/asm-sparc/unistd.h
View file @
bd59127c
...
...
@@ -171,7 +171,7 @@
#define __NR_poll 153
/* Common */
#define __NR_getdents64 154
/* Linux specific */
#define __NR_fcntl64 155
/* Linux sparc32 Specific */
/* #define __NR_getdirentries 156 SunOS Specific
*/
#define __NR_security 156
/* getdirentries under SunOS
*/
#define __NR_statfs 157
/* Common */
#define __NR_fstatfs 158
/* Common */
#define __NR_umount 159
/* Common */
...
...
include/asm-sparc64/asi.h
View file @
bd59127c
...
...
@@ -40,6 +40,7 @@
#define ASI_WCACHE_DATA 0x39
/* (III) WCache data RAM diag */
#define ASI_WCACHE_TAG 0x3a
/* (III) WCache tag RAM diag */
#define ASI_WCACHE_SNOOP_TAG 0x3b
/* (III) WCache snoop tag RAM diag */
#define ASI_SRAM_FAST_INIT 0x40
/* (III+) Fast SRAM init */
#define ASI_DCACHE_INVALIDATE 0x42
/* (III) DCache Invalidate diag */
#define ASI_DCACHE_UTAG 0x43
/* (III) DCache uTag diag */
#define ASI_DCACHE_SNOOP_TAG 0x44
/* (III) DCache snoop tag RAM diag */
...
...
include/asm-sparc64/dcr.h
View file @
bd59127c
...
...
@@ -2,11 +2,13 @@
#ifndef _SPARC64_DCR_H
#define _SPARC64_DCR_H
/* UltraSparc-III Dispatch Control Register, ASR 0x12 */
/* UltraSparc-III/III+ Dispatch Control Register, ASR 0x12 */
#define DCR_DPE 0x0000000000001000
/* III+: D$ Parity Error Enable */
#define DCR_OBS 0x0000000000000fc0
/* Observability Bus Controls */
#define DCR_BPE 0x0000000000000020
/* Branch Predict Enable */
#define DCR_RPE 0x0000000000000010
/* Return Address Prediction Enable */
#define DCR_SI 0x0000000000000008
/* Single Instruction Disable */
#define DCR_IPE 0x0000000000000004
/* III+: I$ Parity Error Enable */
#define DCR_IFPOE 0x0000000000000002
/* IRQ FP Operation Enable */
#define DCR_MS 0x0000000000000001
/* Multi-Scalar dispatch */
...
...
include/asm-sparc64/elf.h
View file @
bd59127c
...
...
@@ -89,7 +89,8 @@ typedef struct {
#define ELF_HWCAP ((HWCAP_SPARC_FLUSH | HWCAP_SPARC_STBAR | \
HWCAP_SPARC_SWAP | HWCAP_SPARC_MULDIV | \
HWCAP_SPARC_V9) | \
((tlb_type == cheetah) ? HWCAP_SPARC_ULTRA3 : 0))
((tlb_type == cheetah || tlb_type == cheetah_plus) ? \
HWCAP_SPARC_ULTRA3 : 0))
/* This yields a string that ld.so will use to load implementation
specific libraries for optimization. This is more specific in
...
...
include/asm-sparc64/head.h
View file @
bd59127c
...
...
@@ -8,4 +8,7 @@
#define PTREGS_OFF (STACK_BIAS + REGWIN_SZ)
#define CHEETAH_ID 0x003e0014
#define CHEETAH_PLUS_ID 0x003e0015
#endif
/* !(_SPARC64_HEAD_H) */
include/asm-sparc64/ide.h
View file @
bd59127c
...
...
@@ -62,16 +62,25 @@ static __inline__ void ide_init_default_hwifs(void)
for
(
index
=
0
;
index
<
MAX_HWIFS
;
index
++
)
{
ide_init_hwif_ports
(
&
hw
,
ide_default_io_base
(
index
),
0
,
NULL
);
hw
.
irq
=
ide_default_irq
(
ide_default_io_base
(
index
));
ide_register_hw
(
&
hw
);
ide_register_hw
(
&
hw
,
NULL
);
}
#endif
}
#undef SUPPORT_SLOW_DATA_PORTS
#define SUPPORT_SLOW_DATA_PORTS 0
#undef HD_DATA
#define HD_DATA ((ide_ioreg_t)0)
#define ide_request_irq(irq,hand,flg,dev,id) request_irq((irq),(hand),(flg),(dev),(id))
#define ide_free_irq(irq,dev_id) free_irq((irq), (dev_id))
#define ide_check_region(from,extent) check_region((from), (extent))
#define ide_request_region(from,extent,name) request_region((from), (extent), (name))
#define ide_release_region(from,extent) release_region((from), (extent))
/*
* 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... */
...
...
include/asm-sparc64/smp.h
View file @
bd59127c
...
...
@@ -91,7 +91,7 @@ static inline int any_online_cpu(unsigned long mask)
extern
__inline__
int
hard_smp_processor_id
(
void
)
{
if
(
tlb_type
==
cheetah
)
{
if
(
tlb_type
==
cheetah
||
tlb_type
==
cheetah_plus
)
{
unsigned
long
safari_config
;
__asm__
__volatile__
(
"ldxa [%%g0] %1, %0"
:
"=r"
(
safari_config
)
...
...
include/asm-sparc64/spitfire.h
View file @
bd59127c
...
...
@@ -22,6 +22,7 @@
#define TSB_EXTENSION_P 0x0000000000000048
/* Ultra-III and later */
#define TSB_EXTENSION_S 0x0000000000000050
/* Ultra-III and later, D-TLB only */
#define TSB_EXTENSION_N 0x0000000000000058
/* Ultra-III and later */
#define TLB_TAG_ACCESS_EXT 0x0000000000000060
/* Ultra-III+ and later */
/* These registers only exist as one entity, and are accessed
* via ASI_DMMU only.
...
...
@@ -38,12 +39,13 @@
enum
ultra_tlb_layout
{
spitfire
=
0
,
cheetah
=
1
cheetah
=
1
,
cheetah_plus
=
2
,
};
extern
enum
ultra_tlb_layout
tlb_type
;
#define SPARC64_USE_STICK (tlb_type
== cheetah
)
#define SPARC64_USE_STICK (tlb_type
!= spitfire
)
#define CHEETAH_HIGHEST_LOCKED_TLBENT (16 - 1)
...
...
@@ -433,35 +435,35 @@ extern __inline__ void cheetah_put_litlb_data(int entry, unsigned long data)
"i"
(
ASI_ITLB_DATA_ACCESS
));
}
extern
__inline__
unsigned
long
cheetah_get_dtlb_data
(
int
entry
)
extern
__inline__
unsigned
long
cheetah_get_dtlb_data
(
int
entry
,
int
tlb
)
{
unsigned
long
data
;
__asm__
__volatile__
(
"ldxa [%1] %2, %%g0
\n\t
"
"ldxa [%1] %2, %0"
:
"=r"
(
data
)
:
"r"
((
2
<<
16
)
|
(
entry
<<
3
)),
"i"
(
ASI_DTLB_DATA_ACCESS
));
:
"r"
((
tlb
<<
16
)
|
(
entry
<<
3
)),
"i"
(
ASI_DTLB_DATA_ACCESS
));
return
data
;
}
extern
__inline__
unsigned
long
cheetah_get_dtlb_tag
(
int
entry
)
extern
__inline__
unsigned
long
cheetah_get_dtlb_tag
(
int
entry
,
int
tlb
)
{
unsigned
long
tag
;
__asm__
__volatile__
(
"ldxa [%1] %2, %0"
:
"=r"
(
tag
)
:
"r"
((
2
<<
16
)
|
(
entry
<<
3
)),
"i"
(
ASI_DTLB_TAG_READ
));
:
"r"
((
tlb
<<
16
)
|
(
entry
<<
3
)),
"i"
(
ASI_DTLB_TAG_READ
));
return
tag
;
}
extern
__inline__
void
cheetah_put_dtlb_data
(
int
entry
,
unsigned
long
data
)
extern
__inline__
void
cheetah_put_dtlb_data
(
int
entry
,
unsigned
long
data
,
int
tlb
)
{
__asm__
__volatile__
(
"stxa %0, [%1] %2
\n\t
"
"membar #Sync"
:
/* No outputs */
:
"r"
(
data
),
"r"
((
2
<<
16
)
|
(
entry
<<
3
)),
"r"
((
tlb
<<
16
)
|
(
entry
<<
3
)),
"i"
(
ASI_DTLB_DATA_ACCESS
));
}
...
...
include/asm-sparc64/unistd.h
View file @
bd59127c
...
...
@@ -171,7 +171,7 @@
#define __NR_poll 153
/* Common */
#define __NR_getdents64 154
/* Linux specific */
/* #define __NR_fcntl64 155 Linux sparc32 Specific */
/* #define __NR_getdirentries 156 SunOS Specific
*/
#define __NR_security 156
/* getdirentries under SunOS
*/
#define __NR_statfs 157
/* Common */
#define __NR_fstatfs 158
/* Common */
#define __NR_umount 159
/* Common */
...
...
include/linux/fb.h
View file @
bd59127c
...
...
@@ -409,6 +409,7 @@ extern void cfb_imageblit(struct fb_info *info, struct fb_image *image);
* Helper functions
*/
extern
void
do_install_cmap
(
int
con
,
struct
fb_info
*
info
);
extern
int
gen_update_var
(
int
con
,
struct
fb_info
*
info
);
extern
int
fb_blank
(
int
blank
,
struct
fb_info
*
info
);
extern
int
gen_switch
(
int
con
,
struct
fb_info
*
info
);
...
...
include/linux/sched.h
View file @
bd59127c
...
...
@@ -309,7 +309,7 @@ struct task_struct {
wait_queue_head_t
wait_chldexit
;
/* for wait4() */
struct
completion
*
vfork_done
;
/* for vfork() */
long
*
user_tid
;
/* for CLONE_CLEARTID */
int
*
user_tid
;
/* for CLONE_CLEARTID */
unsigned
long
rt_priority
;
unsigned
long
it_real_value
,
it_prof_value
,
it_virt_value
;
...
...
kernel/fork.c
View file @
bd59127c
...
...
@@ -377,7 +377,7 @@ void mm_release(void)
* We dont check the error code - if userspace has
* not set up a proper pointer then tough luck.
*/
put_user
(
0
UL
,
tsk
->
user_tid
);
put_user
(
0
,
tsk
->
user_tid
);
sys_futex
(
tsk
->
user_tid
,
FUTEX_WAKE
,
1
,
NULL
);
}
}
...
...
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