diff options
Diffstat (limited to 'arch/arm/include')
| -rw-r--r-- | arch/arm/include/asm/a.out-core.h | 45 | ||||
| -rw-r--r-- | arch/arm/include/asm/assembler.h | 4 | ||||
| -rw-r--r-- | arch/arm/include/asm/barrier.h | 32 | ||||
| -rw-r--r-- | arch/arm/include/asm/cacheflush.h | 2 | ||||
| -rw-r--r-- | arch/arm/include/asm/cputype.h | 7 | ||||
| -rw-r--r-- | arch/arm/include/asm/elf.h | 6 | ||||
| -rw-r--r-- | arch/arm/include/asm/mmu.h | 3 | ||||
| -rw-r--r-- | arch/arm/include/asm/mmu_context.h | 20 | ||||
| -rw-r--r-- | arch/arm/include/asm/page.h | 2 | ||||
| -rw-r--r-- | arch/arm/include/asm/processor.h | 4 | ||||
| -rw-r--r-- | arch/arm/include/asm/spinlock.h | 2 | ||||
| -rw-r--r-- | arch/arm/include/asm/switch_to.h | 10 | ||||
| -rw-r--r-- | arch/arm/include/asm/thread_info.h | 1 | ||||
| -rw-r--r-- | arch/arm/include/asm/tlbflush.h | 197 | ||||
| -rw-r--r-- | arch/arm/include/asm/virt.h | 12 | ||||
| -rw-r--r-- | arch/arm/include/uapi/asm/Kbuild | 1 | ||||
| -rw-r--r-- | arch/arm/include/uapi/asm/a.out.h | 34 |
17 files changed, 240 insertions, 142 deletions
diff --git a/arch/arm/include/asm/a.out-core.h b/arch/arm/include/asm/a.out-core.h deleted file mode 100644 index 92f10cb5c70c..000000000000 --- a/arch/arm/include/asm/a.out-core.h +++ /dev/null | |||
| @@ -1,45 +0,0 @@ | |||
| 1 | /* a.out coredump register dumper | ||
| 2 | * | ||
| 3 | * Copyright (C) 2007 Red Hat, Inc. All Rights Reserved. | ||
| 4 | * Written by David Howells (dhowells@redhat.com) | ||
| 5 | * | ||
| 6 | * This program is free software; you can redistribute it and/or | ||
| 7 | * modify it under the terms of the GNU General Public Licence | ||
| 8 | * as published by the Free Software Foundation; either version | ||
| 9 | * 2 of the Licence, or (at your option) any later version. | ||
| 10 | */ | ||
| 11 | |||
| 12 | #ifndef _ASM_A_OUT_CORE_H | ||
| 13 | #define _ASM_A_OUT_CORE_H | ||
| 14 | |||
| 15 | #ifdef __KERNEL__ | ||
| 16 | |||
| 17 | #include <linux/user.h> | ||
| 18 | #include <linux/elfcore.h> | ||
| 19 | |||
| 20 | /* | ||
| 21 | * fill in the user structure for an a.out core dump | ||
| 22 | */ | ||
| 23 | static inline void aout_dump_thread(struct pt_regs *regs, struct user *dump) | ||
| 24 | { | ||
| 25 | struct task_struct *tsk = current; | ||
| 26 | |||
| 27 | dump->magic = CMAGIC; | ||
| 28 | dump->start_code = tsk->mm->start_code; | ||
| 29 | dump->start_stack = regs->ARM_sp & ~(PAGE_SIZE - 1); | ||
| 30 | |||
| 31 | dump->u_tsize = (tsk->mm->end_code - tsk->mm->start_code) >> PAGE_SHIFT; | ||
| 32 | dump->u_dsize = (tsk->mm->brk - tsk->mm->start_data + PAGE_SIZE - 1) >> PAGE_SHIFT; | ||
| 33 | dump->u_ssize = 0; | ||
| 34 | |||
| 35 | memset(dump->u_debugreg, 0, sizeof(dump->u_debugreg)); | ||
| 36 | |||
| 37 | if (dump->start_stack < 0x04000000) | ||
| 38 | dump->u_ssize = (0x04000000 - dump->start_stack) >> PAGE_SHIFT; | ||
| 39 | |||
| 40 | dump->regs = *regs; | ||
| 41 | dump->u_fpvalid = dump_fpu (regs, &dump->u_fp); | ||
| 42 | } | ||
| 43 | |||
| 44 | #endif /* __KERNEL__ */ | ||
| 45 | #endif /* _ASM_A_OUT_CORE_H */ | ||
diff --git a/arch/arm/include/asm/assembler.h b/arch/arm/include/asm/assembler.h index a5fef710af32..fcc1b5bf6979 100644 --- a/arch/arm/include/asm/assembler.h +++ b/arch/arm/include/asm/assembler.h | |||
| @@ -220,9 +220,9 @@ | |||
| 220 | #ifdef CONFIG_SMP | 220 | #ifdef CONFIG_SMP |
| 221 | #if __LINUX_ARM_ARCH__ >= 7 | 221 | #if __LINUX_ARM_ARCH__ >= 7 |
| 222 | .ifeqs "\mode","arm" | 222 | .ifeqs "\mode","arm" |
| 223 | ALT_SMP(dmb) | 223 | ALT_SMP(dmb ish) |
| 224 | .else | 224 | .else |
| 225 | ALT_SMP(W(dmb)) | 225 | ALT_SMP(W(dmb) ish) |
| 226 | .endif | 226 | .endif |
| 227 | #elif __LINUX_ARM_ARCH__ == 6 | 227 | #elif __LINUX_ARM_ARCH__ == 6 |
| 228 | ALT_SMP(mcr p15, 0, r0, c7, c10, 5) @ dmb | 228 | ALT_SMP(mcr p15, 0, r0, c7, c10, 5) @ dmb |
diff --git a/arch/arm/include/asm/barrier.h b/arch/arm/include/asm/barrier.h index 8dcd9c702d90..60f15e274e6d 100644 --- a/arch/arm/include/asm/barrier.h +++ b/arch/arm/include/asm/barrier.h | |||
| @@ -14,27 +14,27 @@ | |||
| 14 | #endif | 14 | #endif |
| 15 | 15 | ||
| 16 | #if __LINUX_ARM_ARCH__ >= 7 | 16 | #if __LINUX_ARM_ARCH__ >= 7 |
| 17 | #define isb() __asm__ __volatile__ ("isb" : : : "memory") | 17 | #define isb(option) __asm__ __volatile__ ("isb " #option : : : "memory") |
| 18 | #define dsb() __asm__ __volatile__ ("dsb" : : : "memory") | 18 | #define dsb(option) __asm__ __volatile__ ("dsb " #option : : : "memory") |
| 19 | #define dmb() __asm__ __volatile__ ("dmb" : : : "memory") | 19 | #define dmb(option) __asm__ __volatile__ ("dmb " #option : : : "memory") |
| 20 | #elif defined(CONFIG_CPU_XSC3) || __LINUX_ARM_ARCH__ == 6 | 20 | #elif defined(CONFIG_CPU_XSC3) || __LINUX_ARM_ARCH__ == 6 |
| 21 | #define isb() __asm__ __volatile__ ("mcr p15, 0, %0, c7, c5, 4" \ | 21 | #define isb(x) __asm__ __volatile__ ("mcr p15, 0, %0, c7, c5, 4" \ |
| 22 | : : "r" (0) : "memory") | 22 | : : "r" (0) : "memory") |
| 23 | #define dsb() __asm__ __volatile__ ("mcr p15, 0, %0, c7, c10, 4" \ | 23 | #define dsb(x) __asm__ __volatile__ ("mcr p15, 0, %0, c7, c10, 4" \ |
| 24 | : : "r" (0) : "memory") | 24 | : : "r" (0) : "memory") |
| 25 | #define dmb() __asm__ __volatile__ ("mcr p15, 0, %0, c7, c10, 5" \ | 25 | #define dmb(x) __asm__ __volatile__ ("mcr p15, 0, %0, c7, c10, 5" \ |
| 26 | : : "r" (0) : "memory") | 26 | : : "r" (0) : "memory") |
| 27 | #elif defined(CONFIG_CPU_FA526) | 27 | #elif defined(CONFIG_CPU_FA526) |
| 28 | #define isb() __asm__ __volatile__ ("mcr p15, 0, %0, c7, c5, 4" \ | 28 | #define isb(x) __asm__ __volatile__ ("mcr p15, 0, %0, c7, c5, 4" \ |
| 29 | : : "r" (0) : "memory") | 29 | : : "r" (0) : "memory") |
| 30 | #define dsb() __asm__ __volatile__ ("mcr p15, 0, %0, c7, c10, 4" \ | 30 | #define dsb(x) __asm__ __volatile__ ("mcr p15, 0, %0, c7, c10, 4" \ |
| 31 | : : "r" (0) : "memory") | 31 | : : "r" (0) : "memory") |
| 32 | #define dmb() __asm__ __volatile__ ("" : : : "memory") | 32 | #define dmb(x) __asm__ __volatile__ ("" : : : "memory") |
| 33 | #else | 33 | #else |
| 34 | #define isb() __asm__ __volatile__ ("" : : : "memory") | 34 | #define isb(x) __asm__ __volatile__ ("" : : : "memory") |
| 35 | #define dsb() __asm__ __volatile__ ("mcr p15, 0, %0, c7, c10, 4" \ | 35 | #define dsb(x) __asm__ __volatile__ ("mcr p15, 0, %0, c7, c10, 4" \ |
| 36 | : : "r" (0) : "memory") | 36 | : : "r" (0) : "memory") |
| 37 | #define dmb() __asm__ __volatile__ ("" : : : "memory") | 37 | #define dmb(x) __asm__ __volatile__ ("" : : : "memory") |
| 38 | #endif | 38 | #endif |
| 39 | 39 | ||
| 40 | #ifdef CONFIG_ARCH_HAS_BARRIERS | 40 | #ifdef CONFIG_ARCH_HAS_BARRIERS |
| @@ -42,7 +42,7 @@ | |||
| 42 | #elif defined(CONFIG_ARM_DMA_MEM_BUFFERABLE) || defined(CONFIG_SMP) | 42 | #elif defined(CONFIG_ARM_DMA_MEM_BUFFERABLE) || defined(CONFIG_SMP) |
| 43 | #define mb() do { dsb(); outer_sync(); } while (0) | 43 | #define mb() do { dsb(); outer_sync(); } while (0) |
| 44 | #define rmb() dsb() | 44 | #define rmb() dsb() |
| 45 | #define wmb() mb() | 45 | #define wmb() do { dsb(st); outer_sync(); } while (0) |
| 46 | #else | 46 | #else |
| 47 | #define mb() barrier() | 47 | #define mb() barrier() |
| 48 | #define rmb() barrier() | 48 | #define rmb() barrier() |
| @@ -54,9 +54,9 @@ | |||
| 54 | #define smp_rmb() barrier() | 54 | #define smp_rmb() barrier() |
| 55 | #define smp_wmb() barrier() | 55 | #define smp_wmb() barrier() |
| 56 | #else | 56 | #else |
| 57 | #define smp_mb() dmb() | 57 | #define smp_mb() dmb(ish) |
| 58 | #define smp_rmb() dmb() | 58 | #define smp_rmb() smp_mb() |
| 59 | #define smp_wmb() dmb() | 59 | #define smp_wmb() dmb(ishst) |
| 60 | #endif | 60 | #endif |
| 61 | 61 | ||
| 62 | #define read_barrier_depends() do { } while(0) | 62 | #define read_barrier_depends() do { } while(0) |
diff --git a/arch/arm/include/asm/cacheflush.h b/arch/arm/include/asm/cacheflush.h index 17d0ae8672fa..04d73262e003 100644 --- a/arch/arm/include/asm/cacheflush.h +++ b/arch/arm/include/asm/cacheflush.h | |||
| @@ -352,7 +352,7 @@ static inline void flush_cache_vmap(unsigned long start, unsigned long end) | |||
| 352 | * set_pte_at() called from vmap_pte_range() does not | 352 | * set_pte_at() called from vmap_pte_range() does not |
| 353 | * have a DSB after cleaning the cache line. | 353 | * have a DSB after cleaning the cache line. |
| 354 | */ | 354 | */ |
| 355 | dsb(); | 355 | dsb(ishst); |
| 356 | } | 356 | } |
| 357 | 357 | ||
| 358 | static inline void flush_cache_vunmap(unsigned long start, unsigned long end) | 358 | static inline void flush_cache_vunmap(unsigned long start, unsigned long end) |
diff --git a/arch/arm/include/asm/cputype.h b/arch/arm/include/asm/cputype.h index 8c25dc4e9851..9672e978d50d 100644 --- a/arch/arm/include/asm/cputype.h +++ b/arch/arm/include/asm/cputype.h | |||
| @@ -89,13 +89,18 @@ extern unsigned int processor_id; | |||
| 89 | __val; \ | 89 | __val; \ |
| 90 | }) | 90 | }) |
| 91 | 91 | ||
| 92 | /* | ||
| 93 | * The memory clobber prevents gcc 4.5 from reordering the mrc before | ||
| 94 | * any is_smp() tests, which can cause undefined instruction aborts on | ||
| 95 | * ARM1136 r0 due to the missing extended CP15 registers. | ||
| 96 | */ | ||
| 92 | #define read_cpuid_ext(ext_reg) \ | 97 | #define read_cpuid_ext(ext_reg) \ |
| 93 | ({ \ | 98 | ({ \ |
| 94 | unsigned int __val; \ | 99 | unsigned int __val; \ |
| 95 | asm("mrc p15, 0, %0, c0, " ext_reg \ | 100 | asm("mrc p15, 0, %0, c0, " ext_reg \ |
| 96 | : "=r" (__val) \ | 101 | : "=r" (__val) \ |
| 97 | : \ | 102 | : \ |
| 98 | : "cc"); \ | 103 | : "memory"); \ |
| 99 | __val; \ | 104 | __val; \ |
| 100 | }) | 105 | }) |
| 101 | 106 | ||
diff --git a/arch/arm/include/asm/elf.h b/arch/arm/include/asm/elf.h index 38050b1c4800..56211f2084ef 100644 --- a/arch/arm/include/asm/elf.h +++ b/arch/arm/include/asm/elf.h | |||
| @@ -130,4 +130,10 @@ struct mm_struct; | |||
| 130 | extern unsigned long arch_randomize_brk(struct mm_struct *mm); | 130 | extern unsigned long arch_randomize_brk(struct mm_struct *mm); |
| 131 | #define arch_randomize_brk arch_randomize_brk | 131 | #define arch_randomize_brk arch_randomize_brk |
| 132 | 132 | ||
| 133 | #ifdef CONFIG_MMU | ||
| 134 | #define ARCH_HAS_SETUP_ADDITIONAL_PAGES 1 | ||
| 135 | struct linux_binprm; | ||
| 136 | int arch_setup_additional_pages(struct linux_binprm *, int); | ||
| 137 | #endif | ||
| 138 | |||
| 133 | #endif | 139 | #endif |
diff --git a/arch/arm/include/asm/mmu.h b/arch/arm/include/asm/mmu.h index e3d55547e755..6f18da09668b 100644 --- a/arch/arm/include/asm/mmu.h +++ b/arch/arm/include/asm/mmu.h | |||
| @@ -6,8 +6,11 @@ | |||
| 6 | typedef struct { | 6 | typedef struct { |
| 7 | #ifdef CONFIG_CPU_HAS_ASID | 7 | #ifdef CONFIG_CPU_HAS_ASID |
| 8 | atomic64_t id; | 8 | atomic64_t id; |
| 9 | #else | ||
| 10 | int switch_pending; | ||
| 9 | #endif | 11 | #endif |
| 10 | unsigned int vmalloc_seq; | 12 | unsigned int vmalloc_seq; |
| 13 | unsigned long sigpage; | ||
| 11 | } mm_context_t; | 14 | } mm_context_t; |
| 12 | 15 | ||
| 13 | #ifdef CONFIG_CPU_HAS_ASID | 16 | #ifdef CONFIG_CPU_HAS_ASID |
diff --git a/arch/arm/include/asm/mmu_context.h b/arch/arm/include/asm/mmu_context.h index b5792b7fd8d3..9b32f76bb0dd 100644 --- a/arch/arm/include/asm/mmu_context.h +++ b/arch/arm/include/asm/mmu_context.h | |||
| @@ -56,7 +56,7 @@ static inline void check_and_switch_context(struct mm_struct *mm, | |||
| 56 | * on non-ASID CPUs, the old mm will remain valid until the | 56 | * on non-ASID CPUs, the old mm will remain valid until the |
| 57 | * finish_arch_post_lock_switch() call. | 57 | * finish_arch_post_lock_switch() call. |
| 58 | */ | 58 | */ |
| 59 | set_ti_thread_flag(task_thread_info(tsk), TIF_SWITCH_MM); | 59 | mm->context.switch_pending = 1; |
| 60 | else | 60 | else |
| 61 | cpu_switch_mm(mm->pgd, mm); | 61 | cpu_switch_mm(mm->pgd, mm); |
| 62 | } | 62 | } |
| @@ -65,9 +65,21 @@ static inline void check_and_switch_context(struct mm_struct *mm, | |||
| 65 | finish_arch_post_lock_switch | 65 | finish_arch_post_lock_switch |
| 66 | static inline void finish_arch_post_lock_switch(void) | 66 | static inline void finish_arch_post_lock_switch(void) |
| 67 | { | 67 | { |
| 68 | if (test_and_clear_thread_flag(TIF_SWITCH_MM)) { | 68 | struct mm_struct *mm = current->mm; |
| 69 | struct mm_struct *mm = current->mm; | 69 | |
| 70 | cpu_switch_mm(mm->pgd, mm); | 70 | if (mm && mm->context.switch_pending) { |
| 71 | /* | ||
| 72 | * Preemption must be disabled during cpu_switch_mm() as we | ||
| 73 | * have some stateful cache flush implementations. Check | ||
| 74 | * switch_pending again in case we were preempted and the | ||
| 75 | * switch to this mm was already done. | ||
| 76 | */ | ||
| 77 | preempt_disable(); | ||
| 78 | if (mm->context.switch_pending) { | ||
| 79 | mm->context.switch_pending = 0; | ||
| 80 | cpu_switch_mm(mm->pgd, mm); | ||
| 81 | } | ||
| 82 | preempt_enable_no_resched(); | ||
| 71 | } | 83 | } |
| 72 | } | 84 | } |
| 73 | 85 | ||
diff --git a/arch/arm/include/asm/page.h b/arch/arm/include/asm/page.h index 6363f3d1d505..4355f0ec44d6 100644 --- a/arch/arm/include/asm/page.h +++ b/arch/arm/include/asm/page.h | |||
| @@ -142,7 +142,9 @@ extern void __cpu_copy_user_highpage(struct page *to, struct page *from, | |||
| 142 | #define clear_page(page) memset((void *)(page), 0, PAGE_SIZE) | 142 | #define clear_page(page) memset((void *)(page), 0, PAGE_SIZE) |
| 143 | extern void copy_page(void *to, const void *from); | 143 | extern void copy_page(void *to, const void *from); |
| 144 | 144 | ||
| 145 | #ifdef CONFIG_KUSER_HELPERS | ||
| 145 | #define __HAVE_ARCH_GATE_AREA 1 | 146 | #define __HAVE_ARCH_GATE_AREA 1 |
| 147 | #endif | ||
| 146 | 148 | ||
| 147 | #ifdef CONFIG_ARM_LPAE | 149 | #ifdef CONFIG_ARM_LPAE |
| 148 | #include <asm/pgtable-3level-types.h> | 150 | #include <asm/pgtable-3level-types.h> |
diff --git a/arch/arm/include/asm/processor.h b/arch/arm/include/asm/processor.h index 06e7d509eaac..413f3876341c 100644 --- a/arch/arm/include/asm/processor.h +++ b/arch/arm/include/asm/processor.h | |||
| @@ -54,7 +54,6 @@ struct thread_struct { | |||
| 54 | 54 | ||
| 55 | #define start_thread(regs,pc,sp) \ | 55 | #define start_thread(regs,pc,sp) \ |
| 56 | ({ \ | 56 | ({ \ |
| 57 | unsigned long *stack = (unsigned long *)sp; \ | ||
| 58 | memset(regs->uregs, 0, sizeof(regs->uregs)); \ | 57 | memset(regs->uregs, 0, sizeof(regs->uregs)); \ |
| 59 | if (current->personality & ADDR_LIMIT_32BIT) \ | 58 | if (current->personality & ADDR_LIMIT_32BIT) \ |
| 60 | regs->ARM_cpsr = USR_MODE; \ | 59 | regs->ARM_cpsr = USR_MODE; \ |
| @@ -65,9 +64,6 @@ struct thread_struct { | |||
| 65 | regs->ARM_cpsr |= PSR_ENDSTATE; \ | 64 | regs->ARM_cpsr |= PSR_ENDSTATE; \ |
| 66 | regs->ARM_pc = pc & ~1; /* pc */ \ | 65 | regs->ARM_pc = pc & ~1; /* pc */ \ |
| 67 | regs->ARM_sp = sp; /* sp */ \ | 66 | regs->ARM_sp = sp; /* sp */ \ |
| 68 | regs->ARM_r2 = stack[2]; /* r2 (envp) */ \ | ||
| 69 | regs->ARM_r1 = stack[1]; /* r1 (argv) */ \ | ||
| 70 | regs->ARM_r0 = stack[0]; /* r0 (argc) */ \ | ||
| 71 | nommu_start_thread(regs); \ | 67 | nommu_start_thread(regs); \ |
| 72 | }) | 68 | }) |
| 73 | 69 | ||
diff --git a/arch/arm/include/asm/spinlock.h b/arch/arm/include/asm/spinlock.h index f8b8965666e9..2c1e748f52d8 100644 --- a/arch/arm/include/asm/spinlock.h +++ b/arch/arm/include/asm/spinlock.h | |||
| @@ -46,7 +46,7 @@ static inline void dsb_sev(void) | |||
| 46 | { | 46 | { |
| 47 | #if __LINUX_ARM_ARCH__ >= 7 | 47 | #if __LINUX_ARM_ARCH__ >= 7 |
| 48 | __asm__ __volatile__ ( | 48 | __asm__ __volatile__ ( |
| 49 | "dsb\n" | 49 | "dsb ishst\n" |
| 50 | SEV | 50 | SEV |
| 51 | ); | 51 | ); |
| 52 | #else | 52 | #else |
diff --git a/arch/arm/include/asm/switch_to.h b/arch/arm/include/asm/switch_to.h index fa09e6b49bf1..c99e259469f7 100644 --- a/arch/arm/include/asm/switch_to.h +++ b/arch/arm/include/asm/switch_to.h | |||
| @@ -4,6 +4,16 @@ | |||
| 4 | #include <linux/thread_info.h> | 4 | #include <linux/thread_info.h> |
| 5 | 5 | ||
| 6 | /* | 6 | /* |
| 7 | * For v7 SMP cores running a preemptible kernel we may be pre-empted | ||
| 8 | * during a TLB maintenance operation, so execute an inner-shareable dsb | ||
| 9 | * to ensure that the maintenance completes in case we migrate to another | ||
| 10 | * CPU. | ||
| 11 | */ | ||
| 12 | #if defined(CONFIG_PREEMPT) && defined(CONFIG_SMP) && defined(CONFIG_CPU_V7) | ||
| 13 | #define finish_arch_switch(prev) dsb(ish) | ||
| 14 | #endif | ||
| 15 | |||
| 16 | /* | ||
| 7 | * switch_to(prev, next) should switch from task `prev' to `next' | 17 | * switch_to(prev, next) should switch from task `prev' to `next' |
| 8 | * `prev' will never be the same as `next'. schedule() itself | 18 | * `prev' will never be the same as `next'. schedule() itself |
| 9 | * contains the memory barrier to tell GCC not to cache `current'. | 19 | * contains the memory barrier to tell GCC not to cache `current'. |
diff --git a/arch/arm/include/asm/thread_info.h b/arch/arm/include/asm/thread_info.h index 214d4158089a..2b8114fcba09 100644 --- a/arch/arm/include/asm/thread_info.h +++ b/arch/arm/include/asm/thread_info.h | |||
| @@ -156,7 +156,6 @@ extern int vfp_restore_user_hwstate(struct user_vfp __user *, | |||
| 156 | #define TIF_USING_IWMMXT 17 | 156 | #define TIF_USING_IWMMXT 17 |
| 157 | #define TIF_MEMDIE 18 /* is terminating due to OOM killer */ | 157 | #define TIF_MEMDIE 18 /* is terminating due to OOM killer */ |
| 158 | #define TIF_RESTORE_SIGMASK 20 | 158 | #define TIF_RESTORE_SIGMASK 20 |
| 159 | #define TIF_SWITCH_MM 22 /* deferred switch_mm */ | ||
| 160 | 159 | ||
| 161 | #define _TIF_SIGPENDING (1 << TIF_SIGPENDING) | 160 | #define _TIF_SIGPENDING (1 << TIF_SIGPENDING) |
| 162 | #define _TIF_NEED_RESCHED (1 << TIF_NEED_RESCHED) | 161 | #define _TIF_NEED_RESCHED (1 << TIF_NEED_RESCHED) |
diff --git a/arch/arm/include/asm/tlbflush.h b/arch/arm/include/asm/tlbflush.h index fdbb9e369745..38960264040c 100644 --- a/arch/arm/include/asm/tlbflush.h +++ b/arch/arm/include/asm/tlbflush.h | |||
| @@ -319,67 +319,110 @@ extern struct cpu_tlb_fns cpu_tlb; | |||
| 319 | #define tlb_op(f, regs, arg) __tlb_op(f, "p15, 0, %0, " regs, arg) | 319 | #define tlb_op(f, regs, arg) __tlb_op(f, "p15, 0, %0, " regs, arg) |
| 320 | #define tlb_l2_op(f, regs, arg) __tlb_op(f, "p15, 1, %0, " regs, arg) | 320 | #define tlb_l2_op(f, regs, arg) __tlb_op(f, "p15, 1, %0, " regs, arg) |
| 321 | 321 | ||
| 322 | static inline void local_flush_tlb_all(void) | 322 | static inline void __local_flush_tlb_all(void) |
| 323 | { | 323 | { |
| 324 | const int zero = 0; | 324 | const int zero = 0; |
| 325 | const unsigned int __tlb_flag = __cpu_tlb_flags; | 325 | const unsigned int __tlb_flag = __cpu_tlb_flags; |
| 326 | 326 | ||
| 327 | if (tlb_flag(TLB_WB)) | ||
| 328 | dsb(); | ||
| 329 | |||
| 330 | tlb_op(TLB_V4_U_FULL | TLB_V6_U_FULL, "c8, c7, 0", zero); | 327 | tlb_op(TLB_V4_U_FULL | TLB_V6_U_FULL, "c8, c7, 0", zero); |
| 331 | tlb_op(TLB_V4_D_FULL | TLB_V6_D_FULL, "c8, c6, 0", zero); | 328 | tlb_op(TLB_V4_D_FULL | TLB_V6_D_FULL, "c8, c6, 0", zero); |
| 332 | tlb_op(TLB_V4_I_FULL | TLB_V6_I_FULL, "c8, c5, 0", zero); | 329 | tlb_op(TLB_V4_I_FULL | TLB_V6_I_FULL, "c8, c5, 0", zero); |
| 333 | tlb_op(TLB_V7_UIS_FULL, "c8, c3, 0", zero); | 330 | } |
| 331 | |||
| 332 | static inline void local_flush_tlb_all(void) | ||
| 333 | { | ||
| 334 | const int zero = 0; | ||
| 335 | const unsigned int __tlb_flag = __cpu_tlb_flags; | ||
| 336 | |||
| 337 | if (tlb_flag(TLB_WB)) | ||
| 338 | dsb(nshst); | ||
| 339 | |||
| 340 | __local_flush_tlb_all(); | ||
| 341 | tlb_op(TLB_V7_UIS_FULL, "c8, c7, 0", zero); | ||
| 334 | 342 | ||
| 335 | if (tlb_flag(TLB_BARRIER)) { | 343 | if (tlb_flag(TLB_BARRIER)) { |
| 336 | dsb(); | 344 | dsb(nsh); |
| 337 | isb(); | 345 | isb(); |
| 338 | } | 346 | } |
| 339 | } | 347 | } |
| 340 | 348 | ||
| 341 | static inline void local_flush_tlb_mm(struct mm_struct *mm) | 349 | static inline void __flush_tlb_all(void) |
| 342 | { | 350 | { |
| 343 | const int zero = 0; | 351 | const int zero = 0; |
| 344 | const int asid = ASID(mm); | ||
| 345 | const unsigned int __tlb_flag = __cpu_tlb_flags; | 352 | const unsigned int __tlb_flag = __cpu_tlb_flags; |
| 346 | 353 | ||
| 347 | if (tlb_flag(TLB_WB)) | 354 | if (tlb_flag(TLB_WB)) |
| 348 | dsb(); | 355 | dsb(ishst); |
| 356 | |||
| 357 | __local_flush_tlb_all(); | ||
| 358 | tlb_op(TLB_V7_UIS_FULL, "c8, c3, 0", zero); | ||
| 359 | |||
| 360 | if (tlb_flag(TLB_BARRIER)) { | ||
| 361 | dsb(ish); | ||
| 362 | isb(); | ||
| 363 | } | ||
| 364 | } | ||
| 365 | |||
| 366 | static inline void __local_flush_tlb_mm(struct mm_struct *mm) | ||
| 367 | { | ||
| 368 | const int zero = 0; | ||
| 369 | const int asid = ASID(mm); | ||
| 370 | const unsigned int __tlb_flag = __cpu_tlb_flags; | ||
| 349 | 371 | ||
| 350 | if (possible_tlb_flags & (TLB_V4_U_FULL|TLB_V4_D_FULL|TLB_V4_I_FULL)) { | 372 | if (possible_tlb_flags & (TLB_V4_U_FULL|TLB_V4_D_FULL|TLB_V4_I_FULL)) { |
| 351 | if (cpumask_test_cpu(get_cpu(), mm_cpumask(mm))) { | 373 | if (cpumask_test_cpu(smp_processor_id(), mm_cpumask(mm))) { |
| 352 | tlb_op(TLB_V4_U_FULL, "c8, c7, 0", zero); | 374 | tlb_op(TLB_V4_U_FULL, "c8, c7, 0", zero); |
| 353 | tlb_op(TLB_V4_D_FULL, "c8, c6, 0", zero); | 375 | tlb_op(TLB_V4_D_FULL, "c8, c6, 0", zero); |
| 354 | tlb_op(TLB_V4_I_FULL, "c8, c5, 0", zero); | 376 | tlb_op(TLB_V4_I_FULL, "c8, c5, 0", zero); |
| 355 | } | 377 | } |
| 356 | put_cpu(); | ||
| 357 | } | 378 | } |
| 358 | 379 | ||
| 359 | tlb_op(TLB_V6_U_ASID, "c8, c7, 2", asid); | 380 | tlb_op(TLB_V6_U_ASID, "c8, c7, 2", asid); |
| 360 | tlb_op(TLB_V6_D_ASID, "c8, c6, 2", asid); | 381 | tlb_op(TLB_V6_D_ASID, "c8, c6, 2", asid); |
| 361 | tlb_op(TLB_V6_I_ASID, "c8, c5, 2", asid); | 382 | tlb_op(TLB_V6_I_ASID, "c8, c5, 2", asid); |
| 383 | } | ||
| 384 | |||
| 385 | static inline void local_flush_tlb_mm(struct mm_struct *mm) | ||
| 386 | { | ||
| 387 | const int asid = ASID(mm); | ||
| 388 | const unsigned int __tlb_flag = __cpu_tlb_flags; | ||
| 389 | |||
| 390 | if (tlb_flag(TLB_WB)) | ||
| 391 | dsb(nshst); | ||
| 392 | |||
| 393 | __local_flush_tlb_mm(mm); | ||
| 394 | tlb_op(TLB_V7_UIS_ASID, "c8, c7, 2", asid); | ||
| 395 | |||
| 396 | if (tlb_flag(TLB_BARRIER)) | ||
| 397 | dsb(nsh); | ||
| 398 | } | ||
| 399 | |||
| 400 | static inline void __flush_tlb_mm(struct mm_struct *mm) | ||
| 401 | { | ||
| 402 | const unsigned int __tlb_flag = __cpu_tlb_flags; | ||
| 403 | |||
| 404 | if (tlb_flag(TLB_WB)) | ||
| 405 | dsb(ishst); | ||
| 406 | |||
| 407 | __local_flush_tlb_mm(mm); | ||
| 362 | #ifdef CONFIG_ARM_ERRATA_720789 | 408 | #ifdef CONFIG_ARM_ERRATA_720789 |
| 363 | tlb_op(TLB_V7_UIS_ASID, "c8, c3, 0", zero); | 409 | tlb_op(TLB_V7_UIS_ASID, "c8, c3, 0", 0); |
| 364 | #else | 410 | #else |
| 365 | tlb_op(TLB_V7_UIS_ASID, "c8, c3, 2", asid); | 411 | tlb_op(TLB_V7_UIS_ASID, "c8, c3, 2", ASID(mm)); |
| 366 | #endif | 412 | #endif |
| 367 | 413 | ||
| 368 | if (tlb_flag(TLB_BARRIER)) | 414 | if (tlb_flag(TLB_BARRIER)) |
| 369 | dsb(); | 415 | dsb(ish); |
| 370 | } | 416 | } |
| 371 | 417 | ||
| 372 | static inline void | 418 | static inline void |
| 373 | local_flush_tlb_page(struct vm_area_struct *vma, unsigned long uaddr) | 419 | __local_flush_tlb_page(struct vm_area_struct *vma, unsigned long uaddr) |
| 374 | { | 420 | { |
| 375 | const int zero = 0; | 421 | const int zero = 0; |
| 376 | const unsigned int __tlb_flag = __cpu_tlb_flags; | 422 | const unsigned int __tlb_flag = __cpu_tlb_flags; |
| 377 | 423 | ||
| 378 | uaddr = (uaddr & PAGE_MASK) | ASID(vma->vm_mm); | 424 | uaddr = (uaddr & PAGE_MASK) | ASID(vma->vm_mm); |
| 379 | 425 | ||
| 380 | if (tlb_flag(TLB_WB)) | ||
| 381 | dsb(); | ||
| 382 | |||
| 383 | if (possible_tlb_flags & (TLB_V4_U_PAGE|TLB_V4_D_PAGE|TLB_V4_I_PAGE|TLB_V4_I_FULL) && | 426 | if (possible_tlb_flags & (TLB_V4_U_PAGE|TLB_V4_D_PAGE|TLB_V4_I_PAGE|TLB_V4_I_FULL) && |
| 384 | cpumask_test_cpu(smp_processor_id(), mm_cpumask(vma->vm_mm))) { | 427 | cpumask_test_cpu(smp_processor_id(), mm_cpumask(vma->vm_mm))) { |
| 385 | tlb_op(TLB_V4_U_PAGE, "c8, c7, 1", uaddr); | 428 | tlb_op(TLB_V4_U_PAGE, "c8, c7, 1", uaddr); |
| @@ -392,6 +435,36 @@ local_flush_tlb_page(struct vm_area_struct *vma, unsigned long uaddr) | |||
| 392 | tlb_op(TLB_V6_U_PAGE, "c8, c7, 1", uaddr); | 435 | tlb_op(TLB_V6_U_PAGE, "c8, c7, 1", uaddr); |
| 393 | tlb_op(TLB_V6_D_PAGE, "c8, c6, 1", uaddr); | 436 | tlb_op(TLB_V6_D_PAGE, "c8, c6, 1", uaddr); |
| 394 | tlb_op(TLB_V6_I_PAGE, "c8, c5, 1", uaddr); | 437 | tlb_op(TLB_V6_I_PAGE, "c8, c5, 1", uaddr); |
| 438 | } | ||
| 439 | |||
| 440 | static inline void | ||
| 441 | local_flush_tlb_page(struct vm_area_struct *vma, unsigned long uaddr) | ||
| 442 | { | ||
| 443 | const unsigned int __tlb_flag = __cpu_tlb_flags; | ||
| 444 | |||
| 445 | uaddr = (uaddr & PAGE_MASK) | ASID(vma->vm_mm); | ||
| 446 | |||
| 447 | if (tlb_flag(TLB_WB)) | ||
| 448 | dsb(nshst); | ||
| 449 | |||
| 450 | __local_flush_tlb_page(vma, uaddr); | ||
| 451 | tlb_op(TLB_V7_UIS_PAGE, "c8, c7, 1", uaddr); | ||
| 452 | |||
| 453 | if (tlb_flag(TLB_BARRIER)) | ||
| 454 | dsb(nsh); | ||
| 455 | } | ||
| 456 | |||
| 457 | static inline void | ||
| 458 | __flush_tlb_page(struct vm_area_struct *vma, unsigned long uaddr) | ||
| 459 | { | ||
| 460 | const unsigned int __tlb_flag = __cpu_tlb_flags; | ||
| 461 | |||
| 462 | uaddr = (uaddr & PAGE_MASK) | ASID(vma->vm_mm); | ||
| 463 | |||
| 464 | if (tlb_flag(TLB_WB)) | ||
| 465 | dsb(ishst); | ||
| 466 | |||
| 467 | __local_flush_tlb_page(vma, uaddr); | ||
| 395 | #ifdef CONFIG_ARM_ERRATA_720789 | 468 | #ifdef CONFIG_ARM_ERRATA_720789 |
| 396 | tlb_op(TLB_V7_UIS_PAGE, "c8, c3, 3", uaddr & PAGE_MASK); | 469 | tlb_op(TLB_V7_UIS_PAGE, "c8, c3, 3", uaddr & PAGE_MASK); |
| 397 | #else | 470 | #else |
| @@ -399,19 +472,14 @@ local_flush_tlb_page(struct vm_area_struct *vma, unsigned long uaddr) | |||
| 399 | #endif | 472 | #endif |
| 400 | 473 | ||
| 401 | if (tlb_flag(TLB_BARRIER)) | 474 | if (tlb_flag(TLB_BARRIER)) |
| 402 | dsb(); | 475 | dsb(ish); |
| 403 | } | 476 | } |
| 404 | 477 | ||
| 405 | static inline void local_flush_tlb_kernel_page(unsigned long kaddr) | 478 | static inline void __local_flush_tlb_kernel_page(unsigned long kaddr) |
| 406 | { | 479 | { |
| 407 | const int zero = 0; | 480 | const int zero = 0; |
| 408 | const unsigned int __tlb_flag = __cpu_tlb_flags; | 481 | const unsigned int __tlb_flag = __cpu_tlb_flags; |
| 409 | 482 | ||
| 410 | kaddr &= PAGE_MASK; | ||
| 411 | |||
| 412 | if (tlb_flag(TLB_WB)) | ||
| 413 | dsb(); | ||
| 414 | |||
| 415 | tlb_op(TLB_V4_U_PAGE, "c8, c7, 1", kaddr); | 483 | tlb_op(TLB_V4_U_PAGE, "c8, c7, 1", kaddr); |
| 416 | tlb_op(TLB_V4_D_PAGE, "c8, c6, 1", kaddr); | 484 | tlb_op(TLB_V4_D_PAGE, "c8, c6, 1", kaddr); |
| 417 | tlb_op(TLB_V4_I_PAGE, "c8, c5, 1", kaddr); | 485 | tlb_op(TLB_V4_I_PAGE, "c8, c5, 1", kaddr); |
| @@ -421,38 +489,103 @@ static inline void local_flush_tlb_kernel_page(unsigned long kaddr) | |||
| 421 | tlb_op(TLB_V6_U_PAGE, "c8, c7, 1", kaddr); | 489 | tlb_op(TLB_V6_U_PAGE, "c8, c7, 1", kaddr); |
| 422 | tlb_op(TLB_V6_D_PAGE, "c8, c6, 1", kaddr); | 490 | tlb_op(TLB_V6_D_PAGE, "c8, c6, 1", kaddr); |
| 423 | tlb_op(TLB_V6_I_PAGE, "c8, c5, 1", kaddr); | 491 | tlb_op(TLB_V6_I_PAGE, "c8, c5, 1", kaddr); |
| 492 | } | ||
| 493 | |||
| 494 | static inline void local_flush_tlb_kernel_page(unsigned long kaddr) | ||
| 495 | { | ||
| 496 | const unsigned int __tlb_flag = __cpu_tlb_flags; | ||
| 497 | |||
| 498 | kaddr &= PAGE_MASK; | ||
| 499 | |||
| 500 | if (tlb_flag(TLB_WB)) | ||
| 501 | dsb(nshst); | ||
| 502 | |||
| 503 | __local_flush_tlb_kernel_page(kaddr); | ||
| 504 | tlb_op(TLB_V7_UIS_PAGE, "c8, c7, 1", kaddr); | ||
| 505 | |||
| 506 | if (tlb_flag(TLB_BARRIER)) { | ||
| 507 | dsb(nsh); | ||
| 508 | isb(); | ||
| 509 | } | ||
| 510 | } | ||
| 511 | |||
| 512 | static inline void __flush_tlb_kernel_page(unsigned long kaddr) | ||
| 513 | { | ||
| 514 | const unsigned int __tlb_flag = __cpu_tlb_flags; | ||
| 515 | |||
| 516 | kaddr &= PAGE_MASK; | ||
| 517 | |||
| 518 | if (tlb_flag(TLB_WB)) | ||
| 519 | dsb(ishst); | ||
| 520 | |||
| 521 | __local_flush_tlb_kernel_page(kaddr); | ||
| 424 | tlb_op(TLB_V7_UIS_PAGE, "c8, c3, 1", kaddr); | 522 | tlb_op(TLB_V7_UIS_PAGE, "c8, c3, 1", kaddr); |
| 425 | 523 | ||
| 426 | if (tlb_flag(TLB_BARRIER)) { | 524 | if (tlb_flag(TLB_BARRIER)) { |
| 427 | dsb(); | 525 | dsb(ish); |
| 428 | isb(); | 526 | isb(); |
| 429 | } | 527 | } |
| 430 | } | 528 | } |
| 431 | 529 | ||
| 530 | /* | ||
| 531 | * Branch predictor maintenance is paired with full TLB invalidation, so | ||
| 532 | * there is no need for any barriers here. | ||
| 533 | */ | ||
| 534 | static inline void __local_flush_bp_all(void) | ||
| 535 | { | ||
| 536 | const int zero = 0; | ||
| 537 | const unsigned int __tlb_flag = __cpu_tlb_flags; | ||
| 538 | |||
| 539 | if (tlb_flag(TLB_V6_BP)) | ||
| 540 | asm("mcr p15, 0, %0, c7, c5, 6" : : "r" (zero)); | ||
| 541 | } | ||
| 542 | |||
| 432 | static inline void local_flush_bp_all(void) | 543 | static inline void local_flush_bp_all(void) |
| 433 | { | 544 | { |
| 434 | const int zero = 0; | 545 | const int zero = 0; |
| 435 | const unsigned int __tlb_flag = __cpu_tlb_flags; | 546 | const unsigned int __tlb_flag = __cpu_tlb_flags; |
| 436 | 547 | ||
| 548 | __local_flush_bp_all(); | ||
| 437 | if (tlb_flag(TLB_V7_UIS_BP)) | 549 | if (tlb_flag(TLB_V7_UIS_BP)) |
| 438 | asm("mcr p15, 0, %0, c7, c1, 6" : : "r" (zero)); | ||
| 439 | else if (tlb_flag(TLB_V6_BP)) | ||
| 440 | asm("mcr p15, 0, %0, c7, c5, 6" : : "r" (zero)); | 550 | asm("mcr p15, 0, %0, c7, c5, 6" : : "r" (zero)); |
| 551 | } | ||
| 441 | 552 | ||
| 442 | if (tlb_flag(TLB_BARRIER)) | 553 | static inline void __flush_bp_all(void) |
| 443 | isb(); | 554 | { |
| 555 | const int zero = 0; | ||
| 556 | const unsigned int __tlb_flag = __cpu_tlb_flags; | ||
| 557 | |||
| 558 | __local_flush_bp_all(); | ||
| 559 | if (tlb_flag(TLB_V7_UIS_BP)) | ||
| 560 | asm("mcr p15, 0, %0, c7, c1, 6" : : "r" (zero)); | ||
| 444 | } | 561 | } |
| 445 | 562 | ||
| 563 | #include <asm/cputype.h> | ||
| 446 | #ifdef CONFIG_ARM_ERRATA_798181 | 564 | #ifdef CONFIG_ARM_ERRATA_798181 |
| 565 | static inline int erratum_a15_798181(void) | ||
| 566 | { | ||
| 567 | unsigned int midr = read_cpuid_id(); | ||
| 568 | |||
| 569 | /* Cortex-A15 r0p0..r3p2 affected */ | ||
| 570 | if ((midr & 0xff0ffff0) != 0x410fc0f0 || midr > 0x413fc0f2) | ||
| 571 | return 0; | ||
| 572 | return 1; | ||
| 573 | } | ||
| 574 | |||
| 447 | static inline void dummy_flush_tlb_a15_erratum(void) | 575 | static inline void dummy_flush_tlb_a15_erratum(void) |
| 448 | { | 576 | { |
| 449 | /* | 577 | /* |
| 450 | * Dummy TLBIMVAIS. Using the unmapped address 0 and ASID 0. | 578 | * Dummy TLBIMVAIS. Using the unmapped address 0 and ASID 0. |
| 451 | */ | 579 | */ |
| 452 | asm("mcr p15, 0, %0, c8, c3, 1" : : "r" (0)); | 580 | asm("mcr p15, 0, %0, c8, c3, 1" : : "r" (0)); |
| 453 | dsb(); | 581 | dsb(ish); |
| 454 | } | 582 | } |
| 455 | #else | 583 | #else |
| 584 | static inline int erratum_a15_798181(void) | ||
| 585 | { | ||
| 586 | return 0; | ||
| 587 | } | ||
| 588 | |||
| 456 | static inline void dummy_flush_tlb_a15_erratum(void) | 589 | static inline void dummy_flush_tlb_a15_erratum(void) |
| 457 | { | 590 | { |
| 458 | } | 591 | } |
| @@ -479,7 +612,7 @@ static inline void flush_pmd_entry(void *pmd) | |||
| 479 | tlb_l2_op(TLB_L2CLEAN_FR, "c15, c9, 1 @ L2 flush_pmd", pmd); | 612 | tlb_l2_op(TLB_L2CLEAN_FR, "c15, c9, 1 @ L2 flush_pmd", pmd); |
| 480 | 613 | ||
| 481 | if (tlb_flag(TLB_WB)) | 614 | if (tlb_flag(TLB_WB)) |
| 482 | dsb(); | 615 | dsb(ishst); |
| 483 | } | 616 | } |
| 484 | 617 | ||
| 485 | static inline void clean_pmd_entry(void *pmd) | 618 | static inline void clean_pmd_entry(void *pmd) |
diff --git a/arch/arm/include/asm/virt.h b/arch/arm/include/asm/virt.h index 50af92bac737..4371f45c5784 100644 --- a/arch/arm/include/asm/virt.h +++ b/arch/arm/include/asm/virt.h | |||
| @@ -29,6 +29,7 @@ | |||
| 29 | #define BOOT_CPU_MODE_MISMATCH PSR_N_BIT | 29 | #define BOOT_CPU_MODE_MISMATCH PSR_N_BIT |
| 30 | 30 | ||
| 31 | #ifndef __ASSEMBLY__ | 31 | #ifndef __ASSEMBLY__ |
| 32 | #include <asm/cacheflush.h> | ||
| 32 | 33 | ||
| 33 | #ifdef CONFIG_ARM_VIRT_EXT | 34 | #ifdef CONFIG_ARM_VIRT_EXT |
| 34 | /* | 35 | /* |
| @@ -41,10 +42,21 @@ | |||
| 41 | */ | 42 | */ |
| 42 | extern int __boot_cpu_mode; | 43 | extern int __boot_cpu_mode; |
| 43 | 44 | ||
| 45 | static inline void sync_boot_mode(void) | ||
| 46 | { | ||
| 47 | /* | ||
| 48 | * As secondaries write to __boot_cpu_mode with caches disabled, we | ||
| 49 | * must flush the corresponding cache entries to ensure the visibility | ||
| 50 | * of their writes. | ||
| 51 | */ | ||
| 52 | sync_cache_r(&__boot_cpu_mode); | ||
| 53 | } | ||
| 54 | |||
| 44 | void __hyp_set_vectors(unsigned long phys_vector_base); | 55 | void __hyp_set_vectors(unsigned long phys_vector_base); |
| 45 | unsigned long __hyp_get_vectors(void); | 56 | unsigned long __hyp_get_vectors(void); |
| 46 | #else | 57 | #else |
| 47 | #define __boot_cpu_mode (SVC_MODE) | 58 | #define __boot_cpu_mode (SVC_MODE) |
| 59 | #define sync_boot_mode() | ||
| 48 | #endif | 60 | #endif |
| 49 | 61 | ||
| 50 | #ifndef ZIMAGE | 62 | #ifndef ZIMAGE |
diff --git a/arch/arm/include/uapi/asm/Kbuild b/arch/arm/include/uapi/asm/Kbuild index 47bcb2d254af..18d76fd5a2af 100644 --- a/arch/arm/include/uapi/asm/Kbuild +++ b/arch/arm/include/uapi/asm/Kbuild | |||
| @@ -1,7 +1,6 @@ | |||
| 1 | # UAPI Header export list | 1 | # UAPI Header export list |
| 2 | include include/uapi/asm-generic/Kbuild.asm | 2 | include include/uapi/asm-generic/Kbuild.asm |
| 3 | 3 | ||
| 4 | header-y += a.out.h | ||
| 5 | header-y += byteorder.h | 4 | header-y += byteorder.h |
| 6 | header-y += fcntl.h | 5 | header-y += fcntl.h |
| 7 | header-y += hwcap.h | 6 | header-y += hwcap.h |
diff --git a/arch/arm/include/uapi/asm/a.out.h b/arch/arm/include/uapi/asm/a.out.h deleted file mode 100644 index 083894b2e3bc..000000000000 --- a/arch/arm/include/uapi/asm/a.out.h +++ /dev/null | |||
| @@ -1,34 +0,0 @@ | |||
| 1 | #ifndef __ARM_A_OUT_H__ | ||
| 2 | #define __ARM_A_OUT_H__ | ||
| 3 | |||
| 4 | #include <linux/personality.h> | ||
| 5 | #include <linux/types.h> | ||
| 6 | |||
| 7 | struct exec | ||
| 8 | { | ||
| 9 | __u32 a_info; /* Use macros N_MAGIC, etc for access */ | ||
| 10 | __u32 a_text; /* length of text, in bytes */ | ||
| 11 | __u32 a_data; /* length of data, in bytes */ | ||
| 12 | __u32 a_bss; /* length of uninitialized data area for file, in bytes */ | ||
| 13 | __u32 a_syms; /* length of symbol table data in file, in bytes */ | ||
| 14 | __u32 a_entry; /* start address */ | ||
| 15 | __u32 a_trsize; /* length of relocation info for text, in bytes */ | ||
| 16 | __u32 a_drsize; /* length of relocation info for data, in bytes */ | ||
| 17 | }; | ||
| 18 | |||
| 19 | /* | ||
| 20 | * This is always the same | ||
| 21 | */ | ||
| 22 | #define N_TXTADDR(a) (0x00008000) | ||
| 23 | |||
| 24 | #define N_TRSIZE(a) ((a).a_trsize) | ||
| 25 | #define N_DRSIZE(a) ((a).a_drsize) | ||
| 26 | #define N_SYMSIZE(a) ((a).a_syms) | ||
| 27 | |||
| 28 | #define M_ARM 103 | ||
| 29 | |||
| 30 | #ifndef LIBRARY_START_TEXT | ||
| 31 | #define LIBRARY_START_TEXT (0x00c00000) | ||
| 32 | #endif | ||
| 33 | |||
| 34 | #endif /* __A_OUT_GNU_H__ */ | ||
