aboutsummaryrefslogtreecommitdiffstats
path: root/arch/tile/include
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2016-01-18 15:57:18 -0500
committerLinus Torvalds <torvalds@linux-foundation.org>2016-01-18 15:57:18 -0500
commitd05d82f7110b08fd36178a641b69a1f206e1142b (patch)
treea274bb136f5ed336fb7a12bb86ea24cc5daffdc9 /arch/tile/include
parentd90f351a9bec6af3e8e7cefbbff94072461c3c9a (diff)
parent00d27c6336b00345724b2510f7c5b8cee3055f02 (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.h59
-rw-r--r--arch/tile/include/asm/io.h16
-rw-r--r--arch/tile/include/asm/jump_label.h58
-rw-r--r--arch/tile/include/asm/page.h10
-rw-r--r--arch/tile/include/asm/processor.h2
-rw-r--r--arch/tile/include/asm/thread_info.h8
-rw-r--r--arch/tile/include/asm/topology.h3
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
19static 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
29static 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);
161extern void _tile_writel(u32 val, unsigned long addr); 161extern void _tile_writel(u32 val, unsigned long addr);
162extern void _tile_writeq(u64 val, unsigned long addr); 162extern 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
22static __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;
32l_yes:
33 return true;
34}
35
36static __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;
46l_yes:
47 return true;
48}
49
50typedef u64 jump_label_t;
51
52struct 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
324struct mm_struct; 334struct mm_struct;
325extern pte_t *virt_to_pte(struct mm_struct *mm, unsigned long addr); 335extern pte_t *virt_to_pte(struct mm_struct *mm, unsigned long addr);
326extern pte_t *virt_to_kpte(unsigned long kaddr); 336extern 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
215extern int do_work_pending(struct pt_regs *regs, u32 flags); 215extern 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>