1345703Skib/*- 2345703Skib * SPDX-License-Identifier: BSD-2-Clause-FreeBSD 3345703Skib * 4345703Skib * Copyright (c) 2019 The FreeBSD Foundation 5345703Skib * 6345703Skib * This software was developed by Konstantin Belousov <kib@FreeBSD.org> 7345703Skib * under sponsorship from the FreeBSD Foundation. 8345703Skib * 9345703Skib * Redistribution and use in source and binary forms, with or without 10345703Skib * modification, are permitted provided that the following conditions 11345703Skib * are met: 12345703Skib * 1. Redistributions of source code must retain the above copyright 13345703Skib * notice, this list of conditions and the following disclaimer. 14345703Skib * 2. Redistributions in binary form must reproduce the above copyright 15345703Skib * notice, this list of conditions and the following disclaimer in the 16345703Skib * documentation and/or other materials provided with the distribution. 17345703Skib * 18345703Skib * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 19345703Skib * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 20345703Skib * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 21345703Skib * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 22345703Skib * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 23345703Skib * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 24345703Skib * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 25345703Skib * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 26345703Skib * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 27345703Skib * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 28345703Skib * SUCH DAMAGE. 29345703Skib * 30345703Skib * $FreeBSD: stable/11/lib/libc/mips/static_tls.h 346156 2019-04-12 15:15:27Z kib $ 31345703Skib */ 32345703Skib 33345703Skib#ifndef _LIBC_MIPS_STATIC_TLS_H 34345703Skib#define _LIBC_MIPS_STATIC_TLS_H 35345703Skib 36345703Skib#include <machine/tls.h> 37345703Skib 38345703Skibstatic __inline uintptr_t 39345703Skib_libc_get_static_tls_base(size_t offset) 40345703Skib{ 41345703Skib uintptr_t tlsbase; 42345703Skib 43345703Skib#if defined(__mips_n64) 44345703Skib __asm__ __volatile__ ( 45345703Skib ".set\tpush\n\t" 46345703Skib ".set\tmips64r2\n\t" 47345703Skib "rdhwr\t%0, $29\n\t" 48345703Skib ".set\tpop" 49345703Skib : "=r" (tlsbase)); 50345703Skib tlsbase -= TLS_TP_OFFSET + TLS_TCB_SIZE; 51345703Skib#else /* mips 32 */ 52345703Skib __asm__ __volatile__ ( 53345703Skib ".set\tpush\n\t" 54345703Skib ".set\tmips32r2\n\t" 55345703Skib "rdhwr\t%0, $29\n\t" 56345703Skib ".set\tpop" 57345703Skib : "=r" (tlsbase)); 58345703Skib tlsbase -= TLS_TP_OFFSET + TLS_TCB_SIZE; 59345703Skib#endif /* ! __mips_n64 */ 60345703Skib tlsbase += offset; 61345703Skib return (tlsbase); 62345703Skib} 63345703Skib 64345703Skib#endif 65