Skip to content

Commit d05d82f

Browse files
committed
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
2 parents d90f351 + 00d27c6 commit d05d82f

25 files changed

+310
-188
lines changed

MAINTAINERS

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10811,6 +10811,7 @@ F: net/tipc/
1081110811
TILE ARCHITECTURE
1081210812
M: Chris Metcalf <cmetcalf@ezchip.com>
1081310813
W: http://www.ezchip.com/scm/
10814+
T: git git://git.kernel.org/pub/scm/linux/kernel/git/cmetcalf/linux-tile.git
1081410815
S: Supported
1081510816
F: arch/tile/
1081610817
F: drivers/char/tile-srom.c

arch/tile/Kconfig

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -141,6 +141,7 @@ config TILEGX
141141
select HAVE_KRETPROBES
142142
select HAVE_ARCH_KGDB
143143
select ARCH_SUPPORTS_ATOMIC_RMW
144+
select HAVE_ARCH_JUMP_LABEL
144145

145146
config TILEPRO
146147
def_bool !TILEGX

arch/tile/include/asm/insn.h

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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 */

arch/tile/include/asm/io.h

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -161,14 +161,14 @@ extern void _tile_writew(u16 val, unsigned long addr);
161161
extern void _tile_writel(u32 val, unsigned long addr);
162162
extern void _tile_writeq(u64 val, unsigned long addr);
163163

164-
#define __raw_readb(addr) _tile_readb((unsigned long)addr)
165-
#define __raw_readw(addr) _tile_readw((unsigned long)addr)
166-
#define __raw_readl(addr) _tile_readl((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)
169-
#define __raw_writew(val, addr) _tile_writew(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)
164+
#define __raw_readb(addr) _tile_readb((unsigned long)(addr))
165+
#define __raw_readw(addr) _tile_readw((unsigned long)(addr))
166+
#define __raw_readl(addr) _tile_readl((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))
169+
#define __raw_writew(val, addr) _tile_writew(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))
172172

173173
#else /* CONFIG_PCI */
174174

arch/tile/include/asm/jump_label.h

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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 */

arch/tile/include/asm/page.h

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -321,6 +321,16 @@ static inline int pfn_valid(unsigned long pfn)
321321
#define virt_to_page(kaddr) pfn_to_page(kaddr_to_pfn((void *)(kaddr)))
322322
#define page_to_virt(page) pfn_to_kaddr(page_to_pfn(page))
323323

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+
324334
struct mm_struct;
325335
extern pte_t *virt_to_pte(struct mm_struct *mm, unsigned long addr);
326336
extern pte_t *virt_to_kpte(unsigned long kaddr);

arch/tile/include/asm/processor.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -212,7 +212,7 @@ static inline void release_thread(struct task_struct *dead_task)
212212
/* Nothing for now */
213213
}
214214

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);
216216

217217

218218
/*

arch/tile/include/asm/thread_info.h

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -140,10 +140,14 @@ extern void _cpu_idle(void);
140140
#define _TIF_POLLING_NRFLAG (1<<TIF_POLLING_NRFLAG)
141141
#define _TIF_NOHZ (1<<TIF_NOHZ)
142142

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+
143148
/* Work to do on any return to user space. */
144149
#define _TIF_ALLWORK_MASK \
145-
(_TIF_SIGPENDING | _TIF_NEED_RESCHED | _TIF_SINGLESTEP | \
146-
_TIF_ASYNC_TLB | _TIF_NOTIFY_RESUME | _TIF_NOHZ)
150+
(_TIF_WORK_MASK | _TIF_SINGLESTEP | _TIF_NOHZ)
147151

148152
/* Work to do at syscall entry. */
149153
#define _TIF_SYSCALL_ENTRY_WORK \

arch/tile/include/asm/topology.h

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -44,9 +44,6 @@ static inline const struct cpumask *cpumask_of_node(int node)
4444
/* For now, use numa node -1 for global allocation. */
4545
#define pcibus_to_node(bus) ((void)(bus), -1)
4646

47-
/* By definition, we create nodes based on online memory. */
48-
#define node_has_online_mem(nid) 1
49-
5047
#endif /* CONFIG_NUMA */
5148

5249
#include <asm-generic/topology.h>

arch/tile/kernel/Makefile

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,5 +32,6 @@ obj-$(CONFIG_TILE_HVGLUE_TRACE) += hvglue_trace.o
3232
obj-$(CONFIG_FUNCTION_TRACER) += ftrace.o mcount_64.o
3333
obj-$(CONFIG_KPROBES) += kprobes.o
3434
obj-$(CONFIG_KGDB) += kgdb.o
35+
obj-$(CONFIG_JUMP_LABEL) += jump_label.o
3536

3637
obj-y += vdso/

arch/tile/kernel/ftrace.c

Lines changed: 2 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -20,21 +20,12 @@
2020
#include <asm/cacheflush.h>
2121
#include <asm/ftrace.h>
2222
#include <asm/sections.h>
23+
#include <asm/insn.h>
2324

2425
#include <arch/opcode.h>
2526

2627
#ifdef CONFIG_DYNAMIC_FTRACE
2728

