Commit ba62a537 authored by Linus Torvalds's avatar Linus Torvalds
Browse files
Pull ARC updates from Vineet Gupta:

 - Basic eBPF support (Sergey)

* tag 'arc-5.19-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/vgupta/arc:
  ARC: bpf: define uapi for BPF_PROG_TYPE_PERF_EVENT program type
  ARC: disasm: handle ARCv2 case in kprobe get/set functions
  ARC: implement syscall tracepoints
  ARC: enable HAVE_REGS_AND_STACK_ACCESS_API feature
parents ef98f9cf 6aa98f62
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -36,8 +36,10 @@ config ARC
	select HAVE_KERNEL_LZMA
	select HAVE_KPROBES
	select HAVE_KRETPROBES
	select HAVE_REGS_AND_STACK_ACCESS_API
	select HAVE_MOD_ARCH_SPECIFIC
	select HAVE_PERF_EVENTS
	select HAVE_SYSCALL_TRACEPOINTS
	select IRQ_DOMAIN
	select MODULES_USE_ELF_RELA
	select OF
+4 −0
Original line number Diff line number Diff line
@@ -63,4 +63,8 @@ struct arc_reg_cc_build {

#define PERF_COUNT_ARC_HW_MAX	(PERF_COUNT_HW_MAX + 8)

#ifdef CONFIG_PERF_EVENTS
#define perf_arch_bpf_user_pt_regs(regs) (struct user_regs_struct *)regs
#endif

#endif /* __ASM_PERF_EVENT_H */
+27 −0
Original line number Diff line number Diff line
@@ -8,6 +8,7 @@
#define __ASM_ARC_PTRACE_H

#include <uapi/asm/ptrace.h>
#include <linux/compiler.h>

#ifndef __ASSEMBLY__

@@ -54,6 +55,9 @@ struct pt_regs {

	unsigned long user_r25;
};

#define MAX_REG_OFFSET offsetof(struct pt_regs, user_r25)

#else

struct pt_regs {
@@ -102,6 +106,8 @@ struct pt_regs {
	unsigned long status32;
};

#define MAX_REG_OFFSET offsetof(struct pt_regs, status32)

#endif

/* Callee saved registers - need to be saved only when you are scheduled out */
@@ -154,6 +160,27 @@ static inline void instruction_pointer_set(struct pt_regs *regs,
{
	instruction_pointer(regs) = val;
}

static inline unsigned long kernel_stack_pointer(struct pt_regs *regs)
{
	return regs->sp;
}

extern int regs_query_register_offset(const char *name);
extern const char *regs_query_register_name(unsigned int offset);
extern bool regs_within_kernel_stack(struct pt_regs *regs, unsigned long addr);
extern unsigned long regs_get_kernel_stack_nth(struct pt_regs *regs,
					       unsigned int n);

static inline unsigned long regs_get_register(struct pt_regs *regs,
					      unsigned int offset)
{
	if (unlikely(offset > MAX_REG_OFFSET))
		return 0;

	return *(unsigned long *)((unsigned long)regs + offset);
}

#endif /* !__ASSEMBLY__ */

#endif /* __ASM_PTRACE_H */
+2 −0
Original line number Diff line number Diff line
@@ -12,6 +12,8 @@
#include <asm/unistd.h>
#include <asm/ptrace.h>		/* in_syscall() */

extern void *sys_call_table[];

static inline long
syscall_get_nr(struct task_struct *task, struct pt_regs *regs)
{
+4 −1
Original line number Diff line number Diff line
@@ -78,9 +78,9 @@ static inline __attribute_const__ struct thread_info *current_thread_info(void)
#define TIF_SYSCALL_AUDIT	4	/* syscall auditing active */
#define TIF_NOTIFY_SIGNAL	5	/* signal notifications exist */
#define TIF_SYSCALL_TRACE	15	/* syscall trace active */

/* true if poll_idle() is polling TIF_NEED_RESCHED */
#define TIF_MEMDIE		16
#define TIF_SYSCALL_TRACEPOINT	17	/* syscall tracepoint instrumentation */

#define _TIF_SYSCALL_TRACE	(1<<TIF_SYSCALL_TRACE)
#define _TIF_NOTIFY_RESUME	(1<<TIF_NOTIFY_RESUME)
@@ -89,11 +89,14 @@ static inline __attribute_const__ struct thread_info *current_thread_info(void)
#define _TIF_SYSCALL_AUDIT	(1<<TIF_SYSCALL_AUDIT)
#define _TIF_NOTIFY_SIGNAL	(1<<TIF_NOTIFY_SIGNAL)
#define _TIF_MEMDIE		(1<<TIF_MEMDIE)
#define _TIF_SYSCALL_TRACEPOINT	(1<<TIF_SYSCALL_TRACEPOINT)

/* work to do on interrupt/exception return */
#define _TIF_WORK_MASK		(_TIF_NEED_RESCHED | _TIF_SIGPENDING | \
				 _TIF_NOTIFY_RESUME | _TIF_NOTIFY_SIGNAL)

#define _TIF_SYSCALL_WORK	(_TIF_SYSCALL_TRACE | _TIF_SYSCALL_TRACEPOINT)

/*
 * _TIF_ALLWORK_MASK includes SYSCALL_TRACE, but we don't need it.
 * SYSCALL_TRACE is anyway separately/unconditionally tested right after a
Loading