1322763Skib/*- 2322763Skib * Copyright (c) 2017 The FreeBSD Foundation 3322763Skib * All rights reserved. 4322763Skib * 5322763Skib * This software was developed by Konstantin Belousov <kib@FreeBSD.org> 6322763Skib * under sponsorship from the FreeBSD Foundation. 7322763Skib * 8322763Skib * Redistribution and use in source and binary forms, with or without 9322763Skib * modification, are permitted provided that the following conditions 10322763Skib * are met: 11322763Skib * 1. Redistributions of source code must retain the above copyright 12322763Skib * notice, this list of conditions and the following disclaimer. 13322763Skib * 2. Redistributions in binary form must reproduce the above copyright 14322763Skib * notice, this list of conditions and the following disclaimer in the 15322763Skib * documentation and/or other materials provided with the distribution. 16322763Skib * 17322763Skib * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 18322763Skib * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 19322763Skib * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 20322763Skib * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 21322763Skib * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 22322763Skib * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 23322763Skib * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 24322763Skib * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 25322763Skib * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 26322763Skib * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 27322763Skib * SUCH DAMAGE. 28322763Skib */ 29322763Skib 30322763Skib#include <sys/cdefs.h> 31322763Skib__FBSDID("$FreeBSD: stable/11/lib/libc/amd64/sys/amd64_detect_rdfsgsbase.c 323538 2017-09-13 11:29:48Z kib $"); 32322763Skib 33322763Skib#define IN_RTLD 1 34322763Skib#include <sys/param.h> 35322763Skib#undef IN_RTLD 36322763Skib#include <machine/cpufunc.h> 37322763Skib#include <machine/specialreg.h> 38322763Skib#include "amd64_detect_rdfsgsbase.h" 39322763Skib#include "libc_private.h" 40322763Skib 41322763Skibstatic int state = RDFSGS_UNKNOWN; 42322763Skib 43322763Skibint 44322763Skibamd64_detect_rdfsgsbase(void) 45322763Skib{ 46322763Skib u_int p[4]; 47322763Skib 48322763Skib if (__predict_true(state != RDFSGS_UNKNOWN)) 49322763Skib return (state); 50322763Skib 51323538Skib if (__getosreldate() >= P_OSREL_WRFSBASE || 52323538Skib (P_OSREL_MAJOR(__getosreldate()) == 11 && __getosreldate() >= 53323538Skib P_OSREL_WRFSBASE_11)) { 54322763Skib do_cpuid(0x0, p); 55322763Skib if (p[0] >= 0x7) { 56322763Skib cpuid_count(0x7, 0x0, p); 57322763Skib if ((p[1] & CPUID_STDEXT_FSGSBASE) != 0) { 58322763Skib state = RDFSGS_SUPPORTED; 59322763Skib return (state); 60322763Skib } 61322763Skib } 62322763Skib } 63322763Skib state = RDFSGS_UNSUPPORTED; 64322763Skib return (state); 65322763Skib} 66