diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2016-01-18 15:57:18 -0500 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2016-01-18 15:57:18 -0500 |
commit | d05d82f7110b08fd36178a641b69a1f206e1142b (patch) | |
tree | a274bb136f5ed336fb7a12bb86ea24cc5daffdc9 /arch/tile/include | |
parent | d90f351a9bec6af3e8e7cefbbff94072461c3c9a (diff) | |
parent | 00d27c6336b00345724b2510f7c5b8cee3055f02 (diff) |
Merge git://git.kernel.org/pub/scm/linux/kernel/git/cmetcalf/linux-tile
Pull arch/tile updates from Chris Metcalf:
"This is a grab bag of changes that includes some NOHZ and
context-tracking related changes, some debugging improvements,
JUMP_LABEL support, and some fixes for tilepro allmodconfig support.
We also remove the now-unused node_has_online_mem() definitions both
for tile's asm/topology.h as well as in linux/topology.h itself"
* git://git.kernel.org/pub/scm/linux/kernel/git/cmetcalf/linux-tile:
numa: remove stale node_has_online_mem() define
arch/tile: move user_exit() to early kernel entry sequence
tile: fix bug in setting PT_FLAGS_DISABLE_IRQ on kernel entry
tile: fix tilepro casts for readl, writel, etc
tile: fix a -Wframe-larger-than warning
tile: include the syscall number in the backtrace
MAINTAINERS: add git URL for tile
arch/tile: adopt prepare_exit_to_usermode() model from x86
tile/jump_label: add jump label support for TILE-Gx
tile: define a macro ktext_writable_addr to get writable kernel text address
Diffstat (limited to 'arch/tile/include')
-rw-r--r-- | arch/tile/include/asm/insn.h | 59 | ||||
-rw-r--r-- | arch/tile/include/asm/io.h | 16 | ||||
-rw-r--r-- | arch/tile/include/asm/jump_label.h | 58 | ||||
-rw-r--r-- | arch/tile/include/asm/page.h | 10 | ||||
-rw-r--r-- | arch/tile/include/asm/processor.h | 2 | ||||
-rw-r--r-- | arch/tile/include/asm/thread_info.h | 8 | ||||
-rw-r--r-- | arch/tile/include/asm/topology.h | 3 |
7 files changed, 142 insertions, 14 deletions
diff --git a/arch/tile/include/asm/insn.h b/arch/tile/include/asm/insn.h new file mode 100644 index 000000000000..f78ba5c16722 --- /dev/null +++ b/arch/tile/include/asm/insn.h | |||
@@ -0,0 +1,59 @@ | |||
1 | /* | ||
2 | * Copyright 2015 Tilera Corporation. All Rights Reserved. | ||
3 | * | ||
4 | * This program is free software; you can redistribute it and/or | ||
5 | * modify it under the terms of the GNU General Public License | ||
6 | * as published by the Free Software Foundation, version 2. | ||
7 | * | ||
8 | * This program is distributed in the hope that it will be useful, but | ||
9 | * WITHOUT ANY WARRANTY; without even the implied warranty of | ||
10 | * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or | ||
11 | * NON INFRINGEMENT. See the GNU General Public License for | ||
12 | * more details. | ||
13 | */ | ||
14 | #ifndef __ASM_TILE_INSN_H | ||
15 | #define __ASM_TILE_INSN_H | ||
16 | |||
17 | #include <arch/opcode.h> | ||
18 | |||
19 | static inline tilegx_bundle_bits NOP(void) | ||
20 | { | ||
21 | return create_UnaryOpcodeExtension_X0(FNOP_UNARY_OPCODE_X0) | | ||
22 | create_RRROpcodeExtension_X0(UNARY_RRR_0_OPCODE_X0) | | ||
23 | create_Opcode_X0(RRR_0_OPCODE_X0) | | ||
24 | create_UnaryOpcodeExtension_X1(NOP_UNARY_OPCODE_X1) | | ||
25 | create_RRROpcodeExtension_X1(UNARY_RRR_0_OPCODE_X1) | | ||
26 | create_Opcode_X1(RRR_0_OPCODE_X1); | ||
27 | } | ||
28 | |||
29 | static inline tilegx_bundle_bits tilegx_gen_branch(unsigned long pc, | ||
30 | unsigned long addr, | ||
31 | bool link) | ||
32 | { | ||
33 | tilegx_bundle_bits opcode_x0, opcode_x1; | ||
34 | long pcrel_by_instr = (addr - pc) >> TILEGX_LOG2_BUNDLE_SIZE_IN_BYTES; | ||
35 | |||
36 | if (link) { | ||
37 | /* opcode: jal addr */ | ||
38 | opcode_x1 = | ||
39 | create_Opcode_X1(JUMP_OPCODE_X1) | | ||
40 | create_JumpOpcodeExtension_X1(JAL_JUMP_OPCODE_X1) | | ||
41 | create_JumpOff_X1(pcrel_by_instr); | ||
42 | } else { | ||
43 | /* opcode: j addr */ | ||
44 | opcode_x1 = | ||
45 | create_Opcode_X1(JUMP_OPCODE_X1) | | ||
46 | create_JumpOpcodeExtension_X1(J_JUMP_OPCODE_X1) | | ||
47 | create_JumpOff_X1(pcrel_by_instr); | ||
48 | } | ||
49 | |||
50 | /* opcode: fnop */ | ||
51 | opcode_x0 = | ||
52 | create_UnaryOpcodeExtension_X0(FNOP_UNARY_OPCODE_X0) | | ||
53 | create_RRROpcodeExtension_X0(UNARY_RRR_0_OPCODE_X0) | | ||
54 | create_Opcode_X0(RRR_0_OPCODE_X0); | ||
55 | |||
56 | return opcode_x1 | opcode_x0; | ||
57 | } | ||
58 | |||
59 | #endif /* __ASM_TILE_INSN_H */ | ||
diff --git a/arch/tile/include/asm/io.h b/arch/tile/include/asm/io.h index 322b5fe94781..30f4a210d148 100644 --- a/arch/tile/include/asm/io.h +++ b/arch/tile/include/asm/io.h | |||
@@ -161,14 +161,14 @@ extern void _tile_writew(u16 val, unsigned long addr); | |||
161 | extern void _tile_writel(u32 val, unsigned long addr); | 161 | extern void _tile_writel(u32 val, unsigned long addr); |
162 | extern void _tile_writeq(u64 val, unsigned long addr); | 162 | extern void _tile_writeq(u64 val, unsigned long addr); |
163 | 163 | ||
164 | #define __raw_readb(addr) _tile_readb((unsigned long)addr) | 164 | #define __raw_readb(addr) _tile_readb((unsigned long)(addr)) |
165 | #define __raw_readw(addr) _tile_readw((unsigned long)addr) | 165 | #define __raw_readw(addr) _tile_readw((unsigned long)(addr)) |
166 | #define __raw_readl(addr) _tile_readl((unsigned long)addr) | 166 | #define __raw_readl(addr) _tile_readl((unsigned long)(addr)) |
167 | #define __raw_readq(addr) _tile_readq((unsigned long)addr) | 167 | #define __raw_readq(addr) _tile_readq((unsigned long)(addr)) |
168 | #define __raw_writeb(val, addr) _tile_writeb(val, (unsigned long)addr) | 168 | #define __raw_writeb(val, addr) _tile_writeb(val, (unsigned long)(addr)) |
169 | #define __raw_writew(val, addr) _tile_writew(val, (unsigned long)addr) | 169 | #define __raw_writew(val, addr) _tile_writew(val, (unsigned long)(addr)) |
170 | #define __raw_writel(val, addr) _tile_writel(val, (unsigned long)addr) | 170 | #define __raw_writel(val, addr) _tile_writel(val, (unsigned long)(addr)) |
171 | #define __raw_writeq(val, addr) _tile_writeq(val, (unsigned long)addr) | 171 | #define __raw_writeq(val, addr) _tile_writeq(val, (unsigned long)(addr)) |
172 | 172 | ||
173 | #else /* CONFIG_PCI */ | 173 | #else /* CONFIG_PCI */ |
174 | 174 | ||
diff --git a/arch/tile/include/asm/jump_label.h b/arch/tile/include/asm/jump_label.h new file mode 100644 index 000000000000..cde7573f397b --- /dev/null +++ b/arch/tile/include/asm/jump_label.h | |||
@@ -0,0 +1,58 @@ | |||
1 | /* | ||
2 | * Copyright 2015 Tilera Corporation. All Rights Reserved. | ||
3 | * | ||
4 | * This program is free software; you can redistribute it and/or | ||
5 | * modify it under the terms of the GNU General Public License | ||
6 | * as published by the Free Software Foundation, version 2. | ||
7 | * | ||
8 | * This program is distributed in the hope that it will be useful, but | ||
9 | * WITHOUT ANY WARRANTY; without even the implied warranty of | ||
10 | * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or | ||
11 | * NON INFRINGEMENT. See the GNU General Public License for | ||
12 | * more details. | ||
13 | */ | ||
14 | |||
15 | #ifndef _ASM_TILE_JUMP_LABEL_H | ||
16 | #define _ASM_TILE_JUMP_LABEL_H | ||
17 | |||
18 | #include <arch/opcode.h> | ||
19 | |||
20 | #define JUMP_LABEL_NOP_SIZE TILE_BUNDLE_SIZE_IN_BYTES | ||
21 | |||
22 | static __always_inline bool arch_static_branch(struct static_key *key, | ||
23 | bool branch) | ||
24 | { | ||
25 | asm_volatile_goto("1:\n\t" | ||
26 | "nop" "\n\t" | ||
27 | ".pushsection __jump_table, \"aw\"\n\t" | ||
28 | ".quad 1b, %l[l_yes], %0 + %1 \n\t" | ||
29 | ".popsection\n\t" | ||
30 | : : "i" (key), "i" (branch) : : l_yes); | ||
31 | return false; | ||
32 | l_yes: | ||
33 | return true; | ||
34 | } | ||
35 | |||
36 | static __always_inline bool arch_static_branch_jump(struct static_key *key, | ||
37 | bool branch) | ||
38 | { | ||
39 | asm_volatile_goto("1:\n\t" | ||
40 | "j %l[l_yes]" "\n\t" | ||
41 | ".pushsection __jump_table, \"aw\"\n\t" | ||
42 | ".quad 1b, %l[l_yes], %0 + %1 \n\t" | ||
43 | ".popsection\n\t" | ||
44 | : : "i" (key), "i" (branch) : : l_yes); | ||
45 | return false; | ||
46 | l_yes: | ||
47 | return true; | ||
48 | } | ||
49 | |||
50 | typedef u64 jump_label_t; | ||
51 | |||
52 | struct jump_entry { | ||
53 | jump_label_t code; | ||
54 | jump_label_t target; | ||
55 | jump_label_t key; | ||
56 | }; | ||
57 | |||
58 | #endif /* _ASM_TILE_JUMP_LABEL_H */ | ||
diff --git a/arch/tile/include/asm/page.h b/arch/tile/include/asm/page.h index 8eca6a0e1762..498a5f71245d 100644 --- a/arch/tile/include/asm/page.h +++ b/arch/tile/include/asm/page.h | |||
@@ -321,6 +321,16 @@ static inline int pfn_valid(unsigned long pfn) | |||
321 | #define virt_to_page(kaddr) pfn_to_page(kaddr_to_pfn((void *)(kaddr))) | 321 | #define virt_to_page(kaddr) pfn_to_page(kaddr_to_pfn((void *)(kaddr))) |
322 | #define page_to_virt(page) pfn_to_kaddr(page_to_pfn(page)) | 322 | #define page_to_virt(page) pfn_to_kaddr(page_to_pfn(page)) |
323 | 323 | ||
324 | /* | ||
325 | * The kernel text is mapped at MEM_SV_START as read-only. To allow | ||
326 | * modifying kernel text, it is also mapped at PAGE_OFFSET as read-write. | ||
327 | * This macro converts a kernel address to its writable kernel text mapping, | ||
328 | * which is used to modify the text code on a running kernel by kgdb, | ||
329 | * ftrace, kprobe, jump label, etc. | ||
330 | */ | ||
331 | #define ktext_writable_addr(kaddr) \ | ||
332 | ((unsigned long)(kaddr) - MEM_SV_START + PAGE_OFFSET) | ||
333 | |||
324 | struct mm_struct; | 334 | struct mm_struct; |
325 | extern pte_t *virt_to_pte(struct mm_struct *mm, unsigned long addr); | 335 | extern pte_t *virt_to_pte(struct mm_struct *mm, unsigned long addr); |
326 | extern pte_t *virt_to_kpte(unsigned long kaddr); | 336 | extern pte_t *virt_to_kpte(unsigned long kaddr); |
diff --git a/arch/tile/include/asm/processor.h b/arch/tile/include/asm/processor.h index 139dfdee0134..0684e88aacd8 100644 --- a/arch/tile/include/asm/processor.h +++ b/arch/tile/include/asm/processor.h | |||
@@ -212,7 +212,7 @@ static inline void release_thread(struct task_struct *dead_task) | |||
212 | /* Nothing for now */ | 212 | /* Nothing for now */ |
213 | } | 213 | } |
214 | 214 | ||
215 | extern int do_work_pending(struct pt_regs *regs, u32 flags); | 215 | extern void prepare_exit_to_usermode(struct pt_regs *regs, u32 flags); |
216 | 216 | ||
217 | 217 | ||
218 | /* | 218 | /* |
diff --git a/arch/tile/include/asm/thread_info.h b/arch/tile/include/asm/thread_info.h index dc1fb28d9636..4b7cef9e94e0 100644 --- a/arch/tile/include/asm/thread_info.h +++ b/arch/tile/include/asm/thread_info.h | |||
@@ -140,10 +140,14 @@ extern void _cpu_idle(void); | |||
140 | #define _TIF_POLLING_NRFLAG (1<<TIF_POLLING_NRFLAG) | 140 | #define _TIF_POLLING_NRFLAG (1<<TIF_POLLING_NRFLAG) |
141 | #define _TIF_NOHZ (1<<TIF_NOHZ) | 141 | #define _TIF_NOHZ (1<<TIF_NOHZ) |
142 | 142 | ||
143 | /* Work to do as we loop to exit to user space. */ | ||
144 | #define _TIF_WORK_MASK \ | ||
145 | (_TIF_SIGPENDING | _TIF_NEED_RESCHED | \ | ||
146 | _TIF_ASYNC_TLB | _TIF_NOTIFY_RESUME) | ||
147 | |||
143 | /* Work to do on any return to user space. */ | 148 | /* Work to do on any return to user space. */ |
144 | #define _TIF_ALLWORK_MASK \ | 149 | #define _TIF_ALLWORK_MASK \ |
145 | (_TIF_SIGPENDING | _TIF_NEED_RESCHED | _TIF_SINGLESTEP | \ | 150 | (_TIF_WORK_MASK | _TIF_SINGLESTEP | _TIF_NOHZ) |
146 | _TIF_ASYNC_TLB | _TIF_NOTIFY_RESUME | _TIF_NOHZ) | ||
147 | 151 | ||
148 | /* Work to do at syscall entry. */ | 152 | /* Work to do at syscall entry. */ |
149 | #define _TIF_SYSCALL_ENTRY_WORK \ | 153 | #define _TIF_SYSCALL_ENTRY_WORK \ |
diff --git a/arch/tile/include/asm/topology.h b/arch/tile/include/asm/topology.h index 76b0d0ebb244..b11d5fcd2c41 100644 --- a/arch/tile/include/asm/topology.h +++ b/arch/tile/include/asm/topology.h | |||
@@ -44,9 +44,6 @@ static inline const struct cpumask *cpumask_of_node(int node) | |||
44 | /* For now, use numa node -1 for global allocation. */ | 44 | /* For now, use numa node -1 for global allocation. */ |
45 | #define pcibus_to_node(bus) ((void)(bus), -1) | 45 | #define pcibus_to_node(bus) ((void)(bus), -1) |
46 | 46 | ||
47 | /* By definition, we create nodes based on online memory. */ | ||
48 | #define node_has_online_mem(nid) 1 | ||
49 | |||
50 | #endif /* CONFIG_NUMA */ | 47 | #endif /* CONFIG_NUMA */ |
51 | 48 | ||
52 | #include <asm-generic/topology.h> | 49 | #include <asm-generic/topology.h> |