lkml.org 
[lkml]   [2014]   [Oct]   [3]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 3.10 036/143] xtensa: fix access to THREAD_RA/THREAD_SP/THREAD_DS
    Date
    3.10-stable review patch.  If anyone has any objections, please let me know.

    ------------------

    From: Max Filippov <jcmvbkbc@gmail.com>

    commit 52247123749cc3cbc30168b33ad8c69515c96d23 upstream.

    With SMP and a lot of debug options enabled task_struct::thread gets out
    of reach of s32i/l32i instructions with base pointing at task_struct,
    breaking build with the following messages:

    arch/xtensa/kernel/entry.S: Assembler messages:
    arch/xtensa/kernel/entry.S:1002: Error: operand 3 of 'l32i.n' has invalid value '1048'
    arch/xtensa/kernel/entry.S:1831: Error: operand 3 of 's32i.n' has invalid value '1040'
    arch/xtensa/kernel/entry.S:1832: Error: operand 3 of 's32i.n' has invalid value '1044'

    Change base to point to task_struct::thread in such cases.
    Don't use a10 in _switch_to to save/restore prev pointer as a2 is not
    clobbered.

    Signed-off-by: Max Filippov <jcmvbkbc@gmail.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

    ---
    arch/xtensa/include/asm/uaccess.h | 5 +++++
    arch/xtensa/kernel/entry.S | 12 ++++++++----
    2 files changed, 13 insertions(+), 4 deletions(-)

    --- a/arch/xtensa/include/asm/uaccess.h
    +++ b/arch/xtensa/include/asm/uaccess.h
    @@ -52,7 +52,12 @@
    */
    .macro get_fs ad, sp
    GET_CURRENT(\ad,\sp)
    +#if THREAD_CURRENT_DS > 1020
    + addi \ad, \ad, TASK_THREAD
    + l32i \ad, \ad, THREAD_CURRENT_DS - TASK_THREAD
    +#else
    l32i \ad, \ad, THREAD_CURRENT_DS
    +#endif
    .endm

    /*
    --- a/arch/xtensa/kernel/entry.S
    +++ b/arch/xtensa/kernel/entry.S
    @@ -1961,7 +1961,6 @@ ENTRY(_switch_to)

    entry a1, 16

    - mov a10, a2 # preserve 'prev' (a2)
    mov a11, a3 # and 'next' (a3)

    l32i a4, a2, TASK_THREAD_INFO
    @@ -1969,8 +1968,14 @@ ENTRY(_switch_to)

    save_xtregs_user a4 a6 a8 a9 a12 a13 THREAD_XTREGS_USER

    - s32i a0, a10, THREAD_RA # save return address
    - s32i a1, a10, THREAD_SP # save stack pointer
    +#if THREAD_RA > 1020 || THREAD_SP > 1020
    + addi a10, a2, TASK_THREAD
    + s32i a0, a10, THREAD_RA - TASK_THREAD # save return address
    + s32i a1, a10, THREAD_SP - TASK_THREAD # save stack pointer
    +#else
    + s32i a0, a2, THREAD_RA # save return address
    + s32i a1, a2, THREAD_SP # save stack pointer
    +#endif

    /* Disable ints while we manipulate the stack pointer. */

    @@ -2011,7 +2016,6 @@ ENTRY(_switch_to)
    load_xtregs_user a5 a6 a8 a9 a12 a13 THREAD_XTREGS_USER

    wsr a14, ps
    - mov a2, a10 # return 'prev'
    rsync

    retw



    \
     
     \ /
      Last update: 2014-10-04 01:01    [W:4.066 / U:0.052 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site