svn commit: r339895 - head/sys/amd64/amd64
Konstantin Belousov
kib at FreeBSD.org
Mon Oct 29 23:52:32 UTC 2018
Author: kib
Date: Mon Oct 29 23:52:31 2018
New Revision: 339895
URL: https://svnweb.freebsd.org/changeset/base/339895
Log:
amd64: Use ifuncs to select suitable implementation of set_pcb_flags().
There is no reason to check for PCB_FULL_IRET if FSGSBASE instructions
are not supported.
Sponsored by: The FreeBSD Foundation
MFC after: 1 week
Modified:
head/sys/amd64/amd64/machdep.c
Modified: head/sys/amd64/amd64/machdep.c
==============================================================================
--- head/sys/amd64/amd64/machdep.c Mon Oct 29 23:48:20 2018 (r339894)
+++ head/sys/amd64/amd64/machdep.c Mon Oct 29 23:52:31 2018 (r339895)
@@ -2616,15 +2616,14 @@ set_pcb_flags_raw(struct pcb *pcb, const u_int flags)
* the PCB_FULL_IRET flag is set. We disable interrupts to sync with
* context switches.
*/
-void
-set_pcb_flags(struct pcb *pcb, const u_int flags)
+static void
+set_pcb_flags_fsgsbase(struct pcb *pcb, const u_int flags)
{
register_t r;
if (curpcb == pcb &&
(flags & PCB_FULL_IRET) != 0 &&
- (pcb->pcb_flags & PCB_FULL_IRET) == 0 &&
- (cpu_stdext_feature & CPUID_STDEXT_FSGSBASE) != 0) {
+ (pcb->pcb_flags & PCB_FULL_IRET) == 0) {
r = intr_disable();
if ((pcb->pcb_flags & PCB_FULL_IRET) == 0) {
if (rfs() == _ufssel)
@@ -2637,6 +2636,13 @@ set_pcb_flags(struct pcb *pcb, const u_int flags)
} else {
set_pcb_flags_raw(pcb, flags);
}
+}
+
+DEFINE_IFUNC(, void, set_pcb_flags, (struct pcb *, const u_int), static)
+{
+
+ return ((cpu_stdext_feature & CPUID_STDEXT_FSGSBASE) != 0 ?
+ set_pcb_flags_fsgsbase : set_pcb_flags_raw);
}
void
More information about the svn-src-head
mailing list