lkml.org 
[lkml]   [2015]   [Feb]   [11]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 2/2] x86: entry_64.S: fix comments. No code changes
    Date
    Misleading and slightly wrong comments in "struct pt_regs" are fixed
    (four instances).

    Fix wrong comment atop EMPTY_FRAME macro.

    Explain in more details what we do with stack layout during hw interrupt.

    Correct comments about "partial stack frame" which are no longer true.

    Signed-off-by: Denys Vlasenko <dvlasenk@redhat.com>
    CC: Linus Torvalds <torvalds@linux-foundation.org>
    CC: Oleg Nesterov <oleg@redhat.com>
    CC: Borislav Petkov <bp@alien8.de>
    CC: "H. Peter Anvin" <hpa@zytor.com>
    CC: Andy Lutomirski <luto@amacapital.net>
    CC: Frederic Weisbecker <fweisbec@gmail.com>
    CC: X86 ML <x86@kernel.org>
    CC: Alexei Starovoitov <ast@plumgrid.com>
    CC: Will Drewry <wad@chromium.org>
    CC: Kees Cook <keescook@chromium.org>
    CC: linux-kernel@vger.kernel.org
    ---
    arch/x86/include/asm/ptrace.h | 13 ++++++++++---
    arch/x86/include/uapi/asm/ptrace-abi.h | 15 +++++++++++----
    arch/x86/include/uapi/asm/ptrace.h | 13 ++++++++++---
    arch/x86/kernel/entry_64.S | 18 ++++++++++++------
    4 files changed, 43 insertions(+), 16 deletions(-)

    diff --git a/arch/x86/include/asm/ptrace.h b/arch/x86/include/asm/ptrace.h
    index 86fc2bb..4077d96 100644
    --- a/arch/x86/include/asm/ptrace.h
    +++ b/arch/x86/include/asm/ptrace.h
    @@ -31,13 +31,17 @@ struct pt_regs {
    #else /* __i386__ */

    struct pt_regs {
    +/*
    + * C ABI says these regs are callee-preserved. They aren't saved on kernel entry
    + * unless syscall needs a complete, fully filled "struct pt_regs".
    + */
    unsigned long r15;
    unsigned long r14;
    unsigned long r13;
    unsigned long r12;
    unsigned long bp;
    unsigned long bx;
    -/* arguments: non interrupts/non tracing syscalls only save up to here*/
    +/* These regs are callee-clobbered. Always saved on kernel entry. */
    unsigned long r11;
    unsigned long r10;
    unsigned long r9;
    @@ -47,9 +51,12 @@ struct pt_regs {
    unsigned long dx;
    unsigned long si;
    unsigned long di;
    +/*
    + * On syscall entry, this is syscall#. On CPU exception, this is error code.
    + * On hw interrupt, it's IRQ number:
    + */
    unsigned long orig_ax;
    -/* end of arguments */
    -/* cpu exception frame or undefined */
    +/* Return frame for iretq */
    unsigned long ip;
    unsigned long cs;
    unsigned long flags;
    diff --git a/arch/x86/include/uapi/asm/ptrace-abi.h b/arch/x86/include/uapi/asm/ptrace-abi.h
    index ad115bf..580aee3 100644
    --- a/arch/x86/include/uapi/asm/ptrace-abi.h
    +++ b/arch/x86/include/uapi/asm/ptrace-abi.h
    @@ -25,13 +25,17 @@
    #else /* __i386__ */

    #if defined(__ASSEMBLY__) || defined(__FRAME_OFFSETS)
    +/*
    + * C ABI says these regs are callee-preserved. They aren't saved on kernel entry
    + * unless syscall needs a complete, fully filled "struct pt_regs".
    + */
    #define R15 0
    #define R14 8
    #define R13 16
    #define R12 24
    #define RBP 32
    #define RBX 40
    -/* arguments: interrupts/non tracing syscalls only save up to here*/
    +/* These regs are callee-clobbered. Always saved on kernel entry. */
    #define R11 48
    #define R10 56
    #define R9 64
    @@ -41,9 +45,12 @@
    #define RDX 96
    #define RSI 104
    #define RDI 112
    -#define ORIG_RAX 120 /* = ERROR */
    -/* end of arguments */
    -/* cpu exception frame or undefined in case of fast syscall. */
    +/*
    + * On syscall entry, this is syscall#. On CPU exception, this is error code.
    + * On hw interrupt, it's IRQ number:
    + */
    +#define ORIG_RAX 120
    +/* Return frame for iretq */
    #define RIP 128
    #define CS 136
    #define EFLAGS 144
    diff --git a/arch/x86/include/uapi/asm/ptrace.h b/arch/x86/include/uapi/asm/ptrace.h
    index ac4b9aa..bc16115 100644
    --- a/arch/x86/include/uapi/asm/ptrace.h
    +++ b/arch/x86/include/uapi/asm/ptrace.h
    @@ -41,13 +41,17 @@ struct pt_regs {
    #ifndef __KERNEL__

    struct pt_regs {
    +/*
    + * C ABI says these regs are callee-preserved. They aren't saved on kernel entry
    + * unless syscall needs a complete, fully filled "struct pt_regs".
    + */
    unsigned long r15;
    unsigned long r14;
    unsigned long r13;
    unsigned long r12;
    unsigned long rbp;
    unsigned long rbx;
    -/* arguments: non interrupts/non tracing syscalls only save up to here*/
    +/* These regs are callee-clobbered. Always saved on kernel entry. */
    unsigned long r11;
    unsigned long r10;
    unsigned long r9;
    @@ -57,9 +61,12 @@ struct pt_regs {
    unsigned long rdx;
    unsigned long rsi;
    unsigned long rdi;
    +/*
    + * On syscall entry, this is syscall#. On CPU exception, this is error code.
    + * On hw interrupt, it's IRQ number:
    + */
    unsigned long orig_rax;
    -/* end of arguments */
    -/* cpu exception frame or undefined */
    +/* Return frame for iretq */
    unsigned long rip;
    unsigned long cs;
    unsigned long eflags;
    diff --git a/arch/x86/kernel/entry_64.S b/arch/x86/kernel/entry_64.S
    index b87716f..792581d2 100644
    --- a/arch/x86/kernel/entry_64.S
    +++ b/arch/x86/kernel/entry_64.S
    @@ -14,9 +14,6 @@
    * NOTE: This code handles signal-recognition, which happens every time
    * after an interrupt and after each system call.
    *
    - * Normal syscalls and interrupts don't save a full stack frame, this is
    - * only done for syscall tracing, signals or fork/exec et.al.
    - *
    * A note on terminology:
    * - top of stack: Architecture defined interrupt frame from SS to RIP
    * at the top of the kernel process stack.
    @@ -151,7 +148,7 @@ ENDPROC(native_usergs_sysret64)
    .endm

    /*
    - * initial frame state for interrupts (and exceptions without error code)
    + * empty frame
    */
    .macro EMPTY_FRAME start=1 offset=0
    .if \start
    @@ -378,7 +375,7 @@ tracesys_phase2:
    call syscall_trace_enter_phase2

    /*
    - * Reload arg registers from stack in case ptrace changed them.
    + * Reload registers from stack in case ptrace changed them.
    * We don't reload %rax because syscall_trace_entry_phase2() returned
    * the value it wants us to use in the table lookup.
    */
    @@ -628,6 +625,13 @@ END(interrupt)
    /* 0(%rsp): ~(interrupt number) */
    .macro interrupt func
    cld
    + /*
    + * Since nothing in interrupt handling code touches r12...r15 members
    + * of "struct pt_regs", and since interrupts can nest, we can save
    + * four stack slots and simultaneously provide
    + * an unwind-friendly stack layout by saving "truncated" pt_regs
    + * exactly up to rbp slot, without these members.
    + */
    ALLOC_PT_GPREGS_ON_STACK -RBP
    SAVE_C_REGS -RBP
    /* this goes to 0(%rsp) for unwinder, not for saving the value: */
    @@ -640,6 +644,7 @@ END(interrupt)
    SWAPGS
    1:
    /*
    + * Save previous stack pointer, optionally switch to interrupt stack.
    * irq_count is used to check if a CPU is already on an interrupt stack
    * or not. While this is essentially redundant with preempt_count it is
    * a little cheaper to use a separate counter in the PDA (short of
    @@ -680,6 +685,7 @@ ret_from_intr:
    /* Restore saved previous stack */
    popq %rsi
    CFI_DEF_CFA rsi,SS+8-RBP /* reg/off reset after def_cfa_expr */
    + /* return code expects complete pt_regs - adjust rsp accordingly: */
    leaq ARGOFFSET-RBP(%rsi), %rsp
    CFI_DEF_CFA_REGISTER rsp
    CFI_ADJUST_CFA_OFFSET RBP-ARGOFFSET
    @@ -691,7 +697,7 @@ exit_intr:

    /* Interrupt came from user space */
    /*
    - * Has a correct top of stack, but a partial stack frame
    + * Has a correct top of stack.
    * %rcx: thread info. Interrupts off.
    */
    retint_with_reschedule:
    --
    1.8.1.4


    \
     
     \ /
      Last update: 2015-02-11 23:21    [W:3.761 / U:0.084 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site