All of lore.kernel.org
 help / color / mirror / Atom feed
From: Borislav Petkov <petkovbb@googlemail.com>
To: <hpa@zytor.com>
Cc: <mingo@redhat.com>,
	linux-kernel@vger.kernel.org, kjwinchester@gmail.com,
	tglx@linutronix.de, borislav.petkov@amd.com,
	linux-tip-commits@vger.kernel.org
Subject: [PATCH 1/3] x86, msr: add rd/wrmsr interfaces with preset registers
Date: Sun, 30 Aug 2009 13:50:29 +0200	[thread overview]
Message-ID: <1251633031-2244-1-git-send-email-petkovbb@gmail.com> (raw)
In-Reply-To: <20090830114329.GA9038@liondog.tnic>

native_{rdmsr,wrmsr}_safe_regs are two new interfaces which allow
presetting of a subset of eight x86 GPRs before executing the rd/wrmsr
instructions. This is needed at least on AMD K8 for accessing an erratum
workaround MSR.

Originally based on an idea by H. Peter Anvin.

Signed-off-by: Borislav Petkov <petkovbb@gmail.com>
---
 arch/x86/include/asm/msr.h      |   13 +++++
 arch/x86/include/asm/paravirt.h |   16 ++++++
 arch/x86/kernel/paravirt.c      |    2 +
 arch/x86/lib/Makefile           |    1 +
 arch/x86/lib/msr-reg.S          |  100 +++++++++++++++++++++++++++++++++++++++
 5 files changed, 132 insertions(+), 0 deletions(-)
 create mode 100644 arch/x86/lib/msr-reg.S

