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
This commit is contained in:
Konstantin Belousov 2018-10-29 23:52:31 +00:00
parent 6d7f919489
commit 9775a6ebd2
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=339895

View File

@ -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)
@ -2639,6 +2638,13 @@ set_pcb_flags(struct pcb *pcb, const u_int 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
clear_pcb_flags(struct pcb *pcb, const u_int flags)
{