diff options
Diffstat (limited to 'arch/arm/include')
| -rw-r--r-- | arch/arm/include/asm/elf.h | 4 | ||||
| -rw-r--r-- | arch/arm/include/asm/hwcap.h | 1 | ||||
| -rw-r--r-- | arch/arm/include/asm/irq.h | 2 | ||||
| -rw-r--r-- | arch/arm/include/asm/kexec.h | 22 | ||||
| -rw-r--r-- | arch/arm/include/asm/mach/arch.h | 2 | ||||
| -rw-r--r-- | arch/arm/include/asm/mach/irq.h | 1 | ||||
| -rw-r--r-- | arch/arm/include/asm/mach/map.h | 2 | ||||
| -rw-r--r-- | arch/arm/include/asm/mach/pci.h | 1 | ||||
| -rw-r--r-- | arch/arm/include/asm/memblock.h | 16 | ||||
| -rw-r--r-- | arch/arm/include/asm/memory.h | 76 | ||||
| -rw-r--r-- | arch/arm/include/asm/mmzone.h | 30 | ||||
| -rw-r--r-- | arch/arm/include/asm/ptrace.h | 36 | ||||
| -rw-r--r-- | arch/arm/include/asm/setup.h | 8 | ||||
| -rw-r--r-- | arch/arm/include/asm/stackprotector.h | 38 | ||||
| -rw-r--r-- | arch/arm/include/asm/system.h | 2 | ||||
| -rw-r--r-- | arch/arm/include/asm/tls.h | 46 | ||||
| -rw-r--r-- | arch/arm/include/asm/vfpmacros.h | 18 |
17 files changed, 200 insertions, 105 deletions
diff --git a/arch/arm/include/asm/elf.h b/arch/arm/include/asm/elf.h index 51662feb9f1..6750b8e45a4 100644 --- a/arch/arm/include/asm/elf.h +++ b/arch/arm/include/asm/elf.h | |||
| @@ -121,4 +121,8 @@ int dump_task_regs(struct task_struct *t, elf_gregset_t *elfregs); | |||
| 121 | extern void elf_set_personality(const struct elf32_hdr *); | 121 | extern void elf_set_personality(const struct elf32_hdr *); |
| 122 | #define SET_PERSONALITY(ex) elf_set_personality(&(ex)) | 122 | #define SET_PERSONALITY(ex) elf_set_personality(&(ex)) |
| 123 | 123 | ||
| 124 | struct mm_struct; | ||
| 125 | extern unsigned long arch_randomize_brk(struct mm_struct *mm); | ||
| 126 | #define arch_randomize_brk arch_randomize_brk | ||
| 127 | |||
| 124 | #endif | 128 | #endif |
diff --git a/arch/arm/include/asm/hwcap.h b/arch/arm/include/asm/hwcap.h index f7bd52b1c36..c1062c31710 100644 --- a/arch/arm/include/asm/hwcap.h +++ b/arch/arm/include/asm/hwcap.h | |||
| @@ -19,6 +19,7 @@ | |||
| 19 | #define HWCAP_NEON 4096 | 19 | #define HWCAP_NEON 4096 |
| 20 | #define HWCAP_VFPv3 8192 | 20 | #define HWCAP_VFPv3 8192 |
| 21 | #define HWCAP_VFPv3D16 16384 | 21 | #define HWCAP_VFPv3D16 16384 |
| 22 | #define HWCAP_TLS 32768 | ||
| 22 | 23 | ||
| 23 | #if defined(__KERNEL__) && !defined(__ASSEMBLY__) | 24 | #if defined(__KERNEL__) && !defined(__ASSEMBLY__) |
| 24 | /* | 25 | /* |
diff --git a/arch/arm/include/asm/irq.h b/arch/arm/include/asm/irq.h index 237282f7c76..2721a5814cb 100644 --- a/arch/arm/include/asm/irq.h +++ b/arch/arm/include/asm/irq.h | |||
| @@ -7,6 +7,8 @@ | |||
| 7 | #define irq_canonicalize(i) (i) | 7 | #define irq_canonicalize(i) (i) |
| 8 | #endif | 8 | #endif |
| 9 | 9 | ||
| 10 | #define NR_IRQS_LEGACY 16 | ||
| 11 | |||
| 10 | /* | 12 | /* |
| 11 | * Use this value to indicate lack of interrupt | 13 | * Use this value to indicate lack of interrupt |
| 12 | * capability | 14 | * capability |
diff --git a/arch/arm/include/asm/kexec.h b/arch/arm/include/asm/kexec.h index df15a0dc228..8ec9ef5c3c7 100644 --- a/arch/arm/include/asm/kexec.h +++ b/arch/arm/include/asm/kexec.h | |||
| @@ -19,10 +19,26 @@ | |||
| 19 | 19 | ||
| 20 | #ifndef __ASSEMBLY__ | 20 | #ifndef __ASSEMBLY__ |
| 21 | 21 | ||
| 22 | struct kimage; | 22 | /** |
| 23 | /* Provide a dummy definition to avoid build failures. */ | 23 | * crash_setup_regs() - save registers for the panic kernel |
| 24 | * @newregs: registers are saved here | ||
| 25 | * @oldregs: registers to be saved (may be %NULL) | ||
| 26 | * | ||
| 27 | * Function copies machine registers from @oldregs to @newregs. If @oldregs is | ||
| 28 | * %NULL then current registers are stored there. | ||
| 29 | */ | ||
| 24 | static inline void crash_setup_regs(struct pt_regs *newregs, | 30 | static inline void crash_setup_regs(struct pt_regs *newregs, |
| 25 | struct pt_regs *oldregs) { } | 31 | struct pt_regs *oldregs) |
| 32 | { | ||
| 33 | if (oldregs) { | ||
| 34 | memcpy(newregs, oldregs, sizeof(*newregs)); | ||
| 35 | } else { | ||
| 36 | __asm__ __volatile__ ("stmia %0, {r0 - r15}" | ||
| 37 | : : "r" (&newregs->ARM_r0)); | ||
| 38 | __asm__ __volatile__ ("mrs %0, cpsr" | ||
| 39 | : "=r" (newregs->ARM_cpsr)); | ||
| 40 | } | ||
| 41 | } | ||
| 26 | 42 | ||
| 27 | #endif /* __ASSEMBLY__ */ | 43 | #endif /* __ASSEMBLY__ */ |
| 28 | 44 | ||
diff --git a/arch/arm/include/asm/mach/arch.h b/arch/arm/include/asm/mach/arch.h index c59842dc7cb..8a0dd18ba64 100644 --- a/arch/arm/include/asm/mach/arch.h +++ b/arch/arm/include/asm/mach/arch.h | |||
| @@ -20,6 +20,7 @@ struct machine_desc { | |||
| 20 | * by assembler code in head.S, head-common.S | 20 | * by assembler code in head.S, head-common.S |
| 21 | */ | 21 | */ |
| 22 | unsigned int nr; /* architecture number */ | 22 | unsigned int nr; /* architecture number */ |
| 23 | unsigned int nr_irqs; /* number of IRQs */ | ||
| 23 | unsigned int phys_io; /* start of physical io */ | 24 | unsigned int phys_io; /* start of physical io */ |
| 24 | unsigned int io_pg_offst; /* byte offset for io | 25 | unsigned int io_pg_offst; /* byte offset for io |
| 25 | * page tabe entry */ | 26 | * page tabe entry */ |
| @@ -37,6 +38,7 @@ struct machine_desc { | |||
| 37 | void (*fixup)(struct machine_desc *, | 38 | void (*fixup)(struct machine_desc *, |
| 38 | struct tag *, char **, | 39 | struct tag *, char **, |
| 39 | struct meminfo *); | 40 | struct meminfo *); |
| 41 | void (*reserve)(void);/* reserve mem blocks */ | ||
| 40 | void (*map_io)(void);/* IO mapping function */ | 42 | void (*map_io)(void);/* IO mapping function */ |
| 41 | void (*init_irq)(void); | 43 | void (*init_irq)(void); |
| 42 | struct sys_timer *timer; /* system tick timer */ | 44 | struct sys_timer *timer; /* system tick timer */ |
diff --git a/arch/arm/include/asm/mach/irq.h b/arch/arm/include/asm/mach/irq.h index 8920b2d6e3b..ce3eee9fe26 100644 --- a/arch/arm/include/asm/mach/irq.h +++ b/arch/arm/include/asm/mach/irq.h | |||
| @@ -17,6 +17,7 @@ struct seq_file; | |||
| 17 | /* | 17 | /* |
| 18 | * This is internal. Do not use it. | 18 | * This is internal. Do not use it. |
| 19 | */ | 19 | */ |
| 20 | extern unsigned int arch_nr_irqs; | ||
| 20 | extern void (*init_arch_irq)(void); | 21 | extern void (*init_arch_irq)(void); |
| 21 | extern void init_FIQ(void); | 22 | extern void init_FIQ(void); |
| 22 | extern int show_fiq_list(struct seq_file *, void *); | 23 | extern int show_fiq_list(struct seq_file *, void *); |
diff --git a/arch/arm/include/asm/mach/map.h b/arch/arm/include/asm/mach/map.h index 742c2aaeb02..d2fedb5aeb1 100644 --- a/arch/arm/include/asm/mach/map.h +++ b/arch/arm/include/asm/mach/map.h | |||
| @@ -27,6 +27,8 @@ struct map_desc { | |||
| 27 | #define MT_MEMORY 9 | 27 | #define MT_MEMORY 9 |
| 28 | #define MT_ROM 10 | 28 | #define MT_ROM 10 |
| 29 | #define MT_MEMORY_NONCACHED 11 | 29 | #define MT_MEMORY_NONCACHED 11 |
| 30 | #define MT_MEMORY_DTCM 12 | ||
| 31 | #define MT_MEMORY_ITCM 13 | ||
| 30 | 32 | ||
| 31 | #ifdef CONFIG_MMU | 33 | #ifdef CONFIG_MMU |
| 32 | extern void iotable_init(struct map_desc *, int); | 34 | extern void iotable_init(struct map_desc *, int); |
diff --git a/arch/arm/include/asm/mach/pci.h b/arch/arm/include/asm/mach/pci.h index 52f0da1e97d..16330bd0657 100644 --- a/arch/arm/include/asm/mach/pci.h +++ b/arch/arm/include/asm/mach/pci.h | |||
| @@ -46,6 +46,7 @@ struct pci_sys_data { | |||
| 46 | /* IRQ mapping */ | 46 | /* IRQ mapping */ |
| 47 | int (*map_irq)(struct pci_dev *, u8, u8); | 47 | int (*map_irq)(struct pci_dev *, u8, u8); |
| 48 | struct hw_pci *hw; | 48 | struct hw_pci *hw; |
| 49 | void *private_data; /* platform controller private data */ | ||
| 49 | }; | 50 | }; |
| 50 | 51 | ||
| 51 | /* | 52 | /* |
diff --git a/arch/arm/include/asm/memblock.h b/arch/arm/include/asm/memblock.h new file mode 100644 index 00000000000..fdbc43b2e6c --- /dev/null +++ b/arch/arm/include/asm/memblock.h | |||
| @@ -0,0 +1,16 @@ | |||
| 1 | #ifndef _ASM_ARM_MEMBLOCK_H | ||
| 2 | #define _ASM_ARM_MEMBLOCK_H | ||
| 3 | |||
| 4 | #ifdef CONFIG_MMU | ||
| 5 | extern phys_addr_t lowmem_end_addr; | ||
| 6 | #define MEMBLOCK_REAL_LIMIT lowmem_end_addr | ||
| 7 | #else | ||
| 8 | #define MEMBLOCK_REAL_LIMIT 0 | ||
| 9 | #endif | ||
| 10 | |||
| 11 | struct meminfo; | ||
| 12 | struct machine_desc; | ||
| 13 | |||
| 14 | extern void arm_memblock_init(struct meminfo *, struct machine_desc *); | ||
| 15 | |||
| 16 | #endif | ||
diff --git a/arch/arm/include/asm/memory.h b/arch/arm/include/asm/memory.h index 4312ee5e3d0..23c2e8e5c0f 100644 --- a/arch/arm/include/asm/memory.h +++ b/arch/arm/include/asm/memory.h | |||
| @@ -124,6 +124,15 @@ | |||
| 124 | #endif /* !CONFIG_MMU */ | 124 | #endif /* !CONFIG_MMU */ |
| 125 | 125 | ||
| 126 | /* | 126 | /* |
| 127 | * We fix the TCM memories max 32 KiB ITCM resp DTCM at these | ||
| 128 | * locations | ||
| 129 | */ | ||
| 130 | #ifdef CONFIG_HAVE_TCM | ||
| 131 | #define ITCM_OFFSET UL(0xfffe0000) | ||
| 132 | #define DTCM_OFFSET UL(0xfffe8000) | ||
| 133 | #endif | ||
| 134 | |||
| 135 | /* | ||
| 127 | * Physical vs virtual RAM address space conversion. These are | 136 | * Physical vs virtual RAM address space conversion. These are |
| 128 | * private definitions which should NOT be used outside memory.h | 137 | * private definitions which should NOT be used outside memory.h |
| 129 | * files. Use virt_to_phys/phys_to_virt/__pa/__va instead. | 138 | * files. Use virt_to_phys/phys_to_virt/__pa/__va instead. |
| @@ -158,7 +167,7 @@ | |||
| 158 | #endif | 167 | #endif |
| 159 | 168 | ||
| 160 | #ifndef arch_adjust_zones | 169 | #ifndef arch_adjust_zones |
| 161 | #define arch_adjust_zones(node,size,holes) do { } while (0) | 170 | #define arch_adjust_zones(size,holes) do { } while (0) |
| 162 | #elif !defined(CONFIG_ZONE_DMA) | 171 | #elif !defined(CONFIG_ZONE_DMA) |
| 163 | #error "custom arch_adjust_zones() requires CONFIG_ZONE_DMA" | 172 | #error "custom arch_adjust_zones() requires CONFIG_ZONE_DMA" |
| 164 | #endif | 173 | #endif |
| @@ -234,76 +243,11 @@ static inline __deprecated void *bus_to_virt(unsigned long x) | |||
| 234 | * virt_to_page(k) convert a _valid_ virtual address to struct page * | 243 | * virt_to_page(k) convert a _valid_ virtual address to struct page * |
| 235 | * virt_addr_valid(k) indicates whether a virtual address is valid | 244 | * virt_addr_valid(k) indicates whether a virtual address is valid |
| 236 | */ | 245 | */ |
| 237 | #ifndef CONFIG_DISCONTIGMEM | ||
| 238 | |||
| 239 | #define ARCH_PFN_OFFSET PHYS_PFN_OFFSET | 246 | #define ARCH_PFN_OFFSET PHYS_PFN_OFFSET |
| 240 | 247 | ||
| 241 | #define virt_to_page(kaddr) pfn_to_page(__pa(kaddr) >> PAGE_SHIFT) | 248 | #define virt_to_page(kaddr) pfn_to_page(__pa(kaddr) >> PAGE_SHIFT) |
| 242 | #define virt_addr_valid(kaddr) ((unsigned long)(kaddr) >= PAGE_OFFSET && (unsigned long)(kaddr) < (unsigned long)high_memory) | 249 | #define virt_addr_valid(kaddr) ((unsigned long)(kaddr) >= PAGE_OFFSET && (unsigned long)(kaddr) < (unsigned long)high_memory) |
| 243 | 250 | ||
| 244 | #define PHYS_TO_NID(addr) (0) | ||
| 245 | |||
| 246 | #else /* CONFIG_DISCONTIGMEM */ | ||
| 247 | |||
| 248 | /* | ||
| 249 | * This is more complex. We have a set of mem_map arrays spread | ||
| 250 | * around in memory. | ||
| 251 | */ | ||
| 252 | #include <linux/numa.h> | ||
| 253 | |||
| 254 | #define arch_pfn_to_nid(pfn) PFN_TO_NID(pfn) | ||
| 255 | #define arch_local_page_offset(pfn, nid) LOCAL_MAP_NR((pfn) << PAGE_SHIFT) | ||
| 256 | |||
| 257 | #define virt_to_page(kaddr) \ | ||
| 258 | (ADDR_TO_MAPBASE(kaddr) + LOCAL_MAP_NR(kaddr)) | ||
| 259 | |||
| 260 | #define virt_addr_valid(kaddr) (KVADDR_TO_NID(kaddr) < MAX_NUMNODES) | ||
| 261 | |||
| 262 | /* | ||
| 263 | * Common discontigmem stuff. | ||
| 264 | * PHYS_TO_NID is used by the ARM kernel/setup.c | ||
| 265 | */ | ||
| 266 | #define PHYS_TO_NID(addr) PFN_TO_NID((addr) >> PAGE_SHIFT) | ||
| 267 | |||
| 268 | /* | ||
| 269 | * Given a kaddr, ADDR_TO_MAPBASE finds the owning node of the memory | ||
| 270 | * and returns the mem_map of that node. | ||
| 271 | */ | ||
| 272 | #define ADDR_TO_MAPBASE(kaddr) NODE_MEM_MAP(KVADDR_TO_NID(kaddr)) | ||
| 273 | |||
| 274 | /* | ||
| 275 | * Given a page frame number, find the owning node of the memory | ||
| 276 | * and returns the mem_map of that node. | ||
| 277 | */ | ||
| 278 | #define PFN_TO_MAPBASE(pfn) NODE_MEM_MAP(PFN_TO_NID(pfn)) | ||
| 279 | |||
| 280 | #ifdef NODE_MEM_SIZE_BITS | ||
| 281 | #define NODE_MEM_SIZE_MASK ((1 << NODE_MEM_SIZE_BITS) - 1) | ||
| 282 | |||
| 283 | /* | ||
| 284 | * Given a kernel address, find the home node of the underlying memory. | ||
| 285 | */ | ||
| 286 | #define KVADDR_TO_NID(addr) \ | ||
| 287 | (((unsigned long)(addr) - PAGE_OFFSET) >> NODE_MEM_SIZE_BITS) | ||
| 288 | |||
| 289 | /* | ||
| 290 | * Given a page frame number, convert it to a node id. | ||
| 291 | */ | ||
| 292 | #define PFN_TO_NID(pfn) \ | ||
| 293 | (((pfn) - PHYS_PFN_OFFSET) >> (NODE_MEM_SIZE_BITS - PAGE_SHIFT)) | ||
| 294 | |||
| 295 | /* | ||
| 296 | * Given a kaddr, LOCAL_MEM_MAP finds the owning node of the memory | ||
| 297 | * and returns the index corresponding to the appropriate page in the | ||
| 298 | * node's mem_map. | ||
| 299 | */ | ||
| 300 | #define LOCAL_MAP_NR(addr) \ | ||
| 301 | (((unsigned long)(addr) & NODE_MEM_SIZE_MASK) >> PAGE_SHIFT) | ||
| 302 | |||
| 303 | #endif /* NODE_MEM_SIZE_BITS */ | ||
| 304 | |||
| 305 | #endif /* !CONFIG_DISCONTIGMEM */ | ||
| 306 | |||
| 307 | /* | 251 | /* |
| 308 | * Optional coherency support. Currently used only by selected | 252 | * Optional coherency support. Currently used only by selected |
| 309 | * Intel XSC3-based systems. | 253 | * Intel XSC3-based systems. |
diff --git a/arch/arm/include/asm/mmzone.h b/arch/arm/include/asm/mmzone.h deleted file mode 100644 index ae63a4fd28c..00000000000 --- a/arch/arm/include/asm/mmzone.h +++ /dev/null | |||
| @@ -1,30 +0,0 @@ | |||
| 1 | /* | ||
| 2 | * arch/arm/include/asm/mmzone.h | ||
| 3 | * | ||
| 4 | * 1999-12-29 Nicolas Pitre Created | ||
| 5 | * | ||
| 6 | * This program is free software; you can redistribute it and/or modify | ||
| 7 | * it under the terms of the GNU General Public License version 2 as | ||
| 8 | * published by the Free Software Foundation. | ||
| 9 | */ | ||
| 10 | #ifndef __ASM_MMZONE_H | ||
| 11 | #define __ASM_MMZONE_H | ||
| 12 | |||
| 13 | /* | ||
| 14 | * Currently defined in arch/arm/mm/discontig.c | ||
| 15 | */ | ||
| 16 | extern pg_data_t discontig_node_data[]; | ||
| 17 | |||
| 18 | /* | ||
| 19 | * Return a pointer to the node data for node n. | ||
| 20 | */ | ||
| 21 | #define NODE_DATA(nid) (&discontig_node_data[nid]) | ||
| 22 | |||
| 23 | /* | ||
| 24 | * NODE_MEM_MAP gives the kaddr for the mem_map of the node. | ||
| 25 | */ | ||
| 26 | #define NODE_MEM_MAP(nid) (NODE_DATA(nid)->node_mem_map) | ||
| 27 | |||
| 28 | #include <mach/memory.h> | ||
| 29 | |||
| 30 | #endif | ||
diff --git a/arch/arm/include/asm/ptrace.h b/arch/arm/include/asm/ptrace.h index 9dcb11e5902..c974be8913a 100644 --- a/arch/arm/include/asm/ptrace.h +++ b/arch/arm/include/asm/ptrace.h | |||
| @@ -184,6 +184,42 @@ extern unsigned long profile_pc(struct pt_regs *regs); | |||
| 184 | #define predicate(x) ((x) & 0xf0000000) | 184 | #define predicate(x) ((x) & 0xf0000000) |
| 185 | #define PREDICATE_ALWAYS 0xe0000000 | 185 | #define PREDICATE_ALWAYS 0xe0000000 |
| 186 | 186 | ||
| 187 | /* | ||
| 188 | * kprobe-based event tracer support | ||
| 189 | */ | ||
| 190 | #include <linux/stddef.h> | ||
| 191 | #include <linux/types.h> | ||
| 192 | #define MAX_REG_OFFSET (offsetof(struct pt_regs, ARM_ORIG_r0)) | ||
| 193 | |||
| 194 | extern int regs_query_register_offset(const char *name); | ||
| 195 | extern const char *regs_query_register_name(unsigned int offset); | ||
| 196 | extern bool regs_within_kernel_stack(struct pt_regs *regs, unsigned long addr); | ||
| 197 | extern unsigned long regs_get_kernel_stack_nth(struct pt_regs *regs, | ||
| 198 | unsigned int n); | ||
| 199 | |||
| 200 | /** | ||
| 201 | * regs_get_register() - get register value from its offset | ||
| 202 | * @regs: pt_regs from which register value is gotten | ||
| 203 | * @offset: offset number of the register. | ||
| 204 | * | ||
| 205 | * regs_get_register returns the value of a register whose offset from @regs. | ||
| 206 | * The @offset is the offset of the register in struct pt_regs. | ||
| 207 | * If @offset is bigger than MAX_REG_OFFSET, this returns 0. | ||
| 208 | */ | ||
| 209 | static inline unsigned long regs_get_register(struct pt_regs *regs, | ||
| 210 | unsigned int offset) | ||
| 211 | { | ||
| 212 | if (unlikely(offset > MAX_REG_OFFSET)) | ||
| 213 | return 0; | ||
| 214 | return *(unsigned long *)((unsigned long)regs + offset); | ||
| 215 | } | ||
| 216 | |||
| 217 | /* Valid only for Kernel mode traps. */ | ||
| 218 | static inline unsigned long kernel_stack_pointer(struct pt_regs *regs) | ||
| 219 | { | ||
| 220 | return regs->ARM_sp; | ||
| 221 | } | ||
| 222 | |||
| 187 | #endif /* __KERNEL__ */ | 223 | #endif /* __KERNEL__ */ |
| 188 | 224 | ||
| 189 | #endif /* __ASSEMBLY__ */ | 225 | #endif /* __ASSEMBLY__ */ |
diff --git a/arch/arm/include/asm/setup.h b/arch/arm/include/asm/setup.h index f392fb4437a..f1e5a9bca24 100644 --- a/arch/arm/include/asm/setup.h +++ b/arch/arm/include/asm/setup.h | |||
| @@ -201,8 +201,7 @@ static struct tagtable __tagtable_##fn __tag = { tag, fn } | |||
| 201 | struct membank { | 201 | struct membank { |
| 202 | unsigned long start; | 202 | unsigned long start; |
| 203 | unsigned long size; | 203 | unsigned long size; |
| 204 | unsigned short node; | 204 | unsigned int highmem; |
| 205 | unsigned short highmem; | ||
| 206 | }; | 205 | }; |
| 207 | 206 | ||
| 208 | struct meminfo { | 207 | struct meminfo { |
| @@ -212,9 +211,8 @@ struct meminfo { | |||
| 212 | 211 | ||
| 213 | extern struct meminfo meminfo; | 212 | extern struct meminfo meminfo; |
| 214 | 213 | ||
| 215 | #define for_each_nodebank(iter,mi,no) \ | 214 | #define for_each_bank(iter,mi) \ |
| 216 | for (iter = 0; iter < (mi)->nr_banks; iter++) \ | 215 | for (iter = 0; iter < (mi)->nr_banks; iter++) |
| 217 | if ((mi)->bank[iter].node == no) | ||
| 218 | 216 | ||
| 219 | #define bank_pfn_start(bank) __phys_to_pfn((bank)->start) | 217 | #define bank_pfn_start(bank) __phys_to_pfn((bank)->start) |
| 220 | #define bank_pfn_end(bank) __phys_to_pfn((bank)->start + (bank)->size) | 218 | #define bank_pfn_end(bank) __phys_to_pfn((bank)->start + (bank)->size) |
diff --git a/arch/arm/include/asm/stackprotector.h b/arch/arm/include/asm/stackprotector.h new file mode 100644 index 00000000000..de003327be9 --- /dev/null +++ b/arch/arm/include/asm/stackprotector.h | |||
| @@ -0,0 +1,38 @@ | |||
| 1 | /* | ||
| 2 | * GCC stack protector support. | ||
| 3 | * | ||
| 4 | * Stack protector works by putting predefined pattern at the start of | ||
| 5 | * the stack frame and verifying that it hasn't been overwritten when | ||
| 6 | * returning from the function. The pattern is called stack canary | ||
| 7 | * and gcc expects it to be defined by a global variable called | ||
| 8 | * "__stack_chk_guard" on ARM. This unfortunately means that on SMP | ||
| 9 | * we cannot have a different canary value per task. | ||
| 10 | */ | ||
| 11 | |||
| 12 | #ifndef _ASM_STACKPROTECTOR_H | ||
| 13 | #define _ASM_STACKPROTECTOR_H 1 | ||
| 14 | |||
| 15 | #include <linux/random.h> | ||
| 16 | #include <linux/version.h> | ||
| 17 | |||
| 18 | extern unsigned long __stack_chk_guard; | ||
| 19 | |||
| 20 | /* | ||
| 21 | * Initialize the stackprotector canary value. | ||
| 22 | * | ||
| 23 | * NOTE: this must only be called from functions that never return, | ||
| 24 | * and it must always be inlined. | ||
| 25 | */ | ||
| 26 | static __always_inline void boot_init_stack_canary(void) | ||
| 27 | { | ||
| 28 | unsigned long canary; | ||
| 29 | |||
| 30 | /* Try to get a semi random initial value. */ | ||
| 31 | get_random_bytes(&canary, sizeof(canary)); | ||
| 32 | canary ^= LINUX_VERSION_CODE; | ||
| 33 | |||
| 34 | current->stack_canary = canary; | ||
| 35 | __stack_chk_guard = current->stack_canary; | ||
| 36 | } | ||
| 37 | |||
| 38 | #endif /* _ASM_STACKPROTECTOR_H */ | ||
diff --git a/arch/arm/include/asm/system.h b/arch/arm/include/asm/system.h index 5f4f4800273..8ba1ccf82a0 100644 --- a/arch/arm/include/asm/system.h +++ b/arch/arm/include/asm/system.h | |||
| @@ -83,7 +83,7 @@ void arm_notify_die(const char *str, struct pt_regs *regs, struct siginfo *info, | |||
| 83 | 83 | ||
| 84 | void hook_fault_code(int nr, int (*fn)(unsigned long, unsigned int, | 84 | void hook_fault_code(int nr, int (*fn)(unsigned long, unsigned int, |
| 85 | struct pt_regs *), | 85 | struct pt_regs *), |
| 86 | int sig, const char *name); | 86 | int sig, int code, const char *name); |
| 87 | 87 | ||
| 88 | #define xchg(ptr,x) \ | 88 | #define xchg(ptr,x) \ |
| 89 | ((__typeof__(*(ptr)))__xchg((unsigned long)(x),(ptr),sizeof(*(ptr)))) | 89 | ((__typeof__(*(ptr)))__xchg((unsigned long)(x),(ptr),sizeof(*(ptr)))) |
diff --git a/arch/arm/include/asm/tls.h b/arch/arm/include/asm/tls.h new file mode 100644 index 00000000000..e71d6ff8d10 --- /dev/null +++ b/arch/arm/include/asm/tls.h | |||
| @@ -0,0 +1,46 @@ | |||
| 1 | #ifndef __ASMARM_TLS_H | ||
| 2 | #define __ASMARM_TLS_H | ||
| 3 | |||
| 4 | #ifdef __ASSEMBLY__ | ||
| 5 | .macro set_tls_none, tp, tmp1, tmp2 | ||
| 6 | .endm | ||
| 7 | |||
| 8 | .macro set_tls_v6k, tp, tmp1, tmp2 | ||
| 9 | mcr p15, 0, \tp, c13, c0, 3 @ set TLS register | ||
| 10 | .endm | ||
| 11 | |||
| 12 | .macro set_tls_v6, tp, tmp1, tmp2 | ||
| 13 | ldr \tmp1, =elf_hwcap | ||
| 14 | ldr \tmp1, [\tmp1, #0] | ||
| 15 | mov \tmp2, #0xffff0fff | ||
| 16 | tst \tmp1, #HWCAP_TLS @ hardware TLS available? | ||
| 17 | mcrne p15, 0, \tp, c13, c0, 3 @ yes, set TLS register | ||
| 18 | streq \tp, [\tmp2, #-15] @ set TLS value at 0xffff0ff0 | ||
| 19 | .endm | ||
| 20 | |||
| 21 | .macro set_tls_software, tp, tmp1, tmp2 | ||
| 22 | mov \tmp1, #0xffff0fff | ||
| 23 | str \tp, [\tmp1, #-15] @ set TLS value at 0xffff0ff0 | ||
| 24 | .endm | ||
| 25 | #endif | ||
| 26 | |||
| 27 | #ifdef CONFIG_TLS_REG_EMUL | ||
| 28 | #define tls_emu 1 | ||
| 29 | #define has_tls_reg 1 | ||
| 30 | #define set_tls set_tls_none | ||
| 31 | #elif __LINUX_ARM_ARCH__ >= 7 || \ | ||
| 32 | (__LINUX_ARM_ARCH__ == 6 && defined(CONFIG_CPU_32v6K)) | ||
| 33 | #define tls_emu 0 | ||
| 34 | #define has_tls_reg 1 | ||
| 35 | #define set_tls set_tls_v6k | ||
| 36 | #elif __LINUX_ARM_ARCH__ == 6 | ||
| 37 | #define tls_emu 0 | ||
| 38 | #define has_tls_reg (elf_hwcap & HWCAP_TLS) | ||
| 39 | #define set_tls set_tls_v6 | ||
| 40 | #else | ||
| 41 | #define tls_emu 0 | ||
| 42 | #define has_tls_reg 0 | ||
| 43 | #define set_tls set_tls_software | ||
| 44 | #endif | ||
| 45 | |||
| 46 | #endif /* __ASMARM_TLS_H */ | ||
diff --git a/arch/arm/include/asm/vfpmacros.h b/arch/arm/include/asm/vfpmacros.h index 422f3cc204a..3d5fc41ae8d 100644 --- a/arch/arm/include/asm/vfpmacros.h +++ b/arch/arm/include/asm/vfpmacros.h | |||
| @@ -3,6 +3,8 @@ | |||
| 3 | * | 3 | * |
| 4 | * Assembler-only file containing VFP macros and register definitions. | 4 | * Assembler-only file containing VFP macros and register definitions. |
| 5 | */ | 5 | */ |
| 6 | #include <asm/hwcap.h> | ||
| 7 | |||
| 6 | #include "vfp.h" | 8 | #include "vfp.h" |
| 7 | 9 | ||
| 8 | @ Macros to allow building with old toolkits (with no VFP support) | 10 | @ Macros to allow building with old toolkits (with no VFP support) |
| @@ -22,12 +24,20 @@ | |||
| 22 | LDC p11, cr0, [\base],#32*4 @ FLDMIAD \base!, {d0-d15} | 24 | LDC p11, cr0, [\base],#32*4 @ FLDMIAD \base!, {d0-d15} |
| 23 | #endif | 25 | #endif |
| 24 | #ifdef CONFIG_VFPv3 | 26 | #ifdef CONFIG_VFPv3 |
| 27 | #if __LINUX_ARM_ARCH__ <= 6 | ||
| 28 | ldr \tmp, =elf_hwcap @ may not have MVFR regs | ||
| 29 | ldr \tmp, [\tmp, #0] | ||
| 30 | tst \tmp, #HWCAP_VFPv3D16 | ||
| 31 | ldceq p11, cr0, [\base],#32*4 @ FLDMIAD \base!, {d16-d31} | ||
| 32 | addne \base, \base, #32*4 @ step over unused register space | ||
| 33 | #else | ||
| 25 | VFPFMRX \tmp, MVFR0 @ Media and VFP Feature Register 0 | 34 | VFPFMRX \tmp, MVFR0 @ Media and VFP Feature Register 0 |
| 26 | and \tmp, \tmp, #MVFR0_A_SIMD_MASK @ A_SIMD field | 35 | and \tmp, \tmp, #MVFR0_A_SIMD_MASK @ A_SIMD field |
| 27 | cmp \tmp, #2 @ 32 x 64bit registers? | 36 | cmp \tmp, #2 @ 32 x 64bit registers? |
| 28 | ldceql p11, cr0, [\base],#32*4 @ FLDMIAD \base!, {d16-d31} | 37 | ldceql p11, cr0, [\base],#32*4 @ FLDMIAD \base!, {d16-d31} |
| 29 | addne \base, \base, #32*4 @ step over unused register space | 38 | addne \base, \base, #32*4 @ step over unused register space |
| 30 | #endif | 39 | #endif |
| 40 | #endif | ||
| 31 | .endm | 41 | .endm |
| 32 | 42 | ||
| 33 | @ write all the working registers out of the VFP | 43 | @ write all the working registers out of the VFP |
| @@ -38,10 +48,18 @@ | |||
| 38 | STC p11, cr0, [\base],#32*4 @ FSTMIAD \base!, {d0-d15} | 48 | STC p11, cr0, [\base],#32*4 @ FSTMIAD \base!, {d0-d15} |
| 39 | #endif | 49 | #endif |
| 40 | #ifdef CONFIG_VFPv3 | 50 | #ifdef CONFIG_VFPv3 |
| 51 | #if __LINUX_ARM_ARCH__ <= 6 | ||
| 52 | ldr \tmp, =elf_hwcap @ may not have MVFR regs | ||
| 53 | ldr \tmp, [\tmp, #0] | ||
| 54 | tst \tmp, #HWCAP_VFPv3D16 | ||
| 55 | stceq p11, cr0, [\base],#32*4 @ FSTMIAD \base!, {d16-d31} | ||
| 56 | addne \base, \base, #32*4 @ step over unused register space | ||
| 57 | #else | ||
| 41 | VFPFMRX \tmp, MVFR0 @ Media and VFP Feature Register 0 | 58 | VFPFMRX \tmp, MVFR0 @ Media and VFP Feature Register 0 |
| 42 | and \tmp, \tmp, #MVFR0_A_SIMD_MASK @ A_SIMD field | 59 | and \tmp, \tmp, #MVFR0_A_SIMD_MASK @ A_SIMD field |
| 43 | cmp \tmp, #2 @ 32 x 64bit registers? | 60 | cmp \tmp, #2 @ 32 x 64bit registers? |
| 44 | stceql p11, cr0, [\base],#32*4 @ FSTMIAD \base!, {d16-d31} | 61 | stceql p11, cr0, [\base],#32*4 @ FSTMIAD \base!, {d16-d31} |
| 45 | addne \base, \base, #32*4 @ step over unused register space | 62 | addne \base, \base, #32*4 @ step over unused register space |
| 46 | #endif | 63 | #endif |
| 64 | #endif | ||
| 47 | .endm | 65 | .endm |
