15a6a4fb2SDmitry Chagin/*- 2*4d846d26SWarner Losh * SPDX-License-Identifier: BSD-2-Clause 35a6a4fb2SDmitry Chagin * 45a6a4fb2SDmitry Chagin * Copyright (c) 2021 The FreeBSD Foundation 55a6a4fb2SDmitry Chagin * Copyright (c) 2022 Dmitry Chagin <dchagin@FreeBSD.org> 65a6a4fb2SDmitry Chagin * 75a6a4fb2SDmitry Chagin * Portions of this software were developed by Konstantin Belousov 85a6a4fb2SDmitry Chagin * under sponsorship from the FreeBSD Foundation. 95a6a4fb2SDmitry Chagin * 105a6a4fb2SDmitry Chagin * Redistribution and use in source and binary forms, with or without 115a6a4fb2SDmitry Chagin * modification, are permitted provided that the following conditions 125a6a4fb2SDmitry Chagin * are met: 135a6a4fb2SDmitry Chagin * 1. Redistributions of source code must retain the above copyright 145a6a4fb2SDmitry Chagin * notice, this list of conditions and the following disclaimer. 155a6a4fb2SDmitry Chagin * 2. Redistributions in binary form must reproduce the above copyright 165a6a4fb2SDmitry Chagin * notice, this list of conditions and the following disclaimer in the 175a6a4fb2SDmitry Chagin * documentation and/or other materials provided with the distribution. 185a6a4fb2SDmitry Chagin * 195a6a4fb2SDmitry Chagin * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 205a6a4fb2SDmitry Chagin * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 215a6a4fb2SDmitry Chagin * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 225a6a4fb2SDmitry Chagin * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 235a6a4fb2SDmitry Chagin * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 245a6a4fb2SDmitry Chagin * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 255a6a4fb2SDmitry Chagin * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 265a6a4fb2SDmitry Chagin * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 275a6a4fb2SDmitry Chagin * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 285a6a4fb2SDmitry Chagin * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 295a6a4fb2SDmitry Chagin * SUCH DAMAGE. 305a6a4fb2SDmitry Chagin */ 315a6a4fb2SDmitry Chagin 325a6a4fb2SDmitry Chagin#include <x86/linux/linux_x86.h> 335a6a4fb2SDmitry Chagin 345a6a4fb2SDmitry Chaginstatic int 355a6a4fb2SDmitry Chagin__vdso_getcpu_rdpid(void) 365a6a4fb2SDmitry Chagin{ 375a6a4fb2SDmitry Chagin register_t res; 385a6a4fb2SDmitry Chagin 395a6a4fb2SDmitry Chagin __asm("rdpid %0" : "=r" (res)); 405a6a4fb2SDmitry Chagin return ((int)res); 415a6a4fb2SDmitry Chagin} 425a6a4fb2SDmitry Chagin 435a6a4fb2SDmitry Chaginstatic int 445a6a4fb2SDmitry Chagin__vdso_getcpu_rdtscp(void) 455a6a4fb2SDmitry Chagin{ 465a6a4fb2SDmitry Chagin int res; 475a6a4fb2SDmitry Chagin 485a6a4fb2SDmitry Chagin __asm("rdtscp" : "=c" (res) : : "eax", "edx"); 495a6a4fb2SDmitry Chagin return (res); 505a6a4fb2SDmitry Chagin} 515a6a4fb2SDmitry Chagin 525a6a4fb2SDmitry Chaginstatic int 535a6a4fb2SDmitry Chagin__vdso_getcpu_try(void) 545a6a4fb2SDmitry Chagin{ 555a6a4fb2SDmitry Chagin int res; 565a6a4fb2SDmitry Chagin 575a6a4fb2SDmitry Chagin switch (kern_cpu_selector) { 585a6a4fb2SDmitry Chagin case LINUX_VDSO_CPU_RDTSCP: 595a6a4fb2SDmitry Chagin res = __vdso_getcpu_rdtscp(); 605a6a4fb2SDmitry Chagin break; 615a6a4fb2SDmitry Chagin case LINUX_VDSO_CPU_RDPID: 625a6a4fb2SDmitry Chagin res = __vdso_getcpu_rdpid(); 635a6a4fb2SDmitry Chagin break; 645a6a4fb2SDmitry Chagin default: 655a6a4fb2SDmitry Chagin res = -1; 665a6a4fb2SDmitry Chagin } 675a6a4fb2SDmitry Chagin return (res); 685a6a4fb2SDmitry Chagin} 69