10 Jan, 2012

1 commit


26 Jan, 2010

1 commit

  • The old ctrl in/out routines are non-portable and unsuitable for
    cross-platform use. While drivers/sh has already been sanitized, there
    is still quite a lot of code that is not. This converts the arch/sh/ bits
    over, which permits us to flag the routines as deprecated whilst still
    building with -Werror for the architecture code, and to ensure that
    future users are not added.

    Signed-off-by: Paul Mundt

    Paul Mundt
     

13 Jan, 2010

1 commit

  • This follows the x86 xstate changes and implements a task_xstate slab
    cache that is dynamically sized to match one of hard FP/soft FP/FPU-less.

    This also tidies up and consolidates some of the SH-2A/SH-4 FPU
    fragmentation. Now fpu state restorers are commonly defined, with the
    init_fpu()/fpu_init() mess reworked to follow the x86 convention.
    The fpu_init() register initialization has been replaced by xstate setup
    followed by writing out to hardware via the standard restore path.

    As init_fpu() now performs a slab allocation a secondary lighterweight
    restorer is also introduced for the context switch.

    In the future the DSP state will be rolled in here, too.

    More work remains for math emulation and the SH-5 FPU, which presently
    uses its own special (UP-only) interfaces.

    Signed-off-by: Paul Mundt

    Paul Mundt
     

14 Oct, 2009

3 commits


16 Sep, 2009

1 commit


02 Sep, 2009

1 commit

  • Add a keyctl to install a process's session keyring onto its parent. This
    replaces the parent's session keyring. Because the COW credential code does
    not permit one process to change another process's credentials directly, the
    change is deferred until userspace next starts executing again. Normally this
    will be after a wait*() syscall.

    To support this, three new security hooks have been provided:
    cred_alloc_blank() to allocate unset security creds, cred_transfer() to fill in
    the blank security creds and key_session_to_parent() - which asks the LSM if
    the process may replace its parent's session keyring.

    The replacement may only happen if the process has the same ownership details
    as its parent, and the process has LINK permission on the session keyring, and
    the session keyring is owned by the process, and the LSM permits it.

    Note that this requires alteration to each architecture's notify_resume path.
    This has been done for all arches barring blackfin, m68k* and xtensa, all of
    which need assembly alteration to support TIF_NOTIFY_RESUME. This allows the
    replacement to be performed at the point the parent process resumes userspace
    execution.

    This allows the userspace AFS pioctl emulation to fully emulate newpag() and
    the VIOCSETTOK and VIOCSETTOK2 pioctls, all of which require the ability to
    alter the parent process's PAG membership. However, since kAFS doesn't use
    PAGs per se, but rather dumps the keys into the session keyring, the session
    keyring of the parent must be replaced if, for example, VIOCSETTOK is passed
    the newpag flag.

    This can be tested with the following program:

    #include
    #include
    #include

    #define KEYCTL_SESSION_TO_PARENT 18

    #define OSERROR(X, S) do { if ((long)(X) == -1) { perror(S); exit(1); } } while(0)

    int main(int argc, char **argv)
    {
    key_serial_t keyring, key;
    long ret;

    keyring = keyctl_join_session_keyring(argv[1]);
    OSERROR(keyring, "keyctl_join_session_keyring");

    key = add_key("user", "a", "b", 1, keyring);
    OSERROR(key, "add_key");

    ret = keyctl(KEYCTL_SESSION_TO_PARENT);
    OSERROR(ret, "KEYCTL_SESSION_TO_PARENT");

    return 0;
    }

    Compiled and linked with -lkeyutils, you should see something like:

    [dhowells@andromeda ~]$ keyctl show
    Session Keyring
    -3 --alswrv 4043 4043 keyring: _ses
    355907932 --alswrv 4043 -1 \_ keyring: _uid.4043
    [dhowells@andromeda ~]$ /tmp/newpag
    [dhowells@andromeda ~]$ keyctl show
    Session Keyring
    -3 --alswrv 4043 4043 keyring: _ses
    1055658746 --alswrv 4043 4043 \_ user: a
    [dhowells@andromeda ~]$ /tmp/newpag hello
    [dhowells@andromeda ~]$ keyctl show
    Session Keyring
    -3 --alswrv 4043 4043 keyring: hello
    340417692 --alswrv 4043 4043 \_ user: a

    Where the test program creates a new session keyring, sticks a user key named
    'a' into it and then installs it on its parent.

    Signed-off-by: David Howells
    Signed-off-by: James Morris

    David Howells
     

24 Aug, 2009

