From: Richard W. <ri...@no...> - 2011-04-15 23:03:33
|
In some cases gcc-4.6 will optimize away current_thread_info(). To prevent gcc from doing so the stack address has to be obtained via inline asm. LKML-Reference: http://marc.info/?i=201...@no... Signed-off-by: Richard Weinberger <ri...@no...> --- arch/um/include/asm/thread_info.h | 5 ++++- 1 files changed, 4 insertions(+), 1 deletions(-) diff --git a/arch/um/include/asm/thread_info.h b/arch/um/include/asm/thread_info.h index e2cf786..5bd1bad 100644 --- a/arch/um/include/asm/thread_info.h +++ b/arch/um/include/asm/thread_info.h @@ -49,7 +49,10 @@ static inline struct thread_info *current_thread_info(void) { struct thread_info *ti; unsigned long mask = THREAD_SIZE - 1; - ti = (struct thread_info *) (((unsigned long) &ti) & ~mask); + void *p; + + asm volatile ("" : "=r" (p) : "0" (&ti)); + ti = (struct thread_info *) (((unsigned long)p) & ~mask); return ti; } -- 1.6.6.1 |
From: Richard W. <ri...@no...> - 2011-04-20 11:35:08
|
In some cases gcc-4.6 will optimize away current_thread_info(). To prevent gcc from doing so the stack address has to be obtained via inline asm. LKML-Reference: http://marc.info/?i=201...@no... Signed-off-by: Richard Weinberger <ri...@no...> --- arch/um/include/asm/thread_info.h | 5 ++++- 1 files changed, 4 insertions(+), 1 deletions(-) diff --git a/arch/um/include/asm/thread_info.h b/arch/um/include/asm/thread_info.h index e2cf786..5bd1bad 100644 --- a/arch/um/include/asm/thread_info.h +++ b/arch/um/include/asm/thread_info.h @@ -49,7 +49,10 @@ static inline struct thread_info *current_thread_info(void) { struct thread_info *ti; unsigned long mask = THREAD_SIZE - 1; - ti = (struct thread_info *) (((unsigned long) &ti) & ~mask); + void *p; + + asm volatile ("" : "=r" (p) : "0" (&ti)); + ti = (struct thread_info *) (((unsigned long)p) & ~mask); return ti; } -- 1.7.4.2 |
From: Richard W. <ri...@no...> - 2011-04-20 11:35:57
|
This adds support for 64 bit atomic operations on 32 bit UML systems. XFS needs them since 2.6.38. Reported-by: Martin Walch <wal...@we...> Tested-by: Martin Walch <wal...@we...> Cc: Martin Walch <wal...@we...> Cc: <st...@ke...> # .38.x 084189a: um: disable CONFIG_CMPXCHG_LOCAL Signed-off-by: Richard Weinberger <ri...@no...> --- arch/um/sys-i386/Makefile | 2 +- arch/um/sys-i386/atomic64_cx8_32.S | 225 ++++++++++++++++++++++++++++++++++++ 2 files changed, 226 insertions(+), 1 deletions(-) create mode 100644 arch/um/sys-i386/atomic64_cx8_32.S diff --git a/arch/um/sys-i386/Makefile b/arch/um/sys-i386/Makefile index 804b28d..b1da91c 100644 --- a/arch/um/sys-i386/Makefile +++ b/arch/um/sys-i386/Makefile @@ -4,7 +4,7 @@ obj-y = bug.o bugs.o checksum.o delay.o fault.o ksyms.o ldt.o ptrace.o \ ptrace_user.o setjmp.o signal.o stub.o stub_segv.o syscalls.o sysrq.o \ - sys_call_table.o tls.o + sys_call_table.o tls.o atomic64_cx8_32.o obj-$(CONFIG_BINFMT_ELF) += elfcore.o diff --git a/arch/um/sys-i386/atomic64_cx8_32.S b/arch/um/sys-i386/atomic64_cx8_32.S new file mode 100644 index 0000000..1e901d3 --- /dev/null +++ b/arch/um/sys-i386/atomic64_cx8_32.S @@ -0,0 +1,225 @@ +/* + * atomic64_t for 586+ + * + * Copied from arch/x86/lib/atomic64_cx8_32.S + * + * Copyright © 2010 Luca Barbieri + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + */ + +#include <linux/linkage.h> +#include <asm/alternative-asm.h> +#include <asm/dwarf2.h> + +.macro SAVE reg + pushl_cfi %\reg + CFI_REL_OFFSET \reg, 0 +.endm + +.macro RESTORE reg + popl_cfi %\reg + CFI_RESTORE \reg +.endm + +.macro read64 reg + movl %ebx, %eax + movl %ecx, %edx +/* we need LOCK_PREFIX since otherwise cmpxchg8b always does the write */ + LOCK_PREFIX + cmpxchg8b (\reg) +.endm + +ENTRY(atomic64_read_cx8) + CFI_STARTPROC + + read64 %ecx + ret + CFI_ENDPROC +ENDPROC(atomic64_read_cx8) + +ENTRY(atomic64_set_cx8) + CFI_STARTPROC + +1: +/* we don't need LOCK_PREFIX since aligned 64-bit writes + * are atomic on 586 and newer */ + cmpxchg8b (%esi) + jne 1b + + ret + CFI_ENDPROC +ENDPROC(atomic64_set_cx8) + +ENTRY(atomic64_xchg_cx8) + CFI_STARTPROC + + movl %ebx, %eax + movl %ecx, %edx +1: + LOCK_PREFIX + cmpxchg8b (%esi) + jne 1b + + ret + CFI_ENDPROC +ENDPROC(atomic64_xchg_cx8) + +.macro addsub_return func ins insc +ENTRY(atomic64_\func\()_return_cx8) + CFI_STARTPROC + SAVE ebp + SAVE ebx + SAVE esi + SAVE edi + + movl %eax, %esi + movl %edx, %edi + movl %ecx, %ebp + + read64 %ebp +1: + movl %eax, %ebx + movl %edx, %ecx + \ins\()l %esi, %ebx + \insc\()l %edi, %ecx + LOCK_PREFIX + cmpxchg8b (%ebp) + jne 1b + +10: + movl %ebx, %eax + movl %ecx, %edx + RESTORE edi + RESTORE esi + RESTORE ebx + RESTORE ebp + ret + CFI_ENDPROC +ENDPROC(atomic64_\func\()_return_cx8) +.endm + +addsub_return add add adc +addsub_return sub sub sbb + +.macro incdec_return func ins insc +ENTRY(atomic64_\func\()_return_cx8) + CFI_STARTPROC + SAVE ebx + + read64 %esi +1: + movl %eax, %ebx + movl %edx, %ecx + \ins\()l $1, %ebx + \insc\()l $0, %ecx + LOCK_PREFIX + cmpxchg8b (%esi) + jne 1b + +10: + movl %ebx, %eax + movl %ecx, %edx + RESTORE ebx + ret + CFI_ENDPROC +ENDPROC(atomic64_\func\()_return_cx8) +.endm + +incdec_return inc add adc +incdec_return dec sub sbb + +ENTRY(atomic64_dec_if_positive_cx8) + CFI_STARTPROC + SAVE ebx + + read64 %esi +1: + movl %eax, %ebx + movl %edx, %ecx + subl $1, %ebx + sbb $0, %ecx + js 2f + LOCK_PREFIX + cmpxchg8b (%esi) + jne 1b + +2: + movl %ebx, %eax + movl %ecx, %edx + RESTORE ebx + ret + CFI_ENDPROC +ENDPROC(atomic64_dec_if_positive_cx8) + +ENTRY(atomic64_add_unless_cx8) + CFI_STARTPROC + SAVE ebp + SAVE ebx +/* these just push these two parameters on the stack */ + SAVE edi + SAVE esi + + movl %ecx, %ebp + movl %eax, %esi + movl %edx, %edi + + read64 %ebp +1: + cmpl %eax, 0(%esp) + je 4f +2: + movl %eax, %ebx + movl %edx, %ecx + addl %esi, %ebx + adcl %edi, %ecx + LOCK_PREFIX + cmpxchg8b (%ebp) + jne 1b + + movl $1, %eax +3: + addl $8, %esp + CFI_ADJUST_CFA_OFFSET -8 + RESTORE ebx + RESTORE ebp + ret +4: + cmpl %edx, 4(%esp) + jne 2b + xorl %eax, %eax + jmp 3b + CFI_ENDPROC +ENDPROC(atomic64_add_unless_cx8) + +ENTRY(atomic64_inc_not_zero_cx8) + CFI_STARTPROC + SAVE ebx + + read64 %esi +1: + testl %eax, %eax + je 4f +2: + movl %eax, %ebx + movl %edx, %ecx + addl $1, %ebx + adcl $0, %ecx + LOCK_PREFIX + cmpxchg8b (%esi) + jne 1b + + movl $1, %eax +3: + RESTORE ebx + ret +4: + testl %edx, %edx + jne 2b + jmp 3b + CFI_ENDPROC +ENDPROC(atomic64_inc_not_zero_cx8) -- 1.7.4.2 |
From: Richard W. <ri...@no...> - 2011-04-20 11:36:14
|
From: Randy Dunlap <ran...@or...> Make HoneyPot ProcFS depend on CONFIG_PROC_FS so that it will build. Recommended by Christoph Hellwig. Fixes kernel bugzilla #33692: https://bugzilla.kernel.org/show_bug.cgi?id=33692 Reported-by: Simon Danner <dan...@gm...> Signed-off-by: Randy Dunlap <ran...@or...> Cc: Jeff Dike <jd...@ad...> Cc: use...@li... Cc: Christoph Hellwig <hc...@in...> Signed-off-by: Richard Weinberger <ri...@no...> --- arch/um/Kconfig.um | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/arch/um/Kconfig.um b/arch/um/Kconfig.um index 90a438a..b5e675e 100644 --- a/arch/um/Kconfig.um +++ b/arch/um/Kconfig.um @@ -47,7 +47,7 @@ config HOSTFS config HPPFS tristate "HoneyPot ProcFS (EXPERIMENTAL)" - depends on EXPERIMENTAL + depends on EXPERIMENTAL && PROC_FS help hppfs (HoneyPot ProcFS) is a filesystem which allows UML /proc entries to be overridden, removed, or fabricated from the host. -- 1.7.4.2 |
From: Greg KH <gr...@kr...> - 2011-04-20 14:26:21
|
On Wed, Apr 20, 2011 at 01:34:25PM +0200, Richard Weinberger wrote: > This adds support for 64 bit atomic operations on > 32 bit UML systems. > XFS needs them since 2.6.38. > > Reported-by: Martin Walch <wal...@we...> > Tested-by: Martin Walch <wal...@we...> > Cc: Martin Walch <wal...@we...> > Cc: <st...@ke...> # .38.x 084189a: um: disable CONFIG_CMPXCHG_LOCAL Why is this a stable patch? confused, greg k-h |
From: Richard W. <ri...@no...> - 2011-04-20 14:29:46
|
Am Mittwoch 20 April 2011, 16:27:02 schrieb Greg KH: > On Wed, Apr 20, 2011 at 01:34:25PM +0200, Richard Weinberger wrote: > > This adds support for 64 bit atomic operations on > > 32 bit UML systems. > > XFS needs them since 2.6.38. > > > > Reported-by: Martin Walch <wal...@we...> > > Tested-by: Martin Walch <wal...@we...> > > Cc: Martin Walch <wal...@we...> > > Cc: <st...@ke...> # .38.x 084189a: um: disable CONFIG_CMPXCHG_LOCAL > > Why is this a stable patch? Because it fixes a build error in 2.6.38. See: https://bugzilla.kernel.org/show_bug.cgi?id=32812 Thanks, //richard > confused, > > greg k-h |
From: Greg KH <gr...@kr...> - 2011-04-20 14:34:08
|
On Wed, Apr 20, 2011 at 04:29:23PM +0200, Richard Weinberger wrote: > Am Mittwoch 20 April 2011, 16:27:02 schrieb Greg KH: > > On Wed, Apr 20, 2011 at 01:34:25PM +0200, Richard Weinberger wrote: > > > This adds support for 64 bit atomic operations on > > > 32 bit UML systems. > > > XFS needs them since 2.6.38. > > > > > > Reported-by: Martin Walch <wal...@we...> > > > Tested-by: Martin Walch <wal...@we...> > > > Cc: Martin Walch <wal...@we...> > > > Cc: <st...@ke...> # .38.x 084189a: um: disable CONFIG_CMPXCHG_LOCAL > > > > Why is this a stable patch? > > Because it fixes a build error in 2.6.38. > See: https://bugzilla.kernel.org/show_bug.cgi?id=32812 Then why not put that in the changelog entry in the first place? thanks, greg "please save me time" k-h |
From: Richard W. <ri...@no...> - 2011-04-20 14:36:25
|
Am Mittwoch 20 April 2011, 16:34:08 schrieb Greg KH: > On Wed, Apr 20, 2011 at 04:29:23PM +0200, Richard Weinberger wrote: > > Am Mittwoch 20 April 2011, 16:27:02 schrieb Greg KH: > > > On Wed, Apr 20, 2011 at 01:34:25PM +0200, Richard Weinberger wrote: > > > > This adds support for 64 bit atomic operations on > > > > 32 bit UML systems. > > > > XFS needs them since 2.6.38. > > > > > > > > Reported-by: Martin Walch <wal...@we...> > > > > Tested-by: Martin Walch <wal...@we...> > > > > Cc: Martin Walch <wal...@we...> > > > > Cc: <st...@ke...> # .38.x 084189a: um: disable > > > > CONFIG_CMPXCHG_LOCAL > > > > > > Why is this a stable patch? > > > > Because it fixes a build error in 2.6.38. > > See: https://bugzilla.kernel.org/show_bug.cgi?id=32812 > > Then why not put that in the changelog entry in the first place? Sorry, will do better next time! Thanks, //richard > thanks, > > greg "please save me time" k-h |
From: Kirill A. S. <ki...@sh...> - 2011-04-22 00:28:23
|
On Sat, Apr 16, 2011 at 01:03:13AM +0200, Richard Weinberger wrote: > In some cases gcc-4.6 will optimize away current_thread_info(). > To prevent gcc from doing so the stack address has to be obtained > via inline asm. > > LKML-Reference: http://marc.info/?i=201...@no... > > Signed-off-by: Richard Weinberger <ri...@no...> Acked-by: Kirill A. Shutemov <ki...@sh...> Also reproducible with gcc version 4.5.2 (Ubuntu/Linaro 4.5.2-8ubuntu4). > --- > arch/um/include/asm/thread_info.h | 5 ++++- > 1 files changed, 4 insertions(+), 1 deletions(-) > > diff --git a/arch/um/include/asm/thread_info.h b/arch/um/include/asm/thread_info.h > index e2cf786..5bd1bad 100644 > --- a/arch/um/include/asm/thread_info.h > +++ b/arch/um/include/asm/thread_info.h > @@ -49,7 +49,10 @@ static inline struct thread_info *current_thread_info(void) > { > struct thread_info *ti; > unsigned long mask = THREAD_SIZE - 1; > - ti = (struct thread_info *) (((unsigned long) &ti) & ~mask); > + void *p; > + > + asm volatile ("" : "=r" (p) : "0" (&ti)); > + ti = (struct thread_info *) (((unsigned long)p) & ~mask); > return ti; > } > > -- > 1.6.6.1 > > -- > To unsubscribe from this list: send the line "unsubscribe linux-kernel" in > the body of a message to maj...@vg... > More majordomo info at http://vger.kernel.org/majordomo-info.html > Please read the FAQ at http://www.tux.org/lkml/ -- Kirill A. Shutemov |
From: Richard W. <ri...@no...> - 2011-04-22 09:59:14
|
Am Freitag 22 April 2011, 02:10:50 schrieb Kirill A. Shutemov: > Also reproducible with gcc version 4.5.2 (Ubuntu/Linaro 4.5.2-8ubuntu4). Interesting. Using gcc 4.5.1 it's not reproducible. So I've to rewrite the commit message. Thanks, //richard |