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
8d93229f
Commit
8d93229f
authored
Dec 18, 2002
by
Anton Blanchard
Browse files
Options
Browse Files
Download
Plain Diff
Merge samba.org:/scratch/anton/linux-2.5
into samba.org:/scratch/anton/for-alan
parents
4749dedc
e088a1dc
Changes
28
Hide whitespace changes
Inline
Side-by-side
Showing
28 changed files
with
361 additions
and
849 deletions
+361
-849
arch/ppc64/Makefile
arch/ppc64/Makefile
+20
-34
arch/ppc64/boot/Makefile
arch/ppc64/boot/Makefile
+85
-89
arch/ppc64/boot/main.c
arch/ppc64/boot/main.c
+6
-0
arch/ppc64/kernel/Makefile
arch/ppc64/kernel/Makefile
+25
-33
arch/ppc64/kernel/chrp_setup.c
arch/ppc64/kernel/chrp_setup.c
+1
-1
arch/ppc64/kernel/head.S
arch/ppc64/kernel/head.S
+11
-12
arch/ppc64/kernel/ioctl32.c
arch/ppc64/kernel/ioctl32.c
+8
-4
arch/ppc64/kernel/misc.S
arch/ppc64/kernel/misc.S
+4
-44
arch/ppc64/kernel/pSeries_pci.c
arch/ppc64/kernel/pSeries_pci.c
+1
-6
arch/ppc64/kernel/pci_dma.c
arch/ppc64/kernel/pci_dma.c
+16
-1
arch/ppc64/kernel/prom.c
arch/ppc64/kernel/prom.c
+12
-272
arch/ppc64/kernel/rtc.c
arch/ppc64/kernel/rtc.c
+57
-54
arch/ppc64/kernel/setup.c
arch/ppc64/kernel/setup.c
+6
-0
arch/ppc64/kernel/smp.c
arch/ppc64/kernel/smp.c
+6
-5
arch/ppc64/kernel/sys_ppc32.c
arch/ppc64/kernel/sys_ppc32.c
+32
-95
arch/ppc64/kernel/time.c
arch/ppc64/kernel/time.c
+6
-2
arch/ppc64/kernel/xics.c
arch/ppc64/kernel/xics.c
+1
-10
arch/ppc64/lib/Makefile
arch/ppc64/lib/Makefile
+5
-3
arch/ppc64/mm/Makefile
arch/ppc64/mm/Makefile
+2
-2
arch/ppc64/oprofile/Makefile
arch/ppc64/oprofile/Makefile
+2
-2
arch/ppc64/xmon/Makefile
arch/ppc64/xmon/Makefile
+2
-2
arch/ppc64/xmon/start.c
arch/ppc64/xmon/start.c
+3
-116
include/asm-ppc64/compat.h
include/asm-ppc64/compat.h
+31
-0
include/asm-ppc64/page.h
include/asm-ppc64/page.h
+1
-1
include/asm-ppc64/pgtable.h
include/asm-ppc64/pgtable.h
+2
-2
include/asm-ppc64/ppc32.h
include/asm-ppc64/ppc32.h
+11
-41
include/asm-ppc64/prom.h
include/asm-ppc64/prom.h
+1
-10
include/asm-ppc64/xics.h
include/asm-ppc64/xics.h
+4
-8
No files found.
arch/ppc64/Makefile
View file @
8d93229f
...
...
@@ -13,61 +13,47 @@
# Adjusted for PPC64 by Tom Gall
#
KERNELLOAD
=
0xc000000000000000
KERNELLOAD
=
0xc000000000000000
LDFLAGS
:=
-m
elf64ppc
LDFLAGS_vmlinux
=
-Bstatic
\
-e
$(KERNELLOAD)
-Ttext
$(KERNELLOAD)
LDFLAGS_vmlinux
=
-Bstatic
-e
$(KERNELLOAD)
-Ttext
$(KERNELLOAD)
LDFLAGS_BLOB
:=
--format
binary
--oformat
elf64-powerpc
CFLAGS
:=
$(CFLAGS)
-msoft-float
-pipe
\
CFLAGS
+=
-msoft-float
-pipe
\
-Wno-uninitialized
-mminimal-toc
-mtraceback
=
full
\
-finline-limit-2000
-mcpu
=
power4
CPP
=
$(CC)
-E
$(CFLAGS)
HEAD
:=
arch
/ppc64/kernel/head.o
core-y
+=
arch
/ppc64/kernel/
arch
/ppc64/mm/
arch
/ppc64/lib/
core-$(CONFIG_XMON)
+=
arch
/ppc64/xmon/
# FIXME: is drivers- right ?
drivers-$(CONFIG_OPROFILE)
+=
arch
/ppc64/oprofile/
makeboot
=
$(
call
descend,arch/ppc64/boot,
$(1)
)
ifdef
CONFIG_PPC_PSERIES
BOOT_TARGETS
=
zImage zImage.initrd
endif
libs-y
+=
arch
/ppc64/lib/
core-y
+=
arch
/ppc64/kernel/
core-y
+=
arch
/ppc64/mm/
core-$(CONFIG_XMON)
+=
arch
/ppc64/xmon/
drivers-$(CONFIG_OPROFILE)
+=
arch
/ppc64/oprofile/
ifdef
CONFIG_PPC_ISERIES
BOOT_TARGETS
=
vmlinux.sminitrd vmlinux.initrd vmlinux.sm
endif
makeboot
=
$(Q)$(MAKE)
-f
scripts/Makefile.build
obj
=
arch
/ppc64/boot
$(1)
$(BOOT_TARGETS)
:
vmlinux
@
$(
call
makeboot,arch/ppc64/boot/
$@
)
boottarget-$(CONFIG_PPC_PSERIES)
:=
zImage zImage.initrd
boottarget-$(CONFIG_PPC_ISERIES)
:=
vmlinux.sminitrd vmlinux.initrd vmlinux.sm
$(boottarget-y)
:
vmlinux
$(
call
makeboot,arch/ppc64/boot/
$@
)
%_config
:
arch/ppc64/configs/%_defconfig
rm
-f
.config
arch
/ppc64/defconfig
cp
-f
arch
/ppc64/configs/
$
(
@:config
=
defconfig
)
arch
/ppc64/defconfig
archclean
:
@
$(
call
makeboot,clean
)
$(Q)$(MAKE)
-f
scripts/Makefile.clean
obj
=
arch
/ppc64/boot
archmrproper
:
prepare
:
include/asm-ppc64/offsets.h
prepare
:
include/asm-$(ARCH)/offsets.h
arch/$(ARCH)/kernel/asm-offsets.s
:
include/asm include/linux/version.h
\
arch/ppc64/kernel/asm-offsets.s
:
include/asm include/linux/version.h
\
include/config/MARKER
include/asm-$(ARCH)/offsets.h.tmp
:
arch/$(ARCH)/kernel/asm-offsets.s
@
$
(
generate-asm-offsets.h
)
<
$<
>
$@
include/asm-$(ARCH)/offsets.h
:
include/asm-$(ARCH)/offsets.h.tmp
include/asm-ppc64/offsets.h
:
arch/ppc64/kernel/asm-offsets.s
@
echo
-n
' Generating $@'
@
$
(
generate-asm-offsets.h
)
<
$<
>
$@
.tmp
@
$
(
update-if-changed
)
CLEAN_FILES
+=
include/asm-
$(ARCH)
/offsets.h.tmp
\
include/asm-
$(ARCH)
/offsets.h
CLEAN_FILES
+=
include/asm-
ppc64
/offsets.h.tmp
\
include/asm-
ppc64
/offsets.h
arch/ppc64/boot/Makefile
View file @
8d93229f
...
...
@@ -23,92 +23,88 @@
CROSS32_COMPILE
=
#CROSS32_COMPILE = /usr/local/ppc/bin/powerpc-linux-
BOOTCC
=
$(CROSS32_COMPILE)
gcc
BOOTCFLAGS
=
$(HOSTCFLAGS)
-I
$(objtree)
/include
BOOTLD
=
$(CROSS32_COMPILE)
ld
BOOTAS
=
$(CROSS32_COMPILE)
as
BOOTAFLAGS
=
-D__ASSEMBLY__
$(HOSTCFLAGS)
$(obj)/start.o
:
$(obj)/start.c
$(BOOTCC)
$(BOOTCFLAGS)
-c
-o
$*
.o
$<
$(obj)/main.o
:
$(obj)/main.c
$(BOOTCC)
$(BOOTCFLAGS)
-c
-o
$*
.o
$<
$(obj)/zlib.o
:
$(obj)/zlib.c
$(BOOTCC)
$(BOOTCFLAGS)
-c
-o
$*
.o
$<
$(obj)/imagesize.o
:
$(obj)/imagesize.c
$(BOOTCC)
$(BOOTCFLAGS)
-c
-o
$*
.o
$<
$(obj)/no_initrd.o
:
$(obj)/no_initrd.c
$(BOOTCC)
$(BOOTCFLAGS)
-c
-o
$*
.o
$<
$(obj)/crt0.o
:
$(obj)/crt0.S
$(BOOTCC)
$(BOOTAFLAGS)
-traditional
-c
-o
$*
.o
$<
CFLAGS
=
$(CPPFLAGS)
-O
-fno-builtin
-DSTDC_HEADERS
LD_ARGS
=
-Ttext
0x00400000
-e
_start
OBJCOPYFLAGS
:=
-S
-O
binary
OBJS
=
$(
addprefix
$(obj)
/,crt0.o start.o main.o zlib.o image.o imagesize.o
)
ifeq
($(CONFIG_PPC_ISERIES),y)
boot
:
vmlinux.sm
$(obj)/addSystemMap
:
$(obj)/addSystemMap.c
$(HOSTCC)
$(HOSTCFLAGS)
-o
$@
$<
$(obj)/vmlinux.sm
:
vmlinux $(obj)/addSystemMap
$(obj)
/addSystemMap System.map vmlinux
$(obj)
/vmlinux.sm
$(obj)/addRamDisk
:
$(obj)/addRamDisk.c
$(HOSTCC)
$(HOSTCFLAGS)
-o
$@
$<
$(obj)/vmlinux.initrd
:
vmlinux $(obj)/addRamDisk $(obj)/ramdisk.image.gz System.map
$(obj)
/addRamDisk
$(obj)
/ramdisk.image.gz System.map vmlinux
$(obj)
/vmlinux.initrd
$(obj)/vmlinux.sminitrd
:
$(obj)/vmlinux.sm $(obj)/addRamDisk $(obj)/ramdisk.image.gz System.map
$(obj)
/addRamDisk
$(obj)
/ramdisk.image.gz System.map
$(obj)
/vmlinux.sm
$(obj)
/vmlinux.sminitrd
else
boot
:
zImage
endif
$(obj)/piggyback
:
$(obj)/piggyback.c
$(HOSTCC)
$(HOSTCFLAGS)
-DKERNELBASE
=
$(KERNELBASE)
-o
$@
$<
$(obj)/addnote
:
$(obj)/addnote.c
$(HOSTCC)
$(HOSTCFLAGS)
-o
$@
$<
$(obj)/image.o
:
$(obj)/piggyback $(obj)/vmlinux.gz
$(obj)
/piggyback
$(obj)
/image <
$(obj)
/vmlinux.gz |
$(BOOTAS)
-o
$@
$(obj)/sysmap.o
:
$(obj)/piggyback System.map
$(obj)
/piggyback
$(obj)
/sysmap < System.map |
$(BOOTAS)
-o
$(obj)
/sysmap.o
$(obj)/initrd.o
:
$(obj)/ramdisk.image.gz $(obj)/piggyback
$(obj)
/piggyback
$(obj)
/initrd <
$(obj)
/ramdisk.image.gz |
$(BOOTAS)
-o
$(obj)
/initrd.o
$(obj)/zImage
:
$(OBJS) $(obj)/no_initrd.o $(obj)/addnote
$(BOOTLD)
$(LD_ARGS)
-T
$(obj)
/zImage.lds
-o
$@
$(OBJS)
$(obj)
/no_initrd.o
$(obj)
/addnote
$@
$(obj)/zImage.initrd
:
$(OBJS) $(obj)/initrd.o $(obj)/addnote
$(BOOTLD)
$(LD_ARGS)
-T
$(obj)
/zImage.lds
-o
$@
$(OBJS)
$(obj)
/initrd.o
./addnote
$@
$(obj)/vmlinux.gz
:
vmlinux
$(OBJCOPY)
$(OBJCOPYFLAGS)
vmlinux
$(obj)
/vmlinux
ls
-l
$(obj)
/vmlinux |
awk
'{printf "/* generated -- do not edit! */\nint uncompressed_size = %d;\n", $$5}'
>
$(obj)
/imagesize.c
$(CROSS_COMPILE)
nm
-n
vmlinux |
tail
-1
|
awk
'{printf "long vmlinux_end = 0x%s;\n", substr($$1,8)}'
>>
$(obj)
/imagesize.c
gzip
-vf9
$(obj)
/vmlinux
$(obj)/imagesize.c
:
$(obj)/vmlinux.gz
clean
:
@
rm
-f
$(OBJS)
@
rm
-f
$(
addprefix
$(obj)
/,piggyback note addnote zImage
\
zImage.initrd vmlinux.gz no_initrd.o imagesize.c addSystemMap
\
vmlinux.sm addRamDisk vmlinux.initrd vmlinux.sminitrd
)
BOOTCC
:=
$(CROSS32_COMPILE)
gcc
BOOTCFLAGS
:=
$(HOSTCFLAGS)
-Iinclude
BOOTLD
:=
$(CROSS32_COMPILE)
ld
BOOTAS
:=
$(CROSS32_COMPILE)
as
BOOTAFLAGS
:=
-D__ASSEMBLY__
$(HOSTCFLAGS)
CFLAGS
:=
$(CPPFLAGS)
-O
-fno-builtin
-DSTDC_HEADERS
LD_ARGS
:=
-Ttext
0x00400000
-e
_start
OBJCOPYFLAGS
:=
-S
-O
binary
obj-boot
:=
start.o main.o zlib.o imagesize.o no_initrd.o
OBJS
:=
crt0.o start.o main.o zlib.o imagesize.o image.o
obj-boot
:=
$(
addprefix
$(obj)
/,
$
(
obj-boot
))
OBJS
:=
$(
addprefix
$(obj)
/,
$(OBJS)
)
targets
+=
$
(
obj-boot
)
$(
addprefix
$(obj)
/,image.c image.o
)
quiet_cmd_bootcc
=
BOOTCC
$@
cmd_bootcc
=
$(BOOTCC)
-Wp
,-MD,
$(depfile)
$(BOOTCFLAGS)
-c
-o
$@
$<
$(obj-boot)
:
%.o: %.c FORCE
$(
call
if_changed_dep,bootcc
)
quiet_cmd_bootas
=
BOOTAS
$@
cmd_bootas
=
$(BOOTCC)
-Wp
,-MD,
$(depfile)
$(BOOTAFLAGS)
-traditional
\
-c
-o
$@
$<
$(obj)/crt0.o
:
%.o: %.S FORCE
$(
call
if_changed_dep,bootas
)
host-progs
:=
piggyback addnote addSystemMap addRamDisk
HOSTCFLAGS_piggyback.o
:=
-DKERNELBASE
=
$(KERNELBASE)
EXTRA_TARGETS
+=
zImage zImage.initrd vmlinux.bin vmlinux.gz
\
vmlinux.sm vmlinux.initrd vmlinux.sminitrd
\
sysmap.o initrd.o
quiet_cmd_sysmap
=
SYSMAP
$@
cmd_sysmap
=
$(obj)
/addSystemMap System.map
$<
$@
$(obj)/vmlinux.sm
:
vmlinux $(obj)/addSystemMap System.map FORCE
$(
call
if_changed,sysmap
)
quiet_cmd_ramdisk
=
RAMDISK
$@
cmd_ramdisk
=
$(obj)
/addRamDisk
$(obj)
/ramdisk.image.gz System.map
$<
$@
$(obj)/vmlinux.initrd
:
vmlinux $(obj)/addRamDisk $(obj)/ramdisk.image.gz System.map FORCE
$(
call
if_changed,ramdisk
)
$(obj)/vmlinux.sminitrd
:
$(obj)/vmlinux.sm $(obj)/addRamDisk $(obj)/ramdisk.image.gz FORCE
$(
call
if_changed,ramdisk
)
quiet_cmd_piggy
=
PIGGY
$@
cmd_piggy
=
$(obj)
/piggyback
$
(
@:.o
=)
<
$<
|
$(BOOTAS)
-o
$@
$(obj)/image.o
:
$(obj)/vmlinux.gz $(obj)/piggyback FORCE
$(
call
if_changed,piggy
)
$(obj)/sysmap.o
:
System.map $(obj)/piggyback FORCE
$(
call
if_changed,piggy
)
$(obj)/initrd.o
:
$(obj)/ramdisk.image.gz $(obj)/piggyback FORCE
$(
call
if_changed,piggy
)
quiet_cmd_addnote
=
ADDNOTE
$@
cmd_addnote
=
$(BOOTLD)
$(LD_ARGS)
-T
$(obj)
/zImage.lds
-o
$@
$(OBJS)
$<
\
&&
$(obj)
/addnote
$@
$(obj)/zImage
:
$(obj)/no_initrd.o $(OBJS) $(obj)/addnote FORCE
$(
call
if_changed,addnote
)
$(obj)/zImage.initrd
:
$(obj)/initrd.o $(OBJS) $(obj)/addnote FORCE
$(
call
if_changed,addnote
)
$(obj)/vmlinux.bin
:
vmlinux FORCE
$(
call
if_changed,objcopy
)
$(obj)/vmlinux.gz
:
$(obj)/vmlinux.bin FORCE
$(
call
if_changed,gzip
)
$(obj)/imagesize.c
:
vmlinux
@
echo
Generating
$@
ls
-l
vmlinux |
\
awk
'{printf "/* generated -- do not edit! */\n" \
"int uncompressed_size = %d;\n", $$5}'
>
$(obj)
/imagesize.c
$(CROSS_COMPILE)
nm
-n
vmlinux |
tail
-1
|
\
awk
'{printf "long vmlinux_end = 0x%s;\n", substr($$1,8)}'
\
>>
$(obj)
/imagesize.c
clean-files
:=
$(targets)
arch/ppc64/boot/main.c
View file @
8d93229f
...
...
@@ -14,6 +14,8 @@
#include <asm/page.h>
#include <asm/bootinfo.h>
#undef DEBUG
void
memmove
(
void
*
dst
,
void
*
im
,
int
len
);
extern
void
*
finddevice
(
const
char
*
);
...
...
@@ -90,7 +92,9 @@ chrpboot(unsigned long a1, unsigned long a2, void *prom)
for
(
claim_addr
=
PROG_START
;
claim_addr
<=
PROG_START
*
8
;
claim_addr
+=
0x100000
)
{
#ifdef DEBUG
printf
(
" trying: 0x%08lx
\n\r
"
,
claim_addr
);
#endif
dst
=
claim
(
claim_addr
,
uncompressed_size
,
0
);
if
(
dst
!=
(
void
*
)
-
1
)
break
;
}
...
...
@@ -118,6 +122,7 @@ chrpboot(unsigned long a1, unsigned long a2, void *prom)
bi_recs
=
make_bi_recs
((
unsigned
long
)
dst
+
vmlinux_end
);
kernel_entry
=
(
kernel_entry_t
)
dst
;
#ifdef DEBUG
printf
(
"kernel:
\n\r
"
" entry addr = 0x%lx
\n\r
"
" a1 = 0x%lx,
\n\r
"
...
...
@@ -126,6 +131,7 @@ chrpboot(unsigned long a1, unsigned long a2, void *prom)
" bi_recs = 0x%lx,
\n\r
"
,
(
unsigned
long
)
kernel_entry
,
a1
,
a2
,
(
unsigned
long
)
prom
,
(
unsigned
long
)
bi_recs
);
#endif
kernel_entry
(
a1
,
a2
,
prom
,
bi_recs
);
...
...
arch/ppc64/kernel/Makefile
View file @
8d93229f
#
# Makefile for the linux kernel.
# Makefile for the linux
ppc64
kernel.
#
EXTRA_CFLAGS
=
-mno-minimal-toc
KHEAD
:=
head.o
EXTRA_TARGETS
:=
$(KHEAD)
export-objs
:=
ppc_ksyms.o
EXTRA_CFLAGS
+=
-mno-minimal-toc
EXTRA_TARGETS
:=
head.o
export-objs
:=
ppc_ksyms.o
obj-y
:=
ppc_ksyms.o setup.o entry.o traps.o irq.o idle.o
\
time.o process.o signal.o syscalls.o misc.o ptrace.o
\
align.o semaphore.o bitops.o stab.o htab.o pacaData.o
\
LparData.o udbg.o binfmt_elf32.o sys_ppc32.o sys32.o
\
ioctl32.o ptrace32.o signal32.o open_pic.o xics.o
\
pmc.o mf_proc.o proc_pmc.o iSeries_setup.o
\
ItLpQueue.o hvCall.o mf.o HvLpEvent.o ras.o
\
iSeries_proc.o HvCall.o HvLpConfig.o
\
rtc.o init_task.o pSeries_htab.o
obj-$(CONFIG_PCI)
+=
pci.o pci_dn.o pci_dma.o
ifeq
($(CONFIG_PPC_ISERIES),y)
obj-$(CONFIG_PCI)
+=
iSeries_pci.o iSeries_pci_reset.o iSeries_IoMmTable.o iSeries_irq.o iSeries_VpdInfo.o XmPciLpEvent.o
endif
ifeq
($(CONFIG_PPC_PSERIES),y)
obj-$(CONFIG_PCI)
+=
pSeries_pci.o pSeries_lpar.o pSeries_hvCall.o eeh.o
obj-y
+=
rtasd.o nvram.o
endif
obj-$(CONFIG_RTAS_FLASH)
+=
rtas_flash.o
obj-$(CONFIG_SMP)
+=
smp.o
obj-$(CONFIG_PROFILING)
+=
profile.o
obj-y
+=
prom.o lmb.o rtas.o rtas-proc.o chrp_setup.o i8259.o
udbg.o binfmt_elf32.o sys_ppc32.o sys32.o ioctl32.o
\
ptrace32.o signal32.o pmc.o rtc.o init_task.o
\
lmb.o pci.o pci_dn.o pci_dma.o
obj-$(CONFIG_PPC_ISERIES)
+=
iSeries_pci.o iSeries_pci_reset.o
\
iSeries_IoMmTable.o iSeries_irq.o
\
iSeries_VpdInfo.o XmPciLpEvent.o
\
HvCall.o HvLpConfig.o LparData.o mf_proc.o
\
proc_pmc.o iSeries_setup.o ItLpQueue.o hvCall.o
\
mf.o HvLpEvent.o iSeries_proc.o
obj-$(CONFIG_PPC_PSERIES)
+=
pSeries_pci.o pSeries_lpar.o pSeries_hvCall.o
\
eeh.o rtasd.o nvram.o
# Change this to pSeries only once we've got iSeries up to date
obj-y
+=
open_pic.o xics.o pSeries_htab.o rtas.o
\
rtas-proc.o chrp_setup.o i8259.o ras.o prom.o
obj-$(CONFIG_RTAS_FLASH)
+=
rtas_flash.o
obj-$(CONFIG_SMP)
+=
smp.o
obj-$(CONFIG_PROFILING)
+=
profile.o
arch/ppc64/kernel/chrp_setup.c
View file @
8d93229f
...
...
@@ -60,7 +60,7 @@
#include "i8259.h"
#include "open_pic.h"
#include
"xics.h"
#include
<asm/xics.h>
#include <asm/ppcdebug.h>
extern
volatile
unsigned
char
*
chrp_int_ack_special
;
...
...
arch/ppc64/kernel/head.S
View file @
8d93229f
...
...
@@ -79,7 +79,7 @@
_stext
:
_STATIC
(
__start
)
b
.
__start_initialization_pSeries
#ifdef CONFIG_PPC_ISERIES
/
*
At
offset
0x20
,
there
is
a
pointer
to
iSeries
LPAR
data
.
*
This
is
required
by
the
hypervisor
*/
.
=
0x20
...
...
@@ -90,9 +90,7 @@ _STATIC(__start)
*
between
physical
addresses
and
absolute
addresses
)
and
*
to
the
pidhash
table
(
also
used
by
the
debugger
)
*/
.
llong
msChunks
-
KERNELBASE
#ifdef CONFIG_PPC_ISERIES
.
llong
pidhash
-
KERNELBASE
#endif
/
*
Offset
0x38
-
Pointer
to
start
of
embedded
System
.
map
*/
.
globl
embedded_sysmap_start
...
...
@@ -102,6 +100,7 @@ embedded_sysmap_start:
.
globl
embedded_sysmap_end
embedded_sysmap_end
:
.
llong
0
#endif
/
*
Secondary
processors
spin
on
this
value
until
it
goes
to
1
.
*/
.
globl
__secondary_hold_spinloop
...
...
@@ -365,11 +364,15 @@ __start_interupts:
*
point
to
itVpdAreas
.
On
pSeries
native
,
this
value
is
not
used
.
*/
.
=
0x4000
.
globl
__end_interupts
.
globl
__end_inter
r
upts
.
globl
__start_naca
__end_interupts
:
__start_naca
:
#ifdef CONFIG_PPC_ISERIES
.
llong
itVpdAreas
#else
.
llong
0x0
#endif
.
llong
0x0
.
llong
0x0
.
llong
paca
...
...
@@ -390,6 +393,7 @@ __start_stab:
.
globl
__end_stab
__end_stab
:
#ifdef CONFIG_PPC_ISERIES
/
*
*
The
iSeries
LPAR
map
is
at
this
fixed
address
*
so
that
the
HvReleaseData
structure
can
address
...
...
@@ -503,7 +507,7 @@ maskable_exception_exit:
mfspr
r21
,
SPRG1
mfspr
r20
,
SPRG2
rfid
#endif
/*
*
Data
area
reserved
for
FWNMI
option
.
*/
...
...
@@ -1217,7 +1221,7 @@ _GLOBAL(pseries_secondary_smp_init)
#endif
#endif
b
1
b
/*
Loop
until
told
to
go
*/
#ifdef CONFIG_PPC_ISERIES
_GLOBAL
(
__start_initialization_iSeries
)
LOADADDR
(
r1
,
init_thread_union
)
...
...
@@ -1241,6 +1245,7 @@ _GLOBAL(__start_initialization_iSeries)
bl
.
iSeries_fixup_klimit
b
.
start_here_common
#endif
_GLOBAL
(
__start_initialization_pSeries
)
mr
r31
,
r3
/*
save
parameters
*/
...
...
@@ -1248,9 +1253,6 @@ _GLOBAL(__start_initialization_pSeries)
mr
r29
,
r5
mr
r28
,
r6
mr
r27
,
r7
mr
r26
,
r8
/*
YABOOT
:
debug_print
()
routine
*/
mr
r25
,
r9
/*
YABOOT
:
debug_delay
()
routine
*/
mr
r24
,
r10
/*
YABOOT
:
debug_prom
()
routine
*/
bl
.
enable_64b_mode
...
...
@@ -1295,9 +1297,6 @@ _GLOBAL(__start_initialization_pSeries)
mr
r5
,
r29
mr
r6
,
r28
mr
r7
,
r27
mr
r8
,
r26
mr
r9
,
r25
mr
r10
,
r24
bl
.
prom_init
...
...
arch/ppc64/kernel/ioctl32.c
View file @
8d93229f
...
...
@@ -1722,9 +1722,9 @@ out: if (data)
struct
loop_info32
{
int
lo_number
;
/* ioctl r/o */
__kernel_dev_t32
lo_device
;
/* ioctl r/o */
compat_dev_t
lo_device
;
/* ioctl r/o */
unsigned
int
lo_inode
;
/* ioctl r/o */
__kernel_dev_t32
lo_rdevice
;
/* ioctl r/o */
compat_dev_t
lo_rdevice
;
/* ioctl r/o */
int
lo_offset
;
int
lo_encrypt_type
;
int
lo_encrypt_key_size
;
/* ioctl w/o */
...
...
@@ -2054,7 +2054,7 @@ static int do_smb_getmountuid(unsigned int fd, unsigned int cmd, unsigned long a
set_fs
(
old_fs
);
if
(
err
>=
0
)
err
=
put_user
(
kuid
,
(
__kernel_uid_t32
*
)
arg
);
err
=
put_user
(
kuid
,
(
compat_uid_t
*
)
arg
);
return
err
;
}
...
...
@@ -3656,7 +3656,7 @@ struct ioctl_trans {
#define HANDLE_IOCTL(cmd,handler) { cmd, (unsigned long)handler, 0 }
#define AUTOFS_IOC_SETTIMEOUT32 _IOWR(0x93,0x64,unsigned int)
#define SMB_IOC_GETMOUNTUID_32 _IOR('u', 1,
__kernel_uid_t32
)
#define SMB_IOC_GETMOUNTUID_32 _IOR('u', 1,
compat_uid_t
)
static
struct
ioctl_trans
ioctl_translations
[]
=
{
/* List here explicitly which ioctl's need translation,
...
...
@@ -3705,6 +3705,7 @@ COMPATIBLE_IOCTL(TIOCSSERIAL),
COMPATIBLE_IOCTL
(
TIOCSERGETLSR
),
COMPATIBLE_IOCTL
(
TIOCSLTC
),
/* Big F */
#if 0
COMPATIBLE_IOCTL(FBIOGET_VSCREENINFO),
COMPATIBLE_IOCTL(FBIOPUT_VSCREENINFO),
COMPATIBLE_IOCTL(FBIOPAN_DISPLAY),
...
...
@@ -3715,6 +3716,7 @@ COMPATIBLE_IOCTL(FBIOGET_CURSORSTATE),
COMPATIBLE_IOCTL(FBIOPUT_CURSORSTATE),
COMPATIBLE_IOCTL(FBIOGET_CON2FBMAP),
COMPATIBLE_IOCTL(FBIOPUT_CON2FBMAP),
#endif
#if 0
COMPATIBLE_IOCTL(FBIOBLANK),
#endif
...
...
@@ -4391,10 +4393,12 @@ HANDLE_IOCTL(GIO_FONTX, do_fontx_ioctl),
HANDLE_IOCTL
(
PIO_UNIMAP
,
do_unimap_ioctl
),
HANDLE_IOCTL
(
GIO_UNIMAP
,
do_unimap_ioctl
),
HANDLE_IOCTL
(
KDFONTOP
,
do_kdfontop_ioctl
),
#if 0
HANDLE_IOCTL(FBIOGET_FSCREENINFO, do_fbioget_fscreeninfo_ioctl),
HANDLE_IOCTL(FBIOGETCMAP, do_fbiogetcmap_ioctl),
HANDLE_IOCTL(FBIOPUTCMAP, do_fbioputcmap_ioctl),
#endif
#endif
HANDLE_IOCTL
(
EXT2_IOC32_GETFLAGS
,
do_ext2_ioctl
),
HANDLE_IOCTL
(
EXT2_IOC32_SETFLAGS
,
do_ext2_ioctl
),
HANDLE_IOCTL
(
EXT2_IOC32_GETVERSION
,
do_ext2_ioctl
),
...
...
arch/ppc64/kernel/misc.S
View file @
8d93229f
...
...
@@ -398,46 +398,6 @@ _GLOBAL(_outsl_ns)
bdnz
00
b
blr
/*
*
Extended
precision
shifts
*
*
R3
/
R4
has
64
bit
value
*
R5
has
shift
count
*
result
in
R3
/
R4
*
*
ashrdi3
:
XXXYYY
/
ZZZAAA
->
SSSXXX
/
YYYZZZ
*
ashldi3
:
XXXYYY
/
ZZZAAA
->
YYYZZZ
/
AAA000
*
lshrdi3
:
XXXYYY
/
ZZZAAA
->
000
XXX
/
YYYZZZ
*/
/*
MIKEC
:
These
may
no
longer
be
needed
...
what
does
gcc
expect
?
*/
_GLOBAL
(
__ashrdi3
)
li
r6
,
32
sub
r6
,
r6
,
r5
slw
r7
,
r3
,
r6
/*
isolate
YYY
*/
srw
r4
,
r4
,
r5
/*
isolate
ZZZ
*/
or
r4
,
r4
,
r7
/*
YYYZZZ
*/
sraw
r3
,
r3
,
r5
/*
SSSXXX
*/
blr
_GLOBAL
(
__ashldi3
)
li
r6
,
32
sub
r6
,
r6
,
r5
srw
r7
,
r4
,
r6
/*
isolate
ZZZ
*/
slw
r4
,
r4
,
r5
/*
AAA000
*/
slw
r3
,
r3
,
r5
/*
YYY
---
*/
or
r3
,
r3
,
r7
/*
YYYZZZ
*/
blr
_GLOBAL
(
__lshrdi3
)
li
r6
,
32
sub
r6
,
r6
,
r5
slw
r7
,
r3
,
r6
/*
isolate
YYY
*/
srw
r4
,
r4
,
r5
/*
isolate
ZZZ
*/
or
r4
,
r4
,
r7
/*
YYYZZZ
*/
srw
r3
,
r3
,
r5
/*
000
XXX
*/
blr
_GLOBAL
(
abs
)
cmpi
0
,
r3
,
0
bge
10
f
...
...
@@ -551,7 +511,7 @@ _GLOBAL(sys_call_table32)
.
llong
.
sys_rmdir
/*
40
*/
.
llong
.
sys_dup
.
llong
.
sys_pipe
.
llong
.
sys32
_times
.
llong
.
compat_sys
_times
.
llong
.
sys_ni_syscall
/*
old
prof
syscall
*/
.
llong
.
sys_brk
/*
45
*/
.
llong
.
sys_setgid
...
...
@@ -614,9 +574,9 @@ _GLOBAL(sys_call_table32)
.
llong
.
sys32_syslog
.
llong
.
compat_sys_setitimer
.
llong
.
compat_sys_getitimer
/*
105
*/
.
llong
.
sys32
_newstat
.
llong
.
sys32
_newlstat
.
llong
.
sys32
_newfstat
.
llong
.
compat_sys
_newstat
.
llong
.
compat_sys
_newlstat
.
llong
.
compat_sys
_newfstat
.
llong
.
sys_uname
.
llong
.
sys_ni_syscall
/*
110
old
iopl
syscall
*/
.
llong
.
sys_vhangup
...
...
arch/ppc64/kernel/pSeries_pci.c
View file @
8d93229f
...
...
@@ -40,7 +40,6 @@
#include <asm/naca.h>
#include <asm/pci_dma.h>
#include "xics.h"
#include "open_pic.h"
#include "pci.h"
...
...
@@ -402,7 +401,7 @@ alloc_phb(struct device_node *dev, char *model, unsigned int addr_size_words)
* Python
***************************************************************/
if
(
strstr
(
model
,
"Python"
))
{
unsigned
long
chip_regs
;
void
*
chip_regs
;
volatile
u32
*
tmp
,
i
;
PPCDBG
(
PPCDBG_PHBINIT
,
"
\t
Create python
\n
"
);
...
...
@@ -608,10 +607,6 @@ pSeries_pcibios_fixup(void)
pci_read_irq_line
(
dev
);
PPCDBGCALL
(
PPCDBG_PHBINIT
,
dumpPci_Dev
(
dev
)
);
}
if
(
naca
->
interrupt_controller
==
IC_PPC_XIC
)
{
xics_isa_init
();
}
}
/***********************************************************************
...
...
arch/ppc64/kernel/pci_dma.c
View file @
8d93229f
...
...
@@ -147,6 +147,7 @@ static unsigned long __inline__ count_leading_zeros64( unsigned long x )
return
lz
;
}
#ifdef CONFIG_PPC_ISERIES
static
void
tce_build_iSeries
(
struct
TceTable
*
tbl
,
long
tcenum
,
unsigned
long
uaddr
,
int
direction
)
{
...
...
@@ -180,7 +181,9 @@ static void tce_build_iSeries(struct TceTable *tbl, long tcenum,
panic
(
"PCI_DMA: HvCallXm_setTce failed, Rc: 0x%lx
\n
"
,
setTceRc
);
}
}
#endif
#ifdef CONFIG_PPC_PSERIES
static
void
tce_build_pSeries
(
struct
TceTable
*
tbl
,
long
tcenum
,
unsigned
long
uaddr
,
int
direction
)
{
...
...
@@ -199,8 +202,8 @@ static void tce_build_pSeries(struct TceTable *tbl, long tcenum,
tce_addr
=
((
union
Tce
*
)
tbl
->
base
)
+
tcenum
;
*
tce_addr
=
(
union
Tce
)
tce
.
wholeTce
;
}
#endif
/*
* Build a TceTable structure. This contains a multi-level bit map which
...
...
@@ -548,6 +551,7 @@ static inline dma_addr_t get_tces( struct TceTable *tbl, unsigned order, void *p
return
retTce
;
}
#ifdef CONFIG_PPC_ISERIES
static
void
tce_free_one_iSeries
(
struct
TceTable
*
tbl
,
long
tcenum
)
{
u64
set_tce_rc
;
...
...
@@ -560,7 +564,9 @@ static void tce_free_one_iSeries( struct TceTable *tbl, long tcenum )
panic
(
"PCI_DMA: HvCallXm_setTce failed, Rc: 0x%lx
\n
"
,
set_tce_rc
);
}
#endif
#ifdef CONFIG_PPC_PSERIES
static
void
tce_free_one_pSeries
(
struct
TceTable
*
tbl
,
long
tcenum
)
{
union
Tce
tce
;
...
...
@@ -572,6 +578,7 @@ static void tce_free_one_pSeries( struct TceTable *tbl, long tcenum )
*
tce_addr
=
(
union
Tce
)
tce
.
wholeTce
;
}
#endif
static
void
tce_free
(
struct
TceTable
*
tbl
,
dma_addr_t
dma_addr
,
unsigned
order
,
unsigned
num_pages
)
...
...
@@ -609,6 +616,7 @@ static void tce_free(struct TceTable *tbl, dma_addr_t dma_addr,
free_tce_range
(
tbl
,
free_tce
,
order
);
}
#ifdef CONFIG_PPC_ISERIES
void
__init
create_virtual_bus_tce_table
(
void
)
{
struct
TceTable
*
t
;
...
...
@@ -661,6 +669,7 @@ void __init create_virtual_bus_tce_table(void)
}
else
printk
(
"Virtual Bus VIO TCE table failed.
\n
"
);
}
#endif
void
create_tce_tables_for_buses
(
struct
list_head
*
bus_list
)
{
...
...
@@ -842,6 +851,7 @@ static struct TceTable* findHwTceTable(struct TceTable * newTceTable )
static
void
getTceTableParmsiSeries
(
struct
iSeries_Device_Node
*
DevNode
,
struct
TceTable
*
newTceTable
)
{
#ifdef CONFIG_PPC_ISERIES
struct
TceTableManagerCB
*
pciBusTceTableParms
=
(
struct
TceTableManagerCB
*
)
kmalloc
(
sizeof
(
struct
TceTableManagerCB
),
GFP_KERNEL
);
if
(
pciBusTceTableParms
==
NULL
)
panic
(
"PCI_DMA: TCE Table Allocation failed."
);
...
...
@@ -872,6 +882,7 @@ static void getTceTableParmsiSeries(struct iSeries_Device_Node* DevNode,
newTceTable
->
tceType
=
TCE_PCI
;
kfree
(
pciBusTceTableParms
);
#endif
}
static
void
getTceTableParmsPSeries
(
struct
pci_controller
*
phb
,
...
...
@@ -1440,15 +1451,19 @@ void pci_unmap_sg(struct pci_dev *pdev, struct scatterlist *sglist, int nelems,
}
#endif
#ifdef CONFIG_PPC_PSERIES
/* These are called very early. */
void
tce_init_pSeries
(
void
)
{
ppc_md
.
tce_build
=
tce_build_pSeries
;
ppc_md
.
tce_free_one
=
tce_free_one_pSeries
;
}
#endif
#ifdef CONFIG_PPC_ISERIES
void
tce_init_iSeries
(
void
)
{
ppc_md
.
tce_build
=
tce_build_iSeries
;
ppc_md
.
tce_free_one
=
tce_free_one_iSeries
;
}
#endif
arch/ppc64/kernel/prom.c
View file @
8d93229f
...
...
@@ -15,10 +15,6 @@
* 2 of the License, or (at your option) any later version.
*/
#if 0
#define DEBUG_YABOOT
#endif
#if 0
#define DEBUG_PROM
#endif
...
...
@@ -32,22 +28,6 @@
#include <linux/threads.h>
#include <linux/spinlock.h>
#include <linux/blk.h>
#ifdef DEBUG_YABOOT
#define call_yaboot(FUNC,...) \
do { \
if (FUNC) { \
struct prom_t *_prom = PTRRELOC(&prom); \
unsigned long prom_entry = _prom->entry;\
_prom->entry = (unsigned long)(FUNC); \
enter_prom(__VA_ARGS__); \
_prom->entry = prom_entry; \
} \
} while (0)
#else
#define call_yaboot(FUNC,...) do { ; } while (0)
#endif
#include <linux/types.h>
#include <linux/pci.h>
#include <asm/prom.h>
...
...
@@ -65,16 +45,14 @@
#include <asm/bitops.h>
#include <asm/naca.h>
#include <asm/pci.h>
#include "open_pic.h"
#include <asm/bootinfo.h>
#include <asm/ppcdebug.h>
#include "open_pic.h"
#ifdef CONFIG_FB
#include <asm/linux_logo.h>
#endif
extern
char
_end
[];
/*
* prom_init() is called very early on, before the kernel text
* and data have been mapped to KERNELBASE. At this point the code
...
...
@@ -131,12 +109,7 @@ struct pci_intr_map {
typedef
unsigned
long
interpret_func
(
struct
device_node
*
,
unsigned
long
,
int
,
int
);
#if 0
static
interpret_func
interpret_pci_props
;
#endif
static
unsigned
long
interpret_pci_props
(
struct
device_node
*
,
unsigned
long
,
int
,
int
);
static
interpret_func
interpret_isa_props
;
static
interpret_func
interpret_root_props
;
...
...
@@ -156,9 +129,6 @@ struct prom_t prom = {
0
,
/* version */
32
,
/* encode_phys_size */
0
/* bi_rec pointer */
#ifdef DEBUG_YABOOT
,
NULL
/* yaboot */
#endif
};
...
...
@@ -170,9 +140,6 @@ extern struct rtas_t rtas;
extern
unsigned
long
klimit
;
extern
unsigned
long
embedded_sysmap_end
;
extern
struct
lmb
lmb
;
#ifdef CONFIG_MSCHUNKS
extern
struct
msChunks
msChunks
;
#endif
/* CONFIG_MSCHUNKS */
#define MAX_PHB 16 * 3 // 16 Towers * 3 PHBs/tower
struct
_of_tce_table
of_tce_table
[
MAX_PHB
+
1
]
=
{{
0
,
0
,
0
}};
...
...
@@ -203,12 +170,6 @@ static struct bi_record * prom_bi_rec_verify(struct bi_record *);
static
unsigned
long
prom_bi_rec_reserve
(
unsigned
long
);
static
struct
device_node
*
find_phandle
(
phandle
);
#ifdef CONFIG_MSCHUNKS
static
unsigned
long
prom_initialize_mschunks
(
unsigned
long
);
#ifdef DEBUG_PROM
void
prom_dump_mschunks_mapping
(
void
);
#endif
/* DEBUG_PROM */
#endif
/* CONFIG_MSCHUNKS */
#ifdef DEBUG_PROM
void
prom_dump_lmb
(
void
);
#endif
...
...
@@ -217,8 +178,6 @@ extern unsigned long reloc_offset(void);
extern
void
enter_prom
(
void
*
dummy
,...);
void
cacheable_memzero
(
void
*
,
unsigned
int
);
extern
char
cmd_line
[
512
];
/* XXX */
unsigned
long
dev_tree_size
;
...
...
@@ -545,20 +504,6 @@ prom_initialize_lmb(unsigned long mem)
unsigned
long
lmb_base
,
lmb_size
;
unsigned
long
num_regs
,
bytes_per_reg
=
(
_prom
->
encode_phys_size
*
2
)
/
8
;
#ifdef CONFIG_MSCHUNKS
unsigned
long
max_addr
=
0
;
#if 1
/* Fix me: 630 3G-4G IO hack here... -Peter (PPPBBB) */
unsigned
long
io_base
=
3UL
<<
30
;
unsigned
long
io_size
=
1UL
<<
30
;
unsigned
long
have_630
=
1
;
/* assume we have a 630 */
#else
unsigned
long
io_base
=
<
real
io
base
here
>
;
unsigned
long
io_size
=
<
real
io
size
here
>
;
#endif
#endif
/* CONFIG_MSCHUNKS */
lmb_init
();
for
(
node
=
0
;
prom_next_node
(
&
node
);
)
{
...
...
@@ -581,42 +526,17 @@ prom_initialize_lmb(unsigned long mem)
lmb_size
=
reg
.
addr64
[
i
].
size
;
}
#ifdef CONFIG_MSCHUNKS
if
(
lmb_addrs_overlap
(
lmb_base
,
lmb_size
,
io_base
,
io_size
)
)
{
/* If we really have dram here, then we don't
* have a 630! -Peter
*/
have_630
=
0
;
}
#endif
/* CONFIG_MSCHUNKS */
if
(
lmb_add
(
lmb_base
,
lmb_size
)
<
0
)
prom_print
(
RELOC
(
"Too many LMB's, discarding this one...
\n
"
));
#ifdef CONFIG_MSCHUNKS
else
if
(
max_addr
<
(
lmb_base
+
lmb_size
-
1
)
)
max_addr
=
lmb_base
+
lmb_size
-
1
;
#endif
/* CONFIG_MSCHUNKS */
}
}
#ifdef CONFIG_MSCHUNKS
if
(
have_630
&&
lmb_addrs_overlap
(
0
,
max_addr
,
io_base
,
io_size
)
)
lmb_add_io
(
io_base
,
io_size
);
#endif
/* CONFIG_MSCHUNKS */
lmb_analyze
();
#ifdef DEBUG_PROM
prom_dump_lmb
();
#endif
/* DEBUG_PROM */
#ifdef CONFIG_MSCHUNKS
mem
=
prom_initialize_mschunks
(
mem
);
#ifdef DEBUG_PROM
prom_dump_mschunks_mapping
();
#endif
/* DEBUG_PROM */
#endif
/* CONFIG_MSCHUNKS */
return
mem
;
}
...
...
@@ -718,96 +638,6 @@ unsigned long prom_strtoul(const char *cp)
return
result
;
}
#ifdef CONFIG_MSCHUNKS
static
unsigned
long
prom_initialize_mschunks
(
unsigned
long
mem
)
{
unsigned
long
offset
=
reloc_offset
();
struct
lmb
*
_lmb
=
PTRRELOC
(
&
lmb
);
struct
msChunks
*
_msChunks
=
PTRRELOC
(
&
msChunks
);
unsigned
long
i
,
pchunk
=
0
;
unsigned
long
addr_range
=
_lmb
->
memory
.
size
+
_lmb
->
memory
.
iosize
;
unsigned
long
chunk_size
=
_lmb
->
memory
.
lcd_size
;
mem
=
msChunks_alloc
(
mem
,
addr_range
/
chunk_size
,
chunk_size
);
/* First create phys -> abs mapping for memory/dram */
for
(
i
=
0
;
i
<
_lmb
->
memory
.
cnt
;
i
++
)
{
unsigned
long
base
=
_lmb
->
memory
.
region
[
i
].
base
;
unsigned
long
size
=
_lmb
->
memory
.
region
[
i
].
size
;
unsigned
long
achunk
=
addr_to_chunk
(
base
);
unsigned
long
end_achunk
=
addr_to_chunk
(
base
+
size
);
if
(
_lmb
->
memory
.
region
[
i
].
type
!=
LMB_MEMORY_AREA
)
continue
;
_lmb
->
memory
.
region
[
i
].
physbase
=
chunk_to_addr
(
pchunk
);
for
(;
achunk
<
end_achunk
;)
{
PTRRELOC
(
_msChunks
->
abs
)[
pchunk
++
]
=
achunk
++
;
}
}
#ifdef CONFIG_MSCHUNKS
/* Now create phys -> abs mapping for IO */
for
(
i
=
0
;
i
<
_lmb
->
memory
.
cnt
;
i
++
)
{
unsigned
long
base
=
_lmb
->
memory
.
region
[
i
].
base
;
unsigned
long
size
=
_lmb
->
memory
.
region
[
i
].
size
;
unsigned
long
achunk
=
addr_to_chunk
(
base
);
unsigned
long
end_achunk
=
addr_to_chunk
(
base
+
size
);
if
(
_lmb
->
memory
.
region
[
i
].
type
!=
LMB_IO_AREA
)
continue
;
_lmb
->
memory
.
region
[
i
].
physbase
=
chunk_to_addr
(
pchunk
);
for
(;
achunk
<
end_achunk
;)
{
PTRRELOC
(
_msChunks
->
abs
)[
pchunk
++
]
=
achunk
++
;
}
}
#endif
/* CONFIG_MSCHUNKS */
return
mem
;
}
#ifdef DEBUG_PROM
void
prom_dump_mschunks_mapping
(
void
)
{
unsigned
long
offset
=
reloc_offset
();
struct
msChunks
*
_msChunks
=
PTRRELOC
(
&
msChunks
);
unsigned
long
chunk
;
prom_print
(
RELOC
(
"
\n
prom_dump_mschunks_mapping:
\n
"
));
prom_print
(
RELOC
(
" msChunks.num_chunks = 0x"
));
prom_print_hex
(
_msChunks
->
num_chunks
);
prom_print_nl
();
prom_print
(
RELOC
(
" msChunks.chunk_size = 0x"
));
prom_print_hex
(
_msChunks
->
chunk_size
);
prom_print_nl
();
prom_print
(
RELOC
(
" msChunks.chunk_shift = 0x"
));
prom_print_hex
(
_msChunks
->
chunk_shift
);
prom_print_nl
();
prom_print
(
RELOC
(
" msChunks.chunk_mask = 0x"
));
prom_print_hex
(
_msChunks
->
chunk_mask
);
prom_print_nl
();
prom_print
(
RELOC
(
" msChunks.abs = 0x"
));
prom_print_hex
(
_msChunks
->
abs
);
prom_print_nl
();
prom_print
(
RELOC
(
" msChunks mapping:
\n
"
));
for
(
chunk
=
0
;
chunk
<
_msChunks
->
num_chunks
;
chunk
++
)
{
prom_print
(
RELOC
(
" phys 0x"
));
prom_print_hex
(
chunk
);
prom_print
(
RELOC
(
" -> abs 0x"
));
prom_print_hex
(
PTRRELOC
(
_msChunks
->
abs
)[
chunk
]);
prom_print_nl
();
}
}
#endif
/* DEBUG_PROM */
#endif
/* CONFIG_MSCHUNKS */
#ifdef DEBUG_PROM
void
prom_dump_lmb
(
void
)
...
...
@@ -1213,26 +1043,28 @@ prom_hold_cpus(unsigned long mem)
unsigned
long
__init
prom_init
(
unsigned
long
r3
,
unsigned
long
r4
,
unsigned
long
pp
,
unsigned
long
r6
,
unsigned
long
r7
,
yaboot_debug_t
*
yaboot
)
unsigned
long
r6
,
unsigned
long
r7
)
{
int
chrp
=
0
;
unsigned
long
mem
;
ihandle
prom_
mmu
,
prom_op
,
prom_
root
,
prom_cpu
;
ihandle
prom_root
,
prom_cpu
;
phandle
cpu_pkg
;
unsigned
long
offset
=
reloc_offset
();
long
l
;
char
*
p
,
*
d
;
unsigned
long
phys
;
u32
getprop_rval
;
struct
naca_struct
*
_naca
=
RELOC
(
naca
);
struct
naca_struct
*
_naca
=
RELOC
(
naca
);
struct
paca_struct
*
_xPaca
=
PTRRELOC
(
&
paca
[
0
]);
struct
prom_t
*
_prom
=
PTRRELOC
(
&
prom
);
/* Default machine type. */
_naca
->
platform
=
PLATFORM_PSERIES
;
#if 0
/* Reset klimit to take into account the embedded system map */
if (RELOC(embedded_sysmap_end))
RELOC(klimit) = __va(PAGE_ALIGN(RELOC(embedded_sysmap_end)));
#endif
/* Get a handle to the prom entry point before anything else */
_prom
->
entry
=
pp
;
...
...
@@ -1241,33 +1073,10 @@ prom_init(unsigned long r3, unsigned long r4, unsigned long pp,
RELOC
(
klimit
)
=
PTRUNRELOC
((
unsigned
long
)
_prom
->
bi_recs
+
_prom
->
bi_recs
->
data
[
1
]);
}
#ifdef DEBUG_YABOOT
call_yaboot
(
yaboot
->
dummy
,
offset
>>
32
,
offset
&
0xffffffff
);
call_yaboot
(
yaboot
->
printf
,
RELOC
(
"offset = 0x%08x%08x
\n
"
),
LONG_MSW
(
offset
),
LONG_LSW
(
offset
));
#endif
/* Default */
phys
=
KERNELBASE
-
offset
;
#ifdef DEBUG_YABOOT
call_yaboot
(
yaboot
->
printf
,
RELOC
(
"phys = 0x%08x%08x
\n
"
),
LONG_MSW
(
phys
),
LONG_LSW
(
phys
));
#endif
#ifdef DEBUG_YABOOT
_prom
->
yaboot
=
yaboot
;
call_yaboot
(
yaboot
->
printf
,
RELOC
(
"pp = 0x%08x%08x
\n
"
),
LONG_MSW
(
pp
),
LONG_LSW
(
pp
));
call_yaboot
(
yaboot
->
printf
,
RELOC
(
"prom = 0x%08x%08x
\n
"
),
LONG_MSW
(
_prom
->
entry
),
LONG_LSW
(
_prom
->
entry
));
#endif
/* First get a handle for the stdout device */
_prom
->
chosen
=
(
ihandle
)
call_prom
(
RELOC
(
"finddevice"
),
1
,
1
,
RELOC
(
"/chosen"
));
#ifdef DEBUG_YABOOT
call_yaboot
(
yaboot
->
printf
,
RELOC
(
"prom->chosen = 0x%08x%08x
\n
"
),
LONG_MSW
(
_prom
->
chosen
),
LONG_LSW
(
_prom
->
chosen
));
#endif
if
((
long
)
_prom
->
chosen
<=
0
)
prom_exit
();
...
...
@@ -1278,22 +1087,7 @@ prom_init(unsigned long r3, unsigned long r4, unsigned long pp,
_prom
->
stdout
=
(
ihandle
)(
unsigned
long
)
getprop_rval
;
#ifdef DEBUG_YABOOT
if
(
_prom
->
stdout
==
0
)
{
call_yaboot
(
yaboot
->
printf
,
RELOC
(
"prom->stdout = 0x%08x%08x
\n
"
),
LONG_MSW
(
_prom
->
stdout
),
LONG_LSW
(
_prom
->
stdout
));
}
call_yaboot
(
yaboot
->
printf
,
RELOC
(
"prom->stdout = 0x%08x%08x
\n
"
),
LONG_MSW
(
_prom
->
stdout
),
LONG_LSW
(
_prom
->
stdout
));
#endif
#ifdef DEBUG_YABOOT
call_yaboot
(
yaboot
->
printf
,
RELOC
(
"Location: 0x11
\n
"
));
#endif
mem
=
RELOC
(
klimit
)
-
offset
;
#ifdef DEBUG_YABOOT
call_yaboot
(
yaboot
->
printf
,
RELOC
(
"Location: 0x11b
\n
"
));
#endif
/* Get the full OF pathname of the stdout device */
p
=
(
char
*
)
mem
;
...
...
@@ -1311,34 +1105,6 @@ prom_init(unsigned long r3, unsigned long r4, unsigned long pp,
}
_prom
->
encode_phys_size
=
(
getprop_rval
==
1
)
?
32
:
64
;
#ifdef DEBUG_PROM
prom_print
(
RELOC
(
"DRENG: Detect OF version...
\n
"
));
#endif
/* Find the OF version */
prom_op
=
(
ihandle
)
call_prom
(
RELOC
(
"finddevice"
),
1
,
1
,
RELOC
(
"/openprom"
));
if
(
prom_op
!=
(
ihandle
)
-
1
)
{
char
model
[
64
];
long
sz
;
sz
=
(
long
)
call_prom
(
RELOC
(
"getprop"
),
4
,
1
,
prom_op
,
RELOC
(
"model"
),
model
,
64
);
if
(
sz
>
0
)
{
char
*
c
;
/* hack to skip the ibm chrp firmware # */
if
(
strncmp
(
model
,
RELOC
(
"IBM"
),
3
)
)
{
for
(
c
=
model
;
*
c
;
c
++
)
if
(
*
c
>=
'0'
&&
*
c
<=
'9'
)
{
_prom
->
version
=
*
c
-
'0'
;
break
;
}
}
else
chrp
=
1
;
}
}
if
(
_prom
->
version
>=
3
)
prom_print
(
RELOC
(
"OF Version 3 detected.
\n
"
));
/* Determine which cpu is actually running right _now_ */
if
((
long
)
call_prom
(
RELOC
(
"getprop"
),
4
,
1
,
_prom
->
chosen
,
RELOC
(
"cpu"
),
&
getprop_rval
,
...
...
@@ -1408,35 +1174,9 @@ prom_init(unsigned long r3, unsigned long r4, unsigned long pp,
if
(
_naca
->
platform
==
PLATFORM_PSERIES
)
prom_initialize_tce_table
();
if
((
long
)
call_prom
(
RELOC
(
"getprop"
),
4
,
1
,
_prom
->
chosen
,
RELOC
(
"mmu"
),
&
getprop_rval
,
sizeof
(
getprop_rval
))
<=
0
)
{
prom_print
(
RELOC
(
" no MMU found
\n
"
));
prom_exit
();
}
/* We assume the phys. address size is 3 cells */
RELOC
(
prom_mmu
)
=
(
ihandle
)(
unsigned
long
)
getprop_rval
;
if
((
long
)
call_prom
(
RELOC
(
"call-method"
),
4
,
4
,
RELOC
(
"translate"
),
prom_mmu
,
(
void
*
)(
KERNELBASE
-
offset
),
(
void
*
)
1
)
!=
0
)
{
prom_print
(
RELOC
(
" (translate failed) "
));
}
else
{
prom_print
(
RELOC
(
" (translate ok) "
));
phys
=
(
unsigned
long
)
_prom
->
args
.
rets
[
3
];
}
/* If OpenFirmware version >= 3, then use quiesce call */
if
(
_prom
->
version
>=
3
)
{
prom_print
(
RELOC
(
"Calling quiesce ...
\n
"
));
call_prom
(
RELOC
(
"quiesce"
),
0
,
0
);
phys
=
KERNELBASE
-
offset
;
}
prom_print
(
RELOC
(
"Calling quiesce ...
\n
"
));
call_prom
(
RELOC
(
"quiesce"
),
0
,
0
);
phys
=
KERNELBASE
-
offset
;
prom_print
(
RELOC
(
"returning from prom_init
\n
"
));
return
phys
;
...
...
@@ -1527,14 +1267,14 @@ check_display(unsigned long mem)
RELOC
(
default_colors
)[
i
*
3
+
2
])
!=
0
)
break
;
#ifdef CONFIG_F
B
#ifdef CONFIG_F
RAMEBUFFER_CONSOLE
for
(
i
=
0
;
i
<
LINUX_LOGO_COLORS
;
i
++
)
if
(
prom_set_color
(
ih
,
i
+
32
,
RELOC
(
linux_logo_red
)[
i
],
RELOC
(
linux_logo_green
)[
i
],
RELOC
(
linux_logo_blue
)[
i
])
!=
0
)
break
;
#endif
/* CONFIG_F
B
*/
#endif
/* CONFIG_F
RAMEBUFFER_CONSOLE
*/
/*
* If this display is the device that OF is using for stdout,
...
...
arch/ppc64/kernel/rtc.c
View file @
8d93229f
...
...
@@ -257,6 +257,7 @@ static int rtc_read_proc(char *page, char **start, off_t off,
return
len
;
}
#ifdef CONFIG_PPC_ISERIES
/*
* Get the RTC from the virtual service processor
* This requires flowing LpEvents to the primary partition
...
...
@@ -270,60 +271,6 @@ void iSeries_get_rtc_time(struct rtc_time *rtc_tm)
rtc_tm
->
tm_mon
--
;
}
void
pSeries_get_rtc_time
(
struct
rtc_time
*
rtc_tm
)
{
unsigned
long
ret
[
8
];
int
error
;
int
count
;
/*
* error -2 is clock busy, we keep retrying a few times to see
* if it will come good -- paulus
*/
count
=
0
;
do
{
error
=
rtas_call
(
rtas_token
(
"get-time-of-day"
),
0
,
8
,
(
void
*
)
&
ret
);
}
while
(
error
==
-
2
&&
++
count
<
1000
);
if
(
error
!=
0
)
{
printk
(
KERN_WARNING
"error: reading the clock failed (%d)
\n
"
,
error
);
return
;
}
rtc_tm
->
tm_sec
=
ret
[
5
];
rtc_tm
->
tm_min
=
ret
[
4
];
rtc_tm
->
tm_hour
=
ret
[
3
];
rtc_tm
->
tm_mday
=
ret
[
2
];
rtc_tm
->
tm_mon
=
ret
[
1
]
-
1
;
rtc_tm
->
tm_year
=
ret
[
0
]
-
1900
;
}
int
pSeries_set_rtc_time
(
struct
rtc_time
*
tm
)
{
int
error
;
int
count
;
/*
* error -2 is clock busy, we keep retrying a few times to see
* if it will come good -- paulus
*/
count
=
0
;
do
{
error
=
rtas_call
(
rtas_token
(
"set-time-of-day"
),
7
,
1
,
NULL
,
tm
->
tm_year
+
1900
,
tm
->
tm_mon
+
1
,
tm
->
tm_mday
,
tm
->
tm_hour
,
tm
->
tm_min
,
tm
->
tm_sec
,
0
);
}
while
(
error
==
-
2
&&
++
count
<
1000
);
if
(
error
!=
0
)
printk
(
KERN_WARNING
"error: setting the clock failed (%d)
\n
"
,
error
);
return
0
;
}
/*
* Set the RTC in the virtual service processor
* This requires flowing LpEvents to the primary partition
...
...
@@ -379,3 +326,59 @@ void iSeries_get_boot_time(struct rtc_time *tm)
tm
->
tm_year
-=
1900
;
tm
->
tm_mon
-=
1
;
}
#endif
#ifdef CONFIG_PPC_PSERIES
void
pSeries_get_rtc_time
(
struct
rtc_time
*
rtc_tm
)
{
unsigned
long
ret
[
8
];
int
error
;
int
count
;
/*
* error -2 is clock busy, we keep retrying a few times to see
* if it will come good -- paulus
*/
count
=
0
;
do
{
error
=
rtas_call
(
rtas_token
(
"get-time-of-day"
),
0
,
8
,
(
void
*
)
&
ret
);
}
while
(
error
==
-
2
&&
++
count
<
1000
);
if
(
error
!=
0
)
{
printk
(
KERN_WARNING
"error: reading the clock failed (%d)
\n
"
,
error
);
return
;
}
rtc_tm
->
tm_sec
=
ret
[
5
];
rtc_tm
->
tm_min
=
ret
[
4
];
rtc_tm
->
tm_hour
=
ret
[
3
];
rtc_tm
->
tm_mday
=
ret
[
2
];
rtc_tm
->
tm_mon
=
ret
[
1
]
-
1
;
rtc_tm
->
tm_year
=
ret
[
0
]
-
1900
;
}
int
pSeries_set_rtc_time
(
struct
rtc_time
*
tm
)
{
int
error
;
int
count
;
/*
* error -2 is clock busy, we keep retrying a few times to see
* if it will come good -- paulus
*/
count
=
0
;
do
{
error
=
rtas_call
(
rtas_token
(
"set-time-of-day"
),
7
,
1
,
NULL
,
tm
->
tm_year
+
1900
,
tm
->
tm_mon
+
1
,
tm
->
tm_mday
,
tm
->
tm_hour
,
tm
->
tm_min
,
tm
->
tm_sec
,
0
);
}
while
(
error
==
-
2
&&
++
count
<
1000
);
if
(
error
!=
0
)
printk
(
KERN_WARNING
"error: setting the clock failed (%d)
\n
"
,
error
);
return
0
;
}
#endif
arch/ppc64/kernel/setup.c
View file @
8d93229f
...
...
@@ -153,14 +153,18 @@ void setup_system(unsigned long r3, unsigned long r4, unsigned long r5,
debugger_dabr_match
=
xmon_dabr_match
;
#endif
#ifdef CONFIG_PPC_ISERIES
/* pSeries systems are identified in prom.c via OF. */
if
(
itLpNaca
.
xLparInstalled
==
1
)
naca
->
platform
=
PLATFORM_ISERIES_LPAR
;
#endif
switch
(
naca
->
platform
)
{
#ifdef CONFIG_PPC_ISERIES
case
PLATFORM_ISERIES_LPAR
:
iSeries_init_early
();
break
;
#endif
#ifdef CONFIG_PPC_PSERIES
case
PLATFORM_PSERIES
:
...
...
@@ -215,9 +219,11 @@ void setup_system(unsigned long r3, unsigned long r4, unsigned long r5,
mm_init_ppc64
();
switch
(
naca
->
platform
)
{
#ifdef CONFIG_PPC_ISERIES
case
PLATFORM_ISERIES_LPAR
:
iSeries_init
();
break
;
#endif
default:
/* The following relies on the device tree being */
/* fully configured. */
...
...
arch/ppc64/kernel/smp.c
View file @
8d93229f
...
...
@@ -86,6 +86,7 @@ static inline void set_tb(unsigned int upper, unsigned int lower)
mttbl
(
lower
);
}
#ifdef CONFIG_PPC_ISERIES
void
iSeries_smp_message_recv
(
struct
pt_regs
*
regs
)
{
int
cpu
=
smp_processor_id
();
...
...
@@ -117,7 +118,6 @@ static void smp_iSeries_message_pass(int target, int msg, unsigned long data, in
}
}
#ifdef CONFIG_PPC_ISERIES
static
int
smp_iSeries_numProcs
(
void
)
{
unsigned
np
,
i
;
...
...
@@ -132,7 +132,6 @@ static int smp_iSeries_numProcs(void)
}
return
np
;
}
#endif
static
int
smp_iSeries_probe
(
void
)
{
...
...
@@ -189,13 +188,12 @@ void __init smp_init_iSeries(void)
smp_ops
->
probe
=
smp_iSeries_probe
;
smp_ops
->
kick_cpu
=
smp_iSeries_kick_cpu
;
smp_ops
->
setup_cpu
=
smp_iSeries_setup_cpu
;
#ifdef CONFIG_PPC_ISERIES
#warning fix for iseries
naca
->
processorCount
=
smp_iSeries_numProcs
();
#endif
}
#endif
#ifdef CONFIG_PPC_PSERIES
static
void
smp_openpic_message_pass
(
int
target
,
int
msg
,
unsigned
long
data
,
int
wait
)
{
...
...
@@ -257,6 +255,7 @@ smp_kick_cpu(int nr)
*/
paca
[
nr
].
xProcStart
=
1
;
}
#endif
static
void
__init
smp_space_timers
(
unsigned
int
max_cpus
)
{
...
...
@@ -273,6 +272,7 @@ static void __init smp_space_timers(unsigned int max_cpus)
}
}
#ifdef CONFIG_PPC_PSERIES
static
void
__devinit
pSeries_setup_cpu
(
int
cpu
)
{
if
(
OpenPIC_Addr
)
{
...
...
@@ -361,6 +361,7 @@ void __init smp_init_pSeries(void)
smp_ops
->
kick_cpu
=
smp_kick_cpu
;
smp_ops
->
setup_cpu
=
pSeries_setup_cpu
;
}
#endif
void
smp_local_timer_interrupt
(
struct
pt_regs
*
regs
)
{
...
...
arch/ppc64/kernel/sys_ppc32.c
View file @
8d93229f
...
...
@@ -300,16 +300,16 @@ asmlinkage long sys32_fcntl(unsigned int fd, unsigned int cmd, unsigned long arg
struct
ncp_mount_data32_v3
{
int
version
;
unsigned
int
ncp_fd
;
__kernel_uid_t32
mounted_uid
;
__kernel_pid_t32
wdog_pid
;
compat_uid_t
mounted_uid
;
compat_pid_t
wdog_pid
;
unsigned
char
mounted_vol
[
NCP_VOLNAME_LEN
+
1
];
unsigned
int
time_out
;
unsigned
int
retry_count
;
unsigned
int
flags
;
__kernel_uid_t32
uid
;
__kernel_gid_t32
gid
;
__kernel_mode_t32
file_mode
;
__kernel_mode_t32
dir_mode
;
compat_uid_t
uid
;
compat_gid_t
gid
;
compat_mode_t
file_mode
;
compat_mode_t
dir_mode
;
};
struct
ncp_mount_data32_v4
{
...
...
@@ -380,11 +380,11 @@ static void *do_ncp_super_data_conv(void *raw_data)
struct
smb_mount_data32
{
int
version
;
__kernel_uid_t32
mounted_uid
;
__kernel_uid_t32
uid
;
__kernel_gid_t32
gid
;
__kernel_mode_t32
file_mode
;
__kernel_mode_t32
dir_mode
;
compat_uid_t
mounted_uid
;
compat_uid_t
uid
;
compat_gid_t
gid
;
compat_mode_t
file_mode
;
compat_mode_t
dir_mode
;
};
static
void
*
do_smb_super_data_conv
(
void
*
raw_data
)
...
...
@@ -802,10 +802,13 @@ asmlinkage int ppc32_select(u32 n, u32* inp, u32* outp, u32* exp, u32 tvp_x)
return
sys32_select
((
int
)
n
,
inp
,
outp
,
exp
,
tvp_x
);
}
static
int
cp_new_stat32
(
struct
kstat
*
stat
,
struct
stat32
*
statbuf
)
int
cp_compat_stat
(
struct
kstat
*
stat
,
struct
compat_stat
*
statbuf
)
{
int
err
;
if
(
stat
->
size
>
MAX_NON_LFS
)
return
-
EOVERFLOW
;
err
=
put_user
(
stat
->
dev
,
&
statbuf
->
st_dev
);
err
|=
put_user
(
stat
->
ino
,
&
statbuf
->
st_ino
);
err
|=
put_user
(
stat
->
mode
,
&
statbuf
->
st_mode
);
...
...
@@ -813,8 +816,6 @@ static int cp_new_stat32(struct kstat *stat, struct stat32 *statbuf)
err
|=
put_user
(
stat
->
uid
,
&
statbuf
->
st_uid
);
err
|=
put_user
(
stat
->
gid
,
&
statbuf
->
st_gid
);
err
|=
put_user
(
stat
->
rdev
,
&
statbuf
->
st_rdev
);
if
(
stat
->
size
>
MAX_NON_LFS
)
return
-
EOVERFLOW
;
err
|=
put_user
(
stat
->
size
,
&
statbuf
->
st_size
);
err
|=
put_user
(
stat
->
atime
.
tv_sec
,
&
statbuf
->
st_atime
);
err
|=
put_user
(
0
,
&
statbuf
->
__unused1
);
...
...
@@ -830,39 +831,6 @@ static int cp_new_stat32(struct kstat *stat, struct stat32 *statbuf)
return
err
;
}
asmlinkage
long
sys32_newstat
(
char
*
filename
,
struct
stat32
*
statbuf
)
{
struct
kstat
stat
;
int
error
=
vfs_stat
(
filename
,
&
stat
);
if
(
!
error
)
error
=
cp_new_stat32
(
&
stat
,
statbuf
);
return
error
;
}
asmlinkage
long
sys32_newlstat
(
char
*
filename
,
struct
stat32
*
statbuf
)
{
struct
kstat
stat
;
int
error
=
vfs_lstat
(
filename
,
&
stat
);
if
(
!
error
)
error
=
cp_new_stat32
(
&
stat
,
statbuf
);
return
error
;
}
asmlinkage
long
sys32_newfstat
(
unsigned
int
fd
,
struct
stat32
*
statbuf
)
{
struct
kstat
stat
;
int
error
=
vfs_fstat
(
fd
,
&
stat
);
if
(
!
error
)
error
=
cp_new_stat32
(
&
stat
,
statbuf
);
return
error
;
}
static
inline
int
put_statfs
(
struct
statfs32
*
ubuf
,
struct
statfs
*
kbuf
)
{
int
err
;
...
...
@@ -1492,27 +1460,27 @@ struct nfsctl_client32 {
struct
nfsctl_export32
{
s8
ex32_client
[
NFSCLNT_IDMAX
+
1
];
s8
ex32_path
[
NFS_MAXPATHLEN
+
1
];
__kernel_dev_t32
ex32_dev
;
__kernel_ino_t32
ex32_ino
;
compat_dev_t
ex32_dev
;
compat_ino_t
ex32_ino
;
s32
ex32_flags
;
__kernel_uid_t32
ex32_anon_uid
;
__kernel_gid_t32
ex32_anon_gid
;
compat_uid_t
ex32_anon_uid
;
compat_gid_t
ex32_anon_gid
;
};
struct
nfsctl_uidmap32
{
u32
ug32_ident
;
/* char * */
__kernel_uid_t32
ug32_uidbase
;
compat_uid_t
ug32_uidbase
;
s32
ug32_uidlen
;
u32
ug32_udimap
;
/* uid_t * */
__kernel_uid_t32
ug32_gidbase
;
compat_uid_t
ug32_gidbase
;
s32
ug32_gidlen
;
u32
ug32_gdimap
;
/* gid_t * */
};
struct
nfsctl_fhparm32
{
struct
sockaddr
gf32_addr
;
__kernel_dev_t32
gf32_dev
;
__kernel_ino_t32
gf32_ino
;
compat_dev_t
gf32_dev
;
compat_ino_t
gf32_ino
;
s32
gf32_version
;
};
...
...
@@ -1645,7 +1613,7 @@ static int nfs_uud32_trans(struct nfsctl_arg *karg, struct nfsctl_arg32 *arg32)
return
-
ENOMEM
;
for
(
i
=
0
;
i
<
karg
->
ca_umap
.
ug_uidlen
;
i
++
)
err
|=
__get_user
(
karg
->
ca_umap
.
ug_udimap
[
i
],
&
(((
__kernel_uid_t32
*
)
A
(
uaddr
))[
i
]));
&
(((
compat_uid_t
*
)
A
(
uaddr
))[
i
]));
err
|=
__get_user
(
karg
->
ca_umap
.
ug_gidbase
,
&
arg32
->
ca32_umap
.
ug32_gidbase
);
err
|=
__get_user
(
karg
->
ca_umap
.
ug_uidlen
,
...
...
@@ -1659,7 +1627,7 @@ static int nfs_uud32_trans(struct nfsctl_arg *karg, struct nfsctl_arg32 *arg32)
return
-
ENOMEM
;
for
(
i
=
0
;
i
<
karg
->
ca_umap
.
ug_gidlen
;
i
++
)
err
|=
__get_user
(
karg
->
ca_umap
.
ug_gdimap
[
i
],
&
(((
__kernel_gid_t32
*
)
A
(
uaddr
))[
i
]));
&
(((
compat_gid_t
*
)
A
(
uaddr
))[
i
]));
return
err
;
}
...
...
@@ -2076,37 +2044,6 @@ asmlinkage long sys32_settimeofday(struct compat_timeval *tv, struct timezone *t
}
struct
tms32
{
__kernel_clock_t32
tms_utime
;
__kernel_clock_t32
tms_stime
;
__kernel_clock_t32
tms_cutime
;
__kernel_clock_t32
tms_cstime
;
};
extern
asmlinkage
long
sys_times
(
struct
tms
*
tbuf
);
asmlinkage
long
sys32_times
(
struct
tms32
*
tbuf
)
{
struct
tms
t
;
long
ret
;
mm_segment_t
old_fs
=
get_fs
();
int
err
;
set_fs
(
KERNEL_DS
);
ret
=
sys_times
(
tbuf
?
&
t
:
NULL
);
set_fs
(
old_fs
);
if
(
tbuf
)
{
err
=
put_user
(
t
.
tms_utime
,
&
tbuf
->
tms_utime
);
err
|=
__put_user
(
t
.
tms_stime
,
&
tbuf
->
tms_stime
);
err
|=
__put_user
(
t
.
tms_cutime
,
&
tbuf
->
tms_cutime
);
err
|=
__put_user
(
t
.
tms_cstime
,
&
tbuf
->
tms_cstime
);
if
(
err
)
ret
=
-
EFAULT
;
}
return
ret
;
}
struct
msgbuf32
{
s32
mtype
;
char
mtext
[
1
];
};
struct
semid_ds32
{
...
...
@@ -2159,8 +2096,8 @@ struct msqid64_ds32 {
unsigned
int
msg_cbytes
;
unsigned
int
msg_qnum
;
unsigned
int
msg_qbytes
;
__kernel_pid_t32
msg_lspid
;
__kernel_pid_t32
msg_lrpid
;
compat_pid_t
msg_lspid
;
compat_pid_t
msg_lrpid
;
unsigned
int
__unused4
;
unsigned
int
__unused5
;
};
...
...
@@ -2189,8 +2126,8 @@ struct shmid64_ds32 {
compat_time_t
shm_ctime
;
unsigned
int
__unused4
;
compat_size_t
shm_segsz
;
__kernel_pid_t32
shm_cpid
;
__kernel_pid_t32
shm_lpid
;
compat_pid_t
shm_cpid
;
compat_pid_t
shm_lpid
;
unsigned
int
shm_nattch
;
unsigned
int
__unused5
;
unsigned
int
__unused6
;
...
...
@@ -2712,7 +2649,7 @@ extern asmlinkage ssize_t sys_sendfile(int out_fd, int in_fd, off_t* offset, siz
* proper conversion (sign extension) between the register representation of a signed int (msr in 32-bit mode)
* and the register representation of a signed int (msr in 64-bit mode) is performed.
*/
asmlinkage
long
sys32_sendfile
(
u32
out_fd
,
u32
in_fd
,
__kernel_off_t32
*
offset
,
u32
count
)
asmlinkage
long
sys32_sendfile
(
u32
out_fd
,
u32
in_fd
,
compat_off_t
*
offset
,
u32
count
)
{
mm_segment_t
old_fs
=
get_fs
();
int
ret
;
...
...
@@ -4296,7 +4233,7 @@ asmlinkage long sys32_time(compat_time_t* tloc)
extern
asmlinkage
int
sys_sched_setaffinity
(
pid_t
pid
,
unsigned
int
len
,
unsigned
long
*
user_mask_ptr
);
asmlinkage
int
sys32_sched_setaffinity
(
__kernel_pid_t32
pid
,
unsigned
int
len
,
asmlinkage
int
sys32_sched_setaffinity
(
compat_pid_t
pid
,
unsigned
int
len
,
u32
*
user_mask_ptr
)
{
unsigned
long
kernel_mask
;
...
...
@@ -4320,7 +4257,7 @@ asmlinkage int sys32_sched_setaffinity(__kernel_pid_t32 pid, unsigned int len,
extern
asmlinkage
int
sys_sched_getaffinity
(
pid_t
pid
,
unsigned
int
len
,
unsigned
long
*
user_mask_ptr
);
asmlinkage
int
sys32_sched_getaffinity
(
__kernel_pid_t32
pid
,
unsigned
int
len
,
asmlinkage
int
sys32_sched_getaffinity
(
compat_pid_t
pid
,
unsigned
int
len
,
u32
*
user_mask_ptr
)
{
unsigned
long
kernel_mask
;
...
...
arch/ppc64/kernel/time.c
View file @
8d93229f
...
...
@@ -301,9 +301,11 @@ int timer_interrupt(struct pt_regs * regs)
next_dec
=
lpaca
->
default_decr
;
set_dec
(
next_dec
);
#ifdef CONFIG_PPC_ISERIES
lpq
=
lpaca
->
lpQueuePtr
;
if
(
lpq
&&
ItLpQueue_isLpIntPending
(
lpq
))
lpEvent_count
+=
ItLpQueue_process
(
lpq
,
regs
);
#endif
irq_exit
();
...
...
@@ -458,9 +460,11 @@ void __init time_init(void)
ppc_md
.
calibrate_decr
();
if
(
!
piranha_simulator
)
{
#ifdef CONFIG_PPC_ISERIES
if
(
!
piranha_simulator
)
#endif
ppc_md
.
get_boot_time
(
&
tm
);
}
write_lock_irqsave
(
&
xtime_lock
,
flags
);
xtime
.
tv_sec
=
mktime
(
tm
.
tm_year
+
1900
,
tm
.
tm_mon
+
1
,
tm
.
tm_mday
,
tm
.
tm_hour
,
tm
.
tm_min
,
tm
.
tm_sec
);
...
...
arch/ppc64/kernel/xics.c
View file @
8d93229f
...
...
@@ -22,7 +22,7 @@
#include <asm/naca.h>
#include <asm/rtas.h>
#include "i8259.h"
#include
"xics.h"
#include
<asm/xics.h>
#include <asm/ppcdebug.h>
#include <asm/machdep.h>
...
...
@@ -430,15 +430,6 @@ xics_init_IRQ( void )
ppc64_boot_msg
(
0x21
,
"XICS Done"
);
}
void
xics_isa_init
(
void
)
{
return
;
if
(
request_irq
(
xics_irq_8259_cascade
+
XICS_IRQ_OFFSET
,
no_action
,
0
,
"8259 cascade"
,
0
))
printk
(
KERN_ERR
"xics_init_IRQ: couldn't get 8259 cascade
\n
"
);
i8259_init
();
}
void
xics_set_affinity
(
unsigned
int
virq
,
unsigned
long
cpumask
)
{
irq_desc_t
*
desc
=
irq_desc
+
virq
;
...
...
arch/ppc64/lib/Makefile
View file @
8d93229f
...
...
@@ -2,7 +2,9 @@
# Makefile for ppc64-specific library files..
#
export-objs
:=
dec_and_lock.o
L_TARGET
=
lib.a
obj-y
:=
checksum.o dec_and_lock.o string.o strcase.o copypage.o
\
memcpy.o copyuser.o
export-objs
:=
dec_and_lock.o
obj-y
:=
checksum.o dec_and_lock.o string.o strcase.o
obj-y
+=
copypage.o memcpy.o copyuser.o
arch/ppc64/mm/Makefile
View file @
8d93229f
...
...
@@ -2,7 +2,7 @@
# Makefile for the linux ppc-specific parts of the memory manager.
#
EXTRA_CFLAGS
=
-mno-minimal-toc
EXTRA_CFLAGS
+
=
-mno-minimal-toc
obj-y
:=
fault.o init.o extable.o imalloc.o
obj-y
:=
fault.o init.o extable.o imalloc.o
obj-$(CONFIG_DISCONTIGMEM)
+=
numa.o
arch/ppc64/oprofile/Makefile
View file @
8d93229f
obj-$(CONFIG_OPROFILE)
+=
oprofile.o
DRIVER_OBJS
=
$(
addprefix
../../../drivers/oprofile/,
\
DRIVER_OBJS
:
=
$(
addprefix
../../../drivers/oprofile/,
\
oprof.o cpu_buffer.o buffer_sync.o
\
event_buffer.o oprofile_files.o
\
oprofilefs.o oprofile_stats.o
)
oprofile-y
:=
$(DRIVER_OBJS)
init.o timer_int.o
oprofile-y
:=
$(DRIVER_OBJS)
init.o timer_int.o
arch/ppc64/xmon/Makefile
View file @
8d93229f
# Makefile for xmon
EXTRA_CFLAGS
=
-mno-minimal-toc
EXTRA_CFLAGS
+
=
-mno-minimal-toc
obj-y
:=
start.o xmon.o ppc-dis.o ppc-opc.o subr_prf.o setjmp.o
obj-y
:=
start.o xmon.o ppc-dis.o ppc-opc.o subr_prf.o setjmp.o
arch/ppc64/xmon/start.c
View file @
8d93229f
...
...
@@ -14,29 +14,13 @@
#include <asm/page.h>
#include <asm/prom.h>
#include <asm/processor.h>
/* Transition to udbg isn't quite done yet...but very close. */
#define USE_UDBG
#ifdef USE_UDBG
#include <asm/udbg.h>
#endif
#ifndef USE_UDBG
static
volatile
unsigned
char
*
sccc
,
*
sccd
;
#endif
unsigned
long
TXRDY
,
RXRDY
;
extern
void
xmon_printf
(
const
char
*
fmt
,
...);
static
int
xmon_expect
(
const
char
*
str
,
unsigned
int
timeout
);
#ifndef USE_UDBG
static
int
console
=
0
;
#endif
static
int
via_modem
=
0
;
/* static int xmon_use_sccb = 0; --Unused */
#define TB_SPEED 25000000
extern
void
*
comport1
;
static
inline
unsigned
int
readtb
(
void
)
{
unsigned
int
ret
;
...
...
@@ -45,16 +29,10 @@ static inline unsigned int readtb(void)
return
ret
;
}
#ifndef USE_UDBG
void
buf_access
(
void
)
static
void
sysrq_handle_xmon
(
int
key
,
struct
pt_regs
*
pt_regs
,
struct
tty_struct
*
tty
)
{
sccd
[
3
]
&=
~
0x80
;
/* reset DLAB */
}
#endif
static
void
sysrq_handle_xmon
(
int
key
,
struct
pt_regs
*
pt_regs
,
struct
tty_struct
*
tty
)
{
xmon
(
pt_regs
);
xmon
(
pt_regs
);
}
static
struct
sysrq_key_op
sysrq_xmon_op
=
{
...
...
@@ -68,50 +46,12 @@ xmon_map_scc(void)
{
/* This maybe isn't the best place to register sysrq 'x' */
__sysrq_put_key_op
(
'x'
,
&
sysrq_xmon_op
);
#ifndef USE_UDBG
/* should already be mapped by the kernel boot */
sccd
=
(
volatile
unsigned
char
*
)
(((
unsigned
long
)
comport1
));
sccc
=
(
volatile
unsigned
char
*
)
(((
unsigned
long
)
comport1
)
+
5
);
TXRDY
=
0x20
;
RXRDY
=
1
;
#endif
}
static
int
scc_initialized
=
0
;
void
xmon_init_scc
(
void
);
extern
void
pmu_poll
(
void
);
int
xmon_write
(
void
*
handle
,
void
*
ptr
,
int
nb
)
{
#ifdef USE_UDBG
return
udbg_write
(
ptr
,
nb
);
#else
char
*
p
=
ptr
;
int
i
,
c
,
ct
;
if
(
!
scc_initialized
)
xmon_init_scc
();
ct
=
0
;
for
(
i
=
0
;
i
<
nb
;
++
i
)
{
while
((
*
sccc
&
TXRDY
)
==
0
)
{
}
c
=
p
[
i
];
if
(
c
==
'\n'
&&
!
ct
)
{
c
=
'\r'
;
ct
=
1
;
--
i
;
}
else
{
if
(
console
)
printk
(
"%c"
,
c
);
ct
=
0
;
}
buf_access
();
*
sccd
=
c
;
}
return
i
;
#endif
}
int
xmon_wants_key
;
...
...
@@ -119,68 +59,15 @@ int xmon_wants_key;
int
xmon_read
(
void
*
handle
,
void
*
ptr
,
int
nb
)
{
#ifdef USE_UDBG
return
udbg_read
(
ptr
,
nb
);
#else
char
*
p
=
ptr
;
int
i
,
c
;
if
(
!
scc_initialized
)
xmon_init_scc
();
for
(
i
=
0
;
i
<
nb
;
++
i
)
{
do
{
while
((
*
sccc
&
RXRDY
)
==
0
)
;
buf_access
();
c
=
*
sccd
;
}
while
(
c
==
0x11
||
c
==
0x13
);
*
p
++
=
c
;
}
return
i
;
#endif
}
int
xmon_read_poll
(
void
)
{
#ifdef USE_UDBG
return
udbg_getc_poll
();
#else
if
((
*
sccc
&
RXRDY
)
==
0
)
{
return
-
1
;
}
buf_access
();
return
*
sccd
;
#endif
}
void
xmon_init_scc
()
{
#ifndef USE_UDBG
sccd
[
3
]
=
0x83
;
eieio
();
/* LCR = 8N1 + DLAB */
sccd
[
0
]
=
12
;
eieio
();
/* DLL = 9600 baud */
sccd
[
1
]
=
0
;
eieio
();
sccd
[
2
]
=
0
;
eieio
();
/* FCR = 0 */
sccd
[
3
]
=
3
;
eieio
();
/* LCR = 8N1 */
sccd
[
1
]
=
0
;
eieio
();
/* IER = 0 */
#endif
scc_initialized
=
1
;
if
(
via_modem
)
{
for
(;;)
{
xmon_write
(
0
,
"ATE1V1
\r
"
,
7
);
if
(
xmon_expect
(
"OK"
,
5
))
{
xmon_write
(
0
,
"ATA
\r
"
,
4
);
if
(
xmon_expect
(
"CONNECT"
,
40
))
break
;
}
xmon_write
(
0
,
"+++"
,
3
);
xmon_expect
(
"OK"
,
3
);
}
}
}
void
*
xmon_stdin
;
void
*
xmon_stdout
;
void
*
xmon_stderr
;
...
...
include/asm-ppc64/compat.h
View file @
8d93229f
...
...
@@ -5,9 +5,20 @@
*/
#include <linux/types.h>
#define COMPAT_USER_HZ 100
typedef
u32
compat_size_t
;
typedef
s32
compat_ssize_t
;
typedef
s32
compat_time_t
;
typedef
s32
compat_clock_t
;
typedef
s32
compat_pid_t
;
typedef
u32
compat_uid_t
;
typedef
u32
compat_gid_t
;
typedef
u32
compat_mode_t
;
typedef
u32
compat_ino_t
;
typedef
u32
compat_dev_t
;
typedef
s32
compat_off_t
;
typedef
s16
compat_nlink_t
;
struct
compat_timespec
{
compat_time_t
tv_sec
;
...
...
@@ -19,4 +30,24 @@ struct compat_timeval {
s32
tv_usec
;
};
struct
compat_stat
{
compat_dev_t
st_dev
;
compat_ino_t
st_ino
;
compat_mode_t
st_mode
;
compat_nlink_t
st_nlink
;
compat_uid_t
st_uid
;
compat_gid_t
st_gid
;
compat_dev_t
st_rdev
;
compat_off_t
st_size
;
compat_off_t
st_blksize
;
compat_off_t
st_blocks
;
compat_time_t
st_atime
;
u32
__unused1
;
compat_time_t
st_mtime
;
u32
__unused2
;
compat_time_t
st_ctime
;
u32
__unused3
;
u32
__unused4
[
2
];
};
#endif
/* _ASM_PPC64_COMPAT_H */
include/asm-ppc64/page.h
View file @
8d93229f
...
...
@@ -48,7 +48,7 @@ static __inline__ void clear_page(void *addr)
lines
=
naca
->
dCacheL1LinesPerPage
;
__asm__
__volatile__
(
" mtctr %1
\n
\
"mtctr %1 # clear_page
\n
\
1: dcbz 0,%0
\n
\
add %0,%0,%3
\n
\
bdnz+ 1b"
...
...
include/asm-ppc64/pgtable.h
View file @
8d93229f
...
...
@@ -267,8 +267,8 @@ static inline unsigned long pte_update( pte_t *p, unsigned long clr,
{
unsigned
long
old
,
tmp
;
__asm__
__volatile__
(
"
\n
\
1: ldarx %0,0,%3
\n
\
__asm__
__volatile__
(
"1: ldarx %0,0,%3 # pte_update
\n
\
andc %1,%0,%4
\n
\
or %1,%1,%5
\n
\
stdcx. %1,0,%3
\n
\
...
...
include/asm-ppc64/ppc32.h
View file @
8d93229f
...
...
@@ -44,19 +44,9 @@ typedef __kernel_fsid_t __kernel_fsid_t32;
})
/* These are here to support 32-bit syscalls on a 64-bit kernel. */
typedef
int
__kernel_ptrdiff_t32
;
typedef
int
__kernel_clock_t32
;
typedef
int
__kernel_pid_t32
;
typedef
unsigned
short
__kernel_ipc_pid_t32
;
typedef
unsigned
int
__kernel_uid_t32
;
typedef
unsigned
int
__kernel_gid_t32
;
typedef
unsigned
int
__kernel_dev_t32
;
typedef
unsigned
int
__kernel_ino_t32
;
typedef
unsigned
int
__kernel_mode_t32
;
typedef
unsigned
int
__kernel_umode_t32
;
typedef
short
__kernel_nlink_t32
;
typedef
int
__kernel_daddr_t32
;
typedef
int
__kernel_off_t32
;
typedef
unsigned
int
__kernel_caddr_t32
;
typedef
int
__kernel_loff_t32
;
...
...
@@ -88,8 +78,8 @@ typedef struct siginfo32 {
/* kill() */
struct
{
__kernel_pid_t32
_pid
;
/* sender's pid */
__kernel_uid_t32
_uid
;
/* sender's uid */
compat_pid_t
_pid
;
/* sender's pid */
compat_uid_t
_uid
;
/* sender's uid */
}
_kill
;
/* POSIX.1b timers */
...
...
@@ -100,18 +90,18 @@ typedef struct siginfo32 {
/* POSIX.1b signals */
struct
{
__kernel_pid_t32
_pid
;
/* sender's pid */
__kernel_uid_t32
_uid
;
/* sender's uid */
compat_pid_t
_pid
;
/* sender's pid */
compat_uid_t
_uid
;
/* sender's uid */
sigval_t32
_sigval
;
}
_rt
;
/* SIGCHLD */
struct
{
__kernel_pid_t32
_pid
;
/* which child */
__kernel_uid_t32
_uid
;
/* sender's uid */
compat_pid_t
_pid
;
/* which child */
compat_uid_t
_uid
;
/* sender's uid */
int
_status
;
/* exit code */
__kernel_clock_t32
_utime
;
__kernel_clock_t32
_stime
;
compat_clock_t
_utime
;
compat_clock_t
_stime
;
}
_sigchld
;
/* SIGILL, SIGFPE, SIGSEGV, SIGBUS, SIGEMT */
...
...
@@ -164,32 +154,12 @@ typedef struct sigaltstack_32 {
struct
flock32
{
short
l_type
;
short
l_whence
;
__kernel_off_t32
l_start
;
__kernel_off_t32
l_len
;
__kernel_pid_t32
l_pid
;
compat_off_t
l_start
;
compat_off_t
l_len
;
compat_pid_t
l_pid
;
short
__unused
;
};
struct
stat32
{
__kernel_dev_t32
st_dev
;
/* 2 */
__kernel_ino_t32
st_ino
;
/* 4 */
__kernel_mode_t32
st_mode
;
/* 2 */
short
st_nlink
;
/* 2 */
__kernel_uid_t32
st_uid
;
/* 2 */
__kernel_gid_t32
st_gid
;
/* 2 */
__kernel_dev_t32
st_rdev
;
/* 2 */
__kernel_off_t32
st_size
;
/* 4 */
__kernel_off_t32
st_blksize
;
/* 4 */
__kernel_off_t32
st_blocks
;
/* 4 */
compat_time_t
st_atime
;
/* 4 */
unsigned
int
__unused1
;
/* 4 */
compat_time_t
st_mtime
;
/* 4 */
unsigned
int
__unused2
;
/* 4 */
compat_time_t
st_ctime
;
/* 4 */
unsigned
int
__unused3
;
/* 4 */
unsigned
int
__unused4
[
2
];
/* 2*4 */
};
struct
sigcontext32
{
unsigned
int
_unused
[
4
];
int
signal
;
...
...
include/asm-ppc64/prom.h
View file @
8d93229f
...
...
@@ -155,12 +155,6 @@ struct prom_args {
prom_arg_t
*
rets
;
/* Pointer to return values in args[16]. */
};
typedef
struct
{
u32
printf
;
/* void (*printf)(char *, ...); */
u32
memdump
;
/* void (*memdump)(unsigned char *, unsigned long); */
u32
dummy
;
/* void (*dummy)(void); */
}
yaboot_debug_t
;
struct
prom_t
{
unsigned
long
entry
;
ihandle
chosen
;
...
...
@@ -171,9 +165,6 @@ struct prom_t {
unsigned
long
version
;
unsigned
long
encode_phys_size
;
struct
bi_record
*
bi_recs
;
#ifdef DEBUG_YABOOT
yaboot_debug_t
*
yaboot
;
#endif
};
extern
struct
prom_t
prom
;
...
...
@@ -183,7 +174,7 @@ extern int boot_cpuid;
/* Prototypes */
extern
void
abort
(
void
);
extern
unsigned
long
prom_init
(
unsigned
long
,
unsigned
long
,
unsigned
long
,
unsigned
long
,
unsigned
long
,
yaboot_debug_t
*
);
unsigned
long
,
unsigned
long
);
extern
void
prom_print
(
const
char
*
msg
);
extern
void
relocate_nodes
(
void
);
extern
void
finish_device_tree
(
void
);
...
...
arch/ppc64/kernel
/xics.h
→
include/asm-ppc64
/xics.h
View file @
8d93229f
/*
* arch/ppc/kernel/xics.h
* arch/ppc
64
/kernel/xics.h
*
* Copyright 2000 IBM Corporation.
*
...
...
@@ -9,14 +9,10 @@
* 2 of the License, or (at your option) any later version.
*/
#ifndef _PPC_KERNEL_XICS_H
#define _PPC_KERNEL_XICS_H
extern
struct
hw_interrupt_type
xics_pic
;
extern
struct
hw_interrupt_type
xics_8259_pic
;
#ifndef _PPC64_KERNEL_XICS_H
#define _PPC64_KERNEL_XICS_H
void
xics_init_IRQ
(
void
);
int
xics_get_irq
(
struct
pt_regs
*
);
void
xics_isa_init
(
void
);
#endif
/* _PPC_KERNEL_XICS_H */
#endif
/* _PPC
64
_KERNEL_XICS_H */
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