X-Git-Url: https://git.proxmox.com/?a=blobdiff_plain;f=ArmPkg%2FInclude%2FAsmMacroIoLibV8.h;h=db43d3b52e5a0ab80e509d48bef22110110f0685;hb=65e984cd8ad8ee0999f8b360372db647f031c806;hp=2ee1081632bafd1be1352d179e6c841ae21672c9;hpb=5f1103bd1e247b129a05d19899af56b5d245f19c;p=mirror_edk2.git diff --git a/ArmPkg/Include/AsmMacroIoLibV8.h b/ArmPkg/Include/AsmMacroIoLibV8.h index 2ee1081632..db43d3b52e 100644 --- a/ArmPkg/Include/AsmMacroIoLibV8.h +++ b/ArmPkg/Include/AsmMacroIoLibV8.h @@ -3,6 +3,7 @@ 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,93 +19,45 @@ #ifndef __MACRO_IO_LIBV8_H__ #define __MACRO_IO_LIBV8_H__ -#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, #0x8 ;\ + b.gt . ;\ b.eq 2f ;\ - cmp SAFE_XREG, #0x4 ;\ - b.ne . ;// We should never get here -// EL1 code starts here + 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) \ mrs SAFE_XREG, CurrentEL ;\ - cmp SAFE_XREG, #0xC ;\ - b.eq 3f ;\ cmp SAFE_XREG, #0x8 ;\ + b.gt 3f ;\ b.eq 2f ;\ - cmp SAFE_XREG, #0x4 ;\ - b.ne . ;// We should never get here -// EL1 code starts here -#if defined(__clang__) + cbnz SAFE_XREG, 1f ;\ + b . ;// We should never get here -// load x0 with _Data -#define LoadConstant(_Data) \ - ldr x0, 1f ; \ - b 2f ; \ -.align(8) ; \ -1: \ - .8byte (_Data) ; \ -2: +#define _ASM_FUNC(Name, Section) \ + .global Name ; \ + .section #Section, "ax" ; \ + .type Name, %function ; \ + Name: -// load _Reg with _Data -#define LoadConstantToReg(_Data, _Reg) \ - ldr _Reg, 1f ; \ - b 2f ; \ -.align(8) ; \ -1: \ - .8byte (_Data) ; \ -2: +#define ASM_FUNC(Name) _ASM_FUNC(ASM_PFX(Name), .text. ## Name) -#elif defined (__GNUC__) +#define MOV32(Reg, Val) \ + movz Reg, (Val) >> 16, lsl #16 ; \ + movk Reg, (Val) & 0xffff -#define LoadConstant(Data) \ - ldr x0, =Data - -#define LoadConstantToReg(Data, Reg) \ - ldr Reg, =Data - -#endif // __GNUC__ +#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__ -