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
4348e62f
Commit
4348e62f
authored
Sep 07, 2003
by
Anton Blanchard
Browse files
Options
Browse Files
Download
Plain Diff
Merge samba.org:/scratch/anton/linux-2.5
into samba.org:/scratch/anton/tmp3
parents
d742b6ed
af4842dd
Changes
31
Hide whitespace changes
Inline
Side-by-side
Showing
31 changed files
with
349 additions
and
457 deletions
+349
-457
arch/ppc64/Makefile
arch/ppc64/Makefile
+12
-0
arch/ppc64/boot/Makefile
arch/ppc64/boot/Makefile
+2
-0
arch/ppc64/boot/install.sh
arch/ppc64/boot/install.sh
+41
-0
arch/ppc64/defconfig
arch/ppc64/defconfig
+75
-34
arch/ppc64/kernel/asm-offsets.c
arch/ppc64/kernel/asm-offsets.c
+0
-2
arch/ppc64/kernel/chrp_setup.c
arch/ppc64/kernel/chrp_setup.c
+2
-1
arch/ppc64/kernel/eeh.c
arch/ppc64/kernel/eeh.c
+11
-2
arch/ppc64/kernel/head.S
arch/ppc64/kernel/head.S
+20
-109
arch/ppc64/kernel/pSeries_pci.c
arch/ppc64/kernel/pSeries_pci.c
+2
-0
arch/ppc64/kernel/ppc_ksyms.c
arch/ppc64/kernel/ppc_ksyms.c
+0
-5
arch/ppc64/kernel/process.c
arch/ppc64/kernel/process.c
+0
-40
arch/ppc64/kernel/rtas.c
arch/ppc64/kernel/rtas.c
+21
-0
arch/ppc64/kernel/rtc.c
arch/ppc64/kernel/rtc.c
+64
-16
arch/ppc64/kernel/semaphore.c
arch/ppc64/kernel/semaphore.c
+7
-8
arch/ppc64/kernel/sys_ppc32.c
arch/ppc64/kernel/sys_ppc32.c
+27
-25
arch/ppc64/kernel/syscalls.c
arch/ppc64/kernel/syscalls.c
+4
-2
arch/ppc64/kernel/vmlinux.lds.S
arch/ppc64/kernel/vmlinux.lds.S
+5
-0
arch/ppc64/kernel/xics.c
arch/ppc64/kernel/xics.c
+9
-0
arch/ppc64/mm/fault.c
arch/ppc64/mm/fault.c
+4
-13
arch/ppc64/mm/init.c
arch/ppc64/mm/init.c
+0
-5
arch/ppc64/mm/numa.c
arch/ppc64/mm/numa.c
+6
-3
arch/ppc64/xmon/xmon.c
arch/ppc64/xmon/xmon.c
+1
-152
include/asm-ppc64/mmzone.h
include/asm-ppc64/mmzone.h
+1
-1
include/asm-ppc64/paca.h
include/asm-ppc64/paca.h
+2
-2
include/asm-ppc64/prom.h
include/asm-ppc64/prom.h
+0
-2
include/asm-ppc64/rtas.h
include/asm-ppc64/rtas.h
+7
-0
include/asm-ppc64/rwsem.h
include/asm-ppc64/rwsem.h
+6
-16
include/asm-ppc64/semaphore.h
include/asm-ppc64/semaphore.h
+4
-11
include/asm-ppc64/serial.h
include/asm-ppc64/serial.h
+4
-6
include/asm-ppc64/topology.h
include/asm-ppc64/topology.h
+4
-2
include/asm-ppc64/uaccess.h
include/asm-ppc64/uaccess.h
+8
-0
No files found.
arch/ppc64/Makefile
View file @
4348e62f
...
...
@@ -20,6 +20,12 @@ LDFLAGS_vmlinux := -Bstatic -e $(KERNELLOAD) -Ttext $(KERNELLOAD)
CFLAGS
+=
-msoft-float
-pipe
-Wno-uninitialized
-mminimal-toc
\
-mtraceback
=
full
-mcpu
=
power4
have_zero_bss
:=
$(
shell
if
$(CC)
-fno-zero-initialized-in-bss
-S
-o
/dev/null
-xc
/dev/null
>
/dev/null 2>&1
;
then
echo
y
;
else
echo
n
;
fi
)
ifeq
($(have_zero_bss),y)
CFLAGS
+=
-fno-zero-initialized-in-bss
endif
head-y
:=
arch
/ppc64/kernel/head.o
libs-y
+=
arch
/ppc64/lib/
...
...
@@ -39,6 +45,12 @@ $(boottarget-y): vmlinux
rm
-f
.config
arch
/ppc64/defconfig
cp
-f
arch
/ppc64/configs/
$
(
@:config
=
defconfig
)
arch
/ppc64/defconfig
bootimage-$(CONFIG_PPC_PSERIES)
:=
zImage
bootimage-$(CONFIG_PPC_ISERIES)
:=
vmlinux.sm
BOOTIMAGE
:=
$
(
bootimage-y
)
install
:
vmlinux
$(Q)$(MAKE)
$(build)
=
$(boot)
BOOTIMAGE
=
$(BOOTIMAGE)
$@
archclean
:
$(Q)$(MAKE)
$(clean)
=
$(boot)
...
...
arch/ppc64/boot/Makefile
View file @
4348e62f
...
...
@@ -122,5 +122,7 @@ $(obj)/imagesize.c: vmlinux
awk
'{printf "unsigned long vmlinux_memsize = 0x%s;\n", substr($$1,8)}'
\
>>
$(obj)
/imagesize.c
install
:
$(CONFIGURE) $(obj)/$(BOOTIMAGE)
sh
-x
$(src)
/install.sh
"
$(KERNELRELEASE)
"
"
$(obj)
/
$(BOOTIMAGE)
"
"
$(TOPDIR)
/System.map"
"
$(INSTALL_PATH)
"
clean-files
:=
$(
patsubst
$(obj)
/%,%,
$
(
obj-boot
))
arch/ppc64/boot/install.sh
0 → 100644
View file @
4348e62f
#!/bin/sh
#
# arch/ppc64/boot/install.sh
#
# This file is subject to the terms and conditions of the GNU General Public
# License. See the file "COPYING" in the main directory of this archive
# for more details.
#
# Copyright (C) 1995 by Linus Torvalds
#
# Blatantly stolen from in arch/i386/boot/install.sh by Dave Hansen
#
# "make install" script for ppc64 architecture
#
# Arguments:
# $1 - kernel version
# $2 - kernel image file
# $3 - kernel map file
# $4 - default install path (blank if root directory)
#
# User may have a custom install script
if
[
-x
~/bin/installkernel
]
;
then
exec
~/bin/installkernel
"
$@
"
;
fi
if
[
-x
/sbin/installkernel
]
;
then
exec
/sbin/installkernel
"
$@
"
;
fi
# Default install
# this should work for both the pSeries zImage and the iSeries vmlinux.sm
image_name
=
`
basename
$2
`
if
[
-f
$4
/
$image_name
]
;
then
mv
$4
/
$image_name
$4
/
$image_name
.old
fi
if
[
-f
$4
/System.map
]
;
then
mv
$4
/System.map
$4
/System.old
fi
cat
$2
>
$4
/
$image_name
cp
$3
$4
/System.map
arch/ppc64/defconfig
View file @
4348e62f
...
...
@@ -8,11 +8,13 @@ CONFIG_HAVE_DEC_LOCK=y
CONFIG_EARLY_PRINTK=y
CONFIG_COMPAT=y
CONFIG_FRAME_POINTER=y
CONFIG_FORCE_MAX_ZONEORDER=13
#
# Code maturity level options
#
CONFIG_EXPERIMENTAL=y
# CONFIG_BROKEN is not set
#
# General setup
...
...
@@ -21,11 +23,14 @@ CONFIG_SWAP=y
CONFIG_SYSVIPC=y
# CONFIG_BSD_PROCESS_ACCT is not set
CONFIG_SYSCTL=y
CONFIG_LOG_BUF_SHIFT=15
CONFIG_LOG_BUF_SHIFT=16
CONFIG_IKCONFIG=y
CONFIG_IKCONFIG_PROC=y
# CONFIG_EMBEDDED is not set
CONFIG_KALLSYMS=y
CONFIG_FUTEX=y
CONFIG_EPOLL=y
CONFIG_IOSCHED_NOOP=y
CONFIG_IOSCHED_AS=y
CONFIG_IOSCHED_DEADLINE=y
...
...
@@ -72,7 +77,6 @@ CONFIG_PROC_DEVICETREE=y
#
# Generic Driver Options
#
# CONFIG_FW_LOADER is not set
#
# Memory Technology Devices (MTD)
...
...
@@ -99,7 +103,7 @@ CONFIG_BLK_DEV_FD=y
# CONFIG_BLK_DEV_UMEM is not set
CONFIG_BLK_DEV_LOOP=y
# CONFIG_BLK_DEV_CRYPTOLOOP is not set
CONFIG_BLK_DEV_NBD=
y
CONFIG_BLK_DEV_NBD=
m
CONFIG_BLK_DEV_RAM=y
CONFIG_BLK_DEV_RAM_SIZE=4096
CONFIG_BLK_DEV_INITRD=y
...
...
@@ -127,9 +131,9 @@ CONFIG_CHR_DEV_SG=y
#
# Some SCSI devices (e.g. CD jukebox) support multiple LUNs
#
# CONFIG_SCSI_MULTI_LUN is not set
# CONFIG_SCSI_REPORT_LUNS is not set
# CONFIG_SCSI_CONSTANTS is not set
CONFIG_SCSI_MULTI_LUN=y
CONFIG_SCSI_REPORT_LUNS=y
CONFIG_SCSI_CONSTANTS=y
# CONFIG_SCSI_LOGGING is not set
#
...
...
@@ -178,7 +182,8 @@ CONFIG_MD_RAID0=y
CONFIG_MD_RAID1=y
CONFIG_MD_RAID5=y
# CONFIG_MD_MULTIPATH is not set
# CONFIG_BLK_DEV_DM is not set
CONFIG_BLK_DEV_DM=y
CONFIG_DM_IOCTL_V4=y
#
# Fusion MPT device support
...
...
@@ -206,9 +211,8 @@ CONFIG_NET=y
CONFIG_PACKET=y
# CONFIG_PACKET_MMAP is not set
# CONFIG_NETLINK_DEV is not set
# CONFIG_NETFILTER is not set
CONFIG_UNIX=y
# CONFIG_NET_KEY is not set
CONFIG_NET_KEY=m
CONFIG_INET=y
CONFIG_IP_MULTICAST=y
# CONFIG_IP_ADVANCED_ROUTER is not set
...
...
@@ -217,13 +221,17 @@ CONFIG_NET_IPIP=y
# CONFIG_NET_IPGRE is not set
# CONFIG_IP_MROUTE is not set
# CONFIG_ARPD is not set
# CONFIG_INET_ECN is not set
CONFIG_INET_ECN=y
CONFIG_SYN_COOKIES=y
# CONFIG_INET_AH is not set
# CONFIG_INET_ESP is not set
# CONFIG_INET_IPCOMP is not set
CONFIG_INET_AH=m
CONFIG_INET_ESP=m
CONFIG_INET_IPCOMP=m
# CONFIG_IPV6 is not set
# CONFIG_XFRM_USER is not set
# CONFIG_DECNET is not set
# CONFIG_BRIDGE is not set
# CONFIG_NETFILTER is not set
CONFIG_XFRM=y
CONFIG_XFRM_USER=m
#
# SCTP Configuration (EXPERIMENTAL)
...
...
@@ -233,8 +241,6 @@ CONFIG_IPV6_SCTP__=y
# CONFIG_ATM is not set
# CONFIG_VLAN_8021Q is not set
# CONFIG_LLC is not set
# CONFIG_DECNET is not set
# CONFIG_BRIDGE is not set
# CONFIG_X25 is not set
# CONFIG_LAPB is not set
# CONFIG_NET_DIVERT is not set
...
...
@@ -258,10 +264,10 @@ CONFIG_NETDEVICES=y
# ARCnet devices
#
# CONFIG_ARCNET is not set
# CONFIG_DUMMY is not set
# CONFIG_BONDING is not set
CONFIG_DUMMY=m
CONFIG_BONDING=m
# CONFIG_EQUALIZER is not set
# CONFIG_TUN is not set
CONFIG_TUN=m
# CONFIG_ETHERTAP is not set
#
...
...
@@ -312,6 +318,7 @@ CONFIG_E1000=y
# CONFIG_HAMACHI is not set
# CONFIG_YELLOWFIN is not set
# CONFIG_R8169 is not set
# CONFIG_SIS190 is not set
# CONFIG_SK98LIN is not set
# CONFIG_TIGON3 is not set
...
...
@@ -321,7 +328,14 @@ CONFIG_E1000=y
# CONFIG_IXGB is not set
# CONFIG_FDDI is not set
# CONFIG_HIPPI is not set
# CONFIG_PPP is not set
CONFIG_PPP=m
# CONFIG_PPP_MULTILINK is not set
# CONFIG_PPP_FILTER is not set
CONFIG_PPP_ASYNC=m
CONFIG_PPP_SYNC_TTY=m
CONFIG_PPP_DEFLATE=m
CONFIG_PPP_BSDCOMP=m
CONFIG_PPPOE=m
# CONFIG_SLIP is not set
#
...
...
@@ -489,26 +503,32 @@ CONFIG_RAW_DRIVER=y
# File systems
#
CONFIG_EXT2_FS=y
# CONFIG_EXT2_FS_XATTR is not set
CONFIG_EXT2_FS_XATTR=y
CONFIG_EXT2_FS_POSIX_ACL=y
# CONFIG_EXT2_FS_SECURITY is not set
CONFIG_EXT3_FS=y
# CONFIG_EXT3_FS_XATTR is not set
CONFIG_EXT3_FS_XATTR=y
CONFIG_EXT3_FS_POSIX_ACL=y
# CONFIG_EXT3_FS_SECURITY is not set
CONFIG_JBD=y
# CONFIG_JBD_DEBUG is not set
CONFIG_FS_MBCACHE=y
CONFIG_REISERFS_FS=y
# CONFIG_REISERFS_CHECK is not set
# CONFIG_REISERFS_PROC_INFO is not set
CONFIG_JFS_FS=y
# CONFIG_JFS_POSIX_ACL is not set
CONFIG_JFS_POSIX_ACL=y
# CONFIG_JFS_DEBUG is not set
# CONFIG_JFS_STATISTICS is not set
CONFIG_XFS_FS=y
CONFIG_FS_POSIX_ACL=y
CONFIG_XFS_FS=m
# CONFIG_XFS_RT is not set
# CONFIG_XFS_QUOTA is not set
# CONFIG_XFS_POSIX_ACL is not set
CONFIG_XFS_POSIX_ACL=y
# CONFIG_MINIX_FS is not set
# CONFIG_ROMFS_FS is not set
# CONFIG_QUOTA is not set
CONFIG_AUTOFS_FS=
y
CONFIG_AUTOFS_FS=
m
# CONFIG_AUTOFS4_FS is not set
#
...
...
@@ -517,7 +537,7 @@ CONFIG_AUTOFS_FS=y
CONFIG_ISO9660_FS=y
# CONFIG_JOLIET is not set
# CONFIG_ZISOFS is not set
# CONFIG_UDF_FS is not set
CONFIG_UDF_FS=m
#
# DOS/FAT/NT Filesystems
...
...
@@ -533,8 +553,9 @@ CONFIG_VFAT_FS=y
CONFIG_PROC_FS=y
# CONFIG_DEVFS_FS is not set
CONFIG_DEVPTS_FS=y
# CONFIG_DEVPTS_FS_XATTR is not set
# CONFIG_TMPFS is not set
CONFIG_DEVPTS_FS_XATTR=y
# CONFIG_DEVPTS_FS_SECURITY is not set
CONFIG_TMPFS=y
CONFIG_RAMFS=y
#
...
...
@@ -546,7 +567,7 @@ CONFIG_RAMFS=y
# CONFIG_BEFS_FS is not set
# CONFIG_BFS_FS is not set
# CONFIG_EFS_FS is not set
# CONFIG_CRAMFS is not set
CONFIG_CRAMFS=y
# CONFIG_VXFS_FS is not set
# CONFIG_HPFS_FS is not set
# CONFIG_QNX4FS_FS is not set
...
...
@@ -561,15 +582,16 @@ CONFIG_NFS_V3=y
CONFIG_NFS_V4=y
CONFIG_NFSD=y
CONFIG_NFSD_V3=y
# CONFIG_NFSD_V4 is not set
CONFIG_NFSD_V4=y
CONFIG_NFSD_TCP=y
CONFIG_LOCKD=y
CONFIG_LOCKD_V4=y
CONFIG_EXPORTFS=y
CONFIG_SUNRPC=y
# CONFIG_SUNRPC_GSS is not set
CONFIG_SUNRPC_GSS=m
CONFIG_RPCSEC_GSS_KRB5=m
# CONFIG_SMB_FS is not set
CONFIG_CIFS=
y
CONFIG_CIFS=
m
# CONFIG_NCP_FS is not set
# CONFIG_CODA_FS is not set
# CONFIG_INTERMEZZO_FS is not set
...
...
@@ -705,6 +727,7 @@ CONFIG_MAGIC_SYSRQ=y
CONFIG_XMON=y
CONFIG_XMON_DEFAULT=y
# CONFIG_PPCDBG is not set
# CONFIG_DEBUG_INFO is not set
#
# Security options
...
...
@@ -714,9 +737,27 @@ CONFIG_XMON_DEFAULT=y
#
# Cryptographic options
#
# CONFIG_CRYPTO is not set
CONFIG_CRYPTO=y
CONFIG_CRYPTO_HMAC=y
CONFIG_CRYPTO_NULL=m
CONFIG_CRYPTO_MD4=m
CONFIG_CRYPTO_MD5=m
CONFIG_CRYPTO_SHA1=m
CONFIG_CRYPTO_SHA256=m
CONFIG_CRYPTO_SHA512=m
CONFIG_CRYPTO_DES=m
CONFIG_CRYPTO_BLOWFISH=m
CONFIG_CRYPTO_TWOFISH=m
CONFIG_CRYPTO_SERPENT=m
CONFIG_CRYPTO_AES=m
CONFIG_CRYPTO_CAST5=m
CONFIG_CRYPTO_CAST6=m
CONFIG_CRYPTO_DEFLATE=m
CONFIG_CRYPTO_TEST=m
#
# Library routines
#
CONFIG_CRC32=y
CONFIG_ZLIB_INFLATE=y
CONFIG_ZLIB_DEFLATE=m
arch/ppc64/kernel/asm-offsets.c
View file @
4348e62f
...
...
@@ -83,9 +83,7 @@ int main(void)
DEFINE
(
PACALPQUEUE
,
offsetof
(
struct
paca_struct
,
lpQueuePtr
));
DEFINE
(
PACATOC
,
offsetof
(
struct
paca_struct
,
xTOC
));
DEFINE
(
PACAEXCSP
,
offsetof
(
struct
paca_struct
,
exception_sp
));
DEFINE
(
PACAHRDWINTSTACK
,
offsetof
(
struct
paca_struct
,
xHrdIntStack
));
DEFINE
(
PACAPROCENABLED
,
offsetof
(
struct
paca_struct
,
xProcEnabled
));
DEFINE
(
PACAHRDWINTCOUNT
,
offsetof
(
struct
paca_struct
,
xHrdIntCount
));
DEFINE
(
PACADEFAULTDECR
,
offsetof
(
struct
paca_struct
,
default_decr
));
DEFINE
(
PACAPROFENABLED
,
offsetof
(
struct
paca_struct
,
prof_enabled
));
DEFINE
(
PACAPROFLEN
,
offsetof
(
struct
paca_struct
,
prof_len
));
...
...
arch/ppc64/kernel/chrp_setup.c
View file @
4348e62f
...
...
@@ -72,6 +72,7 @@ extern void openpic_init_IRQ(void);
extern
void
find_and_init_phbs
(
void
);
extern
void
pSeries_get_boot_time
(
struct
rtc_time
*
rtc_time
);
extern
void
pSeries_get_rtc_time
(
struct
rtc_time
*
rtc_time
);
extern
int
pSeries_set_rtc_time
(
struct
rtc_time
*
rtc_time
);
void
pSeries_calibrate_decr
(
void
);
...
...
@@ -256,7 +257,7 @@ chrp_init(unsigned long r3, unsigned long r4, unsigned long r5,
ppc_md
.
power_off
=
rtas_power_off
;
ppc_md
.
halt
=
rtas_halt
;
ppc_md
.
get_boot_time
=
pSeries_get_
rtc
_time
;
ppc_md
.
get_boot_time
=
pSeries_get_
boot
_time
;
ppc_md
.
get_rtc_time
=
pSeries_get_rtc_time
;
ppc_md
.
set_rtc_time
=
pSeries_set_rtc_time
;
ppc_md
.
calibrate_decr
=
pSeries_calibrate_decr
;
...
...
arch/ppc64/kernel/eeh.c
View file @
4348e62f
...
...
@@ -115,8 +115,17 @@ unsigned long eeh_check_failure(void *token, unsigned long val)
ret
=
rtas_call
(
ibm_read_slot_reset_state
,
3
,
3
,
rets
,
dn
->
eeh_config_addr
,
BUID_HI
(
dn
->
phb
->
buid
),
BUID_LO
(
dn
->
phb
->
buid
));
if
(
ret
==
0
&&
rets
[
1
]
==
1
&&
rets
[
0
]
>=
2
)
{
panic
(
"EEH: MMIO failure (%ld) on device:
\n
%s %s
\n
"
,
rets
[
0
],
pci_name
(
dev
),
dev
->
dev
.
name
);
/*
* XXX We should create a separate sysctl for this.
*
* Since the panic_on_oops sysctl is used to halt
* the system in light of potential corruption, we
* can use it here.
*/
if
(
panic_on_oops
)
panic
(
"EEH: MMIO failure (%ld) on device:
\n
%s
\n
"
,
rets
[
0
],
pci_name
(
dev
));
else
printk
(
"EEH: MMIO failure (%ld) on device:
\n
%s
\n
"
,
rets
[
0
],
pci_name
(
dev
));
}
}
eeh_false_positives
++
;
...
...
arch/ppc64/kernel/head.S
View file @
4348e62f
...
...
@@ -40,6 +40,15 @@
#define DO_SOFT_DISABLE
#endif
/*
copy
saved
SOFTE
bit
or
EE
bit
from
saved
MSR
depending
*
if
we
are
doing
soft
-
disable
or
not
*/
#ifdef DO_SOFT_DISABLE
#define DO_COPY_EE() ld r20,SOFTE(r1)
#else
#define DO_COPY_EE() rldicl r20,r23,49,63
#endif
/*
*
hcall
interface
to
pSeries
LPAR
*/
...
...
@@ -618,11 +627,7 @@ stab_bolted_user_return:
ld
r4
,
_DAR
(
r1
)
ld
r5
,
_DSISR
(
r1
)
addi
r3
,
r1
,
STACK_FRAME_OVERHEAD
#ifdef DO_SOFT_DISABLE
ld
r20
,
SOFTE
(
r1
)
/*
Copy
saved
SOFTE
bit
*/
#else
rldicl
r20
,
r23
,
49
,
63
/*
copy
EE
bit
from
saved
MSR
*/
#endif
DO_COPY_EE
()
li
r6
,
0x300
bl
.
save_remaining_regs
bl
.
do_page_fault
...
...
@@ -644,12 +649,9 @@ DataAccessSLB_common:
or
.
r3
,
r3
,
r3
/*
Check
return
code
*/
beq
fast_exception_return
/*
Return
if
we
succeeded
*/
addi
r3
,
r1
,
STACK_FRAME_OVERHEAD
#ifdef DO_SOFT_DISABLE
ld
r20
,
SOFTE
(
r1
)
#else
rldicl
r20
,
r23
,
49
,
63
/*
copy
EE
bit
from
saved
MSR
*/
#endif
DO_COPY_EE
()
li
r6
,
0x380
li
r5
,
0
bl
.
save_remaining_regs
bl
.
do_page_fault
b
.
ret_from_except
...
...
@@ -670,13 +672,9 @@ InstructionAccess_common:
bl
.
do_hash_page_ISI
/*
Try
to
handle
as
hpte
fault
*/
1
:
mr
r4
,
r22
mr
r5
,
r23
rlwinm
r5
,
r23
,
0
,
4
,
4
/*
We
only
care
about
PR
in
error_code
*/
addi
r3
,
r1
,
STACK_FRAME_OVERHEAD
#ifdef DO_SOFT_DISABLE
ld
r20
,
SOFTE
(
r1
)
#else
rldicl
r20
,
r23
,
49
,
63
/*
copy
EE
bit
from
saved
MSR
*/
#endif
DO_COPY_EE
()
li
r6
,
0x400
bl
.
save_remaining_regs
bl
.
do_page_fault
...
...
@@ -692,12 +690,9 @@ InstructionAccessSLB_common:
beq
+
fast_exception_return
/*
Return
if
we
succeeded
*/
addi
r3
,
r1
,
STACK_FRAME_OVERHEAD
#ifdef DO_SOFT_DISABLE
ld
r20
,
SOFTE
(
r1
)
#else
rldicl
r20
,
r23
,
49
,
63
/*
copy
EE
bit
from
saved
MSR
*/
#endif
DO_COPY_EE
()
li
r6
,
0x480
li
r5
,
0
bl
.
save_remaining_regs
bl
.
do_page_fault
b
.
ret_from_except
...
...
@@ -710,70 +705,14 @@ HardwareInterrupt_entry:
li
r20
,
0
li
r6
,
0x500
bl
.
save_remaining_regs
/
*
Determine
if
need
to
run
do_irq
on
a
hardware
interrupt
stack
*/
/
*
The
first
invocation
of
do_irq
will
occur
on
the
kernel
*/
/
*
stack
in
the
current
stack
*/
/
*
All
other
invocations
of
do_irq
will
run
on
the
hardware
*/
/
*
interrupt
stack
associated
with
the
PACA
of
the
current
*/
/
*
processor
.
*/
/
*
*/
/
*
The
call
to
do_irq
will
preserve
the
value
of
r14
-
r31
*/
/
*
*/
/*
*
XXX
turn
off
interrupt
stacks
until
the
thread_info
stuff
is
fixed
.
*
Otherwise
we
end
up
setting
need_resched
etc
bits
in
the
interrupt
*
stack
and
they
never
get
seen
when
we
return
to
the
process
stack
-
Anton
*/
#if 0
lbz
r21
,
PACAHRDWINTCOUNT
(
r13
)
/*
get
hardware
interrupt
cnt
*/
cmpi
0
,
r21
,
1
/*
*/
addi
r21
,
r21
,
1
/*
incr
hardware
interrupt
cnt
*/
stb
r21
,
PACAHRDWINTCOUNT
(
r13
)
/*
*/
bne
2
f
/*
*/
mr
r14
,
r1
/*
preserve
current
r1
*/
ld
r1
,
PACAHRDWINTSTACK
(
r13
)
/*
*/
std
r14
,
0
(
r1
)
/*
set
the
back
chain
*/
bl
.
do_IRQ
lbz
r22
,
PACAHRDWINTCOUNT
(
r13
)
/*
get
hardware
interrupt
cnt
*/
cmp
0
,
r22
,
r21
/*
debug
test
*/
bne
3
f
subi
r21
,
r21
,
1
stb
r21
,
PACAHRDWINTCOUNT
(
r13
)
/*
*/
mr
r1
,
r14
/*
*/
b
.
ret_from_except
#endif
2
:
bl
.
do_IRQ
#if 0
lbz
r22
,
PACAHRDWINTCOUNT
(
r13
)
/*
get
hardware
interrupt
cnt
*/
cmp
0
,
r22
,
r21
/*
debug
test
*/
bne
3
f
/*
*/
subi
r21
,
r21
,
1
/*
decr
hardware
interrupt
cnt
*/
stb
r21
,
PACAHRDWINTCOUNT
(
r13
)
/*
*/
#endif
b
.
ret_from_except
3
:
/
*
error
-
counts
out
of
sync
*/
#ifdef CONFIG_XMON
bl
.
xmon
#endif
4
:
b
4
b
.
globl
Alignment_common
Alignment_common
:
EXCEPTION_PROLOG_COMMON
addi
r3
,
r1
,
STACK_FRAME_OVERHEAD
#ifdef DO_SOFT_DISABLE
ld
r20
,
SOFTE
(
r1
)
#else
rldicl
r20
,
r23
,
49
,
63
/*
copy
EE
bit
from
saved
MSR
*/
#endif
DO_COPY_EE
()
li
r6
,
0x600
bl
.
save_remaining_regs
bl
.
AlignmentException
...
...
@@ -783,11 +722,7 @@ Alignment_common:
ProgramCheck_common
:
EXCEPTION_PROLOG_COMMON
addi
r3
,
r1
,
STACK_FRAME_OVERHEAD
#ifdef DO_SOFT_DISABLE
ld
r20
,
SOFTE
(
r1
)
#else
rldicl
r20
,
r23
,
49
,
63
/*
copy
EE
bit
from
saved
MSR
*/
#endif
DO_COPY_EE
()
li
r6
,
0x700
bl
.
save_remaining_regs
bl
.
ProgramCheckException
...
...
@@ -798,11 +733,7 @@ FPUnavailable_common:
EXCEPTION_PROLOG_COMMON
bne
.
load_up_fpu
/*
if
from
user
,
just
load
it
up
*/
addi
r3
,
r1
,
STACK_FRAME_OVERHEAD
#ifdef DO_SOFT_DISABLE
ld
r20
,
SOFTE
(
r1
)
#else
rldicl
r20
,
r23
,
49
,
63
/*
copy
EE
bit
from
saved
MSR
*/
#endif
DO_COPY_EE
()
li
r6
,
0x800
bl
.
save_remaining_regs
bl
.
KernelFPUnavailableException
...
...
@@ -818,11 +749,7 @@ SystemCall_common:
beq
+
HardwareInterrupt_entry
1
:
#endif
#ifdef DO_SOFT_DISABLE
ld
r20
,
SOFTE
(
r1
)
#else
rldicl
r20
,
r23
,
49
,
63
/*
copy
EE
bit
from
saved
MSR
*/
#endif
DO_COPY_EE
()
li
r6
,
0xC00
bl
.
save_remaining_regs
bl
.
DoSyscall
...
...
@@ -1866,18 +1793,6 @@ _STATIC(start_here_common)
li
r5
,
0
std
r0
,
PACAKSAVE
(
r13
)
/
*
ptr
to
hardware
interrupt
stack
for
boot
processor
*/
LOADADDR
(
r3
,
hardware_int_paca0
)
li
r5
,
PAGE_SIZE
sldi
r5
,
r5
,
3
subi
r5
,
r5
,
STACK_FRAME_OVERHEAD
add
r3
,
r3
,
r5
std
r3
,
PACAHRDWINTSTACK
(
r13
)
li
r3
,
0
stb
r3
,
PACAHRDWINTCOUNT
(
r13
)
/
*
Restore
the
parms
passed
in
from
the
bootloader
.
*/
mr
r3
,
r31
mr
r4
,
r30
...
...
@@ -1999,10 +1914,6 @@ swapper_pg_dir:
ioremap_dir
:
.
space
4096
.
globl
hardware_int_paca0
hardware_int_paca0
:
.
space
8
*
PAGE_SIZE
/*
1
page
segment
table
per
cpu
(
max
48
,
cpu0
allocated
at
STAB0_PHYS_ADDR
)
*/
.
globl
stab_array
stab_array
:
...
...
arch/ppc64/kernel/pSeries_pci.c
View file @
4348e62f
...
...
@@ -427,6 +427,7 @@ unsigned long __init find_and_init_phbs(void)
void
pcibios_name_device
(
struct
pci_dev
*
dev
)
{
#if 0
struct device_node *dn;
/*
...
...
@@ -446,6 +447,7 @@ void pcibios_name_device(struct pci_dev *dev)
}
}
}
#endif
}
void
__init
pcibios_fixup_device_resources
(
struct
pci_dev
*
dev
,
...
...
arch/ppc64/kernel/ppc_ksyms.c
View file @
4348e62f
...
...
@@ -49,8 +49,6 @@
extern
int
sys_ioctl
(
unsigned
int
fd
,
unsigned
int
cmd
,
unsigned
long
arg
);
extern
int
do_signal
(
sigset_t
*
,
struct
pt_regs
*
);
extern
int
register_ioctl32_conversion
(
unsigned
int
cmd
,
int
(
*
handler
)(
unsigned
int
,
unsigned
int
,
unsigned
long
,
struct
file
*
));
extern
int
unregister_ioctl32_conversion
(
unsigned
int
cmd
);
int
abs
(
int
);
...
...
@@ -66,9 +64,6 @@ EXPORT_SYMBOL(disable_irq_nosync);
EXPORT_SYMBOL
(
synchronize_irq
);
#endif
/* CONFIG_SMP */
EXPORT_SYMBOL
(
register_ioctl32_conversion
);
EXPORT_SYMBOL
(
unregister_ioctl32_conversion
);
EXPORT_SYMBOL
(
isa_io_base
);
EXPORT_SYMBOL
(
pci_io_base
);
...
...
arch/ppc64/kernel/process.c
View file @
4348e62f
...
...
@@ -385,46 +385,6 @@ int sys_execve(unsigned long a0, unsigned long a1, unsigned long a2,
return
error
;
}
void
initialize_paca_hardware_interrupt_stack
(
void
)
{
int
i
;
unsigned
long
stack
;
unsigned
long
end_of_stack
=
0
;
for
(
i
=
1
;
i
<
NR_CPUS
;
i
++
)
{
if
(
!
cpu_possible
(
i
))
continue
;
/* Carve out storage for the hardware interrupt stack */
stack
=
__get_free_pages
(
GFP_ATOMIC
,
get_order
(
8
*
PAGE_SIZE
));
if
(
!
stack
)
{
printk
(
"ERROR, cannot find space for hardware stack.
\n
"
);
panic
(
" no hardware stack "
);
}
/* Store the stack value in the PACA for the processor */
paca
[
i
].
xHrdIntStack
=
stack
+
(
8
*
PAGE_SIZE
)
-
STACK_FRAME_OVERHEAD
;
paca
[
i
].
xHrdIntCount
=
0
;
}
/*
* __get_free_pages() might give us a page > KERNBASE+256M which
* is mapped with large ptes so we can't set up the guard page.
*/
if
(
cur_cpu_spec
->
cpu_features
&
CPU_FTR_16M_PAGE
)
return
;
for
(
i
=
0
;
i
<
NR_CPUS
;
i
++
)
{
if
(
!
cpu_possible
(
i
))
continue
;
/* set page at the top of stack to be protected - prevent overflow */
end_of_stack
=
paca
[
i
].
xHrdIntStack
-
(
8
*
PAGE_SIZE
-
STACK_FRAME_OVERHEAD
);
ppc_md
.
hpte_updateboltedpp
(
PP_RXRX
,
end_of_stack
);
}
}
char
*
ppc_find_proc_name
(
unsigned
*
p
,
char
*
buf
,
unsigned
buflen
)
{
unsigned
long
tb_flags
;
...
...
arch/ppc64/kernel/rtas.c
View file @
4348e62f
...
...
@@ -24,6 +24,7 @@
#include <asm/machdep.h>
#include <asm/paca.h>
#include <asm/page.h>
#include <asm/param.h>
#include <asm/system.h>
#include <asm/abs_addr.h>
#include <asm/udbg.h>
...
...
@@ -178,6 +179,26 @@ rtas_call(int token, int nargs, int nret,
return
(
ulong
)((
nret
>
0
)
?
rtas_args
->
rets
[
0
]
:
0
);
}
/* Given an RTAS status code of 990n compute the hinted delay of 10^n
* (last digit) milliseconds. For now we bound at n=3 (1 sec).
*/
unsigned
int
rtas_extended_busy_delay_time
(
int
status
)
{
int
order
=
status
-
9900
;
unsigned
int
ms
;
if
(
order
<
0
)
order
=
0
;
/* RTC depends on this for -2 clock busy */
else
if
(
order
>
3
)
order
=
3
;
/* bound */
/* Use microseconds for reasonable accuracy */
for
(
ms
=
1000
;
order
>
0
;
order
--
)
ms
=
ms
*
10
;
return
ms
/
(
1000000
/
HZ
);
/* round down is fine */
}
#define FLASH_BLOCK_LIST_VERSION (1UL)
static
void
rtas_flash_firmware
(
void
)
...
...
arch/ppc64/kernel/rtc.c
View file @
4348e62f
...
...
@@ -35,6 +35,7 @@
#include <linux/spinlock.h>
#include <linux/bcd.h>
#include <asm/hardirq.h>
#include <asm/io.h>
#include <asm/uaccess.h>
#include <asm/system.h>
...
...
@@ -340,20 +341,63 @@ void iSeries_get_boot_time(struct rtc_time *tm)
#endif
#ifdef CONFIG_PPC_PSERIES
#define MAX_RTC_WAIT 5000
/* 5 sec */
#define RTAS_CLOCK_BUSY (-2)
void
pSeries_get_boot_time
(
struct
rtc_time
*
rtc_tm
)
{
unsigned
long
ret
[
8
];
int
error
,
wait_time
;
unsigned
long
max_wait_tb
;
max_wait_tb
=
__get_tb
()
+
tb_ticks_per_usec
*
1000
*
MAX_RTC_WAIT
;
do
{
error
=
rtas_call
(
rtas_token
(
"get-time-of-day"
),
0
,
8
,
(
void
*
)
&
ret
);
if
(
error
==
RTAS_CLOCK_BUSY
||
rtas_is_extended_busy
(
error
))
{
wait_time
=
rtas_extended_busy_delay_time
(
error
);
/* This is boot time so we spin. */
udelay
(
wait_time
*
1000
);
error
=
RTAS_CLOCK_BUSY
;
}
}
while
(
error
==
RTAS_CLOCK_BUSY
&&
(
__get_tb
()
<
max_wait_tb
));
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
;
}
/* NOTE: get_rtc_time will get an error if executed in interrupt context
* and if a delay is needed to read the clock. In this case we just
* silently return without updating rtc_tm.
*/
void
pSeries_get_rtc_time
(
struct
rtc_time
*
rtc_tm
)
{
unsigned
long
ret
[
8
];
int
error
;
int
count
;
int
error
,
wait_time
;
unsigned
long
max_wait_tb
;
/*
* error -2 is clock busy, we keep retrying a few times to see
* if it will come good -- paulus
*/
count
=
0
;
max_wait_tb
=
__get_tb
()
+
tb_ticks_per_usec
*
1000
*
MAX_RTC_WAIT
;
do
{
error
=
rtas_call
(
rtas_token
(
"get-time-of-day"
),
0
,
8
,
(
void
*
)
&
ret
);
}
while
(
error
==
-
2
&&
++
count
<
1000
);
if
(
error
==
RTAS_CLOCK_BUSY
||
rtas_is_extended_busy
(
error
))
{
if
(
in_interrupt
())
{
printk
(
KERN_WARNING
"error: reading clock would delay interrupt
\n
"
);
return
;
/* delay not allowed */
}
wait_time
=
rtas_extended_busy_delay_time
(
error
);
set_current_state
(
TASK_INTERRUPTIBLE
);
schedule_timeout
(
wait_time
);
error
=
RTAS_CLOCK_BUSY
;
}
}
while
(
error
==
RTAS_CLOCK_BUSY
&&
(
__get_tb
()
<
max_wait_tb
));
if
(
error
!=
0
)
{
printk
(
KERN_WARNING
"error: reading the clock failed (%d)
\n
"
,
...
...
@@ -371,20 +415,24 @@ void pSeries_get_rtc_time(struct rtc_time *rtc_tm)
int
pSeries_set_rtc_time
(
struct
rtc_time
*
tm
)
{
int
error
;
int
count
;
int
error
,
wait_time
;
unsigned
long
max_wait_tb
;
/*
* error -2 is clock busy, we keep retrying a few times to see
* if it will come good -- paulus
*/
count
=
0
;
max_wait_tb
=
__get_tb
()
+
tb_ticks_per_usec
*
1000
*
MAX_RTC_WAIT
;
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
==
RTAS_CLOCK_BUSY
||
rtas_is_extended_busy
(
error
))
{
if
(
in_interrupt
())
return
1
;
/* probably decrementer */
wait_time
=
rtas_extended_busy_delay_time
(
error
);
set_current_state
(
TASK_INTERRUPTIBLE
);
schedule_timeout
(
wait_time
);
error
=
RTAS_CLOCK_BUSY
;
}
}
while
(
error
==
RTAS_CLOCK_BUSY
&&
(
__get_tb
()
<
max_wait_tb
));
if
(
error
!=
0
)
printk
(
KERN_WARNING
"error: setting the clock failed (%d)
\n
"
,
...
...
arch/ppc64/kernel/semaphore.c
View file @
4348e62f
...
...
@@ -75,9 +75,8 @@ void __down(struct semaphore *sem)
struct
task_struct
*
tsk
=
current
;
DECLARE_WAITQUEUE
(
wait
,
tsk
);
tsk
->
state
=
TASK_UNINTERRUPTIBLE
;
__set_task_state
(
tsk
,
TASK_UNINTERRUPTIBLE
)
;
add_wait_queue_exclusive
(
&
sem
->
wait
,
&
wait
);
smp_wmb
();
/*
* Try to get the semaphore. If the count is > 0, then we've
...
...
@@ -87,10 +86,10 @@ void __down(struct semaphore *sem)
*/
while
(
__sem_update_count
(
sem
,
-
1
)
<=
0
)
{
schedule
();
tsk
->
state
=
TASK_UNINTERRUPTIBLE
;
set_task_state
(
tsk
,
TASK_UNINTERRUPTIBLE
)
;
}
remove_wait_queue
(
&
sem
->
wait
,
&
wait
);
tsk
->
state
=
TASK_RUNNING
;
__set_task_state
(
tsk
,
TASK_RUNNING
)
;
/*
* If there are any more sleepers, wake one of them up so
...
...
@@ -106,9 +105,8 @@ int __down_interruptible(struct semaphore * sem)
struct
task_struct
*
tsk
=
current
;
DECLARE_WAITQUEUE
(
wait
,
tsk
);
tsk
->
state
=
TASK_INTERRUPTIBLE
;
__set_task_state
(
tsk
,
TASK_INTERRUPTIBLE
)
;
add_wait_queue_exclusive
(
&
sem
->
wait
,
&
wait
);
smp_wmb
();
while
(
__sem_update_count
(
sem
,
-
1
)
<=
0
)
{
if
(
signal_pending
(
current
))
{
...
...
@@ -122,10 +120,11 @@ int __down_interruptible(struct semaphore * sem)
break
;
}
schedule
();
tsk
->
state
=
TASK_INTERRUPTIBLE
;
set_task_state
(
tsk
,
TASK_INTERRUPTIBLE
)
;
}
tsk
->
state
=
TASK_RUNNING
;
remove_wait_queue
(
&
sem
->
wait
,
&
wait
);
__set_task_state
(
tsk
,
TASK_RUNNING
);
wake_up
(
&
sem
->
wait
);
return
retval
;
}
arch/ppc64/kernel/sys_ppc32.c
View file @
4348e62f
...
...
@@ -1243,16 +1243,19 @@ asmlinkage long sys32_settimeofday(struct compat_timeval *tv, struct timezone *t
}
struct
msgbuf32
{
s32
mtype
;
char
mtext
[
1
];
};
struct
msgbuf32
{
compat_long_t
mtype
;
char
mtext
[
1
];
};
struct
semid_ds32
{
struct
ipc_perm
sem_perm
;
compat_time_t
sem_otime
;
compat_time_t
sem_ctime
;
u32
sem_base
;
u32
sem_pending
;
u32
sem_pending_last
;
u32
undo
;
compat_uptr_t
sem_base
;
compat_uptr_t
sem_pending
;
compat_uptr_t
sem_pending_last
;
compat_uptr_t
undo
;
unsigned
short
sem_nsems
;
};
...
...
@@ -1262,21 +1265,20 @@ struct semid64_ds32 {
compat_time_t
sem_otime
;
unsigned
int
__unused2
;
compat_time_t
sem_ctime
;
u32
sem_nsems
;
u32
__unused3
;
u32
__unused4
;
compat_ulong_t
sem_nsems
;
compat_ulong_t
__unused3
;
compat_ulong_t
__unused4
;
};
struct
msqid_ds32
{
struct
msqid_ds32
{
struct
ipc_perm
msg_perm
;
u32
msg_first
;
u32
msg_last
;
compat_uptr_t
msg_first
;
compat_uptr_t
msg_last
;
compat_time_t
msg_stime
;
compat_time_t
msg_rtime
;
compat_time_t
msg_ctime
;
u32
msg_lcbytes
;
u32
msg_lqbytes
;
compat_ulong_t
msg_lcbytes
;
compat_ulong_t
msg_lqbytes
;
unsigned
short
msg_cbytes
;
unsigned
short
msg_qnum
;
unsigned
short
msg_qbytes
;
...
...
@@ -1292,13 +1294,13 @@ struct msqid64_ds32 {
compat_time_t
msg_rtime
;
unsigned
int
__unused3
;
compat_time_t
msg_ctime
;
unsigned
in
t
msg_cbytes
;
unsigned
in
t
msg_qnum
;
unsigned
in
t
msg_qbytes
;
compat_ulong_
t
msg_cbytes
;
compat_ulong_
t
msg_qnum
;
compat_ulong_
t
msg_qbytes
;
compat_pid_t
msg_lspid
;
compat_pid_t
msg_lrpid
;
unsigned
in
t
__unused4
;
unsigned
in
t
__unused5
;
compat_ulong_
t
__unused4
;
compat_ulong_
t
__unused5
;
};
struct
shmid_ds32
{
...
...
@@ -1311,8 +1313,8 @@ struct shmid_ds32 {
compat_ipc_pid_t
shm_lpid
;
unsigned
short
shm_nattch
;
unsigned
short
__unused
;
unsigned
in
t
__unused2
;
unsigned
in
t
__unused3
;
compat_uptr_
t
__unused2
;
compat_uptr_
t
__unused3
;
};
struct
shmid64_ds32
{
...
...
@@ -1327,9 +1329,9 @@ struct shmid64_ds32 {
compat_size_t
shm_segsz
;
compat_pid_t
shm_cpid
;
compat_pid_t
shm_lpid
;
unsigned
in
t
shm_nattch
;
unsigned
in
t
__unused5
;
unsigned
in
t
__unused6
;
compat_ulong_
t
shm_nattch
;
compat_ulong_
t
__unused5
;
compat_ulong_
t
__unused6
;
};
/*
...
...
@@ -1350,7 +1352,7 @@ static long do_sys32_semctl(int first, int second, int third, void *uptr)
err
=
-
EFAULT
;
if
(
get_user
(
pad
,
(
u32
*
)
uptr
))
return
err
;
if
(
third
==
SETVAL
)
if
(
(
third
&
~
IPC_64
)
==
SETVAL
)
fourth
.
val
=
(
int
)
pad
;
else
fourth
.
__pad
=
(
void
*
)
A
(
pad
);
...
...
arch/ppc64/kernel/syscalls.c
View file @
4348e62f
/*
* linux/arch/ppc/kernel/sys_ppc.c
* linux/arch/ppc
64
/kernel/sys_ppc.c
*
* PowerPC version
* Copyright (C) 1995-1996 Gary Thomas (gdt@linuxppc.org)
...
...
@@ -40,7 +40,6 @@
#include <asm/uaccess.h>
#include <asm/ipc.h>
#include <asm/semaphore.h>
#include <asm/ppcdebug.h>
#include <asm/time.h>
extern
unsigned
long
wall_jiffies
;
...
...
@@ -79,6 +78,7 @@ sys_ipc (uint call, int first, int second, long third, void *ptr, long fifth)
case
SEMCTL
:
{
union
semun
fourth
;
ret
=
-
EINVAL
;
if
(
!
ptr
)
break
;
if
((
ret
=
get_user
(
fourth
.
__pad
,
(
void
**
)
ptr
)))
...
...
@@ -94,6 +94,7 @@ sys_ipc (uint call, int first, int second, long third, void *ptr, long fifth)
case
0
:
{
struct
ipc_kludge
tmp
;
ret
=
-
EINVAL
;
if
(
!
ptr
)
break
;
if
((
ret
=
copy_from_user
(
&
tmp
,
...
...
@@ -127,6 +128,7 @@ sys_ipc (uint call, int first, int second, long third, void *ptr, long fifth)
break
;
}
case
1
:
/* iBCS2 emulator entry point */
ret
=
-
EINVAL
;
if
(
!
segment_eq
(
get_fs
(),
get_ds
()))
break
;
ret
=
sys_shmat
(
first
,
(
char
*
)
ptr
,
second
,
...
...
arch/ppc64/kernel/vmlinux.lds.S
View file @
4348e62f
...
...
@@ -137,4 +137,9 @@ SECTIONS
.
=
ALIGN
(
4096
)
;
_end
=
.
;
PROVIDE
(
end
=
.
)
;
/
*
Sections
to
be
discarded
.
*/
/
DISCARD
/
:
{
*(.
exitcall.exit
)
}
}
arch/ppc64/kernel/xics.c
View file @
4348e62f
...
...
@@ -267,6 +267,15 @@ void xics_disable_irq(u_int virq)
irq
,
call_status
);
return
;
}
/* Have to set XIVE to 0xff to be able to remove a slot */
call_status
=
rtas_call
(
ibm_set_xive
,
3
,
1
,
NULL
,
irq
,
default_server
,
0xff
);
if
(
call_status
!=
0
)
{
printk
(
"xics_disable_irq: irq=%x: ibm_set_xive(0xff) returned %lx
\n
"
,
irq
,
call_status
);
return
;
}
}
void
xics_end_irq
(
u_int
irq
)
...
...
arch/ppc64/mm/fault.c
View file @
4348e62f
...
...
@@ -46,8 +46,10 @@ int debugger_kernel_faults = 1;
void
bad_page_fault
(
struct
pt_regs
*
,
unsigned
long
,
int
);
/*
* For 600- and 800-family processors, the error_code parameter is DSISR
* for a data fault, SRR1 for an instruction fault.
* The error_code parameter is
* - DSISR for a non-SLB data access fault,
* - SRR1 & 0x08000000 for a non-SLB instruction access fault
* - 0 any SLB fault.
*/
void
do_page_fault
(
struct
pt_regs
*
regs
,
unsigned
long
address
,
unsigned
long
error_code
)
...
...
@@ -58,17 +60,6 @@ void do_page_fault(struct pt_regs *regs, unsigned long address,
unsigned
long
code
=
SEGV_MAPERR
;
unsigned
long
is_write
=
error_code
&
0x02000000
;
/*
* Fortunately the bit assignments in SRR1 for an instruction
* fault and DSISR for a data fault are mostly the same for the
* bits we are interested in. But there are some bits which
* indicate errors in DSISR but can validly be set in SRR1.
*/
if
(
regs
->
trap
==
0x400
)
error_code
&=
0x48200000
;
else
if
(
regs
->
trap
!=
0x300
)
/* ensure error_code is 0 on SLB miss */
error_code
=
0
;
#ifdef CONFIG_DEBUG_KERNEL
if
(
debugger_fault_handler
&&
(
regs
->
trap
==
0x300
||
regs
->
trap
==
0x380
))
{
...
...
arch/ppc64/mm/init.c
View file @
4348e62f
...
...
@@ -540,8 +540,6 @@ static int __init setup_kcore(void)
}
module_init
(
setup_kcore
);
void
initialize_paca_hardware_interrupt_stack
(
void
);
void
__init
mem_init
(
void
)
{
#ifndef CONFIG_DISCONTIGMEM
...
...
@@ -608,9 +606,6 @@ void __init mem_init(void)
#endif
mem_init_done
=
1
;
/* set the last page of each hardware interrupt stack to be protected */
initialize_paca_hardware_interrupt_stack
();
#ifdef CONFIG_PPC_ISERIES
create_virtual_bus_tce_table
();
#endif
...
...
arch/ppc64/mm/numa.c
View file @
4348e62f
...
...
@@ -24,18 +24,21 @@
int
numa_cpu_lookup_table
[
NR_CPUS
]
=
{
[
0
...
(
NR_CPUS
-
1
)]
=
-
1
};
int
numa_memory_lookup_table
[
MAX_MEMORY
>>
MEMORY_INCREMENT_SHIFT
]
=
{
[
0
...
((
MAX_MEMORY
>>
MEMORY_INCREMENT_SHIFT
)
-
1
)]
=
-
1
};
unsigned
long
numa_cpumask_lookup_table
[
MAX_NUMNODES
];
cpumask_t
numa_cpumask_lookup_table
[
MAX_NUMNODES
];
int
nr_cpus_in_node
[
MAX_NUMNODES
]
=
{
[
0
...
(
MAX_NUMNODES
-
1
)]
=
0
};
struct
pglist_data
node_data
[
MAX_NUMNODES
];
bootmem_data_t
plat_node_bdata
[
MAX_NUMNODES
];
EXPORT_SYMBOL
(
node_data
);
EXPORT_SYMBOL
(
numa_memory_lookup_table
);
static
inline
void
map_cpu_to_node
(
int
cpu
,
int
node
)
{
dbg
(
"cpu %d maps to domain %d
\n
"
,
cpu
,
node
);
numa_cpu_lookup_table
[
cpu
]
=
node
;
if
(
!
(
numa_cpumask_lookup_table
[
node
]
&
1UL
<<
cpu
))
{
numa_cpumask_lookup_table
[
node
]
|=
1UL
<<
cpu
;
if
(
!
(
cpu_isset
(
cpu
,
numa_cpumask_lookup_table
[
node
])
))
{
cpu_set
(
cpu
,
numa_cpumask_lookup_table
[
node
])
;
nr_cpus_in_node
[
node
]
++
;
}
}
...
...
arch/ppc64/xmon/xmon.c
View file @
4348e62f
...
...
@@ -86,7 +86,6 @@ static int nvreadb(unsigned);
static
int
ppc_inst_dump
(
unsigned
long
,
long
);
void
print_address
(
unsigned
long
);
static
int
getsp
(
void
);
static
void
dump_hash_table
(
void
);
static
void
backtrace
(
struct
pt_regs
*
);
static
void
excprint
(
struct
pt_regs
*
);
static
void
prregs
(
struct
pt_regs
*
);
...
...
@@ -158,7 +157,6 @@ Commands:\n\
dd dump double values
\n
\
e print exception information
\n
\
f flush cache
\n
\
h dump hash table
\n
\
m examine/change memory
\n
\
mm move a block of memory
\n
\
ms set a block of memory
\n
\
...
...
@@ -590,9 +588,6 @@ cmds(struct pt_regs *excp)
case
'f'
:
cacheflush
();
break
;
case
'h'
:
dump_hash_table
();
break
;
case
's'
:
case
'x'
:
case
EOF
:
...
...
@@ -981,7 +976,7 @@ backtrace(struct pt_regs *excp)
}
printf
(
"
\n
"
);
if
(
regs
.
gpr
[
1
]
<
sp
)
{
printf
(
"<Stack drops into
32-bit
userspace %.16lx>
\n
"
,
regs
.
gpr
[
1
]);
printf
(
"<Stack drops into userspace %.16lx>
\n
"
,
regs
.
gpr
[
1
]);
break
;
}
...
...
@@ -1228,152 +1223,6 @@ super_regs()
scannl
();
}
#ifndef CONFIG_PPC64BRIDGE
static
void
dump_hash_table_seg
(
unsigned
seg
,
unsigned
start
,
unsigned
end
)
{
extern
void
*
Hash
;
extern
unsigned
long
Hash_size
;
unsigned
*
htab
=
Hash
;
unsigned
hsize
=
Hash_size
;
unsigned
v
,
hmask
,
va
,
last_va
;
int
found
,
last_found
,
i
;
unsigned
*
hg
,
w1
,
last_w2
,
last_va0
;
last_found
=
0
;
hmask
=
hsize
/
64
-
1
;
va
=
start
;
start
=
(
start
>>
12
)
&
0xffff
;
end
=
(
end
>>
12
)
&
0xffff
;
for
(
v
=
start
;
v
<
end
;
++
v
)
{
found
=
0
;
hg
=
htab
+
(((
v
^
seg
)
&
hmask
)
*
16
);
w1
=
0x80000000
|
(
seg
<<
7
)
|
(
v
>>
10
);
for
(
i
=
0
;
i
<
8
;
++
i
,
hg
+=
2
)
{
if
(
*
hg
==
w1
)
{
found
=
1
;
break
;
}
}
if
(
!
found
)
{
w1
^=
0x40
;
hg
=
htab
+
((
~
(
v
^
seg
)
&
hmask
)
*
16
);
for
(
i
=
0
;
i
<
8
;
++
i
,
hg
+=
2
)
{
if
(
*
hg
==
w1
)
{
found
=
1
;
break
;
}
}
}
if
(
!
(
last_found
&&
found
&&
(
hg
[
1
]
&
~
0x180
)
==
last_w2
+
4096
))
{
if
(
last_found
)
{
if
(
last_va
!=
last_va0
)
printf
(
" ... %x"
,
last_va
);
printf
(
"
\n
"
);
}
if
(
found
)
{
printf
(
"%x to %x"
,
va
,
hg
[
1
]);
last_va0
=
va
;
}
last_found
=
found
;
}
if
(
found
)
{
last_w2
=
hg
[
1
]
&
~
0x180
;
last_va
=
va
;
}
va
+=
4096
;
}
if
(
last_found
)
printf
(
" ... %x
\n
"
,
last_va
);
}
#else
/* CONFIG_PPC64BRIDGE */
static
void
dump_hash_table_seg
(
unsigned
seg
,
unsigned
start
,
unsigned
end
)
{
extern
void
*
Hash
;
extern
unsigned
long
Hash_size
;
unsigned
*
htab
=
Hash
;
unsigned
hsize
=
Hash_size
;
unsigned
v
,
hmask
,
va
,
last_va
;
int
found
,
last_found
,
i
;
unsigned
*
hg
,
w1
,
last_w2
,
last_va0
;
last_found
=
0
;
hmask
=
hsize
/
128
-
1
;
va
=
start
;
start
=
(
start
>>
12
)
&
0xffff
;
end
=
(
end
>>
12
)
&
0xffff
;
for
(
v
=
start
;
v
<
end
;
++
v
)
{
found
=
0
;
hg
=
htab
+
(((
v
^
seg
)
&
hmask
)
*
32
);
w1
=
1
|
(
seg
<<
12
)
|
((
v
&
0xf800
)
>>
4
);
for
(
i
=
0
;
i
<
8
;
++
i
,
hg
+=
4
)
{
if
(
hg
[
1
]
==
w1
)
{
found
=
1
;
break
;
}
}
if
(
!
found
)
{
w1
^=
2
;
hg
=
htab
+
((
~
(
v
^
seg
)
&
hmask
)
*
32
);
for
(
i
=
0
;
i
<
8
;
++
i
,
hg
+=
4
)
{
if
(
hg
[
1
]
==
w1
)
{
found
=
1
;
break
;
}
}
}
if
(
!
(
last_found
&&
found
&&
(
hg
[
3
]
&
~
0x180
)
==
last_w2
+
4096
))
{
if
(
last_found
)
{
if
(
last_va
!=
last_va0
)
printf
(
" ... %x"
,
last_va
);
printf
(
"
\n
"
);
}
if
(
found
)
{
printf
(
"%x to %x"
,
va
,
hg
[
3
]);
last_va0
=
va
;
}
last_found
=
found
;
}
if
(
found
)
{
last_w2
=
hg
[
3
]
&
~
0x180
;
last_va
=
va
;
}
va
+=
4096
;
}
if
(
last_found
)
printf
(
" ... %x
\n
"
,
last_va
);
}
#endif
/* CONFIG_PPC64BRIDGE */
static
unsigned
long
hash_ctx
;
static
unsigned
long
hash_start
;
static
unsigned
long
hash_end
;
static
void
dump_hash_table
()
{
int
seg
;
unsigned
seg_start
,
seg_end
;
hash_ctx
=
0
;
hash_start
=
0
;
hash_end
=
0xfffff000
;
scanhex
(
&
hash_ctx
);
scanhex
(
&
hash_start
);
scanhex
(
&
hash_end
);
printf
(
"Mappings for context %x
\n
"
,
hash_ctx
);
seg_start
=
hash_start
;
for
(
seg
=
hash_start
>>
28
;
seg
<=
hash_end
>>
28
;
++
seg
)
{
seg_end
=
(
seg
<<
28
)
|
0x0ffff000
;
if
(
seg_end
>
hash_end
)
seg_end
=
hash_end
;
dump_hash_table_seg
((
hash_ctx
<<
4
)
+
seg
,
seg_start
,
seg_end
);
seg_start
=
seg_end
+
0x1000
;
}
}
int
mread
(
unsigned
long
adrs
,
void
*
buf
,
int
size
)
{
...
...
include/asm-ppc64/mmzone.h
View file @
4348e62f
...
...
@@ -20,7 +20,7 @@ extern struct pglist_data node_data[];
extern
int
numa_cpu_lookup_table
[];
extern
int
numa_memory_lookup_table
[];
extern
unsigned
long
numa_cpumask_lookup_table
[];
extern
cpumask_t
numa_cpumask_lookup_table
[];
extern
int
nr_cpus_in_node
[];
#define MAX_MEMORY (1UL << 41)
...
...
include/asm-ppc64/paca.h
View file @
4348e62f
...
...
@@ -63,7 +63,7 @@ struct paca_struct {
u16
xPacaIndex
;
/* Logical processor number 0x18 */
u16
active
;
/* Is this cpu active? 0x1a */
u32
default_decr
;
/* Default decrementer value 0x1c */
u64
xHrdIntStack
;
/* Stack for hardware interrupts 0x20 */
u64
unused1
;
u64
xKsave
;
/* Saved Kernel stack addr or zero 0x28 */
u64
pvr
;
/* Processor version register 0x30 */
u8
*
exception_sp
;
/* 0x38 */
...
...
@@ -73,7 +73,7 @@ struct paca_struct {
STAB
xStab_data
;
/* Segment table information 0x50,0x58,0x60 */
u8
xSegments
[
STAB_CACHE_SIZE
];
/* Cache of used stab entries 0x68,0x70 */
u8
xProcEnabled
;
/* 1=soft enabled 0x78 */
u8
xHrdIntCount
;
/* Count of active hardware interrupts 0x79 */
u8
unused2
;
u8
prof_enabled
;
/* 1=iSeries profiling enabled 0x7A */
u8
stab_cache_pointer
;
u8
resv1
[
4
];
/* 0x7B-0x7F */
...
...
include/asm-ppc64/prom.h
View file @
4348e62f
...
...
@@ -183,8 +183,6 @@ extern struct device_node *find_type_devices(const char *type);
extern
struct
device_node
*
find_path_device
(
const
char
*
path
);
extern
struct
device_node
*
find_compatible_devices
(
const
char
*
type
,
const
char
*
compat
);
extern
struct
device_node
*
find_pci_device_OFnode
(
unsigned
char
bus
,
unsigned
char
dev_fn
);
extern
struct
device_node
*
find_all_nodes
(
void
);
extern
int
device_is_compatible
(
struct
device_node
*
device
,
const
char
*
);
extern
int
machine_is_compatible
(
const
char
*
compat
);
...
...
include/asm-ppc64/rtas.h
View file @
4348e62f
...
...
@@ -166,6 +166,13 @@ extern void rtas_restart(char *cmd);
extern
void
rtas_power_off
(
void
);
extern
void
rtas_halt
(
void
);
/* Given an RTAS status code of 9900..9905 compute the hinted delay */
unsigned
int
rtas_extended_busy_delay_time
(
int
status
);
static
inline
int
rtas_is_extended_busy
(
int
status
)
{
return
status
>=
9900
&&
status
<=
9909
;
}
/* Some RTAS ops require a data buffer and that buffer must be < 4G.
* Rather than having a memory allocator, just use this buffer
* (get the lock first), make the RTAS call. Copy the data instead
...
...
include/asm-ppc64/rwsem.h
View file @
4348e62f
/*
* include/asm-ppc/rwsem.h: R/W semaphores for PPC using the stuff
* include/asm-ppc
64
/rwsem.h: R/W semaphores for PPC using the stuff
* in lib/rwsem.c. Adapted largely from include/asm-i386/rwsem.h
* by Paul Mackerras <paulus@samba.org>.
*
...
...
@@ -74,9 +74,7 @@ static inline void init_rwsem(struct rw_semaphore *sem)
*/
static
inline
void
__down_read
(
struct
rw_semaphore
*
sem
)
{
if
(
atomic_inc_return
((
atomic_t
*
)(
&
sem
->
count
))
>
0
)
smp_wmb
();
else
if
(
unlikely
(
atomic_inc_return
((
atomic_t
*
)(
&
sem
->
count
))
<=
0
))
rwsem_down_read_failed
(
sem
);
}
...
...
@@ -87,7 +85,6 @@ static inline int __down_read_trylock(struct rw_semaphore *sem)
while
((
tmp
=
sem
->
count
)
>=
0
)
{
if
(
tmp
==
cmpxchg
(
&
sem
->
count
,
tmp
,
tmp
+
RWSEM_ACTIVE_READ_BIAS
))
{
smp_wmb
();
return
1
;
}
}
...
...
@@ -103,9 +100,7 @@ static inline void __down_write(struct rw_semaphore *sem)
tmp
=
atomic_add_return
(
RWSEM_ACTIVE_WRITE_BIAS
,
(
atomic_t
*
)(
&
sem
->
count
));
if
(
tmp
==
RWSEM_ACTIVE_WRITE_BIAS
)
smp_wmb
();
else
if
(
unlikely
(
tmp
!=
RWSEM_ACTIVE_WRITE_BIAS
))
rwsem_down_write_failed
(
sem
);
}
...
...
@@ -115,7 +110,6 @@ static inline int __down_write_trylock(struct rw_semaphore *sem)
tmp
=
cmpxchg
(
&
sem
->
count
,
RWSEM_UNLOCKED_VALUE
,
RWSEM_ACTIVE_WRITE_BIAS
);
smp_wmb
();
return
tmp
==
RWSEM_UNLOCKED_VALUE
;
}
...
...
@@ -126,9 +120,8 @@ static inline void __up_read(struct rw_semaphore *sem)
{
int
tmp
;
smp_wmb
();
tmp
=
atomic_dec_return
((
atomic_t
*
)(
&
sem
->
count
));
if
(
tmp
<
-
1
&&
(
tmp
&
RWSEM_ACTIVE_MASK
)
==
0
)
if
(
unlikely
(
tmp
<
-
1
&&
(
tmp
&
RWSEM_ACTIVE_MASK
)
==
0
)
)
rwsem_wake
(
sem
);
}
...
...
@@ -137,9 +130,8 @@ static inline void __up_read(struct rw_semaphore *sem)
*/
static
inline
void
__up_write
(
struct
rw_semaphore
*
sem
)
{
smp_wmb
();
if
(
atomic_sub_return
(
RWSEM_ACTIVE_WRITE_BIAS
,
(
atomic_t
*
)(
&
sem
->
count
))
<
0
)
if
(
unlikely
(
atomic_sub_return
(
RWSEM_ACTIVE_WRITE_BIAS
,
(
atomic_t
*
)(
&
sem
->
count
))
<
0
))
rwsem_wake
(
sem
);
}
...
...
@@ -158,7 +150,6 @@ static inline void __downgrade_write(struct rw_semaphore *sem)
{
int
tmp
;
smp_wmb
();
tmp
=
atomic_add_return
(
-
RWSEM_WAITING_BIAS
,
(
atomic_t
*
)(
&
sem
->
count
));
if
(
tmp
<
0
)
rwsem_downgrade_wake
(
sem
);
...
...
@@ -169,7 +160,6 @@ static inline void __downgrade_write(struct rw_semaphore *sem)
*/
static
inline
int
rwsem_atomic_update
(
int
delta
,
struct
rw_semaphore
*
sem
)
{
smp_mb
();
return
atomic_add_return
(
delta
,
(
atomic_t
*
)(
&
sem
->
count
));
}
...
...
include/asm-ppc64/semaphore.h
View file @
4348e62f
...
...
@@ -82,9 +82,8 @@ static inline void down(struct semaphore * sem)
/*
* Try to get the semaphore, take the slow path if we fail.
*/
if
(
atomic_dec_return
(
&
sem
->
count
)
<
0
)
if
(
unlikely
(
atomic_dec_return
(
&
sem
->
count
)
<
0
)
)
__down
(
sem
);
smp_wmb
();
}
static
inline
int
down_interruptible
(
struct
semaphore
*
sem
)
...
...
@@ -96,23 +95,18 @@ static inline int down_interruptible(struct semaphore * sem)
#endif
might_sleep
();
if
(
atomic_dec_return
(
&
sem
->
count
)
<
0
)
if
(
unlikely
(
atomic_dec_return
(
&
sem
->
count
)
<
0
)
)
ret
=
__down_interruptible
(
sem
);
smp_wmb
();
return
ret
;
}
static
inline
int
down_trylock
(
struct
semaphore
*
sem
)
{
int
ret
;
#ifdef WAITQUEUE_DEBUG
CHECK_MAGIC
(
sem
->
__magic
);
#endif
ret
=
atomic_dec_if_positive
(
&
sem
->
count
)
<
0
;
smp_wmb
();
return
ret
;
return
atomic_dec_if_positive
(
&
sem
->
count
)
<
0
;
}
static
inline
void
up
(
struct
semaphore
*
sem
)
...
...
@@ -121,8 +115,7 @@ static inline void up(struct semaphore * sem)
CHECK_MAGIC
(
sem
->
__magic
);
#endif
smp_wmb
();
if
(
atomic_inc_return
(
&
sem
->
count
)
<=
0
)
if
(
unlikely
(
atomic_inc_return
(
&
sem
->
count
)
<=
0
))
__up
(
sem
);
}
...
...
include/asm-ppc64/serial.h
View file @
4348e62f
...
...
@@ -26,11 +26,9 @@
/* Standard COM flags (except for COM4, because of the 8514 problem) */
#ifdef CONFIG_SERIAL_DETECT_IRQ
#define STD_COM_FLAGS (ASYNC_BOOT_AUTOCONF | ASYNC_SKIP_TEST | ASYNC_AUTO_IRQ)
#define STD_COM4_FLAGS (ASYNC_BOOT_AUTOCONF | ASYNC_AUTO_IRQ)
#define STD_COM_FLAGS (ASYNC_BOOT_AUTOCONF | ASYNC_AUTO_IRQ)
#else
#define STD_COM_FLAGS (ASYNC_BOOT_AUTOCONF | ASYNC_SKIP_TEST)
#define STD_COM4_FLAGS ASYNC_BOOT_AUTOCONF
#define STD_COM_FLAGS ASYNC_BOOT_AUTOCONF
#endif
#ifdef CONFIG_SERIAL_MANY_PORTS
...
...
@@ -60,8 +58,8 @@
/* UART CLK PORT IRQ FLAGS */
\
{ 0, BASE_BAUD, 0x3F8, 4, STD_COM_FLAGS },
/* ttyS0 */
\
{ 0, BASE_BAUD, 0x2F8, 3, STD_COM_FLAGS },
/* ttyS1 */
\
{ 0, BASE_BAUD, 0x
3E8, 4
, STD_COM_FLAGS },
/* ttyS2 */
\
{ 0, BASE_BAUD, 0x
2E8, 3, STD_COM4
_FLAGS },
/* ttyS3 */
{ 0, BASE_BAUD, 0x
890, 0xf
, STD_COM_FLAGS },
/* ttyS2 */
\
{ 0, BASE_BAUD, 0x
898, 0xe, STD_COM
_FLAGS },
/* ttyS3 */
#ifdef CONFIG_SERIAL_MANY_PORTS
...
...
include/asm-ppc64/topology.h
View file @
4348e62f
...
...
@@ -24,14 +24,16 @@ static inline int cpu_to_node(int cpu)
#define parent_node(node) (node)
static
inline
unsigned
long
node_to_cpumask
(
int
node
)
static
inline
cpumask_t
node_to_cpumask
(
int
node
)
{
return
numa_cpumask_lookup_table
[
node
];
}
static
inline
int
node_to_first_cpu
(
int
node
)
{
return
__ffs
(
node_to_cpumask
(
node
));
cpumask_t
tmp
;
tmp
=
node_to_cpumask
(
node
);
return
first_cpu
(
tmp
);
}
#define node_to_memblk(node) (node)
...
...
include/asm-ppc64/uaccess.h
View file @
4348e62f
...
...
@@ -132,6 +132,7 @@ extern long __put_user_bad(void);
#define __put_user_size(x,ptr,size,retval,errret) \
do { \
might_sleep(); \
retval = 0; \
switch (size) { \
case 1: __put_user_asm(x,ptr,retval,"stb",errret); break; \
...
...
@@ -185,6 +186,7 @@ extern long __get_user_bad(void);
#define __get_user_size(x,ptr,size,retval,errret) \
do { \
might_sleep(); \
retval = 0; \
switch (size) { \
case 1: __get_user_asm(x,ptr,retval,"lbz",errret); break; \
...
...
@@ -220,6 +222,7 @@ extern unsigned long __copy_tofrom_user(void *to, const void *from,
static
inline
unsigned
long
__copy_from_user
(
void
*
to
,
const
void
__user
*
from
,
unsigned
long
n
)
{
might_sleep
();
if
(
__builtin_constant_p
(
n
))
{
unsigned
long
ret
;
...
...
@@ -244,6 +247,7 @@ __copy_from_user(void *to, const void __user *from, unsigned long n)
static
inline
unsigned
long
__copy_to_user
(
void
__user
*
to
,
const
void
*
from
,
unsigned
long
n
)
{
might_sleep
();
if
(
__builtin_constant_p
(
n
))
{
unsigned
long
ret
;
...
...
@@ -289,6 +293,7 @@ copy_to_user(void *to, const void *from, unsigned long n)
static
inline
unsigned
long
copy_in_user
(
void
*
to
,
const
void
*
from
,
unsigned
long
n
)
{
might_sleep
();
if
(
likely
(
access_ok
(
VERIFY_READ
,
from
,
n
)
&&
access_ok
(
VERIFY_WRITE
,
to
,
n
)))
n
=
__copy_tofrom_user
(
to
,
from
,
n
);
...
...
@@ -300,6 +305,7 @@ extern unsigned long __clear_user(void *addr, unsigned long size);
static
inline
unsigned
long
clear_user
(
void
*
addr
,
unsigned
long
size
)
{
might_sleep
();
if
(
likely
(
access_ok
(
VERIFY_WRITE
,
addr
,
size
)))
size
=
__clear_user
(
addr
,
size
);
return
size
;
...
...
@@ -310,6 +316,7 @@ extern int __strncpy_from_user(char *dst, const char *src, long count);
static
inline
long
strncpy_from_user
(
char
*
dst
,
const
char
*
src
,
long
count
)
{
might_sleep
();
if
(
likely
(
access_ok
(
VERIFY_READ
,
src
,
1
)))
return
__strncpy_from_user
(
dst
,
src
,
count
);
return
-
EFAULT
;
...
...
@@ -329,6 +336,7 @@ extern int __strnlen_user(const char *str, long len);
*/
static
inline
int
strnlen_user
(
const
char
*
str
,
long
len
)
{
might_sleep
();
if
(
likely
(
access_ok
(
VERIFY_READ
,
str
,
1
)))
return
__strnlen_user
(
str
,
len
);
return
0
;
...
...
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