aboutsummaryrefslogtreecommitdiffstats
path: root/arch/tile/include
diff options
context:
space:
mode:
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>