1*8afae0caSJessica Clarke /*- 2*8afae0caSJessica Clarke * Copyright (c) 2015-2018 The FreeBSD Foundation 3*8afae0caSJessica Clarke * Copyright (c) 2024 Jessica Clarke <jrtc27@FreeBSD.org> 4*8afae0caSJessica Clarke * 5*8afae0caSJessica Clarke * Part of this software was developed by Konstantin Belousov <kib@FreeBSD.org> 6*8afae0caSJessica Clarke * under sponsorship from the FreeBSD Foundation. 7*8afae0caSJessica Clarke * 8*8afae0caSJessica Clarke * Redistribution and use in source and binary forms, with or without 9*8afae0caSJessica Clarke * modification, are permitted provided that the following conditions 10*8afae0caSJessica Clarke * are met: 11*8afae0caSJessica Clarke * 1. Redistributions of source code must retain the above copyright 12*8afae0caSJessica Clarke * notice, this list of conditions and the following disclaimer. 13*8afae0caSJessica Clarke * 2. Redistributions in binary form must reproduce the above copyright 14*8afae0caSJessica Clarke * notice, this list of conditions and the following disclaimer in the 15*8afae0caSJessica Clarke * documentation and/or other materials provided with the distribution. 16*8afae0caSJessica Clarke * 17*8afae0caSJessica Clarke * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 18*8afae0caSJessica Clarke * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 19*8afae0caSJessica Clarke * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 20*8afae0caSJessica Clarke * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 21*8afae0caSJessica Clarke * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 22*8afae0caSJessica Clarke * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 23*8afae0caSJessica Clarke * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 24*8afae0caSJessica Clarke * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 25*8afae0caSJessica Clarke * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 26*8afae0caSJessica Clarke * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 27*8afae0caSJessica Clarke * SUCH DAMAGE. 28*8afae0caSJessica Clarke */ 29*8afae0caSJessica Clarke 30*8afae0caSJessica Clarke #ifndef __RISCV_IFUNC_H 31*8afae0caSJessica Clarke #define __RISCV_IFUNC_H 32*8afae0caSJessica Clarke 33*8afae0caSJessica Clarke #define DEFINE_IFUNC(qual, ret_type, name, args) \ 34*8afae0caSJessica Clarke static ret_type (*name##_resolver(void))args __used; \ 35*8afae0caSJessica Clarke qual ret_type name args __attribute__((ifunc(#name "_resolver"))); \ 36*8afae0caSJessica Clarke static ret_type (*name##_resolver(void))args 37*8afae0caSJessica Clarke 38*8afae0caSJessica Clarke #define DEFINE_UIFUNC(qual, ret_type, name, args) \ 39*8afae0caSJessica Clarke static ret_type (*name##_resolver(unsigned long, unsigned long, \ 40*8afae0caSJessica Clarke unsigned long, unsigned long, unsigned long, unsigned long, \ 41*8afae0caSJessica Clarke unsigned long, unsigned long))args __used; \ 42*8afae0caSJessica Clarke qual ret_type name args __attribute__((ifunc(#name "_resolver"))); \ 43*8afae0caSJessica Clarke static ret_type (*name##_resolver(unsigned long elf_hwcap __unused, \ 44*8afae0caSJessica Clarke unsigned long _arg2 __unused, unsigned long _arg3 __unused, \ 45*8afae0caSJessica Clarke unsigned long _arg4 __unused, unsigned long _arg5 __unused, \ 46*8afae0caSJessica Clarke unsigned long _arg6 __unused, unsigned long _arg7 __unused, \ 47*8afae0caSJessica Clarke unsigned long _arg8 __unused))args 48*8afae0caSJessica Clarke 49*8afae0caSJessica Clarke #endif 50