1*5a6a4fb2SDmitry Chagin/*- 2*5a6a4fb2SDmitry Chagin * SPDX-License-Identifier: BSD-2-Clause-FreeBSD 3*5a6a4fb2SDmitry Chagin * 4*5a6a4fb2SDmitry Chagin * Copyright (c) 2021 The FreeBSD Foundation 5*5a6a4fb2SDmitry Chagin * Copyright (c) 2022 Dmitry Chagin <dchagin@FreeBSD.org> 6*5a6a4fb2SDmitry Chagin * 7*5a6a4fb2SDmitry Chagin * Portions of this software were developed by Konstantin Belousov 8*5a6a4fb2SDmitry Chagin * under sponsorship from the FreeBSD Foundation. 9*5a6a4fb2SDmitry Chagin * 10*5a6a4fb2SDmitry Chagin * Redistribution and use in source and binary forms, with or without 11*5a6a4fb2SDmitry Chagin * modification, are permitted provided that the following conditions 12*5a6a4fb2SDmitry Chagin * are met: 13*5a6a4fb2SDmitry Chagin * 1. Redistributions of source code must retain the above copyright 14*5a6a4fb2SDmitry Chagin * notice, this list of conditions and the following disclaimer. 15*5a6a4fb2SDmitry Chagin * 2. Redistributions in binary form must reproduce the above copyright 16*5a6a4fb2SDmitry Chagin * notice, this list of conditions and the following disclaimer in the 17*5a6a4fb2SDmitry Chagin * documentation and/or other materials provided with the distribution. 18*5a6a4fb2SDmitry Chagin * 19*5a6a4fb2SDmitry Chagin * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 20*5a6a4fb2SDmitry Chagin * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 21*5a6a4fb2SDmitry Chagin * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 22*5a6a4fb2SDmitry Chagin * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 23*5a6a4fb2SDmitry Chagin * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 24*5a6a4fb2SDmitry Chagin * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 25*5a6a4fb2SDmitry Chagin * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 26*5a6a4fb2SDmitry Chagin * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 27*5a6a4fb2SDmitry Chagin * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 28*5a6a4fb2SDmitry Chagin * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 29*5a6a4fb2SDmitry Chagin * SUCH DAMAGE. 30*5a6a4fb2SDmitry Chagin */ 31*5a6a4fb2SDmitry Chagin 32*5a6a4fb2SDmitry Chagin#include <x86/linux/linux_x86.h> 33*5a6a4fb2SDmitry Chagin 34*5a6a4fb2SDmitry Chaginstatic int 35*5a6a4fb2SDmitry Chagin__vdso_getcpu_rdpid(void) 36*5a6a4fb2SDmitry Chagin{ 37*5a6a4fb2SDmitry Chagin register_t res; 38*5a6a4fb2SDmitry Chagin 39*5a6a4fb2SDmitry Chagin __asm("rdpid %0" : "=r" (res)); 40*5a6a4fb2SDmitry Chagin return ((int)res); 41*5a6a4fb2SDmitry Chagin} 42*5a6a4fb2SDmitry Chagin 43*5a6a4fb2SDmitry Chaginstatic int 44*5a6a4fb2SDmitry Chagin__vdso_getcpu_rdtscp(void) 45*5a6a4fb2SDmitry Chagin{ 46*5a6a4fb2SDmitry Chagin int res; 47*5a6a4fb2SDmitry Chagin 48*5a6a4fb2SDmitry Chagin __asm("rdtscp" : "=c" (res) : : "eax", "edx"); 49*5a6a4fb2SDmitry Chagin return (res); 50*5a6a4fb2SDmitry Chagin} 51*5a6a4fb2SDmitry Chagin 52*5a6a4fb2SDmitry Chaginstatic int 53*5a6a4fb2SDmitry Chagin__vdso_getcpu_try(void) 54*5a6a4fb2SDmitry Chagin{ 55*5a6a4fb2SDmitry Chagin int res; 56*5a6a4fb2SDmitry Chagin 57*5a6a4fb2SDmitry Chagin switch (kern_cpu_selector) { 58*5a6a4fb2SDmitry Chagin case LINUX_VDSO_CPU_RDTSCP: 59*5a6a4fb2SDmitry Chagin res = __vdso_getcpu_rdtscp(); 60*5a6a4fb2SDmitry Chagin break; 61*5a6a4fb2SDmitry Chagin case LINUX_VDSO_CPU_RDPID: 62*5a6a4fb2SDmitry Chagin res = __vdso_getcpu_rdpid(); 63*5a6a4fb2SDmitry Chagin break; 64*5a6a4fb2SDmitry Chagin default: 65*5a6a4fb2SDmitry Chagin res = -1; 66*5a6a4fb2SDmitry Chagin } 67*5a6a4fb2SDmitry Chagin return (res); 68*5a6a4fb2SDmitry Chagin} 69