lkml.org 
[lkml]   [2020]   [Jun]   [18]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[tip: x86/fsgsbase] selftests/x86/fsgsbase: Test GS selector on ptracer-induced GS base write
    The following commit has been merged into the x86/fsgsbase branch of tip:

    Commit-ID: 291fd83569e10f3d305cd8adb62f6ec00f759dc6
    Gitweb: https://git.kernel.org/tip/291fd83569e10f3d305cd8adb62f6ec00f759dc6
    Author: Chang S. Bae <chang.seok.bae@intel.com>
    AuthorDate: Thu, 28 May 2020 16:14:01 -04:00
    Committer: Thomas Gleixner <tglx@linutronix.de>
    CommitterDate: Thu, 18 Jun 2020 15:47:06 +02:00

    selftests/x86/fsgsbase: Test GS selector on ptracer-induced GS base write

    The test validates that the selector is not changed when a ptracer writes
    the ptracee's GS base.

    Originally-by: Andy Lutomirski <luto@kernel.org>
    Signed-off-by: Chang S. Bae <chang.seok.bae@intel.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
    Reviewed-by: Tony Luck <tony.luck@intel.com>
    Link: https://lkml.kernel.org/r/20200528201402.1708239-16-sashal@kernel.org


    ---
    tools/testing/selftests/x86/fsgsbase.c | 21 +++++++++++++++------
    1 file changed, 15 insertions(+), 6 deletions(-)

    diff --git a/tools/testing/selftests/x86/fsgsbase.c b/tools/testing/selftests/x86/fsgsbase.c
    index 15a329d..950a48b 100644
    --- a/tools/testing/selftests/x86/fsgsbase.c
    +++ b/tools/testing/selftests/x86/fsgsbase.c
    @@ -465,7 +465,7 @@ static void test_ptrace_write_gsbase(void)
    wait(&status);

    if (WSTOPSIG(status) == SIGTRAP) {
    - unsigned long gs, base;
    + unsigned long gs;
    unsigned long gs_offset = USER_REGS_OFFSET(gs);
    unsigned long base_offset = USER_REGS_OFFSET(gs_base);

    @@ -481,7 +481,6 @@ static void test_ptrace_write_gsbase(void)
    err(1, "PTRACE_POKEUSER");

    gs = ptrace(PTRACE_PEEKUSER, child, gs_offset, NULL);
    - base = ptrace(PTRACE_PEEKUSER, child, base_offset, NULL);

    /*
    * In a non-FSGSBASE system, the nonzero selector will load
    @@ -489,11 +488,21 @@ static void test_ptrace_write_gsbase(void)
    * selector value is changed or not by the GSBASE write in
    * a ptracer.
    */
    - if (gs == 0 && base == 0xFF) {
    - printf("[OK]\tGS was reset as expected\n");
    - } else {
    + if (gs != *shared_scratch) {
    nerrs++;
    - printf("[FAIL]\tGS=0x%lx, GSBASE=0x%lx (should be 0, 0xFF)\n", gs, base);
    + printf("[FAIL]\tGS changed to %lx\n", gs);
    +
    + /*
    + * On older kernels, poking a nonzero value into the
    + * base would zero the selector. On newer kernels,
    + * this behavior has changed -- poking the base
    + * changes only the base and, if FSGSBASE is not
    + * available, this may not effect.
    + */
    + if (gs == 0)
    + printf("\tNote: this is expected behavior on older kernels.\n");
    + } else {
    + printf("[OK]\tGS remained 0x%hx\n", *shared_scratch);
    }
    }

    \
     
     \ /
      Last update: 2020-06-18 15:56    [W:2.621 / U:0.064 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site