[PATCH] ARC: fix __ffs return value to avoid build warnings

2018-12-13 Thread Eugeniy Paltsev
Change __ffs return value from 'int' to 'unsigned long' as it
is done in other implementations (like asm-generic, x86, etc...)
to avoid build-time warnings in places where type is strictly
checked.

As __ffs may return values in [0-31] interval changing return
type to unsigned is valid.

Signed-off-by: Eugeniy Paltsev 
---
 arch/arc/include/asm/bitops.h | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/arch/arc/include/asm/bitops.h b/arch/arc/include/asm/bitops.h
index 8da87feec59a..99e6d8948f4a 100644
--- a/arch/arc/include/asm/bitops.h
+++ b/arch/arc/include/asm/bitops.h
@@ -340,7 +340,7 @@ static inline __attribute__ ((const)) int __fls(unsigned 
long x)
 /*
  * __ffs: Similar to ffs, but zero based (0-31)
  */
-static inline __attribute__ ((const)) int __ffs(unsigned long word)
+static inline __attribute__ ((const)) unsigned long __ffs(unsigned long word)
 {
if (!word)
return word;
@@ -400,9 +400,9 @@ static inline __attribute__ ((const)) int ffs(unsigned long 
x)
 /*
  * __ffs: Similar to ffs, but zero based (0-31)
  */
-static inline __attribute__ ((const)) int __ffs(unsigned long x)
+static inline __attribute__ ((const)) unsigned long __ffs(unsigned long x)
 {
-   int n;
+   unsigned long n;
 
asm volatile(
"   ffs.f   %0, %1  \n"  /* 0:31; 31(Z) if src 0 */
-- 
2.14.5


___
linux-snps-arc mailing list
linux-snps-arc@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-snps-arc


[PATCH v2 1/4] ARC: perf: trivial code cleanup

2018-12-13 Thread Eugeniy Paltsev
* Use BIT(), lower_32_bits(), upper_32_bits() macroses,
  fix code style violations.
* Use u32, u64, s64 instead of uint32_t, uint64_t, int64_t
* Fix description comment as this code doesn't belong only to
  ARC700 anymore.
* Use SPDX License Identifier.
* Remove useless ifdefs. ifdef around 'arc_pmu_match' structure
  declaration is useless as we refer to 'arc_pmu_match' in
  several places which aren't guarded with ifdef. Nevertheless
  'ARC' option selects 'OF' unconditionally so we can simply
  get rid of this ifdef.

Acked-by: Vineet Gupta 
Signed-off-by: Eugeniy Paltsev 
---
Changes v1->v2:
 * Squash first four cleanup patches into this one.

 arch/arc/kernel/perf_event.c | 85 ++--
 1 file changed, 42 insertions(+), 43 deletions(-)

diff --git a/arch/arc/kernel/perf_event.c b/arch/arc/kernel/perf_event.c
index 8aec462d90fb..693f32d60c35 100644
--- a/arch/arc/kernel/perf_event.c
+++ b/arch/arc/kernel/perf_event.c
@@ -1,15 +1,10 @@
-/*
- * Linux performance counter support for ARC700 series
- *
- * Copyright (C) 2013-2015 Synopsys, Inc. (www.synopsys.com)
- *
- * This code is inspired by the perf support of various other architectures.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
- *
- */
+// SPDX-License-Identifier: GPL-2.0+
+//
+// Linux performance counter support for ARC CPUs.
+// This code is inspired by the perf support of various other architectures.
+//
+// Copyright (C) 2013-2018 Synopsys, Inc. (www.synopsys.com)
+
 #include 
 #include 
 #include 
@@ -19,6 +14,9 @@
 #include 
 #include 
 
+/* HW holds 8 symbols + one for null terminator */
+#define ARCPMU_EVENT_NAME_LEN  9
+
 struct arc_pmu {
struct pmu  pmu;
unsigned intirq;
@@ -49,6 +47,7 @@ static int callchain_trace(unsigned int addr, void *data)
 {
struct arc_callchain_trace *ctrl = data;
struct perf_callchain_entry_ctx *entry = ctrl->perf_stuff;
+
perf_callchain_store(entry, addr);
 
if (ctrl->depth++ < 3)
@@ -57,8 +56,8 @@ static int callchain_trace(unsigned int addr, void *data)
return -1;
 }
 
-void
-perf_callchain_kernel(struct perf_callchain_entry_ctx *entry, struct pt_regs 
*regs)
+void perf_callchain_kernel(struct perf_callchain_entry_ctx *entry,
+  struct pt_regs *regs)
 {
struct arc_callchain_trace ctrl = {
.depth = 0,
@@ -68,8 +67,8 @@ perf_callchain_kernel(struct perf_callchain_entry_ctx *entry, 
struct pt_regs *re
arc_unwind_core(NULL, regs, callchain_trace, &ctrl);
 }
 
-void
-perf_callchain_user(struct perf_callchain_entry_ctx *entry, struct pt_regs 
*regs)
+void perf_callchain_user(struct perf_callchain_entry_ctx *entry,
+struct pt_regs *regs)
 {
/*
 * User stack can't be unwound trivially with kernel dwarf unwinder
@@ -82,10 +81,10 @@ static struct arc_pmu *arc_pmu;
 static DEFINE_PER_CPU(struct arc_pmu_cpu, arc_pmu_cpu);
 
 /* read counter #idx; note that counter# != event# on ARC! */
-static uint64_t arc_pmu_read_counter(int idx)
+static u64 arc_pmu_read_counter(int idx)
 {
-   uint32_t tmp;
-   uint64_t result;
+   u32 tmp;
+   u64 result;
 
/*
 * ARC supports making 'snapshots' of the counters, so we don't
@@ -94,7 +93,7 @@ static uint64_t arc_pmu_read_counter(int idx)
write_aux_reg(ARC_REG_PCT_INDEX, idx);
tmp = read_aux_reg(ARC_REG_PCT_CONTROL);
write_aux_reg(ARC_REG_PCT_CONTROL, tmp | ARC_REG_PCT_CONTROL_SN);
-   result = (uint64_t) (read_aux_reg(ARC_REG_PCT_SNAPH)) << 32;
+   result = (u64) (read_aux_reg(ARC_REG_PCT_SNAPH)) << 32;
result |= read_aux_reg(ARC_REG_PCT_SNAPL);
 
return result;
@@ -103,9 +102,9 @@ static uint64_t arc_pmu_read_counter(int idx)
 static void arc_perf_event_update(struct perf_event *event,
  struct hw_perf_event *hwc, int idx)
 {
-   uint64_t prev_raw_count = local64_read(&hwc->prev_count);
-   uint64_t new_raw_count = arc_pmu_read_counter(idx);
-   int64_t delta = new_raw_count - prev_raw_count;
+   u64 prev_raw_count = local64_read(&hwc->prev_count);
+   u64 new_raw_count = arc_pmu_read_counter(idx);
+   s64 delta = new_raw_count - prev_raw_count;
 
/*
 * We aren't afraid of hwc->prev_count changing beneath our feet
@@ -155,7 +154,7 @@ static int arc_pmu_event_init(struct perf_event *event)
int ret;
 
if (!is_sampling_event(event)) {
-   hwc->sample_period  = arc_pmu->max_period;
+   hwc->sample_period = arc_pmu->max_period;
hwc->last_period = hwc->sample_period;
local64_set(&hwc->period_left, hwc->sample_period);
}
@@ -192,6 +191,7 @@ static int arc_pmu_event_init(struct perf_event *event)
pr_debug("i

[PATCH v2 0/4] introduce Kernel PMU events support

2018-12-13 Thread Eugeniy Paltsev
Introduce Kernel PMU events support and refactor ARC-specific perf code. 

Eugeniy Paltsev (4):
  ARC: perf: trivial code cleanup
  ARC: perf: introduce Kernel PMU events support
  ARC: perf: move HW events mapping to separate function
  ARC: perf: avoid kernel killing where it is possible

 arch/arc/kernel/perf_event.c | 228 ---
 1 file changed, 169 insertions(+), 59 deletions(-)

-- 
2.14.5


___
linux-snps-arc mailing list
linux-snps-arc@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-snps-arc


[PATCH v2 2/4] ARC: perf: introduce Kernel PMU events support

2018-12-13 Thread Eugeniy Paltsev
Export all available ARC architected hardware events as
kernel PMU events to make non-generic events accessible.

ARC PMU HW allow us to read the list of all available
events names. So we generate kernel PMU event list
dynamically in arc_pmu_device_probe() using
human-readable events names we got from HW instead of
using pre-defined events list.

-->8--
$ perf list
  [snip]
  arc_pmu/bdata64/  [Kernel PMU event]
  arc_pmu/bdcstall/ [Kernel PMU event]
  arc_pmu/bdslot/   [Kernel PMU event]
  arc_pmu/bfbmp/[Kernel PMU event]
  arc_pmu/bfirqex/  [Kernel PMU event]
  arc_pmu/bflgstal/ [Kernel PMU event]
  arc_pmu/bflush/   [Kernel PMU event]
-->8--

Signed-off-by: Eugeniy Paltsev 
---
Changes v1->v2:
 * Rename "arc_pmu" to "arc_pct"
 * Trivial changes

 arch/arc/kernel/perf_event.c | 106 ++-
 1 file changed, 105 insertions(+), 1 deletion(-)

diff --git a/arch/arc/kernel/perf_event.c b/arch/arc/kernel/perf_event.c
index 693f32d60c35..d60aaaead421 100644
--- a/arch/arc/kernel/perf_event.c
+++ b/arch/arc/kernel/perf_event.c
@@ -17,12 +17,28 @@
 /* HW holds 8 symbols + one for null terminator */
 #define ARCPMU_EVENT_NAME_LEN  9
 
+enum arc_pmu_attr_groups {
+   ARCPMU_ATTR_GR_EVENTS,
+   ARCPMU_ATTR_GR_FORMATS,
+   ARCPMU_NR_ATTR_GR
+};
+
+struct arc_pmu_raw_event_entry {
+   char name[ARCPMU_EVENT_NAME_LEN];
+};
+
 struct arc_pmu {
struct pmu  pmu;
unsigned intirq;
int n_counters;
+   int n_events;
u64 max_period;
int ev_hw_idx[PERF_COUNT_ARC_HW_MAX];
+
+   struct arc_pmu_raw_event_entry  *raw_entry;
+   struct attribute**attrs;
+   struct perf_pmu_events_attr *attr;
+   const struct attribute_group*attr_groups[ARCPMU_NR_ATTR_GR + 1];
 };
 
 struct arc_pmu_cpu {
@@ -192,6 +208,17 @@ static int arc_pmu_event_init(struct perf_event *event)
 (int)hwc->config, arc_pmu_ev_hw_map[ret]);
return 0;
 
+   case PERF_TYPE_RAW:
+   if (event->attr.config >= arc_pmu->n_events)
+   return -ENOENT;
+
+   hwc->config |= event->attr.config;
+   pr_debug("init raw event with idx %lld \'%s\'\n",
+event->attr.config,
+arc_pmu->raw_entry[event->attr.config].name);
+
+   return 0;
+
default:
return -ENOENT;
}
@@ -442,6 +469,67 @@ static void arc_cpu_pmu_irq_init(void *data)
write_aux_reg(ARC_REG_PCT_INT_ACT, 0x);
 }
 
+/* Event field occupies the bottom 15 bits of our config field */
+PMU_FORMAT_ATTR(event, "config:0-14");
+static struct attribute *arc_pmu_format_attrs[] = {
+   &format_attr_event.attr,
+   NULL,
+};
+
+static struct attribute_group arc_pmu_format_attr_gr = {
+   .name = "format",
+   .attrs = arc_pmu_format_attrs,
+};
+
+static ssize_t arc_pmu_events_sysfs_show(struct device *dev,
+struct device_attribute *attr,
+char *page)
+{
+   struct perf_pmu_events_attr *pmu_attr;
+
+   pmu_attr = container_of(attr, struct perf_pmu_events_attr, attr);
+   return sprintf(page, "event=0x%04llx\n", pmu_attr->id);
+}
+
+/*
+ * We don't add attrs here as we don't have pre-defined list of perf events.
+ * We will generate and add attrs dynamically in probe() after we read HW
+ * configuration.
+ */
+static struct attribute_group arc_pmu_events_attr_gr = {
+   .name = "events",
+};
+
+static void arc_pmu_add_raw_event_attr(int j, char *str)
+{
+   memmove(arc_pmu->raw_entry[j].name, str, ARCPMU_EVENT_NAME_LEN - 1);
+   arc_pmu->attr[j].attr.attr.name = arc_pmu->raw_entry[j].name;
+   arc_pmu->attr[j].attr.attr.mode = VERIFY_OCTAL_PERMISSIONS(0444);
+   arc_pmu->attr[j].attr.show = arc_pmu_events_sysfs_show;
+   arc_pmu->attr[j].id = j;
+   arc_pmu->attrs[j] = &(arc_pmu->attr[j].attr.attr);
+}
+
+static int arc_pmu_raw_alloc(struct device *dev)
+{
+   arc_pmu->attr = devm_kmalloc_array(dev, arc_pmu->n_events + 1,
+   sizeof(*arc_pmu->attr), GFP_KERNEL | __GFP_ZERO);
+   if (!arc_pmu->attr)
+   return -ENOMEM;
+
+   arc_pmu->attrs = devm_kmalloc_array(dev, arc_pmu->n_events + 1,
+   sizeof(*arc_pmu->attrs), GFP_KERNEL | __GFP_ZERO);
+   if (!arc_pmu->attrs)
+   return -ENOMEM;
+
+   arc_pmu->raw_entry = devm_kmalloc_array(dev, arc_pmu->n_events,
+   sizeof(*arc_pmu->raw_entry), GFP_KERNEL | __GFP_ZERO);
+   if (!arc_pmu->raw_entry)
+   return -ENOMEM;
+
+   return 0;
+}
+
 static int arc_pmu_device_p

[PATCH v2 3/4] ARC: perf: move HW events mapping to separate function

2018-12-13 Thread Eugeniy Paltsev
Move HW events mapping to separate function to make code more readable.

Signed-off-by: Eugeniy Paltsev 
---
 arch/arc/kernel/perf_event.c | 48 ++--
 1 file changed, 33 insertions(+), 15 deletions(-)

diff --git a/arch/arc/kernel/perf_event.c b/arch/arc/kernel/perf_event.c
index d60aaaead421..248c7b61690a 100644
--- a/arch/arc/kernel/perf_event.c
+++ b/arch/arc/kernel/perf_event.c
@@ -530,11 +530,39 @@ static int arc_pmu_raw_alloc(struct device *dev)
return 0;
 }
 
+static inline bool event_in_hw_event_map(int i, char *name)
+{
+   if (!arc_pmu_ev_hw_map[i])
+   return false;
+
+   if (!strlen(arc_pmu_ev_hw_map[i]))
+   return false;
+
+   if (strcmp(arc_pmu_ev_hw_map[i], name))
+   return false;
+
+   return true;
+}
+
+static void arc_pmu_map_hw_event(int j, char *str)
+{
+   int i;
+
+   /* See if HW condition has been mapped to a perf event_id */
+   for (i = 0; i < ARRAY_SIZE(arc_pmu_ev_hw_map); i++) {
+   if (event_in_hw_event_map(i, str)) {
+   pr_debug("mapping perf event %2d to h/w event \'%8s\' 
(idx %d)\n",
+i, str, j);
+   arc_pmu->ev_hw_idx[i] = j;
+   }
+   }
+}
+
 static int arc_pmu_device_probe(struct platform_device *pdev)
 {
struct arc_reg_pct_build pct_bcr;
struct arc_reg_cc_build cc_bcr;
-   int i, j, has_interrupts;
+   int i, has_interrupts;
int counter_size;   /* in bits */
 
union cc_name {
@@ -582,23 +610,13 @@ static int arc_pmu_device_probe(struct platform_device 
*pdev)
arc_pmu->ev_hw_idx[i] = -1;
 
/* loop thru all available h/w condition indexes */
-   for (j = 0; j < cc_bcr.c; j++) {
-   write_aux_reg(ARC_REG_CC_INDEX, j);
+   for (i = 0; i < cc_bcr.c; i++) {
+   write_aux_reg(ARC_REG_CC_INDEX, i);
cc_name.indiv.word0 = read_aux_reg(ARC_REG_CC_NAME0);
cc_name.indiv.word1 = read_aux_reg(ARC_REG_CC_NAME1);
 
-   /* See if it has been mapped to a perf event_id */
-   for (i = 0; i < ARRAY_SIZE(arc_pmu_ev_hw_map); i++) {
-   if (arc_pmu_ev_hw_map[i] &&
-   !strcmp(arc_pmu_ev_hw_map[i], cc_name.str) &&
-   strlen(arc_pmu_ev_hw_map[i])) {
-   pr_debug("mapping perf event %2d to h/w event 
\'%8s\' (idx %d)\n",
-i, cc_name.str, j);
-   arc_pmu->ev_hw_idx[i] = j;
-   }
-   }
-
-   arc_pmu_add_raw_event_attr(j, cc_name.str);
+   arc_pmu_map_hw_event(i, cc_name.str);
+   arc_pmu_add_raw_event_attr(i, cc_name.str);
}
 
arc_pmu_events_attr_gr.attrs = arc_pmu->attrs;
-- 
2.14.5


___
linux-snps-arc mailing list
linux-snps-arc@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-snps-arc


[PATCH v2 4/4] ARC: perf: avoid kernel killing where it is possible

2018-12-13 Thread Eugeniy Paltsev
No, not gonna die tonight.

Signed-off-by: Eugeniy Paltsev 
---
 arch/arc/kernel/perf_event.c | 6 --
 1 file changed, 4 insertions(+), 2 deletions(-)

diff --git a/arch/arc/kernel/perf_event.c b/arch/arc/kernel/perf_event.c
index 0c4714906a06..b0f7eeffde9f 100644
--- a/arch/arc/kernel/perf_event.c
+++ b/arch/arc/kernel/perf_event.c
@@ -567,10 +567,12 @@ static int arc_pmu_device_probe(struct platform_device 
*pdev)
return -ENODEV;
}
BUILD_BUG_ON(ARC_PERF_MAX_COUNTERS > 32);
-   BUG_ON(pct_bcr.c > ARC_PERF_MAX_COUNTERS);
+   if (WARN_ON(pct_bcr.c > ARC_PERF_MAX_COUNTERS))
+   return -EINVAL;
 
READ_BCR(ARC_REG_CC_BUILD, cc_bcr);
-   BUG_ON(!cc_bcr.v); /* Counters exist but No countable conditions ? */
+   if (WARN(!cc_bcr.v, "Counters exist but No countable conditions?"))
+   return -EINVAL;
 
arc_pmu = devm_kzalloc(&pdev->dev, sizeof(struct arc_pmu), GFP_KERNEL);
if (!arc_pmu)
-- 
2.14.5


___
linux-snps-arc mailing list
linux-snps-arc@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-snps-arc


[PATCH v6 00/27] ptrace: add PTRACE_GET_SYSCALL_INFO request

2018-12-13 Thread Dmitry V. Levin
PTRACE_GET_SYSCALL_INFO is a generic ptrace API that lets ptracer obtain
details of the syscall the tracee is blocked in.

There are two reasons for a special syscall-related ptrace request.

Firstly, with the current ptrace API there are cases when ptracer cannot
retrieve necessary information about syscalls.  Some examples include:
* The notorious int-0x80-from-64-bit-task issue.  See [1] for details.
In short, if a 64-bit task performs a syscall through int 0x80, its tracer
has no reliable means to find out that the syscall was, in fact,
a compat syscall, and misidentifies it.
* Syscall-enter-stop and syscall-exit-stop look the same for the tracer.
Common practice is to keep track of the sequence of ptrace-stops in order
not to mix the two syscall-stops up.  But it is not as simple as it looks;
for example, strace had a (just recently fixed) long-standing bug where
attaching strace to a tracee that is performing the execve system call
led to the tracer identifying the following syscall-exit-stop as
syscall-enter-stop, which messed up all the state tracking.
* Since the introduction of commit 84d77d3f06e7e8dea057d10e8ec77ad71f721be3
("ptrace: Don't allow accessing an undumpable mm"), both PTRACE_PEEKDATA
and process_vm_readv become unavailable when the process dumpable flag
is cleared.  On such architectures as ia64 this results in all syscall
arguments being unavailable for the tracer.

Secondly, ptracers also have to support a lot of arch-specific code for
obtaining information about the tracee.  For some architectures, this
requires a ptrace(PTRACE_PEEKUSER, ...) invocation for every syscall
argument and return value.

PTRACE_GET_SYSCALL_INFO returns the following structure:

struct ptrace_syscall_info {
__u8 op;/* PTRACE_SYSCALL_INFO_* */
__u32 arch __attribute__((__aligned__(sizeof(__u32;
__u64 instruction_pointer;
__u64 stack_pointer;
union {
struct {
__u64 nr;
__u64 args[6];
} entry;
struct {
__s64 rval;
__u8 is_error;
} exit;
struct {
__u64 nr;
__u64 args[6];
__u32 ret_data;
} seccomp;
};
};

The structure was chosen according to [2], except for the following
changes:
* seccomp substructure was added as a superset of entry substructure;
* the type of nr field was changed from int to __u64 because syscall
numbers are, as a practical matter, 64 bits;
* stack_pointer field was added along with instruction_pointer field
since it is readily available and can save the tracer from extra
PTRACE_GETREGS/PTRACE_GETREGSET calls;
* arch is always initialized to aid with tracing system calls
* such as execve();
* instruction_pointer and stack_pointer are always initialized
so they could be easily obtained for non-syscall stops;
* a boolean is_error field was added along with rval field, this way
the tracer can more reliably distinguish a return value
from an error value.

strace has been ported to PTRACE_GET_SYSCALL_INFO, you can find it
in [3] and [4].

[1] 
https://lore.kernel.org/lkml/ca+55afzcsvmddj9lh_gdbz1ozhyem6zrgpbdajnywm2lf_e...@mail.gmail.com/
[2] 
https://lore.kernel.org/lkml/caobl_7gm0n80n7j_dfw_eqyflyzq+sf4y2avsccv88tb3aw...@mail.gmail.com/
[3] https://github.com/strace/strace/commits/ldv/PTRACE_GET_SYSCALL_INFO
[4] https://gitlab.com/strace/strace/commits/ldv/PTRACE_GET_SYSCALL_INFO

---

Notes:
v6:
* Add syscall_get_arguments and syscall_set_arguments wrappers
  to asm-generic/syscall.h, requested by Geert.
* Change PTRACE_GET_SYSCALL_INFO return code: do not take trailing paddings
  into account, use the end of the last field of the structure being 
written.
* Change struct ptrace_syscall_info:
  * remove .frame_pointer field, is is not needed and not portable;
  * make .arch field explicitly aligned, remove no longer needed
padding before .arch field;
  * remove trailing pads, they are no longer needed.

v5:
* Merge separate series and patches into the single series.
* Change PTRACE_EVENTMSG_SYSCALL_{ENTRY,EXIT} values as requested by Oleg.
* Change struct ptrace_syscall_info: generalize instruction_pointer,
  stack_pointer, and frame_pointer fields by moving them from
  ptrace_syscall_info.{entry,seccomp} substructures to ptrace_syscall_info
  and initializing them for all stops.
* Add PTRACE_SYSCALL_INFO_NONE, set it when not in a syscall stop,
  so e.g. "strace -i" could use PTRACE_SYSCALL_INFO_SECCOMP to obtain
  instruction_pointer when the tracee is in a signal stop.
* Patch all remaining architectures to provide all necessary
  syscall_get_* functions.
* Make available for all architectures: do not conditionalize on
  CONFIG_HAVE_ARCH_TRACEHOOK since all syscall_get_* 

[PATCH v6 05/27] arc: define syscall_get_arch()

2018-12-13 Thread Dmitry V. Levin
syscall_get_arch() is required to be implemented on all architectures
in addition to already implemented syscall_get_nr(),
syscall_get_arguments(), syscall_get_error(), and
syscall_get_return_value() functions in order to extend the generic
ptrace API with PTRACE_GET_SYSCALL_INFO request.

Acked-by: Vineet Gupta 
Cc: Elvira Khabirova 
Cc: Eugene Syromyatnikov 
Cc: Oleg Nesterov 
Cc: Andy Lutomirski 
Cc: Alexey Brodkin 
Cc: Paul Moore 
Cc: Eric Paris 
Cc: linux-snps-arc@lists.infradead.org
Cc: linux-au...@redhat.com
Signed-off-by: Dmitry V. Levin 
---

Notes:
v6: unchanged
v5: added Cc
v2: added Acked-by

 arch/arc/include/asm/syscall.h | 11 +++
 include/uapi/linux/audit.h |  4 
 2 files changed, 15 insertions(+)

diff --git a/arch/arc/include/asm/syscall.h b/arch/arc/include/asm/syscall.h
index 29de09804306..c7fc4c0c3bcb 100644
--- a/arch/arc/include/asm/syscall.h
+++ b/arch/arc/include/asm/syscall.h
@@ -9,6 +9,7 @@
 #ifndef _ASM_ARC_SYSCALL_H
 #define _ASM_ARC_SYSCALL_H  1
 
+#include 
 #include 
 #include 
 #include 
@@ -68,4 +69,14 @@ syscall_get_arguments(struct task_struct *task, struct 
pt_regs *regs,
}
 }
 
+static inline int
+syscall_get_arch(void)
+{
+   return IS_ENABLED(CONFIG_ISA_ARCOMPACT)
+   ? (IS_ENABLED(CONFIG_CPU_BIG_ENDIAN)
+   ? AUDIT_ARCH_ARCOMPACTBE : AUDIT_ARCH_ARCOMPACT)
+   : (IS_ENABLED(CONFIG_CPU_BIG_ENDIAN)
+   ? AUDIT_ARCH_ARCV2BE : AUDIT_ARCH_ARCV2);
+}
+
 #endif
diff --git a/include/uapi/linux/audit.h b/include/uapi/linux/audit.h
index 818ae690ab79..bedf3bf54c3a 100644
--- a/include/uapi/linux/audit.h
+++ b/include/uapi/linux/audit.h
@@ -375,6 +375,10 @@ enum {
 
 #define AUDIT_ARCH_AARCH64 (EM_AARCH64|__AUDIT_ARCH_64BIT|__AUDIT_ARCH_LE)
 #define AUDIT_ARCH_ALPHA   (EM_ALPHA|__AUDIT_ARCH_64BIT|__AUDIT_ARCH_LE)
+#define AUDIT_ARCH_ARCOMPACT   (EM_ARCOMPACT|__AUDIT_ARCH_LE)
+#define AUDIT_ARCH_ARCOMPACTBE (EM_ARCOMPACT)
+#define AUDIT_ARCH_ARCV2   (EM_ARCV2|__AUDIT_ARCH_LE)
+#define AUDIT_ARCH_ARCV2BE (EM_ARCV2)
 #define AUDIT_ARCH_ARM (EM_ARM|__AUDIT_ARCH_LE)
 #define AUDIT_ARCH_ARMEB   (EM_ARM)
 #define AUDIT_ARCH_CRIS(EM_CRIS|__AUDIT_ARCH_LE)
-- 
ldv

___
linux-snps-arc mailing list
linux-snps-arc@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-snps-arc


Re: [PATCH v2 4/4] ARC: perf: avoid kernel killing where it is possible

2018-12-13 Thread Vineet Gupta
On 12/13/18 8:56 AM, Eugeniy Paltsev wrote:
> No, not gonna die tonight.
>
> Signed-off-by: Eugeniy Paltsev 

Applied.

Thx,
-Vineet

___
linux-snps-arc mailing list
linux-snps-arc@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-snps-arc


[PATCH v6 24/27] syscall_get_arch: add "struct task_struct *" argument

2018-12-13 Thread Dmitry V. Levin
This argument is required to extend the generic ptrace API with
PTRACE_GET_SYSCALL_INFO request: syscall_get_arch() is going
to be called from ptrace_request() along with syscall_get_nr(),
syscall_get_arguments(), syscall_get_error(), and
syscall_get_return_value() functions with a tracee as their argument.

Reverts: 5e937a9ae913 ("syscall_get_arch: remove useless function arguments")
Reverts: 1002d94d3076 ("syscall.h: fix doc text for syscall_get_arch()")
Reviewed-by: Andy Lutomirski  # for x86
Reviewed-by: Palmer Dabbelt 
Acked-by: Paul Burton  # MIPS parts
Acked-by: Michael Ellerman  (powerpc)
Acked-by: Kees Cook  # seccomp parts
Acked-by: Mark Salter  # for the c6x bit
Cc: Eric Paris 
Cc: Paul Moore 
Cc: Richard Henderson 
Cc: Ivan Kokshaysky 
Cc: Matt Turner 
Cc: Vineet Gupta 
Cc: Russell King 
Cc: Catalin Marinas 
Cc: Will Deacon 
Cc: Aurelien Jacquiot 
Cc: Yoshinori Sato 
Cc: Richard Kuo 
Cc: Tony Luck 
Cc: Fenghua Yu 
Cc: Geert Uytterhoeven 
Cc: Michal Simek 
Cc: Greentime Hu 
Cc: Vincent Chen 
Cc: Ley Foon Tan 
Cc: Jonas Bonn 
Cc: Stefan Kristiansson 
Cc: Stafford Horne 
Cc: James E.J. Bottomley 
Cc: Helge Deller 
Cc: Albert Ou 
Cc: Martin Schwidefsky 
Cc: Heiko Carstens 
Cc: Rich Felker 
Cc: David S. Miller 
Cc: Guan Xuetao 
Cc: Jeff Dike 
Cc: Richard Weinberger 
Cc: Chris Zankel 
Cc: Max Filippov 
Cc: Arnd Bergmann 
Cc: Will Drewry 
Cc: Oleg Nesterov 
Cc: Elvira Khabirova 
Cc: Eugene Syromyatnikov 
Cc: Ralf Baechle 
Cc: James Hogan 
Cc: Benjamin Herrenschmidt 
Cc: Paul Mackerras 
Cc: Thomas Gleixner 
Cc: Ingo Molnar 
Cc: Borislav Petkov 
Cc: H. Peter Anvin 
Cc: x...@kernel.org
Cc: linux-al...@vger.kernel.org
Cc: linux-snps-arc@lists.infradead.org
Cc: linux-arm-ker...@lists.infradead.org
Cc: linux-c6x-...@linux-c6x.org
Cc: uclinux-h8-de...@lists.sourceforge.jp
Cc: linux-hexa...@vger.kernel.org
Cc: linux-i...@vger.kernel.org
Cc: linux-m...@lists.linux-m68k.org
Cc: linux-m...@vger.kernel.org
Cc: nios2-...@lists.rocketboards.org
Cc: openr...@lists.librecores.org
Cc: linux-par...@vger.kernel.org
Cc: linuxppc-...@lists.ozlabs.org
Cc: linux-ri...@lists.infradead.org
Cc: linux-s...@vger.kernel.org
Cc: linux...@vger.kernel.org
Cc: sparcli...@vger.kernel.org
Cc: linux...@lists.infradead.org
Cc: linux-xte...@linux-xtensa.org
Cc: linux-a...@vger.kernel.org
Cc: linux-au...@redhat.com
Signed-off-by: Dmitry V. Levin 
---

Notes:
v6: added more Acked-by
v5: added Cc
v2: cleaned up mips part, added Reviewed-by

 arch/alpha/include/asm/syscall.h  |  2 +-
 arch/arc/include/asm/syscall.h|  2 +-
 arch/arm/include/asm/syscall.h|  2 +-
 arch/arm64/include/asm/syscall.h  |  4 ++--
 arch/c6x/include/asm/syscall.h|  2 +-
 arch/csky/include/asm/syscall.h   |  2 +-
 arch/h8300/include/asm/syscall.h  |  2 +-
 arch/hexagon/include/asm/syscall.h|  2 +-
 arch/ia64/include/asm/syscall.h   |  2 +-
 arch/m68k/include/asm/syscall.h   |  2 +-
 arch/microblaze/include/asm/syscall.h |  2 +-
 arch/mips/include/asm/syscall.h   |  6 +++---
 arch/mips/kernel/ptrace.c |  2 +-
 arch/nds32/include/asm/syscall.h  |  2 +-
 arch/nios2/include/asm/syscall.h  |  2 +-
 arch/openrisc/include/asm/syscall.h   |  2 +-
 arch/parisc/include/asm/syscall.h |  4 ++--
 arch/powerpc/include/asm/syscall.h| 10 --
 arch/riscv/include/asm/syscall.h  |  2 +-
 arch/s390/include/asm/syscall.h   |  4 ++--
 arch/sh/include/asm/syscall_32.h  |  2 +-
 arch/sh/include/asm/syscall_64.h  |  2 +-
 arch/sparc/include/asm/syscall.h  |  5 +++--
 arch/unicore32/include/asm/syscall.h  |  2 +-
 arch/x86/include/asm/syscall.h|  8 +---
 arch/x86/um/asm/syscall.h |  2 +-
 arch/xtensa/include/asm/syscall.h |  2 +-
 include/asm-generic/syscall.h |  5 +++--
 kernel/auditsc.c  |  4 ++--
 kernel/seccomp.c  |  4 ++--
 30 files changed, 52 insertions(+), 42 deletions(-)

diff --git a/arch/alpha/include/asm/syscall.h b/arch/alpha/include/asm/syscall.h
index c67d6a69d7c8..20078aef0922 100644
--- a/arch/alpha/include/asm/syscall.h
+++ b/arch/alpha/include/asm/syscall.h
@@ -33,7 +33,7 @@ syscall_get_return_value(struct task_struct *task, struct 
pt_regs *regs)
 }
 
 static inline int
-syscall_get_arch(void)
+syscall_get_arch(struct task_struct *task)
 {
return AUDIT_ARCH_ALPHA;
 }
diff --git a/arch/arc/include/asm/syscall.h b/arch/arc/include/asm/syscall.h
index c7fc4c0c3bcb..caf2697ef5b7 100644
--- a/arch/arc/include/asm/syscall.h
+++ b/arch/arc/include/asm/syscall.h
@@ -70,7 +70,7 @@ syscall_get_arguments(struct task_struct *task, struct 
pt_regs *regs,
 }
 
 static inline int
-syscall_get_arch(void)
+syscall_get_arch(struct task_struct *task)
 {
return IS_ENABLED(CONFIG_ISA_ARCOMPACT)
? (IS_ENABLED(CONFIG_CPU_BIG_ENDIAN)
diff --git a/arch/arm/include/asm/syscall.h b/arch/arm/include/asm/syscall.h
index 06dea6bce293..3940ceac0bdc 100644
--- a/arch/arm/include/as

Re: [PATCH v2 1/4] ARC: perf: trivial code cleanup

2018-12-13 Thread Vineet Gupta
On 12/13/18 8:56 AM, Eugeniy Paltsev wrote:
> * Use BIT(), lower_32_bits(), upper_32_bits() macroses,
>   fix code style violations.
> * Use u32, u64, s64 instead of uint32_t, uint64_t, int64_t
> * Fix description comment as this code doesn't belong only to
>   ARC700 anymore.
> * Use SPDX License Identifier.
> * Remove useless ifdefs. ifdef around 'arc_pmu_match' structure
>   declaration is useless as we refer to 'arc_pmu_match' in
>   several places which aren't guarded with ifdef. Nevertheless
>   'ARC' option selects 'OF' unconditionally so we can simply
>   get rid of this ifdef.
>
> Acked-by: Vineet Gupta 
> Signed-off-by: Eugeniy Paltsev 

Applied !

Thx,
-Vineet

___
linux-snps-arc mailing list
linux-snps-arc@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-snps-arc


[PATCH v6 04/27] Move EM_ARCOMPACT and EM_ARCV2 to uapi/linux/elf-em.h

2018-12-13 Thread Dmitry V. Levin
These should never have been defined in the arch tree to begin with, and
now uapi/linux/audit.h header is going to use EM_ARCOMPACT and EM_ARCV2
in order to define AUDIT_ARCH_ARCOMPACT and AUDIT_ARCH_ARCV2 which are
needed to implement syscall_get_arch() which in turn is required to
extend the generic ptrace API with PTRACE_GET_SYSCALL_INFO request.

Acked-by: Vineet Gupta 
Cc: Elvira Khabirova 
Cc: Eugene Syromyatnikov 
Cc: Oleg Nesterov 
Cc: Andy Lutomirski 
Cc: Alexey Brodkin 
Cc: linux-snps-arc@lists.infradead.org
Signed-off-by: Dmitry V. Levin 
---

Notes:
v6: unchanged
v5: added Cc
v2: added Acked-by

 arch/arc/include/asm/elf.h  | 6 +-
 include/uapi/linux/elf-em.h | 2 ++
 2 files changed, 3 insertions(+), 5 deletions(-)

diff --git a/arch/arc/include/asm/elf.h b/arch/arc/include/asm/elf.h
index aa2d6da9d187..2b80c184c9c8 100644
--- a/arch/arc/include/asm/elf.h
+++ b/arch/arc/include/asm/elf.h
@@ -10,13 +10,9 @@
 #define __ASM_ARC_ELF_H
 
 #include 
+#include 
 #include 
 
-/* These ELF defines belong to uapi but libc elf.h already defines them */
-#define EM_ARCOMPACT   93
-
-#define EM_ARCV2   195 /* ARCv2 Cores */
-
 #define EM_ARC_INUSE   (IS_ENABLED(CONFIG_ISA_ARCOMPACT) ? \
EM_ARCOMPACT : EM_ARCV2)
 
diff --git a/include/uapi/linux/elf-em.h b/include/uapi/linux/elf-em.h
index 93722e60204c..42b7546352a6 100644
--- a/include/uapi/linux/elf-em.h
+++ b/include/uapi/linux/elf-em.h
@@ -34,6 +34,7 @@
 #define EM_M32R88  /* Renesas M32R */
 #define EM_MN10300 89  /* Panasonic/MEI MN10300, AM33 */
 #define EM_OPENRISC 92 /* OpenRISC 32-bit embedded processor */
+#define EM_ARCOMPACT   93  /* ARCompact processor */
 #define EM_BLACKFIN 106 /* ADI Blackfin Processor */
 #define EM_ALTERA_NIOS2113 /* Altera Nios II soft-core processor */
 #define EM_TI_C6000140 /* TI C6X DSPs */
@@ -41,6 +42,7 @@
 #define EM_TILEPRO 188 /* Tilera TILEPro */
 #define EM_MICROBLAZE  189 /* Xilinx MicroBlaze */
 #define EM_TILEGX  191 /* Tilera TILE-Gx */
+#define EM_ARCV2   195 /* ARCv2 Cores */
 #define EM_RISCV   243 /* RISC-V */
 #define EM_BPF 247 /* Linux BPF - in-kernel virtual machine */
 #define EM_FRV 0x5441  /* Fujitsu FR-V */
-- 
ldv

___
linux-snps-arc mailing list
linux-snps-arc@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-snps-arc


Re: [PATCH] ARC: fix __ffs return value to avoid build warnings

2018-12-13 Thread Vineet Gupta
On 12/13/18 7:43 AM, Eugeniy Paltsev wrote:
> Change __ffs return value from 'int' to 'unsigned long' as it
> is done in other implementations (like asm-generic, x86, etc...)
> to avoid build-time warnings in places where type is strictly
> checked.
>
> As __ffs may return values in [0-31] interval changing return
> type to unsigned is valid.
>
> Signed-off-by: Eugeniy Paltsev 

Can you please paste a couple of lines of offending output !

-Vineet

___
linux-snps-arc mailing list
linux-snps-arc@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-snps-arc


Re: [PATCH v2 3/4] ARC: perf: move HW events mapping to separate function

2018-12-13 Thread Vineet Gupta
On 12/13/18 8:56 AM, Eugeniy Paltsev wrote:
> Move HW events mapping to separate function to make code more readable.
> 
> Signed-off-by: Eugeniy Paltsev 

Applied this as well - although out of order so needed some manual adj !

-Vineet

___
linux-snps-arc mailing list
linux-snps-arc@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-snps-arc