static_tls.h revision 346156
1169691Skan/*-
2169691Skan * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
3169691Skan *
4169691Skan * Copyright (c) 2019 The FreeBSD Foundation
5169691Skan *
6169691Skan * This software was developed by Konstantin Belousov <kib@FreeBSD.org>
7169691Skan * under sponsorship from the FreeBSD Foundation.
8169691Skan *
9169691Skan * Redistribution and use in source and binary forms, with or without
10169691Skan * modification, are permitted provided that the following conditions
11169691Skan * are met:
12169691Skan * 1. Redistributions of source code must retain the above copyright
13169691Skan *    notice, this list of conditions and the following disclaimer.
14169691Skan * 2. Redistributions in binary form must reproduce the above copyright
15169691Skan *    notice, this list of conditions and the following disclaimer in the
16169691Skan *    documentation and/or other materials provided with the distribution.
17169691Skan *
18169691Skan * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
19169691Skan * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
20169691Skan * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
21169691Skan * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
22169691Skan * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
23169691Skan * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
24169691Skan * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
25169691Skan * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
26169691Skan * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
27169691Skan * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
28169691Skan * SUCH DAMAGE.
29169691Skan *
30169691Skan * $FreeBSD: stable/11/lib/libc/arm/static_tls.h 346156 2019-04-12 15:15:27Z kib $
31169691Skan */
32169691Skan
33169691Skan#ifndef _LIBC_ARM_STATIC_TLS_H
34169691Skan#define _LIBC_ARM_STATIC_TLS_H
35169691Skan
36169691Skanstatic __inline uintptr_t
37169691Skan_libc_get_static_tls_base(size_t offset)
38169691Skan{
39169691Skan	uintptr_t tlsbase;
40169691Skan
41169691Skan#ifdef ARM_TP_ADDRESS
42169691Skan	tlsbase = *(uintptr_t *)ARM_TP_ADDRESS;
43169691Skan#else
44169691Skan	__asm __volatile("mrc  p15, 0, %0, c13, c0, 3" : "=r" (tlsbase));
45169691Skan#endif
46169691Skan
47169691Skan	tlsbase += offset;
48169691Skan	return (tlsbase);
49169691Skan}
50169691Skan
51169691Skan#endif
52169691Skan