1/* 2 * SPDX-License-Identifier: BSD-3-Clause 3 * 4 * Copyright © 2020 Keith Packard 5 * 6 * Redistribution and use in source and binary forms, with or without 7 * modification, are permitted provided that the following conditions 8 * are met: 9 * 10 * 1. Redistributions of source code must retain the above copyright 11 * notice, this list of conditions and the following disclaimer. 12 * 13 * 2. Redistributions in binary form must reproduce the above 14 * copyright notice, this list of conditions and the following 15 * disclaimer in the documentation and/or other materials provided 16 * with the distribution. 17 * 18 * 3. Neither the name of the copyright holder nor the names of its 19 * contributors may be used to endorse or promote products derived 20 * from this software without specific prior written permission. 21 * 22 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 23 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 24 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 25 * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE 26 * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, 27 * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 28 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 29 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 30 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 31 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 32 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED 33 * OF THE POSSIBILITY OF SUCH DAMAGE. 34 */ 35#include "arm_tls.h" 36/* 37 * This cannot be a C ABI function as the compiler assumes that it 38 * does not modify anything other than r0 and lr. 39 */ 40 .syntax unified 41 .text 42 .align 4 43 .p2align 4,,15 44 .global __aeabi_read_tp 45 .type __aeabi_read_tp,%function 46#ifdef __thumb__ 47 .thumb 48#endif 49 50__aeabi_read_tp: 51 .cfi_sections .debug_frame 52 .cfi_startproc 53#ifdef ARM_TLS_CP15 54 mrc 15, 0, r0, c13, c0, 3 55#else 56 /* Load the address of __tls */ 57 ldr r0,1f 58 /* Dereference to get the value of __tls */ 59 ldr r0,[r0] 60#endif 61 /* All done, return to caller */ 62 bx lr 63 .cfi_endproc 64 65 /* Holds the address of __tls */ 66 .align 2 67#ifndef ARM_TLS_CP15 681: .word __tls 69#endif 70