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:
parent
d3388f9153
commit
e13e892e7a
@ -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)
|
||||
{
|
||||
|
Loading…
Reference in New Issue
Block a user