lkml.org 
[lkml]   [2011]   [Jul]   [4]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    /
    Date
    From
    SubjectRe: [PATCH 3/6] x86,64: Simplify save_regs()
    >>> On 02.07.11 at 18:29, Frederic Weisbecker <fweisbec@gmail.com> wrote:
    > The save_regs function that saves the regs on low level
    > irq entry is complicated because of the fact it changes
    > its stack in the middle and also because it manipulates
    > data allocated in the caller frame and accesses there
    > are directly calculated from callee rsp value with the
    > return address in the middle of the way.
    >
    > This complicates the static stack offsets calculation and
    > require more dynamic ones. It also needs a save/restore
    > of the function's return address.
    >
    > To simplify and optimize this, turn save_regs() into a
    > macro.

    So this got pulled out into a function a couple of releases ago,
    and now it's being converted back? Wasn't the original patch's
    intention to reduce the amount of duplication of generated
    code?

    > Signed-off-by: Frederic Weisbecker <fweisbec@gmail.com>
    > Cc: Ingo Molnar <mingo@elte.hu>
    > Cc: Thomas Gleixner <tglx@linutronix.de>
    > Cc: H. Peter Anvin <hpa@zytor.com>
    > Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
    > Cc: Arnaldo Carvalho de Melo <acme@redhat.com>
    > Cc: Jan Beulich <JBeulich@novell.com>
    > ---
    > arch/x86/kernel/entry_64.S | 44 +++++++++++++++++---------------------------
    > 1 files changed, 17 insertions(+), 27 deletions(-)
    >
    > diff --git a/arch/x86/kernel/entry_64.S b/arch/x86/kernel/entry_64.S
    > index 8a445a0..b6b2e85 100644
    > --- a/arch/x86/kernel/entry_64.S
    > +++ b/arch/x86/kernel/entry_64.S
    > @@ -297,27 +297,22 @@ ENDPROC(native_usergs_sysret64)
    > .endm
    >
    > /* save partial stack frame */
    > - .pushsection .kprobes.text, "ax"
    > -ENTRY(save_args)
    > - XCPT_FRAME
    > + .macro SAVE_ARGS_IRQ
    > cld
    > - /*
    > - * start from rbp in pt_regs and jump over
    > - * return address.
    > - */
    > - movq_cfi rdi, RDI+8-RBP
    > - movq_cfi rsi, RSI+8-RBP
    > - movq_cfi rdx, RDX+8-RBP
    > - movq_cfi rcx, RCX+8-RBP
    > - movq_cfi rax, RAX+8-RBP
    > - movq_cfi r8, R8+8-RBP
    > - movq_cfi r9, R9+8-RBP
    > - movq_cfi r10, R10+8-RBP
    > - movq_cfi r11, R11+8-RBP
    > -
    > - leaq -RBP+8(%rsp),%rdi /* arg1 for handler */
    > - movq_cfi rbp, 8 /* push %rbp */
    > - leaq 8(%rsp), %rbp /* mov %rsp, %ebp */
    > + /* start from rbp in pt_regs and jump over */
    > + movq_cfi rdi, RDI-RBP
    > + movq_cfi rsi, RSI-RBP
    > + movq_cfi rdx, RDX-RBP
    > + movq_cfi rcx, RCX-RBP
    > + movq_cfi rax, RAX-RBP
    > + movq_cfi r8, R8-RBP
    > + movq_cfi r9, R9-RBP
    > + movq_cfi r10, R10-RBP
    > + movq_cfi r11, R11-RBP
    > +
    > + leaq -RBP(%rsp),%rdi /* arg1 for handler */
    > + movq_cfi rbp, 0 /* push %rbp */
    > + movq %rsp, %rbp
    > testl $3, CS(%rdi)
    > je 1f
    > SWAPGS
    > @@ -329,19 +324,14 @@ ENTRY(save_args)
    > */
    > 1: incl PER_CPU_VAR(irq_count)
    > jne 2f
    > - popq_cfi %rax /* move return address... */
    > mov PER_CPU_VAR(irq_stack_ptr),%rsp
    > EMPTY_FRAME 0
    > pushq_cfi %rbp /* backlink for unwinder */
    > - pushq_cfi %rax /* ... to the new stack */
    > /*
    > * We entered an interrupt context - irqs are off:
    > */
    > 2: TRACE_IRQS_OFF
    > - ret
    > - CFI_ENDPROC
    > -END(save_args)
    > - .popsection
    > + .endm
    >
    > ENTRY(save_rest)
    > PARTIAL_FRAME 1 REST_SKIP+8
    > @@ -791,7 +781,7 @@ END(interrupt)
    > /* reserve pt_regs for scratch regs and rbp */
    > subq $ORIG_RAX-RBP, %rsp
    > CFI_ADJUST_CFA_OFFSET ORIG_RAX-RBP
    > - call save_args
    > + SAVE_ARGS_IRQ
    > PARTIAL_FRAME 0

    With the above CFI adjustments all looking correct, this PARTIAL_FRAME
    directive now is at best redundant, and hence should be removed.

    Jan

    > call \func
    > .endm






    \
     
     \ /
      Last update: 2011-07-04 09:43    [W:0.028 / U:90.264 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site