Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/sys/arch Convert rdmsr_locked and wrmsr_locked to inlines.



details:   https://anonhg.NetBSD.org/src/rev/b836be49023a
branches:  trunk
changeset: 454171:b836be49023a
user:      maxv <maxv%NetBSD.org@localhost>
date:      Sat Sep 07 18:33:16 2019 +0000

description:
Convert rdmsr_locked and wrmsr_locked to inlines.

diffstat:

 sys/arch/amd64/amd64/cpufunc.S |  22 +---------------------
 sys/arch/i386/i386/cpufunc.S   |  24 ++----------------------
 sys/arch/x86/include/cpufunc.h |  34 ++++++++++++++++++++++++++++++----
 3 files changed, 33 insertions(+), 47 deletions(-)

diffs (136 lines):

diff -r 499a2db36bda -r b836be49023a sys/arch/amd64/amd64/cpufunc.S
--- a/sys/arch/amd64/amd64/cpufunc.S    Sat Sep 07 16:37:20 2019 +0000
+++ b/sys/arch/amd64/amd64/cpufunc.S    Sat Sep 07 18:33:16 2019 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: cpufunc.S,v 1.43 2019/07/05 17:08:55 maxv Exp $        */
+/*     $NetBSD: cpufunc.S,v 1.44 2019/09/07 18:33:16 maxv Exp $        */
 
 /*
  * Copyright (c) 1998, 2007, 2008 The NetBSD Foundation, Inc.
@@ -167,26 +167,6 @@
 STRONG_ALIAS(x86_write_psl,x86_write_flags)
 #endif /* XENPV */
 
-ENTRY(rdmsr_locked)
-       movq    %rdi, %rcx
-       xorq    %rax, %rax
-       movl    $OPTERON_MSR_PASSCODE, %edi
-       rdmsr
-       shlq    $32, %rdx
-       orq     %rdx, %rax
-       ret
-END(rdmsr_locked)
-
-ENTRY(wrmsr_locked)
-       movq    %rdi, %rcx
-       movq    %rsi, %rax
-       movq    %rsi, %rdx
-       shrq    $32, %rdx
-       movl    $OPTERON_MSR_PASSCODE, %edi
-       wrmsr
-       ret
-END(wrmsr_locked)
-
 /*
  * Support for reading MSRs in the safe manner (returns EFAULT on fault)
  */
diff -r 499a2db36bda -r b836be49023a sys/arch/i386/i386/cpufunc.S
--- a/sys/arch/i386/i386/cpufunc.S      Sat Sep 07 16:37:20 2019 +0000
+++ b/sys/arch/i386/i386/cpufunc.S      Sat Sep 07 18:33:16 2019 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: cpufunc.S,v 1.34 2019/07/05 17:08:55 maxv Exp $        */
+/*     $NetBSD: cpufunc.S,v 1.35 2019/09/07 18:33:16 maxv Exp $        */
 
 /*-
  * Copyright (c) 1998, 2007 The NetBSD Foundation, Inc.
@@ -38,7 +38,7 @@
 #include <sys/errno.h>
 
 #include <machine/asm.h>
-__KERNEL_RCSID(0, "$NetBSD: cpufunc.S,v 1.34 2019/07/05 17:08:55 maxv Exp $");
+__KERNEL_RCSID(0, "$NetBSD: cpufunc.S,v 1.35 2019/09/07 18:33:16 maxv Exp $");
 
 #include "opt_xen.h"
 
@@ -91,26 +91,6 @@
 STRONG_ALIAS(x86_read_psl,x86_read_flags)
 #endif /* XENPV */
 
-ENTRY(rdmsr_locked)
-       movl    4(%esp), %ecx
-       pushl   %edi
-       movl    $OPTERON_MSR_PASSCODE, %edi
-       rdmsr
-       popl    %edi
-       ret
-END(rdmsr_locked)
-
-ENTRY(wrmsr_locked)
-       movl    4(%esp), %ecx
-       movl    8(%esp), %eax
-       movl    12(%esp), %edx
-       pushl   %edi
-       movl    $OPTERON_MSR_PASSCODE, %edi
-       wrmsr
-       popl    %edi
-       ret
-END(wrmsr_locked)
-
 /*
  * Support for reading MSRs in the safe manner (returns EFAULT on fault)
  */
diff -r 499a2db36bda -r b836be49023a sys/arch/x86/include/cpufunc.h
--- a/sys/arch/x86/include/cpufunc.h    Sat Sep 07 16:37:20 2019 +0000
+++ b/sys/arch/x86/include/cpufunc.h    Sat Sep 07 18:33:16 2019 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: cpufunc.h,v 1.35 2019/09/07 11:09:03 maxv Exp $        */
+/*     $NetBSD: cpufunc.h,v 1.36 2019/09/07 18:33:16 maxv Exp $        */
 
 /*
  * Copyright (c) 1998, 2007, 2019 The NetBSD Foundation, Inc.
@@ -419,8 +419,21 @@
        return (low | ((uint64_t)high << 32));
 }
 
-uint64_t       rdmsr_locked(u_int);
-int            rdmsr_safe(u_int, uint64_t *);
+static inline uint64_t
+rdmsr_locked(u_int msr)
+{
+       uint32_t low, high, pass = OPTERON_MSR_PASSCODE;
+
+       __asm volatile (
+               "rdmsr"
+               : "=a" (low), "=d" (high)
+               : "c" (msr), "D" (pass)
+       );
+
+       return (low | ((uint64_t)high << 32));
+}
+
+int    rdmsr_safe(u_int, uint64_t *);
 
 static inline void
 wrmsr(u_int msr, uint64_t val)
@@ -437,7 +450,20 @@
        );
 }
 
-void           wrmsr_locked(u_int, uint64_t);
+static inline void
+wrmsr_locked(u_int msr, uint64_t val)
+{
+       uint32_t low, high, pass = OPTERON_MSR_PASSCODE;
+
+       low = val;
+       high = val >> 32;
+       __asm volatile (
+               "wrmsr"
+               :
+               : "a" (low), "d" (high), "c" (msr), "D" (pass)
+               : "memory"
+       );
+}
 
 #endif /* _KERNEL */
 



Home | Main Index | Thread Index | Old Index