]> git.proxmox.com Git - mirror_edk2.git/blame - ArmPkg/Include/AsmMacroIoLibV8.h
ArmPkg: Purge unused/unneeded CPU-specific header files
[mirror_edk2.git] / ArmPkg / Include / AsmMacroIoLibV8.h
CommitLineData
25402f5d 1/** @file\r
5f1103bd 2 Macros to work around lack of Clang support for LDR register, =expr\r
25402f5d
HL
3\r
4 Copyright (c) 2008 - 2009, Apple Inc. All rights reserved.<BR>\r
0a6f2862 5 Portions copyright (c) 2011 - 2014, ARM Ltd. All rights reserved.<BR>\r
25402f5d
HL
6\r
7 This program and the accompanying materials\r
8 are licensed and made available under the terms and conditions of the BSD License\r
9 which accompanies this distribution. The full text of the license may be found at\r
10 http://opensource.org/licenses/bsd-license.php\r
11\r
12 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
13 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
14\r
15**/\r
16\r
17\r
18#ifndef __MACRO_IO_LIBV8_H__\r
19#define __MACRO_IO_LIBV8_H__\r
20\r
25402f5d
HL
21#define SetPrimaryStack(StackTop, GlobalSize, Tmp, Tmp1) \\r
22 ands Tmp, GlobalSize, #15 ; \\r
23 mov Tmp1, #16 ; \\r
24 sub Tmp1, Tmp1, Tmp ; \\r
25 csel Tmp, Tmp1, Tmp, ne ; \\r
26 add GlobalSize, GlobalSize, Tmp ; \\r
27 sub sp, StackTop, GlobalSize ; \\r
28 ; \\r
29 mov Tmp, sp ; \\r
30 mov GlobalSize, #0x0 ; \\r
31_SetPrimaryStackInitGlobals: ; \\r
32 cmp Tmp, StackTop ; \\r
33 b.eq _SetPrimaryStackEnd ; \\r
34 str GlobalSize, [Tmp], #8 ; \\r
35 b _SetPrimaryStackInitGlobals ; \\r
36_SetPrimaryStackEnd:\r
37\r
38// Initialize the Global Variable with '0'\r
39#define InitializePrimaryStack(GlobalSize, Tmp1, Tmp2) \\r
40 and Tmp1, GlobalSize, #15 ; \\r
41 mov Tmp2, #16 ; \\r
42 sub Tmp2, Tmp2, Tmp1 ; \\r
43 add GlobalSize, GlobalSize, Tmp2 ; \\r
44 ; \\r
45 mov Tmp1, sp ; \\r
46 sub sp, sp, GlobalSize ; \\r
47 mov GlobalSize, #0x0 ; \\r
48_InitializePrimaryStackLoop: ; \\r
49 mov Tmp2, sp ; \\r
50 cmp Tmp1, Tmp2 ; \\r
51 bls _InitializePrimaryStackEnd ; \\r
52 str GlobalSize, [Tmp1, #-8]! ; \\r
53 b _InitializePrimaryStackLoop ; \\r
54_InitializePrimaryStackEnd:\r
55\r
56// CurrentEL : 0xC = EL3; 8 = EL2; 4 = EL1\r
57// This only selects between EL1 and EL2, else we die.\r
58// Provide the Macro with a safe temp xreg to use.\r
59#define EL1_OR_EL2(SAFE_XREG) \\r
60 mrs SAFE_XREG, CurrentEL ;\\r
eaa84fd5
OM
61 cmp SAFE_XREG, #0x8 ;\\r
62 b.eq 2f ;\\r
63 cmp SAFE_XREG, #0x4 ;\\r
64 b.ne . ;// We should never get here\r
65// EL1 code starts here\r
25402f5d
HL
66\r
67// CurrentEL : 0xC = EL3; 8 = EL2; 4 = EL1\r
68// This only selects between EL1 and EL2 and EL3, else we die.\r
69// Provide the Macro with a safe temp xreg to use.\r
eaa84fd5 70#define EL1_OR_EL2_OR_EL3(SAFE_XREG) \\r
25402f5d 71 mrs SAFE_XREG, CurrentEL ;\\r
eaa84fd5
OM
72 cmp SAFE_XREG, #0xC ;\\r
73 b.eq 3f ;\\r
74 cmp SAFE_XREG, #0x8 ;\\r
75 b.eq 2f ;\\r
25402f5d 76 cmp SAFE_XREG, #0x4 ;\\r
eaa84fd5
OM
77 b.ne . ;// We should never get here\r
78// EL1 code starts here\r
5f1103bd
OM
79#if defined(__clang__)\r
80\r
81// load x0 with _Data\r
82#define LoadConstant(_Data) \\r
83 ldr x0, 1f ; \\r
84 b 2f ; \\r
85.align(8) ; \\r
861: \\r
87 .8byte (_Data) ; \\r
882:\r
89\r
90// load _Reg with _Data\r
91#define LoadConstantToReg(_Data, _Reg) \\r
92 ldr _Reg, 1f ; \\r
93 b 2f ; \\r
94.align(8) ; \\r
951: \\r
96 .8byte (_Data) ; \\r
972:\r
98\r
99#elif defined (__GNUC__)\r
25402f5d 100\r
5f1103bd
OM
101#define LoadConstant(Data) \\r
102 ldr x0, =Data\r
25402f5d 103\r
5f1103bd
OM
104#define LoadConstantToReg(Data, Reg) \\r
105 ldr Reg, =Data\r
25402f5d 106\r
5f1103bd 107#endif // __GNUC__\r
25402f5d
HL
108\r
109#endif // __MACRO_IO_LIBV8_H__\r
110\r