Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
L
linux
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
Kirill Smelkov
linux
Commits
95001ee9
Commit
95001ee9
authored
Sep 27, 2005
by
Linus Torvalds
Browse files
Options
Browse Files
Download
Plain Diff
Merge master.kernel.org:/pub/scm/linux/kernel/git/davem/sparc-2.6
parents
63906e41
0dc46106
Changes
28
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
28 changed files
with
908 additions
and
1192 deletions
+908
-1192
arch/sparc64/Kconfig.debug
arch/sparc64/Kconfig.debug
+8
-0
arch/sparc64/kernel/devices.c
arch/sparc64/kernel/devices.c
+22
-0
arch/sparc64/kernel/dtlb_backend.S
arch/sparc64/kernel/dtlb_backend.S
+1
-12
arch/sparc64/kernel/dtlb_base.S
arch/sparc64/kernel/dtlb_base.S
+4
-4
arch/sparc64/kernel/entry.S
arch/sparc64/kernel/entry.S
+18
-162
arch/sparc64/kernel/head.S
arch/sparc64/kernel/head.S
+160
-396
arch/sparc64/kernel/ktlb.S
arch/sparc64/kernel/ktlb.S
+198
-0
arch/sparc64/kernel/pci_schizo.c
arch/sparc64/kernel/pci_schizo.c
+1
-1
arch/sparc64/kernel/setup.c
arch/sparc64/kernel/setup.c
+9
-22
arch/sparc64/kernel/smp.c
arch/sparc64/kernel/smp.c
+21
-0
arch/sparc64/kernel/trampoline.S
arch/sparc64/kernel/trampoline.S
+8
-8
arch/sparc64/kernel/traps.c
arch/sparc64/kernel/traps.c
+27
-13
arch/sparc64/kernel/vmlinux.lds.S
arch/sparc64/kernel/vmlinux.lds.S
+1
-2
arch/sparc64/mm/init.c
arch/sparc64/mm/init.c
+308
-356
arch/sparc64/mm/ultra.S
arch/sparc64/mm/ultra.S
+22
-74
arch/sparc64/prom/Makefile
arch/sparc64/prom/Makefile
+1
-1
arch/sparc64/prom/console.c
arch/sparc64/prom/console.c
+1
-1
arch/sparc64/prom/devops.c
arch/sparc64/prom/devops.c
+1
-1
arch/sparc64/prom/init.c
arch/sparc64/prom/init.c
+1
-1
arch/sparc64/prom/map.S
arch/sparc64/prom/map.S
+0
-72
arch/sparc64/prom/misc.c
arch/sparc64/prom/misc.c
+16
-18
arch/sparc64/prom/p1275.c
arch/sparc64/prom/p1275.c
+1
-1
arch/sparc64/prom/printf.c
arch/sparc64/prom/printf.c
+1
-1
arch/sparc64/prom/tree.c
arch/sparc64/prom/tree.c
+26
-24
include/asm-sparc64/cacheflush.h
include/asm-sparc64/cacheflush.h
+5
-0
include/asm-sparc64/cpudata.h
include/asm-sparc64/cpudata.h
+10
-0
include/asm-sparc64/oplib.h
include/asm-sparc64/oplib.h
+33
-19
include/asm-sparc64/pgtable.h
include/asm-sparc64/pgtable.h
+4
-3
No files found.
arch/sparc64/Kconfig.debug
View file @
95001ee9
...
@@ -33,6 +33,14 @@ config DEBUG_BOOTMEM
...
@@ -33,6 +33,14 @@ config DEBUG_BOOTMEM
depends on DEBUG_KERNEL
depends on DEBUG_KERNEL
bool "Debug BOOTMEM initialization"
bool "Debug BOOTMEM initialization"
config DEBUG_PAGEALLOC
bool "Page alloc debugging"
depends on DEBUG_KERNEL && !SOFTWARE_SUSPEND
help
Unmap pages from the kernel linear mapping after free_pages().
This results in a large slowdown, but helps to find certain types
of memory corruptions.
config MCOUNT
config MCOUNT
bool
bool
depends on STACK_DEBUG
depends on STACK_DEBUG
...
...
arch/sparc64/kernel/devices.c
View file @
95001ee9
...
@@ -135,6 +135,28 @@ void __init device_scan(void)
...
@@ -135,6 +135,28 @@ void __init device_scan(void)
cpu_data
(
0
).
clock_tick
=
prom_getintdefault
(
cpu_node
,
cpu_data
(
0
).
clock_tick
=
prom_getintdefault
(
cpu_node
,
"clock-frequency"
,
"clock-frequency"
,
0
);
0
);
cpu_data
(
0
).
dcache_size
=
prom_getintdefault
(
cpu_node
,
"dcache-size"
,
16
*
1024
);
cpu_data
(
0
).
dcache_line_size
=
prom_getintdefault
(
cpu_node
,
"dcache-line-size"
,
32
);
cpu_data
(
0
).
icache_size
=
prom_getintdefault
(
cpu_node
,
"icache-size"
,
16
*
1024
);
cpu_data
(
0
).
icache_line_size
=
prom_getintdefault
(
cpu_node
,
"icache-line-size"
,
32
);
cpu_data
(
0
).
ecache_size
=
prom_getintdefault
(
cpu_node
,
"ecache-size"
,
4
*
1024
*
1024
);
cpu_data
(
0
).
ecache_line_size
=
prom_getintdefault
(
cpu_node
,
"ecache-line-size"
,
64
);
printk
(
"CPU[0]: Caches "
"D[sz(%d):line_sz(%d)] "
"I[sz(%d):line_sz(%d)] "
"E[sz(%d):line_sz(%d)]
\n
"
,
cpu_data
(
0
).
dcache_size
,
cpu_data
(
0
).
dcache_line_size
,
cpu_data
(
0
).
icache_size
,
cpu_data
(
0
).
icache_line_size
,
cpu_data
(
0
).
ecache_size
,
cpu_data
(
0
).
ecache_line_size
);
}
}
#endif
#endif
...
...
arch/sparc64/kernel/dtlb_backend.S
View file @
95001ee9
...
@@ -9,17 +9,7 @@
...
@@ -9,17 +9,7 @@
#include <asm/pgtable.h>
#include <asm/pgtable.h>
#include <asm/mmu.h>
#include <asm/mmu.h>
#if PAGE_SHIFT == 13
#define VALID_SZ_BITS (_PAGE_VALID | _PAGE_SZBITS)
#define SZ_BITS _PAGE_SZ8K
#elif PAGE_SHIFT == 16
#define SZ_BITS _PAGE_SZ64K
#elif PAGE_SHIFT == 19
#define SZ_BITS _PAGE_SZ512K
#elif PAGE_SHIFT == 22
#define SZ_BITS _PAGE_SZ4MB
#endif
#define VALID_SZ_BITS (_PAGE_VALID | SZ_BITS)
#define VPTE_BITS (_PAGE_CP | _PAGE_CV | _PAGE_P )
#define VPTE_BITS (_PAGE_CP | _PAGE_CV | _PAGE_P )
#define VPTE_SHIFT (PAGE_SHIFT - 3)
#define VPTE_SHIFT (PAGE_SHIFT - 3)
...
@@ -163,7 +153,6 @@ sparc64_vpte_continue:
...
@@ -163,7 +153,6 @@ sparc64_vpte_continue:
stxa
%
g4
,
[%
g1
+
%
g1
]
ASI_DMMU
!
Restore
previous
TAG_ACCESS
stxa
%
g4
,
[%
g1
+
%
g1
]
ASI_DMMU
!
Restore
previous
TAG_ACCESS
retry
!
Load
PTE
once
again
retry
!
Load
PTE
once
again
#undef SZ_BITS
#undef VALID_SZ_BITS
#undef VALID_SZ_BITS
#undef VPTE_SHIFT
#undef VPTE_SHIFT
#undef VPTE_BITS
#undef VPTE_BITS
...
...
arch/sparc64/kernel/dtlb_base.S
View file @
95001ee9
...
@@ -71,7 +71,7 @@
...
@@ -71,7 +71,7 @@
from_tl1_trap
:
from_tl1_trap
:
rdpr
%
tl
,
%
g5
!
For
TL
==
3
test
rdpr
%
tl
,
%
g5
!
For
TL
==
3
test
CREATE_VPTE_OFFSET1
(%
g4
,
%
g6
)
!
Create
VPTE
offset
CREATE_VPTE_OFFSET1
(%
g4
,
%
g6
)
!
Create
VPTE
offset
be
,
pn
%
xcc
,
3
f
!
Yep
,
special
processing
be
,
pn
%
xcc
,
kvmap
!
Yep
,
special
processing
CREATE_VPTE_OFFSET2
(%
g4
,
%
g6
)
!
Create
VPTE
offset
CREATE_VPTE_OFFSET2
(%
g4
,
%
g6
)
!
Create
VPTE
offset
cmp
%
g5
,
4
!
Last
trap
level
?
cmp
%
g5
,
4
!
Last
trap
level
?
be
,
pn
%
xcc
,
longpath
!
Yep
,
cannot
risk
VPTE
miss
be
,
pn
%
xcc
,
longpath
!
Yep
,
cannot
risk
VPTE
miss
...
@@ -83,9 +83,9 @@ from_tl1_trap:
...
@@ -83,9 +83,9 @@ from_tl1_trap:
nop
!
Delay
-
slot
nop
!
Delay
-
slot
9
:
stxa
%
g5
,
[%
g0
]
ASI_DTLB_DATA_IN
!
Reload
TLB
9
:
stxa
%
g5
,
[%
g0
]
ASI_DTLB_DATA_IN
!
Reload
TLB
retry
!
Trap
return
retry
!
Trap
return
3
:
brlz
,
pt
%
g4
,
9
b
!
Kernel
virtual
map
?
nop
xor
%
g2
,
%
g4
,
%
g5
!
Finish
bit
twiddles
nop
ba
,
a
,
pt
%
xcc
,
kvmap
!
Yep
,
go
check
for
obp
/
vmalloc
nop
/*
DTLB
**
ICACHE
line
3
:
winfixups
+
real_faults
*/
/*
DTLB
**
ICACHE
line
3
:
winfixups
+
real_faults
*/
longpath
:
longpath
:
...
...
arch/sparc64/kernel/entry.S
View file @
95001ee9
...
@@ -30,159 +30,6 @@
...
@@ -30,159 +30,6 @@
.
text
.
text
.
align
32
.
align
32
.
globl
sparc64_vpte_patchme1
.
globl
sparc64_vpte_patchme2
/*
*
On
a
second
level
vpte
miss
,
check
whether
the
original
fault
is
to
the
OBP
*
range
(
note
that
this
is
only
possible
for
instruction
miss
,
data
misses
to
*
obp
range
do
not
use
vpte
)
.
If
so
,
go
back
directly
to
the
faulting
address
.
*
This
is
because
we
want
to
read
the
tpc
,
otherwise
we
have
no
way
of
knowing
*
the
8
k
aligned
faulting
address
if
we
are
using
>
8
k
kernel
pagesize
.
This
*
also
ensures
no
vpte
range
addresses
are
dropped
into
tlb
while
obp
is
*
executing
(
see
inherit_locked_prom_mappings
()
rant
)
.
*/
sparc64_vpte_nucleus
:
/
*
Note
that
kvmap
below
has
verified
that
the
address
is
*
in
the
range
MODULES_VADDR
-->
VMALLOC_END
already
.
So
*
here
we
need
only
check
if
it
is
an
OBP
address
or
not
.
*/
sethi
%
hi
(
LOW_OBP_ADDRESS
),
%
g5
cmp
%
g4
,
%
g5
blu
,
pn
%
xcc
,
sparc64_vpte_patchme1
mov
0x1
,
%
g5
sllx
%
g5
,
32
,
%
g5
cmp
%
g4
,
%
g5
blu
,
pn
%
xcc
,
obp_iaddr_patch
nop
/
*
These
two
instructions
are
patched
by
paginig_init
()
.
*/
sparc64_vpte_patchme1
:
sethi
%
hi
(
0
),
%
g5
sparc64_vpte_patchme2
:
or
%
g5
,
%
lo
(
0
),
%
g5
/
*
With
kernel
PGD
in
%
g5
,
branch
back
into
dtlb_backend
.
*/
ba
,
pt
%
xcc
,
sparc64_kpte_continue
andn
%
g1
,
0x3
,
%
g1
/*
Finish
PMD
offset
adjustment
.
*/
vpte_noent
:
/
*
Restore
previous
TAG_ACCESS
,
%
g5
is
zero
,
and
we
will
*
skip
over
the
trap
instruction
so
that
the
top
level
*
TLB
miss
handler
will
thing
this
%
g5
value
is
just
an
*
invalid
PTE
,
thus
branching
to
full
fault
processing
.
*/
mov
TLB_SFSR
,
%
g1
stxa
%
g4
,
[%
g1
+
%
g1
]
ASI_DMMU
done
.
globl
obp_iaddr_patch
obp_iaddr_patch
:
/
*
These
two
instructions
patched
by
inherit_prom_mappings
()
.
*/
sethi
%
hi
(
0
),
%
g5
or
%
g5
,
%
lo
(
0
),
%
g5
/
*
Behave
as
if
we
are
at
TL0
.
*/
wrpr
%
g0
,
1
,
%
tl
rdpr
%
tpc
,
%
g4
/*
Find
original
faulting
iaddr
*/
srlx
%
g4
,
13
,
%
g4
/*
Throw
out
context
bits
*/
sllx
%
g4
,
13
,
%
g4
/*
g4
has
vpn
+
ctx0
now
*/
/
*
Restore
previous
TAG_ACCESS
.
*/
mov
TLB_SFSR
,
%
g1
stxa
%
g4
,
[%
g1
+
%
g1
]
ASI_IMMU
/
*
Get
PMD
offset
.
*/
srlx
%
g4
,
23
,
%
g6
and
%
g6
,
0x7ff
,
%
g6
sllx
%
g6
,
2
,
%
g6
/
*
Load
PMD
,
is
it
valid
?
*/
lduwa
[%
g5
+
%
g6
]
ASI_PHYS_USE_EC
,
%
g5
brz
,
pn
%
g5
,
longpath
sllx
%
g5
,
11
,
%
g5
/
*
Get
PTE
offset
.
*/
srlx
%
g4
,
13
,
%
g6
and
%
g6
,
0x3ff
,
%
g6
sllx
%
g6
,
3
,
%
g6
/
*
Load
PTE
.
*/
ldxa
[%
g5
+
%
g6
]
ASI_PHYS_USE_EC
,
%
g5
brgez
,
pn
%
g5
,
longpath
nop
/
*
TLB
load
and
return
from
trap
.
*/
stxa
%
g5
,
[%
g0
]
ASI_ITLB_DATA_IN
retry
.
globl
obp_daddr_patch
obp_daddr_patch
:
/
*
These
two
instructions
patched
by
inherit_prom_mappings
()
.
*/
sethi
%
hi
(
0
),
%
g5
or
%
g5
,
%
lo
(
0
),
%
g5
/
*
Get
PMD
offset
.
*/
srlx
%
g4
,
23
,
%
g6
and
%
g6
,
0x7ff
,
%
g6
sllx
%
g6
,
2
,
%
g6
/
*
Load
PMD
,
is
it
valid
?
*/
lduwa
[%
g5
+
%
g6
]
ASI_PHYS_USE_EC
,
%
g5
brz
,
pn
%
g5
,
longpath
sllx
%
g5
,
11
,
%
g5
/
*
Get
PTE
offset
.
*/
srlx
%
g4
,
13
,
%
g6
and
%
g6
,
0x3ff
,
%
g6
sllx
%
g6
,
3
,
%
g6
/
*
Load
PTE
.
*/
ldxa
[%
g5
+
%
g6
]
ASI_PHYS_USE_EC
,
%
g5
brgez
,
pn
%
g5
,
longpath
nop
/
*
TLB
load
and
return
from
trap
.
*/
stxa
%
g5
,
[%
g0
]
ASI_DTLB_DATA_IN
retry
/*
*
On
a
first
level
data
miss
,
check
whether
this
is
to
the
OBP
range
(
note
*
that
such
accesses
can
be
made
by
prom
,
as
well
as
by
kernel
using
*
prom_getproperty
on
"address"
),
and
if
so
,
do
not
use
vpte
access
...
*
rather
,
use
information
saved
during
inherit_prom_mappings
()
using
8
k
*
pagesize
.
*/
.
align
32
kvmap
:
sethi
%
hi
(
MODULES_VADDR
),
%
g5
cmp
%
g4
,
%
g5
blu
,
pn
%
xcc
,
longpath
mov
(
VMALLOC_END
>>
24
),
%
g5
sllx
%
g5
,
24
,
%
g5
cmp
%
g4
,
%
g5
bgeu
,
pn
%
xcc
,
longpath
nop
kvmap_check_obp
:
sethi
%
hi
(
LOW_OBP_ADDRESS
),
%
g5
cmp
%
g4
,
%
g5
blu
,
pn
%
xcc
,
kvmap_vmalloc_addr
mov
0x1
,
%
g5
sllx
%
g5
,
32
,
%
g5
cmp
%
g4
,
%
g5
blu
,
pn
%
xcc
,
obp_daddr_patch
nop
kvmap_vmalloc_addr
:
/
*
If
we
get
here
,
a
vmalloc
addr
was
accessed
,
load
kernel
VPTE
.
*/
ldxa
[%
g3
+
%
g6
]
ASI_N
,
%
g5
brgez
,
pn
%
g5
,
longpath
nop
/
*
PTE
is
valid
,
load
into
TLB
and
return
from
trap
.
*/
stxa
%
g5
,
[%
g0
]
ASI_DTLB_DATA_IN
!
Reload
TLB
retry
/
*
This
is
trivial
with
the
new
code
...
*/
/
*
This
is
trivial
with
the
new
code
...
*/
.
globl
do_fpdis
.
globl
do_fpdis
do_fpdis
:
do_fpdis
:
...
@@ -525,14 +372,13 @@ cheetah_plus_patch_fpdis:
...
@@ -525,14 +372,13 @@ cheetah_plus_patch_fpdis:
*
*
*
DATA
0
:
[
low
32
-
bits
]
Address
of
function
to
call
,
jmp
to
this
*
DATA
0
:
[
low
32
-
bits
]
Address
of
function
to
call
,
jmp
to
this
*
[
high
32
-
bits
]
MMU
Context
Argument
0
,
place
in
%
g5
*
[
high
32
-
bits
]
MMU
Context
Argument
0
,
place
in
%
g5
*
DATA
1
:
Address
Argument
1
,
place
in
%
g
6
*
DATA
1
:
Address
Argument
1
,
place
in
%
g
1
*
DATA
2
:
Address
Argument
2
,
place
in
%
g7
*
DATA
2
:
Address
Argument
2
,
place
in
%
g7
*
*
*
With
this
method
we
can
do
most
of
the
cross
-
call
tlb
/
cache
*
With
this
method
we
can
do
most
of
the
cross
-
call
tlb
/
cache
*
flushing
very
quickly
.
*
flushing
very
quickly
.
*
*
*
Current
CPU
's IRQ worklist table is locked into %g1,
*
Current
CPU
's IRQ worklist table is locked into %g6, don'
t
touch
.
*
don
't touch.
*/
*/
.
text
.
text
.
align
32
.
align
32
...
@@ -1006,13 +852,14 @@ cheetah_plus_dcpe_trap_vector:
...
@@ -1006,13 +852,14 @@ cheetah_plus_dcpe_trap_vector:
nop
nop
do_cheetah_plus_data_parity
:
do_cheetah_plus_data_parity
:
ba
,
pt
%
xcc
,
etrap
rdpr
%
pil
,
%
g2
wrpr
%
g0
,
15
,
%
pil
ba
,
pt
%
xcc
,
etrap_irq
rd
%
pc
,
%
g7
rd
%
pc
,
%
g7
mov
0x0
,
%
o0
mov
0x0
,
%
o0
call
cheetah_plus_parity_error
call
cheetah_plus_parity_error
add
%
sp
,
PTREGS_OFF
,
%
o1
add
%
sp
,
PTREGS_OFF
,
%
o1
ba
,
pt
%
xcc
,
rtrap
ba
,
a
,
pt
%
xcc
,
rtrap_irq
clr
%
l6
cheetah_plus_dcpe_trap_vector_tl1
:
cheetah_plus_dcpe_trap_vector_tl1
:
membar
#
Sync
membar
#
Sync
...
@@ -1036,13 +883,14 @@ cheetah_plus_icpe_trap_vector:
...
@@ -1036,13 +883,14 @@ cheetah_plus_icpe_trap_vector:
nop
nop
do_cheetah_plus_insn_parity
:
do_cheetah_plus_insn_parity
:
ba
,
pt
%
xcc
,
etrap
rdpr
%
pil
,
%
g2
wrpr
%
g0
,
15
,
%
pil
ba
,
pt
%
xcc
,
etrap_irq
rd
%
pc
,
%
g7
rd
%
pc
,
%
g7
mov
0x1
,
%
o0
mov
0x1
,
%
o0
call
cheetah_plus_parity_error
call
cheetah_plus_parity_error
add
%
sp
,
PTREGS_OFF
,
%
o1
add
%
sp
,
PTREGS_OFF
,
%
o1
ba
,
pt
%
xcc
,
rtrap
ba
,
a
,
pt
%
xcc
,
rtrap_irq
clr
%
l6
cheetah_plus_icpe_trap_vector_tl1
:
cheetah_plus_icpe_trap_vector_tl1
:
membar
#
Sync
membar
#
Sync
...
@@ -1075,6 +923,10 @@ do_dcpe_tl1:
...
@@ -1075,6 +923,10 @@ do_dcpe_tl1:
nop
nop
wrpr
%
g1
,
%
tl
!
Restore
original
trap
level
wrpr
%
g1
,
%
tl
!
Restore
original
trap
level
do_dcpe_tl1_nonfatal
:
/
*
Ok
we
may
use
interrupt
globals
safely
.
*/
do_dcpe_tl1_nonfatal
:
/
*
Ok
we
may
use
interrupt
globals
safely
.
*/
sethi
%
hi
(
dcache_parity_tl1_occurred
),
%
g2
lduw
[%
g2
+
%
lo
(
dcache_parity_tl1_occurred
)],
%
g1
add
%
g1
,
1
,
%
g1
stw
%
g1
,
[%
g2
+
%
lo
(
dcache_parity_tl1_occurred
)]
/
*
Reset
D
-
cache
parity
*/
/
*
Reset
D
-
cache
parity
*/
sethi
%
hi
(
1
<<
16
),
%
g1
!
D
-
cache
size
sethi
%
hi
(
1
<<
16
),
%
g1
!
D
-
cache
size
mov
(
1
<<
5
),
%
g2
!
D
-
cache
line
size
mov
(
1
<<
5
),
%
g2
!
D
-
cache
line
size
...
@@ -1121,6 +973,10 @@ do_icpe_tl1:
...
@@ -1121,6 +973,10 @@ do_icpe_tl1:
nop
nop
wrpr
%
g1
,
%
tl
!
Restore
original
trap
level
wrpr
%
g1
,
%
tl
!
Restore
original
trap
level
do_icpe_tl1_nonfatal
:
/
*
Ok
we
may
use
interrupt
globals
safely
.
*/
do_icpe_tl1_nonfatal
:
/
*
Ok
we
may
use
interrupt
globals
safely
.
*/
sethi
%
hi
(
icache_parity_tl1_occurred
),
%
g2
lduw
[%
g2
+
%
lo
(
icache_parity_tl1_occurred
)],
%
g1
add
%
g1
,
1
,
%
g1
stw
%
g1
,
[%
g2
+
%
lo
(
icache_parity_tl1_occurred
)]
/
*
Flush
I
-
cache
*/
/
*
Flush
I
-
cache
*/
sethi
%
hi
(
1
<<
15
),
%
g1
!
I
-
cache
size
sethi
%
hi
(
1
<<
15
),
%
g1
!
I
-
cache
size
mov
(
1
<<
5
),
%
g2
!
I
-
cache
line
size
mov
(
1
<<
5
),
%
g2
!
I
-
cache
line
size
...
...
arch/sparc64/kernel/head.S
View file @
95001ee9
This diff is collapsed.
Click to expand it.
arch/sparc64/kernel/ktlb.S
0 → 100644
View file @
95001ee9
/*
arch
/
sparc64
/
kernel
/
ktlb.S
:
Kernel
mapping
TLB
miss
handling
.
*
*
Copyright
(
C
)
1995
,
1997
,
2005
David
S
.
Miller
<
davem
@
davemloft
.
net
>
*
Copyright
(
C
)
1996
Eddie
C
.
Dost
(
ecd
@
brainaid
.
de
)
*
Copyright
(
C
)
1996
Miguel
de
Icaza
(
miguel
@
nuclecu
.
unam
.
mx
)
*
Copyright
(
C
)
1996
,
98
,
99
Jakub
Jelinek
(
jj
@
sunsite
.
mff
.
cuni
.
cz
)
*/
#include <linux/config.h>
#include <asm/head.h>
#include <asm/asi.h>
#include <asm/page.h>
#include <asm/pgtable.h>
.
text
.
align
32
/*
*
On
a
second
level
vpte
miss
,
check
whether
the
original
fault
is
to
the
OBP
*
range
(
note
that
this
is
only
possible
for
instruction
miss
,
data
misses
to
*
obp
range
do
not
use
vpte
)
.
If
so
,
go
back
directly
to
the
faulting
address
.
*
This
is
because
we
want
to
read
the
tpc
,
otherwise
we
have
no
way
of
knowing
*
the
8
k
aligned
faulting
address
if
we
are
using
>
8
k
kernel
pagesize
.
This
*
also
ensures
no
vpte
range
addresses
are
dropped
into
tlb
while
obp
is
*
executing
(
see
inherit_locked_prom_mappings
()
rant
)
.
*/
sparc64_vpte_nucleus
:
/
*
Note
that
kvmap
below
has
verified
that
the
address
is
*
in
the
range
MODULES_VADDR
-->
VMALLOC_END
already
.
So
*
here
we
need
only
check
if
it
is
an
OBP
address
or
not
.
*/
sethi
%
hi
(
LOW_OBP_ADDRESS
),
%
g5
cmp
%
g4
,
%
g5
blu
,
pn
%
xcc
,
kern_vpte
mov
0x1
,
%
g5
sllx
%
g5
,
32
,
%
g5
cmp
%
g4
,
%
g5
blu
,
pn
%
xcc
,
vpte_insn_obp
nop
/
*
These
two
instructions
are
patched
by
paginig_init
()
.
*/
kern_vpte
:
sethi
%
hi
(
swapper_pgd_zero
),
%
g5
lduw
[%
g5
+
%
lo
(
swapper_pgd_zero
)],
%
g5
/
*
With
kernel
PGD
in
%
g5
,
branch
back
into
dtlb_backend
.
*/
ba
,
pt
%
xcc
,
sparc64_kpte_continue
andn
%
g1
,
0x3
,
%
g1
/*
Finish
PMD
offset
adjustment
.
*/
vpte_noent
:
/
*
Restore
previous
TAG_ACCESS
,
%
g5
is
zero
,
and
we
will
*
skip
over
the
trap
instruction
so
that
the
top
level
*
TLB
miss
handler
will
thing
this
%
g5
value
is
just
an
*
invalid
PTE
,
thus
branching
to
full
fault
processing
.
*/
mov
TLB_SFSR
,
%
g1
stxa
%
g4
,
[%
g1
+
%
g1
]
ASI_DMMU
done
vpte_insn_obp
:
sethi
%
hi
(
prom_pmd_phys
),
%
g5
ldx
[%
g5
+
%
lo
(
prom_pmd_phys
)],
%
g5
/
*
Behave
as
if
we
are
at
TL0
.
*/
wrpr
%
g0
,
1
,
%
tl
rdpr
%
tpc
,
%
g4
/*
Find
original
faulting
iaddr
*/
srlx
%
g4
,
13
,
%
g4
/*
Throw
out
context
bits
*/
sllx
%
g4
,
13
,
%
g4
/*
g4
has
vpn
+
ctx0
now
*/
/
*
Restore
previous
TAG_ACCESS
.
*/
mov
TLB_SFSR
,
%
g1
stxa
%
g4
,
[%
g1
+
%
g1
]
ASI_IMMU
/
*
Get
PMD
offset
.
*/
srlx
%
g4
,
23
,
%
g6
and
%
g6
,
0x7ff
,
%
g6
sllx
%
g6
,
2
,
%
g6
/
*
Load
PMD
,
is
it
valid
?
*/
lduwa
[%
g5
+
%
g6
]
ASI_PHYS_USE_EC
,
%
g5
brz
,
pn
%
g5
,
longpath
sllx
%
g5
,
11
,
%
g5
/
*
Get
PTE
offset
.
*/
srlx
%
g4
,
13
,
%
g6
and
%
g6
,
0x3ff
,
%
g6
sllx
%
g6
,
3
,
%
g6
/
*
Load
PTE
.
*/
ldxa
[%
g5
+
%
g6
]
ASI_PHYS_USE_EC
,
%
g5
brgez
,
pn
%
g5
,
longpath
nop
/
*
TLB
load
and
return
from
trap
.
*/
stxa
%
g5
,
[%
g0
]
ASI_ITLB_DATA_IN
retry
kvmap_do_obp
:
sethi
%
hi
(
prom_pmd_phys
),
%
g5
ldx
[%
g5
+
%
lo
(
prom_pmd_phys
)],
%
g5
/
*
Get
PMD
offset
.
*/
srlx
%
g4
,
23
,
%
g6
and
%
g6
,
0x7ff
,
%
g6
sllx
%
g6
,
2
,
%
g6
/
*
Load
PMD
,
is
it
valid
?
*/
lduwa
[%
g5
+
%
g6
]
ASI_PHYS_USE_EC
,
%
g5
brz
,
pn
%
g5
,
longpath
sllx
%
g5
,
11
,
%
g5
/
*
Get
PTE
offset
.
*/
srlx
%
g4
,
13
,
%
g6
and
%
g6
,
0x3ff
,
%
g6
sllx
%
g6
,
3
,
%
g6
/
*
Load
PTE
.
*/
ldxa
[%
g5
+
%
g6
]
ASI_PHYS_USE_EC
,
%
g5
brgez
,
pn
%
g5
,
longpath
nop
/
*
TLB
load
and
return
from
trap
.
*/
stxa
%
g5
,
[%
g0
]
ASI_DTLB_DATA_IN
retry
/*
*
On
a
first
level
data
miss
,
check
whether
this
is
to
the
OBP
range
(
note
*
that
such
accesses
can
be
made
by
prom
,
as
well
as
by
kernel
using
*
prom_getproperty
on
"address"
),
and
if
so
,
do
not
use
vpte
access
...
*
rather
,
use
information
saved
during
inherit_prom_mappings
()
using
8
k
*
pagesize
.
*/
.
align
32
kvmap
:
brgez
,
pn
%
g4
,
kvmap_nonlinear
nop
#ifdef CONFIG_DEBUG_PAGEALLOC
.
globl
kvmap_linear_patch
kvmap_linear_patch
:
#endif
ba
,
pt
%
xcc
,
kvmap_load
xor
%
g2
,
%
g4
,
%
g5
#ifdef CONFIG_DEBUG_PAGEALLOC
sethi
%
hi
(
swapper_pg_dir
),
%
g5
or
%
g5
,
%
lo
(
swapper_pg_dir
),
%
g5
sllx
%
g4
,
64
-
(
PGDIR_SHIFT
+
PGDIR_BITS
),
%
g6
srlx
%
g6
,
64
-
PAGE_SHIFT
,
%
g6
andn
%
g6
,
0x3
,
%
g6
lduw
[%
g5
+
%
g6
],
%
g5
brz
,
pn
%
g5
,
longpath
sllx
%
g4
,
64
-
(
PMD_SHIFT
+
PMD_BITS
),
%
g6
srlx
%
g6
,
64
-
PAGE_SHIFT
,
%
g6
sllx
%
g5
,
11
,
%
g5
andn
%
g6
,
0x3
,
%
g6
lduwa
[%
g5
+
%
g6
]
ASI_PHYS_USE_EC
,
%
g5
brz
,
pn
%
g5
,
longpath
sllx
%
g4
,
64
-
PMD_SHIFT
,
%
g6
srlx
%
g6
,
64
-
PAGE_SHIFT
,
%
g6
sllx
%
g5
,
11
,
%
g5
andn
%
g6
,
0x7
,
%
g6
ldxa
[%
g5
+
%
g6
]
ASI_PHYS_USE_EC
,
%
g5
brz
,
pn
%
g5
,
longpath
nop
ba
,
a
,
pt
%
xcc
,
kvmap_load
#endif
kvmap_nonlinear
:
sethi
%
hi
(
MODULES_VADDR
),
%
g5
cmp
%
g4
,
%
g5
blu
,
pn
%
xcc
,
longpath
mov
(
VMALLOC_END
>>
24
),
%
g5
sllx
%
g5
,
24
,
%
g5
cmp
%
g4
,
%
g5
bgeu
,
pn
%
xcc
,
longpath
nop
kvmap_check_obp
:
sethi
%
hi
(
LOW_OBP_ADDRESS
),
%
g5
cmp
%
g4
,
%
g5
blu
,
pn
%
xcc
,
kvmap_vmalloc_addr
mov
0x1
,
%
g5
sllx
%
g5
,
32
,
%
g5
cmp
%
g4
,
%
g5
blu
,
pn
%
xcc
,
kvmap_do_obp
nop
kvmap_vmalloc_addr
:
/
*
If
we
get
here
,
a
vmalloc
addr
was
accessed
,
load
kernel
VPTE
.
*/
ldxa
[%
g3
+
%
g6
]
ASI_N
,
%
g5
brgez
,
pn
%
g5
,
longpath
nop
kvmap_load
:
/
*
PTE
is
valid
,
load
into
TLB
and
return
from
trap
.
*/
stxa
%
g5
,
[%
g0
]
ASI_DTLB_DATA_IN
!
Reload
TLB
retry
arch/sparc64/kernel/pci_schizo.c
View file @
95001ee9
...
@@ -330,7 +330,7 @@ static int schizo_ino_to_pil(struct pci_dev *pdev, unsigned int ino)
...
@@ -330,7 +330,7 @@ static int schizo_ino_to_pil(struct pci_dev *pdev, unsigned int ino)
static
void
tomatillo_wsync_handler
(
struct
ino_bucket
*
bucket
,
void
*
_arg1
,
void
*
_arg2
)
static
void
tomatillo_wsync_handler
(
struct
ino_bucket
*
bucket
,
void
*
_arg1
,
void
*
_arg2
)
{
{
unsigned
long
sync_reg
=
(
unsigned
long
)
_arg2
;
unsigned
long
sync_reg
=
(
unsigned
long
)
_arg2
;
u64
mask
=
1
<<
(
__irq_ino
(
__irq
(
bucket
))
&
IMAP_INO
);
u64
mask
=
1
UL
<<
(
__irq_ino
(
__irq
(
bucket
))
&
IMAP_INO
);
u64
val
;
u64
val
;
int
limit
;
int
limit
;
...
...
arch/sparc64/kernel/setup.c
View file @
95001ee9
...
@@ -496,7 +496,6 @@ extern void paging_init(void);
...
@@ -496,7 +496,6 @@ extern void paging_init(void);
void
__init
setup_arch
(
char
**
cmdline_p
)
void
__init
setup_arch
(
char
**
cmdline_p
)
{
{
unsigned
long
highest_paddr
;
int
i
;
int
i
;
/* Initialize PROM console and command line. */
/* Initialize PROM console and command line. */
...
@@ -519,11 +518,7 @@ void __init setup_arch(char **cmdline_p)
...
@@ -519,11 +518,7 @@ void __init setup_arch(char **cmdline_p)
idprom_init
();
idprom_init
();
(
void
)
prom_probe_memory
();
(
void
)
prom_probe_memory
();
/* In paging_init() we tip off this value to see if we need
* to change init_mm.pgd to point to the real alias mapping.
*/
phys_base
=
0xffffffffffffffffUL
;
phys_base
=
0xffffffffffffffffUL
;
highest_paddr
=
0UL
;
for
(
i
=
0
;
sp_banks
[
i
].
num_bytes
!=
0
;
i
++
)
{
for
(
i
=
0
;
sp_banks
[
i
].
num_bytes
!=
0
;
i
++
)
{
unsigned
long
top
;
unsigned
long
top
;
...
@@ -531,25 +526,10 @@ void __init setup_arch(char **cmdline_p)
...
@@ -531,25 +526,10 @@ void __init setup_arch(char **cmdline_p)
phys_base
=
sp_banks
[
i
].
base_addr
;
phys_base
=
sp_banks
[
i
].
base_addr
;
top
=
sp_banks
[
i
].
base_addr
+
top
=
sp_banks
[
i
].
base_addr
+
sp_banks
[
i
].
num_bytes
;
sp_banks
[
i
].
num_bytes
;
if
(
highest_paddr
<
top
)
highest_paddr
=
top
;
}
}
pfn_base
=
phys_base
>>
PAGE_SHIFT
;
pfn_base
=
phys_base
>>
PAGE_SHIFT
;
switch
(
tlb_type
)
{
kern_base
=
(
prom_boot_mapping_phys_low
>>
22UL
)
<<
22UL
;
default:
case
spitfire
:
kern_base
=
spitfire_get_itlb_data
(
sparc64_highest_locked_tlbent
());
kern_base
&=
_PAGE_PADDR_SF
;
break
;
case
cheetah
:
case
cheetah_plus
:
kern_base
=
cheetah_get_litlb_data
(
sparc64_highest_locked_tlbent
());
kern_base
&=
_PAGE_PADDR
;
break
;
};
kern_size
=
(
unsigned
long
)
&
_end
-
(
unsigned
long
)
KERNBASE
;
kern_size
=
(
unsigned
long
)
&
_end
-
(
unsigned
long
)
KERNBASE
;
if
(
!
root_flags
)
if
(
!
root_flags
)
...
@@ -625,6 +605,9 @@ extern void smp_info(struct seq_file *);
...
@@ -625,6 +605,9 @@ extern void smp_info(struct seq_file *);
extern
void
smp_bogo
(
struct
seq_file
*
);
extern
void
smp_bogo
(
struct
seq_file
*
);
extern
void
mmu_info
(
struct
seq_file
*
);
extern
void
mmu_info
(
struct
seq_file
*
);
unsigned
int
dcache_parity_tl1_occurred
;
unsigned
int
icache_parity_tl1_occurred
;
static
int
show_cpuinfo
(
struct
seq_file
*
m
,
void
*
__unused
)
static
int
show_cpuinfo
(
struct
seq_file
*
m
,
void
*
__unused
)
{
{
seq_printf
(
m
,
seq_printf
(
m
,
...
@@ -635,6 +618,8 @@ static int show_cpuinfo(struct seq_file *m, void *__unused)
...
@@ -635,6 +618,8 @@ static int show_cpuinfo(struct seq_file *m, void *__unused)
"type
\t\t
: sun4u
\n
"
"type
\t\t
: sun4u
\n
"
"ncpus probed
\t
: %ld
\n
"
"ncpus probed
\t
: %ld
\n
"
"ncpus active
\t
: %ld
\n
"
"ncpus active
\t
: %ld
\n
"
"D$ parity tl1
\t
: %u
\n
"
"I$ parity tl1
\t
: %u
\n
"
#ifndef CONFIG_SMP
#ifndef CONFIG_SMP
"Cpu0Bogo
\t
: %lu.%02lu
\n
"
"Cpu0Bogo
\t
: %lu.%02lu
\n
"
"Cpu0ClkTck
\t
: %016lx
\n
"
"Cpu0ClkTck
\t
: %016lx
\n
"
...
@@ -647,7 +632,9 @@ static int show_cpuinfo(struct seq_file *m, void *__unused)
...
@@ -647,7 +632,9 @@ static int show_cpuinfo(struct seq_file *m, void *__unused)
(
prom_prev
>>
8
)
&
0xff
,
(
prom_prev
>>
8
)
&
0xff
,
prom_prev
&
0xff
,
prom_prev
&
0xff
,
(
long
)
num_possible_cpus
(),
(
long
)
num_possible_cpus
(),
(
long
)
num_online_cpus
()
(
long
)
num_online_cpus
(),
dcache_parity_tl1_occurred
,
icache_parity_tl1_occurred
#ifndef CONFIG_SMP
#ifndef CONFIG_SMP
,
cpu_data
(
0
).
udelay_val
/
(
500000
/
HZ
),
,
cpu_data
(
0
).
udelay_val
/
(
500000
/
HZ
),
(
cpu_data
(
0
).
udelay_val
/
(
5000
/
HZ
))
%
100
,
(
cpu_data
(
0
).
udelay_val
/
(
5000
/
HZ
))
%
100
,
...
...
arch/sparc64/kernel/smp.c
View file @
95001ee9
...
@@ -93,6 +93,27 @@ void __init smp_store_cpu_info(int id)
...
@@ -93,6 +93,27 @@ void __init smp_store_cpu_info(int id)
cpu_data
(
id
).
pte_cache
[
1
]
=
NULL
;
cpu_data
(
id
).
pte_cache
[
1
]
=
NULL
;
cpu_data
(
id
).
pgd_cache
=
NULL
;
cpu_data
(
id
).
pgd_cache
=
NULL
;
cpu_data
(
id
).
idle_volume
=
1
;
cpu_data
(
id
).
idle_volume
=
1
;
cpu_data
(
id
).
dcache_size
=
prom_getintdefault
(
cpu_node
,
"dcache-size"
,
16
*
1024
);
cpu_data
(
id
).
dcache_line_size
=
prom_getintdefault
(
cpu_node
,
"dcache-line-size"
,
32
);
cpu_data
(
id
).
icache_size
=
prom_getintdefault
(
cpu_node
,
"icache-size"
,
16
*
1024
);
cpu_data
(
id
).
icache_line_size
=
prom_getintdefault
(
cpu_node
,
"icache-line-size"
,
32
);
cpu_data
(
id
).
ecache_size
=
prom_getintdefault
(
cpu_node
,
"ecache-size"
,
4
*
1024
*
1024
);
cpu_data
(
id
).
ecache_line_size
=
prom_getintdefault
(
cpu_node
,
"ecache-line-size"
,
64
);
printk
(
"CPU[%d]: Caches "
"D[sz(%d):line_sz(%d)] "
"I[sz(%d):line_sz(%d)] "
"E[sz(%d):line_sz(%d)]
\n
"
,
id
,
cpu_data
(
id
).
dcache_size
,
cpu_data
(
id
).
dcache_line_size
,
cpu_data
(
id
).
icache_size
,
cpu_data
(
id
).
icache_line_size
,
cpu_data
(
id
).
ecache_size
,
cpu_data
(
id
).
ecache_line_size
);
}
}
static
void
smp_setup_percpu_timer
(
void
);
static
void
smp_setup_percpu_timer
(
void
);
...
...
arch/sparc64/kernel/trampoline.S
View file @
95001ee9
...
@@ -119,8 +119,8 @@ startup_continue:
...
@@ -119,8 +119,8 @@ startup_continue:
sethi
%
hi
(
itlb_load
),
%
g2
sethi
%
hi
(
itlb_load
),
%
g2
or
%
g2
,
%
lo
(
itlb_load
),
%
g2
or
%
g2
,
%
lo
(
itlb_load
),
%
g2
stx
%
g2
,
[%
sp
+
2047
+
128
+
0x18
]
stx
%
g2
,
[%
sp
+
2047
+
128
+
0x18
]
sethi
%
hi
(
mmu_ihandle_cache
),
%
g2
sethi
%
hi
(
prom_
mmu_ihandle_cache
),
%
g2
lduw
[%
g2
+
%
lo
(
mmu_ihandle_cache
)],
%
g2
lduw
[%
g2
+
%
lo
(
prom_
mmu_ihandle_cache
)],
%
g2
stx
%
g2
,
[%
sp
+
2047
+
128
+
0x20
]
stx
%
g2
,
[%
sp
+
2047
+
128
+
0x20
]
sethi
%
hi
(
KERNBASE
),
%
g2
sethi
%
hi
(
KERNBASE
),
%
g2
stx
%
g2
,
[%
sp
+
2047
+
128
+
0x28
]
stx
%
g2
,
[%
sp
+
2047
+
128
+
0x28
]
...
@@ -156,8 +156,8 @@ startup_continue:
...
@@ -156,8 +156,8 @@ startup_continue:
sethi
%
hi
(
itlb_load
),
%
g2
sethi
%
hi
(
itlb_load
),
%
g2
or
%
g2
,
%
lo
(
itlb_load
),
%
g2
or
%
g2
,
%
lo
(
itlb_load
),
%
g2
stx
%
g2
,
[%
sp
+
2047
+
128
+
0x18
]
stx
%
g2
,
[%
sp
+
2047
+
128
+
0x18
]
sethi
%
hi
(
mmu_ihandle_cache
),
%
g2
sethi
%
hi
(
prom_
mmu_ihandle_cache
),
%
g2
lduw
[%
g2
+
%
lo
(
mmu_ihandle_cache
)],
%
g2
lduw
[%
g2
+
%
lo
(
prom_
mmu_ihandle_cache
)],
%
g2
stx
%
g2
,
[%
sp
+
2047
+
128
+
0x20
]
stx
%
g2
,
[%
sp
+
2047
+
128
+
0x20
]
sethi
%
hi
(
KERNBASE
+
0x400000
),
%
g2
sethi
%
hi
(
KERNBASE
+
0x400000
),
%
g2
stx
%
g2
,
[%
sp
+
2047
+
128
+
0x28
]
stx
%
g2
,
[%
sp
+
2047
+
128
+
0x28
]
...
@@ -190,8 +190,8 @@ do_dtlb:
...
@@ -190,8 +190,8 @@ do_dtlb:
sethi
%
hi
(
dtlb_load
),
%
g2
sethi
%
hi
(
dtlb_load
),
%
g2
or
%
g2
,
%
lo
(
dtlb_load
),
%
g2
or
%
g2
,
%
lo
(
dtlb_load
),
%
g2
stx
%
g2
,
[%
sp
+
2047
+
128
+
0x18
]
stx
%
g2
,
[%
sp
+
2047
+
128
+
0x18
]
sethi
%
hi
(
mmu_ihandle_cache
),
%
g2
sethi
%
hi
(
prom_
mmu_ihandle_cache
),
%
g2
lduw
[%
g2
+
%
lo
(
mmu_ihandle_cache
)],
%
g2
lduw
[%
g2
+
%
lo
(
prom_
mmu_ihandle_cache
)],
%
g2
stx
%
g2
,
[%
sp
+
2047
+
128
+
0x20
]
stx
%
g2
,
[%
sp
+
2047
+
128
+
0x20
]
sethi
%
hi
(
KERNBASE
),
%
g2
sethi
%
hi
(
KERNBASE
),
%
g2
stx
%
g2
,
[%
sp
+
2047
+
128
+
0x28
]
stx
%
g2
,
[%
sp
+
2047
+
128
+
0x28
]
...
@@ -228,8 +228,8 @@ do_dtlb:
...
@@ -228,8 +228,8 @@ do_dtlb:
sethi
%
hi
(
dtlb_load
),
%
g2
sethi
%
hi
(
dtlb_load
),
%
g2
or
%
g2
,
%
lo
(
dtlb_load
),
%
g2
or
%
g2
,
%
lo
(
dtlb_load
),
%
g2
stx
%
g2
,
[%
sp
+
2047
+
128
+
0x18
]
stx
%
g2
,
[%
sp
+
2047
+
128
+
0x18
]
sethi
%
hi
(
mmu_ihandle_cache
),
%
g2
sethi
%
hi
(
prom_
mmu_ihandle_cache
),
%
g2
lduw
[%
g2
+
%
lo
(
mmu_ihandle_cache
)],
%
g2
lduw
[%
g2
+
%
lo
(
prom_
mmu_ihandle_cache
)],
%
g2
stx
%
g2
,
[%
sp
+
2047
+
128
+
0x20
]
stx
%
g2
,
[%
sp
+
2047
+
128
+
0x20
]
sethi
%
hi
(
KERNBASE
+
0x400000
),
%
g2
sethi
%
hi
(
KERNBASE
+
0x400000
),
%
g2
stx
%
g2
,
[%
sp
+
2047
+
128
+
0x28
]
stx
%
g2
,
[%
sp
+
2047
+
128
+
0x28
]
...
...
arch/sparc64/kernel/traps.c
View file @
95001ee9
...
@@ -869,14 +869,19 @@ static void cheetah_flush_ecache_line(unsigned long physaddr)
...
@@ -869,14 +869,19 @@ static void cheetah_flush_ecache_line(unsigned long physaddr)
*/
*/
static
void
__cheetah_flush_icache
(
void
)
static
void
__cheetah_flush_icache
(
void
)
{
{
unsigned
long
i
;
unsigned
int
icache_size
,
icache_line_size
;
unsigned
long
addr
;
icache_size
=
local_cpu_data
().
icache_size
;
icache_line_size
=
local_cpu_data
().
icache_line_size
;
/* Clear the valid bits in all the tags. */
/* Clear the valid bits in all the tags. */
for
(
i
=
0
;
i
<
(
1
<<
15
);
i
+=
(
1
<<
5
)
)
{
for
(
addr
=
0
;
addr
<
icache_size
;
addr
+=
icache_line_size
)
{
__asm__
__volatile__
(
"stxa %%g0, [%0] %1
\n\t
"
__asm__
__volatile__
(
"stxa %%g0, [%0] %1
\n\t
"
"membar #Sync"
"membar #Sync"
:
/* no outputs */
:
/* no outputs */
:
"r"
(
i
|
(
2
<<
3
)),
"i"
(
ASI_IC_TAG
));
:
"r"
(
addr
|
(
2
<<
3
)),
"i"
(
ASI_IC_TAG
));
}
}
}
}
...
@@ -904,13 +909,17 @@ static void cheetah_flush_icache(void)
...
@@ -904,13 +909,17 @@ static void cheetah_flush_icache(void)
static
void
cheetah_flush_dcache
(
void
)
static
void
cheetah_flush_dcache
(
void
)
{
{
unsigned
long
i
;
unsigned
int
dcache_size
,
dcache_line_size
;
unsigned
long
addr
;
dcache_size
=
local_cpu_data
().
dcache_size
;
dcache_line_size
=
local_cpu_data
().
dcache_line_size
;
for
(
i
=
0
;
i
<
(
1
<<
16
);
i
+=
(
1
<<
5
)
)
{
for
(
addr
=
0
;
addr
<
dcache_size
;
addr
+=
dcache_line_size
)
{
__asm__
__volatile__
(
"stxa %%g0, [%0] %1
\n\t
"
__asm__
__volatile__
(
"stxa %%g0, [%0] %1
\n\t
"
"membar #Sync"
"membar #Sync"
:
/* no outputs */
:
/* no outputs */
:
"r"
(
i
),
"i"
(
ASI_DCACHE_TAG
));
:
"r"
(
addr
),
"i"
(
ASI_DCACHE_TAG
));
}
}
}
}
...
@@ -921,24 +930,29 @@ static void cheetah_flush_dcache(void)
...
@@ -921,24 +930,29 @@ static void cheetah_flush_dcache(void)
*/
*/
static
void
cheetah_plus_zap_dcache_parity
(
void
)
static
void
cheetah_plus_zap_dcache_parity
(
void
)
{
{
unsigned
long
i
;
unsigned
int
dcache_size
,
dcache_line_size
;
unsigned
long
addr
;
dcache_size
=
local_cpu_data
().
dcache_size
;
dcache_line_size
=
local_cpu_data
().
dcache_line_size
;
for
(
i
=
0
;
i
<
(
1
<<
16
);
i
+=
(
1
<<
5
)
)
{
for
(
addr
=
0
;
addr
<
dcache_size
;
addr
+=
dcache_line_size
)
{
unsigned
long
tag
=
(
i
>>
14
);
unsigned
long
tag
=
(
addr
>>
14
);
unsigned
long
j
;
unsigned
long
line
;
__asm__
__volatile__
(
"membar #Sync
\n\t
"
__asm__
__volatile__
(
"membar #Sync
\n\t
"
"stxa %0, [%1] %2
\n\t
"
"stxa %0, [%1] %2
\n\t
"
"membar #Sync"
"membar #Sync"
:
/* no outputs */
:
/* no outputs */
:
"r"
(
tag
),
"r"
(
i
),
:
"r"
(
tag
),
"r"
(
addr
),
"i"
(
ASI_DCACHE_UTAG
));
"i"
(
ASI_DCACHE_UTAG
));
for
(
j
=
i
;
j
<
i
+
(
1
<<
5
);
j
+=
(
1
<<
3
)
)
for
(
line
=
addr
;
line
<
addr
+
dcache_line_size
;
line
+=
8
)
__asm__
__volatile__
(
"membar #Sync
\n\t
"
__asm__
__volatile__
(
"membar #Sync
\n\t
"
"stxa %%g0, [%0] %1
\n\t
"
"stxa %%g0, [%0] %1
\n\t
"
"membar #Sync"
"membar #Sync"
:
/* no outputs */
:
/* no outputs */
:
"r"
(
j
),
"i"
(
ASI_DCACHE_DATA
));
:
"r"
(
line
),
"i"
(
ASI_DCACHE_DATA
));
}
}
}
}
...
...
arch/sparc64/kernel/vmlinux.lds.S
View file @
95001ee9
...
@@ -9,8 +9,7 @@ ENTRY(_start)
...
@@ -9,8 +9,7 @@ ENTRY(_start)
jiffies
=
jiffies_64
;
jiffies
=
jiffies_64
;
SECTIONS
SECTIONS
{
{
swapper_pmd_dir
=
0x0000000000402000
;
swapper_low_pmd_dir
=
0x0000000000402000
;
empty_pg_dir
=
0x0000000000403000
;
.
=
0x4000
;
.
=
0x4000
;
.
text
0x0000000000404000
:
.
text
0x0000000000404000
:
{
{
...
...
arch/sparc64/mm/init.c
View file @
95001ee9
This diff is collapsed.
Click to expand it.
arch/sparc64/mm/ultra.S
View file @
95001ee9
...
@@ -144,42 +144,29 @@ __flush_icache_page: /* %o0 = phys_page */
...
@@ -144,42 +144,29 @@ __flush_icache_page: /* %o0 = phys_page */
#define DTAG_MASK 0x3
#define DTAG_MASK 0x3
/
*
This
routine
is
Spitfire
specific
so
the
hardcoded
*
D
-
cache
size
and
line
-
size
are
OK
.
*/
.
align
64
.
align
64
.
globl
__flush_dcache_page
.
globl
__flush_dcache_page
__flush_dcache_page
:
/
*
%
o0
=
kaddr
,
%
o1
=
flush_icache
*/
__flush_dcache_page
:
/
*
%
o0
=
kaddr
,
%
o1
=
flush_icache
*/
sethi
%
uhi
(
PAGE_OFFSET
),
%
g1
sethi
%
uhi
(
PAGE_OFFSET
),
%
g1
sllx
%
g1
,
32
,
%
g1
sllx
%
g1
,
32
,
%
g1
sub
%
o0
,
%
g1
,
%
o0
sub
%
o0
,
%
g1
,
%
o0
!
physical
address
clr
%
o4
srlx
%
o0
,
11
,
%
o0
!
make
D
-
cache
TAG
srlx
%
o0
,
11
,
%
o0
sethi
%
hi
(
1
<<
14
),
%
o2
!
D
-
cache
size
sethi
%
hi
(
1
<<
14
),
%
o2
sub
%
o2
,
(
1
<<
5
),
%
o2
!
D
-
cache
line
size
1
:
ldxa
[%
o4
]
ASI_DCACHE_TAG
,
%
o3
!
LSU
Group
1
:
ldxa
[%
o2
]
ASI_DCACHE_TAG
,
%
o3
!
load
D
-
cache
TAG
add
%
o4
,
(
1
<<
5
),
%
o4
!
IEU0
andcc
%
o3
,
DTAG_MASK
,
%
g0
!
Valid
?
ldxa
[%
o4
]
ASI_DCACHE_TAG
,
%
g1
!
LSU
Group
be
,
pn
%
xcc
,
2
f
!
Nope
,
branch
add
%
o4
,
(
1
<<
5
),
%
o4
!
IEU0
andn
%
o3
,
DTAG_MASK
,
%
o3
!
Clear
valid
bits
ldxa
[%
o4
]
ASI_DCACHE_TAG
,
%
g2
!
LSU
Group
o3
available
cmp
%
o3
,
%
o0
!
TAG
match
?
add
%
o4
,
(
1
<<
5
),
%
o4
!
IEU0
bne
,
pt
%
xcc
,
2
f
!
Nope
,
branch
andn
%
o3
,
DTAG_MASK
,
%
o3
!
IEU1
nop
ldxa
[%
o4
]
ASI_DCACHE_TAG
,
%
g3
!
LSU
Group
stxa
%
g0
,
[%
o2
]
ASI_DCACHE_TAG
!
Invalidate
TAG
add
%
o4
,
(
1
<<
5
),
%
o4
!
IEU0
membar
#
Sync
andn
%
g1
,
DTAG_MASK
,
%
g1
!
IEU1
2
:
brnz
,
pt
%
o2
,
1
b
cmp
%
o0
,
%
o3
!
IEU1
Group
sub
%
o2
,
(
1
<<
5
),
%
o2
!
D
-
cache
line
size
be
,
a
,
pn
%
xcc
,
dflush1
!
CTI
sub
%
o4
,
(
4
<<
5
),
%
o4
!
IEU0
(
Group
)
cmp
%
o0
,
%
g1
!
IEU1
Group
andn
%
g2
,
DTAG_MASK
,
%
g2
!
IEU0
be
,
a
,
pn
%
xcc
,
dflush2
!
CTI
sub
%
o4
,
(
3
<<
5
),
%
o4
!
IEU0
(
Group
)
cmp
%
o0
,
%
g2
!
IEU1
Group
andn
%
g3
,
DTAG_MASK
,
%
g3
!
IEU0
be
,
a
,
pn
%
xcc
,
dflush3
!
CTI
sub
%
o4
,
(
2
<<
5
),
%
o4
!
IEU0
(
Group
)
cmp
%
o0
,
%
g3
!
IEU1
Group
be
,
a
,
pn
%
xcc
,
dflush4
!
CTI
sub
%
o4
,
(
1
<<
5
),
%
o4
!
IEU0
2
:
cmp
%
o4
,
%
o2
!
IEU1
Group
bne
,
pt
%
xcc
,
1
b
!
CTI
nop
!
IEU0
/
*
The
I
-
cache
does
not
snoop
local
stores
so
we
/
*
The
I
-
cache
does
not
snoop
local
stores
so
we
*
better
flush
that
too
when
necessary
.
*
better
flush
that
too
when
necessary
.
...
@@ -189,48 +176,9 @@ __flush_dcache_page: /* %o0=kaddr, %o1=flush_icache */
...
@@ -189,48 +176,9 @@ __flush_dcache_page: /* %o0=kaddr, %o1=flush_icache */
retl
retl
nop
nop
dflush1
:
stxa
%
g0
,
[%
o4
]
ASI_DCACHE_TAG
add
%
o4
,
(
1
<<
5
),
%
o4
dflush2
:
stxa
%
g0
,
[%
o4
]
ASI_DCACHE_TAG
add
%
o4
,
(
1
<<
5
),
%
o4
dflush3
:
stxa
%
g0
,
[%
o4
]
ASI_DCACHE_TAG
add
%
o4
,
(
1
<<
5
),
%
o4
dflush4
:
stxa
%
g0
,
[%
o4
]
ASI_DCACHE_TAG
add
%
o4
,
(
1
<<
5
),
%
o4
membar
#
Sync
ba
,
pt
%
xcc
,
2
b
nop
#endif /* DCACHE_ALIASING_POSSIBLE */
#endif /* DCACHE_ALIASING_POSSIBLE */
.
previous
.
text
.
previous
.
align
32
__prefill_dtlb
:
rdpr
%
pstate
,
%
g7
wrpr
%
g7
,
PSTATE_IE
,
%
pstate
mov
TLB_TAG_ACCESS
,
%
g1
stxa
%
o5
,
[%
g1
]
ASI_DMMU
stxa
%
o2
,
[%
g0
]
ASI_DTLB_DATA_IN
flush
%
g6
retl
wrpr
%
g7
,
%
pstate
__prefill_itlb
:
rdpr
%
pstate
,
%
g7
wrpr
%
g7
,
PSTATE_IE
,
%
pstate
mov
TLB_TAG_ACCESS
,
%
g1
stxa
%
o5
,
[%
g1
]
ASI_IMMU
stxa
%
o2
,
[%
g0
]
ASI_ITLB_DATA_IN
flush
%
g6
retl
wrpr
%
g7
,
%
pstate
.
globl
__update_mmu_cache
__update_mmu_cache
:
/
*
%
o0
=
hw_context
,
%
o1
=
address
,
%
o2
=
pte
,
%
o3
=
fault_code
*/
srlx
%
o1
,
PAGE_SHIFT
,
%
o1
andcc
%
o3
,
FAULT_CODE_DTLB
,
%
g0
sllx
%
o1
,
PAGE_SHIFT
,
%
o5
bne
,
pt
%
xcc
,
__prefill_dtlb
or
%
o5
,
%
o0
,
%
o5
ba
,
a
,
pt
%
xcc
,
__prefill_itlb
/
*
Cheetah
specific
versions
,
patched
at
boot
time
.
*/
/
*
Cheetah
specific
versions
,
patched
at
boot
time
.
*/
__cheetah_flush_tlb_mm
:
/
*
18
insns
*/
__cheetah_flush_tlb_mm
:
/
*
18
insns
*/
...
@@ -283,7 +231,7 @@ __cheetah_flush_tlb_pending: /* 26 insns */
...
@@ -283,7 +231,7 @@ __cheetah_flush_tlb_pending: /* 26 insns */
wrpr
%
g7
,
0x0
,
%
pstate
wrpr
%
g7
,
0x0
,
%
pstate
#ifdef DCACHE_ALIASING_POSSIBLE
#ifdef DCACHE_ALIASING_POSSIBLE
flush_dcpage_cheetah
:
/
*
11
insns
*/
__cheetah_flush_dcache_page
:
/
*
11
insns
*/
sethi
%
uhi
(
PAGE_OFFSET
),
%
g1
sethi
%
uhi
(
PAGE_OFFSET
),
%
g1
sllx
%
g1
,
32
,
%
g1
sllx
%
g1
,
32
,
%
g1
sub
%
o0
,
%
g1
,
%
o0
sub
%
o0
,
%
g1
,
%
o0
...
@@ -329,8 +277,8 @@ cheetah_patch_cachetlbops:
...
@@ -329,8 +277,8 @@ cheetah_patch_cachetlbops:
#ifdef DCACHE_ALIASING_POSSIBLE
#ifdef DCACHE_ALIASING_POSSIBLE
sethi
%
hi
(
__flush_dcache_page
),
%
o0
sethi
%
hi
(
__flush_dcache_page
),
%
o0
or
%
o0
,
%
lo
(
__flush_dcache_page
),
%
o0
or
%
o0
,
%
lo
(
__flush_dcache_page
),
%
o0
sethi
%
hi
(
flush_dcpage_cheetah
),
%
o1
sethi
%
hi
(
__cheetah_flush_dcache_page
),
%
o1
or
%
o1
,
%
lo
(
flush_dcpage_cheetah
),
%
o1
or
%
o1
,
%
lo
(
__cheetah_flush_dcache_page
),
%
o1
call
cheetah_patch_one
call
cheetah_patch_one
mov
11
,
%
o2
mov
11
,
%
o2
#endif /* DCACHE_ALIASING_POSSIBLE */
#endif /* DCACHE_ALIASING_POSSIBLE */
...
...
arch/sparc64/prom/Makefile
View file @
95001ee9
...
@@ -7,4 +7,4 @@ EXTRA_AFLAGS := -ansi
...
@@ -7,4 +7,4 @@ EXTRA_AFLAGS := -ansi
EXTRA_CFLAGS
:=
-Werror
EXTRA_CFLAGS
:=
-Werror
lib-y
:=
bootstr.o devops.o init.o memory.o misc.o
\
lib-y
:=
bootstr.o devops.o init.o memory.o misc.o
\
tree.o console.o printf.o p1275.o
map.o
cif.o
tree.o console.o printf.o p1275.o cif.o
arch/sparc64/prom/console.c
View file @
95001ee9
...
@@ -67,7 +67,7 @@ prom_putchar(char c)
...
@@ -67,7 +67,7 @@ prom_putchar(char c)
}
}
void
void
prom_puts
(
char
*
s
,
int
len
)
prom_puts
(
c
onst
c
har
*
s
,
int
len
)
{
{
p1275_cmd
(
"write"
,
P1275_ARG
(
1
,
P1275_ARG_IN_BUF
)
|
p1275_cmd
(
"write"
,
P1275_ARG
(
1
,
P1275_ARG_IN_BUF
)
|
P1275_INOUT
(
3
,
1
),
P1275_INOUT
(
3
,
1
),
...
...
arch/sparc64/prom/devops.c
View file @
95001ee9
...
@@ -16,7 +16,7 @@
...
@@ -16,7 +16,7 @@
* Returns 0 on failure.
* Returns 0 on failure.
*/
*/
int
int
prom_devopen
(
char
*
dstr
)
prom_devopen
(
c
onst
c
har
*
dstr
)
{
{
return
p1275_cmd
(
"open"
,
P1275_ARG
(
0
,
P1275_ARG_IN_STRING
)
|
return
p1275_cmd
(
"open"
,
P1275_ARG
(
0
,
P1275_ARG_IN_STRING
)
|
P1275_INOUT
(
1
,
1
),
P1275_INOUT
(
1
,
1
),
...
...
arch/sparc64/prom/init.c
View file @
95001ee9
...
@@ -46,7 +46,7 @@ void __init prom_init(void *cif_handler, void *cif_stack)
...
@@ -46,7 +46,7 @@ void __init prom_init(void *cif_handler, void *cif_stack)
if
((
prom_root_node
==
0
)
||
(
prom_root_node
==
-
1
))
if
((
prom_root_node
==
0
)
||
(
prom_root_node
==
-
1
))
prom_halt
();
prom_halt
();
prom_chosen_node
=
prom_finddevice
(
"/chosen"
);
prom_chosen_node
=
prom_finddevice
(
prom_chosen_path
);
if
(
!
prom_chosen_node
||
prom_chosen_node
==
-
1
)
if
(
!
prom_chosen_node
||
prom_chosen_node
==
-
1
)
prom_halt
();
prom_halt
();
...
...
arch/sparc64/prom/map.S
deleted
100644 → 0
View file @
63906e41
/*
$Id
:
map
.
S
,
v
1
.2
1999
/
11
/
19
05
:
53
:
02
davem
Exp
$
*
map
.
S
:
Tricky
coding
required
to
fixup
the
kernel
OBP
maps
*
properly
.
*
*
Copyright
(
C
)
1999
David
S
.
Miller
(
davem
@
redhat
.
com
)
*/
.
text
.
align
8192
.
globl
prom_boot_page
prom_boot_page
:
call_method
:
.
asciz
"call-method"
.
align
8
map
:
.
asciz
"map"
.
align
8
/
*
When
we
are
invoked
,
our
caller
has
remapped
us
to
*
page
zero
,
therefore
we
must
use
PC
relative
addressing
*
for
everything
after
we
begin
performing
the
unmap
/
map
*
calls
.
*/
.
globl
prom_remap
prom_remap
:
/
*
%
o0
=
physpage
,
%
o1
=
virtpage
,
%
o2
=
mmu_ihandle
*/
rd
%
pc
,
%
g1
srl
%
o2
,
0
,
%
o2
!
kill
sign
extension
sethi
%
hi
(
p1275buf
),
%
g2
or
%
g2
,
%
lo
(
p1275buf
),
%
g2
ldx
[%
g2
+
0x10
],
%
g3
!
prom_cif_stack
save
%
g3
,
-(
192
+
128
),
%
sp
ldx
[%
g2
+
0x08
],
%
l0
!
prom_cif_handler
mov
%
g6
,
%
i3
mov
%
g4
,
%
i4
mov
%
g5
,
%
i5
flushw
sethi
%
hi
(
prom_remap
-
call_method
),
%
g7
or
%
g7
,
%
lo
(
prom_remap
-
call_method
),
%
g7
sub
%
g1
,
%
g7
,
%
l2
!
call
-
method
string
sethi
%
hi
(
prom_remap
-
map
),
%
g7
or
%
g7
,
%
lo
(
prom_remap
-
map
),
%
g7
sub
%
g1
,
%
g7
,
%
l4
!
map
string
/
*
OK
,
map
the
4
MB
region
we
really
live
at
.
*/
stx
%
l2
,
[%
sp
+
2047
+
128
+
0x00
]
!
call
-
method
mov
7
,
%
l5
stx
%
l5
,
[%
sp
+
2047
+
128
+
0x08
]
!
num_args
mov
1
,
%
l5
stx
%
l5
,
[%
sp
+
2047
+
128
+
0x10
]
!
num_rets
stx
%
l4
,
[%
sp
+
2047
+
128
+
0x18
]
!
map
stx
%
i2
,
[%
sp
+
2047
+
128
+
0x20
]
!
mmu_ihandle
mov
-
1
,
%
l5
stx
%
l5
,
[%
sp
+
2047
+
128
+
0x28
]
!
mode
==
default
sethi
%
hi
(
4
*
1024
*
1024
),
%
l5
stx
%
l5
,
[%
sp
+
2047
+
128
+
0x30
]
!
size
stx
%
i1
,
[%
sp
+
2047
+
128
+
0x38
]
!
vaddr
stx
%
g0
,
[%
sp
+
2047
+
128
+
0x40
]
!
filler
stx
%
i0
,
[%
sp
+
2047
+
128
+
0x48
]
!
paddr
call
%
l0
add
%
sp
,
(
2047
+
128
),
%
o0
!
argument
array
/
*
Restore
hard
-
coded
globals
.
*/
mov
%
i3
,
%
g6
mov
%
i4
,
%
g4
mov
%
i5
,
%
g5
/
*
Wheee
....
we
are
done
.
*/
ret
restore
.
align
8192
arch/sparc64/prom/misc.c
View file @
95001ee9
...
@@ -17,14 +17,14 @@
...
@@ -17,14 +17,14 @@
#include <asm/system.h>
#include <asm/system.h>
/* Reset and reboot the machine with the command 'bcommand'. */
/* Reset and reboot the machine with the command 'bcommand'. */
void
prom_reboot
(
char
*
bcommand
)
void
prom_reboot
(
c
onst
c
har
*
bcommand
)
{
{
p1275_cmd
(
"boot"
,
P1275_ARG
(
0
,
P1275_ARG_IN_STRING
)
|
p1275_cmd
(
"boot"
,
P1275_ARG
(
0
,
P1275_ARG_IN_STRING
)
|
P1275_INOUT
(
1
,
0
),
bcommand
);
P1275_INOUT
(
1
,
0
),
bcommand
);
}
}
/* Forth evaluate the expression contained in 'fstring'. */
/* Forth evaluate the expression contained in 'fstring'. */
void
prom_feval
(
char
*
fstring
)
void
prom_feval
(
c
onst
c
har
*
fstring
)
{
{
if
(
!
fstring
||
fstring
[
0
]
==
0
)
if
(
!
fstring
||
fstring
[
0
]
==
0
)
return
;
return
;
...
@@ -148,21 +148,19 @@ void prom_set_trap_table(unsigned long tba)
...
@@ -148,21 +148,19 @@ void prom_set_trap_table(unsigned long tba)
p1275_cmd
(
"SUNW,set-trap-table"
,
P1275_INOUT
(
1
,
0
),
tba
);
p1275_cmd
(
"SUNW,set-trap-table"
,
P1275_INOUT
(
1
,
0
),
tba
);
}
}
int
mmu_ihandle_cache
=
0
;
int
prom_get_mmu_ihandle
(
void
)
int
prom_get_mmu_ihandle
(
void
)
{
{
int
node
,
ret
;
int
node
,
ret
;
if
(
mmu_ihandle_cache
!=
0
)
if
(
prom_
mmu_ihandle_cache
!=
0
)
return
mmu_ihandle_cache
;
return
prom_
mmu_ihandle_cache
;
node
=
prom_finddevice
(
"/chosen"
);
node
=
prom_finddevice
(
prom_chosen_path
);
ret
=
prom_getint
(
node
,
"mmu"
);
ret
=
prom_getint
(
node
,
prom_mmu_name
);
if
(
ret
==
-
1
||
ret
==
0
)
if
(
ret
==
-
1
||
ret
==
0
)
mmu_ihandle_cache
=
-
1
;
prom_
mmu_ihandle_cache
=
-
1
;
else
else
mmu_ihandle_cache
=
ret
;
prom_
mmu_ihandle_cache
=
ret
;
return
ret
;
return
ret
;
}
}
...
@@ -190,7 +188,7 @@ long prom_itlb_load(unsigned long index,
...
@@ -190,7 +188,7 @@ long prom_itlb_load(unsigned long index,
unsigned
long
tte_data
,
unsigned
long
tte_data
,
unsigned
long
vaddr
)
unsigned
long
vaddr
)
{
{
return
p1275_cmd
(
"call-method"
,
return
p1275_cmd
(
prom_callmethod_name
,
(
P1275_ARG
(
0
,
P1275_ARG_IN_STRING
)
|
(
P1275_ARG
(
0
,
P1275_ARG_IN_STRING
)
|
P1275_ARG
(
2
,
P1275_ARG_IN_64B
)
|
P1275_ARG
(
2
,
P1275_ARG_IN_64B
)
|
P1275_ARG
(
3
,
P1275_ARG_IN_64B
)
|
P1275_ARG
(
3
,
P1275_ARG_IN_64B
)
|
...
@@ -207,7 +205,7 @@ long prom_dtlb_load(unsigned long index,
...
@@ -207,7 +205,7 @@ long prom_dtlb_load(unsigned long index,
unsigned
long
tte_data
,
unsigned
long
tte_data
,
unsigned
long
vaddr
)
unsigned
long
vaddr
)
{
{
return
p1275_cmd
(
"call-method"
,
return
p1275_cmd
(
prom_callmethod_name
,
(
P1275_ARG
(
0
,
P1275_ARG_IN_STRING
)
|
(
P1275_ARG
(
0
,
P1275_ARG_IN_STRING
)
|
P1275_ARG
(
2
,
P1275_ARG_IN_64B
)
|
P1275_ARG
(
2
,
P1275_ARG_IN_64B
)
|
P1275_ARG
(
3
,
P1275_ARG_IN_64B
)
|
P1275_ARG
(
3
,
P1275_ARG_IN_64B
)
|
...
@@ -223,13 +221,13 @@ long prom_dtlb_load(unsigned long index,
...
@@ -223,13 +221,13 @@ long prom_dtlb_load(unsigned long index,
int
prom_map
(
int
mode
,
unsigned
long
size
,
int
prom_map
(
int
mode
,
unsigned
long
size
,
unsigned
long
vaddr
,
unsigned
long
paddr
)
unsigned
long
vaddr
,
unsigned
long
paddr
)
{
{
int
ret
=
p1275_cmd
(
"call-method"
,
int
ret
=
p1275_cmd
(
prom_callmethod_name
,
(
P1275_ARG
(
0
,
P1275_ARG_IN_STRING
)
|
(
P1275_ARG
(
0
,
P1275_ARG_IN_STRING
)
|
P1275_ARG
(
3
,
P1275_ARG_IN_64B
)
|
P1275_ARG
(
3
,
P1275_ARG_IN_64B
)
|
P1275_ARG
(
4
,
P1275_ARG_IN_64B
)
|
P1275_ARG
(
4
,
P1275_ARG_IN_64B
)
|
P1275_ARG
(
6
,
P1275_ARG_IN_64B
)
|
P1275_ARG
(
6
,
P1275_ARG_IN_64B
)
|
P1275_INOUT
(
7
,
1
)),
P1275_INOUT
(
7
,
1
)),
"map"
,
prom_map_name
,
prom_get_mmu_ihandle
(),
prom_get_mmu_ihandle
(),
mode
,
mode
,
size
,
size
,
...
@@ -244,12 +242,12 @@ int prom_map(int mode, unsigned long size,
...
@@ -244,12 +242,12 @@ int prom_map(int mode, unsigned long size,
void
prom_unmap
(
unsigned
long
size
,
unsigned
long
vaddr
)
void
prom_unmap
(
unsigned
long
size
,
unsigned
long
vaddr
)
{
{
p1275_cmd
(
"call-method"
,
p1275_cmd
(
prom_callmethod_name
,
(
P1275_ARG
(
0
,
P1275_ARG_IN_STRING
)
|
(
P1275_ARG
(
0
,
P1275_ARG_IN_STRING
)
|
P1275_ARG
(
2
,
P1275_ARG_IN_64B
)
|
P1275_ARG
(
2
,
P1275_ARG_IN_64B
)
|
P1275_ARG
(
3
,
P1275_ARG_IN_64B
)
|
P1275_ARG
(
3
,
P1275_ARG_IN_64B
)
|
P1275_INOUT
(
4
,
0
)),
P1275_INOUT
(
4
,
0
)),
"unmap"
,
prom_unmap_name
,
prom_get_mmu_ihandle
(),
prom_get_mmu_ihandle
(),
size
,
size
,
vaddr
);
vaddr
);
...
@@ -258,7 +256,7 @@ void prom_unmap(unsigned long size, unsigned long vaddr)
...
@@ -258,7 +256,7 @@ void prom_unmap(unsigned long size, unsigned long vaddr)
/* Set aside physical memory which is not touched or modified
/* Set aside physical memory which is not touched or modified
* across soft resets.
* across soft resets.
*/
*/
unsigned
long
prom_retain
(
char
*
name
,
unsigned
long
prom_retain
(
c
onst
c
har
*
name
,
unsigned
long
pa_low
,
unsigned
long
pa_high
,
unsigned
long
pa_low
,
unsigned
long
pa_high
,
long
size
,
long
align
)
long
size
,
long
align
)
{
{
...
@@ -290,7 +288,7 @@ int prom_getunumber(int syndrome_code,
...
@@ -290,7 +288,7 @@ int prom_getunumber(int syndrome_code,
unsigned
long
phys_addr
,
unsigned
long
phys_addr
,
char
*
buf
,
int
buflen
)
char
*
buf
,
int
buflen
)
{
{
return
p1275_cmd
(
"call-method"
,
return
p1275_cmd
(
prom_callmethod_name
,
(
P1275_ARG
(
0
,
P1275_ARG_IN_STRING
)
|
(
P1275_ARG
(
0
,
P1275_ARG_IN_STRING
)
|
P1275_ARG
(
3
,
P1275_ARG_OUT_BUF
)
|
P1275_ARG
(
3
,
P1275_ARG_OUT_BUF
)
|
P1275_ARG
(
6
,
P1275_ARG_IN_64B
)
|
P1275_ARG
(
6
,
P1275_ARG_IN_64B
)
|
...
...
arch/sparc64/prom/p1275.c
View file @
95001ee9
...
@@ -46,7 +46,7 @@ static inline unsigned long spitfire_get_primary_context(void)
...
@@ -46,7 +46,7 @@ static inline unsigned long spitfire_get_primary_context(void)
*/
*/
DEFINE_SPINLOCK
(
prom_entry_lock
);
DEFINE_SPINLOCK
(
prom_entry_lock
);
long
p1275_cmd
(
char
*
service
,
long
fmt
,
...)
long
p1275_cmd
(
const
char
*
service
,
long
fmt
,
...)
{
{
char
*
p
,
*
q
;
char
*
p
,
*
q
;
unsigned
long
flags
;
unsigned
long
flags
;
...
...
arch/sparc64/prom/printf.c
View file @
95001ee9
...
@@ -34,7 +34,7 @@ prom_write(const char *buf, unsigned int n)
...
@@ -34,7 +34,7 @@ prom_write(const char *buf, unsigned int n)
}
}
void
void
prom_printf
(
char
*
fmt
,
...)
prom_printf
(
c
onst
c
har
*
fmt
,
...)
{
{
va_list
args
;
va_list
args
;
int
i
;
int
i
;
...
...
arch/sparc64/prom/tree.c
View file @
95001ee9
...
@@ -69,7 +69,7 @@ prom_getsibling(int node)
...
@@ -69,7 +69,7 @@ prom_getsibling(int node)
* Return -1 on error.
* Return -1 on error.
*/
*/
__inline__
int
__inline__
int
prom_getproplen
(
int
node
,
char
*
prop
)
prom_getproplen
(
int
node
,
c
onst
c
har
*
prop
)
{
{
if
((
!
node
)
||
(
!
prop
))
return
-
1
;
if
((
!
node
)
||
(
!
prop
))
return
-
1
;
return
p1275_cmd
(
"getproplen"
,
return
p1275_cmd
(
"getproplen"
,
...
@@ -83,20 +83,20 @@ prom_getproplen(int node, char *prop)
...
@@ -83,20 +83,20 @@ prom_getproplen(int node, char *prop)
* was successful the length will be returned, else -1 is returned.
* was successful the length will be returned, else -1 is returned.
*/
*/
__inline__
int
__inline__
int
prom_getproperty
(
int
node
,
char
*
prop
,
char
*
buffer
,
int
bufsize
)
prom_getproperty
(
int
node
,
c
onst
c
har
*
prop
,
char
*
buffer
,
int
bufsize
)
{
{
int
plen
;
int
plen
;
plen
=
prom_getproplen
(
node
,
prop
);
plen
=
prom_getproplen
(
node
,
prop
);
if
((
plen
>
bufsize
)
||
(
plen
==
0
)
||
(
plen
==
-
1
))
if
((
plen
>
bufsize
)
||
(
plen
==
0
)
||
(
plen
==
-
1
))
{
return
-
1
;
return
-
1
;
else
{
}
else
{
/* Ok, things seem all right. */
/* Ok, things seem all right. */
return
p1275_cmd
(
"getprop"
,
return
p1275_cmd
(
prom_getprop_name
,
P1275_ARG
(
1
,
P1275_ARG_IN_STRING
)
|
P1275_ARG
(
1
,
P1275_ARG_IN_STRING
)
|
P1275_ARG
(
2
,
P1275_ARG_OUT_BUF
)
|
P1275_ARG
(
2
,
P1275_ARG_OUT_BUF
)
|
P1275_INOUT
(
4
,
1
),
P1275_INOUT
(
4
,
1
),
node
,
prop
,
buffer
,
P1275_SIZE
(
plen
));
node
,
prop
,
buffer
,
P1275_SIZE
(
plen
));
}
}
}
}
...
@@ -104,7 +104,7 @@ prom_getproperty(int node, char *prop, char *buffer, int bufsize)
...
@@ -104,7 +104,7 @@ prom_getproperty(int node, char *prop, char *buffer, int bufsize)
* on failure.
* on failure.
*/
*/
__inline__
int
__inline__
int
prom_getint
(
int
node
,
char
*
prop
)
prom_getint
(
int
node
,
c
onst
c
har
*
prop
)
{
{
int
intprop
;
int
intprop
;
...
@@ -119,7 +119,7 @@ prom_getint(int node, char *prop)
...
@@ -119,7 +119,7 @@ prom_getint(int node, char *prop)
*/
*/
int
int
prom_getintdefault
(
int
node
,
char
*
property
,
int
deflt
)
prom_getintdefault
(
int
node
,
c
onst
c
har
*
property
,
int
deflt
)
{
{
int
retval
;
int
retval
;
...
@@ -131,7 +131,7 @@ prom_getintdefault(int node, char *property, int deflt)
...
@@ -131,7 +131,7 @@ prom_getintdefault(int node, char *property, int deflt)
/* Acquire a boolean property, 1=TRUE 0=FALSE. */
/* Acquire a boolean property, 1=TRUE 0=FALSE. */
int
int
prom_getbool
(
int
node
,
char
*
prop
)
prom_getbool
(
int
node
,
c
onst
c
har
*
prop
)
{
{
int
retval
;
int
retval
;
...
@@ -145,7 +145,7 @@ prom_getbool(int node, char *prop)
...
@@ -145,7 +145,7 @@ prom_getbool(int node, char *prop)
* buffer.
* buffer.
*/
*/
void
void
prom_getstring
(
int
node
,
char
*
prop
,
char
*
user_buf
,
int
ubuf_size
)
prom_getstring
(
int
node
,
c
onst
c
har
*
prop
,
char
*
user_buf
,
int
ubuf_size
)
{
{
int
len
;
int
len
;
...
@@ -160,7 +160,7 @@ prom_getstring(int node, char *prop, char *user_buf, int ubuf_size)
...
@@ -160,7 +160,7 @@ prom_getstring(int node, char *prop, char *user_buf, int ubuf_size)
* YES = 1 NO = 0
* YES = 1 NO = 0
*/
*/
int
int
prom_nodematch
(
int
node
,
char
*
name
)
prom_nodematch
(
int
node
,
c
onst
c
har
*
name
)
{
{
char
namebuf
[
128
];
char
namebuf
[
128
];
prom_getproperty
(
node
,
"name"
,
namebuf
,
sizeof
(
namebuf
));
prom_getproperty
(
node
,
"name"
,
namebuf
,
sizeof
(
namebuf
));
...
@@ -172,7 +172,7 @@ prom_nodematch(int node, char *name)
...
@@ -172,7 +172,7 @@ prom_nodematch(int node, char *name)
* 'nodename'. Return node if successful, zero if not.
* 'nodename'. Return node if successful, zero if not.
*/
*/
int
int
prom_searchsiblings
(
int
node_start
,
char
*
nodename
)
prom_searchsiblings
(
int
node_start
,
c
onst
c
har
*
nodename
)
{
{
int
thisnode
,
error
;
int
thisnode
,
error
;
...
@@ -294,7 +294,7 @@ prom_firstprop(int node, char *buffer)
...
@@ -294,7 +294,7 @@ prom_firstprop(int node, char *buffer)
* property types for this node.
* property types for this node.
*/
*/
__inline__
char
*
__inline__
char
*
prom_nextprop
(
int
node
,
char
*
oprop
,
char
*
buffer
)
prom_nextprop
(
int
node
,
c
onst
c
har
*
oprop
,
char
*
buffer
)
{
{
char
buf
[
32
];
char
buf
[
32
];
...
@@ -314,15 +314,17 @@ prom_nextprop(int node, char *oprop, char *buffer)
...
@@ -314,15 +314,17 @@ prom_nextprop(int node, char *oprop, char *buffer)
}
}
int
int
prom_finddevice
(
char
*
name
)
prom_finddevice
(
c
onst
c
har
*
name
)
{
{
if
(
!
name
)
return
0
;
if
(
!
name
)
return
p1275_cmd
(
"finddevice"
,
P1275_ARG
(
0
,
P1275_ARG_IN_STRING
)
|
return
0
;
P1275_INOUT
(
1
,
1
),
return
p1275_cmd
(
prom_finddev_name
,
name
);
P1275_ARG
(
0
,
P1275_ARG_IN_STRING
)
|
P1275_INOUT
(
1
,
1
),
name
);
}
}
int
prom_node_has_property
(
int
node
,
char
*
prop
)
int
prom_node_has_property
(
int
node
,
c
onst
c
har
*
prop
)
{
{
char
buf
[
32
];
char
buf
[
32
];
...
@@ -339,7 +341,7 @@ int prom_node_has_property(int node, char *prop)
...
@@ -339,7 +341,7 @@ int prom_node_has_property(int node, char *prop)
* of 'size' bytes. Return the number of bytes the prom accepted.
* of 'size' bytes. Return the number of bytes the prom accepted.
*/
*/
int
int
prom_setprop
(
int
node
,
char
*
pname
,
char
*
value
,
int
size
)
prom_setprop
(
int
node
,
c
onst
c
har
*
pname
,
char
*
value
,
int
size
)
{
{
if
(
size
==
0
)
return
0
;
if
(
size
==
0
)
return
0
;
if
((
pname
==
0
)
||
(
value
==
0
))
return
0
;
if
((
pname
==
0
)
||
(
value
==
0
))
return
0
;
...
@@ -364,7 +366,7 @@ prom_inst2pkg(int inst)
...
@@ -364,7 +366,7 @@ prom_inst2pkg(int inst)
* FIXME: Should work for v0 as well
* FIXME: Should work for v0 as well
*/
*/
int
int
prom_pathtoinode
(
char
*
path
)
prom_pathtoinode
(
c
onst
c
har
*
path
)
{
{
int
node
,
inst
;
int
node
,
inst
;
...
...
include/asm-sparc64/cacheflush.h
View file @
95001ee9
...
@@ -66,6 +66,11 @@ extern void flush_ptrace_access(struct vm_area_struct *, struct page *,
...
@@ -66,6 +66,11 @@ extern void flush_ptrace_access(struct vm_area_struct *, struct page *,
#define flush_cache_vmap(start, end) do { } while (0)
#define flush_cache_vmap(start, end) do { } while (0)
#define flush_cache_vunmap(start, end) do { } while (0)
#define flush_cache_vunmap(start, end) do { } while (0)
#ifdef CONFIG_DEBUG_PAGEALLOC
/* internal debugging function */
void
kernel_map_pages
(
struct
page
*
page
,
int
numpages
,
int
enable
);
#endif
#endif
/* !__ASSEMBLY__ */
#endif
/* !__ASSEMBLY__ */
#endif
/* _SPARC64_CACHEFLUSH_H */
#endif
/* _SPARC64_CACHEFLUSH_H */
include/asm-sparc64/cpudata.h
View file @
95001ee9
...
@@ -22,6 +22,16 @@ typedef struct {
...
@@ -22,6 +22,16 @@ typedef struct {
unsigned
int
__pad1
;
unsigned
int
__pad1
;
unsigned
long
*
pte_cache
[
2
];
unsigned
long
*
pte_cache
[
2
];
unsigned
long
*
pgd_cache
;
unsigned
long
*
pgd_cache
;
/* Dcache line 3, rarely used */
unsigned
int
dcache_size
;
unsigned
int
dcache_line_size
;
unsigned
int
icache_size
;
unsigned
int
icache_line_size
;
unsigned
int
ecache_size
;
unsigned
int
ecache_line_size
;
unsigned
int
__pad2
;
unsigned
int
__pad3
;
}
cpuinfo_sparc
;
}
cpuinfo_sparc
;
DECLARE_PER_CPU
(
cpuinfo_sparc
,
__cpu_data
);
DECLARE_PER_CPU
(
cpuinfo_sparc
,
__cpu_data
);
...
...
include/asm-sparc64/oplib.h
View file @
95001ee9
...
@@ -38,6 +38,20 @@ extern int prom_stdin, prom_stdout;
...
@@ -38,6 +38,20 @@ extern int prom_stdin, prom_stdout;
*/
*/
extern
int
prom_chosen_node
;
extern
int
prom_chosen_node
;
/* Helper values and strings in arch/sparc64/kernel/head.S */
extern
const
char
prom_finddev_name
[];
extern
const
char
prom_chosen_path
[];
extern
const
char
prom_getprop_name
[];
extern
const
char
prom_mmu_name
[];
extern
const
char
prom_callmethod_name
[];
extern
const
char
prom_translate_name
[];
extern
const
char
prom_map_name
[];
extern
const
char
prom_unmap_name
[];
extern
int
prom_mmu_ihandle_cache
;
extern
unsigned
int
prom_boot_mapped_pc
;
extern
unsigned
int
prom_boot_mapping_mode
;
extern
unsigned
long
prom_boot_mapping_phys_high
,
prom_boot_mapping_phys_low
;
struct
linux_mlist_p1275
{
struct
linux_mlist_p1275
{
struct
linux_mlist_p1275
*
theres_more
;
struct
linux_mlist_p1275
*
theres_more
;
unsigned
long
start_adr
;
unsigned
long
start_adr
;
...
@@ -68,7 +82,7 @@ extern char *prom_getbootargs(void);
...
@@ -68,7 +82,7 @@ extern char *prom_getbootargs(void);
* of the string is different on V0 vs. V2->higher proms. The caller must
* of the string is different on V0 vs. V2->higher proms. The caller must
* know what he/she is doing! Returns the device descriptor, an int.
* know what he/she is doing! Returns the device descriptor, an int.
*/
*/
extern
int
prom_devopen
(
char
*
device_string
);
extern
int
prom_devopen
(
c
onst
c
har
*
device_string
);
/* Close a previously opened device described by the passed integer
/* Close a previously opened device described by the passed integer
* descriptor.
* descriptor.
...
@@ -98,10 +112,10 @@ extern struct linux_mem_p1275 *prom_meminfo(void);
...
@@ -98,10 +112,10 @@ extern struct linux_mem_p1275 *prom_meminfo(void);
/* Miscellaneous routines, don't really fit in any category per se. */
/* Miscellaneous routines, don't really fit in any category per se. */
/* Reboot the machine with the command line passed. */
/* Reboot the machine with the command line passed. */
extern
void
prom_reboot
(
char
*
boot_command
);
extern
void
prom_reboot
(
c
onst
c
har
*
boot_command
);
/* Evaluate the forth string passed. */
/* Evaluate the forth string passed. */
extern
void
prom_feval
(
char
*
forth_string
);
extern
void
prom_feval
(
c
onst
c
har
*
forth_string
);
/* Enter the prom, with possibility of continuation with the 'go'
/* Enter the prom, with possibility of continuation with the 'go'
* command in newer proms.
* command in newer proms.
...
@@ -154,7 +168,7 @@ extern char prom_getchar(void);
...
@@ -154,7 +168,7 @@ extern char prom_getchar(void);
extern
void
prom_putchar
(
char
character
);
extern
void
prom_putchar
(
char
character
);
/* Prom's internal routines, don't use in kernel/boot code. */
/* Prom's internal routines, don't use in kernel/boot code. */
extern
void
prom_printf
(
char
*
fmt
,
...);
extern
void
prom_printf
(
c
onst
c
har
*
fmt
,
...);
extern
void
prom_write
(
const
char
*
buf
,
unsigned
int
len
);
extern
void
prom_write
(
const
char
*
buf
,
unsigned
int
len
);
/* Query for input device type */
/* Query for input device type */
...
@@ -215,7 +229,7 @@ extern int prom_getunumber(int syndrome_code,
...
@@ -215,7 +229,7 @@ extern int prom_getunumber(int syndrome_code,
char
*
buf
,
int
buflen
);
char
*
buf
,
int
buflen
);
/* Retain physical memory to the caller across soft resets. */
/* Retain physical memory to the caller across soft resets. */
extern
unsigned
long
prom_retain
(
char
*
name
,
extern
unsigned
long
prom_retain
(
c
onst
c
har
*
name
,
unsigned
long
pa_low
,
unsigned
long
pa_high
,
unsigned
long
pa_low
,
unsigned
long
pa_high
,
long
size
,
long
align
);
long
size
,
long
align
);
...
@@ -269,28 +283,28 @@ extern int prom_getsibling(int node);
...
@@ -269,28 +283,28 @@ extern int prom_getsibling(int node);
/* Get the length, at the passed node, of the given property type.
/* Get the length, at the passed node, of the given property type.
* Returns -1 on error (ie. no such property at this node).
* Returns -1 on error (ie. no such property at this node).
*/
*/
extern
int
prom_getproplen
(
int
thisnode
,
char
*
property
);
extern
int
prom_getproplen
(
int
thisnode
,
c
onst
c
har
*
property
);
/* Fetch the requested property using the given buffer. Returns
/* Fetch the requested property using the given buffer. Returns
* the number of bytes the prom put into your buffer or -1 on error.
* the number of bytes the prom put into your buffer or -1 on error.
*/
*/
extern
int
prom_getproperty
(
int
thisnode
,
char
*
property
,
extern
int
prom_getproperty
(
int
thisnode
,
c
onst
c
har
*
property
,
char
*
prop_buffer
,
int
propbuf_size
);
char
*
prop_buffer
,
int
propbuf_size
);
/* Acquire an integer property. */
/* Acquire an integer property. */
extern
int
prom_getint
(
int
node
,
char
*
property
);
extern
int
prom_getint
(
int
node
,
c
onst
c
har
*
property
);
/* Acquire an integer property, with a default value. */
/* Acquire an integer property, with a default value. */
extern
int
prom_getintdefault
(
int
node
,
char
*
property
,
int
defval
);
extern
int
prom_getintdefault
(
int
node
,
c
onst
c
har
*
property
,
int
defval
);
/* Acquire a boolean property, 0=FALSE 1=TRUE. */
/* Acquire a boolean property, 0=FALSE 1=TRUE. */
extern
int
prom_getbool
(
int
node
,
char
*
prop
);
extern
int
prom_getbool
(
int
node
,
c
onst
c
har
*
prop
);
/* Acquire a string property, null string on error. */
/* Acquire a string property, null string on error. */
extern
void
prom_getstring
(
int
node
,
char
*
prop
,
char
*
buf
,
int
bufsize
);
extern
void
prom_getstring
(
int
node
,
c
onst
c
har
*
prop
,
char
*
buf
,
int
bufsize
);
/* Does the passed node have the given "name"? YES=1 NO=0 */
/* Does the passed node have the given "name"? YES=1 NO=0 */
extern
int
prom_nodematch
(
int
thisnode
,
char
*
name
);
extern
int
prom_nodematch
(
int
thisnode
,
c
onst
c
har
*
name
);
/* Puts in buffer a prom name in the form name@x,y or name (x for which_io
/* Puts in buffer a prom name in the form name@x,y or name (x for which_io
* and y for first regs phys address
* and y for first regs phys address
...
@@ -300,7 +314,7 @@ extern int prom_getname(int node, char *buf, int buflen);
...
@@ -300,7 +314,7 @@ extern int prom_getname(int node, char *buf, int buflen);
/* Search all siblings starting at the passed node for "name" matching
/* Search all siblings starting at the passed node for "name" matching
* the given string. Returns the node on success, zero on failure.
* the given string. Returns the node on success, zero on failure.
*/
*/
extern
int
prom_searchsiblings
(
int
node_start
,
char
*
name
);
extern
int
prom_searchsiblings
(
int
node_start
,
c
onst
c
har
*
name
);
/* Return the first property type, as a string, for the given node.
/* Return the first property type, as a string, for the given node.
* Returns a null string on error. Buffer should be at least 32B long.
* Returns a null string on error. Buffer should be at least 32B long.
...
@@ -310,21 +324,21 @@ extern char *prom_firstprop(int node, char *buffer);
...
@@ -310,21 +324,21 @@ extern char *prom_firstprop(int node, char *buffer);
/* Returns the next property after the passed property for the given
/* Returns the next property after the passed property for the given
* node. Returns null string on failure. Buffer should be at least 32B long.
* node. Returns null string on failure. Buffer should be at least 32B long.
*/
*/
extern
char
*
prom_nextprop
(
int
node
,
char
*
prev_property
,
char
*
buffer
);
extern
char
*
prom_nextprop
(
int
node
,
c
onst
c
har
*
prev_property
,
char
*
buffer
);
/* Returns 1 if the specified node has given property. */
/* Returns 1 if the specified node has given property. */
extern
int
prom_node_has_property
(
int
node
,
char
*
property
);
extern
int
prom_node_has_property
(
int
node
,
c
onst
c
har
*
property
);
/* Returns phandle of the path specified */
/* Returns phandle of the path specified */
extern
int
prom_finddevice
(
char
*
name
);
extern
int
prom_finddevice
(
c
onst
c
har
*
name
);
/* Set the indicated property at the given node with the passed value.
/* Set the indicated property at the given node with the passed value.
* Returns the number of bytes of your value that the prom took.
* Returns the number of bytes of your value that the prom took.
*/
*/
extern
int
prom_setprop
(
int
node
,
char
*
prop_name
,
char
*
prop_value
,
extern
int
prom_setprop
(
int
node
,
c
onst
c
har
*
prop_name
,
char
*
prop_value
,
int
value_size
);
int
value_size
);
extern
int
prom_pathtoinode
(
char
*
path
);
extern
int
prom_pathtoinode
(
c
onst
c
har
*
path
);
extern
int
prom_inst2pkg
(
int
);
extern
int
prom_inst2pkg
(
int
);
/* CPU probing helpers. */
/* CPU probing helpers. */
...
@@ -334,7 +348,7 @@ int cpu_find_by_mid(int mid, int *prom_node);
...
@@ -334,7 +348,7 @@ int cpu_find_by_mid(int mid, int *prom_node);
/* Client interface level routines. */
/* Client interface level routines. */
extern
void
prom_set_trap_table
(
unsigned
long
tba
);
extern
void
prom_set_trap_table
(
unsigned
long
tba
);
extern
long
p1275_cmd
(
char
*
,
long
,
...);
extern
long
p1275_cmd
(
const
char
*
,
long
,
...);
#if 0
#if 0
...
...
include/asm-sparc64/pgtable.h
View file @
95001ee9
...
@@ -60,13 +60,13 @@
...
@@ -60,13 +60,13 @@
* table can map
* table can map
*/
*/
#define PMD_SHIFT (PAGE_SHIFT + (PAGE_SHIFT-3))
#define PMD_SHIFT (PAGE_SHIFT + (PAGE_SHIFT-3))
#define PMD_SIZE (
1UL
<< PMD_SHIFT)
#define PMD_SIZE (
_AC(1,UL)
<< PMD_SHIFT)
#define PMD_MASK (~(PMD_SIZE-1))
#define PMD_MASK (~(PMD_SIZE-1))
#define PMD_BITS (PAGE_SHIFT - 2)
#define PMD_BITS (PAGE_SHIFT - 2)
/* PGDIR_SHIFT determines what a third-level page table entry can map */
/* PGDIR_SHIFT determines what a third-level page table entry can map */
#define PGDIR_SHIFT (PAGE_SHIFT + (PAGE_SHIFT-3) + PMD_BITS)
#define PGDIR_SHIFT (PAGE_SHIFT + (PAGE_SHIFT-3) + PMD_BITS)
#define PGDIR_SIZE (
1UL
<< PGDIR_SHIFT)
#define PGDIR_SIZE (
_AC(1,UL)
<< PGDIR_SHIFT)
#define PGDIR_MASK (~(PGDIR_SIZE-1))
#define PGDIR_MASK (~(PGDIR_SIZE-1))
#define PGDIR_BITS (PAGE_SHIFT - 2)
#define PGDIR_BITS (PAGE_SHIFT - 2)
...
@@ -336,7 +336,8 @@ static inline void set_pte_at(struct mm_struct *mm, unsigned long addr, pte_t *p
...
@@ -336,7 +336,8 @@ static inline void set_pte_at(struct mm_struct *mm, unsigned long addr, pte_t *p
#define pte_clear(mm,addr,ptep) \
#define pte_clear(mm,addr,ptep) \
set_pte_at((mm), (addr), (ptep), __pte(0UL))
set_pte_at((mm), (addr), (ptep), __pte(0UL))
extern
pgd_t
swapper_pg_dir
[
1
];
extern
pgd_t
swapper_pg_dir
[
2048
];
extern
pmd_t
swapper_low_pmd_dir
[
2048
];
/* These do nothing with the way I have things setup. */
/* These do nothing with the way I have things setup. */
#define mmu_lockarea(vaddr, len) (vaddr)
#define mmu_lockarea(vaddr, len) (vaddr)
...
...
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