Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
L
linux
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
nexedi
linux
Commits
2780940f
Commit
2780940f
authored
Dec 17, 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
1ae41b20
84b3c277
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 @
2780940f
...
...
@@ -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 @
2780940f
...
...
@@ -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 @
2780940f
...
...
@@ -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 @
2780940f
#
# 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 @
2780940f
...
...
@@ -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 @
2780940f
...
...
@@ -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 @
2780940f
...
...
@@ -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 @
2780940f
...
...
@@ -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 @
2780940f
...
...
@@ -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 @
2780940f
...
...
@@ -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 @
2780940f
...
...
@@ -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 @
2780940f
...
...
@@ -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 @
2780940f
...
...
@@ -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 @
2780940f
...
...
@@ -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 @
2780940f
...
...
@@ -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 @
2780940f
...
...
@@ -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 @
2780940f
...
...
@@ -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 @
2780940f
...
...
@@ -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 @
2780940f
...
...
@@ -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 @
2780940f
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 @
2780940f
# 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 @
2780940f
...
...
@@ -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 @
2780940f
...
...
@@ -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 @
2780940f
...
...
@@ -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 @
2780940f
...
...
@@ -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 @
2780940f
...
...
@@ -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 @
2780940f
...
...
@@ -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 @
2780940f
/*
* 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