[PATCH v7 01/20] arc: mm: Add p?d_large() definitions

2019-03-28 Thread Steven Price
walk_page_range() is going to be allowed to walk page tables other than
those of user space. For this it needs to know when it has reached a
'leaf' entry in the page tables. This information will be provided by the
p?d_large() functions/macros.

For arc, we only have two levels, so only pmd_large() is needed.

CC: Vineet Gupta 
CC: linux-snps-arc@lists.infradead.org
Signed-off-by: Steven Price 
Acked-by: Vineet Gupta 
---
 arch/arc/include/asm/pgtable.h | 1 +
 1 file changed, 1 insertion(+)

diff --git a/arch/arc/include/asm/pgtable.h b/arch/arc/include/asm/pgtable.h
index cf4be70d5892..0edd27bc7018 100644
--- a/arch/arc/include/asm/pgtable.h
+++ b/arch/arc/include/asm/pgtable.h
@@ -277,6 +277,7 @@ static inline void pmd_set(pmd_t *pmdp, pte_t *ptep)
 #define pmd_none(x)(!pmd_val(x))
 #definepmd_bad(x)  ((pmd_val(x) & ~PAGE_MASK))
 #define pmd_present(x) (pmd_val(x))
+#define pmd_large(x)   (pmd_val(pmd) & _PAGE_HW_SZ)
 #define pmd_clear(xp)  do { pmd_val(*(xp)) = 0; } while (0)
 
 #define pte_page(pte)  pfn_to_page(pte_pfn(pte))
-- 
2.20.1


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


[PATCH] [ARC] PR 88409: miscompilation due to missing cc clobber in longlong.h macros

2019-03-28 Thread Vineet Gupta
simple test such as below was failing.

| void main(int argc, char *argv[])
| {
|size_t total_time = 115424;   // expected 115.424
|double secs = (double)total_time/(double)1000;
|printf("%s %d %lf\n", "secs", total_time, secs);  // prints 113.504
|printf("%d\n", (size_t)secs);
| }

The printf eventually called into glibc stdlib/divrem.c:__mpn_divrem()
which uses the __arc__ specific inline asm macros from longlong.h which
were causing miscompilation.

include/
2019-03-28  Vineet Gupta 

PR 89877

* longlong.h [__arc__] (add_ss): Add cc clobber
(sub_ddmmss): Likewise.

Signed-off-by: Vineet Gupta 
---
 include/ChangeLog  | 7 +++
 include/longlong.h | 6 --
 2 files changed, 11 insertions(+), 2 deletions(-)

diff --git a/include/ChangeLog b/include/ChangeLog
index be08141deeb9..96d967d10a52 100644
--- a/include/ChangeLog
+++ b/include/ChangeLog
@@ -1,3 +1,10 @@
+2019-03-28  Vineet Gupta 
+
+   PR 89877
+
+   * longlong.h [__arc__] (add_ss): Add cc clobber
+   (sub_ddmmss): Likewise.
+
 2019-02-11  Philippe Waroquiers  
 
* splay-tree.h (splay_tree_delete_key_fn): Update comment.
diff --git a/include/longlong.h b/include/longlong.h
index 3dd8dc3aa80c..1f0ce4204255 100644
--- a/include/longlong.h
+++ b/include/longlong.h
@@ -199,7 +199,8 @@ extern UDItype __udiv_qrnnd (UDItype *, UDItype, UDItype, 
UDItype);
   : "%r" ((USItype) (ah)), \
 "rICal" ((USItype) (bh)),  \
 "%r" ((USItype) (al)), \
-"rICal" ((USItype) (bl)))
+"rICal" ((USItype) (bl))   \
+  : "cc")
 #define sub_ddmmss(sh, sl, ah, al, bh, bl) \
   __asm__ ("sub.f  %1, %4, %5\n\tsbc   %0, %2, %3" \
   : "=r" ((USItype) (sh)), \
@@ -207,7 +208,8 @@ extern UDItype __udiv_qrnnd (UDItype *, UDItype, UDItype, 
UDItype);
   : "r" ((USItype) (ah)),  \
 "rICal" ((USItype) (bh)),  \
 "r" ((USItype) (al)),  \
-"rICal" ((USItype) (bl)))
+"rICal" ((USItype) (bl))   \
+  : "cc")
 
 #define __umulsidi3(u,v) ((UDItype)(USItype)u*(USItype)v)
 #ifdef __ARC_NORM__
