Merge master.kernel.org:/home/rmk/linux-2.6-arm
Manual conflict merge of arch/arm/Kconfig
This commit is contained in:
commit
cce0cac125
|
@ -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 ltd and targeted at embedded applications and
|
||||
licensed by ARM Ltd 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 derviatives).
|
||||
the Samsung SMDK2410 development board (and derivatives).
|
||||
|
||||
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 AT91RM9200-based
|
||||
board.
|
||||
Say Y here if you intend to run this kernel on an Atmel
|
||||
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
|
||||
|
|
|
@ -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
|
||||
|
||||
#
|
||||
|
|
|
@ -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
|
||||
|
||||
#
|
||||
|
|
|
@ -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
|
||||
|
||||
#
|
||||
|
|
|
@ -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
|
||||
|
||||
#
|
||||
|
|
|
@ -1,11 +1,10 @@
|
|||
#
|
||||
# Automatically generated make config: don't edit
|
||||
# Linux kernel version: 2.6.15-rc1
|
||||
# Sun Nov 13 17:41:24 2005
|
||||
# Linux kernel version: 2.6.16-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
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
@ -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"
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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();
|
||||
omap1_map_common_io();
|
||||
}
|
||||
|
||||
MACHINE_START(OMAP_GENERIC, "Generic OMAP1510/1610/1710")
|
||||
|
|
|
@ -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();
|
||||
omap1_map_common_io();
|
||||
}
|
||||
|
||||
MACHINE_START(OMAP_H2, "TI-H2")
|
||||
|
|
|
@ -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();
|
||||
omap1_map_common_io();
|
||||
}
|
||||
|
||||
MACHINE_START(OMAP_H3, "TI OMAP1710 H3 board")
|
||||
|
|
|
@ -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();
|
||||
omap1_map_common_io();
|
||||
|
||||
#ifdef CONFIG_ARCH_OMAP15XX
|
||||
if (cpu_is_omap1510()) {
|
||||
|
|
|
@ -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();
|
||||
omap1_map_common_io();
|
||||
}
|
||||
|
||||
#define MACHINE_PANICED 1
|
||||
|
|
|
@ -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();
|
||||
omap1_map_common_io();
|
||||
}
|
||||
|
||||
MACHINE_START(OMAP_OSK, "TI-OSK")
|
||||
|
|
|
@ -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();
|
||||
omap1_map_common_io();
|
||||
}
|
||||
|
||||
MACHINE_START(OMAP_PALMTE, "OMAP310 based Palm Tungsten E")
|
||||
|
|
|
@ -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();
|
||||
omap1_map_common_io();
|
||||
iotable_init(omap_perseus2_io_desc,
|
||||
ARRAY_SIZE(omap_perseus2_io_desc));
|
||||
|
||||
|
|
|
@ -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();
|
||||
omap1_map_common_io();
|
||||
}
|
||||
|
||||
#define MACHINE_PANICED 1
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
|
||||
|
|
|
@ -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();
|
||||
omap2_map_common_io();
|
||||
}
|
||||
|
||||
MACHINE_START(OMAP_GENERIC, "Generic OMAP24xx")
|
||||
|
|
|
@ -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();
|
||||
omap2_map_common_io();
|
||||
}
|
||||
|
||||
MACHINE_START(OMAP_H4, "OMAP2420 H4 board")
|
||||
|
|
|
@ -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_OSC1_OFFSET;
|
||||
void __iomem *sys_osc = __io_address(REALVIEW_SYS_BASE) + REALVIEW_SYS_OSC4_OFFSET;
|
||||
u32 val;
|
||||
|
||||
val = readl(sys_osc) & ~0x7ffff;
|
||||
|
|
|
@ -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 */
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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,
|
||||
}
|
||||
|
|
|
@ -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...
|
||||
|
|
|
@ -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 */
|
||||
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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)
|
||||
static inline void
|
||||
__mutex_fastpath_lock(atomic_t *count, fastcall void (*fail_fn)(atomic_t *))
|
||||
{
|
||||
int __ex_flag, __res;
|
||||
|
||||
#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; \
|
||||
})
|
||||
__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)
|
||||
|
|
Loading…
Reference in New Issue