03 Apr, 2018

1 commit

  • compat_sys_*() functions are no longer called from within the kernel on
    x86 except from the system call table. Linking the system call does not
    require compat_sys_*() function prototypes at least on x86. Therefore,
    generate compat_sys_*() prototypes on-the-fly within the
    COMPAT_SYSCALL_DEFINEx() macro, and remove x86-specific prototypes from
    various header files.

    Suggested-by: Andy Lutomirski
    Cc: Arnd Bergmann
    Cc: David S. Miller
    Cc: netdev@vger.kernel.org
    Cc: Thomas Gleixner
    Cc: Andi Kleen
    Cc: Ingo Molnar
    Cc: Andrew Morton
    Cc: Al Viro
    Cc: x86@kernel.org
    Signed-off-by: Dominik Brodowski

    Dominik Brodowski
     

02 Nov, 2017

1 commit

  • Many source files in the tree are missing licensing information, which
    makes it harder for compliance tools to determine the correct license.

    By default all files without license information are under the default
    license of the kernel, which is GPL version 2.

    Update the files which contain no license information with the 'GPL-2.0'
    SPDX license identifier. The SPDX identifier is a legally binding
    shorthand, which can be used instead of the full boiler plate text.

    This patch is based on work done by Thomas Gleixner and Kate Stewart and
    Philippe Ombredanne.

    How this work was done:

    Patches were generated and checked against linux-4.14-rc6 for a subset of
    the use cases:
    - file had no licensing information it it.
    - file was a */uapi/* one with no licensing information in it,
    - file was a */uapi/* one with existing licensing information,

    Further patches will be generated in subsequent months to fix up cases
    where non-standard license headers were used, and references to license
    had to be inferred by heuristics based on keywords.

    The analysis to determine which SPDX License Identifier to be applied to
    a file was done in a spreadsheet of side by side results from of the
    output of two independent scanners (ScanCode & Windriver) producing SPDX
    tag:value files created by Philippe Ombredanne. Philippe prepared the
    base worksheet, and did an initial spot review of a few 1000 files.

    The 4.13 kernel was the starting point of the analysis with 60,537 files
    assessed. Kate Stewart did a file by file comparison of the scanner
    results in the spreadsheet to determine which SPDX license identifier(s)
    to be applied to the file. She confirmed any determination that was not
    immediately clear with lawyers working with the Linux Foundation.

    Criteria used to select files for SPDX license identifier tagging was:
    - Files considered eligible had to be source code files.
    - Make and config files were included as candidates if they contained >5
    lines of source
    - File already had some variant of a license header in it (even if
    Reviewed-by: Philippe Ombredanne
    Reviewed-by: Thomas Gleixner
    Signed-off-by: Greg Kroah-Hartman

    Greg Kroah-Hartman
     

26 Sep, 2017

1 commit

  • The x86 FPU code used to have a complex state machine where both the FPU
    registers and the FPU state context could be 'active' (or inactive)
    independently of each other - which enabled features like lazy FPU restore.

    Much of this complexity is gone in the current code: now we basically can
    have FPU-less tasks (kernel threads) that don't use (and save/restore) FPU
    state at all, plus full FPU users that save/restore directly with no laziness
    whatsoever.

    But the fpu::fpstate_active still carries bits of the old complexity - meanwhile
    this flag has become a simple flag that shows whether the FPU context saving
    area in the thread struct is initialized and used, or not.

    Rename it to fpu::initialized to express this simplicity in the name as well.

    Cc: Andrew Morton
    Cc: Andy Lutomirski
    Cc: Borislav Petkov
    Cc: Dave Hansen
    Cc: Eric Biggers
    Cc: Fenghua Yu
    Cc: Linus Torvalds
    Cc: Oleg Nesterov
    Cc: Peter Zijlstra
    Cc: Rik van Riel
    Cc: Thomas Gleixner
    Cc: Yu-cheng Yu
    Link: http://lkml.kernel.org/r/20170923130016.21448-30-mingo@kernel.org
    Signed-off-by: Ingo Molnar

    Ingo Molnar
     

30 Jul, 2017

1 commit


02 Mar, 2017

1 commit


25 Dec, 2016

1 commit


15 Sep, 2016

1 commit

  • Introduce new flags that defines which ABI to use on creating sigframe.
    Those flags kernel will set according to sigaction syscall ABI,
    which set handler for the signal being delivered.

    So that will drop the dependency on TIF_IA32/TIF_X32 flags on signal deliver.
    Those flags will be used only under CONFIG_COMPAT.

    Similar way ARM uses sa_flags to differ in which mode deliver signal
    for 26-bit applications (look at SA_THIRYTWO).

    Signed-off-by: Dmitry Safonov
    Reviewed-by: Andy Lutomirski
    Cc: 0x7f454c46@gmail.com
    Cc: oleg@redhat.com
    Cc: linux-mm@kvack.org
    Cc: gorcunov@openvz.org
    Cc: xemul@virtuozzo.com
    Link: http://lkml.kernel.org/r/20160905133308.28234-7-dsafonov@virtuozzo.com
    Signed-off-by: Thomas Gleixner

    Dmitry Safonov
     

13 Apr, 2016

1 commit


04 Nov, 2015

1 commit

  • Pull x86 sigcontext header cleanups from Ingo Molnar:
    "This series reorganizes and cleans up various aspects of the main
    sigcontext UAPI headers, such as unifying the data structures and
    updating/adding lots of comments to explain all the ABI details and
    quirks. The headers can now also be built in user-space standalone"

    * 'x86-headers-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip:
    x86/headers: Clean up too long lines
    x86/headers: Remove references on the kernel side
    x86/headers: Remove direct sigcontext32.h uses
    x86/headers: Convert sigcontext_ia32 uses to sigcontext_32
    x86/headers: Unify 'struct sigcontext_ia32' and 'struct sigcontext_32'
    x86/headers: Make sigcontext pointers bit independent
    x86/headers: Move the 'struct sigcontext' definitions into the UAPI header
    x86/headers: Clean up the kernel's struct sigcontext types to be ABI-clean
    x86/headers: Convert uses of _fpstate_ia32 to _fpstate_32
    x86/headers: Unify 'struct _fpstate_ia32' and i386 struct _fpstate
    x86/headers: Unify register type definitions between 32-bit compat and i386
    x86/headers: Use ABI types consistently in sigcontext*.h
    x86/headers: Separate out legacy user-space structure definitions
    x86/headers: Clean up and better document uapi/asm/sigcontext.h
    x86/headers: Clean up uapi/asm/sigcontext32.h
    x86/headers: Fix (old) header file dependency bug in uapi/asm/sigcontext32.h

    Linus Torvalds
     

07 Oct, 2015

1 commit

  • 32-bit userspace will now always see the same vDSO, which is
    exactly what used to be the int80 vDSO. Subsequent patches will
    clean it up and make it support SYSENTER and SYSCALL using
    alternatives.

    Signed-off-by: Andy Lutomirski
    Cc: Andy Lutomirski
    Cc: Borislav Petkov
    Cc: Brian Gerst
    Cc: Denys Vlasenko
    Cc: H. Peter Anvin
    Cc: Linus Torvalds
    Cc: Peter Zijlstra
    Cc: Thomas Gleixner
    Cc: linux-kernel@vger.kernel.org
    Link: http://lkml.kernel.org/r/e7e6b3526fa442502e6125fe69486aab50813c32.1444091584.git.luto@kernel.org
    Signed-off-by: Ingo Molnar

    Andy Lutomirski
     

08 Sep, 2015

4 commits

  • Now that all type definitions are in the UAPI header, include it
    directly, instead of through .

    [ We still keep asm/sigcontext.h, so that uapi/asm/sigcontext32.h
    can include . ]

    Acked-by: Mikko Rapeli
    Cc: Andy Lutomirski
    Cc: Borislav Petkov
    Cc: Brian Gerst
    Cc: Denys Vlasenko
    Cc: H. Peter Anvin
    Cc: Linus Torvalds
    Cc: Oleg Nesterov
    Cc: Peter Zijlstra
    Cc: Thomas Gleixner
    Cc: linux-kernel@vger.kernel.org
    Link: http://lkml.kernel.org/r/1441438363-9999-16-git-send-email-mingo@kernel.org
    Signed-off-by: Ingo Molnar

    Ingo Molnar
     
  • Now that all sigcontext types are defined in asm/sigcontext.h,
    remove the various sigcontext32.h uses in the kernel.

    We still keep the header itself, which includes sigcontext.h, in
    case user-space relies on it.

    Acked-by: Mikko Rapeli
    Cc: Andy Lutomirski
    Cc: Borislav Petkov
    Cc: Brian Gerst
    Cc: Denys Vlasenko
    Cc: H. Peter Anvin
    Cc: Linus Torvalds
    Cc: Oleg Nesterov
    Cc: Peter Zijlstra
    Cc: Thomas Gleixner
    Cc: linux-kernel@vger.kernel.org
    Link: http://lkml.kernel.org/r/1441438363-9999-15-git-send-email-mingo@kernel.org
    Signed-off-by: Ingo Molnar

    Ingo Molnar
     
  • Use the new name in kernel code, and move the old name to the
    user-space-only legacy section of the UAPI header.

    Acked-by: Mikko Rapeli
    Cc: Andy Lutomirski
    Cc: Borislav Petkov
    Cc: Brian Gerst
    Cc: Denys Vlasenko
    Cc: H. Peter Anvin
    Cc: Linus Torvalds
    Cc: Oleg Nesterov
    Cc: Peter Zijlstra
    Cc: Thomas Gleixner
    Cc: linux-kernel@vger.kernel.org
    Link: http://lkml.kernel.org/r/1441438363-9999-14-git-send-email-mingo@kernel.org
    Signed-off-by: Ingo Molnar

    Ingo Molnar
     
  • Remove uses of _fpstate_ia32 from the kernel, and move the
    legacy _fpstate_ia32 definition to the user-space only portion
    of the header.

    Acked-by: Mikko Rapeli
    Cc: Andy Lutomirski
    Cc: Borislav Petkov
    Cc: Brian Gerst
    Cc: Denys Vlasenko
    Cc: H. Peter Anvin
    Cc: Linus Torvalds
    Cc: Oleg Nesterov
    Cc: Peter Zijlstra
    Cc: Thomas Gleixner
    Cc: linux-kernel@vger.kernel.org
    Link: http://lkml.kernel.org/r/1441438363-9999-9-git-send-email-mingo@kernel.org
    Signed-off-by: Ingo Molnar

    Ingo Molnar
     

06 Jul, 2015

1 commit

  • copy_siginfo_to_user32() and copy_siginfo_from_user32() are used
    by both the 32-bit compat and x32 ABIs. Move them to
    signal_compat.c.

    Signed-off-by: Brian Gerst
    Cc: Andy Lutomirski
    Cc: Borislav Petkov
    Cc: Denys Vlasenko
    Cc: H. Peter Anvin
    Cc: Linus Torvalds
    Cc: Peter Zijlstra
    Cc: Thomas Gleixner
    Link: http://lkml.kernel.org/r/1434974121-32575-2-git-send-email-brgerst@gmail.com
    Signed-off-by: Ingo Molnar

    Brian Gerst
     

19 May, 2015

8 commits

  • Most of the FPU does not use them, so split it out and include
    them in signal.c and ia32_signal.c

    Also fix header file dependency assumption in fpu/core.c.

    Cc: Andy Lutomirski
    Cc: Borislav Petkov
    Cc: Dave Hansen
    Cc: Fenghua Yu
    Cc: H. Peter Anvin
    Cc: Linus Torvalds
    Cc: Oleg Nesterov
    Cc: Peter Zijlstra
    Cc: Thomas Gleixner
    Signed-off-by: Ingo Molnar

    Ingo Molnar
     
  • Consolidate more signal frame related functions:

    text data bss dec filename
    14108070 2575280 1634304 18317654 vmlinux.before
    14107944 2575344 1634304 18317592 vmlinux.after

    Also, while moving it, rename alloc_mathframe() to fpu__alloc_mathframe().

    Cc: Andy Lutomirski
    Cc: Borislav Petkov
    Cc: Dave Hansen
    Cc: Fenghua Yu
    Cc: H. Peter Anvin
    Cc: Linus Torvalds
    Cc: Oleg Nesterov
    Cc: Peter Zijlstra
    Cc: Thomas Gleixner
    Signed-off-by: Ingo Molnar

    Ingo Molnar
     
  • restore_xstate_sig() is a misnomer: it's not limited to 'xstate' at all,
    it is the high level 'restore FPU state from a signal frame' function
    that works with all legacy FPU formats as well.

    Rename it (and its helper) accordingly, and also move it to the
    fpu__*() namespace.

    Cc: Andy Lutomirski
    Cc: Borislav Petkov
    Cc: Dave Hansen
    Cc: Fenghua Yu
    Cc: H. Peter Anvin
    Cc: Linus Torvalds
    Cc: Oleg Nesterov
    Cc: Peter Zijlstra
    Cc: Thomas Gleixner
    Signed-off-by: Ingo Molnar

    Ingo Molnar
     
  • Standardize the naming of save_xstate_sig() by renaming it to
    copy_fpstate_to_sigframe(): this tells us at a glance that
    the function copies an FPU fpstate to a signal frame.

    This naming also follows the naming of copy_fpregs_to_fpstate().

    Don't put 'xstate' into the name: since this is a generic name,
    it's expected that the function is able to handle xstate frames
    as well, beyond legacy frames.

    xstate used to be the odd case in the x86 FPU code - now it's the
    common case.

    Cc: Andy Lutomirski
    Cc: Borislav Petkov
    Cc: Dave Hansen
    Cc: Fenghua Yu
    Cc: H. Peter Anvin
    Cc: Linus Torvalds
    Cc: Oleg Nesterov
    Cc: Peter Zijlstra
    Cc: Thomas Gleixner
    Signed-off-by: Ingo Molnar

    Ingo Molnar
     
  • This unifies all the FPU related header files under a unified, hiearchical
    naming scheme:

    - asm/fpu/types.h: FPU related data types, needed for 'struct task_struct',
    widely included in almost all kernel code, and hence kept
    as small as possible.

    - asm/fpu/api.h: FPU related 'public' methods exported to other subsystems.

    - asm/fpu/internal.h: FPU subsystem internal methods

    - asm/fpu/xsave.h: XSAVE support internal methods

    (Also standardize the header guard in asm/fpu/internal.h.)

    Reviewed-by: Borislav Petkov
    Cc: Andy Lutomirski
    Cc: Dave Hansen
    Cc: Fenghua Yu
    Cc: H. Peter Anvin
    Cc: Linus Torvalds
    Cc: Oleg Nesterov
    Cc: Peter Zijlstra
    Cc: Thomas Gleixner
    Signed-off-by: Ingo Molnar

    Ingo Molnar
     
  • Introduce a simple fpu->fpstate_active flag in the fpu context data structure
    and use that instead of PF_USED_MATH in task->flags.

    Testing for this flag byte should be slightly more efficient than
    testing a bit in a bitmask, but the main advantage is that most
    FPU functions can now be performed on a 'struct fpu' alone, they
    don't need access to 'struct task_struct' anymore.

    There's a slight linecount increase, mostly due to the 'fpu' local
    variables and due to extra comments. The local variables will go away
    once we move most of the FPU methods to pure 'struct fpu' parameters.

    Reviewed-by: Borislav Petkov
    Cc: Andy Lutomirski
    Cc: Dave Hansen
    Cc: Fenghua Yu
    Cc: H. Peter Anvin
    Cc: Linus Torvalds
    Cc: Oleg Nesterov
    Cc: Peter Zijlstra
    Cc: Thomas Gleixner
    Signed-off-by: Ingo Molnar

    Ingo Molnar
     
  • PF_USED_MATH is used directly, but also in a handful of helper inlines.

    To ease the elimination of PF_USED_MATH, convert all inline helpers
    to open-coded PF_USED_MATH usage.

    Reviewed-by: Borislav Petkov
    Cc: Andy Lutomirski
    Cc: Dave Hansen
    Cc: Fenghua Yu
    Cc: H. Peter Anvin
    Cc: Linus Torvalds
    Cc: Oleg Nesterov
    Cc: Peter Zijlstra
    Cc: Thomas Gleixner
    Signed-off-by: Ingo Molnar

    Ingo Molnar
     
  • Fix a minor header file dependency bug in asm/fpu-internal.h: it
    relies on i387.h but does not include it. All users of fpu-internal.h
    included it explicitly.

    Also remove unnecessary includes, to reduce compilation time.

    This also makes it easier to use it as a standalone header file
    for FPU internals, such as an upcoming C module in arch/x86/kernel/fpu/.

    Reviewed-by: Borislav Petkov
    Cc: Andy Lutomirski
    Cc: Dave Hansen
    Cc: Fenghua Yu
    Cc: H. Peter Anvin
    Cc: Linus Torvalds
    Cc: Oleg Nesterov
    Cc: Peter Zijlstra
    Cc: Thomas Gleixner
    Signed-off-by: Ingo Molnar

    Ingo Molnar
     

06 Apr, 2015

1 commit

  • The 'pax' argument is unnecesary. Instead, store the RAX value
    directly in regs.

    This pattern goes all the way back to 2.1.106pre1, when restore_sigcontext()
    was changed to return an error code instead of EAX directly:

    https://git.kernel.org/cgit/linux/kernel/git/history/history.git/diff/arch/i386/kernel/signal.c?id=9a8f8b7ca3f319bd668298d447bdf32730e51174

    In 2007 sigaltstack syscall support was added, where the return
    value of restore_sigcontext() was changed to carry the memory-copying
    failure code.

    But instead of putting 'ax' into regs->ax directly, it was carried
    in via a pointer and then returned, where the generic syscall return
    code copied it to regs->ax.

    So there was never any deeper reason for this suboptimal pattern, it
    was simply never noticed after being introduced.

    Signed-off-by: Brian Gerst
    Cc: Andy Lutomirski
    Cc: Borislav Petkov
    Cc: Denys Vlasenko
    Cc: H. Peter Anvin
    Cc: Linus Torvalds
    Cc: Thomas Gleixner
    Link: http://lkml.kernel.org/r/1428152303-17154-1-git-send-email-brgerst@gmail.com
    Signed-off-by: Ingo Molnar

    Brian Gerst
     

23 Mar, 2015

1 commit

  • Both the execve() and sigreturn() family of syscalls have the
    ability to change registers in ways that may not be compatabile
    with the syscall path they were called from.

    In particular, SYSRET and SYSEXIT can't handle non-default %cs and %ss,
    and some bits in eflags.

    These syscalls have stubs that are hardcoded to jump to the IRET path,
    and not return to the original syscall path.

    The following commit:

    76f5df43cab5e76 ("Always allocate a complete "struct pt_regs" on the kernel stack")

    recently changed this for some 32-bit compat syscalls, but introduced a bug where
    execve from a 32-bit program to a 64-bit program would fail because it still returned
    via SYSRETL. This caused Wine to fail when built for both 32-bit and 64-bit.

    This patch sets TIF_NOTIFY_RESUME for execve() and sigreturn() so
    that the IRET path is always taken on exit to userspace.

    Signed-off-by: Brian Gerst
    Cc: Andy Lutomirski
    Cc: Borislav Petkov
    Cc: Denys Vlasenko
    Cc: H. Peter Anvin
    Cc: Linus Torvalds
    Link: http://lkml.kernel.org/r/1426978461-32089-1-git-send-email-brgerst@gmail.com
    [ Improved the changelog and comments. ]
    Signed-off-by: Ingo Molnar

    Brian Gerst
     

13 Feb, 2015

1 commit

  • If an attacker can cause a controlled kernel stack overflow, overwriting
    the restart block is a very juicy exploit target. This is because the
    restart_block is held in the same memory allocation as the kernel stack.

    Moving the restart block to struct task_struct prevents this exploit by
    making the restart_block harder to locate.

    Note that there are other fields in thread_info that are also easy
    targets, at least on some architectures.

    It's also a decent simplification, since the restart code is more or less
    identical on all architectures.

    [james.hogan@imgtec.com: metag: align thread_info::supervisor_stack]
    Signed-off-by: Andy Lutomirski
    Cc: Thomas Gleixner
    Cc: Al Viro
    Cc: "H. Peter Anvin"
    Cc: Ingo Molnar
    Cc: Kees Cook
    Cc: David Miller
    Acked-by: Richard Weinberger
    Cc: Richard Henderson
    Cc: Ivan Kokshaysky
    Cc: Matt Turner
    Cc: Vineet Gupta
    Cc: Russell King
    Cc: Catalin Marinas
    Cc: Will Deacon
    Cc: Haavard Skinnemoen
    Cc: Hans-Christian Egtvedt
    Cc: Steven Miao
    Cc: Mark Salter
    Cc: Aurelien Jacquiot
    Cc: Mikael Starvik
    Cc: Jesper Nilsson
    Cc: David Howells
    Cc: Richard Kuo
    Cc: "Luck, Tony"
    Cc: Geert Uytterhoeven
    Cc: Michal Simek
    Cc: Ralf Baechle
    Cc: Jonas Bonn
    Cc: "James E.J. Bottomley"
    Cc: Helge Deller
    Cc: Benjamin Herrenschmidt
    Cc: Paul Mackerras
    Acked-by: Michael Ellerman (powerpc)
    Tested-by: Michael Ellerman (powerpc)
    Cc: Martin Schwidefsky
    Cc: Heiko Carstens
    Cc: Chen Liqin
    Cc: Lennox Wu
    Cc: Chris Metcalf
    Cc: Guan Xuetao
    Cc: Chris Zankel
    Cc: Max Filippov
    Cc: Oleg Nesterov
    Cc: Guenter Roeck
    Signed-off-by: James Hogan
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Andy Lutomirski
     

06 May, 2014

1 commit

  • Currently, vdso.so files are prepared and analyzed by a combination
    of objcopy, nm, some linker script tricks, and some simple ELF
    parsers in the kernel. Replace all of that with plain C code that
    runs at build time.

    All five vdso images now generate .c files that are compiled and
    linked in to the kernel image.

    This should cause only one userspace-visible change: the loaded vDSO
    images are stripped more heavily than they used to be. Everything
    outside the loadable segment is dropped. In particular, this causes
    the section table and section name strings to be missing. This
    should be fine: real dynamic loaders don't load or inspect these
    tables anyway. The result is roughly equivalent to eu-strip's
    --strip-sections option.

    The purpose of this change is to enable the vvar and hpet mappings
    to be moved to the page following the vDSO load segment. Currently,
    it is possible for the section table to extend into the page after
    the load segment, so, if we map it, it risks overlapping the vvar or
    hpet page. This happens whenever the load segment is just under a
    multiple of PAGE_SIZE.

    The only real subtlety here is that the old code had a C file with
    inline assembler that did 'call VDSO32_vsyscall' and a linker script
    that defined 'VDSO32_vsyscall = __kernel_vsyscall'. This most
    likely worked by accident: the linker script entry defines a symbol
    associated with an address as opposed to an alias for the real
    dynamic symbol __kernel_vsyscall. That caused ld to relocate the
    reference at link time instead of leaving an interposable dynamic
    relocation. Since the VDSO32_vsyscall hack is no longer needed, I
    now use 'call __kernel_vsyscall', and I added -Bsymbolic to make it
    work. vdso2c will generate an error and abort the build if the
    resulting image contains any dynamic relocations, so we won't
    silently generate bad vdso images.

    (Dynamic relocations are a problem because nothing will even attempt
    to relocate the vdso.)

    Signed-off-by: Andy Lutomirski
    Link: http://lkml.kernel.org/r/2c4fcf45524162a34d87fdda1eb046b2a5cecee7.1399317206.git.luto@amacapital.net
    Signed-off-by: H. Peter Anvin

    Andy Lutomirski
     

09 Nov, 2013

1 commit


02 Sep, 2013

1 commit

  • For performance reasons, when SMAP is in use, SMAP is left open for an
    entire put_user_try { ... } put_user_catch(); block, however, calling
    __put_user() in the middle of that block will close SMAP as the
    STAC..CLAC constructs intentionally do not nest.

    Furthermore, using __put_user() rather than put_user_ex() here is bad
    for performance.

    Thus, introduce new [compat_]save_altstack_ex() helpers that replace
    __[compat_]save_altstack() for x86, being currently the only
    architecture which supports put_user_try { ... } put_user_catch().

    Reported-by: H. Peter Anvin
    Signed-off-by: Al Viro
    Signed-off-by: H. Peter Anvin
    Cc: # v3.8+
    Link: http://lkml.kernel.org/n/tip-es5p6y64if71k8p5u08agv9n@git.kernel.org

    Al Viro
     

28 May, 2013

1 commit

  • While porting Vince's perf overflow tests I found perf event
    breakpoint overflow does not work properly.

    I found the x86 RF EFLAG bit not being set when returning
    from debug exception after triggering signal handler. Which
    is exactly what you get when you set perf breakpoint overflow
    SIGIO handler.

    This patch and the next two patches fix the underlying bugs.

    This patch adds the RF EFLAGS bit to be restored on return from
    signal from the original register context before the signal was
    entered.

    This will prevent the RF flag to disappear when returning
    from exception due to the signal handler being executed.

    Signed-off-by: Jiri Olsa
    Tested-by: Oleg Nesterov
    Reviewed-by: Frederic Weisbecker
    Originally-Reported-by: Vince Weaver
    Cc: H. Peter Anvin
    Cc: Andi Kleen
    Cc: Oleg Nesterov
    Cc: Arnaldo Carvalho de Melo
    Cc: Ingo Molnar
    Cc: Paul Mackerras
    Cc: Corey Ashford
    Cc: Frederic Weisbecker
    Cc: Vince Weaver
    Cc: Stephane Eranian
    Cc: Linus Torvalds
    Cc: Andrew Morton
    Cc: Peter Zijlstra
    Cc: Thomas Gleixner
    Signed-off-by: Peter Zijlstra
    Link: http://lkml.kernel.org/r/1367421944-19082-2-git-send-email-jolsa@redhat.com
    Signed-off-by: Ingo Molnar

    Jiri Olsa
     

14 Feb, 2013

1 commit


04 Feb, 2013

2 commits


20 Dec, 2012

2 commits


22 Sep, 2012

2 commits

  • Reason for merge:
    x86/fpu changed the structure of some of the code that x86/smap
    changes; mostly fpu-internal.h but also minor changes to the
    signal code.

    Signed-off-by: H. Peter Anvin

    Resolved Conflicts:
    arch/x86/ia32/ia32_signal.c
    arch/x86/include/asm/fpu-internal.h
    arch/x86/kernel/signal.c

    H. Peter Anvin
     
  • Signal handling contains a bunch of accesses to individual user space
    items, which causes an excessive number of STAC and CLAC
    instructions. Instead, let get/put_user_try ... get/put_user_catch()
    contain the STAC and CLAC instructions.

    This means that get/put_user_try no longer nests, and furthermore that
    it is no longer legal to use user space access functions other than
    __get/put_user_ex() inside those blocks. However, these macros are
    x86-specific anyway and are only used in the signal-handling paths; a
    simple reordering of moving the larger subroutine calls out of the
    try...catch blocks resolves that problem.

    Signed-off-by: H. Peter Anvin
    Link: http://lkml.kernel.org/r/1348256595-29119-12-git-send-email-hpa@linux.intel.com

    H. Peter Anvin
     

19 Sep, 2012

1 commit

  • Currently for x86 and x86_32 binaries, fpstate in the user sigframe is copied
    to/from the fpstate in the task struct.

    And in the case of signal delivery for x86_64 binaries, if the fpstate is live
    in the CPU registers, then the live state is copied directly to the user
    sigframe. Otherwise fpstate in the task struct is copied to the user sigframe.
    During restore, fpstate in the user sigframe is restored directly to the live
    CPU registers.

    Historically, different code paths led to different bugs. For example,
    x86_64 code path was not preemption safe till recently. Also there is lot
    of code duplication for support of new features like xsave etc.

    Unify signal handling code paths for x86 and x86_64 kernels.

    New strategy is as follows:

    Signal delivery: Both for 32/64-bit frames, align the core math frame area to
    64bytes as needed by xsave (this where the main fpu/extended state gets copied
    to and excludes the legacy compatibility fsave header for the 32-bit [f]xsave
    frames). If the state is live, copy the register state directly to the user
    frame. If not live, copy the state in the thread struct to the user frame. And
    for 32-bit [f]xsave frames, construct the fsave header separately before
    the actual [f]xsave area.

    Signal return: As the 32-bit frames with [f]xstate has an additional
    'fsave' header, copy everything back from the user sigframe to the
    fpstate in the task structure and reconstruct the fxstate from the 'fsave'
    header (Also user passed pointers may not be correctly aligned for
    any attempt to directly restore any partial state). At the next fpstate usage,
    everything will be restored to the live CPU registers.
    For all the 64-bit frames and the 32-bit fsave frame, restore the state from
    the user sigframe directly to the live CPU registers. 64-bit signals always
    restored the math frame directly, so we can expect the math frame pointer
    to be correctly aligned. For 32-bit fsave frames, there are no alignment
    requirements, so we can restore the state directly.

    "lat_sig catch" microbenchmark numbers (for x86, x86_64, x86_32 binaries) are
    with in the noise range with this change.

    Signed-off-by: Suresh Siddha
    Link: http://lkml.kernel.org/r/1343171129-2747-4-git-send-email-suresh.b.siddha@intel.com
    [ Merged in compilation fix ]
    Link: http://lkml.kernel.org/r/1344544736.8326.17.camel@sbsiddha-desk.sc.intel.com
    Signed-off-by: H. Peter Anvin

    Suresh Siddha
     

05 Sep, 2012

1 commit

  • Fix the following sparse warnings by adding appropriate __user
    casts and annotations:

    ia32_signal.c:165:38: warning: incorrect type in argument 1 (different address spaces)
    ia32_signal.c:165:38: expected struct sigaltstack const [noderef] [usertype] *
    ia32_signal.c:165:38: got struct sigaltstack *
    [...]

    Signed-off-by: Mathias Krause
    Cc: Oleg Nesterov
    Link: http://lkml.kernel.org/r/1346621506-30857-4-git-send-email-minipli@googlemail.com
    Signed-off-by: Ingo Molnar

    Mathias Krause
     

15 Jun, 2012

1 commit

  • Signal delivery compat path may not have the 'TS_COMPAT' flag (that
    flag indicates how we entered the kernel). So use
    test_thread_flag(TIF_IA32) instead of is_ia32_task(): one of the
    functions of TIF_IA32 is just what kind of signal frame we want.

    Signed-off-by: Suresh Siddha
    Link: http://lkml.kernel.org/r/1339722435.3475.57.camel@sbsiddha-desk.sc.intel.com
    Cc: stable@kernel.org # v3.4
    Signed-off-by: H. Peter Anvin

    Suresh Siddha