From: Denys Vlasenko <vda.linux@googlemail.com>
To: Borislav Petkov <bp@alien8.de>
Cc: Denys Vlasenko <dvlasenk@redhat.com>,
Linux Kernel Mailing List <linux-kernel@vger.kernel.org>,
Linus Torvalds <torvalds@linux-foundation.org>,
Oleg Nesterov <oleg@redhat.com>, "H. Peter Anvin" <hpa@zytor.com>,
Andy Lutomirski <luto@amacapital.net>,
Frederic Weisbecker <fweisbec@gmail.com>, X86 ML <x86@kernel.org>,
Alexei Starovoitov <ast@plumgrid.com>,
Will Drewry <wad@chromium.org>, Kees Cook <keescook@chromium.org>
Subject: Re: [PATCH 3/4] x86: open-code register save/restore in trace_hardirqs thunks
Date: Sat, 10 Jan 2015 21:14:03 +0100 [thread overview]
Message-ID: <CAK1hOcO7K=4N8CF=LOPmosXRNnogaNi5vLDPMdb0XiKsL=JOfg@mail.gmail.com> (raw)
In-Reply-To: <20150110142336.GC12218@pd.tnic>
[-- Attachment #1: Type: text/plain, Size: 1000 bytes --]
On Sat, Jan 10, 2015 at 3:23 PM, Borislav Petkov <bp@alien8.de> wrote:
> Bah, I see it. This nasty '$' gets forgotten a lot, maybe we should have
> a check for that in some scripts :-)
>
> Here's the fix:
>
> ---
> Index: b/arch/x86/lib/thunk_64.S
> ===================================================================
> --- a/arch/x86/lib/thunk_64.S 2015-01-10 15:18:04.418737613 +0100
> +++ b/arch/x86/lib/thunk_64.S 2015-01-10 15:17:18.882736556 +0100
> @@ -67,7 +67,7 @@ restore:
> movq_cfi_restore 6*8, rdx
> movq_cfi_restore 7*8, rsi
> movq_cfi_restore 8*8, rdi
> - addq 9*8, %rsp
> + addq $9*8, %rsp
> CFI_ADJUST_CFA_OFFSET -9*8
> ret
Thanks!
After I've seen the disassembly I myself posted, I can't help but wonder
why we use 5-byte instructions to store and load regs on stack when
pushes and pops are 1 or 2-byte long.
Especially that 32-bit code *does* use push/pops.
Can you test the attached patch with your kvm guest testcase?
[-- Attachment #2: 0003-x86-open-code-register-save-restore-in-trace_hardirq.patch --]
[-- Type: text/x-patch, Size: 3038 bytes --]
From 2f636e0a92db898f2bdb592027aa302fcb32a326 Mon Sep 17 00:00:00 2001
From: Denys Vlasenko <dvlasenk@redhat.com>
To: linux-kernel@vger.kernel.org
Subject: [PATCH 3/4] x86: open-code register save/restore in trace_hardirqs thunks
This is a preparatory patch for change in "struct pt_regs"
handling in entry_64.S.
trace_hardirqs thunks were (ab)using a part of pt_regs
handling code, namely SAVE_ARGS/RESTORE_ARGS macros,
to save/restore registers across C function calls.
Since SAVE_ARGS is going to be changed, open-code
register saving/restoring here. Take a page from thunk_32.S
and use push/pop insns instead of movq, they are far shorter:
1 or 2 bytes versus 5, and no need for insns to adjust %rsp:
text data bss dec hex filename
333 40 0 373 175 thunk_64_movq.o
104 40 0 144 90 thunk_64_push_pop.o
Incidentally, this removes a bit of dead code:
one SAVE_ARGS was used just to emit a CFI annotation,
but it also generated unreachable assembly insns.
Signed-off-by: Denys Vlasenko <dvlasenk@redhat.com>
CC: Linus Torvalds <torvalds@linux-foundation.org>
CC: Oleg Nesterov <oleg@redhat.com>
CC: "H. Peter Anvin" <hpa@zytor.com>
CC: Borislav Petkov <bp@alien8.de>
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/lib/thunk_64.S | 46 ++++++++++++++++++++++++++++++++++++++++++----
1 file changed, 42 insertions(+), 4 deletions(-)
diff --git a/arch/x86/lib/thunk_64.S b/arch/x86/lib/thunk_64.S
index b30b5eb..8ec443a 100644
--- a/arch/x86/lib/thunk_64.S
+++ b/arch/x86/lib/thunk_64.S
@@ -17,9 +17,27 @@
CFI_STARTPROC
/* this one pushes 9 elems, the next one would be %rIP */
- SAVE_ARGS
+ pushq_cfi %rdi
+ CFI_REL_OFFSET rdi, 0
+ pushq_cfi %rsi
+ CFI_REL_OFFSET rsi, 0
+ pushq_cfi %rdx
+ CFI_REL_OFFSET rdx, 0
+ pushq_cfi %rcx
+ CFI_REL_OFFSET rcx, 0
+ pushq_cfi %rax
+ CFI_REL_OFFSET rax, 0
+ pushq_cfi %r8
+ CFI_REL_OFFSET r8, 0
+ pushq_cfi %r9
+ CFI_REL_OFFSET r9, 0
+ pushq_cfi %r10
+ CFI_REL_OFFSET r10, 0
+ pushq_cfi %r11
+ CFI_REL_OFFSET r11, 0
.if \put_ret_addr_in_rdi
+ /* 9*8(%rsp) is return addr on stack */
movq_cfi_restore 9*8, rdi
.endif
@@ -45,11 +63,31 @@
#endif
#endif
- /* SAVE_ARGS below is used only for the .cfi directives it contains. */
+#if defined(CONFIG_TRACE_IRQFLAGS) \
+ || defined(CONFIG_DEBUG_LOCK_ALLOC) \
+ || defined(CONFIG_PREEMPT)
CFI_STARTPROC
- SAVE_ARGS
+ CFI_ADJUST_CFA_OFFSET 9*8
restore:
- RESTORE_ARGS
+ popq_cfi %r11
+ CFI_RESTORE r11
+ popq_cfi %r10
+ CFI_RESTORE r10
+ popq_cfi %r9
+ CFI_RESTORE r9
+ popq_cfi %r8
+ CFI_RESTORE r8
+ popq_cfi %rax
+ CFI_RESTORE rax
+ popq_cfi %rcx
+ CFI_RESTORE rcx
+ popq_cfi %rdx
+ CFI_RESTORE rdx
+ popq_cfi %rsi
+ CFI_RESTORE rsi
+ popq_cfi %rdi
+ CFI_RESTORE rdi
ret
CFI_ENDPROC
_ASM_NOKPROBE(restore)
+#endif
--
1.8.1.4
next prev parent reply other threads:[~2015-01-10 20:14 UTC|newest]
Thread overview: 35+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-01-08 16:25 [PATCH 0/4] x86: entry.S cleanup Denys Vlasenko
2015-01-08 16:25 ` [PATCH 1/4] x86: entry_64.S: delete unused code Denys Vlasenko
2015-01-08 18:16 ` Borislav Petkov
2015-01-13 22:01 ` Andy Lutomirski
2015-01-08 16:25 ` [PATCH 2/4] x86: ia32entry.S: fix wrong symbolic constant usage: R11->ARGOFFSET Denys Vlasenko
2015-01-09 10:41 ` Borislav Petkov
2015-01-08 16:25 ` [PATCH 3/4] x86: open-code register save/restore in trace_hardirqs thunks Denys Vlasenko
2015-01-09 10:55 ` Borislav Petkov
2015-01-09 20:29 ` Denys Vlasenko
2015-01-10 13:52 ` Borislav Petkov
2015-01-09 12:19 ` Borislav Petkov
2015-01-09 18:54 ` Denys Vlasenko
2015-01-10 14:23 ` Borislav Petkov
2015-01-10 20:14 ` Denys Vlasenko [this message]
2015-01-10 20:17 ` Andy Lutomirski
2015-01-10 20:42 ` Borislav Petkov
2015-01-10 21:02 ` Andy Lutomirski
2015-01-10 21:09 ` Denys Vlasenko
2015-01-10 21:27 ` Linus Torvalds
2015-01-10 21:57 ` Denys Vlasenko
2015-01-10 20:43 ` Denys Vlasenko
2015-01-10 21:08 ` Linus Torvalds
2015-01-10 21:26 ` Borislav Petkov
2015-01-10 22:00 ` Borislav Petkov
2015-01-10 22:03 ` Denys Vlasenko
2015-01-10 22:04 ` Andy Lutomirski
2015-01-08 16:25 ` [PATCH 4/4] x86: entry_64.S: fold SAVE_ARGS_IRQ macro into its sole user Denys Vlasenko
2015-01-10 22:00 [PATCH 0/4 v2] x86: entry.S cleanup Denys Vlasenko
2015-01-10 22:00 ` [PATCH 3/4] x86: open-code register save/restore in trace_hardirqs thunks Denys Vlasenko
2015-01-10 22:07 ` Linus Torvalds
2015-01-10 22:35 ` Denys Vlasenko
2015-01-10 22:41 ` Borislav Petkov
2015-01-11 3:33 ` Denys Vlasenko
2015-01-11 10:54 ` Borislav Petkov
2015-01-11 23:06 ` Denys Vlasenko
2015-02-11 2:38 ` Andy Lutomirski
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to='CAK1hOcO7K=4N8CF=LOPmosXRNnogaNi5vLDPMdb0XiKsL=JOfg@mail.gmail.com' \
--to=vda.linux@googlemail.com \
--cc=ast@plumgrid.com \
--cc=bp@alien8.de \
--cc=dvlasenk@redhat.com \
--cc=fweisbec@gmail.com \
--cc=hpa@zytor.com \
--cc=keescook@chromium.org \
--cc=linux-kernel@vger.kernel.org \
--cc=luto@amacapital.net \
--cc=oleg@redhat.com \
--cc=torvalds@linux-foundation.org \
--cc=wad@chromium.org \
--cc=x86@kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.