diff --git a/arch/x86/include/asm/msr.h b/arch/x86/include/asm/msr.h
index 48ad9d2..184d4a1 100644
--- a/arch/x86/include/asm/msr.h
+++ b/arch/x86/include/asm/msr.h
@@ -113,6 +113,9 @@ notrace static inline int native_write_msr_safe(unsigned int msr,
 
 extern unsigned long long native_read_tsc(void);
 
+extern int native_rdmsr_safe_regs(u32 *regs);
+extern int native_wrmsr_safe_regs(u32 *regs);
+
 static __always_inline unsigned long long __native_read_tsc(void)
 {
 	DECLARE_ARGS(val, low, high);
@@ -189,6 +192,16 @@ static inline int rdmsrl_amd_safe(unsigned msr, unsigned long long *p)
 	return err;
 }
 
+static inline int rdmsr_safe_regs(u32 *regs)
+{
+	return native_rdmsr_safe_regs(regs);
+}
+
+static inline int wrmsr_safe_regs(u32 *regs)
+{
+	return native_wrmsr_safe_regs(regs);
+}
+
 #define rdtscl(low)						\
 	((low) = (u32)__native_read_tsc())
 
diff --git a/arch/x86/include/asm/paravirt.h b/arch/x86/include/asm/paravirt.h
index 4fb37c8..1705944 100644
--- a/arch/x86/include/asm/paravirt.h
+++ b/arch/x86/include/asm/paravirt.h
@@ -168,7 +168,9 @@ struct pv_cpu_ops {
 	   err = 0/-EFAULT.  wrmsr returns 0/-EFAULT. */
 	u64 (*read_msr_amd)(unsigned int msr, int *err);
 	u64 (*read_msr)(unsigned int msr, int *err);
+	int (*rdmsr_regs)(u32 *regs);
 	int (*write_msr)(unsigned int msr, unsigned low, unsigned high);
+	int (*wrmsr_regs)(u32 *regs);
 
 	u64 (*read_tsc)(void);
 	u64 (*read_pmc)(int counter);
@@ -820,6 +822,12 @@ static inline u64 paravirt_read_msr(unsigned msr, int *err)
 {
 	return PVOP_CALL2(u64, pv_cpu_ops.read_msr, msr, err);
 }
+
+static inline int paravirt_rdmsr_regs(u32 *regs)
+{
+	return PVOP_CALL1(int, pv_cpu_ops.rdmsr_regs, regs);
+}
+
 static inline u64 paravirt_read_msr_amd(unsigned msr, int *err)
 {
 	return PVOP_CALL2(u64, pv_cpu_ops.read_msr_amd, msr, err);
@@ -829,6 +837,11 @@ static inline int paravirt_write_msr(unsigned msr, unsigned low, unsigned high)
 	return PVOP_CALL3(int, pv_cpu_ops.write_msr, msr, low, high);
 }
 
+static inline int paravirt_wrmsr_regs(u32 *regs)
+{
+	return PVOP_CALL1(int, pv_cpu_ops.wrmsr_regs, regs);
+}
+
 /* These should all do BUG_ON(_err), but our headers are too tangled. */
 #define rdmsr(msr, val1, val2)			\
 do {						\
@@ -862,6 +875,9 @@ do {						\
 	_err;					\
 })
 
+#define rdmsr_safe_regs(regs)	paravirt_rdmsr_regs(regs)
+#define wrmsr_safe_regs(regs)	paravirt_wrmsr_regs(regs)
+
 static inline int rdmsrl_safe(unsigned msr, unsigned long long *p)
 {
 	int err;
diff --git a/arch/x86/kernel/paravirt.c b/arch/x86/kernel/paravirt.c
index 70ec9b9..67594af 100644
--- a/arch/x86/kernel/paravirt.c
+++ b/arch/x86/kernel/paravirt.c
@@ -362,8 +362,10 @@ struct pv_cpu_ops pv_cpu_ops = {
 #endif
 	.wbinvd = native_wbinvd,
 	.read_msr = native_read_msr_safe,
+	.rdmsr_regs = native_rdmsr_safe_regs,
 	.read_msr_amd = native_read_msr_amd_safe,
 	.write_msr = native_write_msr_safe,
+	.wrmsr_regs = native_wrmsr_safe_regs,
 	.read_tsc = native_read_tsc,
 	.read_pmc = native_read_pmc,
 	.read_tscp = native_read_tscp,
diff --git a/arch/x86/lib/Makefile b/arch/x86/lib/Makefile
index 07c3189..b59c064 100644
--- a/arch/x86/lib/Makefile
+++ b/arch/x86/lib/Makefile
@@ -8,6 +8,7 @@ lib-y := delay.o
 lib-y += thunk_$(BITS).o
 lib-y += usercopy_$(BITS).o getuser.o putuser.o
 lib-y += memcpy_$(BITS).o
+lib-y += msr-reg.o
 
 ifeq ($(CONFIG_X86_32),y)
         obj-y += atomic64_32.o
diff --git a/arch/x86/lib/msr-reg.S b/arch/x86/lib/msr-reg.S
new file mode 100644
index 0000000..76b005e
--- /dev/null
+++ b/arch/x86/lib/msr-reg.S
@@ -0,0 +1,100 @@
+#include <linux/linkage.h>
+#include <linux/errno.h>
+#include <asm/asm.h>
+#include <asm/msr.h>
+
+#ifdef CONFIG_X86_64
+/*
+ * int native_{rdmsr,wrmsr}_safe_regs(u32 gprs[8]);
+ *
+ * reg layout: u32 gprs[eax, ecx, edx, ebx, esp, ebp, esi, edi]
+ *
+ */
+.macro op_safe_regs op:req
+ENTRY(native_\op\()_safe_regs)
+	push    %rbx
+	push    %rbp
+	push    $0              /* Return value */
+	push    %rdi
+	movl    (%rdi), %eax
+	movl    4(%rdi), %ecx
+	movl    8(%rdi), %edx
+	movl    12(%rdi), %ebx
+	movl    20(%rdi), %ebp
+	movl    24(%rdi), %esi
+	movl    28(%rdi), %edi
+1:	\op
+2:	movl    %edi, %r10d
+	pop     %rdi
+	movl    %eax, (%rdi)
+	movl    %ecx, 4(%rdi)
+	movl    %edx, 8(%rdi)
+	movl    %ebx, 12(%rdi)
+	movl    %ebp, 20(%rdi)
+	movl    %esi, 24(%rdi)
+	movl    %r10d, 28(%rdi)
+	pop     %rax
+	pop     %rbp
+	pop     %rbx
+	ret
+3:
+	movq    $-EIO, 8(%rsp)
+	jmp     2b
+	.section __ex_table,"ax"
+	.balign 4
+	.quad   1b, 3b
+	.previous
+ENDPROC(native_\op\()_safe_regs)
+.endm
+
+op_safe_regs rdmsr
+op_safe_regs wrmsr
+
+#else /* X86_32 */
+
+.macro op_safe_regs op:req
+ENTRY(native_\op\()_safe_regs)
+	push    %ebx
+	push    %ebp
+	push    %esi
+	push    %edi
+	push    $0              /* Return value */
+	push    %eax
+	movl    4(%eax), %ecx
+	movl    8(%eax), %edx
+	movl    12(%eax), %ebx
+	movl    20(%eax), %ebp
+	movl    24(%eax), %esi
+	movl    28(%eax), %edi
+	movl    (%eax), %eax
+1:	\op
+2:	push    %eax
+	movl    4(%esp), %eax
+	pop     (%eax)
+	addl    $4, %esp
+	movl    %ecx, 4(%eax)
+	movl    %edx, 8(%eax)
+	movl    %ebx, 12(%eax)
+	movl    %ebp, 20(%eax)
+	movl    %esi, 24(%eax)
+	movl    %edi, 28(%eax)
+	pop     %eax
+	pop     %edi
+	pop     %esi
+	pop     %ebp
+	pop     %ebx
+	ret
+3:
+	movl    $-EIO, 4(%esp)
+	jmp     2b
+	.section __ex_table,"ax"
+	.balign 4
+	.long   1b, 3b
+	.previous
+ENDPROC(native_\op\()_safe_regs)
+.endm
+
+op_safe_regs rdmsr
+op_safe_regs wrmsr
+
+#endif
-- 
1.6.3.3


  reply	other threads:[~2009-08-30 11:50 UTC|newest]

Thread overview: 80+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2009-08-08 11:53 [PATCH] x86: clear incorrectly forced X86_FEATURE_LAHF_LM flag Kevin Winchester
2009-08-08 15:20 ` Borislav Petkov
2009-08-08 15:42   ` Ingo Molnar
2009-08-08 16:15   ` Ingo Molnar
2009-08-08 22:06   ` Kevin Winchester
2009-08-08 23:17   ` [PATCH v2] " Kevin Winchester
2009-08-10 13:12     ` Borislav Petkov
2009-08-10 22:56       ` [PATCH v3] " Kevin Winchester
2009-08-11  9:44         ` Borislav Petkov
2009-08-11 11:36         ` [tip:x86/urgent] x86: Clear " tip-bot for Kevin Winchester
2009-08-11 14:37         ` [PATCH v3] x86: clear " Mikael Pettersson
2009-08-11 14:56           ` Kevin Winchester
2009-08-11 15:51           ` Borislav Petkov
2009-08-11 15:55             ` Kevin Winchester
2009-08-11 16:01               ` Borislav Petkov
2009-08-12  0:15                 ` Kevin Winchester
2009-08-12 11:40                   ` Borislav Petkov
2009-08-12 23:02                     ` Kevin Winchester
2009-08-13 12:23                       ` Borislav Petkov
2009-08-13 12:31                         ` [PATCH 1/2] x86, msr: Add an AMD wrmsr with exception handling Borislav Petkov
2009-08-13 12:31                         ` [PATCH 2/2] x86: Clear incorrectly forced X86_FEATURE_LAHF_LM flag Borislav Petkov
2009-08-13 14:21                           ` Brian Gerst
2009-08-13 14:54                             ` Kevin Winchester
2009-08-13 15:55                               ` Brian Gerst
2009-08-13 16:18                                 ` Borislav Petkov
2009-08-13 22:45                                 ` Kevin Winchester
2009-08-13 15:54                             ` Borislav Petkov
2009-08-13 14:57                         ` [PATCH v3] x86: clear " Kevin Winchester
2009-08-13 23:24                         ` Kevin Winchester
2009-08-14 12:00                           ` Borislav Petkov
2009-08-14 12:06                             ` [PATCH 1/2] x86, msr: Add a AMD wrmsr with exception handling Borislav Petkov
2009-08-15 17:06                               ` [tip:x86/urgent] " tip-bot for Borislav Petkov
2009-08-14 12:06                             ` [PATCH 2/2] x86, AMD: Disable wrongly set X86_FEATURE_LAHF_LM CPUID bit Borislav Petkov
2009-08-15 17:06                               ` [tip:x86/urgent] " tip-bot for Borislav Petkov
2009-08-16  6:41                                 ` Ingo Molnar
2009-08-16 20:10                                   ` Kevin Winchester
2009-08-16 20:51                                     ` Ingo Molnar
2009-08-16 21:49                                   ` Borislav Petkov
2009-08-21 17:40                                     ` H. Peter Anvin
2009-08-22 16:37                                       ` Borislav Petkov
2009-08-24 20:34                                         ` H. Peter Anvin
2009-08-25  5:52                                           ` Borislav Petkov
2009-08-25  6:44                                             ` H. Peter Anvin
2009-08-30 11:43                                               ` Borislav Petkov
2009-08-30 11:50                                                 ` Borislav Petkov [this message]
2009-08-30 11:50                                                 ` [PATCH 2/3] x86, msr: rewrite AMD rd/wrmsr variants Borislav Petkov
2009-08-30 20:03                                                   ` H. Peter Anvin
2009-08-30 20:46                                                     ` Borislav Petkov
2009-08-30 20:04                                                   ` H. Peter Anvin
2009-08-30 11:50                                                 ` [PATCH 3/3] x86, AMD: Disable wrongly set X86_FEATURE_LAHF_LM CPUID bit Borislav Petkov
2009-08-30 19:22                                                   ` H. Peter Anvin
2009-08-30 19:30                                                     ` Borislav Petkov
2009-08-30 20:02                                                       ` H. Peter Anvin
2009-08-30 20:29                                                         ` Borislav Petkov
2009-08-30 20:48                                                           ` H. Peter Anvin
2009-08-31  7:34                                                             ` Borislav Petkov
2009-08-31  7:50                                                               ` [PATCH 1/3] x86, msr: add rd/wrmsr interfaces with preset registers Borislav Petkov
2009-08-31 23:37                                                                 ` [tip:x86/cpu] x86, msr: Add " tip-bot for Borislav Petkov
2009-09-01 11:05                                                                   ` Ingo Molnar
2009-09-01 13:06                                                                     ` Borislav Petkov
2009-09-04 14:08                                                                   ` Ingo Molnar
2009-09-04 16:26                                                                     ` H. Peter Anvin
2009-09-04 17:06                                                                     ` [tip:x86/cpu] x86, msr: change msr-reg.o to obj-y, and export its symbols tip-bot for H. Peter Anvin
2009-09-05  9:57                                                                       ` Borislav Petkov
2009-09-06  4:41                                                                         ` H. Peter Anvin
2009-08-31 23:38                                                                 ` [tip:x86/cpu] x86, msr: CFI annotations, cleanups for msr-reg.S tip-bot for H. Peter Anvin
2009-09-03 22:55                                                                 ` [PATCH 1/3] x86, msr: add rd/wrmsr interfaces with preset registers Andrew Morton
2009-09-03 22:57                                                                   ` H. Peter Anvin
2009-09-03 23:14                                                                     ` Andrew Morton
2009-09-03 23:22                                                                       ` H. Peter Anvin
2009-09-04  6:39                                                                       ` Ingo Molnar
2009-09-04  8:27                                                                         ` Borislav Petkov
2009-08-31  7:50                                                               ` [PATCH 2/3] x86, msr: rewrite AMD rd/wrmsr variants Borislav Petkov
2009-08-31 23:37                                                                 ` [tip:x86/cpu] x86, msr: Rewrite " tip-bot for Borislav Petkov
2009-08-31  7:50                                                               ` [PATCH 3/3] x86, AMD: Disable wrongly set X86_FEATURE_LAHF_LM CPUID bit Borislav Petkov
2009-08-31 23:37                                                                 ` [tip:x86/cpu] " tip-bot for Borislav Petkov
2009-08-31  8:14                                                             ` [PATCH 3/3] " Borislav Petkov
2009-08-31 18:03                                                               ` H. Peter Anvin
2009-08-30 17:07                                                 ` [tip:x86/urgent] " H. Peter Anvin
2009-08-30 19:17                                                   ` Borislav Petkov

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=1251633031-2244-1-git-send-email-petkovbb@gmail.com \
    --to=petkovbb@googlemail.com \
    --cc=borislav.petkov@amd.com \
    --cc=hpa@zytor.com \
    --cc=kjwinchester@gmail.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-tip-commits@vger.kernel.org \
    --cc=mingo@redhat.com \
    --cc=tglx@linutronix.de \
    /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.