Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
openeuler
Kernel
提交
4c2741ac
K
Kernel
项目概览
openeuler
/
Kernel
1 年多 前同步成功
通知
8
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
K
Kernel
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
提交
4c2741ac
编写于
3月 15, 2019
作者:
R
Russell King
浏览文件
操作
浏览文件
下载
差异文件
Merge branches 'fixes', 'misc' and 'smp-hotplug' into for-next
上级
d410a8a4
9db043d3
6213f70e
变更
89
隐藏空白更改
内联
并排
Showing
89 changed file
with
414 addition
and
596 deletion
+414
-596
Documentation/arm/kernel_mode_neon.txt
Documentation/arm/kernel_mode_neon.txt
+2
-2
arch/arm/Kconfig
arch/arm/Kconfig
+1
-2
arch/arm/Kconfig-nommu
arch/arm/Kconfig-nommu
+2
-0
arch/arm/Makefile
arch/arm/Makefile
+1
-1
arch/arm/boot/bootp/Makefile
arch/arm/boot/bootp/Makefile
+1
-1
arch/arm/boot/bootp/init.S
arch/arm/boot/bootp/init.S
+1
-1
arch/arm/boot/compressed/Makefile
arch/arm/boot/compressed/Makefile
+0
-2
arch/arm/boot/compressed/ll_char_wr.S
arch/arm/boot/compressed/ll_char_wr.S
+2
-2
arch/arm/include/asm/assembler.h
arch/arm/include/asm/assembler.h
+6
-6
arch/arm/include/asm/barrier.h
arch/arm/include/asm/barrier.h
+2
-0
arch/arm/include/asm/hardware/entry-macro-iomd.S
arch/arm/include/asm/hardware/entry-macro-iomd.S
+5
-5
arch/arm/include/asm/pgtable.h
arch/arm/include/asm/pgtable.h
+3
-0
arch/arm/include/asm/processor.h
arch/arm/include/asm/processor.h
+5
-1
arch/arm/include/asm/smp.h
arch/arm/include/asm/smp.h
+0
-1
arch/arm/include/asm/smp_twd.h
arch/arm/include/asm/smp_twd.h
+0
-16
arch/arm/include/asm/spinlock.h
arch/arm/include/asm/spinlock.h
+2
-1
arch/arm/include/asm/uaccess.h
arch/arm/include/asm/uaccess.h
+2
-1
arch/arm/include/asm/v7m.h
arch/arm/include/asm/v7m.h
+1
-1
arch/arm/include/asm/vfpmacros.h
arch/arm/include/asm/vfpmacros.h
+4
-4
arch/arm/include/debug/tegra.S
arch/arm/include/debug/tegra.S
+1
-1
arch/arm/kernel/debug.S
arch/arm/kernel/debug.S
+1
-1
arch/arm/kernel/entry-armv.S
arch/arm/kernel/entry-armv.S
+6
-6
arch/arm/kernel/entry-common.S
arch/arm/kernel/entry-common.S
+1
-1
arch/arm/kernel/entry-header.S
arch/arm/kernel/entry-header.S
+6
-5
arch/arm/kernel/entry-v7m.S
arch/arm/kernel/entry-v7m.S
+4
-0
arch/arm/kernel/hyp-stub.S
arch/arm/kernel/hyp-stub.S
+2
-2
arch/arm/kernel/machine_kexec.c
arch/arm/kernel/machine_kexec.c
+4
-1
arch/arm/kernel/smp.c
arch/arm/kernel/smp.c
+3
-7
arch/arm/kernel/smp_twd.c
arch/arm/kernel/smp_twd.c
+0
-66
arch/arm/lib/Makefile
arch/arm/lib/Makefile
+1
-1
arch/arm/lib/bitops.h
arch/arm/lib/bitops.h
+4
-4
arch/arm/lib/clear_user.S
arch/arm/lib/clear_user.S
+1
-1
arch/arm/lib/copy_from_user.S
arch/arm/lib/copy_from_user.S
+1
-1
arch/arm/lib/copy_page.S
arch/arm/lib/copy_page.S
+2
-2
arch/arm/lib/copy_template.S
arch/arm/lib/copy_template.S
+3
-3
arch/arm/lib/copy_to_user.S
arch/arm/lib/copy_to_user.S
+1
-1
arch/arm/lib/csumpartial.S
arch/arm/lib/csumpartial.S
+10
-10
arch/arm/lib/csumpartialcopygeneric.S
arch/arm/lib/csumpartialcopygeneric.S
+2
-2
arch/arm/lib/csumpartialcopyuser.S
arch/arm/lib/csumpartialcopyuser.S
+1
-1
arch/arm/lib/div64.S
arch/arm/lib/div64.S
+2
-2
arch/arm/lib/floppydma.S
arch/arm/lib/floppydma.S
+5
-5
arch/arm/lib/io-readsb.S
arch/arm/lib/io-readsb.S
+10
-10
arch/arm/lib/io-readsl.S
arch/arm/lib/io-readsl.S
+1
-1
arch/arm/lib/io-readsw-armv3.S
arch/arm/lib/io-readsw-armv3.S
+3
-3
arch/arm/lib/io-readsw-armv4.S
arch/arm/lib/io-readsw-armv4.S
+6
-6
arch/arm/lib/io-writesb.S
arch/arm/lib/io-writesb.S
+10
-10
arch/arm/lib/io-writesl.S
arch/arm/lib/io-writesl.S
+1
-1
arch/arm/lib/io-writesw-armv3.S
arch/arm/lib/io-writesw-armv3.S
+1
-1
arch/arm/lib/io-writesw-armv4.S
arch/arm/lib/io-writesw-armv4.S
+3
-3
arch/arm/lib/lib1funcs.S
arch/arm/lib/lib1funcs.S
+2
-2
arch/arm/lib/memcpy.S
arch/arm/lib/memcpy.S
+2
-2
arch/arm/lib/memmove.S
arch/arm/lib/memmove.S
+12
-12
arch/arm/lib/memset.S
arch/arm/lib/memset.S
+21
-21
arch/arm/lib/xor-neon.c
arch/arm/lib/xor-neon.c
+1
-1
arch/arm/mach-actions/platsmp.c
arch/arm/mach-actions/platsmp.c
+0
-15
arch/arm/mach-exynos/headsmp.S
arch/arm/mach-exynos/headsmp.S
+1
-1
arch/arm/mach-exynos/platsmp.c
arch/arm/mach-exynos/platsmp.c
+18
-13
arch/arm/mach-ks8695/include/mach/entry-macro.S
arch/arm/mach-ks8695/include/mach/entry-macro.S
+1
-1
arch/arm/mach-omap2/prm_common.c
arch/arm/mach-omap2/prm_common.c
+3
-1
arch/arm/mach-oxnas/Makefile
arch/arm/mach-oxnas/Makefile
+0
-1
arch/arm/mach-oxnas/hotplug.c
arch/arm/mach-oxnas/hotplug.c
+0
-109
arch/arm/mach-oxnas/platsmp.c
arch/arm/mach-oxnas/platsmp.c
+0
-4
arch/arm/mach-prima2/common.h
arch/arm/mach-prima2/common.h
+2
-0
arch/arm/mach-prima2/headsmp.S
arch/arm/mach-prima2/headsmp.S
+1
-1
arch/arm/mach-prima2/hotplug.c
arch/arm/mach-prima2/hotplug.c
+2
-1
arch/arm/mach-prima2/platsmp.c
arch/arm/mach-prima2/platsmp.c
+10
-7
arch/arm/mach-qcom/platsmp.c
arch/arm/mach-qcom/platsmp.c
+0
-26
arch/arm/mach-spear/generic.h
arch/arm/mach-spear/generic.h
+2
-0
arch/arm/mach-spear/headsmp.S
arch/arm/mach-spear/headsmp.S
+1
-1
arch/arm/mach-spear/hotplug.c
arch/arm/mach-spear/hotplug.c
+3
-1
arch/arm/mach-spear/platsmp.c
arch/arm/mach-spear/platsmp.c
+16
-11
arch/arm/mach-tegra/reset-handler.S
arch/arm/mach-tegra/reset-handler.S
+1
-1
arch/arm/mm/cache-v6.S
arch/arm/mm/cache-v6.S
+4
-4
arch/arm/mm/copypage-v4mc.c
arch/arm/mm/copypage-v4mc.c
+2
-1
arch/arm/mm/copypage-v4wb.c
arch/arm/mm/copypage-v4wb.c
+2
-1
arch/arm/mm/copypage-v4wt.c
arch/arm/mm/copypage-v4wt.c
+2
-1
arch/arm/mm/dma-mapping.c
arch/arm/mm/dma-mapping.c
+1
-1
arch/arm/mm/idmap.c
arch/arm/mm/idmap.c
+3
-1
arch/arm/mm/init.c
arch/arm/mm/init.c
+4
-65
arch/arm/mm/pmsa-v8.c
arch/arm/mm/pmsa-v8.c
+2
-2
arch/arm/mm/proc-v7m.S
arch/arm/mm/proc-v7m.S
+5
-2
drivers/amba/bus.c
drivers/amba/bus.c
+37
-8
drivers/hwtracing/coresight/coresight-etm3x.c
drivers/hwtracing/coresight/coresight-etm3x.c
+13
-31
drivers/hwtracing/coresight/coresight-etm4x.c
drivers/hwtracing/coresight/coresight-etm4x.c
+12
-9
drivers/hwtracing/coresight/coresight-priv.h
drivers/hwtracing/coresight/coresight-priv.h
+40
-0
drivers/hwtracing/coresight/coresight-stm.c
drivers/hwtracing/coresight/coresight-stm.c
+3
-11
drivers/hwtracing/coresight/coresight-tmc.c
drivers/hwtracing/coresight/coresight-tmc.c
+9
-21
include/linux/amba/bus.h
include/linux/amba/bus.h
+39
-0
lib/raid6/Makefile
lib/raid6/Makefile
+1
-1
未找到文件。
Documentation/arm/kernel_mode_neon.txt
浏览文件 @
4c2741ac
...
...
@@ -6,7 +6,7 @@ TL;DR summary
* Use only NEON instructions, or VFP instructions that don't rely on support
code
* Isolate your NEON code in a separate compilation unit, and compile it with
'-mfpu=neon -mfloat-abi=softfp'
'-m
arch=armv7-a -m
fpu=neon -mfloat-abi=softfp'
* Put kernel_neon_begin() and kernel_neon_end() calls around the calls into your
NEON code
* Don't sleep in your NEON code, and be aware that it will be executed with
...
...
@@ -87,7 +87,7 @@ instructions appearing in unexpected places if no special care is taken.
Therefore, the recommended and only supported way of using NEON/VFP in the
kernel is by adhering to the following rules:
* isolate the NEON code in a separate compilation unit and compile it with
'-mfpu=neon -mfloat-abi=softfp';
'-m
arch=armv7-a -m
fpu=neon -mfloat-abi=softfp';
* issue the calls to kernel_neon_begin(), kernel_neon_end() as well as the calls
into the unit containing the NEON code from a compilation unit which is *not*
built with the GCC flag '-mfpu=neon' set.
...
...
arch/arm/Kconfig
浏览文件 @
4c2741ac
...
...
@@ -1304,7 +1304,7 @@ config SCHED_SMT
config HAVE_ARM_SCU
bool
help
This option enables support for the ARM s
ystem coherency
unit
This option enables support for the ARM s
noop control
unit
config HAVE_ARM_ARCH_TIMER
bool "Architected timer support"
...
...
@@ -1316,7 +1316,6 @@ config HAVE_ARM_ARCH_TIMER
config HAVE_ARM_TWD
bool
select TIMER_OF if OF
help
This options enables support for the ARM timer and watchdog unit
...
...
arch/arm/Kconfig-nommu
浏览文件 @
4c2741ac
...
...
@@ -20,10 +20,12 @@ config DRAM_SIZE
config FLASH_MEM_BASE
hex 'FLASH Base Address' if SET_MEM_PARAM
depends on CPU_ARM740T || CPU_ARM946E || CPU_ARM940T
default 0x00400000
config FLASH_SIZE
hex 'FLASH Size' if SET_MEM_PARAM
depends on CPU_ARM740T || CPU_ARM946E || CPU_ARM940T
default 0x00400000
config PROCESSOR_ID
...
...
arch/arm/Makefile
浏览文件 @
4c2741ac
...
...
@@ -10,7 +10,7 @@
#
# Copyright (C) 1995-2001 by Russell King
LDFLAGS_vmlinux
:=
-p
--no-undefined
-X
--pic-veneer
LDFLAGS_vmlinux
:=
--no-undefined
-X
--pic-veneer
ifeq
($(CONFIG_CPU_ENDIAN_BE8),y)
LDFLAGS_vmlinux
+=
--be8
KBUILD_LDFLAGS_MODULE
+=
--be8
...
...
arch/arm/boot/bootp/Makefile
浏览文件 @
4c2741ac
...
...
@@ -8,7 +8,7 @@
GCOV_PROFILE
:=
n
LDFLAGS_bootp
:=
-p
--no-undefined
-X
\
LDFLAGS_bootp
:=
--no-undefined
-X
\
--defsym
initrd_phys
=
$(INITRD_PHYS)
\
--defsym
params_phys
=
$(PARAMS_PHYS)
-T
AFLAGS_initrd.o
:=
-DINITRD
=
\"
$(INITRD)
\"
...
...
arch/arm/boot/bootp/init.S
浏览文件 @
4c2741ac
...
...
@@ -44,7 +44,7 @@ _start: add lr, pc, #-0x8 @ lr = current load addr
*/
movne
r10
,
#
0
@
terminator
movne
r4
,
#
2
@
Size
of
this
entry
(
2
words
)
stm
neia
r9
,
{
r4
,
r5
,
r10
}
@
Size
,
ATAG_CORE
,
terminator
stm
iane
r9
,
{
r4
,
r5
,
r10
}
@
Size
,
ATAG_CORE
,
terminator
/*
*
find
the
end
of
the
tag
list
,
and
then
add
an
INITRD
tag
on
the
end
.
...
...
arch/arm/boot/compressed/Makefile
浏览文件 @
4c2741ac
...
...
@@ -132,8 +132,6 @@ endif
ifeq
($(CONFIG_CPU_ENDIAN_BE8),y)
LDFLAGS_vmlinux
+=
--be8
endif
# ?
LDFLAGS_vmlinux
+=
-p
# Report unresolved symbol references
LDFLAGS_vmlinux
+=
--no-undefined
# Delete all temporary local symbols
...
...
arch/arm/boot/compressed/ll_char_wr.S
浏览文件 @
4c2741ac
...
...
@@ -75,7 +75,7 @@ Lrow4bpplp:
tst
r1
,
#
7
@
avoid
using
r7
directly
after
str
r7
,
[
r0
,
-
r5
]!
subne
r1
,
r1
,
#
1
ldr
neb
r7
,
[
r6
,
r1
]
ldr
bne
r7
,
[
r6
,
r1
]
bne
Lrow4bpplp
ldmfd
sp
!,
{
r4
-
r7
,
pc
}
...
...
@@ -103,7 +103,7 @@ Lrow8bpplp:
sub
r0
,
r0
,
r5
@
avoid
ip
stmia
r0
,
{
r4
,
ip
}
subne
r1
,
r1
,
#
1
ldr
neb
r7
,
[
r6
,
r1
]
ldr
bne
r7
,
[
r6
,
r1
]
bne
Lrow8bpplp
ldmfd
sp
!,
{
r4
-
r7
,
pc
}
...
...
arch/arm/include/asm/assembler.h
浏览文件 @
4c2741ac
...
...
@@ -376,9 +376,9 @@ THUMB( orr \reg , \reg , #PSR_T_BIT )
.
macro
usraccoff
,
instr
,
reg
,
ptr
,
inc
,
off
,
cond
,
abort
,
t
=
TUSER
()
9999
:
.
if
\
inc
==
1
\
instr
\
cond
\
()
b
\
()
\
t
\
().
w
\
reg
,
[
\
ptr
,
#\
off
]
\
instr
\
()
b
\
t
\
cond
\
().
w
\
reg
,
[
\
ptr
,
#\
off
]
.
elseif
\
inc
==
4
\
instr
\
cond
\
()
\
t
\
().
w
\
reg
,
[
\
ptr
,
#\
off
]
\
instr
\
t
\
cond
\
().
w
\
reg
,
[
\
ptr
,
#\
off
]
.
else
.
error
"Unsupported inc macro argument"
.
endif
...
...
@@ -417,9 +417,9 @@ THUMB( orr \reg , \reg , #PSR_T_BIT )
.
rept
\
rept
9999
:
.
if
\
inc
==
1
\
instr
\
cond
\
()
b
\
()
\
t
\
reg
,
[
\
ptr
],
#\
inc
\
instr
\
()
b
\
t
\
cond
\
reg
,
[
\
ptr
],
#\
inc
.
elseif
\
inc
==
4
\
instr
\
cond
\
()
\
t
\
reg
,
[
\
ptr
],
#\
inc
\
instr
\
t
\
cond
\
reg
,
[
\
ptr
],
#\
inc
.
else
.
error
"Unsupported inc macro argument"
.
endif
...
...
@@ -460,7 +460,7 @@ THUMB( orr \reg , \reg , #PSR_T_BIT )
.
macro
check_uaccess
,
addr
:
req
,
size
:
req
,
limit
:
req
,
tmp
:
req
,
bad
:
req
#ifndef CONFIG_CPU_USE_DOMAINS
adds
\
tmp
,
\
addr
,
#\
size
-
1
sbc
ccs
\
tmp
,
\
tmp
,
\
limit
sbc
scc
\
tmp
,
\
tmp
,
\
limit
bcs
\
bad
#ifdef CONFIG_CPU_SPECTRE
movcs
\
addr
,
#
0
...
...
@@ -474,7 +474,7 @@ THUMB( orr \reg , \reg , #PSR_T_BIT )
sub
\
tmp
,
\
limit
,
#
1
subs
\
tmp
,
\
tmp
,
\
addr
@
tmp
=
limit
-
1
-
addr
addhs
\
tmp
,
\
tmp
,
#
1
@
if
(
tmp
>=
0
)
{
sub
hs
s
\
tmp
,
\
tmp
,
\
size
@
tmp
=
limit
-
(
addr
+
size
)
}
sub
sh
s
\
tmp
,
\
tmp
,
\
size
@
tmp
=
limit
-
(
addr
+
size
)
}
movlo
\
addr
,
#
0
@
if
(
tmp
<
0
)
addr
=
NULL
csdb
#endif
...
...
arch/arm/include/asm/barrier.h
浏览文件 @
4c2741ac
...
...
@@ -11,6 +11,8 @@
#define sev() __asm__ __volatile__ ("sev" : : : "memory")
#define wfe() __asm__ __volatile__ ("wfe" : : : "memory")
#define wfi() __asm__ __volatile__ ("wfi" : : : "memory")
#else
#define wfe() do { } while (0)
#endif
#if __LINUX_ARM_ARCH__ >= 7
...
...
arch/arm/include/asm/hardware/entry-macro-iomd.S
浏览文件 @
4c2741ac
...
...
@@ -16,25 +16,25 @@
ldr
\
tmp
,
=
irq_prio_h
teq
\
irqstat
,
#
0
#ifdef IOMD_BASE
ldr
eqb
\
irqstat
,
[
\
base
,
#
IOMD_DMAREQ
]
@
get
dma
ldr
beq
\
irqstat
,
[
\
base
,
#
IOMD_DMAREQ
]
@
get
dma
addeq
\
tmp
,
\
tmp
,
#
256
@
irq_prio_h
table
size
teqeq
\
irqstat
,
#
0
bne
2406
f
#endif
ldr
eqb
\
irqstat
,
[
\
base
,
#
IOMD_IRQREQA
]
@
get
low
priority
ldr
beq
\
irqstat
,
[
\
base
,
#
IOMD_IRQREQA
]
@
get
low
priority
addeq
\
tmp
,
\
tmp
,
#
256
@
irq_prio_d
table
size
teqeq
\
irqstat
,
#
0
#ifdef IOMD_IRQREQC
ldr
eqb
\
irqstat
,
[
\
base
,
#
IOMD_IRQREQC
]
ldr
beq
\
irqstat
,
[
\
base
,
#
IOMD_IRQREQC
]
addeq
\
tmp
,
\
tmp
,
#
256
@
irq_prio_l
table
size
teqeq
\
irqstat
,
#
0
#endif
#ifdef IOMD_IRQREQD
ldr
eqb
\
irqstat
,
[
\
base
,
#
IOMD_IRQREQD
]
ldr
beq
\
irqstat
,
[
\
base
,
#
IOMD_IRQREQD
]
addeq
\
tmp
,
\
tmp
,
#
256
@
irq_prio_lc
table
size
teqeq
\
irqstat
,
#
0
#endif
2406
:
ldr
neb
\
irqnr
,
[
\
tmp
,
\
irqstat
]
@
get
IRQ
number
2406
:
ldr
bne
\
irqnr
,
[
\
tmp
,
\
irqstat
]
@
get
IRQ
number
.
endm
/*
...
...
arch/arm/include/asm/pgtable.h
浏览文件 @
4c2741ac
...
...
@@ -125,6 +125,9 @@ extern pgprot_t pgprot_s2_device;
#define pgprot_stronglyordered(prot) \
__pgprot_modify(prot, L_PTE_MT_MASK, L_PTE_MT_UNCACHED)
#define pgprot_device(prot) \
__pgprot_modify(prot, L_PTE_MT_MASK, L_PTE_MT_DEV_SHARED | L_PTE_SHARED | L_PTE_DIRTY | L_PTE_XN)
#ifdef CONFIG_ARM_DMA_MEM_BUFFERABLE
#define pgprot_dmacoherent(prot) \
__pgprot_modify(prot, L_PTE_MT_MASK, L_PTE_MT_BUFFERABLE | L_PTE_XN)
...
...
arch/arm/include/asm/processor.h
浏览文件 @
4c2741ac
...
...
@@ -89,7 +89,11 @@ extern void release_thread(struct task_struct *);
unsigned
long
get_wchan
(
struct
task_struct
*
p
);
#if __LINUX_ARM_ARCH__ == 6 || defined(CONFIG_ARM_ERRATA_754327)
#define cpu_relax() smp_mb()
#define cpu_relax() \
do { \
smp_mb(); \
__asm__ __volatile__("nop; nop; nop; nop; nop; nop; nop; nop; nop; nop;"); \
} while (0)
#else
#define cpu_relax() barrier()
#endif
...
...
arch/arm/include/asm/smp.h
浏览文件 @
4c2741ac
...
...
@@ -67,7 +67,6 @@ struct secondary_data {
void
*
stack
;
};
extern
struct
secondary_data
secondary_data
;
extern
volatile
int
pen_release
;
extern
void
secondary_startup
(
void
);
extern
void
secondary_startup_arm
(
void
);
...
...
arch/arm/include/asm/smp_twd.h
浏览文件 @
4c2741ac
...
...
@@ -19,20 +19,4 @@
#define TWD_TIMER_CONTROL_PERIODIC (1 << 1)
#define TWD_TIMER_CONTROL_IT_ENABLE (1 << 2)
#include <linux/ioport.h>
struct
twd_local_timer
{
struct
resource
res
[
2
];
};
#define DEFINE_TWD_LOCAL_TIMER(name,base,irq) \
struct twd_local_timer name __initdata = { \
.res = { \
DEFINE_RES_MEM(base, 0x10), \
DEFINE_RES_IRQ(irq), \
}, \
};
int
twd_local_timer_register
(
struct
twd_local_timer
*
);
#endif
arch/arm/include/asm/spinlock.h
浏览文件 @
4c2741ac
...
...
@@ -210,11 +210,12 @@ static inline void arch_read_lock(arch_rwlock_t *rw)
prefetchw
(
&
rw
->
lock
);
__asm__
__volatile__
(
" .syntax unified
\n
"
"1: ldrex %0, [%2]
\n
"
" adds %0, %0, #1
\n
"
" strexpl %1, %0, [%2]
\n
"
WFE
(
"mi"
)
" rsb
pls
%0, %1, #0
\n
"
" rsb
spl
%0, %1, #0
\n
"
" bmi 1b"
:
"=&r"
(
tmp
),
"=&r"
(
tmp2
)
:
"r"
(
&
rw
->
lock
)
...
...
arch/arm/include/asm/uaccess.h
浏览文件 @
4c2741ac
...
...
@@ -86,7 +86,8 @@ static inline void set_fs(mm_segment_t fs)
#define __range_ok(addr, size) ({ \
unsigned long flag, roksum; \
__chk_user_ptr(addr); \
__asm__("adds %1, %2, %3; sbcccs %1, %1, %0; movcc %0, #0" \
__asm__(".syntax unified\n" \
"adds %1, %2, %3; sbcscc %1, %1, %0; movcc %0, #0" \
: "=&r" (flag), "=&r" (roksum) \
: "r" (addr), "Ir" (size), "0" (current_thread_info()->addr_limit) \
: "cc"); \
...
...
arch/arm/include/asm/v7m.h
浏览文件 @
4c2741ac
...
...
@@ -49,7 +49,7 @@
* (0 -> msp; 1 -> psp). Bits [1:0] are fixed to 0b01.
*/
#define EXC_RET_STACK_MASK 0x00000004
#define EXC_RET_THREADMODE_PROCESSSTACK
0xfffffffd
#define EXC_RET_THREADMODE_PROCESSSTACK
(3 << 2)
/* Cache related definitions */
...
...
arch/arm/include/asm/vfpmacros.h
浏览文件 @
4c2741ac
...
...
@@ -29,13 +29,13 @@
ldr
\
tmp
,
=
elf_hwcap
@
may
not
have
MVFR
regs
ldr
\
tmp
,
[
\
tmp
,
#
0
]
tst
\
tmp
,
#
HWCAP_VFPD32
ldc
nel
p11
,
cr0
,
[
\
base
],
#
32
*
4
@
FLDMIAD
\
base
!
,
{
d16
-
d31
}
ldc
lne
p11
,
cr0
,
[
\
base
],
#
32
*
4
@
FLDMIAD
\
base
!
,
{
d16
-
d31
}
addeq
\
base
,
\
base
,
#
32
*
4
@
step
over
unused
register
space
#else
VFPFMRX
\
tmp
,
MVFR0
@
Media
and
VFP
Feature
Register
0
and
\
tmp
,
\
tmp
,
#
MVFR0_A_SIMD_MASK
@
A_SIMD
field
cmp
\
tmp
,
#
2
@
32
x
64
bit
registers
?
ldc
eql
p11
,
cr0
,
[
\
base
],
#
32
*
4
@
FLDMIAD
\
base
!
,
{
d16
-
d31
}
ldc
leq
p11
,
cr0
,
[
\
base
],
#
32
*
4
@
FLDMIAD
\
base
!
,
{
d16
-
d31
}
addne
\
base
,
\
base
,
#
32
*
4
@
step
over
unused
register
space
#endif
#endif
...
...
@@ -53,13 +53,13 @@
ldr
\
tmp
,
=
elf_hwcap
@
may
not
have
MVFR
regs
ldr
\
tmp
,
[
\
tmp
,
#
0
]
tst
\
tmp
,
#
HWCAP_VFPD32
stc
nel
p11
,
cr0
,
[
\
base
],
#
32
*
4
@
FSTMIAD
\
base
!
,
{
d16
-
d31
}
stc
lne
p11
,
cr0
,
[
\
base
],
#
32
*
4
@
FSTMIAD
\
base
!
,
{
d16
-
d31
}
addeq
\
base
,
\
base
,
#
32
*
4
@
step
over
unused
register
space
#else
VFPFMRX
\
tmp
,
MVFR0
@
Media
and
VFP
Feature
Register
0
and
\
tmp
,
\
tmp
,
#
MVFR0_A_SIMD_MASK
@
A_SIMD
field
cmp
\
tmp
,
#
2
@
32
x
64
bit
registers
?
stc
eql
p11
,
cr0
,
[
\
base
],
#
32
*
4
@
FSTMIAD
\
base
!
,
{
d16
-
d31
}
stc
leq
p11
,
cr0
,
[
\
base
],
#
32
*
4
@
FSTMIAD
\
base
!
,
{
d16
-
d31
}
addne
\
base
,
\
base
,
#
32
*
4
@
step
over
unused
register
space
#endif
#endif
...
...
arch/arm/include/debug/tegra.S
浏览文件 @
4c2741ac
...
...
@@ -173,7 +173,7 @@
.
macro
senduart
,
rd
,
rx
cmp
\
rx
,
#
0
str
neb
\
rd
,
[
\
rx
,
#
UART_TX
<<
UART_SHIFT
]
str
bne
\
rd
,
[
\
rx
,
#
UART_TX
<<
UART_SHIFT
]
1001
:
.
endm
...
...
arch/arm/kernel/debug.S
浏览文件 @
4c2741ac
...
...
@@ -86,7 +86,7 @@ hexbuf_rel: .long hexbuf_addr - .
ENTRY
(
printascii
)
addruart_current
r3
,
r1
,
r2
1
:
teq
r0
,
#
0
ldr
neb
r1
,
[
r0
],
#
1
ldr
bne
r1
,
[
r0
],
#
1
teqne
r1
,
#
0
reteq
lr
2
:
teq
r1
,
#
'\n'
...
...
arch/arm/kernel/entry-armv.S
浏览文件 @
4c2741ac
...
...
@@ -636,7 +636,7 @@ call_fpe:
@
Test
if
we
need
to
give
access
to
iWMMXt
coprocessors
ldr
r5
,
[
r10
,
#
TI_FLAGS
]
rsbs
r7
,
r8
,
#(
1
<<
8
)
@
CP
0
or
1
only
mov
cs
s
r7
,
r5
,
lsr
#(
TIF_USING_IWMMXT
+
1
)
mov
sc
s
r7
,
r5
,
lsr
#(
TIF_USING_IWMMXT
+
1
)
bcs
iwmmxt_task_enable
#endif
ARM
(
add
pc
,
pc
,
r8
,
lsr
#
6
)
...
...
@@ -872,7 +872,7 @@ __kuser_cmpxchg64: @ 0xffff0f60
smp_dmb
arm
1
:
ldrexd
r0
,
r1
,
[
r2
]
@
load
current
val
eors
r3
,
r0
,
r4
@
compare
with
oldval
(
1
)
eor
eqs
r3
,
r1
,
r5
@
compare
with
oldval
(
2
)
eor
seq
r3
,
r1
,
r5
@
compare
with
oldval
(
2
)
strexdeq
r3
,
r6
,
r7
,
[
r2
]
@
store
newval
if
eq
teqeq
r3
,
#
1
@
success
?
beq
1
b
@
if
no
then
retry
...
...
@@ -896,8 +896,8 @@ __kuser_cmpxchg64: @ 0xffff0f60
ldmia
r1
,
{
r6
,
lr
}
@
load
new
val
1
:
ldmia
r2
,
{
r0
,
r1
}
@
load
current
val
eors
r3
,
r0
,
r4
@
compare
with
oldval
(
1
)
eor
eqs
r3
,
r1
,
r5
@
compare
with
oldval
(
2
)
2
:
stm
eqia
r2
,
{
r6
,
lr
}
@
store
newval
if
eq
eor
seq
r3
,
r1
,
r5
@
compare
with
oldval
(
2
)
2
:
stm
iaeq
r2
,
{
r6
,
lr
}
@
store
newval
if
eq
rsbs
r0
,
r3
,
#
0
@
set
return
val
and
C
flag
ldmfd
sp
!,
{
r4
,
r5
,
r6
,
pc
}
...
...
@@ -911,7 +911,7 @@ kuser_cmpxchg64_fixup:
mov
r7
,
#
0xffff0fff
sub
r7
,
r7
,
#(
0xffff0fff
-
(
0xffff0f60
+
(
1
b
-
__kuser_cmpxchg64
)))
subs
r8
,
r4
,
r7
rsb
cs
s
r8
,
r8
,
#(
2
b
-
1
b
)
rsb
sc
s
r8
,
r8
,
#(
2
b
-
1
b
)
strcs
r7
,
[
sp
,
#
S_PC
]
#if __LINUX_ARM_ARCH__ < 6
bcc
kuser_cmpxchg32_fixup
...
...
@@ -969,7 +969,7 @@ kuser_cmpxchg32_fixup:
mov
r7
,
#
0xffff0fff
sub
r7
,
r7
,
#(
0xffff0fff
-
(
0xffff0fc0
+
(
1
b
-
__kuser_cmpxchg
)))
subs
r8
,
r4
,
r7
rsb
cs
s
r8
,
r8
,
#(
2
b
-
1
b
)
rsb
sc
s
r8
,
r8
,
#(
2
b
-
1
b
)
strcs
r7
,
[
sp
,
#
S_PC
]
ret
lr
.
previous
...
...
arch/arm/kernel/entry-common.S
浏览文件 @
4c2741ac
...
...
@@ -373,7 +373,7 @@ sys_syscall:
movhs
scno
,
#
0
csdb
#endif
stm
loia
sp
,
{
r5
,
r6
}
@
shuffle
args
stm
ialo
sp
,
{
r5
,
r6
}
@
shuffle
args
movlo
r0
,
r1
movlo
r1
,
r2
movlo
r2
,
r3
...
...
arch/arm/kernel/entry-header.S
浏览文件 @
4c2741ac
...
...
@@ -127,7 +127,8 @@
*/
.
macro
v7m_exception_slow_exit
ret_r0
cpsid
i
ldr
lr
,
=
EXC_RET_THREADMODE_PROCESSSTACK
ldr
lr
,
=
exc_ret
ldr
lr
,
[
lr
]
@
read
original
r12
,
sp
,
lr
,
pc
and
xPSR
add
r12
,
sp
,
#
S_IP
...
...
@@ -387,8 +388,8 @@
badr
lr
,
\
ret
@
return
address
.
if
\
reload
add
r1
,
sp
,
#
S_R0
+
S_OFF
@
pointer
to
regs
ldm
ccia
r1
,
{
r0
-
r6
}
@
reload
r0
-
r6
stm
ccia
sp
,
{
r4
,
r5
}
@
update
stack
arguments
ldm
iacc
r1
,
{
r0
-
r6
}
@
reload
r0
-
r6
stm
iacc
sp
,
{
r4
,
r5
}
@
update
stack
arguments
.
endif
ldrcc
pc
,
[
\
table
,
\
tmp
,
lsl
#
2
]
@
call
sys_
*
routine
#else
...
...
@@ -396,8 +397,8 @@
badr
lr
,
\
ret
@
return
address
.
if
\
reload
add
r1
,
sp
,
#
S_R0
+
S_OFF
@
pointer
to
regs
ldm
ccia
r1
,
{
r0
-
r6
}
@
reload
r0
-
r6
stm
ccia
sp
,
{
r4
,
r5
}
@
update
stack
arguments
ldm
iacc
r1
,
{
r0
-
r6
}
@
reload
r0
-
r6
stm
iacc
sp
,
{
r4
,
r5
}
@
update
stack
arguments
.
endif
ldrcc
pc
,
[
\
table
,
\
nr
,
lsl
#
2
]
@
call
sys_
*
routine
#endif
...
...
arch/arm/kernel/entry-v7m.S
浏览文件 @
4c2741ac
...
...
@@ -146,3 +146,7 @@ ENTRY(vector_table)
.
rept
CONFIG_CPU_V7M_NUM_IRQ
.
long
__irq_entry
@
External
Interrupts
.
endr
.
align
2
.
globl
exc_ret
exc_ret
:
.
space
4
arch/arm/kernel/hyp-stub.S
浏览文件 @
4c2741ac
...
...
@@ -180,8 +180,8 @@ ARM_BE8(orr r7, r7, #(1 << 25)) @ HSCTLR.EE
@
Check
whether
GICv3
system
registers
are
available
mrc
p15
,
0
,
r7
,
c0
,
c1
,
1
@
ID_PFR1
ubfx
r7
,
r7
,
#
28
,
#
4
cmp
r7
,
#
1
b
ne
2
f
teq
r7
,
#
0
b
eq
2
f
@
Enable
system
register
accesses
mrc
p15
,
4
,
r7
,
c12
,
c9
,
5
@
ICC_HSRE
...
...
arch/arm/kernel/machine_kexec.c
浏览文件 @
4c2741ac
...
...
@@ -91,8 +91,11 @@ void machine_crash_nonpanic_core(void *unused)
set_cpu_online
(
smp_processor_id
(),
false
);
atomic_dec
(
&
waiting_for_crash_ipi
);
while
(
1
)
while
(
1
)
{
cpu_relax
();
wfe
();
}
}
void
crash_smp_send_stop
(
void
)
...
...
arch/arm/kernel/smp.c
浏览文件 @
4c2741ac
...
...
@@ -62,12 +62,6 @@
*/
struct
secondary_data
secondary_data
;
/*
* control for which core is the next to come out of the secondary
* boot "holding pen"
*/
volatile
int
pen_release
=
-
1
;
enum
ipi_msg_type
{
IPI_WAKEUP
,
IPI_TIMER
,
...
...
@@ -604,8 +598,10 @@ static void ipi_cpu_stop(unsigned int cpu)
local_fiq_disable
();
local_irq_disable
();
while
(
1
)
while
(
1
)
{
cpu_relax
();
wfe
();
}
}
static
DEFINE_PER_CPU
(
struct
completion
*
,
cpu_completion
);
...
...
arch/arm/kernel/smp_twd.c
浏览文件 @
4c2741ac
...
...
@@ -100,8 +100,6 @@ static void twd_timer_stop(void)
disable_percpu_irq
(
clk
->
irq
);
}
#ifdef CONFIG_COMMON_CLK
/*
* Updates clockevent frequency when the cpu frequency changes.
* Called on the cpu that is changing frequency with interrupts disabled.
...
...
@@ -143,54 +141,6 @@ static int twd_clk_init(void)
}
core_initcall
(
twd_clk_init
);
#elif defined (CONFIG_CPU_FREQ)
#include <linux/cpufreq.h>
/*
* Updates clockevent frequency when the cpu frequency changes.
* Called on the cpu that is changing frequency with interrupts disabled.
*/
static
void
twd_update_frequency
(
void
*
data
)
{
twd_timer_rate
=
clk_get_rate
(
twd_clk
);
clockevents_update_freq
(
raw_cpu_ptr
(
twd_evt
),
twd_timer_rate
);
}
static
int
twd_cpufreq_transition
(
struct
notifier_block
*
nb
,
unsigned
long
state
,
void
*
data
)
{
struct
cpufreq_freqs
*
freqs
=
data
;
/*
* The twd clock events must be reprogrammed to account for the new
* frequency. The timer is local to a cpu, so cross-call to the
* changing cpu.
*/
if
(
state
==
CPUFREQ_POSTCHANGE
)
smp_call_function_single
(
freqs
->
cpu
,
twd_update_frequency
,
NULL
,
1
);
return
NOTIFY_OK
;
}
static
struct
notifier_block
twd_cpufreq_nb
=
{
.
notifier_call
=
twd_cpufreq_transition
,
};
static
int
twd_cpufreq_init
(
void
)
{
if
(
twd_evt
&&
raw_cpu_ptr
(
twd_evt
)
&&
!
IS_ERR
(
twd_clk
))
return
cpufreq_register_notifier
(
&
twd_cpufreq_nb
,
CPUFREQ_TRANSITION_NOTIFIER
);
return
0
;
}
core_initcall
(
twd_cpufreq_init
);
#endif
static
void
twd_calibrate_rate
(
void
)
{
unsigned
long
count
;
...
...
@@ -366,21 +316,6 @@ static int __init twd_local_timer_common_register(struct device_node *np)
return
err
;
}
int
__init
twd_local_timer_register
(
struct
twd_local_timer
*
tlt
)
{
if
(
twd_base
||
twd_evt
)
return
-
EBUSY
;
twd_ppi
=
tlt
->
res
[
1
].
start
;
twd_base
=
ioremap
(
tlt
->
res
[
0
].
start
,
resource_size
(
&
tlt
->
res
[
0
]));
if
(
!
twd_base
)
return
-
ENOMEM
;
return
twd_local_timer_common_register
(
NULL
);
}
#ifdef CONFIG_OF
static
int
__init
twd_local_timer_of_register
(
struct
device_node
*
np
)
{
int
err
;
...
...
@@ -406,4 +341,3 @@ static int __init twd_local_timer_of_register(struct device_node *np)
TIMER_OF_DECLARE
(
arm_twd_a9
,
"arm,cortex-a9-twd-timer"
,
twd_local_timer_of_register
);
TIMER_OF_DECLARE
(
arm_twd_a5
,
"arm,cortex-a5-twd-timer"
,
twd_local_timer_of_register
);
TIMER_OF_DECLARE
(
arm_twd_11mp
,
"arm,arm11mp-twd-timer"
,
twd_local_timer_of_register
);
#endif
arch/arm/lib/Makefile
浏览文件 @
4c2741ac
...
...
@@ -39,7 +39,7 @@ $(obj)/csumpartialcopy.o: $(obj)/csumpartialcopygeneric.S
$(obj)/csumpartialcopyuser.o
:
$(obj)/csumpartialcopygeneric.S
ifeq
($(CONFIG_KERNEL_MODE_NEON),y)
NEON_FLAGS
:=
-mfloat-abi
=
softfp
-mfpu
=
neon
NEON_FLAGS
:=
-m
arch
=
armv7-a
-m
float-abi
=
softfp
-mfpu
=
neon
CFLAGS_xor-neon.o
+=
$(NEON_FLAGS)
obj-$(CONFIG_XOR_BLOCKS)
+=
xor-neon.o
endif
arch/arm/lib/bitops.h
浏览文件 @
4c2741ac
...
...
@@ -7,7 +7,7 @@
ENTRY
(
\
name
)
UNWIND
(
.
fnstart
)
ands
ip
,
r1
,
#
3
str
neb
r1
,
[
ip
]
@
assert
word
-
aligned
str
bne
r1
,
[
ip
]
@
assert
word
-
aligned
mov
r2
,
#
1
and
r3
,
r0
,
#
31
@
Get
bit
offset
mov
r0
,
r0
,
lsr
#
5
...
...
@@ -32,7 +32,7 @@ ENDPROC(\name )
ENTRY
(
\
name
)
UNWIND
(
.
fnstart
)
ands
ip
,
r1
,
#
3
str
neb
r1
,
[
ip
]
@
assert
word
-
aligned
str
bne
r1
,
[
ip
]
@
assert
word
-
aligned
mov
r2
,
#
1
and
r3
,
r0
,
#
31
@
Get
bit
offset
mov
r0
,
r0
,
lsr
#
5
...
...
@@ -62,7 +62,7 @@ ENDPROC(\name )
ENTRY
(
\
name
)
UNWIND
(
.
fnstart
)
ands
ip
,
r1
,
#
3
str
neb
r1
,
[
ip
]
@
assert
word
-
aligned
str
bne
r1
,
[
ip
]
@
assert
word
-
aligned
and
r2
,
r0
,
#
31
mov
r0
,
r0
,
lsr
#
5
mov
r3
,
#
1
...
...
@@ -89,7 +89,7 @@ ENDPROC(\name )
ENTRY
(
\
name
)
UNWIND
(
.
fnstart
)
ands
ip
,
r1
,
#
3
str
neb
r1
,
[
ip
]
@
assert
word
-
aligned
str
bne
r1
,
[
ip
]
@
assert
word
-
aligned
and
r3
,
r0
,
#
31
mov
r0
,
r0
,
lsr
#
5
save_and_disable_irqs
ip
...
...
arch/arm/lib/clear_user.S
浏览文件 @
4c2741ac
...
...
@@ -44,7 +44,7 @@ UNWIND(.save {r1, lr})
strusr
r2
,
r0
,
1
,
ne
,
rept
=
2
tst
r1
,
#
1
@
x1
x0
x1
x0
x1
x0
x1
it
ne
@
explicit
IT
needed
for
the
label
USER
(
str
nebt
r2
,
[
r0
])
USER
(
str
btne
r2
,
[
r0
])
mov
r0
,
#
0
ldmfd
sp
!,
{
r1
,
pc
}
UNWIND
(.
fnend
)
...
...
arch/arm/lib/copy_from_user.S
浏览文件 @
4c2741ac
...
...
@@ -91,7 +91,7 @@
.
endm
.
macro
str1b
ptr
reg
cond
=
al
abort
str
\
cond
\()
b
\
reg
,
[
\
ptr
],
#
1
str
b
\
cond
\
reg
,
[
\
ptr
],
#
1
.
endm
.
macro
enter
reg1
reg2
...
...
arch/arm/lib/copy_page.S
浏览文件 @
4c2741ac
...
...
@@ -39,9 +39,9 @@ ENTRY(copy_page)
.
endr
subs
r2
,
r2
,
#
1
@
1
stmia
r0
!,
{
r3
,
r4
,
ip
,
lr
}
@
4
ldm
gtia
r1
!,
{
r3
,
r4
,
ip
,
lr
}
@
4
ldm
iagt
r1
!,
{
r3
,
r4
,
ip
,
lr
}
@
4
bgt
1
b
@
1
PLD
(
ldm
eqia
r1
!,
{
r3
,
r4
,
ip
,
lr
}
)
PLD
(
ldm
iaeq
r1
!,
{
r3
,
r4
,
ip
,
lr
}
)
PLD
(
beq
2
b
)
ldmfd
sp
!,
{
r4
,
pc
}
@
3
ENDPROC
(
copy_page
)
arch/arm/lib/copy_template.S
浏览文件 @
4c2741ac
...
...
@@ -99,7 +99,7 @@
CALGN
(
ands
ip
,
r0
,
#
31
)
CALGN
(
rsb
r3
,
ip
,
#
32
)
CALGN
(
sbc
nes
r4
,
r3
,
r2
)
@
C
is
always
set
here
CALGN
(
sbc
sne
r4
,
r3
,
r2
)
@
C
is
always
set
here
CALGN
(
bcs
2
f
)
CALGN
(
adr
r4
,
6
f
)
CALGN
(
subs
r2
,
r2
,
r3
)
@
C
gets
set
...
...
@@ -204,7 +204,7 @@
CALGN
(
ands
ip
,
r0
,
#
31
)
CALGN
(
rsb
ip
,
ip
,
#
32
)
CALGN
(
sbc
nes
r4
,
ip
,
r2
)
@
C
is
always
set
here
CALGN
(
sbc
sne
r4
,
ip
,
r2
)
@
C
is
always
set
here
CALGN
(
subcc
r2
,
r2
,
ip
)
CALGN
(
bcc
15
f
)
...
...
@@ -241,7 +241,7 @@
orr
r9
,
r9
,
ip
,
lspush
#
\
push
mov
ip
,
ip
,
lspull
#
\
pull
orr
ip
,
ip
,
lr
,
lspush
#
\
push
str8w
r0
,
r3
,
r4
,
r5
,
r6
,
r7
,
r8
,
r9
,
ip
,
,
abort
=
19
f
str8w
r0
,
r3
,
r4
,
r5
,
r6
,
r7
,
r8
,
r9
,
ip
,
abort
=
19
f
bge
12
b
PLD
(
cmn
r2
,
#
96
)
PLD
(
bge
13
b
)
...
...
arch/arm/lib/copy_to_user.S
浏览文件 @
4c2741ac
...
...
@@ -49,7 +49,7 @@
.
endm
.
macro
ldr1b
ptr
reg
cond
=
al
abort
ldr
\
cond
\()
b
\
reg
,
[
\
ptr
],
#
1
ldr
b
\
cond
\
reg
,
[
\
ptr
],
#
1
.
endm
#ifdef CONFIG_CPU_USE_DOMAINS
...
...
arch/arm/lib/csumpartial.S
浏览文件 @
4c2741ac
...
...
@@ -40,9 +40,9 @@ td3 .req lr
/
*
we
must
have
at
least
one
byte
.
*/
tst
buf
,
#
1
@
odd
address
?
movne
sum
,
sum
,
ror
#
8
ldr
neb
td0
,
[
buf
],
#
1
ldr
bne
td0
,
[
buf
],
#
1
subne
len
,
len
,
#
1
adc
nes
sum
,
sum
,
td0
,
put_byte_1
adc
sne
sum
,
sum
,
td0
,
put_byte_1
.
Lless4
:
tst
len
,
#
6
beq
.
Lless8_byte
...
...
@@ -68,8 +68,8 @@ td3 .req lr
bne
.
Lless8_wordlp
.
Lless8_byte
:
tst
len
,
#
1
@
odd
number
of
bytes
ldr
neb
td0
,
[
buf
],
#
1
@
include
last
byte
adc
nes
sum
,
sum
,
td0
,
put_byte_0
@
update
checksum
ldr
bne
td0
,
[
buf
],
#
1
@
include
last
byte
adc
sne
sum
,
sum
,
td0
,
put_byte_0
@
update
checksum
.
Ldone
:
adc
r0
,
sum
,
#
0
@
collect
up
the
last
carry
ldr
td0
,
[
sp
],
#
4
...
...
@@ -78,17 +78,17 @@ td3 .req lr
ldr
pc
,
[
sp
],
#
4
@
return
.
Lnot_aligned
:
tst
buf
,
#
1
@
odd
address
ldr
neb
td0
,
[
buf
],
#
1
@
make
even
ldr
bne
td0
,
[
buf
],
#
1
@
make
even
subne
len
,
len
,
#
1
adc
nes
sum
,
sum
,
td0
,
put_byte_1
@
update
checksum
adc
sne
sum
,
sum
,
td0
,
put_byte_1
@
update
checksum
tst
buf
,
#
2
@
32
-
bit
aligned
?
#if __LINUX_ARM_ARCH__ >= 4
ldr
neh
td0
,
[
buf
],
#
2
@
make
32
-
bit
aligned
ldr
hne
td0
,
[
buf
],
#
2
@
make
32
-
bit
aligned
subne
len
,
len
,
#
2
#else
ldr
neb
td0
,
[
buf
],
#
1
ldr
neb
ip
,
[
buf
],
#
1
ldr
bne
td0
,
[
buf
],
#
1
ldr
bne
ip
,
[
buf
],
#
1
subne
len
,
len
,
#
2
#ifndef __ARMEB__
orrne
td0
,
td0
,
ip
,
lsl
#
8
...
...
@@ -96,7 +96,7 @@ td3 .req lr
orrne
td0
,
ip
,
td0
,
lsl
#
8
#endif
#endif
adc
nes
sum
,
sum
,
td0
@
update
checksum
adc
sne
sum
,
sum
,
td0
@
update
checksum
ret
lr
ENTRY
(
csum_partial
)
...
...
arch/arm/lib/csumpartialcopygeneric.S
浏览文件 @
4c2741ac
...
...
@@ -148,9 +148,9 @@ FN_ENTRY
strb
r5
,
[
dst
],
#
1
mov
r5
,
r4
,
get_byte_2
.
Lexit
:
tst
len
,
#
1
str
neb
r5
,
[
dst
],
#
1
str
bne
r5
,
[
dst
],
#
1
andne
r5
,
r5
,
#
255
adc
nes
sum
,
sum
,
r5
,
put_byte_0
adc
sne
sum
,
sum
,
r5
,
put_byte_0
/
*
*
If
the
dst
pointer
was
not
16
-
bit
aligned
,
we
...
...
arch/arm/lib/csumpartialcopyuser.S
浏览文件 @
4c2741ac
...
...
@@ -95,7 +95,7 @@
add
r2
,
r2
,
r1
mov
r0
,
#
0
@
zero
the
buffer
9002
:
teq
r2
,
r1
str
neb
r0
,
[
r1
],
#
1
str
bne
r0
,
[
r1
],
#
1
bne
9002
b
load_regs
.
popsection
arch/arm/lib/div64.S
浏览文件 @
4c2741ac
...
...
@@ -88,8 +88,8 @@ UNWIND(.fnstart)
@
Break
out
early
if
dividend
reaches
0
.
2
:
cmp
xh
,
yl
orrcs
yh
,
yh
,
ip
sub
cs
s
xh
,
xh
,
yl
mov
nes
ip
,
ip
,
lsr
#
1
sub
sc
s
xh
,
xh
,
yl
mov
sne
ip
,
ip
,
lsr
#
1
mov
yl
,
yl
,
lsr
#
1
bne
2
b
...
...
arch/arm/lib/floppydma.S
浏览文件 @
4c2741ac
...
...
@@ -14,8 +14,8 @@
.
global
floppy_fiqin_end
ENTRY
(
floppy_fiqin_start
)
subs
r9
,
r9
,
#
1
ldr
gtb
r12
,
[
r11
,
#-
4
]
ldr
leb
r12
,
[
r11
],
#
0
ldr
bgt
r12
,
[
r11
,
#-
4
]
ldr
ble
r12
,
[
r11
],
#
0
strb
r12
,
[
r10
],
#
1
subs
pc
,
lr
,
#
4
floppy_fiqin_end
:
...
...
@@ -23,10 +23,10 @@ floppy_fiqin_end:
.
global
floppy_fiqout_end
ENTRY
(
floppy_fiqout_start
)
subs
r9
,
r9
,
#
1
ldr
geb
r12
,
[
r10
],
#
1
ldr
bge
r12
,
[
r10
],
#
1
movlt
r12
,
#
0
str
leb
r12
,
[
r11
],
#
0
sub
les
pc
,
lr
,
#
4
str
ble
r12
,
[
r11
],
#
0
sub
sle
pc
,
lr
,
#
4
strb
r12
,
[
r11
,
#-
4
]
subs
pc
,
lr
,
#
4
floppy_fiqout_end
:
arch/arm/lib/io-readsb.S
浏览文件 @
4c2741ac
...
...
@@ -16,10 +16,10 @@
cmp
ip
,
#
2
ldrb
r3
,
[
r0
]
strb
r3
,
[
r1
],
#
1
ldr
geb
r3
,
[
r0
]
str
geb
r3
,
[
r1
],
#
1
ldr
gtb
r3
,
[
r0
]
str
gtb
r3
,
[
r1
],
#
1
ldr
bge
r3
,
[
r0
]
str
bge
r3
,
[
r1
],
#
1
ldr
bgt
r3
,
[
r0
]
str
bgt
r3
,
[
r1
],
#
1
subs
r2
,
r2
,
ip
bne
.
Linsb_aligned
...
...
@@ -72,7 +72,7 @@ ENTRY(__raw_readsb)
bpl
.
Linsb_16_lp
tst
r2
,
#
15
ldm
eqfd
sp
!,
{
r4
-
r6
,
pc
}
ldm
fdeq
sp
!,
{
r4
-
r6
,
pc
}
.
Linsb_no_16
:
tst
r2
,
#
8
beq
.
Linsb_no_8
...
...
@@ -109,15 +109,15 @@ ENTRY(__raw_readsb)
str
r3
,
[
r1
],
#
4
.
Linsb_no_4
:
ands
r2
,
r2
,
#
3
ldm
eqfd
sp
!,
{
r4
-
r6
,
pc
}
ldm
fdeq
sp
!,
{
r4
-
r6
,
pc
}
cmp
r2
,
#
2
ldrb
r3
,
[
r0
]
strb
r3
,
[
r1
],
#
1
ldr
geb
r3
,
[
r0
]
str
geb
r3
,
[
r1
],
#
1
ldr
gtb
r3
,
[
r0
]
str
gtb
r3
,
[
r1
]
ldr
bge
r3
,
[
r0
]
str
bge
r3
,
[
r1
],
#
1
ldr
bgt
r3
,
[
r0
]
str
bgt
r3
,
[
r1
]
ldmfd
sp
!,
{
r4
-
r6
,
pc
}
ENDPROC
(
__raw_readsb
)
arch/arm/lib/io-readsl.S
浏览文件 @
4c2741ac
...
...
@@ -30,7 +30,7 @@ ENTRY(__raw_readsl)
2
:
movs
r2
,
r2
,
lsl
#
31
ldrcs
r3
,
[
r0
,
#
0
]
ldrcs
ip
,
[
r0
,
#
0
]
stm
csia
r1
!,
{
r3
,
ip
}
stm
iacs
r1
!,
{
r3
,
ip
}
ldrne
r3
,
[
r0
,
#
0
]
strne
r3
,
[
r1
,
#
0
]
ret
lr
...
...
arch/arm/lib/io-readsw-armv3.S
浏览文件 @
4c2741ac
...
...
@@ -68,7 +68,7 @@ ENTRY(__raw_readsw)
bpl
.
Linsw_8_lp
tst
r2
,
#
7
ldm
eqfd
sp
!,
{
r4
,
r5
,
r6
,
pc
}
ldm
fdeq
sp
!,
{
r4
,
r5
,
r6
,
pc
}
.
Lno_insw_8
:
tst
r2
,
#
4
beq
.
Lno_insw_4
...
...
@@ -97,9 +97,9 @@ ENTRY(__raw_readsw)
.
Lno_insw_2
:
tst
r2
,
#
1
ldrne
r3
,
[
r0
]
str
neb
r3
,
[
r1
],
#
1
str
bne
r3
,
[
r1
],
#
1
movne
r3
,
r3
,
lsr
#
8
str
neb
r3
,
[
r1
]
str
bne
r3
,
[
r1
]
ldmfd
sp
!,
{
r4
,
r5
,
r6
,
pc
}
...
...
arch/arm/lib/io-readsw-armv4.S
浏览文件 @
4c2741ac
...
...
@@ -76,8 +76,8 @@ ENTRY(__raw_readsw)
pack
r3
,
r3
,
ip
str
r3
,
[
r1
],
#
4
.
Lno_insw_2
:
ldr
neh
r3
,
[
r0
]
str
neh
r3
,
[
r1
]
.
Lno_insw_2
:
ldr
hne
r3
,
[
r0
]
str
hne
r3
,
[
r1
]
ldmfd
sp
!,
{
r4
,
r5
,
pc
}
...
...
@@ -94,7 +94,7 @@ ENTRY(__raw_readsw)
#endif
.
Linsw_noalign
:
stmfd
sp
!,
{
r4
,
lr
}
ldr
ccb
ip
,
[
r1
,
#-
1
]!
ldr
bcc
ip
,
[
r1
,
#-
1
]!
bcc
1
f
ldrh
ip
,
[
r0
]
...
...
@@ -121,11 +121,11 @@ ENTRY(__raw_readsw)
3
:
tst
r2
,
#
1
strb
ip
,
[
r1
],
#
1
ldr
neh
ip
,
[
r0
]
ldr
hne
ip
,
[
r0
]
_BE_ONLY_
(
movne
ip
,
ip
,
ror
#
8
)
str
neb
ip
,
[
r1
],
#
1
str
bne
ip
,
[
r1
],
#
1
_LE_ONLY_
(
movne
ip
,
ip
,
lsr
#
8
)
_BE_ONLY_
(
movne
ip
,
ip
,
lsr
#
24
)
str
neb
ip
,
[
r1
]
str
bne
ip
,
[
r1
]
ldmfd
sp
!,
{
r4
,
pc
}
ENDPROC
(
__raw_readsw
)
arch/arm/lib/io-writesb.S
浏览文件 @
4c2741ac
...
...
@@ -36,10 +36,10 @@
cmp
ip
,
#
2
ldrb
r3
,
[
r1
],
#
1
strb
r3
,
[
r0
]
ldr
geb
r3
,
[
r1
],
#
1
str
geb
r3
,
[
r0
]
ldr
gtb
r3
,
[
r1
],
#
1
str
gtb
r3
,
[
r0
]
ldr
bge
r3
,
[
r1
],
#
1
str
bge
r3
,
[
r0
]
ldr
bgt
r3
,
[
r1
],
#
1
str
bgt
r3
,
[
r0
]
subs
r2
,
r2
,
ip
bne
.
Loutsb_aligned
...
...
@@ -64,7 +64,7 @@ ENTRY(__raw_writesb)
bpl
.
Loutsb_16_lp
tst
r2
,
#
15
ldm
eqfd
sp
!,
{
r4
,
r5
,
pc
}
ldm
fdeq
sp
!,
{
r4
,
r5
,
pc
}
.
Loutsb_no_16
:
tst
r2
,
#
8
beq
.
Loutsb_no_8
...
...
@@ -80,15 +80,15 @@ ENTRY(__raw_writesb)
outword
r3
.
Loutsb_no_4
:
ands
r2
,
r2
,
#
3
ldm
eqfd
sp
!,
{
r4
,
r5
,
pc
}
ldm
fdeq
sp
!,
{
r4
,
r5
,
pc
}
cmp
r2
,
#
2
ldrb
r3
,
[
r1
],
#
1
strb
r3
,
[
r0
]
ldr
geb
r3
,
[
r1
],
#
1
str
geb
r3
,
[
r0
]
ldr
gtb
r3
,
[
r1
]
str
gtb
r3
,
[
r0
]
ldr
bge
r3
,
[
r1
],
#
1
str
bge
r3
,
[
r0
]
ldr
bgt
r3
,
[
r1
]
str
bgt
r3
,
[
r0
]
ldmfd
sp
!,
{
r4
,
r5
,
pc
}
ENDPROC
(
__raw_writesb
)
arch/arm/lib/io-writesl.S
浏览文件 @
4c2741ac
...
...
@@ -28,7 +28,7 @@ ENTRY(__raw_writesl)
bpl
1
b
ldmfd
sp
!,
{
r4
,
lr
}
2
:
movs
r2
,
r2
,
lsl
#
31
ldm
csia
r1
!,
{
r3
,
ip
}
ldm
iacs
r1
!,
{
r3
,
ip
}
strcs
r3
,
[
r0
,
#
0
]
ldrne
r3
,
[
r1
,
#
0
]
strcs
ip
,
[
r0
,
#
0
]
...
...
arch/arm/lib/io-writesw-armv3.S
浏览文件 @
4c2741ac
...
...
@@ -79,7 +79,7 @@ ENTRY(__raw_writesw)
bpl
.
Loutsw_8_lp
tst
r2
,
#
7
ldm
eqfd
sp
!,
{
r4
,
r5
,
r6
,
pc
}
ldm
fdeq
sp
!,
{
r4
,
r5
,
r6
,
pc
}
.
Lno_outsw_8
:
tst
r2
,
#
4
beq
.
Lno_outsw_4
...
...
arch/arm/lib/io-writesw-armv4.S
浏览文件 @
4c2741ac
...
...
@@ -61,8 +61,8 @@ ENTRY(__raw_writesw)
ldr
r3
,
[
r1
],
#
4
outword
r3
.
Lno_outsw_2
:
ldr
neh
r3
,
[
r1
]
str
neh
r3
,
[
r0
]
.
Lno_outsw_2
:
ldr
hne
r3
,
[
r1
]
str
hne
r3
,
[
r0
]
ldmfd
sp
!,
{
r4
,
r5
,
pc
}
...
...
@@ -95,6 +95,6 @@ ENTRY(__raw_writesw)
tst
r2
,
#
1
3
:
movne
ip
,
r3
,
lsr
#
8
str
neh
ip
,
[
r0
]
str
hne
ip
,
[
r0
]
ret
lr
ENDPROC
(
__raw_writesw
)
arch/arm/lib/lib1funcs.S
浏览文件 @
4c2741ac
...
...
@@ -96,7 +96,7 @@ Boston, MA 02111-1307, USA. */
subhs
\
dividend
,
\
dividend
,
\
divisor
,
lsr
#
3
orrhs
\
result
,
\
result
,
\
curbit
,
lsr
#
3
cmp
\
dividend
,
#
0
@
Early
termination
?
mov
nes
\
curbit
,
\
curbit
,
lsr
#
4
@
No
,
any
more
bits
to
do
?
mov
sne
\
curbit
,
\
curbit
,
lsr
#
4
@
No
,
any
more
bits
to
do
?
movne
\
divisor
,
\
divisor
,
lsr
#
4
bne
1
b
...
...
@@ -182,7 +182,7 @@ Boston, MA 02111-1307, USA. */
subhs
\
dividend
,
\
dividend
,
\
divisor
,
lsr
#
3
cmp
\
dividend
,
#
1
mov
\
divisor
,
\
divisor
,
lsr
#
4
sub
ges
\
order
,
\
order
,
#
4
sub
sge
\
order
,
\
order
,
#
4
bge
1
b
tst
\
order
,
#
3
...
...
arch/arm/lib/memcpy.S
浏览文件 @
4c2741ac
...
...
@@ -30,7 +30,7 @@
.
endm
.
macro
ldr1b
ptr
reg
cond
=
al
abort
ldr
\
cond
\()
b
\
reg
,
[
\
ptr
],
#
1
ldr
b
\
cond
\
reg
,
[
\
ptr
],
#
1
.
endm
.
macro
str1w
ptr
reg
abort
...
...
@@ -42,7 +42,7 @@
.
endm
.
macro
str1b
ptr
reg
cond
=
al
abort
str
\
cond
\()
b
\
reg
,
[
\
ptr
],
#
1
str
b
\
cond
\
reg
,
[
\
ptr
],
#
1
.
endm
.
macro
enter
reg1
reg2
...
...
arch/arm/lib/memmove.S
浏览文件 @
4c2741ac
...
...
@@ -59,7 +59,7 @@ ENTRY(memmove)
blt
5
f
CALGN
(
ands
ip
,
r0
,
#
31
)
CALGN
(
sbc
nes
r4
,
ip
,
r2
)
@
C
is
always
set
here
CALGN
(
sbc
sne
r4
,
ip
,
r2
)
@
C
is
always
set
here
CALGN
(
bcs
2
f
)
CALGN
(
adr
r4
,
6
f
)
CALGN
(
subs
r2
,
r2
,
ip
)
@
C
is
set
here
...
...
@@ -114,20 +114,20 @@ ENTRY(memmove)
UNWIND
(
.
save
{
r0
,
r4
,
lr
}
)
@
still
in
first
stmfd
block
8
:
movs
r2
,
r2
,
lsl
#
31
ldr
neb
r3
,
[
r1
,
#-
1
]!
ldr
csb
r4
,
[
r1
,
#-
1
]!
ldr
csb
ip
,
[
r1
,
#-
1
]
str
neb
r3
,
[
r0
,
#-
1
]!
str
csb
r4
,
[
r0
,
#-
1
]!
str
csb
ip
,
[
r0
,
#-
1
]
ldr
bne
r3
,
[
r1
,
#-
1
]!
ldr
bcs
r4
,
[
r1
,
#-
1
]!
ldr
bcs
ip
,
[
r1
,
#-
1
]
str
bne
r3
,
[
r0
,
#-
1
]!
str
bcs
r4
,
[
r0
,
#-
1
]!
str
bcs
ip
,
[
r0
,
#-
1
]
ldmfd
sp
!,
{
r0
,
r4
,
pc
}
9
:
cmp
ip
,
#
2
ldr
gtb
r3
,
[
r1
,
#-
1
]!
ldr
geb
r4
,
[
r1
,
#-
1
]!
ldr
bgt
r3
,
[
r1
,
#-
1
]!
ldr
bge
r4
,
[
r1
,
#-
1
]!
ldrb
lr
,
[
r1
,
#-
1
]!
str
gtb
r3
,
[
r0
,
#-
1
]!
str
geb
r4
,
[
r0
,
#-
1
]!
str
bgt
r3
,
[
r0
,
#-
1
]!
str
bge
r4
,
[
r0
,
#-
1
]!
subs
r2
,
r2
,
ip
strb
lr
,
[
r0
,
#-
1
]!
blt
8
b
...
...
@@ -150,7 +150,7 @@ ENTRY(memmove)
blt
14
f
CALGN
(
ands
ip
,
r0
,
#
31
)
CALGN
(
sbc
nes
r4
,
ip
,
r2
)
@
C
is
always
set
here
CALGN
(
sbc
sne
r4
,
ip
,
r2
)
@
C
is
always
set
here
CALGN
(
subcc
r2
,
r2
,
ip
)
CALGN
(
bcc
15
f
)
...
...
arch/arm/lib/memset.S
浏览文件 @
4c2741ac
...
...
@@ -44,20 +44,20 @@ UNWIND( .save {r8, lr} )
mov
lr
,
r3
2
:
subs
r2
,
r2
,
#
64
stm
geia
ip
!,
{
r1
,
r3
,
r8
,
lr
}
@
64
bytes
at
a
time
.
stm
geia
ip
!,
{
r1
,
r3
,
r8
,
lr
}
stm
geia
ip
!,
{
r1
,
r3
,
r8
,
lr
}
stm
geia
ip
!,
{
r1
,
r3
,
r8
,
lr
}
stm
iage
ip
!,
{
r1
,
r3
,
r8
,
lr
}
@
64
bytes
at
a
time
.
stm
iage
ip
!,
{
r1
,
r3
,
r8
,
lr
}
stm
iage
ip
!,
{
r1
,
r3
,
r8
,
lr
}
stm
iage
ip
!,
{
r1
,
r3
,
r8
,
lr
}
bgt
2
b
ldm
eqfd
sp
!,
{
r8
,
pc
}
@
Now
<
64
bytes
to
go
.
ldm
fdeq
sp
!,
{
r8
,
pc
}
@
Now
<
64
bytes
to
go
.
/*
*
No
need
to
correct
the
count
; we're only testing bits from now on
*/
tst
r2
,
#
32
stm
neia
ip
!,
{
r1
,
r3
,
r8
,
lr
}
stm
neia
ip
!,
{
r1
,
r3
,
r8
,
lr
}
stm
iane
ip
!,
{
r1
,
r3
,
r8
,
lr
}
stm
iane
ip
!,
{
r1
,
r3
,
r8
,
lr
}
tst
r2
,
#
16
stm
neia
ip
!,
{
r1
,
r3
,
r8
,
lr
}
stm
iane
ip
!,
{
r1
,
r3
,
r8
,
lr
}
ldmfd
sp
!,
{
r8
,
lr
}
UNWIND
(
.
fnend
)
...
...
@@ -87,22 +87,22 @@ UNWIND( .save {r4-r8, lr} )
rsb
r8
,
r8
,
#
32
sub
r2
,
r2
,
r8
movs
r8
,
r8
,
lsl
#(
32
-
4
)
stm
csia
ip
!,
{
r4
,
r5
,
r6
,
r7
}
stm
miia
ip
!,
{
r4
,
r5
}
stm
iacs
ip
!,
{
r4
,
r5
,
r6
,
r7
}
stm
iami
ip
!,
{
r4
,
r5
}
tst
r8
,
#(
1
<<
30
)
mov
r8
,
r1
strne
r1
,
[
ip
],
#
4
3
:
subs
r2
,
r2
,
#
64
stm
geia
ip
!,
{
r1
,
r3
-
r8
,
lr
}
stm
geia
ip
!,
{
r1
,
r3
-
r8
,
lr
}
stm
iage
ip
!,
{
r1
,
r3
-
r8
,
lr
}
stm
iage
ip
!,
{
r1
,
r3
-
r8
,
lr
}
bgt
3
b
ldm
eqfd
sp
!,
{
r4
-
r8
,
pc
}
ldm
fdeq
sp
!,
{
r4
-
r8
,
pc
}
tst
r2
,
#
32
stm
neia
ip
!,
{
r1
,
r3
-
r8
,
lr
}
stm
iane
ip
!,
{
r1
,
r3
-
r8
,
lr
}
tst
r2
,
#
16
stm
neia
ip
!,
{
r4
-
r7
}
stm
iane
ip
!,
{
r4
-
r7
}
ldmfd
sp
!,
{
r4
-
r8
,
lr
}
UNWIND
(
.
fnend
)
...
...
@@ -110,7 +110,7 @@ UNWIND( .fnend )
UNWIND
(
.
fnstart
)
4
:
tst
r2
,
#
8
stm
neia
ip
!,
{
r1
,
r3
}
stm
iane
ip
!,
{
r1
,
r3
}
tst
r2
,
#
4
strne
r1
,
[
ip
],
#
4
/*
...
...
@@ -118,17 +118,17 @@ UNWIND( .fnstart )
*
may
have
an
unaligned
pointer
as
well
.
*/
5
:
tst
r2
,
#
2
str
neb
r1
,
[
ip
],
#
1
str
neb
r1
,
[
ip
],
#
1
str
bne
r1
,
[
ip
],
#
1
str
bne
r1
,
[
ip
],
#
1
tst
r2
,
#
1
str
neb
r1
,
[
ip
],
#
1
str
bne
r1
,
[
ip
],
#
1
ret
lr
6
:
subs
r2
,
r2
,
#
4
@
1
do
we
have
enough
blt
5
b
@
1
bytes
to
align
with
?
cmp
r3
,
#
2
@
1
str
ltb
r1
,
[
ip
],
#
1
@
1
str
leb
r1
,
[
ip
],
#
1
@
1
str
blt
r1
,
[
ip
],
#
1
@
1
str
ble
r1
,
[
ip
],
#
1
@
1
strb
r1
,
[
ip
],
#
1
@
1
add
r2
,
r2
,
r3
@
1
(
r2
=
r2
-
(
4
-
r3
))
b
1
b
...
...
arch/arm/lib/xor-neon.c
浏览文件 @
4c2741ac
...
...
@@ -14,7 +14,7 @@
MODULE_LICENSE
(
"GPL"
);
#ifndef __ARM_NEON__
#error You should compile this file with '-mfloat-abi=softfp -mfpu=neon'
#error You should compile this file with '-m
arch=armv7-a -m
float-abi=softfp -mfpu=neon'
#endif
/*
...
...
arch/arm/mach-actions/platsmp.c
浏览文件 @
4c2741ac
...
...
@@ -39,10 +39,6 @@ static void __iomem *sps_base_addr;
static
void
__iomem
*
timer_base_addr
;
static
int
ncores
;
static
DEFINE_SPINLOCK
(
boot_lock
);
void
owl_secondary_startup
(
void
);
static
int
s500_wakeup_secondary
(
unsigned
int
cpu
)
{
int
ret
;
...
...
@@ -84,7 +80,6 @@ static int s500_wakeup_secondary(unsigned int cpu)
static
int
s500_smp_boot_secondary
(
unsigned
int
cpu
,
struct
task_struct
*
idle
)
{
unsigned
long
timeout
;
int
ret
;
ret
=
s500_wakeup_secondary
(
cpu
);
...
...
@@ -93,21 +88,11 @@ static int s500_smp_boot_secondary(unsigned int cpu, struct task_struct *idle)
udelay
(
10
);
spin_lock
(
&
boot_lock
);
smp_send_reschedule
(
cpu
);
timeout
=
jiffies
+
(
1
*
HZ
);
while
(
time_before
(
jiffies
,
timeout
))
{
if
(
pen_release
==
-
1
)
break
;
}
writel
(
0
,
timer_base_addr
+
OWL_CPU1_ADDR
+
(
cpu
-
1
)
*
4
);
writel
(
0
,
timer_base_addr
+
OWL_CPU1_FLAG
+
(
cpu
-
1
)
*
4
);
spin_unlock
(
&
boot_lock
);
return
0
;
}
...
...
arch/arm/mach-exynos/headsmp.S
浏览文件 @
4c2741ac
...
...
@@ -36,4 +36,4 @@ ENDPROC(exynos4_secondary_startup)
.
align
2
1
:
.
long
.
.
long
pen_release
.
long
exynos_
pen_release
arch/arm/mach-exynos/platsmp.c
浏览文件 @
4c2741ac
...
...
@@ -28,6 +28,9 @@
extern
void
exynos4_secondary_startup
(
void
);
/* XXX exynos_pen_release is cargo culted code - DO NOT COPY XXX */
volatile
int
exynos_pen_release
=
-
1
;
#ifdef CONFIG_HOTPLUG_CPU
static
inline
void
cpu_leave_lowpower
(
u32
core_id
)
{
...
...
@@ -57,7 +60,7 @@ static inline void platform_do_lowpower(unsigned int cpu, int *spurious)
wfi
();
if
(
pen_release
==
core_id
)
{
if
(
exynos_
pen_release
==
core_id
)
{
/*
* OK, proper wakeup, we're done
*/
...
...
@@ -228,15 +231,17 @@ void exynos_core_restart(u32 core_id)
}
/*
* Write pen_release in a way that is guaranteed to be visible to all
* observers, irrespective of whether they're taking part in coherency
* XXX CARGO CULTED CODE - DO NOT COPY XXX
*
* Write exynos_pen_release in a way that is guaranteed to be visible to
* all observers, irrespective of whether they're taking part in coherency
* or not. This is necessary for the hotplug code to work reliably.
*/
static
void
write_pen_release
(
int
val
)
static
void
exynos_
write_pen_release
(
int
val
)
{
pen_release
=
val
;
exynos_
pen_release
=
val
;
smp_wmb
();
sync_cache_w
(
&
pen_release
);
sync_cache_w
(
&
exynos_
pen_release
);
}
static
DEFINE_SPINLOCK
(
boot_lock
);
...
...
@@ -247,7 +252,7 @@ static void exynos_secondary_init(unsigned int cpu)
* let the primary processor know we're out of the
* pen, then head off into the C entry point
*/
write_pen_release
(
-
1
);
exynos_
write_pen_release
(
-
1
);
/*
* Synchronise with the boot thread.
...
...
@@ -322,12 +327,12 @@ static int exynos_boot_secondary(unsigned int cpu, struct task_struct *idle)
/*
* The secondary processor is waiting to be released from
* the holding pen - release it, then wait for it to flag
* that it has been released by resetting pen_release.
* that it has been released by resetting
exynos_
pen_release.
*
* Note that "pen_release" is the hardware CPU core ID, whereas
* Note that "
exynos_
pen_release" is the hardware CPU core ID, whereas
* "cpu" is Linux's internal ID.
*/
write_pen_release
(
core_id
);
exynos_
write_pen_release
(
core_id
);
if
(
!
exynos_cpu_power_state
(
core_id
))
{
exynos_cpu_power_up
(
core_id
);
...
...
@@ -376,13 +381,13 @@ static int exynos_boot_secondary(unsigned int cpu, struct task_struct *idle)
else
arch_send_wakeup_ipi_mask
(
cpumask_of
(
cpu
));
if
(
pen_release
==
-
1
)
if
(
exynos_
pen_release
==
-
1
)
break
;
udelay
(
10
);
}
if
(
pen_release
!=
-
1
)
if
(
exynos_
pen_release
!=
-
1
)
ret
=
-
ETIMEDOUT
;
/*
...
...
@@ -392,7 +397,7 @@ static int exynos_boot_secondary(unsigned int cpu, struct task_struct *idle)
fail:
spin_unlock
(
&
boot_lock
);
return
pen_release
!=
-
1
?
ret
:
0
;
return
exynos_
pen_release
!=
-
1
?
ret
:
0
;
}
static
void
__init
exynos_smp_prepare_cpus
(
unsigned
int
max_cpus
)
...
...
arch/arm/mach-ks8695/include/mach/entry-macro.S
浏览文件 @
4c2741ac
...
...
@@ -42,6 +42,6 @@
moveq
\
irqstat
,
\
irqstat
,
lsr
#
2
addeq
\
irqnr
,
\
irqnr
,
#
2
tst
\
irqstat
,
#
0x01
add
eqs
\
irqnr
,
\
irqnr
,
#
1
add
seq
\
irqnr
,
\
irqnr
,
#
1
1001
:
.
endm
arch/arm/mach-omap2/prm_common.c
浏览文件 @
4c2741ac
...
...
@@ -523,8 +523,10 @@ void omap_prm_reset_system(void)
prm_ll_data
->
reset_system
();
while
(
1
)
while
(
1
)
{
cpu_relax
();
wfe
();
}
}
/**
...
...
arch/arm/mach-oxnas/Makefile
浏览文件 @
4c2741ac
obj-$(CONFIG_SMP)
+=
platsmp.o headsmp.o
obj-$(CONFIG_HOTPLUG_CPU)
+=
hotplug.o
arch/arm/mach-oxnas/hotplug.c
已删除
100644 → 0
浏览文件 @
d410a8a4
/*
* Copyright (C) 2002 ARM Ltd.
* All Rights Reserved
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation.
*/
#include <linux/kernel.h>
#include <linux/errno.h>
#include <linux/smp.h>
#include <asm/cp15.h>
#include <asm/smp_plat.h>
static
inline
void
cpu_enter_lowpower
(
void
)
{
unsigned
int
v
;
asm
volatile
(
" mcr p15, 0, %1, c7, c5, 0
\n
"
" mcr p15, 0, %1, c7, c10, 4
\n
"
/*
* Turn off coherency
*/
" mrc p15, 0, %0, c1, c0, 1
\n
"
" bic %0, %0, #0x20
\n
"
" mcr p15, 0, %0, c1, c0, 1
\n
"
" mrc p15, 0, %0, c1, c0, 0
\n
"
" bic %0, %0, %2
\n
"
" mcr p15, 0, %0, c1, c0, 0
\n
"
:
"=&r"
(
v
)
:
"r"
(
0
),
"Ir"
(
CR_C
)
:
"cc"
);
}
static
inline
void
cpu_leave_lowpower
(
void
)
{
unsigned
int
v
;
asm
volatile
(
"mrc p15, 0, %0, c1, c0, 0
\n
"
" orr %0, %0, %1
\n
"
" mcr p15, 0, %0, c1, c0, 0
\n
"
" mrc p15, 0, %0, c1, c0, 1
\n
"
" orr %0, %0, #0x20
\n
"
" mcr p15, 0, %0, c1, c0, 1
\n
"
:
"=&r"
(
v
)
:
"Ir"
(
CR_C
)
:
"cc"
);
}
static
inline
void
platform_do_lowpower
(
unsigned
int
cpu
,
int
*
spurious
)
{
/*
* there is no power-control hardware on this platform, so all
* we can do is put the core into WFI; this is safe as the calling
* code will have already disabled interrupts
*/
for
(;;)
{
/*
* here's the WFI
*/
asm
(
".word 0xe320f003
\n
"
:
:
:
"memory"
,
"cc"
);
if
(
pen_release
==
cpu_logical_map
(
cpu
))
{
/*
* OK, proper wakeup, we're done
*/
break
;
}
/*
* Getting here, means that we have come out of WFI without
* having been woken up - this shouldn't happen
*
* Just note it happening - when we're woken, we can report
* its occurrence.
*/
(
*
spurious
)
++
;
}
}
/*
* platform-specific code to shutdown a CPU
*
* Called with IRQs disabled
*/
void
ox820_cpu_die
(
unsigned
int
cpu
)
{
int
spurious
=
0
;
/*
* we're ready for shutdown now, so do it
*/
cpu_enter_lowpower
();
platform_do_lowpower
(
cpu
,
&
spurious
);
/*
* bring this CPU back into the world of cache
* coherency, and then restore interrupts
*/
cpu_leave_lowpower
();
if
(
spurious
)
pr_warn
(
"CPU%u: %u spurious wakeup calls
\n
"
,
cpu
,
spurious
);
}
arch/arm/mach-oxnas/platsmp.c
浏览文件 @
4c2741ac
...
...
@@ -19,7 +19,6 @@
#include <asm/smp_scu.h>
extern
void
ox820_secondary_startup
(
void
);
extern
void
ox820_cpu_die
(
unsigned
int
cpu
);
static
void
__iomem
*
cpu_ctrl
;
static
void
__iomem
*
gic_cpu_ctrl
;
...
...
@@ -94,9 +93,6 @@ static void __init ox820_smp_prepare_cpus(unsigned int max_cpus)
static
const
struct
smp_operations
ox820_smp_ops
__initconst
=
{
.
smp_prepare_cpus
=
ox820_smp_prepare_cpus
,
.
smp_boot_secondary
=
ox820_boot_secondary
,
#ifdef CONFIG_HOTPLUG_CPU
.
cpu_die
=
ox820_cpu_die
,
#endif
};
CPU_METHOD_OF_DECLARE
(
ox820_smp
,
"oxsemi,ox820-smp"
,
&
ox820_smp_ops
);
arch/arm/mach-prima2/common.h
浏览文件 @
4c2741ac
...
...
@@ -15,6 +15,8 @@
#include <asm/mach/time.h>
#include <asm/exception.h>
extern
volatile
int
prima2_pen_release
;
extern
const
struct
smp_operations
sirfsoc_smp_ops
;
extern
void
sirfsoc_secondary_startup
(
void
);
extern
void
sirfsoc_cpu_die
(
unsigned
int
cpu
);
...
...
arch/arm/mach-prima2/headsmp.S
浏览文件 @
4c2741ac
...
...
@@ -34,4 +34,4 @@ ENDPROC(sirfsoc_secondary_startup)
.
align
1
:
.
long
.
.
long
pen_release
.
long
p
rima2_p
en_release
arch/arm/mach-prima2/hotplug.c
浏览文件 @
4c2741ac
...
...
@@ -11,6 +11,7 @@
#include <linux/smp.h>
#include <asm/smp_plat.h>
#include "common.h"
static
inline
void
platform_do_lowpower
(
unsigned
int
cpu
)
{
...
...
@@ -18,7 +19,7 @@ static inline void platform_do_lowpower(unsigned int cpu)
for
(;;)
{
__asm__
__volatile__
(
"dsb
\n\t
"
"wfi
\n\t
"
:
:
:
"memory"
);
if
(
pen_release
==
cpu_logical_map
(
cpu
))
{
if
(
p
rima2_p
en_release
==
cpu_logical_map
(
cpu
))
{
/*
* OK, proper wakeup, we're done
*/
...
...
arch/arm/mach-prima2/platsmp.c
浏览文件 @
4c2741ac
...
...
@@ -24,13 +24,16 @@ static void __iomem *clk_base;
static
DEFINE_SPINLOCK
(
boot_lock
);
/* XXX prima2_pen_release is cargo culted code - DO NOT COPY XXX */
volatile
int
prima2_pen_release
=
-
1
;
static
void
sirfsoc_secondary_init
(
unsigned
int
cpu
)
{
/*
* let the primary processor know we're out of the
* pen, then head off into the C entry point
*/
pen_release
=
-
1
;
p
rima2_p
en_release
=
-
1
;
smp_wmb
();
/*
...
...
@@ -80,13 +83,13 @@ static int sirfsoc_boot_secondary(unsigned int cpu, struct task_struct *idle)
/*
* The secondary processor is waiting to be released from
* the holding pen - release it, then wait for it to flag
* that it has been released by resetting pen_release.
* that it has been released by resetting p
rima2_p
en_release.
*
* Note that "pen_release" is the hardware CPU ID, whereas
* Note that "p
rima2_p
en_release" is the hardware CPU ID, whereas
* "cpu" is Linux's internal ID.
*/
pen_release
=
cpu_logical_map
(
cpu
);
sync_cache_w
(
&
pen_release
);
p
rima2_p
en_release
=
cpu_logical_map
(
cpu
);
sync_cache_w
(
&
p
rima2_p
en_release
);
/*
* Send the secondary CPU SEV, thereby causing the boot monitor to read
...
...
@@ -97,7 +100,7 @@ static int sirfsoc_boot_secondary(unsigned int cpu, struct task_struct *idle)
timeout
=
jiffies
+
(
1
*
HZ
);
while
(
time_before
(
jiffies
,
timeout
))
{
smp_rmb
();
if
(
pen_release
==
-
1
)
if
(
p
rima2_p
en_release
==
-
1
)
break
;
udelay
(
10
);
...
...
@@ -109,7 +112,7 @@ static int sirfsoc_boot_secondary(unsigned int cpu, struct task_struct *idle)
*/
spin_unlock
(
&
boot_lock
);
return
pen_release
!=
-
1
?
-
ENOSYS
:
0
;
return
p
rima2_p
en_release
!=
-
1
?
-
ENOSYS
:
0
;
}
const
struct
smp_operations
sirfsoc_smp_ops
__initconst
=
{
...
...
arch/arm/mach-qcom/platsmp.c
浏览文件 @
4c2741ac
...
...
@@ -46,8 +46,6 @@
extern
void
secondary_startup_arm
(
void
);
static
DEFINE_SPINLOCK
(
boot_lock
);
#ifdef CONFIG_HOTPLUG_CPU
static
void
qcom_cpu_die
(
unsigned
int
cpu
)
{
...
...
@@ -55,15 +53,6 @@ static void qcom_cpu_die(unsigned int cpu)
}
#endif
static
void
qcom_secondary_init
(
unsigned
int
cpu
)
{
/*
* Synchronise with the boot thread.
*/
spin_lock
(
&
boot_lock
);
spin_unlock
(
&
boot_lock
);
}
static
int
scss_release_secondary
(
unsigned
int
cpu
)
{
struct
device_node
*
node
;
...
...
@@ -280,12 +269,6 @@ static int qcom_boot_secondary(unsigned int cpu, int (*func)(unsigned int))
per_cpu
(
cold_boot_done
,
cpu
)
=
true
;
}
/*
* set synchronisation state between this boot processor
* and the secondary one
*/
spin_lock
(
&
boot_lock
);
/*
* Send the secondary CPU a soft interrupt, thereby causing
* the boot monitor to read the system wide flags register,
...
...
@@ -293,12 +276,6 @@ static int qcom_boot_secondary(unsigned int cpu, int (*func)(unsigned int))
*/
arch_send_wakeup_ipi_mask
(
cpumask_of
(
cpu
));
/*
* now the secondary core is starting up let it run its
* calibrations, then wait for it to finish
*/
spin_unlock
(
&
boot_lock
);
return
ret
;
}
...
...
@@ -334,7 +311,6 @@ static void __init qcom_smp_prepare_cpus(unsigned int max_cpus)
static
const
struct
smp_operations
smp_msm8660_ops
__initconst
=
{
.
smp_prepare_cpus
=
qcom_smp_prepare_cpus
,
.
smp_secondary_init
=
qcom_secondary_init
,
.
smp_boot_secondary
=
msm8660_boot_secondary
,
#ifdef CONFIG_HOTPLUG_CPU
.
cpu_die
=
qcom_cpu_die
,
...
...
@@ -344,7 +320,6 @@ CPU_METHOD_OF_DECLARE(qcom_smp, "qcom,gcc-msm8660", &smp_msm8660_ops);
static
const
struct
smp_operations
qcom_smp_kpssv1_ops
__initconst
=
{
.
smp_prepare_cpus
=
qcom_smp_prepare_cpus
,
.
smp_secondary_init
=
qcom_secondary_init
,
.
smp_boot_secondary
=
kpssv1_boot_secondary
,
#ifdef CONFIG_HOTPLUG_CPU
.
cpu_die
=
qcom_cpu_die
,
...
...
@@ -354,7 +329,6 @@ CPU_METHOD_OF_DECLARE(qcom_smp_kpssv1, "qcom,kpss-acc-v1", &qcom_smp_kpssv1_ops)
static
const
struct
smp_operations
qcom_smp_kpssv2_ops
__initconst
=
{
.
smp_prepare_cpus
=
qcom_smp_prepare_cpus
,
.
smp_secondary_init
=
qcom_secondary_init
,
.
smp_boot_secondary
=
kpssv2_boot_secondary
,
#ifdef CONFIG_HOTPLUG_CPU
.
cpu_die
=
qcom_cpu_die
,
...
...
arch/arm/mach-spear/generic.h
浏览文件 @
4c2741ac
...
...
@@ -20,6 +20,8 @@
#include <asm/mach/time.h>
extern
volatile
int
spear_pen_release
;
extern
void
spear13xx_timer_init
(
void
);
extern
void
spear3xx_timer_init
(
void
);
extern
struct
pl022_ssp_controller
pl022_plat_data
;
...
...
arch/arm/mach-spear/headsmp.S
浏览文件 @
4c2741ac
...
...
@@ -43,5 +43,5 @@ pen: ldr r7, [r6]
.
align
1
:
.
long
.
.
long
pen_release
.
long
spear_
pen_release
ENDPROC
(
spear13xx_secondary_startup
)
arch/arm/mach-spear/hotplug.c
浏览文件 @
4c2741ac
...
...
@@ -16,6 +16,8 @@
#include <asm/cp15.h>
#include <asm/smp_plat.h>
#include "generic.h"
static
inline
void
cpu_enter_lowpower
(
void
)
{
unsigned
int
v
;
...
...
@@ -57,7 +59,7 @@ static inline void spear13xx_do_lowpower(unsigned int cpu, int *spurious)
for
(;;)
{
wfi
();
if
(
pen_release
==
cpu
)
{
if
(
spear_
pen_release
==
cpu
)
{
/*
* OK, proper wakeup, we're done
*/
...
...
arch/arm/mach-spear/platsmp.c
浏览文件 @
4c2741ac
...
...
@@ -20,16 +20,21 @@
#include <mach/spear.h>
#include "generic.h"
/* XXX spear_pen_release is cargo culted code - DO NOT COPY XXX */
volatile
int
spear_pen_release
=
-
1
;
/*
* Write pen_release in a way that is guaranteed to be visible to all
* observers, irrespective of whether they're taking part in coherency
* XXX CARGO CULTED CODE - DO NOT COPY XXX
*
* Write spear_pen_release in a way that is guaranteed to be visible to
* all observers, irrespective of whether they're taking part in coherency
* or not. This is necessary for the hotplug code to work reliably.
*/
static
void
write_pen_release
(
int
val
)
static
void
spear_
write_pen_release
(
int
val
)
{
pen_release
=
val
;
spear_
pen_release
=
val
;
smp_wmb
();
sync_cache_w
(
&
pen_release
);
sync_cache_w
(
&
spear_
pen_release
);
}
static
DEFINE_SPINLOCK
(
boot_lock
);
...
...
@@ -42,7 +47,7 @@ static void spear13xx_secondary_init(unsigned int cpu)
* let the primary processor know we're out of the
* pen, then head off into the C entry point
*/
write_pen_release
(
-
1
);
spear_
write_pen_release
(
-
1
);
/*
* Synchronise with the boot thread.
...
...
@@ -64,17 +69,17 @@ static int spear13xx_boot_secondary(unsigned int cpu, struct task_struct *idle)
/*
* The secondary processor is waiting to be released from
* the holding pen - release it, then wait for it to flag
* that it has been released by resetting pen_release.
* that it has been released by resetting
spear_
pen_release.
*
* Note that "pen_release" is the hardware CPU ID, whereas
* Note that "
spear_
pen_release" is the hardware CPU ID, whereas
* "cpu" is Linux's internal ID.
*/
write_pen_release
(
cpu
);
spear_
write_pen_release
(
cpu
);
timeout
=
jiffies
+
(
1
*
HZ
);
while
(
time_before
(
jiffies
,
timeout
))
{
smp_rmb
();
if
(
pen_release
==
-
1
)
if
(
spear_
pen_release
==
-
1
)
break
;
udelay
(
10
);
...
...
@@ -86,7 +91,7 @@ static int spear13xx_boot_secondary(unsigned int cpu, struct task_struct *idle)
*/
spin_unlock
(
&
boot_lock
);
return
pen_release
!=
-
1
?
-
ENOSYS
:
0
;
return
spear_
pen_release
!=
-
1
?
-
ENOSYS
:
0
;
}
/*
...
...
arch/arm/mach-tegra/reset-handler.S
浏览文件 @
4c2741ac
...
...
@@ -172,7 +172,7 @@ after_errata:
mov32
r5
,
TEGRA_IRAM_BASE
+
TEGRA_IRAM_RESET_HANDLER_OFFSET
mov
r0
,
#
CPU_NOT_RESETTABLE
cmp
r10
,
#
0
str
neb
r0
,
[
r5
,
#
__tegra20_cpu1_resettable_status_offset
]
str
bne
r0
,
[
r5
,
#
__tegra20_cpu1_resettable_status_offset
]
1
:
#endif
...
...
arch/arm/mm/cache-v6.S
浏览文件 @
4c2741ac
...
...
@@ -215,8 +215,8 @@ v6_dma_inv_range:
#endif
tst
r1
,
#
D_CACHE_LINE_SIZE
-
1
#ifdef CONFIG_DMA_CACHE_RWFO
ldr
neb
r2
,
[
r1
,
#-
1
]
@
read
for
ownership
str
neb
r2
,
[
r1
,
#-
1
]
@
write
for
ownership
ldr
bne
r2
,
[
r1
,
#-
1
]
@
read
for
ownership
str
bne
r2
,
[
r1
,
#-
1
]
@
write
for
ownership
#endif
bic
r1
,
r1
,
#
D_CACHE_LINE_SIZE
-
1
#ifdef HARVARD_CACHE
...
...
@@ -284,8 +284,8 @@ ENTRY(v6_dma_flush_range)
add
r0
,
r0
,
#
D_CACHE_LINE_SIZE
cmp
r0
,
r1
#ifdef CONFIG_DMA_CACHE_RWFO
ldr
lob
r2
,
[
r0
]
@
read
for
ownership
str
lob
r2
,
[
r0
]
@
write
for
ownership
ldr
blo
r2
,
[
r0
]
@
read
for
ownership
str
blo
r2
,
[
r0
]
@
write
for
ownership
#endif
blo
1
b
mov
r0
,
#
0
...
...
arch/arm/mm/copypage-v4mc.c
浏览文件 @
4c2741ac
...
...
@@ -45,6 +45,7 @@ static void mc_copy_user_page(void *from, void *to)
int
tmp
;
asm
volatile
(
"\
.syntax unified
\n
\
ldmia %0!, {r2, r3, ip, lr} @ 4
\n
\
1: mcr p15, 0, %1, c7, c6, 1 @ 1 invalidate D line
\n
\
stmia %1!, {r2, r3, ip, lr} @ 4
\n
\
...
...
@@ -56,7 +57,7 @@ static void mc_copy_user_page(void *from, void *to)
ldmia %0!, {r2, r3, ip, lr} @ 4
\n
\
subs %2, %2, #1 @ 1
\n
\
stmia %1!, {r2, r3, ip, lr} @ 4
\n
\
ldm
neia
%0!, {r2, r3, ip, lr} @ 4
\n
\
ldm
iane
%0!, {r2, r3, ip, lr} @ 4
\n
\
bne 1b @ "
:
"+&r"
(
from
),
"+&r"
(
to
),
"=&r"
(
tmp
)
:
"2"
(
PAGE_SIZE
/
64
)
...
...
arch/arm/mm/copypage-v4wb.c
浏览文件 @
4c2741ac
...
...
@@ -27,6 +27,7 @@ static void v4wb_copy_user_page(void *kto, const void *kfrom)
int
tmp
;
asm
volatile
(
"\
.syntax unified
\n
\
ldmia %1!, {r3, r4, ip, lr} @ 4
\n
\
1: mcr p15, 0, %0, c7, c6, 1 @ 1 invalidate D line
\n
\
stmia %0!, {r3, r4, ip, lr} @ 4
\n
\
...
...
@@ -38,7 +39,7 @@ static void v4wb_copy_user_page(void *kto, const void *kfrom)
ldmia %1!, {r3, r4, ip, lr} @ 4
\n
\
subs %2, %2, #1 @ 1
\n
\
stmia %0!, {r3, r4, ip, lr} @ 4
\n
\
ldm
neia
%1!, {r3, r4, ip, lr} @ 4
\n
\
ldm
iane
%1!, {r3, r4, ip, lr} @ 4
\n
\
bne 1b @ 1
\n
\
mcr p15, 0, %1, c7, c10, 4 @ 1 drain WB"
:
"+&r"
(
kto
),
"+&r"
(
kfrom
),
"=&r"
(
tmp
)
...
...
arch/arm/mm/copypage-v4wt.c
浏览文件 @
4c2741ac
...
...
@@ -25,6 +25,7 @@ static void v4wt_copy_user_page(void *kto, const void *kfrom)
int
tmp
;
asm
volatile
(
"\
.syntax unified
\n
\
ldmia %1!, {r3, r4, ip, lr} @ 4
\n
\
1: stmia %0!, {r3, r4, ip, lr} @ 4
\n
\
ldmia %1!, {r3, r4, ip, lr} @ 4+1
\n
\
...
...
@@ -34,7 +35,7 @@ static void v4wt_copy_user_page(void *kto, const void *kfrom)
ldmia %1!, {r3, r4, ip, lr} @ 4
\n
\
subs %2, %2, #1 @ 1
\n
\
stmia %0!, {r3, r4, ip, lr} @ 4
\n
\
ldm
neia
%1!, {r3, r4, ip, lr} @ 4
\n
\
ldm
iane
%1!, {r3, r4, ip, lr} @ 4
\n
\
bne 1b @ 1
\n
\
mcr p15, 0, %2, c7, c7, 0 @ flush ID cache"
:
"+&r"
(
kto
),
"+&r"
(
kfrom
),
"=&r"
(
tmp
)
...
...
arch/arm/mm/dma-mapping.c
浏览文件 @
4c2741ac
...
...
@@ -2277,7 +2277,7 @@ EXPORT_SYMBOL_GPL(arm_iommu_attach_device);
* @dev: valid struct device pointer
*
* Detaches the provided device from a previously attached map.
* This
voids the dma operations (dma_map_ops pointer)
* This
overwrites the dma_ops pointer with appropriate non-IOMMU ops.
*/
void
arm_iommu_detach_device
(
struct
device
*
dev
)
{
...
...
arch/arm/mm/idmap.c
浏览文件 @
4c2741ac
...
...
@@ -6,6 +6,7 @@
#include <asm/cputype.h>
#include <asm/idmap.h>
#include <asm/hwcap.h>
#include <asm/pgalloc.h>
#include <asm/pgtable.h>
#include <asm/sections.h>
...
...
@@ -110,7 +111,8 @@ static int __init init_static_idmap(void)
__idmap_text_end
,
0
);
/* Flush L1 for the hardware to see this page table content */
flush_cache_louis
();
if
(
!
(
elf_hwcap
&
HWCAP_LPAE
))
flush_cache_louis
();
return
0
;
}
...
...
arch/arm/mm/init.c
浏览文件 @
4c2741ac
...
...
@@ -278,15 +278,12 @@ void __init arm_memblock_init(const struct machine_desc *mdesc)
void
__init
bootmem_init
(
void
)
{
unsigned
long
min
,
max_low
,
max_high
;
memblock_allow_resize
();
max_low
=
max_high
=
0
;
find_limits
(
&
min
,
&
max_low
,
&
max_high
);
find_limits
(
&
min
_low_pfn
,
&
max_low_pfn
,
&
max_pfn
);
early_memtest
((
phys_addr_t
)
min
<<
PAGE_SHIFT
,
(
phys_addr_t
)
max_low
<<
PAGE_SHIFT
);
early_memtest
((
phys_addr_t
)
min
_low_pfn
<<
PAGE_SHIFT
,
(
phys_addr_t
)
max_low
_pfn
<<
PAGE_SHIFT
);
/*
* Sparsemem tries to allocate bootmem in memory_present(),
...
...
@@ -304,16 +301,7 @@ void __init bootmem_init(void)
* the sparse mem_map arrays initialized by sparse_init()
* for memmap_init_zone(), otherwise all PFNs are invalid.
*/
zone_sizes_init
(
min
,
max_low
,
max_high
);
/*
* This doesn't seem to be used by the Linux memory manager any
* more, but is used by ll_rw_block. If we can get rid of it, we
* also get rid of some of the stuff above as well.
*/
min_low_pfn
=
min
;
max_low_pfn
=
max_low
;
max_pfn
=
max_high
;
zone_sizes_init
(
min_low_pfn
,
max_low_pfn
,
max_pfn
);
}
/*
...
...
@@ -494,55 +482,6 @@ void __init mem_init(void)
mem_init_print_info
(
NULL
);
#define MLK(b, t) b, t, ((t) - (b)) >> 10
#define MLM(b, t) b, t, ((t) - (b)) >> 20
#define MLK_ROUNDUP(b, t) b, t, DIV_ROUND_UP(((t) - (b)), SZ_1K)
pr_notice
(
"Virtual kernel memory layout:
\n
"
" vector : 0x%08lx - 0x%08lx (%4ld kB)
\n
"
#ifdef CONFIG_HAVE_TCM
" DTCM : 0x%08lx - 0x%08lx (%4ld kB)
\n
"
" ITCM : 0x%08lx - 0x%08lx (%4ld kB)
\n
"
#endif
" fixmap : 0x%08lx - 0x%08lx (%4ld kB)
\n
"
" vmalloc : 0x%08lx - 0x%08lx (%4ld MB)
\n
"
" lowmem : 0x%08lx - 0x%08lx (%4ld MB)
\n
"
#ifdef CONFIG_HIGHMEM
" pkmap : 0x%08lx - 0x%08lx (%4ld MB)
\n
"
#endif
#ifdef CONFIG_MODULES
" modules : 0x%08lx - 0x%08lx (%4ld MB)
\n
"
#endif
" .text : 0x%p"
" - 0x%p"
" (%4td kB)
\n
"
" .init : 0x%p"
" - 0x%p"
" (%4td kB)
\n
"
" .data : 0x%p"
" - 0x%p"
" (%4td kB)
\n
"
" .bss : 0x%p"
" - 0x%p"
" (%4td kB)
\n
"
,
MLK
(
VECTORS_BASE
,
VECTORS_BASE
+
PAGE_SIZE
),
#ifdef CONFIG_HAVE_TCM
MLK
(
DTCM_OFFSET
,
(
unsigned
long
)
dtcm_end
),
MLK
(
ITCM_OFFSET
,
(
unsigned
long
)
itcm_end
),
#endif
MLK
(
FIXADDR_START
,
FIXADDR_END
),
MLM
(
VMALLOC_START
,
VMALLOC_END
),
MLM
(
PAGE_OFFSET
,
(
unsigned
long
)
high_memory
),
#ifdef CONFIG_HIGHMEM
MLM
(
PKMAP_BASE
,
(
PKMAP_BASE
)
+
(
LAST_PKMAP
)
*
(
PAGE_SIZE
)),
#endif
#ifdef CONFIG_MODULES
MLM
(
MODULES_VADDR
,
MODULES_END
),
#endif
MLK_ROUNDUP
(
_text
,
_etext
),
MLK_ROUNDUP
(
__init_begin
,
__init_end
),
MLK_ROUNDUP
(
_sdata
,
_edata
),
MLK_ROUNDUP
(
__bss_start
,
__bss_stop
));
#undef MLK
#undef MLM
#undef MLK_ROUNDUP
/*
* Check boundaries twice: Some fundamental inconsistencies can
* be detected at build time already.
...
...
arch/arm/mm/pmsa-v8.c
浏览文件 @
4c2741ac
...
...
@@ -165,7 +165,7 @@ static int __init pmsav8_setup_ram(unsigned int number, phys_addr_t start,phys_a
return
-
EINVAL
;
bar
=
start
;
lar
=
(
end
-
1
)
&
~
(
PMSAv8_MINALIGN
-
1
);
;
lar
=
(
end
-
1
)
&
~
(
PMSAv8_MINALIGN
-
1
);
bar
|=
PMSAv8_AP_PL1RW_PL0RW
|
PMSAv8_RGN_SHARED
;
lar
|=
PMSAv8_LAR_IDX
(
PMSAv8_RGN_NORMAL
)
|
PMSAv8_LAR_EN
;
...
...
@@ -181,7 +181,7 @@ static int __init pmsav8_setup_io(unsigned int number, phys_addr_t start,phys_ad
return
-
EINVAL
;
bar
=
start
;
lar
=
(
end
-
1
)
&
~
(
PMSAv8_MINALIGN
-
1
);
;
lar
=
(
end
-
1
)
&
~
(
PMSAv8_MINALIGN
-
1
);
bar
|=
PMSAv8_AP_PL1RW_PL0RW
|
PMSAv8_RGN_SHARED
|
PMSAv8_BAR_XN
;
lar
|=
PMSAv8_LAR_IDX
(
PMSAv8_RGN_DEVICE_nGnRnE
)
|
PMSAv8_LAR_EN
;
...
...
arch/arm/mm/proc-v7m.S
浏览文件 @
4c2741ac
...
...
@@ -139,6 +139,9 @@ __v7m_setup_cont:
cpsie
i
svc
#
0
1
:
cpsid
i
ldr
r0
,
=
exc_ret
orr
lr
,
lr
,
#
EXC_RET_THREADMODE_PROCESSSTACK
str
lr
,
[
r0
]
ldmia
sp
,
{
r0
-
r3
,
r12
}
str
r5
,
[
r12
,
#
11
*
4
]
@
restore
the
original
SVC
vector
entry
mov
lr
,
r6
@
restore
LR
...
...
@@ -149,10 +152,10 @@ __v7m_setup_cont:
@
Configure
caches
(
if
implemented
)
teq
r8
,
#
0
stm
neia
sp
,
{
r0
-
r6
,
lr
}
@
v7m_invalidate_l1
touches
r0
-
r6
stm
iane
sp
,
{
r0
-
r6
,
lr
}
@
v7m_invalidate_l1
touches
r0
-
r6
blne
v7m_invalidate_l1
teq
r8
,
#
0
@
re
-
evalutae
condition
ldm
neia
sp
,
{
r0
-
r6
,
lr
}
ldm
iane
sp
,
{
r0
-
r6
,
lr
}
@
Configure
the
System
Control
Register
to
ensure
8
-
byte
stack
alignment
@
Note
the
STKALIGN
bit
is
either
RW
or
RAO
.
...
...
drivers/amba/bus.c
浏览文件 @
4c2741ac
...
...
@@ -26,19 +26,36 @@
#define to_amba_driver(d) container_of(d, struct amba_driver, drv)
static
const
struct
amba_id
*
amba_lookup
(
const
struct
amba_id
*
table
,
struct
amba_device
*
dev
)
/* called on periphid match and class 0x9 coresight device. */
static
int
amba_cs_uci_id_match
(
const
struct
amba_id
*
table
,
struct
amba_device
*
dev
)
{
int
ret
=
0
;
struct
amba_cs_uci_id
*
uci
;
uci
=
table
->
data
;
/* no table data or zero mask - return match on periphid */
if
(
!
uci
||
(
uci
->
devarch_mask
==
0
))
return
1
;
/* test against read devtype and masked devarch value */
ret
=
(
dev
->
uci
.
devtype
==
uci
->
devtype
)
&&
((
dev
->
uci
.
devarch
&
uci
->
devarch_mask
)
==
uci
->
devarch
);
return
ret
;
}
static
const
struct
amba_id
*
amba_lookup
(
const
struct
amba_id
*
table
,
struct
amba_device
*
dev
)
{
while
(
table
->
mask
)
{
ret
=
(
dev
->
periphid
&
table
->
mask
)
==
table
->
id
;
if
(
ret
)
break
;
if
(((
dev
->
periphid
&
table
->
mask
)
==
table
->
id
)
&&
((
dev
->
cid
!=
CORESIGHT_CID
)
||
(
amba_cs_uci_id_match
(
table
,
dev
))))
return
table
;
table
++
;
}
return
ret
?
table
:
NULL
;
return
NULL
;
}
static
int
amba_match
(
struct
device
*
dev
,
struct
device_driver
*
drv
)
...
...
@@ -399,10 +416,22 @@ static int amba_device_try_add(struct amba_device *dev, struct resource *parent)
cid
|=
(
readl
(
tmp
+
size
-
0x10
+
4
*
i
)
&
255
)
<<
(
i
*
8
);
if
(
cid
==
CORESIGHT_CID
)
{
/* set the base to the start of the last 4k block */
void
__iomem
*
csbase
=
tmp
+
size
-
4096
;
dev
->
uci
.
devarch
=
readl
(
csbase
+
UCI_REG_DEVARCH_OFFSET
);
dev
->
uci
.
devtype
=
readl
(
csbase
+
UCI_REG_DEVTYPE_OFFSET
)
&
0xff
;
}
amba_put_disable_pclk
(
dev
);
if
(
cid
==
AMBA_CID
||
cid
==
CORESIGHT_CID
)
if
(
cid
==
AMBA_CID
||
cid
==
CORESIGHT_CID
)
{
dev
->
periphid
=
pid
;
dev
->
cid
=
cid
;
}
if
(
!
dev
->
periphid
)
ret
=
-
ENODEV
;
...
...
drivers/hwtracing/coresight/coresight-etm3x.c
浏览文件 @
4c2741ac
...
...
@@ -871,7 +871,7 @@ static int etm_probe(struct amba_device *adev, const struct amba_id *id)
}
pm_runtime_put
(
&
adev
->
dev
);
dev_info
(
dev
,
"%s initialized
\n
"
,
(
char
*
)
id
->
data
);
dev_info
(
dev
,
"%s initialized
\n
"
,
(
char
*
)
coresight_get_uci_data
(
id
)
);
if
(
boot_enable
)
{
coresight_enable
(
drvdata
->
csdev
);
drvdata
->
boot_enable
=
true
;
...
...
@@ -915,36 +915,18 @@ static const struct dev_pm_ops etm_dev_pm_ops = {
};
static
const
struct
amba_id
etm_ids
[]
=
{
{
/* ETM 3.3 */
.
id
=
0x000bb921
,
.
mask
=
0x000fffff
,
.
data
=
"ETM 3.3"
,
},
{
/* ETM 3.5 - Cortex-A5 */
.
id
=
0x000bb955
,
.
mask
=
0x000fffff
,
.
data
=
"ETM 3.5"
,
},
{
/* ETM 3.5 */
.
id
=
0x000bb956
,
.
mask
=
0x000fffff
,
.
data
=
"ETM 3.5"
,
},
{
/* PTM 1.0 */
.
id
=
0x000bb950
,
.
mask
=
0x000fffff
,
.
data
=
"PTM 1.0"
,
},
{
/* PTM 1.1 */
.
id
=
0x000bb95f
,
.
mask
=
0x000fffff
,
.
data
=
"PTM 1.1"
,
},
{
/* PTM 1.1 Qualcomm */
.
id
=
0x000b006f
,
.
mask
=
0x000fffff
,
.
data
=
"PTM 1.1"
,
},
/* ETM 3.3 */
CS_AMBA_ID_DATA
(
0x000bb921
,
"ETM 3.3"
),
/* ETM 3.5 - Cortex-A5 */
CS_AMBA_ID_DATA
(
0x000bb955
,
"ETM 3.5"
),
/* ETM 3.5 */
CS_AMBA_ID_DATA
(
0x000bb956
,
"ETM 3.5"
),
/* PTM 1.0 */
CS_AMBA_ID_DATA
(
0x000bb950
,
"PTM 1.0"
),
/* PTM 1.1 */
CS_AMBA_ID_DATA
(
0x000bb95f
,
"PTM 1.1"
),
/* PTM 1.1 Qualcomm */
CS_AMBA_ID_DATA
(
0x000b006f
,
"PTM 1.1"
),
{
0
,
0
},
};
...
...
drivers/hwtracing/coresight/coresight-etm4x.c
浏览文件 @
4c2741ac
...
...
@@ -1067,18 +1067,21 @@ static int etm4_probe(struct amba_device *adev, const struct amba_id *id)
return
ret
;
}
#define ETM4x_AMBA_ID(pid) \
{ \
.id = pid, \
.mask = 0x000fffff, \
static
struct
amba_cs_uci_id
uci_id_etm4
[]
=
{
{
/* ETMv4 UCI data */
.
devarch
=
0x47704a13
,
.
devarch_mask
=
0xfff0ffff
,
.
devtype
=
0x00000013
,
}
};
static
const
struct
amba_id
etm4_ids
[]
=
{
ETM4x
_AMBA_ID
(
0x000bb95d
),
/* Cortex-A53 */
ETM4x
_AMBA_ID
(
0x000bb95e
),
/* Cortex-A57 */
ETM4x
_AMBA_ID
(
0x000bb95a
),
/* Cortex-A72 */
ETM4x
_AMBA_ID
(
0x000bb959
),
/* Cortex-A73 */
ETM4x_AMBA_ID
(
0x000bb9da
),
/* Cortex-A35 */
CS
_AMBA_ID
(
0x000bb95d
),
/* Cortex-A53 */
CS
_AMBA_ID
(
0x000bb95e
),
/* Cortex-A57 */
CS
_AMBA_ID
(
0x000bb95a
),
/* Cortex-A72 */
CS
_AMBA_ID
(
0x000bb959
),
/* Cortex-A73 */
CS_AMBA_UCI_ID
(
0x000bb9da
,
uci_id_etm4
),
/* Cortex-A35 */
{},
};
...
...
drivers/hwtracing/coresight/coresight-priv.h
浏览文件 @
4c2741ac
...
...
@@ -6,6 +6,7 @@
#ifndef _CORESIGHT_PRIV_H
#define _CORESIGHT_PRIV_H
#include <linux/amba/bus.h>
#include <linux/bitops.h>
#include <linux/io.h>
#include <linux/coresight.h>
...
...
@@ -159,4 +160,43 @@ static inline int etm_readl_cp14(u32 off, unsigned int *val) { return 0; }
static
inline
int
etm_writel_cp14
(
u32
off
,
u32
val
)
{
return
0
;
}
#endif
/*
* Macros and inline functions to handle CoreSight UCI data and driver
* private data in AMBA ID table entries, and extract data values.
*/
/* coresight AMBA ID, no UCI, no driver data: id table entry */
#define CS_AMBA_ID(pid) \
{ \
.id = pid, \
.mask = 0x000fffff, \
}
/* coresight AMBA ID, UCI with driver data only: id table entry. */
#define CS_AMBA_ID_DATA(pid, dval) \
{ \
.id = pid, \
.mask = 0x000fffff, \
.data = (void *)&(struct amba_cs_uci_id) \
{ \
.data = (void *)dval, \
} \
}
/* coresight AMBA ID, full UCI structure: id table entry. */
#define CS_AMBA_UCI_ID(pid, uci_ptr) \
{ \
.id = pid, \
.mask = 0x000fffff, \
.data = uci_ptr \
}
/* extract the data value from a UCI structure given amba_id pointer. */
static
inline
void
*
coresight_get_uci_data
(
const
struct
amba_id
*
id
)
{
if
(
id
->
data
)
return
((
struct
amba_cs_uci_id
*
)(
id
->
data
))
->
data
;
return
0
;
}
#endif
drivers/hwtracing/coresight/coresight-stm.c
浏览文件 @
4c2741ac
...
...
@@ -874,7 +874,7 @@ static int stm_probe(struct amba_device *adev, const struct amba_id *id)
pm_runtime_put
(
&
adev
->
dev
);
dev_info
(
dev
,
"%s initialized
\n
"
,
(
char
*
)
id
->
data
);
dev_info
(
dev
,
"%s initialized
\n
"
,
(
char
*
)
coresight_get_uci_data
(
id
)
);
return
0
;
stm_unregister:
...
...
@@ -909,16 +909,8 @@ static const struct dev_pm_ops stm_dev_pm_ops = {
};
static
const
struct
amba_id
stm_ids
[]
=
{
{
.
id
=
0x000bb962
,
.
mask
=
0x000fffff
,
.
data
=
"STM32"
,
},
{
.
id
=
0x000bb963
,
.
mask
=
0x000fffff
,
.
data
=
"STM500"
,
},
CS_AMBA_ID_DATA
(
0x000bb962
,
"STM32"
),
CS_AMBA_ID_DATA
(
0x000bb963
,
"STM500"
),
{
0
,
0
},
};
...
...
drivers/hwtracing/coresight/coresight-tmc.c
浏览文件 @
4c2741ac
...
...
@@ -443,7 +443,8 @@ static int tmc_probe(struct amba_device *adev, const struct amba_id *id)
desc
.
type
=
CORESIGHT_DEV_TYPE_SINK
;
desc
.
subtype
.
sink_subtype
=
CORESIGHT_DEV_SUBTYPE_SINK_BUFFER
;
desc
.
ops
=
&
tmc_etr_cs_ops
;
ret
=
tmc_etr_setup_caps
(
drvdata
,
devid
,
id
->
data
);
ret
=
tmc_etr_setup_caps
(
drvdata
,
devid
,
coresight_get_uci_data
(
id
));
if
(
ret
)
goto
out
;
break
;
...
...
@@ -475,26 +476,13 @@ static int tmc_probe(struct amba_device *adev, const struct amba_id *id)
}
static
const
struct
amba_id
tmc_ids
[]
=
{
{
.
id
=
0x000bb961
,
.
mask
=
0x000fffff
,
},
{
/* Coresight SoC 600 TMC-ETR/ETS */
.
id
=
0x000bb9e8
,
.
mask
=
0x000fffff
,
.
data
=
(
void
*
)(
unsigned
long
)
CORESIGHT_SOC_600_ETR_CAPS
,
},
{
/* Coresight SoC 600 TMC-ETB */
.
id
=
0x000bb9e9
,
.
mask
=
0x000fffff
,
},
{
/* Coresight SoC 600 TMC-ETF */
.
id
=
0x000bb9ea
,
.
mask
=
0x000fffff
,
},
CS_AMBA_ID
(
0x000bb961
),
/* Coresight SoC 600 TMC-ETR/ETS */
CS_AMBA_ID_DATA
(
0x000bb9e8
,
(
unsigned
long
)
CORESIGHT_SOC_600_ETR_CAPS
),
/* Coresight SoC 600 TMC-ETB */
CS_AMBA_ID
(
0x000bb9e9
),
/* Coresight SoC 600 TMC-ETF */
CS_AMBA_ID
(
0x000bb9ea
),
{
0
,
0
},
};
...
...
include/linux/amba/bus.h
浏览文件 @
4c2741ac
...
...
@@ -25,6 +25,43 @@
#define AMBA_CID 0xb105f00d
#define CORESIGHT_CID 0xb105900d
/*
* CoreSight Architecture specification updates the ID specification
* for components on the AMBA bus. (ARM IHI 0029E)
*
* Bits 15:12 of the CID are the device class.
*
* Class 0xF remains for PrimeCell and legacy components. (AMBA_CID above)
* Class 0x9 defines the component as CoreSight (CORESIGHT_CID above)
* Class 0x0, 0x1, 0xB, 0xE define components that do not have driver support
* at present.
* Class 0x2-0x8,0xA and 0xD-0xD are presently reserved.
*
* Remaining CID bits stay as 0xb105-00d
*/
/**
* Class 0x9 components use additional values to form a Unique Component
* Identifier (UCI), where peripheral ID values are identical for different
* components. Passed to the amba bus code from the component driver via
* the amba_id->data pointer.
* @devarch : coresight devarch register value
* @devarch_mask: mask bits used for matching. 0 indicates UCI not used.
* @devtype : coresight device type value
* @data : additional driver data. As we have usurped the original
* pointer some devices may still need additional data
*/
struct
amba_cs_uci_id
{
unsigned
int
devarch
;
unsigned
int
devarch_mask
;
unsigned
int
devtype
;
void
*
data
;
};
/* define offsets for registers used by UCI */
#define UCI_REG_DEVTYPE_OFFSET 0xFCC
#define UCI_REG_DEVARCH_OFFSET 0xFBC
struct
clk
;
struct
amba_device
{
...
...
@@ -32,6 +69,8 @@ struct amba_device {
struct
resource
res
;
struct
clk
*
pclk
;
unsigned
int
periphid
;
unsigned
int
cid
;
struct
amba_cs_uci_id
uci
;
unsigned
int
irq
[
AMBA_NR_IRQS
];
char
*
driver_override
;
};
...
...
lib/raid6/Makefile
浏览文件 @
4c2741ac
...
...
@@ -39,7 +39,7 @@ endif
ifeq
($(CONFIG_KERNEL_MODE_NEON),y)
NEON_FLAGS
:=
-ffreestanding
ifeq
($(ARCH),arm)
NEON_FLAGS
+=
-mfloat-abi
=
softfp
-mfpu
=
neon
NEON_FLAGS
+=
-m
arch
=
armv7-a
-m
float-abi
=
softfp
-mfpu
=
neon
endif
CFLAGS_recov_neon_inner.o
+=
$(NEON_FLAGS)
ifeq
($(ARCH),arm64)
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录