Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
Linux-御风守护者
linux
提交
cce0cac1
L
linux
项目概览
Linux-御风守护者
/
linux
与 Fork 源项目一致
从无法访问的项目Fork
通知
1
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
L
linux
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
cce0cac1
编写于
2月 08, 2006
作者:
L
Linus Torvalds
浏览文件
操作
浏览文件
下载
差异文件
Merge master.kernel.org:/home/rmk/linux-2.6-arm
Manual conflict merge of arch/arm/Kconfig
上级
f564c5fe
18f49ea2
变更
33
隐藏空白更改
内联
并排
Showing
33 changed file
with
347 addition
and
137 deletion
+347
-137
arch/arm/Kconfig
arch/arm/Kconfig
+36
-8
arch/arm/configs/enp2611_defconfig
arch/arm/configs/enp2611_defconfig
+1
-1
arch/arm/configs/ixdp2400_defconfig
arch/arm/configs/ixdp2400_defconfig
+1
-1
arch/arm/configs/ixdp2401_defconfig
arch/arm/configs/ixdp2401_defconfig
+1
-1
arch/arm/configs/ixdp2801_defconfig
arch/arm/configs/ixdp2801_defconfig
+1
-1
arch/arm/configs/s3c2410_defconfig
arch/arm/configs/s3c2410_defconfig
+38
-13
arch/arm/kernel/calls.S
arch/arm/kernel/calls.S
+4
-4
arch/arm/kernel/entry-armv.S
arch/arm/kernel/entry-armv.S
+16
-1
arch/arm/kernel/sys_oabi-compat.c
arch/arm/kernel/sys_oabi-compat.c
+71
-0
arch/arm/mach-clps711x/Kconfig
arch/arm/mach-clps711x/Kconfig
+2
-0
arch/arm/mach-ixp2000/enp2611.c
arch/arm/mach-ixp2000/enp2611.c
+1
-0
arch/arm/mach-ixp2000/ixdp2400.c
arch/arm/mach-ixp2000/ixdp2400.c
+1
-0
arch/arm/mach-ixp2000/ixdp2x01.c
arch/arm/mach-ixp2000/ixdp2x01.c
+4
-1
arch/arm/mach-omap1/board-generic.c
arch/arm/mach-omap1/board-generic.c
+2
-1
arch/arm/mach-omap1/board-h2.c
arch/arm/mach-omap1/board-h2.c
+2
-1
arch/arm/mach-omap1/board-h3.c
arch/arm/mach-omap1/board-h3.c
+2
-1
arch/arm/mach-omap1/board-innovator.c
arch/arm/mach-omap1/board-innovator.c
+2
-1
arch/arm/mach-omap1/board-netstar.c
arch/arm/mach-omap1/board-netstar.c
+2
-1
arch/arm/mach-omap1/board-osk.c
arch/arm/mach-omap1/board-osk.c
+2
-1
arch/arm/mach-omap1/board-palmte.c
arch/arm/mach-omap1/board-palmte.c
+2
-1
arch/arm/mach-omap1/board-perseus2.c
arch/arm/mach-omap1/board-perseus2.c
+2
-1
arch/arm/mach-omap1/board-voiceblue.c
arch/arm/mach-omap1/board-voiceblue.c
+2
-1
arch/arm/mach-omap1/io.c
arch/arm/mach-omap1/io.c
+25
-17
arch/arm/mach-omap2/board-generic.c
arch/arm/mach-omap2/board-generic.c
+2
-1
arch/arm/mach-omap2/board-h4.c
arch/arm/mach-omap2/board-h4.c
+2
-1
arch/arm/mach-realview/core.c
arch/arm/mach-realview/core.c
+1
-1
arch/arm/mach-s3c2410/clock.c
arch/arm/mach-s3c2410/clock.c
+33
-10
arch/arm/mach-s3c2410/clock.h
arch/arm/mach-s3c2410/clock.h
+1
-0
arch/arm/mach-s3c2410/devs.c
arch/arm/mach-s3c2410/devs.c
+5
-0
arch/arm/plat-omap/sram.c
arch/arm/plat-omap/sram.c
+9
-0
drivers/serial/s3c2410.c
drivers/serial/s3c2410.c
+4
-0
include/asm-arm/arch-omap/io.h
include/asm-arm/arch-omap/io.h
+5
-1
include/asm-arm/mutex.h
include/asm-arm/mutex.h
+65
-66
未找到文件。
arch/arm/Kconfig
浏览文件 @
cce0cac1
...
...
@@ -10,9 +10,9 @@ config ARM
default y
help
The ARM series is a line of low-power-consumption RISC chip designs
licensed by ARM
l
td and targeted at embedded applications and
licensed by ARM
L
td and targeted at embedded applications and
handhelds such as the Compaq IPAQ. ARM-based PCs are no longer
manufactured, but
legacy ARM-based PC hardware remains popular in
manufactured, but legacy ARM-based PC hardware remains popular in
Europe. There is an ARM Linux project with a web page at
<http://www.arm.linux.org.uk/>.
...
...
@@ -84,45 +84,62 @@ config ARCH_CLPS7500
bool "Cirrus-CL-PS7500FE"
select TIMER_ACORN
select ISA
help
Support for the Cirrus Logic PS7500FE system-on-a-chip.
config ARCH_CLPS711X
bool "CLPS711x/EP721x-based"
help
Support for Cirrus Logic 711x/721x based boards.
config ARCH_CO285
bool "Co-EBSA285"
select FOOTBRIDGE
select FOOTBRIDGE_ADDIN
help
Support for Intel's EBSA285 companion chip.
config ARCH_EBSA110
bool "EBSA-110"
select ISA
help
This is an evaluation board for the StrongARM processor available
from Digital. It has limited hardware on-board, including an
onboard
from Digital. It has limited hardware on-board, including an
Ethernet interface, two PCMCIA sockets, two serial ports and a
parallel port.
config ARCH_FOOTBRIDGE
bool "FootBridge"
select FOOTBRIDGE
help
Support for systems based on the DC21285 companion chip
("FootBridge"), such as the Simtec CATS and the Rebel NetWinder.
config ARCH_INTEGRATOR
bool "Integrator"
select ARM_AMBA
select ICST525
help
Support for ARM's Integrator platform.
config ARCH_IOP3XX
bool "IOP3xx-based"
select PCI
help
Support for Intel's IOP3XX (XScale) family of processors.
config ARCH_IXP4XX
bool "IXP4xx-based"
select DMABOUNCE
select PCI
help
Support for Intel's IXP4XX (XScale) family of processors.
config ARCH_IXP2000
bool "IXP2400/2800-based"
select PCI
help
Support for Intel's IXP2400/2800 (XScale) family of processors.
config ARCH_L7200
bool "LinkUp-L7200"
...
...
@@ -140,6 +157,8 @@ config ARCH_L7200
config ARCH_PXA
bool "PXA2xx-based"
select ARCH_MTD_XIP
help
Support for Intel's PXA2XX processor line.
config ARCH_RPC
bool "RiscPC"
...
...
@@ -157,19 +176,24 @@ config ARCH_SA1100
select ISA
select ARCH_DISCONTIGMEM_ENABLE
select ARCH_MTD_XIP
help
Support for StrongARM 11x0 based boards.
config ARCH_S3C2410
bool "Samsung S3C2410"
help
Samsung S3C2410X CPU based systems, such as the Simtec Electronics
BAST (<http://www.simtec.co.uk/products/EB110ITX/>), the IPAQ 1940 or
the Samsung SMDK2410 development board (and der
vi
atives).
the Samsung SMDK2410 development board (and der
iv
atives).
config ARCH_SHARK
bool "Shark"
select ISA
select ISA_DMA
select PCI
help
Support for the StrongARM based Digital DNARD machine, also known
as "Shark" (<http://www.shark-linux.de/shark.html>).
config ARCH_LH7A40X
bool "Sharp LH7A40X"
...
...
@@ -181,6 +205,8 @@ config ARCH_LH7A40X
config ARCH_OMAP
bool "TI OMAP"
help
Support for TI's OMAP platform (OMAP1 and OMAP2).
config ARCH_VERSATILE
bool "Versatile"
...
...
@@ -199,6 +225,8 @@ config ARCH_REALVIEW
config ARCH_IMX
bool "IMX"
help
Support for Motorola's i.MX family of processors (MX1, MXL).
config ARCH_H720X
bool "Hynix-HMS720x-based"
...
...
@@ -215,8 +243,8 @@ config ARCH_AAEC2000
config ARCH_AT91RM9200
bool "AT91RM9200"
help
Say Y here if you intend to run this kernel on an A
T91RM9200-based
board.
Say Y here if you intend to run this kernel on an A
tmel
AT91RM9200-based
board.
endchoice
...
...
@@ -422,8 +450,8 @@ config AEABI
To use this you need GCC version 4.0.0 or later.
config OABI_COMPAT
bool "Allow old ABI binaries to run with this kernel"
depends on AEABI
bool "Allow old ABI binaries to run with this kernel
(EXPERIMENTAL)
"
depends on AEABI
&& EXPERIMENTAL
default y
help
This option preserves the old syscall interface along with the
...
...
arch/arm/configs/enp2611_defconfig
浏览文件 @
cce0cac1
...
...
@@ -171,7 +171,7 @@ CONFIG_ALIGNMENT_TRAP=y
#
CONFIG_ZBOOT_ROM_TEXT=0x0
CONFIG_ZBOOT_ROM_BSS=0x0
CONFIG_CMDLINE="console=ttyS0,57600 root=/dev/nfs ip=bootp mem=64M@0x0
pci=firmware
"
CONFIG_CMDLINE="console=ttyS0,57600 root=/dev/nfs ip=bootp mem=64M@0x0"
# CONFIG_XIP_KERNEL is not set
#
...
...
arch/arm/configs/ixdp2400_defconfig
浏览文件 @
cce0cac1
...
...
@@ -172,7 +172,7 @@ CONFIG_ALIGNMENT_TRAP=y
#
CONFIG_ZBOOT_ROM_TEXT=0x0
CONFIG_ZBOOT_ROM_BSS=0x0
CONFIG_CMDLINE="console=ttyS0,57600 root=/dev/nfs ip=bootp mem=64M@0x0
pci=firmware
"
CONFIG_CMDLINE="console=ttyS0,57600 root=/dev/nfs ip=bootp mem=64M@0x0"
# CONFIG_XIP_KERNEL is not set
#
...
...
arch/arm/configs/ixdp2401_defconfig
浏览文件 @
cce0cac1
...
...
@@ -172,7 +172,7 @@ CONFIG_ALIGNMENT_TRAP=y
#
CONFIG_ZBOOT_ROM_TEXT=0x0
CONFIG_ZBOOT_ROM_BSS=0x0
CONFIG_CMDLINE="console=ttyS0,115200 root=/dev/nfs ip=bootp mem=64M@0x0
pci=firmware
"
CONFIG_CMDLINE="console=ttyS0,115200 root=/dev/nfs ip=bootp mem=64M@0x0"
# CONFIG_XIP_KERNEL is not set
#
...
...
arch/arm/configs/ixdp2801_defconfig
浏览文件 @
cce0cac1
...
...
@@ -172,7 +172,7 @@ CONFIG_ALIGNMENT_TRAP=y
#
CONFIG_ZBOOT_ROM_TEXT=0x0
CONFIG_ZBOOT_ROM_BSS=0x0
CONFIG_CMDLINE="console=ttyS0,115200 root=/dev/nfs ip=bootp mem=64M@0x0
pci=firmware ixdp2x01_clock=50000000
"
CONFIG_CMDLINE="console=ttyS0,115200 root=/dev/nfs ip=bootp mem=64M@0x0"
# CONFIG_XIP_KERNEL is not set
#
...
...
arch/arm/configs/s3c2410_defconfig
浏览文件 @
cce0cac1
#
# Automatically generated make config: don't edit
# Linux kernel version: 2.6.1
5-rc1
#
Sun Nov 13 17:41:24 2005
# Linux kernel version: 2.6.1
6-rc2
#
Mon Feb 6 11:17:23 2006
#
CONFIG_ARM=y
CONFIG_MMU=y
CONFIG_UID16=y
CONFIG_RWSEM_GENERIC_SPINLOCK=y
CONFIG_GENERIC_CALIBRATE_DELAY=y
...
...
@@ -28,27 +27,31 @@ CONFIG_SYSVIPC=y
# CONFIG_BSD_PROCESS_ACCT is not set
CONFIG_SYSCTL=y
# CONFIG_AUDIT is not set
# CONFIG_HOTPLUG is not set
CONFIG_KOBJECT_UEVENT=y
# CONFIG_IKCONFIG is not set
CONFIG_INITRAMFS_SOURCE=""
CONFIG_UID16=y
CONFIG_CC_OPTIMIZE_FOR_SIZE=y
# CONFIG_EMBEDDED is not set
CONFIG_KALLSYMS=y
# CONFIG_KALLSYMS_ALL is not set
# CONFIG_KALLSYMS_EXTRA_PASS is not set
CONFIG_HOTPLUG=y
CONFIG_PRINTK=y
CONFIG_BUG=y
CONFIG_ELF_CORE=y
CONFIG_BASE_FULL=y
CONFIG_FUTEX=y
CONFIG_EPOLL=y
CONFIG_CC_OPTIMIZE_FOR_SIZE=y
CONFIG_SHMEM=y
CONFIG_CC_ALIGN_FUNCTIONS=0
CONFIG_CC_ALIGN_LABELS=0
CONFIG_CC_ALIGN_LOOPS=0
CONFIG_CC_ALIGN_JUMPS=0
CONFIG_SLAB=y
# CONFIG_TINY_SHMEM is not set
CONFIG_BASE_SMALL=0
# CONFIG_SLOB is not set
CONFIG_OBSOLETE_INTERMODULE=y
#
# Loadable module support
...
...
@@ -102,6 +105,7 @@ CONFIG_ARCH_S3C2410=y
# CONFIG_ARCH_IMX is not set
# CONFIG_ARCH_H720X is not set
# CONFIG_ARCH_AAEC2000 is not set
# CONFIG_ARCH_AT91RM9200 is not set
#
# S3C24XX Implementations
...
...
@@ -160,7 +164,6 @@ CONFIG_CPU_TLB_V4WBI=y
# Bus support
#
CONFIG_ISA=y
CONFIG_ISA_DMA_API=y
#
# PCCARD (PCMCIA/CardBus) support
...
...
@@ -172,6 +175,7 @@ CONFIG_ISA_DMA_API=y
#
# CONFIG_PREEMPT is not set
# CONFIG_NO_IDLE_HZ is not set
# CONFIG_AEABI is not set
# CONFIG_ARCH_DISCONTIGMEM_ENABLE is not set
CONFIG_SELECT_MEMORY_MODEL=y
CONFIG_FLATMEM_MANUAL=y
...
...
@@ -214,6 +218,8 @@ CONFIG_BINFMT_AOUT=y
# Power management options
#
CONFIG_PM=y
CONFIG_PM_LEGACY=y
# CONFIG_PM_DEBUG is not set
CONFIG_APM=y
#
...
...
@@ -259,6 +265,11 @@ CONFIG_TCP_CONG_BIC=y
# SCTP Configuration (EXPERIMENTAL)
#
# CONFIG_IP_SCTP is not set
#
# TIPC Configuration (EXPERIMENTAL)
#
# CONFIG_TIPC is not set
# CONFIG_ATM is not set
# CONFIG_BRIDGE is not set
# CONFIG_VLAN_8021Q is not set
...
...
@@ -276,7 +287,6 @@ CONFIG_TCP_CONG_BIC=y
# QoS and/or fair queueing
#
# CONFIG_NET_SCHED is not set
# CONFIG_NET_CLS_ROUTE is not set
#
# Network testing
...
...
@@ -299,6 +309,11 @@ CONFIG_PREVENT_FIRMWARE_BUILD=y
# CONFIG_FW_LOADER is not set
# CONFIG_DEBUG_DRIVER is not set
#
# Connector - unified userspace <-> kernelspace linker
#
# CONFIG_CONNECTOR is not set
#
# Memory Technology Devices (MTD)
#
...
...
@@ -412,8 +427,6 @@ CONFIG_PARPORT_1284=y
#
# Block devices
#
# CONFIG_BLK_DEV_XD is not set
# CONFIG_PARIDE is not set
# CONFIG_BLK_DEV_COW_COMMON is not set
CONFIG_BLK_DEV_LOOP=y
# CONFIG_BLK_DEV_CRYPTOLOOP is not set
...
...
@@ -502,7 +515,6 @@ CONFIG_NETDEVICES=y
CONFIG_NET_ETHERNET=y
CONFIG_MII=y
# CONFIG_NET_VENDOR_3COM is not set
# CONFIG_LANCE is not set
# CONFIG_NET_VENDOR_SMC is not set
# CONFIG_SMC91X is not set
CONFIG_DM9000=y
...
...
@@ -607,11 +619,11 @@ CONFIG_SERIAL_NONSTANDARD=y
# CONFIG_ROCKETPORT is not set
# CONFIG_CYCLADES is not set
# CONFIG_DIGIEPCA is not set
# CONFIG_ESPSERIAL is not set
# CONFIG_MOXA_INTELLIO is not set
# CONFIG_MOXA_SMARTIO is not set
# CONFIG_ISI is not set
# CONFIG_SYNCLINKMP is not set
# CONFIG_SYNCLINK_GT is not set
# CONFIG_N_HDLC is not set
# CONFIG_RISCOM8 is not set
# CONFIG_SPECIALIX is not set
...
...
@@ -625,6 +637,7 @@ CONFIG_SERIAL_NONSTANDARD=y
CONFIG_SERIAL_8250=y
CONFIG_SERIAL_8250_CONSOLE=y
CONFIG_SERIAL_8250_NR_UARTS=8
CONFIG_SERIAL_8250_RUNTIME_UARTS=4
CONFIG_SERIAL_8250_EXTENDED=y
CONFIG_SERIAL_8250_MANY_PORTS=y
CONFIG_SERIAL_8250_SHARE_IRQ=y
...
...
@@ -687,6 +700,7 @@ CONFIG_S3C2410_RTC=y
#
# TPM devices
#
# CONFIG_TCG_TPM is not set
# CONFIG_TELCLOCK is not set
#
...
...
@@ -730,6 +744,12 @@ CONFIG_SENSORS_EEPROM=m
# CONFIG_I2C_DEBUG_BUS is not set
# CONFIG_I2C_DEBUG_CHIP is not set
#
# SPI support
#
# CONFIG_SPI is not set
# CONFIG_SPI_MASTER is not set
#
# Hardware Monitoring support
#
...
...
@@ -863,6 +883,7 @@ CONFIG_FS_MBCACHE=y
# CONFIG_JFS_FS is not set
# CONFIG_FS_POSIX_ACL is not set
# CONFIG_XFS_FS is not set
# CONFIG_OCFS2_FS is not set
# CONFIG_MINIX_FS is not set
CONFIG_ROMFS_FS=y
CONFIG_INOTIFY=y
...
...
@@ -897,6 +918,7 @@ CONFIG_SYSFS=y
# CONFIG_HUGETLB_PAGE is not set
CONFIG_RAMFS=y
# CONFIG_RELAYFS_FS is not set
# CONFIG_CONFIGFS_FS is not set
#
# Miscellaneous filesystems
...
...
@@ -965,6 +987,7 @@ CONFIG_SOLARIS_X86_PARTITION=y
# CONFIG_SGI_PARTITION is not set
# CONFIG_ULTRIX_PARTITION is not set
# CONFIG_SUN_PARTITION is not set
# CONFIG_KARMA_PARTITION is not set
# CONFIG_EFI_PARTITION is not set
#
...
...
@@ -1020,12 +1043,13 @@ CONFIG_NLS_DEFAULT="iso8859-1"
# Kernel hacking
#
# CONFIG_PRINTK_TIME is not set
CONFIG_DEBUG_KERNEL=y
CONFIG_MAGIC_SYSRQ=y
CONFIG_DEBUG_KERNEL=y
CONFIG_LOG_BUF_SHIFT=16
CONFIG_DETECT_SOFTLOCKUP=y
# CONFIG_SCHEDSTATS is not set
# CONFIG_DEBUG_SLAB is not set
CONFIG_DEBUG_MUTEXES=y
# CONFIG_DEBUG_SPINLOCK is not set
# CONFIG_DEBUG_SPINLOCK_SLEEP is not set
# CONFIG_DEBUG_KOBJECT is not set
...
...
@@ -1034,6 +1058,7 @@ CONFIG_DEBUG_INFO=y
# CONFIG_DEBUG_FS is not set
# CONFIG_DEBUG_VM is not set
CONFIG_FRAME_POINTER=y
CONFIG_FORCED_INLINING=y
# CONFIG_RCU_TORTURE_TEST is not set
CONFIG_DEBUG_USER=y
# CONFIG_DEBUG_WAITQ is not set
...
...
arch/arm/kernel/calls.S
浏览文件 @
cce0cac1
...
...
@@ -291,21 +291,21 @@
CALL
(
sys_mq_getsetattr
)
/*
280
*/
CALL
(
sys_waitid
)
CALL
(
sys_socket
)
CALL
(
sys_bind
)
CALL
(
sys_connect
)
CALL
(
ABI
(
sys_bind
,
sys_oabi_bind
)
)
CALL
(
ABI
(
sys_connect
,
sys_oabi_connect
)
)
CALL
(
sys_listen
)
/*
285
*/
CALL
(
sys_accept
)
CALL
(
sys_getsockname
)
CALL
(
sys_getpeername
)
CALL
(
sys_socketpair
)
CALL
(
sys_send
)
/*
290
*/
CALL
(
sys_sendto
)
/*
290
*/
CALL
(
ABI
(
sys_sendto
,
sys_oabi_sendto
)
)
CALL
(
sys_recv
)
CALL
(
sys_recvfrom
)
CALL
(
sys_shutdown
)
CALL
(
sys_setsockopt
)
/*
295
*/
CALL
(
sys_getsockopt
)
CALL
(
sys_sendmsg
)
CALL
(
ABI
(
sys_sendmsg
,
sys_oabi_sendmsg
)
)
CALL
(
sys_recvmsg
)
CALL
(
ABI
(
sys_semop
,
sys_oabi_semop
))
CALL
(
sys_semget
)
...
...
arch/arm/kernel/entry-armv.S
浏览文件 @
cce0cac1
...
...
@@ -333,9 +333,13 @@ __pabt_svc:
@
from
the
exception
stack
#if __LINUX_ARM_ARCH__ < 6 && !defined(CONFIG_NEEDS_SYSCALL_FOR_CMPXCHG)
#ifndef CONFIG_MMU
#warning "NPTL on non MMU needs fixing"
#else
@
make
sure
our
user
space
atomic
helper
is
aborted
cmp
r2
,
#
TASK_SIZE
bichs
r3
,
r3
,
#
PSR_Z_BIT
#endif
#endif
@
...
...
@@ -705,7 +709,12 @@ __kuser_memory_barrier: @ 0xffff0fa0
*
The
C
flag
is
also
set
if
*
ptr
was
changed
to
allow
for
assembly
*
optimization
in
the
calling
code
.
*
*
Note
:
this
routine
already
includes
memory
barriers
as
needed
.
*
Notes
:
*
*
-
This
routine
already
includes
memory
barriers
as
needed
.
*
*
-
A
failure
might
be
transient
,
i
.
e
.
it
is
possible
,
although
unlikely
,
*
that
"failure"
be
returned
even
if
*
ptr
==
oldval
.
*
*
For
example
,
a
user
space
atomic_add
implementation
could
look
like
this
:
*
...
...
@@ -756,12 +765,18 @@ __kuser_cmpxchg: @ 0xffff0fc0
*
exception
happening
just
after
the
str
instruction
which
would
*
clear
the
Z
flag
although
the
exchange
was
done
.
*/
#ifdef CONFIG_MMU
teq
ip
,
ip
@
set
Z
flag
ldr
ip
,
[
r2
]
@
load
current
val
add
r3
,
r2
,
#
1
@
prepare
store
ptr
teqeq
ip
,
r0
@
compare
with
oldval
if
still
allowed
streq
r1
,
[
r3
,
#-
1
]!
@
store
newval
if
still
allowed
subs
r0
,
r2
,
r3
@
if
r2
==
r3
the
str
occured
#else
#warning "NPTL on non MMU needs fixing"
mov
r0
,
#-
1
adds
r0
,
r0
,
#
0
#endif
mov
pc
,
lr
#else
...
...
arch/arm/kernel/sys_oabi-compat.c
浏览文件 @
cce0cac1
...
...
@@ -59,6 +59,16 @@
* struct sembuf loses its padding with EABI. Since arrays of them are
* used they have to be copyed to remove the padding. Compatibility wrappers
* provided below.
*
* sys_bind:
* sys_connect:
* sys_sendmsg:
* sys_sendto:
*
* struct sockaddr_un loses its padding with EABI. Since the size of the
* structure is used as a validation test in unix_mkname(), we need to
* change the length argument to 110 whenever it is 112. Compatibility
* wrappers provided below.
*/
#include <linux/syscalls.h>
...
...
@@ -67,6 +77,7 @@
#include <linux/fcntl.h>
#include <linux/eventpoll.h>
#include <linux/sem.h>
#include <linux/socket.h>
#include <asm/ipc.h>
#include <asm/uaccess.h>
...
...
@@ -337,3 +348,63 @@ asmlinkage int sys_oabi_ipc(uint call, int first, int second, int third,
return
sys_ipc
(
call
,
first
,
second
,
third
,
ptr
,
fifth
);
}
}
asmlinkage
long
sys_oabi_bind
(
int
fd
,
struct
sockaddr
__user
*
addr
,
int
addrlen
)
{
sa_family_t
sa_family
;
if
(
addrlen
==
112
&&
get_user
(
sa_family
,
&
addr
->
sa_family
)
==
0
&&
sa_family
==
AF_UNIX
)
addrlen
=
110
;
return
sys_bind
(
fd
,
addr
,
addrlen
);
}
asmlinkage
long
sys_oabi_connect
(
int
fd
,
struct
sockaddr
__user
*
addr
,
int
addrlen
)
{
sa_family_t
sa_family
;
if
(
addrlen
==
112
&&
get_user
(
sa_family
,
&
addr
->
sa_family
)
==
0
&&
sa_family
==
AF_UNIX
)
addrlen
=
110
;
return
sys_connect
(
fd
,
addr
,
addrlen
);
}
asmlinkage
long
sys_oabi_sendto
(
int
fd
,
void
__user
*
buff
,
size_t
len
,
unsigned
flags
,
struct
sockaddr
__user
*
addr
,
int
addrlen
)
{
sa_family_t
sa_family
;
if
(
addrlen
==
112
&&
get_user
(
sa_family
,
&
addr
->
sa_family
)
==
0
&&
sa_family
==
AF_UNIX
)
addrlen
=
110
;
return
sys_sendto
(
fd
,
buff
,
len
,
flags
,
addr
,
addrlen
);
}
asmlinkage
long
sys_oabi_sendmsg
(
int
fd
,
struct
msghdr
__user
*
msg
,
unsigned
flags
)
{
struct
sockaddr
__user
*
addr
;
int
msg_namelen
;
sa_family_t
sa_family
;
if
(
msg
&&
get_user
(
msg_namelen
,
&
msg
->
msg_namelen
)
==
0
&&
msg_namelen
==
112
&&
get_user
(
addr
,
&
msg
->
msg_name
)
==
0
&&
get_user
(
sa_family
,
&
addr
->
sa_family
)
==
0
&&
sa_family
==
AF_UNIX
)
{
/*
* HACK ALERT: there is a limit to how much backward bending
* we should do for what is actually a transitional
* compatibility layer. This already has known flaws with
* a few ioctls that we don't intend to fix. Therefore
* consider this blatent hack as another one... and take care
* to run for cover. In most cases it will "just work fine".
* If it doesn't, well, tough.
*/
put_user
(
110
,
&
msg
->
msg_namelen
);
}
return
sys_sendmsg
(
fd
,
msg
,
flags
);
}
arch/arm/mach-clps711x/Kconfig
浏览文件 @
cce0cac1
...
...
@@ -24,6 +24,8 @@ config ARCH_CEIVA
config ARCH_CLEP7312
bool "CLEP7312"
help
Boards based on the Cirrus Logic 7212/7312 chips.
config ARCH_EDB7211
bool "EDB7211"
...
...
arch/arm/mach-ixp2000/enp2611.c
浏览文件 @
cce0cac1
...
...
@@ -106,6 +106,7 @@ static void __init enp2611_pci_preinit(void)
{
ixp2000_reg_write
(
IXP2000_PCI_ADDR_EXT
,
0x00100000
);
ixp2000_pci_preinit
();
pcibios_setup
(
"firmware"
);
}
static
inline
int
enp2611_pci_valid_device
(
struct
pci_bus
*
bus
,
...
...
arch/arm/mach-ixp2000/ixdp2400.c
浏览文件 @
cce0cac1
...
...
@@ -68,6 +68,7 @@ void __init ixdp2400_pci_preinit(void)
{
ixp2000_reg_write
(
IXP2000_PCI_ADDR_EXT
,
0x00100000
);
ixp2000_pci_preinit
();
pcibios_setup
(
"firmware"
);
}
int
ixdp2400_pci_setup
(
int
nr
,
struct
pci_sys_data
*
sys
)
...
...
arch/arm/mach-ixp2000/ixdp2x01.c
浏览文件 @
cce0cac1
...
...
@@ -212,6 +212,7 @@ void __init ixdp2x01_pci_preinit(void)
{
ixp2000_reg_write
(
IXP2000_PCI_ADDR_EXT
,
0x00000000
);
ixp2000_pci_preinit
();
pcibios_setup
(
"firmware"
);
}
#define DEVPIN(dev, pin) ((pin) | ((dev) << 3))
...
...
@@ -299,7 +300,9 @@ struct hw_pci ixdp2x01_pci __initdata = {
int
__init
ixdp2x01_pci_init
(
void
)
{
pci_common_init
(
&
ixdp2x01_pci
);
if
(
machine_is_ixdp2401
()
||
machine_is_ixdp2801
())
pci_common_init
(
&
ixdp2x01_pci
);
return
0
;
}
...
...
arch/arm/mach-omap1/board-generic.c
浏览文件 @
cce0cac1
...
...
@@ -30,6 +30,7 @@
static
void
__init
omap_generic_init_irq
(
void
)
{
omap1_init_common_hw
();
omap_init_irq
();
}
...
...
@@ -104,7 +105,7 @@ static void __init omap_generic_init(void)
static
void
__init
omap_generic_map_io
(
void
)
{
omap_map_common_io
();
omap
1
_map_common_io
();
}
MACHINE_START
(
OMAP_GENERIC
,
"Generic OMAP1510/1610/1710"
)
...
...
arch/arm/mach-omap1/board-h2.c
浏览文件 @
cce0cac1
...
...
@@ -128,6 +128,7 @@ static void __init h2_init_smc91x(void)
static
void
__init
h2_init_irq
(
void
)
{
omap1_init_common_hw
();
omap_init_irq
();
omap_gpio_init
();
h2_init_smc91x
();
...
...
@@ -194,7 +195,7 @@ static void __init h2_init(void)
static
void
__init
h2_map_io
(
void
)
{
omap_map_common_io
();
omap
1
_map_common_io
();
}
MACHINE_START
(
OMAP_H2
,
"TI-H2"
)
...
...
arch/arm/mach-omap1/board-h3.c
浏览文件 @
cce0cac1
...
...
@@ -203,6 +203,7 @@ static void __init h3_init_smc91x(void)
void
h3_init_irq
(
void
)
{
omap1_init_common_hw
();
omap_init_irq
();
omap_gpio_init
();
h3_init_smc91x
();
...
...
@@ -210,7 +211,7 @@ void h3_init_irq(void)
static
void
__init
h3_map_io
(
void
)
{
omap_map_common_io
();
omap
1
_map_common_io
();
}
MACHINE_START
(
OMAP_H3
,
"TI OMAP1710 H3 board"
)
...
...
arch/arm/mach-omap1/board-innovator.c
浏览文件 @
cce0cac1
...
...
@@ -181,6 +181,7 @@ static void __init innovator_init_smc91x(void)
void
innovator_init_irq
(
void
)
{
omap1_init_common_hw
();
omap_init_irq
();
omap_gpio_init
();
#ifdef CONFIG_ARCH_OMAP15XX
...
...
@@ -285,7 +286,7 @@ static void __init innovator_init(void)
static
void
__init
innovator_map_io
(
void
)
{
omap_map_common_io
();
omap
1
_map_common_io
();
#ifdef CONFIG_ARCH_OMAP15XX
if
(
cpu_is_omap1510
())
{
...
...
arch/arm/mach-omap1/board-netstar.c
浏览文件 @
cce0cac1
...
...
@@ -65,6 +65,7 @@ static struct omap_board_config_kernel netstar_config[] = {
static
void
__init
netstar_init_irq
(
void
)
{
omap1_init_common_hw
();
omap_init_irq
();
omap_gpio_init
();
}
...
...
@@ -108,7 +109,7 @@ static void __init netstar_init(void)
static
void
__init
netstar_map_io
(
void
)
{
omap_map_common_io
();
omap
1
_map_common_io
();
}
#define MACHINE_PANICED 1
...
...
arch/arm/mach-omap1/board-osk.c
浏览文件 @
cce0cac1
...
...
@@ -169,6 +169,7 @@ static void __init osk_init_cf(void)
static
void
__init
osk_init_irq
(
void
)
{
omap1_init_common_hw
();
omap_init_irq
();
omap_gpio_init
();
osk_init_smc91x
();
...
...
@@ -269,7 +270,7 @@ static void __init osk_init(void)
static
void
__init
osk_map_io
(
void
)
{
omap_map_common_io
();
omap
1
_map_common_io
();
}
MACHINE_START
(
OMAP_OSK
,
"TI-OSK"
)
...
...
arch/arm/mach-omap1/board-palmte.c
浏览文件 @
cce0cac1
...
...
@@ -34,6 +34,7 @@
static
void
__init
omap_generic_init_irq
(
void
)
{
omap1_init_common_hw
();
omap_init_irq
();
}
...
...
@@ -72,7 +73,7 @@ static void __init omap_generic_init(void)
static
void
__init
omap_generic_map_io
(
void
)
{
omap_map_common_io
();
omap
1
_map_common_io
();
}
MACHINE_START
(
OMAP_PALMTE
,
"OMAP310 based Palm Tungsten E"
)
...
...
arch/arm/mach-omap1/board-perseus2.c
浏览文件 @
cce0cac1
...
...
@@ -144,6 +144,7 @@ static void __init perseus2_init_smc91x(void)
void
omap_perseus2_init_irq
(
void
)
{
omap1_init_common_hw
();
omap_init_irq
();
omap_gpio_init
();
perseus2_init_smc91x
();
...
...
@@ -160,7 +161,7 @@ static struct map_desc omap_perseus2_io_desc[] __initdata = {
static
void
__init
omap_perseus2_map_io
(
void
)
{
omap_map_common_io
();
omap
1
_map_common_io
();
iotable_init
(
omap_perseus2_io_desc
,
ARRAY_SIZE
(
omap_perseus2_io_desc
));
...
...
arch/arm/mach-omap1/board-voiceblue.c
浏览文件 @
cce0cac1
...
...
@@ -162,6 +162,7 @@ static struct omap_board_config_kernel voiceblue_config[] = {
static
void
__init
voiceblue_init_irq
(
void
)
{
omap1_init_common_hw
();
omap_init_irq
();
omap_gpio_init
();
}
...
...
@@ -206,7 +207,7 @@ static void __init voiceblue_init(void)
static
void
__init
voiceblue_map_io
(
void
)
{
omap_map_common_io
();
omap
1
_map_common_io
();
}
#define MACHINE_PANICED 1
...
...
arch/arm/mach-omap1/io.c
浏览文件 @
cce0cac1
...
...
@@ -13,6 +13,7 @@
#include <linux/kernel.h>
#include <linux/init.h>
#include <asm/tlb.h>
#include <asm/mach/map.h>
#include <asm/io.h>
#include <asm/arch/mux.h>
...
...
@@ -83,15 +84,24 @@ static struct map_desc omap16xx_io_desc[] __initdata = {
};
#endif
static
int
initialized
=
0
;
static
void
__init
_omap_map_io
(
void
)
/*
* Maps common IO regions for omap1. This should only get called from
* board specific init.
*/
void
__init
omap1_map_common_io
(
void
)
{
initialized
=
1
;
/* We have to initialize the IO space mapping before we can run
* cpu_is_omapxxx() macros. */
iotable_init
(
omap_io_desc
,
ARRAY_SIZE
(
omap_io_desc
));
/* Normally devicemaps_init() would flush caches and tlb after
* mdesc->map_io(), but we must also do it here because of the CPU
* revision check below.
*/
local_flush_tlb_all
();
flush_cache_all
();
/* We want to check CPU revision early for cpu_is_omapxxxx() macros.
* IO space mapping must be initialized before we can do that.
*/
omap_check_revision
();
#ifdef CONFIG_ARCH_OMAP730
...
...
@@ -111,7 +121,14 @@ static void __init _omap_map_io(void)
#endif
omap_sram_init
();
}
/*
* Common low-level hardware init for omap1. This should only get called from
* board specific init.
*/
void
__init
omap1_init_common_hw
()
{
/* REVISIT: Refer to OMAP5910 Errata, Advisory SYS_1: "Timeout Abort
* on a Posted Write in the TIPB Bridge".
*/
...
...
@@ -121,16 +138,7 @@ static void __init _omap_map_io(void)
/* Must init clocks early to assure that timer interrupt works
*/
omap1_clk_init
();
}
/*
* This should only get called from board specific init
*/
void
__init
omap_map_common_io
(
void
)
{
if
(
!
initialized
)
{
_omap_map_io
();
omap1_mux_init
();
}
omap1_mux_init
();
}
arch/arm/mach-omap2/board-generic.c
浏览文件 @
cce0cac1
...
...
@@ -33,6 +33,7 @@
static
void
__init
omap_generic_init_irq
(
void
)
{
omap2_init_common_hw
();
omap_init_irq
();
}
...
...
@@ -64,7 +65,7 @@ static void __init omap_generic_init(void)
static
void
__init
omap_generic_map_io
(
void
)
{
omap_map_common_io
();
omap
2
_map_common_io
();
}
MACHINE_START
(
OMAP_GENERIC
,
"Generic OMAP24xx"
)
...
...
arch/arm/mach-omap2/board-h4.c
浏览文件 @
cce0cac1
...
...
@@ -136,6 +136,7 @@ static inline void __init h4_init_smc91x(void)
static
void
__init
omap_h4_init_irq
(
void
)
{
omap2_init_common_hw
();
omap_init_irq
();
omap_gpio_init
();
h4_init_smc91x
();
...
...
@@ -181,7 +182,7 @@ static void __init omap_h4_init(void)
static
void
__init
omap_h4_map_io
(
void
)
{
omap_map_common_io
();
omap
2
_map_common_io
();
}
MACHINE_START
(
OMAP_H4
,
"OMAP2420 H4 board"
)
...
...
arch/arm/mach-realview/core.c
浏览文件 @
cce0cac1
...
...
@@ -182,7 +182,7 @@ static const struct icst307_params realview_oscvco_params = {
static
void
realview_oscvco_set
(
struct
clk
*
clk
,
struct
icst307_vco
vco
)
{
void
__iomem
*
sys_lock
=
__io_address
(
REALVIEW_SYS_BASE
)
+
REALVIEW_SYS_LOCK_OFFSET
;
void
__iomem
*
sys_osc
=
__io_address
(
REALVIEW_SYS_BASE
)
+
REALVIEW_SYS_OSC
1
_OFFSET
;
void
__iomem
*
sys_osc
=
__io_address
(
REALVIEW_SYS_BASE
)
+
REALVIEW_SYS_OSC
4
_OFFSET
;
u32
val
;
val
=
readl
(
sys_osc
)
&
~
0x7ffff
;
...
...
arch/arm/mach-s3c2410/clock.c
浏览文件 @
cce0cac1
...
...
@@ -40,7 +40,6 @@
#include <linux/mutex.h>
#include <asm/hardware.h>
#include <asm/atomic.h>
#include <asm/irq.h>
#include <asm/io.h>
...
...
@@ -59,22 +58,18 @@ static DEFINE_MUTEX(clocks_mutex);
void
inline
s3c24xx_clk_enable
(
unsigned
int
clocks
,
unsigned
int
enable
)
{
unsigned
long
clkcon
;
unsigned
long
flags
;
local_irq_save
(
flags
);
clkcon
=
__raw_readl
(
S3C2410_CLKCON
);
clkcon
&=
~
clocks
;
if
(
enable
)
clkcon
|=
clocks
;
else
clkcon
&=
~
clocks
;
/* ensure none of the special function bits set */
clkcon
&=
~
(
S3C2410_CLKCON_IDLE
|
S3C2410_CLKCON_POWER
);
__raw_writel
(
clkcon
,
S3C2410_CLKCON
);
local_irq_restore
(
flags
);
}
/* enable and disable calls for use with the clk struct */
...
...
@@ -138,16 +133,32 @@ void clk_put(struct clk *clk)
int
clk_enable
(
struct
clk
*
clk
)
{
if
(
IS_ERR
(
clk
))
if
(
IS_ERR
(
clk
)
||
clk
==
NULL
)
return
-
EINVAL
;
return
(
clk
->
enable
)(
clk
,
1
);
clk_enable
(
clk
->
parent
);
mutex_lock
(
&
clocks_mutex
);
if
((
clk
->
usage
++
)
==
0
)
(
clk
->
enable
)(
clk
,
1
);
mutex_unlock
(
&
clocks_mutex
);
return
0
;
}
void
clk_disable
(
struct
clk
*
clk
)
{
if
(
!
IS_ERR
(
clk
))
if
(
IS_ERR
(
clk
)
||
clk
==
NULL
)
return
;
mutex_lock
(
&
clocks_mutex
);
if
((
--
clk
->
usage
)
==
0
)
(
clk
->
enable
)(
clk
,
0
);
mutex_unlock
(
&
clocks_mutex
);
clk_disable
(
clk
->
parent
);
}
...
...
@@ -361,6 +372,14 @@ int s3c24xx_register_clock(struct clk *clk)
if
(
clk
->
enable
==
NULL
)
clk
->
enable
=
clk_null_enable
;
/* if this is a standard clock, set the usage state */
if
(
clk
->
ctrlbit
)
{
unsigned
long
clkcon
=
__raw_readl
(
S3C2410_CLKCON
);
clk
->
usage
=
(
clkcon
&
clk
->
ctrlbit
)
?
1
:
0
;
}
/* add to the list of available clocks */
mutex_lock
(
&
clocks_mutex
);
...
...
@@ -402,6 +421,8 @@ int __init s3c24xx_setup_clocks(unsigned long xtal,
* the LCD clock if it is not needed.
*/
mutex_lock
(
&
clocks_mutex
);
s3c24xx_clk_enable
(
S3C2410_CLKCON_NAND
,
0
);
s3c24xx_clk_enable
(
S3C2410_CLKCON_USBH
,
0
);
s3c24xx_clk_enable
(
S3C2410_CLKCON_USBD
,
0
);
...
...
@@ -409,6 +430,8 @@ int __init s3c24xx_setup_clocks(unsigned long xtal,
s3c24xx_clk_enable
(
S3C2410_CLKCON_IIC
,
0
);
s3c24xx_clk_enable
(
S3C2410_CLKCON_SPI
,
0
);
mutex_unlock
(
&
clocks_mutex
);
/* assume uart clocks are correctly setup */
/* register our clocks */
...
...
arch/arm/mach-s3c2410/clock.h
浏览文件 @
cce0cac1
...
...
@@ -16,6 +16,7 @@ struct clk {
struct
clk
*
parent
;
const
char
*
name
;
int
id
;
int
usage
;
unsigned
long
rate
;
unsigned
long
ctrlbit
;
int
(
*
enable
)(
struct
clk
*
,
int
enable
);
...
...
arch/arm/mach-s3c2410/devs.c
浏览文件 @
cce0cac1
...
...
@@ -275,6 +275,11 @@ static struct resource s3c_adc_resource[] = {
},
[
1
]
=
{
.
start
=
IRQ_TC
,
.
end
=
IRQ_TC
,
.
flags
=
IORESOURCE_IRQ
,
},
[
2
]
=
{
.
start
=
IRQ_ADC
,
.
end
=
IRQ_ADC
,
.
flags
=
IORESOURCE_IRQ
,
}
...
...
arch/arm/plat-omap/sram.c
浏览文件 @
cce0cac1
...
...
@@ -17,6 +17,7 @@
#include <linux/init.h>
#include <asm/mach/map.h>
#include <asm/tlb.h>
#include <asm/io.h>
#include <asm/cacheflush.h>
...
...
@@ -95,6 +96,14 @@ void __init omap_map_sram(void)
omap_sram_io_desc
[
0
].
pfn
,
omap_sram_io_desc
[
0
].
virtual
,
omap_sram_io_desc
[
0
].
length
);
/*
* Normally devicemaps_init() would flush caches and tlb after
* mdesc->map_io(), but since we're called from map_io(), we
* must do it here.
*/
local_flush_tlb_all
();
flush_cache_all
();
/*
* Looks like we need to preserve some bootloader code at the
* beginning of SRAM for jumping to flash for reboot to work...
...
...
drivers/serial/s3c2410.c
浏览文件 @
cce0cac1
...
...
@@ -161,7 +161,11 @@ s3c24xx_serial_dbg(const char *fmt, ...)
/* we can support 3 uarts, but not always use them */
#ifdef CONFIG_CPU_S3C2400
#define NR_PORTS (2)
#else
#define NR_PORTS (3)
#endif
/* port irq numbers */
...
...
include/asm-arm/arch-omap/io.h
浏览文件 @
cce0cac1
...
...
@@ -116,7 +116,11 @@ typedef struct { volatile u32 offset[4096]; } __regbase32;
->offset[((vaddr)&4095)>>2]
#define __REG32(paddr) __REGV32(io_p2v(paddr))
extern
void
omap_map_common_io
(
void
);
extern
void
omap1_map_common_io
(
void
);
extern
void
omap1_init_common_hw
(
void
);
extern
void
omap2_map_common_io
(
void
);
extern
void
omap2_init_common_hw
(
void
);
#else
...
...
include/asm-arm/mutex.h
浏览文件 @
cce0cac1
...
...
@@ -23,72 +23,71 @@
* simply bail out immediately through the slow path where the lock will be
* reattempted until it succeeds.
*/
#define __mutex_fastpath_lock(count, fail_fn) \
do { \
int __ex_flag, __res; \
\
typecheck(atomic_t *, count); \
typecheck_fn(fastcall void (*)(atomic_t *), fail_fn); \
\
__asm__ ( \
"ldrex %0, [%2] \n" \
"sub %0, %0, #1 \n" \
"strex %1, %0, [%2] \n" \
\
: "=&r" (__res), "=&r" (__ex_flag) \
: "r" (&(count)->counter) \
: "cc","memory" ); \
\
if (unlikely(__res || __ex_flag)) \
fail_fn(count); \
} while (0)
#define __mutex_fastpath_lock_retval(count, fail_fn) \
({ \
int __ex_flag, __res; \
\
typecheck(atomic_t *, count); \
typecheck_fn(fastcall int (*)(atomic_t *), fail_fn); \
\
__asm__ ( \
"ldrex %0, [%2] \n" \
"sub %0, %0, #1 \n" \
"strex %1, %0, [%2] \n" \
\
: "=&r" (__res), "=&r" (__ex_flag) \
: "r" (&(count)->counter) \
: "cc","memory" ); \
\
__res |= __ex_flag; \
if (unlikely(__res != 0)) \
__res = fail_fn(count); \
__res; \
})
static
inline
void
__mutex_fastpath_lock
(
atomic_t
*
count
,
fastcall
void
(
*
fail_fn
)(
atomic_t
*
))
{
int
__ex_flag
,
__res
;
__asm__
(
"ldrex %0, [%2]
\n\t
"
"sub %0, %0, #1
\n\t
"
"strex %1, %0, [%2] "
:
"=&r"
(
__res
),
"=&r"
(
__ex_flag
)
:
"r"
(
&
(
count
)
->
counter
)
:
"cc"
,
"memory"
);
__res
|=
__ex_flag
;
if
(
unlikely
(
__res
!=
0
))
fail_fn
(
count
);
}
static
inline
int
__mutex_fastpath_lock_retval
(
atomic_t
*
count
,
fastcall
int
(
*
fail_fn
)(
atomic_t
*
))
{
int
__ex_flag
,
__res
;
__asm__
(
"ldrex %0, [%2]
\n\t
"
"sub %0, %0, #1
\n\t
"
"strex %1, %0, [%2] "
:
"=&r"
(
__res
),
"=&r"
(
__ex_flag
)
:
"r"
(
&
(
count
)
->
counter
)
:
"cc"
,
"memory"
);
__res
|=
__ex_flag
;
if
(
unlikely
(
__res
!=
0
))
__res
=
fail_fn
(
count
);
return
__res
;
}
/*
* Same trick is used for the unlock fast path. However the original value,
* rather than the result, is used to test for success in order to have
* better generated assembly.
*/
#define __mutex_fastpath_unlock(count, fail_fn) \
do { \
int __ex_flag, __res, __orig; \
\
typecheck(atomic_t *, count); \
typecheck_fn(fastcall void (*)(atomic_t *), fail_fn); \
\
__asm__ ( \
"
ldrex %0, [%3] \n" \
"
add %1, %0, #1 \n" \
"strex %2, %1, [%3] \n" \
\
: "
=&r" (__orig), "=&r" (__res), "=&r" (__ex_flag) \
: "
r" (&(count)->counter) \
: "cc","memory" ); \
\
if (unlikely(__orig
|| __ex_flag)) \
fail_fn(count);
\
}
while (0)
static
inline
void
__mutex_fastpath_unlock
(
atomic_t
*
count
,
fastcall
void
(
*
fail_fn
)(
atomic_t
*
))
{
int
__ex_flag
,
__res
,
__orig
;
__asm__
(
"ldrex %0, [%3]
\n\t
"
"
add %1, %0, #1
\n\t
"
"
strex %2, %1, [%3] "
:
"=&r"
(
__orig
),
"=&r"
(
__res
),
"=&r"
(
__ex_flag
)
:
"
r"
(
&
(
count
)
->
counter
)
:
"
cc"
,
"memory"
);
__orig
|=
__ex_flag
;
if
(
unlikely
(
__orig
!=
0
))
fail_fn
(
count
);
}
/*
* If the unlock was done on a contended lock, or if the unlock simply fails
...
...
@@ -110,12 +109,12 @@ __mutex_fastpath_trylock(atomic_t *count, int (*fail_fn)(atomic_t *))
__asm__
(
"1: ldrex %0, [%3]
\n
"
"subs %1, %0, #1
\n
"
"strexeq %2, %1, [%3]
\n
"
"movlt %0, #0
\n
"
"cmpeq %2, #0
\n
"
"bgt 1b
\n
"
"1: ldrex %0, [%3]
\n
\t
"
"subs %1, %0, #1
\n
\t
"
"strexeq %2, %1, [%3]
\n
\t
"
"movlt %0, #0
\n
\t
"
"cmpeq %2, #0
\n
\t
"
"bgt 1b "
:
"=&r"
(
__orig
),
"=&r"
(
__res
),
"=&r"
(
__ex_flag
)
:
"r"
(
&
count
->
counter
)
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录