X-Git-Url: https://git.proxmox.com/?a=blobdiff_plain;f=ArmPkg%2FInclude%2FAsmMacroIoLibV8.h;h=db43d3b52e5a0ab80e509d48bef22110110f0685;hb=11cf25f030eb9b9a4541b35791c46d85709173f2;hp=78a033cb4fdf97051bc3aa5608960da8c3428ecb;hpb=0a6f286257da8a9082bcffb4bcbe62bb01468dfb;p=mirror_edk2.git diff --git a/ArmPkg/Include/AsmMacroIoLibV8.h b/ArmPkg/Include/AsmMacroIoLibV8.h index 78a033cb4f..db43d3b52e 100644 --- a/ArmPkg/Include/AsmMacroIoLibV8.h +++ b/ArmPkg/Include/AsmMacroIoLibV8.h @@ -1,8 +1,9 @@ /** @file - Macros to work around lack of Apple support for LDR register, =expr + Macros to work around lack of Clang support for LDR register, =expr Copyright (c) 2008 - 2009, Apple Inc. All rights reserved.
Portions copyright (c) 2011 - 2014, ARM Ltd. All rights reserved.
+ Copyright (c) 2016, Linaro Ltd. All rights reserved.
This program and the accompanying materials are licensed and made available under the terms and conditions of the BSD License @@ -18,118 +19,45 @@ #ifndef __MACRO_IO_LIBV8_H__ #define __MACRO_IO_LIBV8_H__ -#if defined (__GNUC__) - -#define MmioWrite32(Address, Data) \ - ldr x1, =Address ; \ - ldr w0, =Data ; \ - str w0, [x1] - -#define MmioOr32(Address, OrData) \ - ldr x1, =Address ; \ - ldr w2, =OrData ; \ - ldr w0, [x1] ; \ - orr w0, w0, w2 ; \ - str w0, [x1] - -#define MmioAnd32(Address, AndData) \ - ldr x1, =Address ; \ - ldr w2, =AndData ; \ - ldr w0, [x1] ; \ - and w0, w0, w2 ; \ - str w0, [x1] - -#define MmioAndThenOr32(Address, AndData, OrData) \ - ldr x1, =Address ; \ - ldr w0, [x1] ; \ - ldr w2, =AndData ; \ - and w0, w0, w2 ; \ - ldr w2, =OrData ; \ - orr w0, w0, w2 ; \ - str w0, [x1] - -#define MmioWriteFromReg32(Address, Reg) \ - ldr x1, =Address ; \ - str Reg, [x1] - -#define MmioRead32(Address) \ - ldr x1, =Address ; \ - ldr w0, [x1] - -#define MmioReadToReg32(Address, Reg) \ - ldr x1, =Address ; \ - ldr Reg, [x1] - -#define LoadConstant(Data) \ - ldr x0, =Data - -#define LoadConstantToReg(Data, Reg) \ - ldr Reg, =Data - -#define SetPrimaryStack(StackTop, GlobalSize, Tmp, Tmp1) \ - ands Tmp, GlobalSize, #15 ; \ - mov Tmp1, #16 ; \ - sub Tmp1, Tmp1, Tmp ; \ - csel Tmp, Tmp1, Tmp, ne ; \ - add GlobalSize, GlobalSize, Tmp ; \ - sub sp, StackTop, GlobalSize ; \ - ; \ - mov Tmp, sp ; \ - mov GlobalSize, #0x0 ; \ -_SetPrimaryStackInitGlobals: ; \ - cmp Tmp, StackTop ; \ - b.eq _SetPrimaryStackEnd ; \ - str GlobalSize, [Tmp], #8 ; \ - b _SetPrimaryStackInitGlobals ; \ -_SetPrimaryStackEnd: - -// Initialize the Global Variable with '0' -#define InitializePrimaryStack(GlobalSize, Tmp1, Tmp2) \ - and Tmp1, GlobalSize, #15 ; \ - mov Tmp2, #16 ; \ - sub Tmp2, Tmp2, Tmp1 ; \ - add GlobalSize, GlobalSize, Tmp2 ; \ - ; \ - mov Tmp1, sp ; \ - sub sp, sp, GlobalSize ; \ - mov GlobalSize, #0x0 ; \ -_InitializePrimaryStackLoop: ; \ - mov Tmp2, sp ; \ - cmp Tmp1, Tmp2 ; \ - bls _InitializePrimaryStackEnd ; \ - str GlobalSize, [Tmp1, #-8]! ; \ - b _InitializePrimaryStackLoop ; \ -_InitializePrimaryStackEnd: - // CurrentEL : 0xC = EL3; 8 = EL2; 4 = EL1 // This only selects between EL1 and EL2, else we die. // Provide the Macro with a safe temp xreg to use. #define EL1_OR_EL2(SAFE_XREG) \ mrs SAFE_XREG, CurrentEL ;\ - cmp SAFE_XREG, #0x4 ;\ - b.eq 1f ;\ - cmp SAFE_XREG, #0x8 ;\ - b.eq 2f ;\ - b dead ;// We should never get here. + cmp SAFE_XREG, #0x8 ;\ + b.gt . ;\ + b.eq 2f ;\ + cbnz SAFE_XREG, 1f ;\ + b . ;// We should never get here + // CurrentEL : 0xC = EL3; 8 = EL2; 4 = EL1 // This only selects between EL1 and EL2 and EL3, else we die. // Provide the Macro with a safe temp xreg to use. -#define EL1_OR_EL2_OR_EL3(SAFE_XREG) \ +#define EL1_OR_EL2_OR_EL3(SAFE_XREG) \ mrs SAFE_XREG, CurrentEL ;\ - cmp SAFE_XREG, #0x4 ;\ - b.eq 1f ;\ - cmp SAFE_XREG, #0x8 ;\ - b.eq 2f ;\ - cmp SAFE_XREG, #0xC ;\ - b.eq 3f ;\ - b dead ;// We should never get here. - -#else - -#error RVCT AArch64 tool chain is not supported - -#endif // __GNUC__ + cmp SAFE_XREG, #0x8 ;\ + b.gt 3f ;\ + b.eq 2f ;\ + cbnz SAFE_XREG, 1f ;\ + b . ;// We should never get here + +#define _ASM_FUNC(Name, Section) \ + .global Name ; \ + .section #Section, "ax" ; \ + .type Name, %function ; \ + Name: + +#define ASM_FUNC(Name) _ASM_FUNC(ASM_PFX(Name), .text. ## Name) + +#define MOV32(Reg, Val) \ + movz Reg, (Val) >> 16, lsl #16 ; \ + movk Reg, (Val) & 0xffff + +#define MOV64(Reg, Val) \ + movz Reg, (Val) >> 48, lsl #48 ; \ + movk Reg, ((Val) >> 32) & 0xffff, lsl #32 ; \ + movk Reg, ((Val) >> 16) & 0xffff, lsl #16 ; \ + movk Reg, (Val) & 0xffff #endif // __MACRO_IO_LIBV8_H__ -