28-
static inline tilegx_bundle_bits NOP(void)
29-
{
30-
return create_UnaryOpcodeExtension_X0(FNOP_UNARY_OPCODE_X0) |
31-
create_RRROpcodeExtension_X0(UNARY_RRR_0_OPCODE_X0) |
32-
create_Opcode_X0(RRR_0_OPCODE_X0) |
33-
create_UnaryOpcodeExtension_X1(NOP_UNARY_OPCODE_X1) |
34-
create_RRROpcodeExtension_X1(UNARY_RRR_0_OPCODE_X1) |
35-
create_Opcode_X1(RRR_0_OPCODE_X1);
36-
}
37-
3829
static int machine_stopped __read_mostly;
3930

4031
int ftrace_arch_code_modify_prepare(void)
@@ -117,7 +108,7 @@ static int ftrace_modify_code(unsigned long pc, unsigned long old,
117108
return -EINVAL;
118109

119110
/* Operate on writable kernel text mapping. */
120-
pc_wr = pc - MEM_SV_START + PAGE_OFFSET;
111+
pc_wr = ktext_writable_addr(pc);
121112

122113
if (probe_kernel_write((void *)pc_wr, &new, MCOUNT_INSN_SIZE))
123114
return -EPERM;

arch/tile/kernel/intvec_32.S

Lines changed: 18 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -572,7 +572,7 @@ intvec_\vecname:
572572
}
573573
wh64 r52
574574

575-
#ifdef CONFIG_TRACE_IRQFLAGS
575+
#if defined(CONFIG_TRACE_IRQFLAGS) || defined(CONFIG_CONTEXT_TRACKING)
576576
.ifnc \function,handle_nmi
577577
/*
578578
* We finally have enough state set up to notify the irq
@@ -588,6 +588,9 @@ intvec_\vecname:
588588
{ move r32, r2; move r33, r3 }
589589
.endif
590590
TRACE_IRQS_OFF
591+
#ifdef CONFIG_CONTEXT_TRACKING
592+
jal context_tracking_user_exit
593+
#endif
591594
.ifnc \function,handle_syscall
592595
{ move r0, r30; move r1, r31 }
593596
{ move r2, r32; move r3, r33 }
@@ -845,18 +848,6 @@ STD_ENTRY(interrupt_return)
845848
.Lresume_userspace:
846849
FEEDBACK_REENTER(interrupt_return)
847850

848-
/*
849-
* Use r33 to hold whether we have already loaded the callee-saves
850-
* into ptregs. We don't want to do it twice in this loop, since
851-
* then we'd clobber whatever changes are made by ptrace, etc.
852-
* Get base of stack in r32.
853-
*/
854-
{
855-
GET_THREAD_INFO(r32)
856-
movei r33, 0
857-
}
858-
859-
.Lretry_work_pending:
860851
/*
861852
* Disable interrupts so as to make sure we don't
862853
* miss an interrupt that sets any of the thread flags (like
@@ -867,33 +858,27 @@ STD_ENTRY(interrupt_return)
867858
IRQ_DISABLE(r20, r21)
868859
TRACE_IRQS_OFF /* Note: clobbers registers r0-r29 */
869860

870-
871-
/* Check to see if there is any work to do before returning to user. */
861+
/*
862+
* See if there are any work items (including single-shot items)
863+
* to do. If so, save the callee-save registers to pt_regs
864+
* and then dispatch to C code.
865+
*/
866+
GET_THREAD_INFO(r21)
872867
{
873-
addi r29, r32, THREAD_INFO_FLAGS_OFFSET
874-
moveli r1, lo16(_TIF_ALLWORK_MASK)
868+
addi r22, r21, THREAD_INFO_FLAGS_OFFSET
869+
moveli r20, lo16(_TIF_ALLWORK_MASK)
875870
}
876871
{
877-
lw r29, r29
878-
auli r1, r1, ha16(_TIF_ALLWORK_MASK)
872+
lw r22, r22
873+
auli r20, r20, ha16(_TIF_ALLWORK_MASK)
879874
}
880-
and r1, r29, r1
881-
bzt r1, .Lrestore_all
882-
883-
/*
884-
* Make sure we have all the registers saved for signal
885-
* handling, notify-resume, or single-step. Call out to C
886-
* code to figure out exactly what we need to do for each flag bit,
887-
* then if necessary, reload the flags and recheck.
888-
*/
875+
and r1, r22, r20
889876
{
890877
PTREGS_PTR(r0, PTREGS_OFFSET_BASE)
891-
bnz r33, 1f
878+
bzt r1, .Lrestore_all
892879
}
893880
push_extra_callee_saves r0
894-
movei r33, 1
895-
1: jal do_work_pending
896-
bnz r0, .Lretry_work_pending
881+
jal prepare_exit_to_usermode
897882

898883
/*
899884
* In the NMI case we
@@ -1327,7 +1312,7 @@ STD_ENTRY(ret_from_kernel_thread)
13271312
FEEDBACK_REENTER(ret_from_kernel_thread)
13281313
{
13291314
movei r30, 0 /* not an NMI */
1330-
j .Lresume_userspace /* jump into middle of interrupt_return */
1315+
j interrupt_return
13311316
}
13321317
STD_ENDPROC(ret_from_kernel_thread)
13331318

0 commit comments

Comments
 (0)