1 commit

  • GCC does not issue unwind information for function epilogues.
    Unfortunately we can catch a signal during an epilogue. The signal
    handler writes the current context and signal return code onto the stack
    overwriting previous contents. During unwinding, libgcc can try to
    restore registers from the stack and restores corrupted ones. This can
    lead to segmentation, misaligned access and sigbus faults.

    For example, consider the following code:

    mov.l r12,@-r15
    mov.l r14,@-r15
    sts.l pr,@-r15
    mov r15,r14

    mov r14, r15
    lds.l @r15+, pr
    <<< SIGNAL HERE
    mov.l @r15+, r14
    mov.l @r15+, r12
    rts

    Unwind is aware that pr was pushed to stack in prolog, so tries to
    restore it. Unfortunately it restores the last word of the signal
    handler code placed on the stack by the kernel.

    This patch tries to avoid the problem by adding a guard region on the
    stack between where the function pushes data and where the signal handler
    pushes its return code. We probably don't see this problem often because
    exception handling unwinding in an epilogue only occurs due to a pthread
    cancel signal. Also the kernel signal stack handler alignment of 8 bytes
    could hide the occurance of this problem sometimes as the stack may not
    be trampled at a particular required word.

    This is not guaranteed to always work. It relies on a frame pointer
    existing for the function (so it can get the correct sp value) which is
    not always the case for the SH4.

    Modifications will also be made to libgcc for the case where there is no
    fp.

    Signed-off-by: Carl Shaw
    Signed-off-by: Paul Mundt

    Carl Shaw
     

18 Jun, 2009

1 commit

  • GCC 4.5.0 complains about the declaration of variables
    __kernel_sigreturn and __kernel_rt_sigreturn because they have type
    void. Correctly declare these symbols as functions to fix the
    following error,

    arch/sh/kernel/signal_32.c: In function 'setup_frame':
    arch/sh/kernel/signal_32.c:368:14: error: taking address of expression of type 'void'
    arch/sh/kernel/signal_32.c: In function 'setup_rt_frame':
    arch/sh/kernel/signal_32.c:452:14: error: taking address of expression of type 'void'
    make[1]: *** [arch/sh/kernel/signal_32.o] Error 1
    make: *** [arch/sh/kernel] Error 2

    Signed-off-by: Matt Fleming
    Signed-off-by: Paul Mundt

    Matt Fleming
     

29 Jan, 2009

1 commit

  • The T-bit manipulation for syscall error checking had the side effect of
    spuriously returning ERESTART* errno values over EINTR. So, we simplify
    the error checking a bit and leave the T-bit alone.

    Reported-by: Kaz Kojima
    Signed-off-by: Paul Mundt

    Paul Mundt
     

22 Dec, 2008

1 commit


24 Sep, 2008

1 commit


12 Sep, 2008

1 commit


08 Sep, 2008

1 commit


02 Aug, 2008

1 commit

  • This follows the changes in commits:

    7d6d637dac2050f30a1b57b0a3dc5de4a10616ba
    4f72c4279eab1e5f3ed1ac4e55d4527617582392

    on powerpc. Adding in TIF_NOTIFY_RESUME, and cleaning up the syscall
    tracing to be more generic. This is an incremental step to turning
    on tracehook, as well as unifying more of the ptrace and signal code
    across the 32/64 split.

    Signed-off-by: Paul Mundt

    Paul Mundt
     

28 Jul, 2008

3 commits

  • The current kernel behaviour is to reenable interrupts unconditionally
    when taking a page fault. This patch changes this to only enable them
    if interrupts were previously enabled.

    It also fixes a problem seen with this fix in place: the kernel previously
    flushed the vsyscall page when handling a signal, which is not only
    unncessary, but caused a possible sleep with interrupts disabled.

    Signed-off-by: Stuart Menefy
    Signed-off-by: Paul Mundt

    Stuart Menefy
     
  • Add implementation of flush_icache_range() suitable for signal handler
    and kprobes. Remove flush_cache_sigtramp() and change signal.c to use
    flush_icache_range().

    Signed-off-by: Chris Smith
    Signed-off-by: Paul Mundt

    Chris Smith
     
  • This adds initial support for ELF FDPIC on MMU-less SH, as per version
    0.2 of the ABI definition at:

    http://www.codesourcery.com/public/docs/sh-fdpic/sh-fdpic-abi.txt

    Signed-off-by: Paul Mundt

    Paul Mundt
     

26 Mar, 2008

1 commit

  • Presently with preempt enabled there's the possibility to be preempted
    after the TIF_USEDFPU test and the register save, leading to bogus
    state post-__switch_to(). Use an explicit preempt_disable()/enable()
    pair around unlazy_fpu()/clear_fpu() to avoid this. Follows the x86
    change.

    Reported-by: Takuo Koguchi
    Signed-off-by: Paul Mundt

    Paul Mundt
     

28 Jan, 2008

2 commits