-- 
2.7.4


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


Re: [PATCH] [ARC] PR 88409: miscompilation due to missing cc clobber in longlong.h macros

2019-03-28 Thread Marc Glisse

On Thu, 28 Mar 2019, Vineet Gupta wrote:


simple test such as below was failing.

| void main(int argc, char *argv[])
| {
|size_t total_time = 115424;   // expected 115.424
|double secs = (double)total_time/(double)1000;
|printf("%s %d %lf\n", "secs", total_time, secs);  // prints 113.504
|printf("%d\n", (size_t)secs);
| }

The printf eventually called into glibc stdlib/divrem.c:__mpn_divrem()
which uses the __arc__ specific inline asm macros from longlong.h which
were causing miscompilation.


Hello,

do you intend to post similar patches for glibc and gmp, which both have a 
similar longlong.h?


--
Marc Glisse

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


Re: [PATCH] [ARC] PR 88409: miscompilation due to missing cc clobber in longlong.h macros

2019-03-28 Thread Vineet Gupta
On 3/28/19 5:07 PM, Marc Glisse wrote:
> On Thu, 28 Mar 2019, Vineet Gupta wrote:
>
>> simple test such as below was failing.
>>
>> | void main(int argc, char *argv[])
>> | {
>> |size_t total_time = 115424;   // expected 115.424
>> |double secs = (double)total_time/(double)1000;
>> |printf("%s %d %lf\n", "secs", total_time, secs);  // prints 113.504
>> |printf("%d\n", (size_t)secs);
>> | }
>>
>> The printf eventually called into glibc stdlib/divrem.c:__mpn_divrem()
>> which uses the __arc__ specific inline asm macros from longlong.h which
>> were causing miscompilation.
> Hello,
>
> do you intend to post similar patches for glibc and gmp, which both have a 
> similar longlong.h?

Yeah, glibc typically "syncs" longlong.h from gcc so once gcc patch is merged,
I'll post a sync patch to glibc.
Good tip about gmp, I wasn't aware of that. I suppose I could post there too 
once
dust settles on gcc side.

Thx,
-Vinet

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


[RFC][PATCH 4/4 v2] syscalls: Remove start and number from syscall_set_arguments() args

2019-03-28 Thread Steven Rostedt
From: "Steven Rostedt (VMware)" 

After removing the start and count arguments of syscall_get_arguments() it
seems reasonable to remove them from syscall_set_arguments(). Note, as of
today, there are no users of syscall_set_arguments(). But we are told that
there will be soon. But for now, at least make it consistent with
syscall_get_arguments().

Link: http://lkml.kernel.org/r/20190327222014.ga32...@altlinux.org

Cc: Oleg Nesterov 
Cc: Thomas Gleixner 
Cc: Kees Cook 
Cc: Andy Lutomirski 
Cc: Dominik Brodowski 
Cc: Dave Martin 
Cc: "Dmitry V. Levin" 
Cc: x...@kernel.org
Cc: linux-snps-arc@lists.infradead.org
Cc: linux-ker...@vger.kernel.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...@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
Signed-off-by: Steven Rostedt (VMware) 
---
 arch/arm/include/asm/syscall.h| 22 ++---
 arch/arm64/include/asm/syscall.h  | 22 ++---
 arch/c6x/include/asm/syscall.h| 38 +++
 arch/csky/include/asm/syscall.h   | 13 ++---
 arch/ia64/include/asm/syscall.h   | 10 ++--
 arch/ia64/kernel/ptrace.c |  7 ++-
 arch/microblaze/include/asm/syscall.h |  4 +-
 arch/nds32/include/asm/syscall.h  | 29 ++-
 arch/nios2/include/asm/syscall.h  | 42 +++-
 arch/openrisc/include/asm/syscall.h   |  6 +--
 arch/powerpc/include/asm/syscall.h|  7 +--
 arch/riscv/include/asm/syscall.h  | 12 ++---
 arch/s390/include/asm/syscall.h   | 11 ++---
 arch/sh/include/asm/syscall_32.h  | 21 +++-
 arch/sh/include/asm/syscall_64.h  |  4 +-
 arch/sparc/include/asm/syscall.h  |  7 ++-
 arch/um/include/asm/syscall-generic.h | 39 +++
 arch/x86/include/asm/syscall.h| 69 +++
 arch/xtensa/include/asm/syscall.h | 17 ++-
 include/asm-generic/syscall.h | 10 +---
 20 files changed, 88 insertions(+), 302 deletions(-)

