Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
openeuler
raspberrypi-kernel
提交
a32737e1
R
raspberrypi-kernel
项目概览
openeuler
/
raspberrypi-kernel
通知
14
Star
1
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
R
raspberrypi-kernel
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
提交
a32737e1
编写于
1月 05, 2012
作者:
R
Russell King
浏览文件
操作
浏览文件
下载
差异文件
Merge branches 'fixes' and 'misc' into for-linus
上级
27edacac
a3c2b511
变更
29
展开全部
隐藏空白更改
内联
并排
Showing
29 changed file
with
922 addition
and
507 deletion
+922
-507
arch/arm/Kconfig
arch/arm/Kconfig
+16
-0
arch/arm/common/timer-sp.c
arch/arm/common/timer-sp.c
+1
-6
arch/arm/include/asm/edac.h
arch/arm/include/asm/edac.h
+48
-0
arch/arm/include/asm/gpio.h
arch/arm/include/asm/gpio.h
+4
-0
arch/arm/include/asm/hardirq.h
arch/arm/include/asm/hardirq.h
+0
-17
arch/arm/include/asm/opcodes.h
arch/arm/include/asm/opcodes.h
+20
-0
arch/arm/include/asm/pgtable.h
arch/arm/include/asm/pgtable.h
+1
-0
arch/arm/include/asm/processor.h
arch/arm/include/asm/processor.h
+2
-0
arch/arm/include/asm/setup.h
arch/arm/include/asm/setup.h
+1
-5
arch/arm/include/asm/swab.h
arch/arm/include/asm/swab.h
+3
-2
arch/arm/kernel/Makefile
arch/arm/kernel/Makefile
+1
-1
arch/arm/kernel/kprobes-test.c
arch/arm/kernel/kprobes-test.c
+7
-59
arch/arm/kernel/opcodes.c
arch/arm/kernel/opcodes.c
+72
-0
arch/arm/kernel/smp_twd.c
arch/arm/kernel/smp_twd.c
+88
-7
arch/arm/kernel/swp_emulate.c
arch/arm/kernel/swp_emulate.c
+16
-0
arch/arm/kernel/tcm.c
arch/arm/kernel/tcm.c
+19
-3
arch/arm/mach-integrator/Kconfig
arch/arm/mach-integrator/Kconfig
+4
-0
arch/arm/mach-integrator/core.c
arch/arm/mach-integrator/core.c
+14
-5
arch/arm/mach-kirkwood/sheevaplug-setup.c
arch/arm/mach-kirkwood/sheevaplug-setup.c
+3
-3
arch/arm/mach-orion5x/ts209-setup.c
arch/arm/mach-orion5x/ts209-setup.c
+1
-1
arch/arm/mach-shmobile/include/mach/gpio.h
arch/arm/mach-shmobile/include/mach/gpio.h
+0
-2
arch/arm/mach-ux500/include/mach/gpio.h
arch/arm/mach-ux500/include/mach/gpio.h
+0
-5
arch/arm/mm/fault.c
arch/arm/mm/fault.c
+39
-19
arch/arm/mm/mmap.c
arch/arm/mm/mmap.c
+168
-5
arch/arm/mm/proc-v7.S
arch/arm/mm/proc-v7.S
+11
-0
arch/arm/nwfpe/entry.S
arch/arm/nwfpe/entry.S
+5
-3
arch/arm/nwfpe/fpopcode.c
arch/arm/nwfpe/fpopcode.c
+0
-26
arch/arm/nwfpe/fpopcode.h
arch/arm/nwfpe/fpopcode.h
+0
-3
arch/arm/tools/mach-types
arch/arm/tools/mach-types
+378
-335
未找到文件。
arch/arm/Kconfig
浏览文件 @
a32737e1
...
@@ -258,6 +258,7 @@ config ARCH_INTEGRATOR
...
@@ -258,6 +258,7 @@ config ARCH_INTEGRATOR
select ARCH_HAS_CPUFREQ
select ARCH_HAS_CPUFREQ
select CLKDEV_LOOKUP
select CLKDEV_LOOKUP
select HAVE_MACH_CLKDEV
select HAVE_MACH_CLKDEV
select HAVE_TCM
select ICST
select ICST
select GENERIC_CLOCKEVENTS
select GENERIC_CLOCKEVENTS
select PLAT_VERSATILE
select PLAT_VERSATILE
...
@@ -1126,6 +1127,11 @@ config ARM_TIMER_SP804
...
@@ -1126,6 +1127,11 @@ config ARM_TIMER_SP804
source arch/arm/mm/Kconfig
source arch/arm/mm/Kconfig
config ARM_NR_BANKS
int
default 16 if ARCH_EP93XX
default 8
config IWMMXT
config IWMMXT
bool "Enable iWMMXt support"
bool "Enable iWMMXt support"
depends on CPU_XSCALE || CPU_XSC3 || CPU_MOHAWK || CPU_PJ4
depends on CPU_XSCALE || CPU_XSC3 || CPU_MOHAWK || CPU_PJ4
...
@@ -1560,6 +1566,16 @@ config LOCAL_TIMERS
...
@@ -1560,6 +1566,16 @@ config LOCAL_TIMERS
accounting to be spread across the timer interval, preventing a
accounting to be spread across the timer interval, preventing a
"thundering herd" at every timer tick.
"thundering herd" at every timer tick.
config ARCH_NR_GPIO
int
default 1024 if ARCH_SHMOBILE || ARCH_TEGRA
default 350 if ARCH_U8500
default 0
help
Maximum number of GPIOs in the system.
If unsure, leave the default value.
source kernel/Kconfig.preempt
source kernel/Kconfig.preempt
config HZ
config HZ
...
...
arch/arm/common/timer-sp.c
浏览文件 @
a32737e1
...
@@ -143,7 +143,6 @@ static int sp804_set_next_event(unsigned long next,
...
@@ -143,7 +143,6 @@ static int sp804_set_next_event(unsigned long next,
}
}
static
struct
clock_event_device
sp804_clockevent
=
{
static
struct
clock_event_device
sp804_clockevent
=
{
.
shift
=
32
,
.
features
=
CLOCK_EVT_FEAT_PERIODIC
|
CLOCK_EVT_FEAT_ONESHOT
,
.
features
=
CLOCK_EVT_FEAT_PERIODIC
|
CLOCK_EVT_FEAT_ONESHOT
,
.
set_mode
=
sp804_set_mode
,
.
set_mode
=
sp804_set_mode
,
.
set_next_event
=
sp804_set_next_event
,
.
set_next_event
=
sp804_set_next_event
,
...
@@ -169,13 +168,9 @@ void __init sp804_clockevents_init(void __iomem *base, unsigned int irq,
...
@@ -169,13 +168,9 @@ void __init sp804_clockevents_init(void __iomem *base, unsigned int irq,
clkevt_base
=
base
;
clkevt_base
=
base
;
clkevt_reload
=
DIV_ROUND_CLOSEST
(
rate
,
HZ
);
clkevt_reload
=
DIV_ROUND_CLOSEST
(
rate
,
HZ
);
evt
->
name
=
name
;
evt
->
name
=
name
;
evt
->
irq
=
irq
;
evt
->
irq
=
irq
;
evt
->
mult
=
div_sc
(
rate
,
NSEC_PER_SEC
,
evt
->
shift
);
evt
->
max_delta_ns
=
clockevent_delta2ns
(
0xffffffff
,
evt
);
evt
->
min_delta_ns
=
clockevent_delta2ns
(
0xf
,
evt
);
setup_irq
(
irq
,
&
sp804_timer_irq
);
setup_irq
(
irq
,
&
sp804_timer_irq
);
clockevents_
register_device
(
evt
);
clockevents_
config_and_register
(
evt
,
rate
,
0xf
,
0xffffffff
);
}
}
arch/arm/include/asm/edac.h
0 → 100644
浏览文件 @
a32737e1
/*
* Copyright 2011 Calxeda, Inc.
* Based on PPC version Copyright 2007 MontaVista Software, Inc.
*
* This program is free software; you can redistribute it and/or modify it
* under the terms and conditions of the GNU General Public License,
* version 2, as published by the Free Software Foundation.
*
* This program is distributed in the hope it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
* more details.
*
* You should have received a copy of the GNU General Public License along with
* this program. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef ASM_EDAC_H
#define ASM_EDAC_H
/*
* ECC atomic, DMA, SMP and interrupt safe scrub function.
* Implements the per arch atomic_scrub() that EDAC use for software
* ECC scrubbing. It reads memory and then writes back the original
* value, allowing the hardware to detect and correct memory errors.
*/
static
inline
void
atomic_scrub
(
void
*
va
,
u32
size
)
{
#if __LINUX_ARM_ARCH__ >= 6
unsigned
int
*
virt_addr
=
va
;
unsigned
int
temp
,
temp2
;
unsigned
int
i
;
for
(
i
=
0
;
i
<
size
/
sizeof
(
*
virt_addr
);
i
++
,
virt_addr
++
)
{
/* Very carefully read and write to memory atomically
* so we are interrupt, DMA and SMP safe.
*/
__asm__
__volatile__
(
"
\n
"
"1: ldrex %0, [%2]
\n
"
" strex %1, %0, [%2]
\n
"
" teq %1, #0
\n
"
" bne 1b
\n
"
:
"=&r"
(
temp
),
"=&r"
(
temp2
)
:
"r"
(
virt_addr
)
:
"cc"
);
}
#endif
}
#endif
arch/arm/include/asm/gpio.h
浏览文件 @
a32737e1
#ifndef _ARCH_ARM_GPIO_H
#ifndef _ARCH_ARM_GPIO_H
#define _ARCH_ARM_GPIO_H
#define _ARCH_ARM_GPIO_H
#if CONFIG_ARCH_NR_GPIO > 0
#define ARCH_NR_GPIO CONFIG_ARCH_NR_GPIO
#endif
/* not all ARM platforms necessarily support this API ... */
/* not all ARM platforms necessarily support this API ... */
#include <mach/gpio.h>
#include <mach/gpio.h>
...
...
arch/arm/include/asm/hardirq.h
浏览文件 @
a32737e1
...
@@ -27,23 +27,6 @@ u64 smp_irq_stat_cpu(unsigned int cpu);
...
@@ -27,23 +27,6 @@ u64 smp_irq_stat_cpu(unsigned int cpu);
#define arch_irq_stat_cpu smp_irq_stat_cpu
#define arch_irq_stat_cpu smp_irq_stat_cpu
#if NR_IRQS > 512
#define HARDIRQ_BITS 10
#elif NR_IRQS > 256
#define HARDIRQ_BITS 9
#else
#define HARDIRQ_BITS 8
#endif
/*
* The hardirq mask has to be large enough to have space
* for potentially all IRQ sources in the system nesting
* on a single CPU:
*/
#if (1 << HARDIRQ_BITS) < NR_IRQS
# error HARDIRQ_BITS is too low!
#endif
#define __ARCH_IRQ_EXIT_IRQS_DISABLED 1
#define __ARCH_IRQ_EXIT_IRQS_DISABLED 1
#endif
/* __ASM_HARDIRQ_H */
#endif
/* __ASM_HARDIRQ_H */
arch/arm/include/asm/opcodes.h
0 → 100644
浏览文件 @
a32737e1
/*
* arch/arm/include/asm/opcodes.h
*
* 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.
*/
#ifndef __ASM_ARM_OPCODES_H
#define __ASM_ARM_OPCODES_H
#ifndef __ASSEMBLY__
extern
asmlinkage
unsigned
int
arm_check_condition
(
u32
opcode
,
u32
psr
);
#endif
#define ARM_OPCODE_CONDTEST_FAIL 0
#define ARM_OPCODE_CONDTEST_PASS 1
#define ARM_OPCODE_CONDTEST_UNCOND 2
#endif
/* __ASM_ARM_OPCODES_H */
arch/arm/include/asm/pgtable.h
浏览文件 @
a32737e1
...
@@ -336,6 +336,7 @@ static inline pte_t pte_modify(pte_t pte, pgprot_t newprot)
...
@@ -336,6 +336,7 @@ static inline pte_t pte_modify(pte_t pte, pgprot_t newprot)
* We provide our own arch_get_unmapped_area to cope with VIPT caches.
* We provide our own arch_get_unmapped_area to cope with VIPT caches.
*/
*/
#define HAVE_ARCH_UNMAPPED_AREA
#define HAVE_ARCH_UNMAPPED_AREA
#define HAVE_ARCH_UNMAPPED_AREA_TOPDOWN
/*
/*
* remap a physical page `pfn' of size `size' with page protection `prot'
* remap a physical page `pfn' of size `size' with page protection `prot'
...
...
arch/arm/include/asm/processor.h
浏览文件 @
a32737e1
...
@@ -123,6 +123,8 @@ static inline void prefetch(const void *ptr)
...
@@ -123,6 +123,8 @@ static inline void prefetch(const void *ptr)
#endif
#endif
#define HAVE_ARCH_PICK_MMAP_LAYOUT
#endif
#endif
#endif
/* __ASM_ARM_PROCESSOR_H */
#endif
/* __ASM_ARM_PROCESSOR_H */
arch/arm/include/asm/setup.h
浏览文件 @
a32737e1
...
@@ -192,11 +192,7 @@ static const struct tagtable __tagtable_##fn __tag = { tag, fn }
...
@@ -192,11 +192,7 @@ static const struct tagtable __tagtable_##fn __tag = { tag, fn }
/*
/*
* Memory map description
* Memory map description
*/
*/
#ifdef CONFIG_ARCH_EP93XX
#define NR_BANKS CONFIG_ARM_NR_BANKS
# define NR_BANKS 16
#else
# define NR_BANKS 8
#endif
struct
membank
{
struct
membank
{
phys_addr_t
start
;
phys_addr_t
start
;
...
...
arch/arm/include/asm/swab.h
浏览文件 @
a32737e1
...
@@ -24,12 +24,13 @@
...
@@ -24,12 +24,13 @@
#if defined(__KERNEL__) && __LINUX_ARM_ARCH__ >= 6
#if defined(__KERNEL__) && __LINUX_ARM_ARCH__ >= 6
static
inline
__attribute_const__
__u
16
__arch_swab16
(
__u16
x
)
static
inline
__attribute_const__
__u
32
__arch_swahb32
(
__u32
x
)
{
{
__asm__
(
"rev16 %0, %1"
:
"=r"
(
x
)
:
"r"
(
x
));
__asm__
(
"rev16 %0, %1"
:
"=r"
(
x
)
:
"r"
(
x
));
return
x
;
return
x
;
}
}
#define __arch_swab16 __arch_swab16
#define __arch_swahb32 __arch_swahb32
#define __arch_swab16(x) ((__u16)__arch_swahb32(x))
static
inline
__attribute_const__
__u32
__arch_swab32
(
__u32
x
)
static
inline
__attribute_const__
__u32
__arch_swab32
(
__u32
x
)
{
{
...
...
arch/arm/kernel/Makefile
浏览文件 @
a32737e1
...
@@ -13,7 +13,7 @@ CFLAGS_REMOVE_return_address.o = -pg
...
@@ -13,7 +13,7 @@ CFLAGS_REMOVE_return_address.o = -pg
# Object file lists.
# Object file lists.
obj-y
:=
elf.o entry-armv.o entry-common.o irq.o
\
obj-y
:=
elf.o entry-armv.o entry-common.o irq.o
opcodes.o
\
process.o ptrace.o return_address.o setup.o signal.o
\
process.o ptrace.o return_address.o setup.o signal.o
\
sys_arm.o stacktrace.o time.o traps.o
sys_arm.o stacktrace.o time.o traps.o
...
...
arch/arm/kernel/kprobes-test.c
浏览文件 @
a32737e1
...
@@ -202,6 +202,8 @@
...
@@ -202,6 +202,8 @@
#include <linux/slab.h>
#include <linux/slab.h>
#include <linux/kprobes.h>
#include <linux/kprobes.h>
#include <asm/opcodes.h>
#include "kprobes.h"
#include "kprobes.h"
#include "kprobes-test.h"
#include "kprobes-test.h"
...
@@ -1050,65 +1052,9 @@ static int test_instance;
...
@@ -1050,65 +1052,9 @@ static int test_instance;
static
unsigned
long
test_check_cc
(
int
cc
,
unsigned
long
cpsr
)
static
unsigned
long
test_check_cc
(
int
cc
,
unsigned
long
cpsr
)
{
{
unsigned
long
temp
;
int
ret
=
arm_check_condition
(
cc
<<
28
,
cpsr
);
switch
(
cc
)
{
case
0x0
:
/* eq */
return
cpsr
&
PSR_Z_BIT
;
case
0x1
:
/* ne */
return
(
~
cpsr
)
&
PSR_Z_BIT
;
case
0x2
:
/* cs */
return
cpsr
&
PSR_C_BIT
;
case
0x3
:
/* cc */
return
(
~
cpsr
)
&
PSR_C_BIT
;
case
0x4
:
/* mi */
return
cpsr
&
PSR_N_BIT
;
case
0x5
:
/* pl */
return
(
~
cpsr
)
&
PSR_N_BIT
;
case
0x6
:
/* vs */
return
cpsr
&
PSR_V_BIT
;
case
0x7
:
/* vc */
return
(
~
cpsr
)
&
PSR_V_BIT
;
case
0x8
:
/* hi */
return
(
ret
!=
ARM_OPCODE_CONDTEST_FAIL
);
cpsr
&=
~
(
cpsr
>>
1
);
/* PSR_C_BIT &= ~PSR_Z_BIT */
return
cpsr
&
PSR_C_BIT
;
case
0x9
:
/* ls */
cpsr
&=
~
(
cpsr
>>
1
);
/* PSR_C_BIT &= ~PSR_Z_BIT */
return
(
~
cpsr
)
&
PSR_C_BIT
;
case
0xa
:
/* ge */
cpsr
^=
(
cpsr
<<
3
);
/* PSR_N_BIT ^= PSR_V_BIT */
return
(
~
cpsr
)
&
PSR_N_BIT
;
case
0xb
:
/* lt */
cpsr
^=
(
cpsr
<<
3
);
/* PSR_N_BIT ^= PSR_V_BIT */
return
cpsr
&
PSR_N_BIT
;
case
0xc
:
/* gt */
temp
=
cpsr
^
(
cpsr
<<
3
);
/* PSR_N_BIT ^= PSR_V_BIT */
temp
|=
(
cpsr
<<
1
);
/* PSR_N_BIT |= PSR_Z_BIT */
return
(
~
temp
)
&
PSR_N_BIT
;
case
0xd
:
/* le */
temp
=
cpsr
^
(
cpsr
<<
3
);
/* PSR_N_BIT ^= PSR_V_BIT */
temp
|=
(
cpsr
<<
1
);
/* PSR_N_BIT |= PSR_Z_BIT */
return
temp
&
PSR_N_BIT
;
case
0xe
:
/* al */
case
0xf
:
/* unconditional */
return
true
;
}
BUG
();
return
false
;
}
}
static
int
is_last_scenario
;
static
int
is_last_scenario
;
...
@@ -1128,7 +1074,9 @@ static unsigned long test_context_cpsr(int scenario)
...
@@ -1128,7 +1074,9 @@ static unsigned long test_context_cpsr(int scenario)
if
(
!
test_case_is_thumb
)
{
if
(
!
test_case_is_thumb
)
{
/* Testing ARM code */
/* Testing ARM code */
probe_should_run
=
test_check_cc
(
current_instruction
>>
28
,
cpsr
)
!=
0
;
int
cc
=
current_instruction
>>
28
;
probe_should_run
=
test_check_cc
(
cc
,
cpsr
)
!=
0
;
if
(
scenario
==
15
)
if
(
scenario
==
15
)
is_last_scenario
=
true
;
is_last_scenario
=
true
;
...
...
arch/arm/kernel/opcodes.c
0 → 100644
浏览文件 @
a32737e1
/*
* linux/arch/arm/kernel/opcodes.c
*
* A32 condition code lookup feature moved from nwfpe/fpopcode.c
*
* 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/module.h>
#include <asm/opcodes.h>
#define ARM_OPCODE_CONDITION_UNCOND 0xf
/*
* condition code lookup table
* index into the table is test code: EQ, NE, ... LT, GT, AL, NV
*
* bit position in short is condition code: NZCV
*/
static
const
unsigned
short
cc_map
[
16
]
=
{
0xF0F0
,
/* EQ == Z set */
0x0F0F
,
/* NE */
0xCCCC
,
/* CS == C set */
0x3333
,
/* CC */
0xFF00
,
/* MI == N set */
0x00FF
,
/* PL */
0xAAAA
,
/* VS == V set */
0x5555
,
/* VC */
0x0C0C
,
/* HI == C set && Z clear */
0xF3F3
,
/* LS == C clear || Z set */
0xAA55
,
/* GE == (N==V) */
0x55AA
,
/* LT == (N!=V) */
0x0A05
,
/* GT == (!Z && (N==V)) */
0xF5FA
,
/* LE == (Z || (N!=V)) */
0xFFFF
,
/* AL always */
0
/* NV */
};
/*
* Returns:
* ARM_OPCODE_CONDTEST_FAIL - if condition fails
* ARM_OPCODE_CONDTEST_PASS - if condition passes (including AL)
* ARM_OPCODE_CONDTEST_UNCOND - if NV condition, or separate unconditional
* opcode space from v5 onwards
*
* Code that tests whether a conditional instruction would pass its condition
* check should check that return value == ARM_OPCODE_CONDTEST_PASS.
*
* Code that tests if a condition means that the instruction would be executed
* (regardless of conditional or unconditional) should instead check that the
* return value != ARM_OPCODE_CONDTEST_FAIL.
*/
asmlinkage
unsigned
int
arm_check_condition
(
u32
opcode
,
u32
psr
)
{
u32
cc_bits
=
opcode
>>
28
;
u32
psr_cond
=
psr
>>
28
;
unsigned
int
ret
;
if
(
cc_bits
!=
ARM_OPCODE_CONDITION_UNCOND
)
{
if
((
cc_map
[
cc_bits
]
>>
(
psr_cond
))
&
1
)
ret
=
ARM_OPCODE_CONDTEST_PASS
;
else
ret
=
ARM_OPCODE_CONDTEST_FAIL
;
}
else
{
ret
=
ARM_OPCODE_CONDTEST_UNCOND
;
}
return
ret
;
}
EXPORT_SYMBOL_GPL
(
arm_check_condition
);
arch/arm/kernel/smp_twd.c
浏览文件 @
a32737e1
...
@@ -10,8 +10,11 @@
...
@@ -10,8 +10,11 @@
*/
*/
#include <linux/init.h>
#include <linux/init.h>
#include <linux/kernel.h>
#include <linux/kernel.h>
#include <linux/clk.h>
#include <linux/cpufreq.h>
#include <linux/delay.h>
#include <linux/delay.h>
#include <linux/device.h>
#include <linux/device.h>
#include <linux/err.h>
#include <linux/smp.h>
#include <linux/smp.h>
#include <linux/jiffies.h>
#include <linux/jiffies.h>
#include <linux/clockchips.h>
#include <linux/clockchips.h>
...
@@ -25,6 +28,7 @@
...
@@ -25,6 +28,7 @@
/* set up by the platform code */
/* set up by the platform code */
void
__iomem
*
twd_base
;
void
__iomem
*
twd_base
;
static
struct
clk
*
twd_clk
;
static
unsigned
long
twd_timer_rate
;
static
unsigned
long
twd_timer_rate
;
static
struct
clock_event_device
__percpu
**
twd_evt
;
static
struct
clock_event_device
__percpu
**
twd_evt
;
...
@@ -89,6 +93,52 @@ void twd_timer_stop(struct clock_event_device *clk)
...
@@ -89,6 +93,52 @@ void twd_timer_stop(struct clock_event_device *clk)
disable_percpu_irq
(
clk
->
irq
);
disable_percpu_irq
(
clk
->
irq
);
}
}
#ifdef CONFIG_CPU_FREQ
/*
* 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
(
*
__this_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
||
state
==
CPUFREQ_RESUMECHANGE
)
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
(
!
IS_ERR
(
twd_clk
))
return
cpufreq_register_notifier
(
&
twd_cpufreq_nb
,
CPUFREQ_TRANSITION_NOTIFIER
);
return
0
;
}
core_initcall
(
twd_cpufreq_init
);
#endif
static
void
__cpuinit
twd_calibrate_rate
(
void
)
static
void
__cpuinit
twd_calibrate_rate
(
void
)
{
{
unsigned
long
count
;
unsigned
long
count
;
...
@@ -140,6 +190,35 @@ static irqreturn_t twd_handler(int irq, void *dev_id)
...
@@ -140,6 +190,35 @@ static irqreturn_t twd_handler(int irq, void *dev_id)
return
IRQ_NONE
;
return
IRQ_NONE
;
}
}
static
struct
clk
*
twd_get_clock
(
void
)
{
struct
clk
*
clk
;
int
err
;
clk
=
clk_get_sys
(
"smp_twd"
,
NULL
);
if
(
IS_ERR
(
clk
))
{
pr_err
(
"smp_twd: clock not found: %d
\n
"
,
(
int
)
PTR_ERR
(
clk
));
return
clk
;
}
err
=
clk_prepare
(
clk
);
if
(
err
)
{
pr_err
(
"smp_twd: clock failed to prepare: %d
\n
"
,
err
);
clk_put
(
clk
);
return
ERR_PTR
(
err
);
}
err
=
clk_enable
(
clk
);
if
(
err
)
{
pr_err
(
"smp_twd: clock failed to enable: %d
\n
"
,
err
);
clk_unprepare
(
clk
);
clk_put
(
clk
);
return
ERR_PTR
(
err
);
}
return
clk
;
}
/*
/*
* Setup the local clock events for a CPU.
* Setup the local clock events for a CPU.
*/
*/
...
@@ -165,7 +244,13 @@ void __cpuinit twd_timer_setup(struct clock_event_device *clk)
...
@@ -165,7 +244,13 @@ void __cpuinit twd_timer_setup(struct clock_event_device *clk)
}
}
}
}
twd_calibrate_rate
();
if
(
!
twd_clk
)
twd_clk
=
twd_get_clock
();
if
(
!
IS_ERR_OR_NULL
(
twd_clk
))
twd_timer_rate
=
clk_get_rate
(
twd_clk
);
else
twd_calibrate_rate
();
clk
->
name
=
"local_timer"
;
clk
->
name
=
"local_timer"
;
clk
->
features
=
CLOCK_EVT_FEAT_PERIODIC
|
CLOCK_EVT_FEAT_ONESHOT
|
clk
->
features
=
CLOCK_EVT_FEAT_PERIODIC
|
CLOCK_EVT_FEAT_ONESHOT
|
...
@@ -173,15 +258,11 @@ void __cpuinit twd_timer_setup(struct clock_event_device *clk)
...
@@ -173,15 +258,11 @@ void __cpuinit twd_timer_setup(struct clock_event_device *clk)
clk
->
rating
=
350
;
clk
->
rating
=
350
;
clk
->
set_mode
=
twd_set_mode
;
clk
->
set_mode
=
twd_set_mode
;
clk
->
set_next_event
=
twd_set_next_event
;
clk
->
set_next_event
=
twd_set_next_event
;
clk
->
shift
=
20
;
clk
->
mult
=
div_sc
(
twd_timer_rate
,
NSEC_PER_SEC
,
clk
->
shift
);
clk
->
max_delta_ns
=
clockevent_delta2ns
(
0xffffffff
,
clk
);
clk
->
min_delta_ns
=
clockevent_delta2ns
(
0xf
,
clk
);
this_cpu_clk
=
__this_cpu_ptr
(
twd_evt
);
this_cpu_clk
=
__this_cpu_ptr
(
twd_evt
);
*
this_cpu_clk
=
clk
;
*
this_cpu_clk
=
clk
;
clockevents_
register_device
(
clk
);
clockevents_
config_and_register
(
clk
,
twd_timer_rate
,
0xf
,
0xffffffff
);
enable_percpu_irq
(
clk
->
irq
,
0
);
enable_percpu_irq
(
clk
->
irq
,
0
);
}
}
arch/arm/kernel/swp_emulate.c
浏览文件 @
a32737e1
...
@@ -25,6 +25,7 @@
...
@@ -25,6 +25,7 @@
#include <linux/syscalls.h>
#include <linux/syscalls.h>
#include <linux/perf_event.h>
#include <linux/perf_event.h>
#include <asm/opcodes.h>
#include <asm/traps.h>
#include <asm/traps.h>
#include <asm/uaccess.h>
#include <asm/uaccess.h>
...
@@ -185,6 +186,21 @@ static int swp_handler(struct pt_regs *regs, unsigned int instr)
...
@@ -185,6 +186,21 @@ static int swp_handler(struct pt_regs *regs, unsigned int instr)
perf_sw_event
(
PERF_COUNT_SW_EMULATION_FAULTS
,
1
,
regs
,
regs
->
ARM_pc
);
perf_sw_event
(
PERF_COUNT_SW_EMULATION_FAULTS
,
1
,
regs
,
regs
->
ARM_pc
);
res
=
arm_check_condition
(
instr
,
regs
->
ARM_cpsr
);
switch
(
res
)
{
case
ARM_OPCODE_CONDTEST_PASS
:
break
;
case
ARM_OPCODE_CONDTEST_FAIL
:
/* Condition failed - return to next instruction */
regs
->
ARM_pc
+=
4
;
return
0
;
case
ARM_OPCODE_CONDTEST_UNCOND
:
/* If unconditional encoding - not a SWP, undef */
return
-
EFAULT
;
default:
return
-
EINVAL
;
}
if
(
current
->
pid
!=
previous_pid
)
{
if
(
current
->
pid
!=
previous_pid
)
{
pr_debug
(
"
\"
%s
\"
(%ld) uses deprecated SWP{B} instruction
\n
"
,
pr_debug
(
"
\"
%s
\"
(%ld) uses deprecated SWP{B} instruction
\n
"
,
current
->
comm
,
(
unsigned
long
)
current
->
pid
);
current
->
comm
,
(
unsigned
long
)
current
->
pid
);
...
...
arch/arm/kernel/tcm.c
浏览文件 @
a32737e1
...
@@ -180,9 +180,9 @@ static int __init setup_tcm_bank(u8 type, u8 bank, u8 banks,
...
@@ -180,9 +180,9 @@ static int __init setup_tcm_bank(u8 type, u8 bank, u8 banks,
*/
*/
void
__init
tcm_init
(
void
)
void
__init
tcm_init
(
void
)
{
{
u32
tcm_status
=
read_cpuid_tcmstatus
()
;
u32
tcm_status
;
u8
dtcm_banks
=
(
tcm_status
>>
16
)
&
0x03
;
u8
dtcm_banks
;
u8
itcm_banks
=
(
tcm_status
&
0x03
)
;
u8
itcm_banks
;
size_t
dtcm_code_sz
=
&
__edtcm_data
-
&
__sdtcm_data
;
size_t
dtcm_code_sz
=
&
__edtcm_data
-
&
__sdtcm_data
;
size_t
itcm_code_sz
=
&
__eitcm_text
-
&
__sitcm_text
;
size_t
itcm_code_sz
=
&
__eitcm_text
-
&
__sitcm_text
;
char
*
start
;
char
*
start
;
...
@@ -191,6 +191,22 @@ void __init tcm_init(void)
...
@@ -191,6 +191,22 @@ void __init tcm_init(void)
int
ret
;
int
ret
;
int
i
;
int
i
;
/*
* Prior to ARMv5 there is no TCM, and trying to read the status
* register will hang the processor.
*/
if
(
cpu_architecture
()
<
CPU_ARCH_ARMv5
)
{
if
(
dtcm_code_sz
||
itcm_code_sz
)
pr_info
(
"CPU TCM: %u bytes of DTCM and %u bytes of "
"ITCM code compiled in, but no TCM present "
"in pre-v5 CPU
\n
"
,
dtcm_code_sz
,
itcm_code_sz
);
return
;
}
tcm_status
=
read_cpuid_tcmstatus
();
dtcm_banks
=
(
tcm_status
>>
16
)
&
0x03
;
itcm_banks
=
(
tcm_status
&
0x03
);
/* Values greater than 2 for D/ITCM banks are "reserved" */
/* Values greater than 2 for D/ITCM banks are "reserved" */
if
(
dtcm_banks
>
2
)
if
(
dtcm_banks
>
2
)
dtcm_banks
=
0
;
dtcm_banks
=
0
;
...
...
arch/arm/mach-integrator/Kconfig
浏览文件 @
a32737e1
...
@@ -6,6 +6,8 @@ config ARCH_INTEGRATOR_AP
...
@@ -6,6 +6,8 @@ config ARCH_INTEGRATOR_AP
bool "Support Integrator/AP and Integrator/PP2 platforms"
bool "Support Integrator/AP and Integrator/PP2 platforms"
select CLKSRC_MMIO
select CLKSRC_MMIO
select MIGHT_HAVE_PCI
select MIGHT_HAVE_PCI
select SERIAL_AMBA_PL010
select SERIAL_AMBA_PL010_CONSOLE
help
help
Include support for the ARM(R) Integrator/AP and
Include support for the ARM(R) Integrator/AP and
Integrator/PP2 platforms.
Integrator/PP2 platforms.
...
@@ -15,6 +17,8 @@ config ARCH_INTEGRATOR_CP
...
@@ -15,6 +17,8 @@ config ARCH_INTEGRATOR_CP
select ARCH_CINTEGRATOR
select ARCH_CINTEGRATOR
select ARM_TIMER_SP804
select ARM_TIMER_SP804
select PLAT_VERSATILE_CLCD
select PLAT_VERSATILE_CLCD
select SERIAL_AMBA_PL011
select SERIAL_AMBA_PL011_CONSOLE
help
help
Include support for the ARM(R) Integrator CP platform.
Include support for the ARM(R) Integrator CP platform.
...
...
arch/arm/mach-integrator/core.c
浏览文件 @
a32737e1
...
@@ -29,6 +29,7 @@
...
@@ -29,6 +29,7 @@
#include <mach/cm.h>
#include <mach/cm.h>
#include <asm/system.h>
#include <asm/system.h>
#include <asm/leds.h>
#include <asm/leds.h>
#include <asm/mach-types.h>
#include <asm/mach/time.h>
#include <asm/mach/time.h>
#include <asm/pgtable.h>
#include <asm/pgtable.h>
...
@@ -44,7 +45,6 @@ static struct amba_device rtc_device = {
...
@@ -44,7 +45,6 @@ static struct amba_device rtc_device = {
.
flags
=
IORESOURCE_MEM
,
.
flags
=
IORESOURCE_MEM
,
},
},
.
irq
=
{
IRQ_RTCINT
,
NO_IRQ
},
.
irq
=
{
IRQ_RTCINT
,
NO_IRQ
},
.
periphid
=
0x00041030
,
};
};
static
struct
amba_device
uart0_device
=
{
static
struct
amba_device
uart0_device
=
{
...
@@ -58,7 +58,6 @@ static struct amba_device uart0_device = {
...
@@ -58,7 +58,6 @@ static struct amba_device uart0_device = {
.
flags
=
IORESOURCE_MEM
,
.
flags
=
IORESOURCE_MEM
,
},
},
.
irq
=
{
IRQ_UARTINT0
,
NO_IRQ
},
.
irq
=
{
IRQ_UARTINT0
,
NO_IRQ
},
.
periphid
=
0x0041010
,
};
};
static
struct
amba_device
uart1_device
=
{
static
struct
amba_device
uart1_device
=
{
...
@@ -72,7 +71,6 @@ static struct amba_device uart1_device = {
...
@@ -72,7 +71,6 @@ static struct amba_device uart1_device = {
.
flags
=
IORESOURCE_MEM
,
.
flags
=
IORESOURCE_MEM
,
},
},
.
irq
=
{
IRQ_UARTINT1
,
NO_IRQ
},
.
irq
=
{
IRQ_UARTINT1
,
NO_IRQ
},
.
periphid
=
0x0041010
,
};
};
static
struct
amba_device
kmi0_device
=
{
static
struct
amba_device
kmi0_device
=
{
...
@@ -85,7 +83,6 @@ static struct amba_device kmi0_device = {
...
@@ -85,7 +83,6 @@ static struct amba_device kmi0_device = {
.
flags
=
IORESOURCE_MEM
,
.
flags
=
IORESOURCE_MEM
,
},
},
.
irq
=
{
IRQ_KMIINT0
,
NO_IRQ
},
.
irq
=
{
IRQ_KMIINT0
,
NO_IRQ
},
.
periphid
=
0x00041050
,
};
};
static
struct
amba_device
kmi1_device
=
{
static
struct
amba_device
kmi1_device
=
{
...
@@ -98,7 +95,6 @@ static struct amba_device kmi1_device = {
...
@@ -98,7 +95,6 @@ static struct amba_device kmi1_device = {
.
flags
=
IORESOURCE_MEM
,
.
flags
=
IORESOURCE_MEM
,
},
},
.
irq
=
{
IRQ_KMIINT1
,
NO_IRQ
},
.
irq
=
{
IRQ_KMIINT1
,
NO_IRQ
},
.
periphid
=
0x00041050
,
};
};
static
struct
amba_device
*
amba_devs
[]
__initdata
=
{
static
struct
amba_device
*
amba_devs
[]
__initdata
=
{
...
@@ -157,6 +153,19 @@ static int __init integrator_init(void)
...
@@ -157,6 +153,19 @@ static int __init integrator_init(void)
{
{
int
i
;
int
i
;
/*
* The Integrator/AP lacks necessary AMBA PrimeCell IDs, so we need to
* hard-code them. The Integator/CP and forward have proper cell IDs.
* Else we leave them undefined to the bus driver can autoprobe them.
*/
if
(
machine_is_integrator
())
{
rtc_device
.
periphid
=
0x00041030
;
uart0_device
.
periphid
=
0x00041010
;
uart1_device
.
periphid
=
0x00041010
;
kmi0_device
.
periphid
=
0x00041050
;
kmi1_device
.
periphid
=
0x00041050
;
}
for
(
i
=
0
;
i
<
ARRAY_SIZE
(
amba_devs
);
i
++
)
{
for
(
i
=
0
;
i
<
ARRAY_SIZE
(
amba_devs
);
i
++
)
{
struct
amba_device
*
d
=
amba_devs
[
i
];
struct
amba_device
*
d
=
amba_devs
[
i
];
amba_device_register
(
d
,
&
iomem_resource
);
amba_device_register
(
d
,
&
iomem_resource
);
...
...
arch/arm/mach-kirkwood/sheevaplug-setup.c
浏览文件 @
a32737e1
...
@@ -107,7 +107,7 @@ static void __init sheevaplug_init(void)
...
@@ -107,7 +107,7 @@ static void __init sheevaplug_init(void)
kirkwood_init
();
kirkwood_init
();
/* setup gpio pin select */
/* setup gpio pin select */
if
(
machine_is_
sheeva_esata
())
if
(
machine_is_
esata_sheevaplug
())
kirkwood_mpp_conf
(
sheeva_esata_mpp_config
);
kirkwood_mpp_conf
(
sheeva_esata_mpp_config
);
else
else
kirkwood_mpp_conf
(
sheevaplug_mpp_config
);
kirkwood_mpp_conf
(
sheevaplug_mpp_config
);
...
@@ -123,11 +123,11 @@ static void __init sheevaplug_init(void)
...
@@ -123,11 +123,11 @@ static void __init sheevaplug_init(void)
kirkwood_ge00_init
(
&
sheevaplug_ge00_data
);
kirkwood_ge00_init
(
&
sheevaplug_ge00_data
);
/* honor lower power consumption for plugs with out eSATA */
/* honor lower power consumption for plugs with out eSATA */
if
(
machine_is_
sheeva_esata
())
if
(
machine_is_
esata_sheevaplug
())
kirkwood_sata_init
(
&
sheeva_esata_sata_data
);
kirkwood_sata_init
(
&
sheeva_esata_sata_data
);
/* enable sd wp and sd cd on plugs with esata */
/* enable sd wp and sd cd on plugs with esata */
if
(
machine_is_
sheeva_esata
())
if
(
machine_is_
esata_sheevaplug
())
kirkwood_sdio_init
(
&
sheeva_esata_mvsdio_data
);
kirkwood_sdio_init
(
&
sheeva_esata_mvsdio_data
);
else
else
kirkwood_sdio_init
(
&
sheevaplug_mvsdio_data
);
kirkwood_sdio_init
(
&
sheevaplug_mvsdio_data
);
...
...
arch/arm/mach-orion5x/ts209-setup.c
浏览文件 @
a32737e1
...
@@ -178,7 +178,7 @@ static struct hw_pci qnap_ts209_pci __initdata = {
...
@@ -178,7 +178,7 @@ static struct hw_pci qnap_ts209_pci __initdata = {
static
int
__init
qnap_ts209_pci_init
(
void
)
static
int
__init
qnap_ts209_pci_init
(
void
)
{
{
if
(
machine_is_ts
_x
09
())
if
(
machine_is_ts
2
09
())
pci_common_init
(
&
qnap_ts209_pci
);
pci_common_init
(
&
qnap_ts209_pci
);
return
0
;
return
0
;
...
...
arch/arm/mach-shmobile/include/mach/gpio.h
浏览文件 @
a32737e1
...
@@ -12,8 +12,6 @@
...
@@ -12,8 +12,6 @@
#include <linux/kernel.h>
#include <linux/kernel.h>
#include <linux/errno.h>
#include <linux/errno.h>
#define ARCH_NR_GPIOS 1024
#include <linux/sh_pfc.h>
#include <linux/sh_pfc.h>
#ifdef CONFIG_GPIOLIB
#ifdef CONFIG_GPIOLIB
...
...
arch/arm/mach-ux500/include/mach/gpio.h
浏览文件 @
a32737e1
#ifndef __ASM_ARCH_GPIO_H
#ifndef __ASM_ARCH_GPIO_H
#define __ASM_ARCH_GPIO_H
#define __ASM_ARCH_GPIO_H
/*
* 288 (#267 is the highest one actually hooked up) onchip GPIOs, plus enough
* room for a couple of GPIO expanders.
*/
#define ARCH_NR_GPIOS 350
#endif
/* __ASM_ARCH_GPIO_H */
#endif
/* __ASM_ARCH_GPIO_H */
arch/arm/mm/fault.c
浏览文件 @
a32737e1
...
@@ -231,7 +231,7 @@ static inline bool access_error(unsigned int fsr, struct vm_area_struct *vma)
...
@@ -231,7 +231,7 @@ static inline bool access_error(unsigned int fsr, struct vm_area_struct *vma)
static
int
__kprobes
static
int
__kprobes
__do_page_fault
(
struct
mm_struct
*
mm
,
unsigned
long
addr
,
unsigned
int
fsr
,
__do_page_fault
(
struct
mm_struct
*
mm
,
unsigned
long
addr
,
unsigned
int
fsr
,
struct
task_struct
*
tsk
)
unsigned
int
flags
,
struct
task_struct
*
tsk
)
{
{
struct
vm_area_struct
*
vma
;
struct
vm_area_struct
*
vma
;
int
fault
;
int
fault
;
...
@@ -253,18 +253,7 @@ __do_page_fault(struct mm_struct *mm, unsigned long addr, unsigned int fsr,
...
@@ -253,18 +253,7 @@ __do_page_fault(struct mm_struct *mm, unsigned long addr, unsigned int fsr,
goto
out
;
goto
out
;
}
}
/*
return
handle_mm_fault
(
mm
,
vma
,
addr
&
PAGE_MASK
,
flags
);
* If for any reason at all we couldn't handle the fault, make
* sure we exit gracefully rather than endlessly redo the fault.
*/
fault
=
handle_mm_fault
(
mm
,
vma
,
addr
&
PAGE_MASK
,
(
fsr
&
FSR_WRITE
)
?
FAULT_FLAG_WRITE
:
0
);
if
(
unlikely
(
fault
&
VM_FAULT_ERROR
))
return
fault
;
if
(
fault
&
VM_FAULT_MAJOR
)
tsk
->
maj_flt
++
;
else
tsk
->
min_flt
++
;
return
fault
;
check_stack:
check_stack:
if
(
vma
->
vm_flags
&
VM_GROWSDOWN
&&
!
expand_stack
(
vma
,
addr
))
if
(
vma
->
vm_flags
&
VM_GROWSDOWN
&&
!
expand_stack
(
vma
,
addr
))
...
@@ -279,6 +268,9 @@ do_page_fault(unsigned long addr, unsigned int fsr, struct pt_regs *regs)
...
@@ -279,6 +268,9 @@ do_page_fault(unsigned long addr, unsigned int fsr, struct pt_regs *regs)
struct
task_struct
*
tsk
;
struct
task_struct
*
tsk
;
struct
mm_struct
*
mm
;
struct
mm_struct
*
mm
;
int
fault
,
sig
,
code
;
int
fault
,
sig
,
code
;
int
write
=
fsr
&
FSR_WRITE
;
unsigned
int
flags
=
FAULT_FLAG_ALLOW_RETRY
|
FAULT_FLAG_KILLABLE
|
(
write
?
FAULT_FLAG_WRITE
:
0
);
if
(
notify_page_fault
(
regs
,
fsr
))
if
(
notify_page_fault
(
regs
,
fsr
))
return
0
;
return
0
;
...
@@ -305,6 +297,7 @@ do_page_fault(unsigned long addr, unsigned int fsr, struct pt_regs *regs)
...
@@ -305,6 +297,7 @@ do_page_fault(unsigned long addr, unsigned int fsr, struct pt_regs *regs)
if
(
!
down_read_trylock
(
&
mm
->
mmap_sem
))
{
if
(
!
down_read_trylock
(
&
mm
->
mmap_sem
))
{
if
(
!
user_mode
(
regs
)
&&
!
search_exception_tables
(
regs
->
ARM_pc
))
if
(
!
user_mode
(
regs
)
&&
!
search_exception_tables
(
regs
->
ARM_pc
))
goto
no_context
;
goto
no_context
;
retry:
down_read
(
&
mm
->
mmap_sem
);
down_read
(
&
mm
->
mmap_sem
);
}
else
{
}
else
{
/*
/*
...
@@ -320,14 +313,41 @@ do_page_fault(unsigned long addr, unsigned int fsr, struct pt_regs *regs)
...
@@ -320,14 +313,41 @@ do_page_fault(unsigned long addr, unsigned int fsr, struct pt_regs *regs)
#endif
#endif
}
}
fault
=
__do_page_fault
(
mm
,
addr
,
fsr
,
tsk
);
fault
=
__do_page_fault
(
mm
,
addr
,
fsr
,
flags
,
tsk
);
up_read
(
&
mm
->
mmap_sem
);
/* If we need to retry but a fatal signal is pending, handle the
* signal first. We do not need to release the mmap_sem because
* it would already be released in __lock_page_or_retry in
* mm/filemap.c. */
if
((
fault
&
VM_FAULT_RETRY
)
&&
fatal_signal_pending
(
current
))
return
0
;
/*
* Major/minor page fault accounting is only done on the
* initial attempt. If we go through a retry, it is extremely
* likely that the page will be found in page cache at that point.
*/
perf_sw_event
(
PERF_COUNT_SW_PAGE_FAULTS
,
1
,
regs
,
addr
);
perf_sw_event
(
PERF_COUNT_SW_PAGE_FAULTS
,
1
,
regs
,
addr
);
if
(
fault
&
VM_FAULT_MAJOR
)
if
(
flags
&
FAULT_FLAG_ALLOW_RETRY
)
{
perf_sw_event
(
PERF_COUNT_SW_PAGE_FAULTS_MAJ
,
1
,
regs
,
addr
);
if
(
fault
&
VM_FAULT_MAJOR
)
{
else
if
(
fault
&
VM_FAULT_MINOR
)
tsk
->
maj_flt
++
;
perf_sw_event
(
PERF_COUNT_SW_PAGE_FAULTS_MIN
,
1
,
regs
,
addr
);
perf_sw_event
(
PERF_COUNT_SW_PAGE_FAULTS_MAJ
,
1
,
regs
,
addr
);
}
else
{
tsk
->
min_flt
++
;
perf_sw_event
(
PERF_COUNT_SW_PAGE_FAULTS_MIN
,
1
,
regs
,
addr
);
}
if
(
fault
&
VM_FAULT_RETRY
)
{
/* Clear FAULT_FLAG_ALLOW_RETRY to avoid any risk
* of starvation. */
flags
&=
~
FAULT_FLAG_ALLOW_RETRY
;
goto
retry
;
}
}
up_read
(
&
mm
->
mmap_sem
);
/*
/*
* Handle the "normal" case first - VM_FAULT_MAJOR / VM_FAULT_MINOR
* Handle the "normal" case first - VM_FAULT_MAJOR / VM_FAULT_MINOR
...
...
arch/arm/mm/mmap.c
浏览文件 @
a32737e1
...
@@ -11,10 +11,49 @@
...
@@ -11,10 +11,49 @@
#include <linux/random.h>
#include <linux/random.h>
#include <asm/cachetype.h>
#include <asm/cachetype.h>
static
inline
unsigned
long
COLOUR_ALIGN_DOWN
(
unsigned
long
addr
,
unsigned
long
pgoff
)
{
unsigned
long
base
=
addr
&
~
(
SHMLBA
-
1
);
unsigned
long
off
=
(
pgoff
<<
PAGE_SHIFT
)
&
(
SHMLBA
-
1
);
if
(
base
+
off
<=
addr
)
return
base
+
off
;
return
base
-
off
;
}
#define COLOUR_ALIGN(addr,pgoff) \
#define COLOUR_ALIGN(addr,pgoff) \
((((addr)+SHMLBA-1)&~(SHMLBA-1)) + \
((((addr)+SHMLBA-1)&~(SHMLBA-1)) + \
(((pgoff)<<PAGE_SHIFT) & (SHMLBA-1)))
(((pgoff)<<PAGE_SHIFT) & (SHMLBA-1)))
/* gap between mmap and stack */
#define MIN_GAP (128*1024*1024UL)
#define MAX_GAP ((TASK_SIZE)/6*5)
static
int
mmap_is_legacy
(
void
)
{
if
(
current
->
personality
&
ADDR_COMPAT_LAYOUT
)
return
1
;
if
(
rlimit
(
RLIMIT_STACK
)
==
RLIM_INFINITY
)
return
1
;
return
sysctl_legacy_va_layout
;
}
static
unsigned
long
mmap_base
(
unsigned
long
rnd
)
{
unsigned
long
gap
=
rlimit
(
RLIMIT_STACK
);
if
(
gap
<
MIN_GAP
)
gap
=
MIN_GAP
;
else
if
(
gap
>
MAX_GAP
)
gap
=
MAX_GAP
;
return
PAGE_ALIGN
(
TASK_SIZE
-
gap
-
rnd
);
}
/*
/*
* We need to ensure that shared mappings are correctly aligned to
* We need to ensure that shared mappings are correctly aligned to
* avoid aliasing issues with VIPT caches. We need to ensure that
* avoid aliasing issues with VIPT caches. We need to ensure that
...
@@ -68,13 +107,9 @@ arch_get_unmapped_area(struct file *filp, unsigned long addr,
...
@@ -68,13 +107,9 @@ arch_get_unmapped_area(struct file *filp, unsigned long addr,
if
(
len
>
mm
->
cached_hole_size
)
{
if
(
len
>
mm
->
cached_hole_size
)
{
start_addr
=
addr
=
mm
->
free_area_cache
;
start_addr
=
addr
=
mm
->
free_area_cache
;
}
else
{
}
else
{
start_addr
=
addr
=
TASK_UNMAPPED_BASE
;
start_addr
=
addr
=
mm
->
mmap_base
;
mm
->
cached_hole_size
=
0
;
mm
->
cached_hole_size
=
0
;
}
}
/* 8 bits of randomness in 20 address space bits */
if
((
current
->
flags
&
PF_RANDOMIZE
)
&&
!
(
current
->
personality
&
ADDR_NO_RANDOMIZE
))
addr
+=
(
get_random_int
()
%
(
1
<<
8
))
<<
PAGE_SHIFT
;
full_search:
full_search:
if
(
do_align
)
if
(
do_align
)
...
@@ -111,6 +146,134 @@ arch_get_unmapped_area(struct file *filp, unsigned long addr,
...
@@ -111,6 +146,134 @@ arch_get_unmapped_area(struct file *filp, unsigned long addr,
}
}
}
}
unsigned
long
arch_get_unmapped_area_topdown
(
struct
file
*
filp
,
const
unsigned
long
addr0
,
const
unsigned
long
len
,
const
unsigned
long
pgoff
,
const
unsigned
long
flags
)
{
struct
vm_area_struct
*
vma
;
struct
mm_struct
*
mm
=
current
->
mm
;
unsigned
long
addr
=
addr0
;
int
do_align
=
0
;
int
aliasing
=
cache_is_vipt_aliasing
();
/*
* We only need to do colour alignment if either the I or D
* caches alias.
*/
if
(
aliasing
)
do_align
=
filp
||
(
flags
&
MAP_SHARED
);
/* requested length too big for entire address space */
if
(
len
>
TASK_SIZE
)
return
-
ENOMEM
;
if
(
flags
&
MAP_FIXED
)
{
if
(
aliasing
&&
flags
&
MAP_SHARED
&&
(
addr
-
(
pgoff
<<
PAGE_SHIFT
))
&
(
SHMLBA
-
1
))
return
-
EINVAL
;
return
addr
;
}
/* requesting a specific address */
if
(
addr
)
{
if
(
do_align
)
addr
=
COLOUR_ALIGN
(
addr
,
pgoff
);
else
addr
=
PAGE_ALIGN
(
addr
);
vma
=
find_vma
(
mm
,
addr
);
if
(
TASK_SIZE
-
len
>=
addr
&&
(
!
vma
||
addr
+
len
<=
vma
->
vm_start
))
return
addr
;
}
/* check if free_area_cache is useful for us */
if
(
len
<=
mm
->
cached_hole_size
)
{
mm
->
cached_hole_size
=
0
;
mm
->
free_area_cache
=
mm
->
mmap_base
;
}
/* either no address requested or can't fit in requested address hole */
addr
=
mm
->
free_area_cache
;
if
(
do_align
)
{
unsigned
long
base
=
COLOUR_ALIGN_DOWN
(
addr
-
len
,
pgoff
);
addr
=
base
+
len
;
}
/* make sure it can fit in the remaining address space */
if
(
addr
>
len
)
{
vma
=
find_vma
(
mm
,
addr
-
len
);
if
(
!
vma
||
addr
<=
vma
->
vm_start
)
/* remember the address as a hint for next time */
return
(
mm
->
free_area_cache
=
addr
-
len
);
}
if
(
mm
->
mmap_base
<
len
)
goto
bottomup
;
addr
=
mm
->
mmap_base
-
len
;
if
(
do_align
)
addr
=
COLOUR_ALIGN_DOWN
(
addr
,
pgoff
);
do
{
/*
* Lookup failure means no vma is above this address,
* else if new region fits below vma->vm_start,
* return with success:
*/
vma
=
find_vma
(
mm
,
addr
);
if
(
!
vma
||
addr
+
len
<=
vma
->
vm_start
)
/* remember the address as a hint for next time */
return
(
mm
->
free_area_cache
=
addr
);
/* remember the largest hole we saw so far */
if
(
addr
+
mm
->
cached_hole_size
<
vma
->
vm_start
)
mm
->
cached_hole_size
=
vma
->
vm_start
-
addr
;
/* try just below the current vma->vm_start */
addr
=
vma
->
vm_start
-
len
;
if
(
do_align
)
addr
=
COLOUR_ALIGN_DOWN
(
addr
,
pgoff
);
}
while
(
len
<
vma
->
vm_start
);
bottomup:
/*
* A failed mmap() very likely causes application failure,
* so fall back to the bottom-up function here. This scenario
* can happen with large stack limits and large mmap()
* allocations.
*/
mm
->
cached_hole_size
=
~
0UL
;
mm
->
free_area_cache
=
TASK_UNMAPPED_BASE
;
addr
=
arch_get_unmapped_area
(
filp
,
addr0
,
len
,
pgoff
,
flags
);
/*
* Restore the topdown base:
*/
mm
->
free_area_cache
=
mm
->
mmap_base
;
mm
->
cached_hole_size
=
~
0UL
;
return
addr
;
}
void
arch_pick_mmap_layout
(
struct
mm_struct
*
mm
)
{
unsigned
long
random_factor
=
0UL
;
/* 8 bits of randomness in 20 address space bits */
if
((
current
->
flags
&
PF_RANDOMIZE
)
&&
!
(
current
->
personality
&
ADDR_NO_RANDOMIZE
))
random_factor
=
(
get_random_int
()
%
(
1
<<
8
))
<<
PAGE_SHIFT
;
if
(
mmap_is_legacy
())
{
mm
->
mmap_base
=
TASK_UNMAPPED_BASE
+
random_factor
;
mm
->
get_unmapped_area
=
arch_get_unmapped_area
;
mm
->
unmap_area
=
arch_unmap_area
;
}
else
{
mm
->
mmap_base
=
mmap_base
(
random_factor
);
mm
->
get_unmapped_area
=
arch_get_unmapped_area_topdown
;
mm
->
unmap_area
=
arch_unmap_area_topdown
;
}
}
/*
/*
* You really shouldn't be using read() or write() on /dev/mem. This
* You really shouldn't be using read() or write() on /dev/mem. This
...
...
arch/arm/mm/proc-v7.S
浏览文件 @
a32737e1
...
@@ -284,6 +284,7 @@ __v7_ca5mp_setup:
...
@@ -284,6 +284,7 @@ __v7_ca5mp_setup:
__v7_ca9mp_setup
:
__v7_ca9mp_setup
:
mov
r10
,
#(
1
<<
0
)
@
TLB
ops
broadcasting
mov
r10
,
#(
1
<<
0
)
@
TLB
ops
broadcasting
b
1
f
b
1
f
__v7_ca7mp_setup
:
__v7_ca15mp_setup
:
__v7_ca15mp_setup
:
mov
r10
,
#
0
mov
r10
,
#
0
1
:
1
:
...
@@ -464,6 +465,16 @@ __v7_ca5mp_proc_info:
...
@@ -464,6 +465,16 @@ __v7_ca5mp_proc_info:
__v7_proc
__v7_ca5mp_setup
__v7_proc
__v7_ca5mp_setup
.
size
__v7_ca5mp_proc_info
,
.
-
__v7_ca5mp_proc_info
.
size
__v7_ca5mp_proc_info
,
.
-
__v7_ca5mp_proc_info
/
*
*
ARM
Ltd
.
Cortex
A7
processor
.
*/
.
type
__v7_ca7mp_proc_info
,
#
object
__v7_ca7mp_proc_info
:
.
long
0x410fc070
.
long
0xff0ffff0
__v7_proc
__v7_ca7mp_setup
,
hwcaps
=
HWCAP_IDIV
.
size
__v7_ca7mp_proc_info
,
.
-
__v7_ca7mp_proc_info
/
*
/
*
*
ARM
Ltd
.
Cortex
A9
processor
.
*
ARM
Ltd
.
Cortex
A9
processor
.
*/
*/
...
...
arch/arm/nwfpe/entry.S
浏览文件 @
a32737e1
...
@@ -20,6 +20,8 @@
...
@@ -20,6 +20,8 @@
Foundation
,
Inc
.
,
675
Mass
Ave
,
Cambridge
,
MA
02139
,
USA
.
Foundation
,
Inc
.
,
675
Mass
Ave
,
Cambridge
,
MA
02139
,
USA
.
*/
*/
#include <asm/opcodes.h>
/*
This
is
the
kernel
's entry point into the floating point emulator.
/*
This
is
the
kernel
's entry point into the floating point emulator.
It
is
called
from
the
kernel
with
code
similar
to
this
:
It
is
called
from
the
kernel
with
code
similar
to
this
:
...
@@ -81,11 +83,11 @@ nwfpe_enter:
...
@@ -81,11 +83,11 @@ nwfpe_enter:
mov
r6
,
r0
@
save
the
opcode
mov
r6
,
r0
@
save
the
opcode
emulate
:
emulate
:
ldr
r1
,
[
sp
,
#
S_PSR
]
@
fetch
the
PSR
ldr
r1
,
[
sp
,
#
S_PSR
]
@
fetch
the
PSR
bl
checkCondition
@
check
the
condition
bl
arm_check_condition
@
check
the
condition
cmp
r0
,
#
0
@
r0
=
0
==>
condition
failed
cmp
r0
,
#
ARM_OPCODE_CONDTEST_PASS
@
condition
passed
?
@
if
condition
code
failed
to
match
,
next
insn
@
if
condition
code
failed
to
match
,
next
insn
b
eq
next
@
get
the
next
instruction
;
b
ne
next
@
get
the
next
instruction
;
mov
r0
,
r6
@
prepare
for
EmulateAll
()
mov
r0
,
r6
@
prepare
for
EmulateAll
()
bl
EmulateAll
@
emulate
the
instruction
bl
EmulateAll
@
emulate
the
instruction
...
...
arch/arm/nwfpe/fpopcode.c
浏览文件 @
a32737e1
...
@@ -61,29 +61,3 @@ const float32 float32Constant[] = {
...
@@ -61,29 +61,3 @@ const float32 float32Constant[] = {
0x41200000
/* single 10.0 */
0x41200000
/* single 10.0 */
};
};
/* condition code lookup table
index into the table is test code: EQ, NE, ... LT, GT, AL, NV
bit position in short is condition code: NZCV */
static
const
unsigned
short
aCC
[
16
]
=
{
0xF0F0
,
// EQ == Z set
0x0F0F
,
// NE
0xCCCC
,
// CS == C set
0x3333
,
// CC
0xFF00
,
// MI == N set
0x00FF
,
// PL
0xAAAA
,
// VS == V set
0x5555
,
// VC
0x0C0C
,
// HI == C set && Z clear
0xF3F3
,
// LS == C clear || Z set
0xAA55
,
// GE == (N==V)
0x55AA
,
// LT == (N!=V)
0x0A05
,
// GT == (!Z && (N==V))
0xF5FA
,
// LE == (Z || (N!=V))
0xFFFF
,
// AL always
0
// NV
};
unsigned
int
checkCondition
(
const
unsigned
int
opcode
,
const
unsigned
int
ccodes
)
{
return
(
aCC
[
opcode
>>
28
]
>>
(
ccodes
>>
28
))
&
1
;
}
arch/arm/nwfpe/fpopcode.h
浏览文件 @
a32737e1
...
@@ -475,9 +475,6 @@ static inline unsigned int getDestinationSize(const unsigned int opcode)
...
@@ -475,9 +475,6 @@ static inline unsigned int getDestinationSize(const unsigned int opcode)
return
(
nRc
);
return
(
nRc
);
}
}
extern
unsigned
int
checkCondition
(
const
unsigned
int
opcode
,
const
unsigned
int
ccodes
);
extern
const
float64
float64Constant
[];
extern
const
float64
float64Constant
[];
extern
const
float32
float32Constant
[];
extern
const
float32
float32Constant
[];
...
...
arch/arm/tools/mach-types
浏览文件 @
a32737e1
此差异已折叠。
点击以展开。
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录