1/* 2 * Copyright (c) 2013-2019 Huawei Technologies Co., Ltd. All rights reserved. 3 * Copyright (c) 2020-2023 Huawei Device Co., Ltd. All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without modification, 6 * are permitted provided that the following conditions are met: 7 * 8 * 1. Redistributions of source code must retain the above copyright notice, this list of 9 * conditions and the following disclaimer. 10 * 11 * 2. Redistributions in binary form must reproduce the above copyright notice, this list 12 * of conditions and the following disclaimer in the documentation and/or other materials 13 * provided with the distribution. 14 * 15 * 3. Neither the name of the copyright holder nor the names of its contributors may be used 16 * to endorse or promote products derived from this software without specific prior written 17 * permission. 18 * 19 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 20 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, 21 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 22 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR 23 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 24 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 25 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; 26 * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 27 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 28 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF 29 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 30 */ 31 32#ifndef _LOS_ARCH_H 33#define _LOS_ARCH_H 34 35#include "los_config.h" 36#include "los_timer.h" 37 38#ifdef __cplusplus 39#if __cplusplus 40extern "C" { 41#endif /* __cplusplus */ 42#endif /* __cplusplus */ 43 44#if defined(__ICCARM__) || defined(__CC_ARM) 45STATIC INLINE UINTPTR ArchSpGet(VOID) 46{ 47 UINTPTR sp; 48 __asm("mov %0, sp" : "=r" (sp)); 49 return sp; 50} 51 52STATIC INLINE UINTPTR ArchPspGet(VOID) 53{ 54 UINTPTR psp; 55 __asm("mrs %0, psp" : "=r" (psp)); 56 return psp; 57} 58 59STATIC INLINE UINTPTR ArchMspGet(VOID) 60{ 61 UINTPTR msp; 62 __asm("mrs %0, msp" : "=r" (msp)); 63 return msp; 64} 65 66#define ARCH_LR_GET() \ 67({ \ 68 UINTPTR lr; \ 69 __asm("mov %0, lr" : "=r" (lr)); \ 70 (lr); \ 71}) 72#define ArchLRGet ARCH_LR_GET 73#elif defined(__CLANG_ARM) || defined(__GNUC__) 74STATIC INLINE UINTPTR ArchSpGet(VOID) 75{ 76 UINTPTR sp; 77 __asm volatile("mov %0, sp" : "=r" (sp)); 78 return sp; 79} 80 81STATIC INLINE UINTPTR ArchPspGet(VOID) 82{ 83 UINTPTR psp; 84 __asm volatile("mrs %0, psp" : "=r" (psp)); 85 return psp; 86} 87 88STATIC INLINE UINTPTR ArchMspGet(VOID) 89{ 90 UINTPTR msp; 91 __asm volatile("mrs %0, msp" : "=r" (msp)); 92 return msp; 93} 94 95#define ARCH_LR_GET() \ 96({ \ 97 UINTPTR lr; \ 98 __asm volatile("mov %0, lr" : "=r" (lr)); \ 99 (lr); \ 100}) 101#define ArchLRGet ARCH_LR_GET 102#else 103/* Other platforms to be improved */ 104#endif 105 106VOID ArchInit(VOID); 107 108#ifdef __cplusplus 109#if __cplusplus 110} 111#endif /* __cplusplus */ 112#endif /* __cplusplus */ 113 114#endif /* _LOS_ARCH_H */ 115 116