diff --git a/arch/arm/include/asm/syscall.h b/arch/arm/include/asm/syscall.h
index db969a2972ae..080ce70cab12 100644
--- a/arch/arm/include/asm/syscall.h
+++ b/arch/arm/include/asm/syscall.h
@@ -65,26 +65,12 @@ static inline void syscall_get_arguments(struct task_struct 
*task,
 
 static inline void syscall_set_arguments(struct task_struct *task,
 struct pt_regs *regs,
-unsigned int i, unsigned int n,
 const unsigned long *args)
 {
-   if (n == 0)
-   return;
-
-   if (i + n > SYSCALL_MAX_ARGS) {
-   pr_warn("%s called with max args %d, handling only %d\n",
-   __func__, i + n, SYSCALL_MAX_ARGS);
-   n = SYSCALL_MAX_ARGS - i;
-   }
-
-   if (i == 0) {
-   regs->ARM_ORIG_r0 = args[0];
-   args++;
-   i++;
-   n--;
-   }
-
-   memcpy(®s->ARM_r0 + i, args, n * sizeof(args[0]));
+   regs->ARM_ORIG_r0 = args[0];
+   args++;
+
+   memcpy(®s->ARM_r0 + 1, args, 5 * sizeof(args[0]));
 }
 
 static inline int syscall_get_arch(void)
diff --git a/arch/arm64/include/asm/syscall.h b/arch/arm64/include/asm/syscall.h
index 55b2dab21023..a179df3674a1 100644
--- a/arch/arm64/include/asm/syscall.h
+++ b/arch/arm64/include/asm/syscall.h
@@ -75,26 +75,12 @@ static inline void syscall_get_arguments(struct task_struct 
*task,
 
 static inline void syscall_set_arguments(struct task_struct *task,
 struct pt_regs *regs,
-unsigned int i, unsigned int n,
 const unsigned long *args)
 {
-   if (n == 0)
-   return;
-
-   if (i + n > SYSCALL_MAX_ARGS) {
-   pr_warning("%s called with max args %d, handling only %d\n",
-  __func__, i + n, SYSCALL_MAX_ARGS);
-   n = SYSCALL_MAX_ARGS - i;
-   }
-
-   if (i == 0) {
-   regs->orig_x0 = args[0];
-   args++;
-   i++;
-   n--;
-   }
-
-   memcpy(®s->regs[i], args, n * sizeof(args[0]));
+   regs->orig_x0 = args[0];
+   args++;
+
+   memcpy(®s->regs[1], args, 5 * sizeof(args[0]));
 }
 
 /*
diff --git a/arch/c6x/include/asm/syscall.h b/arch/c6x/include/asm/syscall.h
index 06db3251926b..15ba8599858e 100644
--- a/arch/c6x/include/asm/syscall.h
+++ b/arch/c6x/include/asm/syscall.h
@@ -59,40 +59,14 @@ static inline void syscall_get_arguments(struct task_struc

[RFC][PATCH 3/4 v2] syscalls: Remove start and number from syscall_get_arguments() args

2019-03-28 Thread Steven Rostedt
From: "Steven Rostedt (Red Hat)" 

At Linux Plumbers, Andy Lutomirski approached me and pointed out that the
function call syscall_get_arguments() implemented in x86 was horribly
written and not optimized for the standard case of passing in 0 and 6 for
the starting index and the number of system calls to get. When looking at
all the users of this function, I discovered that all instances pass in only
0 and 6 for these arguments. Instead of having this function handle
different cases that are never used, simply rewrite it to return the first 6
arguments of a system call.

This should help out the performance of tracing system calls by ptrace,
ftrace and perf.

Link: http://lkml.kernel.org/r/20161107213233.754809...@goodmis.org

Cc: Oleg Nesterov 
Cc: Thomas Gleixner 
Cc: Kees Cook 
Cc: Andy Lutomirski 
Cc: Dominik Brodowski 
Cc: Dave Martin 
Cc: "Dmitry V. Levin" 
Cc: x...@kernel.org
Cc: linux-snps-arc@lists.infradead.org
Cc: linux-ker...@vger.kernel.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...@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
Reported-by: Andy Lutomirski 
Signed-off-by: Steven Rostedt (VMware) 
---
 arch/arc/include/asm/syscall.h|  7 ++-
 arch/arm/include/asm/syscall.h| 23 ++---
 arch/arm64/include/asm/syscall.h  | 22 ++--
 arch/c6x/include/asm/syscall.h| 41 +++
 arch/csky/include/asm/syscall.h   | 13 ++---
 arch/h8300/include/asm/syscall.h  | 34 +++--
 arch/hexagon/include/asm/syscall.h|  4 +-
 arch/ia64/include/asm/syscall.h   |  5 +-
 arch/microblaze/include/asm/syscall.h |  4 +-
 arch/mips/include/asm/syscall.h   |  3 +-
 arch/mips/kernel/ptrace.c |  2 +-
 arch/nds32/include/asm/syscall.h  | 33 +++-
 arch/nios2/include/asm/syscall.h  | 42 +++
 arch/openrisc/include/asm/syscall.h   |  6 +--
 arch/parisc/include/asm/syscall.h | 30 +++
 arch/powerpc/include/asm/syscall.h|  8 ++-
 arch/riscv/include/asm/syscall.h  | 12 ++---
 arch/s390/include/asm/syscall.h   | 17 ++-
 arch/sh/include/asm/syscall_32.h  | 26 +++---
 arch/sh/include/asm/syscall_64.h  |  4 +-
 arch/sparc/include/asm/syscall.h  |  4 +-
 arch/um/include/asm/syscall-generic.h | 39 +++---
 arch/x86/include/asm/syscall.h| 73 +++
 arch/xtensa/include/asm/syscall.h | 16 ++
 include/asm-generic/syscall.h | 11 ++--
 include/trace/events/syscalls.h   |  2 +-
 kernel/seccomp.c  |  2 +-
 kernel/trace/trace_syscalls.c |  4 +-
 lib/syscall.c |  2 +-
 29 files changed, 113 insertions(+), 376 deletions(-)

diff --git a/arch/arc/include/asm/syscall.h b/arch/arc/include/asm/syscall.h
index 29de09804306..c7a4201ed62b 100644
--- a/arch/arc/include/asm/syscall.h
+++ b/arch/arc/include/asm/syscall.h
@@ -55,12 +55,11 @@ syscall_set_return_value(struct task_struct *task, struct 
pt_regs *regs,
  */
 static inline void
 syscall_get_arguments(struct task_struct *task, struct pt_regs *regs,
- unsigned int i, unsigned int n, unsigned long *args)
+ unsigned long *args)
 {
unsigned long *inside_ptregs = &(regs->r0);
-   inside_ptregs -= i;
-
-   BUG_ON((i + n) > 6);
+   unsigned int n = 6;
+   unsigned int i = 0;
 
while (n--) {
args[i++] = (*inside_ptregs);
diff --git a/arch/arm/include/asm/syscall.h b/arch/arm/include/asm/syscall.h
index 06dea6bce293..db969a2972ae 100644
--- a/arch/arm/include/asm/syscall.h
+++ b/arch/arm/include/asm/syscall.h
@@ -55,29 +55,12 @@ static inline void syscall_set_return_value(struct 
task_struct *task,
 
 static inline void syscall_get_arguments(struct task_struct *task,
 struct pt_regs *regs,
-unsigned int i, unsigned int n,
 unsigned long *args)
 {
-   if (n == 0)
-   return;
-
-   if (i + n > SYSCALL_MAX_ARGS) {
-   unsigned long *args_bad = args + SYSCALL_MAX_ARGS - i;
-   unsigned int n_bad = n + i - SYSCALL_MAX_ARGS;
-   pr_warn("%s called with max args %d, handling only %d\n",
-   __func__, i + n, SYSCALL_MAX_ARGS);
-   memset(args_bad, 0, n_bad * sizeof(args[0]));
-   n = SYSCALL_MAX_ARGS - i;
-   }
-
-   if (i == 0) {
-   args[0] = regs->ARM_ORIG_r0;
-