]> git.proxmox.com Git - mirror_edk2.git/blame - ArmPkg/Include/AsmMacroIoLib.h
ARM Packages: Replaced the macro GetCorePositionFromMpId() by the ArmPlatformGetCoreP...
[mirror_edk2.git] / ArmPkg / Include / AsmMacroIoLib.h
CommitLineData
2ef2b01e
A
1/** @file\r
2 Macros to work around lack of Apple support for LDR register, =expr\r
3\r
d6ebcab7 4 Copyright (c) 2008 - 2009, Apple Inc. All rights reserved.<BR>\r
1377db63 5 Copyright (c) 2011-2012, ARM Ltd. All rights reserved.<BR>\r
2ef2b01e 6\r
d6ebcab7 7 This program and the accompanying materials\r
2ef2b01e
A
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_LIB_H__\r
19#define __MACRO_IO_LIB_H__\r
20\r
21#if defined(__APPLE__)\r
22\r
23//\r
24// ldr reg, =expr does not work with current Apple tool chain. So do the work our selves\r
25//\r
26\r
27// returns _Data in R0 and _Address in R1\r
28#define MmioWrite32(_Address, _Data) \\r
29 ldr r1, [pc, #8] ; \\r
30 ldr r0, [pc, #8] ; \\r
31 str r0, [r1] ; \\r
32 b 1f ; \\r
33 .long (_Address) ; \\r
34 .long (_Data) ; \\r
351:\r
36\r
37// returns _Data in R0 and _Address in R1, and _OrData in r2\r
38#define MmioOr32(_Address, _OrData) \\r
39 ldr r1, [pc, #16] ; \\r
40 ldr r2, [pc, #16] ; \\r
41 ldr r0, [r1] ; \\r
42 orr r0, r0, r2 ; \\r
43 str r0, [r1] ; \\r
44 b 1f ; \\r
45 .long (_Address) ; \\r
46 .long (_OrData) ; \\r
471:\r
48\r
49// returns _Data in R0 and _Address in R1, and _OrData in r2\r
50#define MmioAnd32(_Address, _AndData) \\r
51 ldr r1, [pc, #16] ; \\r
52 ldr r2, [pc, #16] ; \\r
53 ldr r0, [r1] ; \\r
54 and r0, r0, r2 ; \\r
55 str r0, [r1] ; \\r
56 b 1f ; \\r
57 .long (_Address) ; \\r
58 .long (_AndData) ; \\r
591:\r
60\r
61// returns result in R0, _Address in R1, and _OrData in r2\r
62#define MmioAndThenOr32(_Address, _AndData, _OrData) \\r
63 ldr r1, [pc, #24] ; \\r
64 ldr r0, [r1] ; \\r
65 ldr r2, [pc, #20] ; \\r
66 and r0, r0, r2 ; \\r
67 ldr r2, [pc, #16] ; \\r
68 orr r0, r0, r2 ; \\r
69 str r0, [r1] ; \\r
70 b 1f ; \\r
71 .long (_Address) ; \\r
72 .long (_AndData) ; \\r
73 .long (_OrData) ; \\r
741:\r
75\r
76// returns _Data in _Reg and _Address in R1\r
77#define MmioWriteFromReg32(_Address, _Reg) \\r
78 ldr r1, [pc, #4] ; \\r
79 str _Reg, [r1] ; \\r
80 b 1f ; \\r
81 .long (_Address) ; \\r
821:\r
83\r
84\r
85// returns _Data in R0 and _Address in R1\r
86#define MmioRead32(_Address) \\r
87 ldr r1, [pc, #4] ; \\r
88 ldr r0, [r1] ; \\r
89 b 1f ; \\r
90 .long (_Address) ; \\r
911:\r
92\r
93// returns _Data in Reg and _Address in R1\r
94#define MmioReadToReg32(_Address, _Reg) \\r
95 ldr r1, [pc, #4] ; \\r
96 ldr _Reg, [r1] ; \\r
97 b 1f ; \\r
98 .long (_Address) ; \\r
991:\r
100\r
101\r
102// load R0 with _Data\r
103#define LoadConstant(_Data) \\r
104 ldr r0, [pc, #0] ; \\r
105 b 1f ; \\r
106 .long (_Data) ; \\r
1071:\r
108\r
109// load _Reg with _Data\r
110#define LoadConstantToReg(_Data, _Reg) \\r
111 ldr _Reg, [pc, #0] ; \\r
112 b 1f ; \\r
113 .long (_Data) ; \\r
1141:\r
115\r
116// load _Reg with _Data if eq\r
117#define LoadConstantToRegIfEq(_Data, _Reg) \\r
118 ldreq _Reg, [pc, #0] ; \\r
119 b 1f ; \\r
120 .long (_Data) ; \\r
1211:\r
122\r
89bbce11 123// Reserve a region at the top of the Primary Core stack\r
124// for Global variables for the XIP phase\r
125#define SetPrimaryStack(StackTop, GlobalSize, Tmp) \\r
126 and Tmp, GlobalSize, #7 ; \\r
127 rsbne Tmp, Tmp, #8 ; \\r
128 add GlobalSize, GlobalSize, Tmp ; \\r
1377db63 129 sub sp, StackTop, GlobalSize ; \\r
130 ; \\r
131 mov Tmp, sp ; \\r
132 mov GlobalSize, #0x0 ; \\r
133_SetPrimaryStackInitGlobals: ; \\r
134 cmp Tmp, StackTop ; \\r
135 beq _SetPrimaryStackEnd ; \\r
136 str GlobalSize, [Tmp], #4 ; \\r
137 b _SetPrimaryStackInitGlobals ; \\r
138_SetPrimaryStackEnd:\r
89bbce11 139\r
17839a45 140// Initialize the Global Variable with '0'\r
141#define InitializePrimaryStack(GlobalSize, Tmp1) \\r
142 and Tmp1, GlobalSize, #7 ; \\r
143 rsbne Tmp1, Tmp1, #8 ; \\r
144 add GlobalSize, GlobalSize, Tmp1 ; \\r
145 ; \\r
146 mov Tmp1, sp ; \\r
147 sub sp, GlobalSize ; \\r
148 mov GlobalSize, #0x0 ; \\r
149_InitializePrimaryStackLoop: ; \\r
150 cmp Tmp1, sp ; \\r
151 bls _InitializePrimaryStackEnd ; \\r
152 str GlobalSize, [Tmp1], #-4 ; \\r
153 b _InitializePrimaryStackLoop ; \\r
154_InitializePrimaryStackEnd:\r
2ef2b01e
A
155\r
156#elif defined (__GNUC__)\r
157\r
158#define MmioWrite32(Address, Data) \\r
159 ldr r1, =Address ; \\r
160 ldr r0, =Data ; \\r
161 str r0, [r1]\r
162 \r
163#define MmioOr32(Address, OrData) \\r
164 ldr r1, =Address ; \\r
165 ldr r2, =OrData ; \\r
166 ldr r0, [r1] ; \\r
167 orr r0, r0, r2 ; \\r
168 str r0, [r1]\r
169\r
170#define MmioAnd32(Address, AndData) \\r
171 ldr r1, =Address ; \\r
172 ldr r2, =AndData ; \\r
173 ldr r0, [r1] ; \\r
174 and r0, r0, r2 ; \\r
175 str r0, [r1]\r
176\r
177#define MmioAndThenOr32(Address, AndData, OrData) \\r
178 ldr r1, =Address ; \\r
179 ldr r0, [r1] ; \\r
180 ldr r2, =AndData ; \\r
181 and r0, r0, r2 ; \\r
182 ldr r2, =OrData ; \\r
183 orr r0, r0, r2 ; \\r
184 str r0, [r1] \r
185\r
186#define MmioWriteFromReg32(Address, Reg) \\r
187 ldr r1, =Address ; \\r
188 str Reg, [r1]\r
189\r
190#define MmioRead32(Address) \\r
191 ldr r1, =Address ; \\r
192 ldr r0, [r1]\r
193\r
194#define MmioReadToReg32(Address, Reg) \\r
195 ldr r1, =Address ; \\r
196 ldr Reg, [r1]\r
197\r
198#define LoadConstant(Data) \\r
199 ldr r0, =Data\r
200\r
201#define LoadConstantToReg(Data, Reg) \\r
202 ldr Reg, =Data\r
bebda7ce 203\r
2dbcb8f0 204#define SetPrimaryStack(StackTop, GlobalSize, Tmp) \\r
205 and Tmp, GlobalSize, #7 ; \\r
206 rsbne Tmp, Tmp, #8 ; \\r
207 add GlobalSize, GlobalSize, Tmp ; \\r
1377db63 208 sub sp, StackTop, GlobalSize ; \\r
209 ; \\r
210 mov Tmp, sp ; \\r
211 mov GlobalSize, #0x0 ; \\r
212_SetPrimaryStackInitGlobals: ; \\r
213 cmp Tmp, StackTop ; \\r
214 beq _SetPrimaryStackEnd ; \\r
215 str GlobalSize, [Tmp], #4 ; \\r
216 b _SetPrimaryStackInitGlobals ; \\r
217_SetPrimaryStackEnd:\r
2dbcb8f0 218\r
17839a45 219// Initialize the Global Variable with '0'\r
220#define InitializePrimaryStack(GlobalSize, Tmp1) \\r
221 and Tmp1, GlobalSize, #7 ; \\r
222 rsbne Tmp1, Tmp1, #8 ; \\r
223 add GlobalSize, GlobalSize, Tmp1 ; \\r
224 ; \\r
225 mov Tmp1, sp ; \\r
226 sub sp, GlobalSize ; \\r
227 mov GlobalSize, #0x0 ; \\r
228_InitializePrimaryStackLoop: ; \\r
229 cmp Tmp1, sp ; \\r
230 bls _InitializePrimaryStackEnd ; \\r
231 str GlobalSize, [Tmp1], #-4 ; \\r
232 b _InitializePrimaryStackLoop ; \\r
233_InitializePrimaryStackEnd:\r
234\r
2ef2b01e
A
235#else\r
236\r
237//\r
238// Use ARM assembly macros, form armasam \r
239//\r
240// Less magic in the macros if ldr reg, =expr works\r
241//\r
242\r
243// returns _Data in R0 and _Address in R1\r
244\r
245\r
246\r
247#define MmioWrite32(Address, Data) MmioWrite32Macro Address, Data\r
248\r
249\r
250\r
251\r
252// returns Data in R0 and Address in R1, and OrData in r2\r
253#define MmioOr32(Address, OrData) MmioOr32Macro Address, OrData\r
254 \r
255\r
256// returns _Data in R0 and _Address in R1, and _OrData in r2\r
257\r
258\r
259#define MmioAnd32(Address, AndData) MmioAnd32Macro Address, AndData\r
260\r
261// returns result in R0, _Address in R1, and _OrData in r2\r
262\r
263\r
264#define MmioAndThenOr32(Address, AndData, OrData) MmioAndThenOr32Macro Address, AndData, OrData\r
265\r
266\r
267// returns _Data in _Reg and _Address in R1\r
268\r
269\r
270#define MmioWriteFromReg32(Address, Reg) MmioWriteFromReg32Macro Address, Reg\r
271\r
272// returns _Data in R0 and _Address in R1\r
273\r
274\r
275#define MmioRead32(Address) MmioRead32Macro Address\r
276\r
277// returns _Data in Reg and _Address in R1\r
278\r
279\r
280#define MmioReadToReg32(Address, Reg) MmioReadToReg32Macro Address, Reg\r
281\r
282\r
283// load R0 with _Data\r
284\r
285\r
286#define LoadConstant(Data) LoadConstantMacro Data\r
287\r
288// load _Reg with _Data\r
289\r
290\r
291#define LoadConstantToReg(Data, Reg) LoadConstantToRegMacro Data, Reg\r
292\r
293// conditional load testing eq flag\r
294#define LoadConstantToRegIfEq(Data, Reg) LoadConstantToRegIfEqMacro Data, Reg\r
295\r
2dbcb8f0 296#define SetPrimaryStack(StackTop,GlobalSize,Tmp) SetPrimaryStack StackTop, GlobalSize, Tmp\r
2ef2b01e 297\r
17839a45 298// Initialize the Global Variable with '0'\r
299#define InitializePrimaryStack(GlobalSize, Tmp1) InitializePrimaryStack GlobalSize, Tmp1\r
300\r
2dbcb8f0 301#endif\r
2ef2b01e
A
302\r
303#endif\r