mirror of https://gitee.com/openkylin/linux.git
Merge branches 'fixes' and 'misc'
Fix up the conflict between "VDSO: Drop implicit common-page-size linker flag" and "vdso: pass --be8 to linker if necessary" Signed-off-by: Russell King <rmk+kernel@armlinux.org.uk>
This commit is contained in:
commit
5ccd3bd992
|
@ -1175,6 +1175,14 @@ config ARM_ERRATA_825619
|
||||||
DMB NSHST or DMB ISHST instruction followed by a mix of Cacheable
|
DMB NSHST or DMB ISHST instruction followed by a mix of Cacheable
|
||||||
and Device/Strongly-Ordered loads and stores might cause deadlock
|
and Device/Strongly-Ordered loads and stores might cause deadlock
|
||||||
|
|
||||||
|
config ARM_ERRATA_857271
|
||||||
|
bool "ARM errata: A12: CPU might deadlock under some very rare internal conditions"
|
||||||
|
depends on CPU_V7
|
||||||
|
help
|
||||||
|
This option enables the workaround for the 857271 Cortex-A12
|
||||||
|
(all revs) erratum. Under very rare timing conditions, the CPU might
|
||||||
|
hang. The workaround is expected to have a < 1% performance impact.
|
||||||
|
|
||||||
config ARM_ERRATA_852421
|
config ARM_ERRATA_852421
|
||||||
bool "ARM errata: A17: DMB ST might fail to create order between stores"
|
bool "ARM errata: A17: DMB ST might fail to create order between stores"
|
||||||
depends on CPU_V7
|
depends on CPU_V7
|
||||||
|
@ -1196,6 +1204,16 @@ config ARM_ERRATA_852423
|
||||||
config option from the A12 erratum due to the way errata are checked
|
config option from the A12 erratum due to the way errata are checked
|
||||||
for and handled.
|
for and handled.
|
||||||
|
|
||||||
|
config ARM_ERRATA_857272
|
||||||
|
bool "ARM errata: A17: CPU might deadlock under some very rare internal conditions"
|
||||||
|
depends on CPU_V7
|
||||||
|
help
|
||||||
|
This option enables the workaround for the 857272 Cortex-A17 erratum.
|
||||||
|
This erratum is not known to be fixed in any A17 revision.
|
||||||
|
This is identical to Cortex-A12 erratum 857271. It is a separate
|
||||||
|
config option from the A12 erratum due to the way errata are checked
|
||||||
|
for and handled.
|
||||||
|
|
||||||
endmenu
|
endmenu
|
||||||
|
|
||||||
source "arch/arm/common/Kconfig"
|
source "arch/arm/common/Kconfig"
|
||||||
|
@ -1232,6 +1250,18 @@ config PCI_HOST_ITE8152
|
||||||
default y
|
default y
|
||||||
select DMABOUNCE
|
select DMABOUNCE
|
||||||
|
|
||||||
|
config ARM_ERRATA_814220
|
||||||
|
bool "ARM errata: Cache maintenance by set/way operations can execute out of order"
|
||||||
|
depends on CPU_V7
|
||||||
|
help
|
||||||
|
The v7 ARM states that all cache and branch predictor maintenance
|
||||||
|
operations that do not specify an address execute, relative to
|
||||||
|
each other, in program order.
|
||||||
|
However, because of this erratum, an L2 set/way cache maintenance
|
||||||
|
operation can overtake an L1 set/way cache maintenance operation.
|
||||||
|
This ERRATA only affected the Cortex-A7 and present in r0p2, r0p3,
|
||||||
|
r0p4, r0p5.
|
||||||
|
|
||||||
endmenu
|
endmenu
|
||||||
|
|
||||||
menu "Kernel Features"
|
menu "Kernel Features"
|
||||||
|
|
|
@ -9,6 +9,7 @@ CONFIG_MODULE_UNLOAD=y
|
||||||
CONFIG_PARTITION_ADVANCED=y
|
CONFIG_PARTITION_ADVANCED=y
|
||||||
CONFIG_ARCH_EXYNOS=y
|
CONFIG_ARCH_EXYNOS=y
|
||||||
CONFIG_ARCH_EXYNOS3=y
|
CONFIG_ARCH_EXYNOS3=y
|
||||||
|
CONFIG_CPU_ICACHE_MISMATCH_WORKAROUND=y
|
||||||
CONFIG_SMP=y
|
CONFIG_SMP=y
|
||||||
CONFIG_BIG_LITTLE=y
|
CONFIG_BIG_LITTLE=y
|
||||||
CONFIG_NR_CPUS=8
|
CONFIG_NR_CPUS=8
|
||||||
|
|
|
@ -85,7 +85,7 @@ void hook_ifault_code(int nr, int (*fn)(unsigned long, unsigned int,
|
||||||
extern asmlinkage void c_backtrace(unsigned long fp, int pmode);
|
extern asmlinkage void c_backtrace(unsigned long fp, int pmode);
|
||||||
|
|
||||||
struct mm_struct;
|
struct mm_struct;
|
||||||
extern void show_pte(struct mm_struct *mm, unsigned long addr);
|
void show_pte(const char *lvl, struct mm_struct *mm, unsigned long addr);
|
||||||
extern void __show_regs(struct pt_regs *);
|
extern void __show_regs(struct pt_regs *);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -479,4 +479,11 @@ static inline void __sync_cache_range_r(volatile void *p, size_t size)
|
||||||
void flush_uprobe_xol_access(struct page *page, unsigned long uaddr,
|
void flush_uprobe_xol_access(struct page *page, unsigned long uaddr,
|
||||||
void *kaddr, unsigned long len);
|
void *kaddr, unsigned long len);
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef CONFIG_CPU_ICACHE_MISMATCH_WORKAROUND
|
||||||
|
void check_cpu_icache_size(int cpuid);
|
||||||
|
#else
|
||||||
|
static inline void check_cpu_icache_size(int cpuid) { }
|
||||||
|
#endif
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -375,6 +375,7 @@ static void smp_store_cpu_info(unsigned int cpuid)
|
||||||
cpu_info->cpuid = read_cpuid_id();
|
cpu_info->cpuid = read_cpuid_id();
|
||||||
|
|
||||||
store_cpu_topology(cpuid);
|
store_cpu_topology(cpuid);
|
||||||
|
check_cpu_icache_size(cpuid);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -725,10 +725,11 @@ baddataabort(int code, unsigned long instr, struct pt_regs *regs)
|
||||||
|
|
||||||
#ifdef CONFIG_DEBUG_USER
|
#ifdef CONFIG_DEBUG_USER
|
||||||
if (user_debug & UDBG_BADABORT) {
|
if (user_debug & UDBG_BADABORT) {
|
||||||
|
pr_err("8<--- cut here ---\n");
|
||||||
pr_err("[%d] %s: bad data abort: code %d instr 0x%08lx\n",
|
pr_err("[%d] %s: bad data abort: code %d instr 0x%08lx\n",
|
||||||
task_pid_nr(current), current->comm, code, instr);
|
task_pid_nr(current), current->comm, code, instr);
|
||||||
dump_instr(KERN_ERR, regs);
|
dump_instr(KERN_ERR, regs);
|
||||||
show_pte(current->mm, addr);
|
show_pte(KERN_ERR, current->mm, addr);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
|
@ -44,6 +44,7 @@ if ARCH_MULTI_V7
|
||||||
|
|
||||||
config MACH_STM32MP157
|
config MACH_STM32MP157
|
||||||
bool "STMicroelectronics STM32MP157"
|
bool "STMicroelectronics STM32MP157"
|
||||||
|
select ARM_ERRATA_814220
|
||||||
default y
|
default y
|
||||||
|
|
||||||
endif # ARMv7-A
|
endif # ARMv7-A
|
||||||
|
|
|
@ -780,6 +780,14 @@ config CPU_ICACHE_DISABLE
|
||||||
Say Y here to disable the processor instruction cache. Unless
|
Say Y here to disable the processor instruction cache. Unless
|
||||||
you have a reason not to or are unsure, say N.
|
you have a reason not to or are unsure, say N.
|
||||||
|
|
||||||
|
config CPU_ICACHE_MISMATCH_WORKAROUND
|
||||||
|
bool "Workaround for I-Cache line size mismatch between CPU cores"
|
||||||
|
depends on SMP && CPU_V7
|
||||||
|
help
|
||||||
|
Some big.LITTLE systems have I-Cache line size mismatch between
|
||||||
|
LITTLE and big cores. Say Y here to enable a workaround for
|
||||||
|
proper I-Cache support on such systems. If unsure, say N.
|
||||||
|
|
||||||
config CPU_DCACHE_DISABLE
|
config CPU_DCACHE_DISABLE
|
||||||
bool "Disable D-Cache (C-bit)"
|
bool "Disable D-Cache (C-bit)"
|
||||||
depends on (CPU_CP15 && !SMP) || CPU_V7M
|
depends on (CPU_CP15 && !SMP) || CPU_V7M
|
||||||
|
|
|
@ -19,6 +19,14 @@
|
||||||
|
|
||||||
#include "proc-macros.S"
|
#include "proc-macros.S"
|
||||||
|
|
||||||
|
#ifdef CONFIG_CPU_ICACHE_MISMATCH_WORKAROUND
|
||||||
|
.globl icache_size
|
||||||
|
.data
|
||||||
|
.align 2
|
||||||
|
icache_size:
|
||||||
|
.long 64
|
||||||
|
.text
|
||||||
|
#endif
|
||||||
/*
|
/*
|
||||||
* The secondary kernel init calls v7_flush_dcache_all before it enables
|
* The secondary kernel init calls v7_flush_dcache_all before it enables
|
||||||
* the L1; however, the L1 comes out of reset in an undefined state, so
|
* the L1; however, the L1 comes out of reset in an undefined state, so
|
||||||
|
@ -163,6 +171,9 @@ loop2:
|
||||||
skip:
|
skip:
|
||||||
add r10, r10, #2 @ increment cache number
|
add r10, r10, #2 @ increment cache number
|
||||||
cmp r3, r10
|
cmp r3, r10
|
||||||
|
#ifdef CONFIG_ARM_ERRATA_814220
|
||||||
|
dsb
|
||||||
|
#endif
|
||||||
bgt flush_levels
|
bgt flush_levels
|
||||||
finished:
|
finished:
|
||||||
mov r10, #0 @ switch back to cache level 0
|
mov r10, #0 @ switch back to cache level 0
|
||||||
|
@ -284,7 +295,12 @@ ENTRY(v7_coherent_user_range)
|
||||||
cmp r12, r1
|
cmp r12, r1
|
||||||
blo 1b
|
blo 1b
|
||||||
dsb ishst
|
dsb ishst
|
||||||
|
#ifdef CONFIG_CPU_ICACHE_MISMATCH_WORKAROUND
|
||||||
|
ldr r3, =icache_size
|
||||||
|
ldr r2, [r3, #0]
|
||||||
|
#else
|
||||||
icache_line_size r2, r3
|
icache_line_size r2, r3
|
||||||
|
#endif
|
||||||
sub r3, r2, #1
|
sub r3, r2, #1
|
||||||
bic r12, r0, r3
|
bic r12, r0, r3
|
||||||
2:
|
2:
|
||||||
|
|
|
@ -56,17 +56,16 @@ static inline int notify_page_fault(struct pt_regs *regs, unsigned int fsr)
|
||||||
* This is useful to dump out the page tables associated with
|
* This is useful to dump out the page tables associated with
|
||||||
* 'addr' in mm 'mm'.
|
* 'addr' in mm 'mm'.
|
||||||
*/
|
*/
|
||||||
void show_pte(struct mm_struct *mm, unsigned long addr)
|
void show_pte(const char *lvl, struct mm_struct *mm, unsigned long addr)
|
||||||
{
|
{
|
||||||
pgd_t *pgd;
|
pgd_t *pgd;
|
||||||
|
|
||||||
if (!mm)
|
if (!mm)
|
||||||
mm = &init_mm;
|
mm = &init_mm;
|
||||||
|
|
||||||
pr_alert("pgd = %p\n", mm->pgd);
|
printk("%spgd = %p\n", lvl, mm->pgd);
|
||||||
pgd = pgd_offset(mm, addr);
|
pgd = pgd_offset(mm, addr);
|
||||||
pr_alert("[%08lx] *pgd=%08llx",
|
printk("%s[%08lx] *pgd=%08llx", lvl, addr, (long long)pgd_val(*pgd));
|
||||||
addr, (long long)pgd_val(*pgd));
|
|
||||||
|
|
||||||
do {
|
do {
|
||||||
pud_t *pud;
|
pud_t *pud;
|
||||||
|
@ -121,7 +120,7 @@ void show_pte(struct mm_struct *mm, unsigned long addr)
|
||||||
pr_cont("\n");
|
pr_cont("\n");
|
||||||
}
|
}
|
||||||
#else /* CONFIG_MMU */
|
#else /* CONFIG_MMU */
|
||||||
void show_pte(struct mm_struct *mm, unsigned long addr)
|
void show_pte(const char *lvl, struct mm_struct *mm, unsigned long addr)
|
||||||
{ }
|
{ }
|
||||||
#endif /* CONFIG_MMU */
|
#endif /* CONFIG_MMU */
|
||||||
|
|
||||||
|
@ -142,11 +141,12 @@ __do_kernel_fault(struct mm_struct *mm, unsigned long addr, unsigned int fsr,
|
||||||
* No handler, we'll have to terminate things with extreme prejudice.
|
* No handler, we'll have to terminate things with extreme prejudice.
|
||||||
*/
|
*/
|
||||||
bust_spinlocks(1);
|
bust_spinlocks(1);
|
||||||
|
pr_alert("8<--- cut here ---\n");
|
||||||
pr_alert("Unable to handle kernel %s at virtual address %08lx\n",
|
pr_alert("Unable to handle kernel %s at virtual address %08lx\n",
|
||||||
(addr < PAGE_SIZE) ? "NULL pointer dereference" :
|
(addr < PAGE_SIZE) ? "NULL pointer dereference" :
|
||||||
"paging request", addr);
|
"paging request", addr);
|
||||||
|
|
||||||
show_pte(mm, addr);
|
show_pte(KERN_ALERT, mm, addr);
|
||||||
die("Oops", regs, fsr);
|
die("Oops", regs, fsr);
|
||||||
bust_spinlocks(0);
|
bust_spinlocks(0);
|
||||||
do_exit(SIGKILL);
|
do_exit(SIGKILL);
|
||||||
|
@ -167,9 +167,10 @@ __do_user_fault(struct task_struct *tsk, unsigned long addr,
|
||||||
#ifdef CONFIG_DEBUG_USER
|
#ifdef CONFIG_DEBUG_USER
|
||||||
if (((user_debug & UDBG_SEGV) && (sig == SIGSEGV)) ||
|
if (((user_debug & UDBG_SEGV) && (sig == SIGSEGV)) ||
|
||||||
((user_debug & UDBG_BUS) && (sig == SIGBUS))) {
|
((user_debug & UDBG_BUS) && (sig == SIGBUS))) {
|
||||||
printk(KERN_DEBUG "%s: unhandled page fault (%d) at 0x%08lx, code 0x%03x\n",
|
pr_err("8<--- cut here ---\n");
|
||||||
|
pr_err("%s: unhandled page fault (%d) at 0x%08lx, code 0x%03x\n",
|
||||||
tsk->comm, sig, addr, fsr);
|
tsk->comm, sig, addr, fsr);
|
||||||
show_pte(tsk->mm, addr);
|
show_pte(KERN_ERR, tsk->mm, addr);
|
||||||
show_regs(regs);
|
show_regs(regs);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
@ -556,9 +557,10 @@ do_DataAbort(unsigned long addr, unsigned int fsr, struct pt_regs *regs)
|
||||||
if (!inf->fn(addr, fsr & ~FSR_LNX_PF, regs))
|
if (!inf->fn(addr, fsr & ~FSR_LNX_PF, regs))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
pr_alert("8<--- cut here ---\n");
|
||||||
pr_alert("Unhandled fault: %s (0x%03x) at 0x%08lx\n",
|
pr_alert("Unhandled fault: %s (0x%03x) at 0x%08lx\n",
|
||||||
inf->name, fsr, addr);
|
inf->name, fsr, addr);
|
||||||
show_pte(current->mm, addr);
|
show_pte(KERN_ALERT, current->mm, addr);
|
||||||
|
|
||||||
arm_notify_die("", regs, inf->sig, inf->code, (void __user *)addr,
|
arm_notify_die("", regs, inf->sig, inf->code, (void __user *)addr,
|
||||||
fsr, 0);
|
fsr, 0);
|
||||||
|
|
|
@ -242,6 +242,22 @@ static void __init arm_initrd_init(void)
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef CONFIG_CPU_ICACHE_MISMATCH_WORKAROUND
|
||||||
|
void check_cpu_icache_size(int cpuid)
|
||||||
|
{
|
||||||
|
u32 size, ctr;
|
||||||
|
|
||||||
|
asm("mrc p15, 0, %0, c0, c0, 1" : "=r" (ctr));
|
||||||
|
|
||||||
|
size = 1 << ((ctr & 0xf) + 2);
|
||||||
|
if (cpuid != 0 && icache_size != size)
|
||||||
|
pr_info("CPU%u: detected I-Cache line size mismatch, workaround enabled\n",
|
||||||
|
cpuid);
|
||||||
|
if (icache_size > size)
|
||||||
|
icache_size = size;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
void __init arm_memblock_init(const struct machine_desc *mdesc)
|
void __init arm_memblock_init(const struct machine_desc *mdesc)
|
||||||
{
|
{
|
||||||
/* Register the kernel text, kernel data and initrd with memblock. */
|
/* Register the kernel text, kernel data and initrd with memblock. */
|
||||||
|
@ -450,12 +466,6 @@ static void __init free_highpages(void)
|
||||||
*/
|
*/
|
||||||
void __init mem_init(void)
|
void __init mem_init(void)
|
||||||
{
|
{
|
||||||
#ifdef CONFIG_HAVE_TCM
|
|
||||||
/* These pointers are filled in on TCM detection */
|
|
||||||
extern u32 dtcm_end;
|
|
||||||
extern u32 itcm_end;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
set_max_mapnr(pfn_to_page(max_pfn) - mem_map);
|
set_max_mapnr(pfn_to_page(max_pfn) - mem_map);
|
||||||
|
|
||||||
/* this will put all unused low memory onto the freelists */
|
/* this will put all unused low memory onto the freelists */
|
||||||
|
|
|
@ -8,6 +8,8 @@
|
||||||
/* the upper-most page table pointer */
|
/* the upper-most page table pointer */
|
||||||
extern pmd_t *top_pmd;
|
extern pmd_t *top_pmd;
|
||||||
|
|
||||||
|
extern int icache_size;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* 0xffff8000 to 0xffffffff is reserved for any ARM architecture
|
* 0xffff8000 to 0xffffffff is reserved for any ARM architecture
|
||||||
* specific hacks for copying pages efficiently, while 0xffff4000
|
* specific hacks for copying pages efficiently, while 0xffff4000
|
||||||
|
|
|
@ -391,6 +391,11 @@ __ca12_errata:
|
||||||
mrc p15, 0, r10, c15, c0, 1 @ read diagnostic register
|
mrc p15, 0, r10, c15, c0, 1 @ read diagnostic register
|
||||||
orr r10, r10, #1 << 24 @ set bit #24
|
orr r10, r10, #1 << 24 @ set bit #24
|
||||||
mcr p15, 0, r10, c15, c0, 1 @ write diagnostic register
|
mcr p15, 0, r10, c15, c0, 1 @ write diagnostic register
|
||||||
|
#endif
|
||||||
|
#ifdef CONFIG_ARM_ERRATA_857271
|
||||||
|
mrc p15, 0, r10, c15, c0, 1 @ read diagnostic register
|
||||||
|
orr r10, r10, #3 << 10 @ set bits #10 and #11
|
||||||
|
mcr p15, 0, r10, c15, c0, 1 @ write diagnostic register
|
||||||
#endif
|
#endif
|
||||||
b __errata_finish
|
b __errata_finish
|
||||||
|
|
||||||
|
@ -406,6 +411,11 @@ __ca17_errata:
|
||||||
mrcle p15, 0, r10, c15, c0, 1 @ read diagnostic register
|
mrcle p15, 0, r10, c15, c0, 1 @ read diagnostic register
|
||||||
orrle r10, r10, #1 << 12 @ set bit #12
|
orrle r10, r10, #1 << 12 @ set bit #12
|
||||||
mcrle p15, 0, r10, c15, c0, 1 @ write diagnostic register
|
mcrle p15, 0, r10, c15, c0, 1 @ write diagnostic register
|
||||||
|
#endif
|
||||||
|
#ifdef CONFIG_ARM_ERRATA_857272
|
||||||
|
mrc p15, 0, r10, c15, c0, 1 @ read diagnostic register
|
||||||
|
orr r10, r10, #3 << 10 @ set bits #10 and #11
|
||||||
|
mcr p15, 0, r10, c15, c0, 1 @ write diagnostic register
|
||||||
#endif
|
#endif
|
||||||
b __errata_finish
|
b __errata_finish
|
||||||
|
|
||||||
|
|
|
@ -12,8 +12,7 @@ ccflags-y += -DDISABLE_BRANCH_PROFILING
|
||||||
|
|
||||||
ldflags-$(CONFIG_CPU_ENDIAN_BE8) := --be8
|
ldflags-$(CONFIG_CPU_ENDIAN_BE8) := --be8
|
||||||
ldflags-y := -Bsymbolic --no-undefined -soname=linux-vdso.so.1 \
|
ldflags-y := -Bsymbolic --no-undefined -soname=linux-vdso.so.1 \
|
||||||
-z max-page-size=4096 -z common-page-size=4096 \
|
-z max-page-size=4096 -nostdlib -shared $(ldflags-y) \
|
||||||
-nostdlib -shared $(ldflags-y) \
|
|
||||||
$(call ld-option, --hash-style=sysv) \
|
$(call ld-option, --hash-style=sysv) \
|
||||||
$(call ld-option, --build-id) \
|
$(call ld-option, --build-id) \
|
||||||
-T
|
-T
|
||||||
|
|
Loading…
Reference in New Issue