mirror of
https://github.com/acidanthera/audk.git
synced 2025-07-24 22:24:37 +02:00
EdkCompatabilityPkg: Fix build issues with X64 clang
Removed passing VA_LIST and some assembly language compatability issues. Did not fix ReportStatusCode passing VA_LIST (non-ANSI C Code), and some of the assembler was not not ported and int 3 was inserted, as it likely is not needed. signed-off-by: andrewfish reviewed-by: lgao4 git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@12006 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
parent
d12bed15b3
commit
271d2c7f99
@ -45,9 +45,9 @@ ASM_PFX(AsmExecute32BitCode):
|
|||||||
#
|
#
|
||||||
# save orignal GDTR and CS
|
# save orignal GDTR and CS
|
||||||
#
|
#
|
||||||
movq %ds, %rax
|
movl %ds, %eax
|
||||||
push %rax
|
push %rax
|
||||||
movq %cs, %rax
|
movl %cs, %eax
|
||||||
push %rax
|
push %rax
|
||||||
subq $0x10, %rsp
|
subq $0x10, %rsp
|
||||||
sgdt (%rsp)
|
sgdt (%rsp)
|
||||||
@ -209,8 +209,8 @@ ReturnToLongMode:
|
|||||||
# Reload original DS/ES/SS
|
# Reload original DS/ES/SS
|
||||||
#
|
#
|
||||||
pop %rcx
|
pop %rcx
|
||||||
movq %rcx, %ds
|
movl %ecx, %ds
|
||||||
movq %rcx, %es
|
movl %ecx, %es
|
||||||
movq %rcx, %ss
|
movl %ecx, %ss
|
||||||
ret
|
ret
|
||||||
|
|
||||||
|
@ -13,18 +13,18 @@
|
|||||||
#------------------------------------------------------------------------------
|
#------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
|
||||||
.equ VacantFlag, 0x0
|
.set VacantFlag, 0x0
|
||||||
.equ NotVacantFlag, 0xff
|
.set NotVacantFlag, 0xff
|
||||||
|
|
||||||
.equ LockLocation, RendezvousFunnelProcEnd - RendezvousFunnelProcStart
|
.set LockLocation, RendezvousFunnelProcEnd - RendezvousFunnelProcStart
|
||||||
.equ StackStartAddressLocation, RendezvousFunnelProcEnd - RendezvousFunnelProcStart + 0x08
|
.set StackStartAddressLocation, RendezvousFunnelProcEnd - RendezvousFunnelProcStart + 0x08
|
||||||
.equ StackSizeLocation, RendezvousFunnelProcEnd - RendezvousFunnelProcStart + 0x10
|
.set StackSizeLocation, RendezvousFunnelProcEnd - RendezvousFunnelProcStart + 0x10
|
||||||
.equ CProcedureLocation, RendezvousFunnelProcEnd - RendezvousFunnelProcStart + 0x18
|
.set CProcedureLocation, RendezvousFunnelProcEnd - RendezvousFunnelProcStart + 0x18
|
||||||
.equ GdtrLocation, RendezvousFunnelProcEnd - RendezvousFunnelProcStart + 0x20
|
.set GdtrLocation, RendezvousFunnelProcEnd - RendezvousFunnelProcStart + 0x20
|
||||||
.equ IdtrLocation, RendezvousFunnelProcEnd - RendezvousFunnelProcStart + 0x2A
|
.set IdtrLocation, RendezvousFunnelProcEnd - RendezvousFunnelProcStart + 0x2A
|
||||||
.equ BufferStartLocation, RendezvousFunnelProcEnd - RendezvousFunnelProcStart + 0x34
|
.set BufferStartLocation, RendezvousFunnelProcEnd - RendezvousFunnelProcStart + 0x34
|
||||||
.equ Cr3OffsetLocation, RendezvousFunnelProcEnd - RendezvousFunnelProcStart + 0x38
|
.set Cr3OffsetLocation, RendezvousFunnelProcEnd - RendezvousFunnelProcStart + 0x38
|
||||||
.equ ProcessorNumberLocation, RendezvousFunnelProcEnd - RendezvousFunnelProcStart + 0x38
|
.set ProcessorNumberLocation, RendezvousFunnelProcEnd - RendezvousFunnelProcStart + 0x38
|
||||||
|
|
||||||
#-------------------------------------------------------------------------------------
|
#-------------------------------------------------------------------------------------
|
||||||
|
|
||||||
@ -186,7 +186,9 @@ RendezvousFunnelProcEnd:
|
|||||||
# comments here for definition of address map
|
# comments here for definition of address map
|
||||||
ASM_GLOBAL ASM_PFX(AsmGetAddressMap)
|
ASM_GLOBAL ASM_PFX(AsmGetAddressMap)
|
||||||
ASM_PFX(AsmGetAddressMap):
|
ASM_PFX(AsmGetAddressMap):
|
||||||
|
#ifdef __APPLE__
|
||||||
|
int $3
|
||||||
|
#else
|
||||||
movq $RendezvousFunnelProcStart, %rax
|
movq $RendezvousFunnelProcStart, %rax
|
||||||
movq %rax, (%rcx)
|
movq %rax, (%rcx)
|
||||||
movq $(ProtectedModeStart - RendezvousFunnelProcStart), 0x08(%rcx)
|
movq $(ProtectedModeStart - RendezvousFunnelProcStart), 0x08(%rcx)
|
||||||
@ -194,5 +196,5 @@ ASM_PFX(AsmGetAddressMap):
|
|||||||
movq $(LongModeStart - RendezvousFunnelProcStart), 0x18(%rcx)
|
movq $(LongModeStart - RendezvousFunnelProcStart), 0x18(%rcx)
|
||||||
movq $(LONG_JUMP - RendezvousFunnelProcStart), 0x20(%rcx)
|
movq $(LONG_JUMP - RendezvousFunnelProcStart), 0x20(%rcx)
|
||||||
movq $(RendezvousFunnelProcEnd - RendezvousFunnelProcStart), 0x28(%rcx)
|
movq $(RendezvousFunnelProcEnd - RendezvousFunnelProcStart), 0x28(%rcx)
|
||||||
|
#endif
|
||||||
ret
|
ret
|
||||||
|
@ -40,7 +40,11 @@ ASM_PFX(PageFaultHandlerHook):
|
|||||||
popq %rcx
|
popq %rcx
|
||||||
popq %rax # restore all volatile registers
|
popq %rax # restore all volatile registers
|
||||||
jnz L1
|
jnz L1
|
||||||
|
#ifdef __APPLE__
|
||||||
|
int $3
|
||||||
|
#else
|
||||||
jmpq *ASM_PFX(mOriginalHandler)
|
jmpq *ASM_PFX(mOriginalHandler)
|
||||||
|
#endif
|
||||||
L1:
|
L1:
|
||||||
addq $0x08, %rsp # skip error code for PF
|
addq $0x08, %rsp # skip error code for PF
|
||||||
iretq
|
iretq
|
||||||
|
@ -65,14 +65,6 @@ Abstract:
|
|||||||
#include EFI_PROTOCOL_DEFINITION (Hii)
|
#include EFI_PROTOCOL_DEFINITION (Hii)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
STATIC
|
|
||||||
CHAR_W *
|
|
||||||
GetFlagsAndWidth (
|
|
||||||
IN CHAR_W *Format,
|
|
||||||
OUT UINTN *Flags,
|
|
||||||
OUT UINTN *Width,
|
|
||||||
IN OUT VA_LIST *Marker
|
|
||||||
);
|
|
||||||
|
|
||||||
STATIC
|
STATIC
|
||||||
UINTN
|
UINTN
|
||||||
@ -552,6 +544,7 @@ Returns:
|
|||||||
UINTN BufferLeft;
|
UINTN BufferLeft;
|
||||||
UINT64 Value;
|
UINT64 Value;
|
||||||
EFI_GUID *TmpGUID;
|
EFI_GUID *TmpGUID;
|
||||||
|
BOOLEAN Done;
|
||||||
|
|
||||||
//
|
//
|
||||||
// Process the format string. Stop if Buffer is over run.
|
// Process the format string. Stop if Buffer is over run.
|
||||||
@ -578,7 +571,64 @@ Returns:
|
|||||||
//
|
//
|
||||||
// Now it's time to parse what follows after %
|
// Now it's time to parse what follows after %
|
||||||
//
|
//
|
||||||
Format = GetFlagsAndWidth (Format, &Flags, &Width, &Marker);
|
Flags = 0;
|
||||||
|
Width = 0;
|
||||||
|
for (Done = FALSE; !Done;) {
|
||||||
|
Format++;
|
||||||
|
|
||||||
|
switch (*Format) {
|
||||||
|
|
||||||
|
case '-':
|
||||||
|
Flags |= LEFT_JUSTIFY;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case '+':
|
||||||
|
Flags |= PREFIX_SIGN;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case ' ':
|
||||||
|
Flags |= PREFIX_BLANK;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case ',':
|
||||||
|
Flags |= COMMA_TYPE;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'L':
|
||||||
|
case 'l':
|
||||||
|
Flags |= LONG_TYPE;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case '*':
|
||||||
|
Width = VA_ARG (Marker, UINTN);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case '0':
|
||||||
|
Flags |= PREFIX_ZERO;
|
||||||
|
|
||||||
|
case '1':
|
||||||
|
case '2':
|
||||||
|
case '3':
|
||||||
|
case '4':
|
||||||
|
case '5':
|
||||||
|
case '6':
|
||||||
|
case '7':
|
||||||
|
case '8':
|
||||||
|
case '9':
|
||||||
|
Count = 0;
|
||||||
|
do {
|
||||||
|
Count = (Count * 10) +*Format - '0';
|
||||||
|
Format++;
|
||||||
|
} while ((*Format >= '0') && (*Format <= '9'));
|
||||||
|
Format--;
|
||||||
|
Width = Count;
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
Done = TRUE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
switch (*Format) {
|
switch (*Format) {
|
||||||
case 'p':
|
case 'p':
|
||||||
//
|
//
|
||||||
@ -725,103 +775,6 @@ Returns:
|
|||||||
return &Buffer[Index] - StartOfBuffer;
|
return &Buffer[Index] - StartOfBuffer;
|
||||||
}
|
}
|
||||||
|
|
||||||
STATIC
|
|
||||||
CHAR_W *
|
|
||||||
GetFlagsAndWidth (
|
|
||||||
IN CHAR_W *Format,
|
|
||||||
OUT UINTN *Flags,
|
|
||||||
OUT UINTN *Width,
|
|
||||||
IN OUT VA_LIST *Marker
|
|
||||||
)
|
|
||||||
/*++
|
|
||||||
|
|
||||||
Routine Description:
|
|
||||||
|
|
||||||
VSPrint worker function that parses flag and width information from the
|
|
||||||
Format string and returns the next index into the Format string that needs
|
|
||||||
to be parsed. See file headed for details of Flag and Width.
|
|
||||||
|
|
||||||
Arguments:
|
|
||||||
|
|
||||||
Format - Current location in the VSPrint format string.
|
|
||||||
|
|
||||||
Flags - Returns flags
|
|
||||||
|
|
||||||
Width - Returns width of element
|
|
||||||
|
|
||||||
Marker - Vararg list that may be paritally consumed and returned.
|
|
||||||
|
|
||||||
Returns:
|
|
||||||
|
|
||||||
Pointer indexed into the Format string for all the information parsed
|
|
||||||
by this routine.
|
|
||||||
|
|
||||||
--*/
|
|
||||||
{
|
|
||||||
UINTN Count;
|
|
||||||
BOOLEAN Done;
|
|
||||||
|
|
||||||
*Flags = 0;
|
|
||||||
*Width = 0;
|
|
||||||
for (Done = FALSE; !Done;) {
|
|
||||||
Format++;
|
|
||||||
|
|
||||||
switch (*Format) {
|
|
||||||
|
|
||||||
case '-':
|
|
||||||
*Flags |= LEFT_JUSTIFY;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case '+':
|
|
||||||
*Flags |= PREFIX_SIGN;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case ' ':
|
|
||||||
*Flags |= PREFIX_BLANK;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case ',':
|
|
||||||
*Flags |= COMMA_TYPE;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 'L':
|
|
||||||
case 'l':
|
|
||||||
*Flags |= LONG_TYPE;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case '*':
|
|
||||||
*Width = VA_ARG (*Marker, UINTN);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case '0':
|
|
||||||
*Flags |= PREFIX_ZERO;
|
|
||||||
|
|
||||||
case '1':
|
|
||||||
case '2':
|
|
||||||
case '3':
|
|
||||||
case '4':
|
|
||||||
case '5':
|
|
||||||
case '6':
|
|
||||||
case '7':
|
|
||||||
case '8':
|
|
||||||
case '9':
|
|
||||||
Count = 0;
|
|
||||||
do {
|
|
||||||
Count = (Count * 10) +*Format - '0';
|
|
||||||
Format++;
|
|
||||||
} while ((*Format >= '0') && (*Format <= '9'));
|
|
||||||
Format--;
|
|
||||||
*Width = Count;
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
Done = TRUE;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return Format;
|
|
||||||
}
|
|
||||||
|
|
||||||
STATIC
|
STATIC
|
||||||
UINTN
|
UINTN
|
||||||
GuidToString (
|
GuidToString (
|
||||||
|
@ -60,15 +60,6 @@ Abstract:
|
|||||||
#include "Print.h"
|
#include "Print.h"
|
||||||
|
|
||||||
|
|
||||||
STATIC
|
|
||||||
CHAR_W *
|
|
||||||
GetFlagsAndWidth (
|
|
||||||
IN CHAR_W *Format,
|
|
||||||
OUT UINTN *Flags,
|
|
||||||
OUT UINTN *Width,
|
|
||||||
IN OUT VA_LIST *Marker
|
|
||||||
);
|
|
||||||
|
|
||||||
STATIC
|
STATIC
|
||||||
UINTN
|
UINTN
|
||||||
GuidToString (
|
GuidToString (
|
||||||
@ -180,6 +171,7 @@ Returns:
|
|||||||
UINTN BufferLeft;
|
UINTN BufferLeft;
|
||||||
UINT64 Value;
|
UINT64 Value;
|
||||||
EFI_GUID *TmpGUID;
|
EFI_GUID *TmpGUID;
|
||||||
|
BOOLEAN Done;
|
||||||
|
|
||||||
//
|
//
|
||||||
// Process the format string. Stop if Buffer is over run.
|
// Process the format string. Stop if Buffer is over run.
|
||||||
@ -204,8 +196,50 @@ Returns:
|
|||||||
|
|
||||||
//
|
//
|
||||||
// Now it's time to parse what follows after %
|
// Now it's time to parse what follows after %
|
||||||
//
|
//
|
||||||
Format = GetFlagsAndWidth (Format, &Flags, &Width, &Marker);
|
Flags = 0;
|
||||||
|
Width = 0;
|
||||||
|
for (Done = FALSE; !Done; ) {
|
||||||
|
Format++;
|
||||||
|
|
||||||
|
switch (*Format) {
|
||||||
|
|
||||||
|
case '-': Flags |= LEFT_JUSTIFY; break;
|
||||||
|
case '+': Flags |= PREFIX_SIGN; break;
|
||||||
|
case ' ': Flags |= PREFIX_BLANK; break;
|
||||||
|
case ',': Flags |= COMMA_TYPE; break;
|
||||||
|
case 'L':
|
||||||
|
case 'l': Flags |= LONG_TYPE; break;
|
||||||
|
|
||||||
|
case '*':
|
||||||
|
Width = VA_ARG (Marker, UINTN);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case '0':
|
||||||
|
Flags |= PREFIX_ZERO;
|
||||||
|
case '1':
|
||||||
|
case '2':
|
||||||
|
case '3':
|
||||||
|
case '4':
|
||||||
|
case '5':
|
||||||
|
case '6':
|
||||||
|
case '7':
|
||||||
|
case '8':
|
||||||
|
case '9':
|
||||||
|
Count = 0;
|
||||||
|
do {
|
||||||
|
Count = (Count * 10) + *Format - '0';
|
||||||
|
Format++;
|
||||||
|
} while ((*Format >= '0') && (*Format <= '9'));
|
||||||
|
Format--;
|
||||||
|
Width = Count;
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
Done = TRUE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
switch (*Format) {
|
switch (*Format) {
|
||||||
case 'p':
|
case 'p':
|
||||||
//
|
//
|
||||||
@ -347,89 +381,6 @@ Returns:
|
|||||||
return &Buffer[Index] - StartOfBuffer;
|
return &Buffer[Index] - StartOfBuffer;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
STATIC
|
|
||||||
CHAR_W *
|
|
||||||
GetFlagsAndWidth (
|
|
||||||
IN CHAR_W *Format,
|
|
||||||
OUT UINTN *Flags,
|
|
||||||
OUT UINTN *Width,
|
|
||||||
IN OUT VA_LIST *Marker
|
|
||||||
)
|
|
||||||
/*++
|
|
||||||
|
|
||||||
Routine Description:
|
|
||||||
|
|
||||||
VSPrint worker function that parses flag and width information from the
|
|
||||||
Format string and returns the next index into the Format string that needs
|
|
||||||
to be parsed. See file headed for details of Flag and Width.
|
|
||||||
|
|
||||||
Arguments:
|
|
||||||
|
|
||||||
Format - Current location in the VSPrint format string.
|
|
||||||
|
|
||||||
Flags - Returns flags
|
|
||||||
|
|
||||||
Width - Returns width of element
|
|
||||||
|
|
||||||
Marker - Vararg list that may be paritally consumed and returned.
|
|
||||||
|
|
||||||
Returns:
|
|
||||||
|
|
||||||
Pointer indexed into the Format string for all the information parsed
|
|
||||||
by this routine.
|
|
||||||
|
|
||||||
--*/
|
|
||||||
{
|
|
||||||
UINTN Count;
|
|
||||||
BOOLEAN Done;
|
|
||||||
|
|
||||||
*Flags = 0;
|
|
||||||
*Width = 0;
|
|
||||||
for (Done = FALSE; !Done; ) {
|
|
||||||
Format++;
|
|
||||||
|
|
||||||
switch (*Format) {
|
|
||||||
|
|
||||||
case '-': *Flags |= LEFT_JUSTIFY; break;
|
|
||||||
case '+': *Flags |= PREFIX_SIGN; break;
|
|
||||||
case ' ': *Flags |= PREFIX_BLANK; break;
|
|
||||||
case ',': *Flags |= COMMA_TYPE; break;
|
|
||||||
case 'L':
|
|
||||||
case 'l': *Flags |= LONG_TYPE; break;
|
|
||||||
|
|
||||||
case '*':
|
|
||||||
*Width = VA_ARG (*Marker, UINTN);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case '0':
|
|
||||||
*Flags |= PREFIX_ZERO;
|
|
||||||
case '1':
|
|
||||||
case '2':
|
|
||||||
case '3':
|
|
||||||
case '4':
|
|
||||||
case '5':
|
|
||||||
case '6':
|
|
||||||
case '7':
|
|
||||||
case '8':
|
|
||||||
case '9':
|
|
||||||
Count = 0;
|
|
||||||
do {
|
|
||||||
Count = (Count * 10) + *Format - '0';
|
|
||||||
Format++;
|
|
||||||
} while ((*Format >= '0') && (*Format <= '9'));
|
|
||||||
Format--;
|
|
||||||
*Width = Count;
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
Done = TRUE;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return Format;
|
|
||||||
}
|
|
||||||
|
|
||||||
STATIC
|
STATIC
|
||||||
UINTN
|
UINTN
|
||||||
GuidToString (
|
GuidToString (
|
||||||
|
@ -34,5 +34,5 @@
|
|||||||
ASM_PFX(AsmMwait):
|
ASM_PFX(AsmMwait):
|
||||||
mov %ecx,%eax
|
mov %ecx,%eax
|
||||||
mov %edx,%ecx
|
mov %edx,%ecx
|
||||||
mwait %rax,%rcx
|
mwait
|
||||||
ret
|
ret
|
||||||
|
@ -19,12 +19,12 @@
|
|||||||
#
|
#
|
||||||
#------------------------------------------------------------------------------
|
#------------------------------------------------------------------------------
|
||||||
#include <EdkIIGlueBase.h>
|
#include <EdkIIGlueBase.h>
|
||||||
.extern InternalAssertJumpBuffer;
|
|
||||||
.globl ASM_PFX(SetJump)
|
.globl ASM_PFX(SetJump)
|
||||||
ASM_PFX(SetJump):
|
ASM_PFX(SetJump):
|
||||||
push %rcx
|
push %rcx
|
||||||
add $0xffffffffffffffe0,%rsp
|
add $0xffffffffffffffe0,%rsp
|
||||||
call _InternalAssertJumpBuffer
|
call ASM_PFX(InternalAssertJumpBuffer)
|
||||||
add $0x20,%rsp
|
add $0x20,%rsp
|
||||||
pop %rcx
|
pop %rcx
|
||||||
pop %rdx
|
pop %rdx
|
||||||
|
@ -30,31 +30,33 @@
|
|||||||
.globl ASM_PFX(InternalAsmThunk16)
|
.globl ASM_PFX(InternalAsmThunk16)
|
||||||
|
|
||||||
# define the structure of IA32_REGS
|
# define the structure of IA32_REGS
|
||||||
.equ _EDI, 0 #size 4
|
.set _EDI, 0 #size 4
|
||||||
.equ _ESI, 4 #size 4
|
.set _ESI, 4 #size 4
|
||||||
.equ _EBP, 8 #size 4
|
.set _EBP, 8 #size 4
|
||||||
.equ _ESP, 12 #size 4
|
.set _ESP, 12 #size 4
|
||||||
.equ _EBX, 16 #size 4
|
.set _EBX, 16 #size 4
|
||||||
.equ _EDX, 20 #size 4
|
.set _EDX, 20 #size 4
|
||||||
.equ _ECX, 24 #size 4
|
.set _ECX, 24 #size 4
|
||||||
.equ _EAX, 28 #size 4
|
.set _EAX, 28 #size 4
|
||||||
.equ _DS, 32 #size 2
|
.set _DS, 32 #size 2
|
||||||
.equ _ES, 34 #size 2
|
.set _ES, 34 #size 2
|
||||||
.equ _FS, 36 #size 2
|
.set _FS, 36 #size 2
|
||||||
.equ _GS, 38 #size 2
|
.set _GS, 38 #size 2
|
||||||
.equ _EFLAGS, 40 #size 8
|
.set _EFLAGS, 40 #size 8
|
||||||
.equ _EIP, 48 #size 4
|
.set _EIP, 48 #size 4
|
||||||
.equ _CS, 52 #size 2
|
.set _CS, 52 #size 2
|
||||||
.equ _SS, 54 #size 2
|
.set _SS, 54 #size 2
|
||||||
.equ IA32_REGS_SIZE, 56
|
.set IA32_REGS_SIZE, 56
|
||||||
|
|
||||||
.data
|
.data
|
||||||
|
|
||||||
|
#ifndef __APPLE__
|
||||||
ASM_PFX(m16Size): .word ASM_PFX(InternalAsmThunk16) - ASM_PFX(m16Start)
|
ASM_PFX(m16Size): .word ASM_PFX(InternalAsmThunk16) - ASM_PFX(m16Start)
|
||||||
ASM_PFX(mThunk16Attr): .word _ThunkAttr - ASM_PFX(m16Start)
|
ASM_PFX(mThunk16Attr): .word _ThunkAttr - ASM_PFX(m16Start)
|
||||||
ASM_PFX(m16Gdt): .word ASM_PFX(NullSeg) - ASM_PFX(m16Start)
|
ASM_PFX(m16Gdt): .word ASM_PFX(NullSeg) - ASM_PFX(m16Start)
|
||||||
ASM_PFX(m16GdtrBase): .word _16GdtrBase - ASM_PFX(m16Start)
|
ASM_PFX(m16GdtrBase): .word _16GdtrBase - ASM_PFX(m16Start)
|
||||||
ASM_PFX(mTransition): .word _EntryPoint - ASM_PFX(m16Start)
|
ASM_PFX(mTransition): .word _EntryPoint - ASM_PFX(m16Start)
|
||||||
|
#endif
|
||||||
|
|
||||||
.text
|
.text
|
||||||
|
|
||||||
@ -68,6 +70,9 @@ SavedGdt: .space 10
|
|||||||
#------------------------------------------------------------------------------
|
#------------------------------------------------------------------------------
|
||||||
.globl ASM_PFX(BackFromUserCode)
|
.globl ASM_PFX(BackFromUserCode)
|
||||||
ASM_PFX(BackFromUserCode):
|
ASM_PFX(BackFromUserCode):
|
||||||
|
#ifdef __APPLE__
|
||||||
|
int $3
|
||||||
|
#else
|
||||||
#
|
#
|
||||||
# The order of saved registers on the stack matches the order they appears
|
# The order of saved registers on the stack matches the order they appears
|
||||||
# in IA32_REGS structure. This facilitates wrapper function to extract them
|
# in IA32_REGS structure. This facilitates wrapper function to extract them
|
||||||
@ -143,14 +148,17 @@ L_64BitCode:
|
|||||||
.byte 0x67,0xbc # mov esp, imm32
|
.byte 0x67,0xbc # mov esp, imm32
|
||||||
SavedSp: .space 4 # restore stack
|
SavedSp: .space 4 # restore stack
|
||||||
nop
|
nop
|
||||||
|
#endif
|
||||||
ret
|
ret
|
||||||
|
|
||||||
|
#ifndef __APPLE__
|
||||||
_EntryPoint: .long ASM_PFX(ToUserCode) - ASM_PFX(m16Start)
|
_EntryPoint: .long ASM_PFX(ToUserCode) - ASM_PFX(m16Start)
|
||||||
.word CODE16
|
.word CODE16
|
||||||
_16Gdtr: .word GDT_SIZE - 1
|
_16Gdtr: .word GDT_SIZE - 1
|
||||||
_16GdtrBase: .quad ASM_PFX(NullSeg)
|
_16GdtrBase: .quad ASM_PFX(NullSeg)
|
||||||
_16Idtr: .word 0x3ff
|
_16Idtr: .word 0x3ff
|
||||||
.long 0
|
.long 0
|
||||||
|
#endif
|
||||||
|
|
||||||
#------------------------------------------------------------------------------
|
#------------------------------------------------------------------------------
|
||||||
# _ToUserCode() takes control in real mode before passing control to user code.
|
# _ToUserCode() takes control in real mode before passing control to user code.
|
||||||
@ -158,6 +166,9 @@ _16Idtr: .word 0x3ff
|
|||||||
#------------------------------------------------------------------------------
|
#------------------------------------------------------------------------------
|
||||||
.globl ASM_PFX(ToUserCode)
|
.globl ASM_PFX(ToUserCode)
|
||||||
ASM_PFX(ToUserCode):
|
ASM_PFX(ToUserCode):
|
||||||
|
#ifdef __APPLE__
|
||||||
|
int $3
|
||||||
|
#else
|
||||||
movl %edx,%ss # set new segment selectors
|
movl %edx,%ss # set new segment selectors
|
||||||
movl %edx,%ds
|
movl %edx,%ds
|
||||||
movl %edx,%es
|
movl %edx,%es
|
||||||
@ -191,11 +202,12 @@ L_RealMode:
|
|||||||
.byte 0x66, 0x9d # popfd
|
.byte 0x66, 0x9d # popfd
|
||||||
leaw 4(%esp),%sp # skip high order 32 bits of EFlags
|
leaw 4(%esp),%sp # skip high order 32 bits of EFlags
|
||||||
.byte 0x66 # make the following retf 32-bit
|
.byte 0x66 # make the following retf 32-bit
|
||||||
lret # transfer control to user code
|
#endif
|
||||||
|
lret # transfer control to user code
|
||||||
|
|
||||||
.equ CODE16, ASM_PFX(_16Code) - .
|
.set CODE16, ASM_PFX(_16Code) - .
|
||||||
.equ DATA16, ASM_PFX(_16Data) - .
|
.set DATA16, ASM_PFX(_16Data) - .
|
||||||
.equ DATA32, ASM_PFX(_32Data) - .
|
.set DATA32, ASM_PFX(_32Data) - .
|
||||||
|
|
||||||
ASM_PFX(NullSeg): .quad 0
|
ASM_PFX(NullSeg): .quad 0
|
||||||
ASM_PFX(_16Code):
|
ASM_PFX(_16Code):
|
||||||
@ -220,7 +232,7 @@ ASM_PFX(_32Data):
|
|||||||
.byte 0xcf # 16-bit segment, 4GB limit
|
.byte 0xcf # 16-bit segment, 4GB limit
|
||||||
.byte 0
|
.byte 0
|
||||||
|
|
||||||
.equ GDT_SIZE, . - ASM_PFX(NullSeg)
|
.set GDT_SIZE, . - ASM_PFX(NullSeg)
|
||||||
|
|
||||||
#------------------------------------------------------------------------------
|
#------------------------------------------------------------------------------
|
||||||
# IA32_REGISTER_SET *
|
# IA32_REGISTER_SET *
|
||||||
@ -233,6 +245,9 @@ ASM_PFX(_32Data):
|
|||||||
|
|
||||||
.globl ASM_PFX(InternalAsmThunk16)
|
.globl ASM_PFX(InternalAsmThunk16)
|
||||||
ASM_PFX(InternalAsmThunk16):
|
ASM_PFX(InternalAsmThunk16):
|
||||||
|
#ifdef __APPLE__
|
||||||
|
int $3
|
||||||
|
#else
|
||||||
pushq %rbp
|
pushq %rbp
|
||||||
pushq %rbx
|
pushq %rbx
|
||||||
pushq %rsi
|
pushq %rsi
|
||||||
@ -304,5 +319,5 @@ L_RetFromRealMode:
|
|||||||
popq %rsi
|
popq %rsi
|
||||||
popq %rbx
|
popq %rbx
|
||||||
popq %rbp
|
popq %rbp
|
||||||
|
#endif
|
||||||
ret
|
ret
|
||||||
|
@ -296,11 +296,16 @@ GlueReportStatusCodeExtractDebugInfo (
|
|||||||
|
|
||||||
*ErrorLevel = DebugInfo->ErrorLevel;
|
*ErrorLevel = DebugInfo->ErrorLevel;
|
||||||
|
|
||||||
|
#ifdef __APPLE__
|
||||||
|
// This is non portable C code you can't assume VA_LIST is pointer
|
||||||
|
return FALSE;
|
||||||
|
#else
|
||||||
//
|
//
|
||||||
// The first 12 * UINTN bytes of the string are really an
|
// The first 12 * UINTN bytes of the string are really an
|
||||||
// argument stack to support varargs on the Format string.
|
// argument stack to support varargs on the Format string.
|
||||||
//
|
//
|
||||||
*Marker = (VA_LIST) (DebugInfo + 1);
|
*Marker = (VA_LIST) (DebugInfo + 1);
|
||||||
|
#endif
|
||||||
*Format = (CHAR8 *)(((UINT64 *)*Marker) + 12);
|
*Format = (CHAR8 *)(((UINT64 *)*Marker) + 12);
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
|
@ -248,7 +248,12 @@ GlueReportStatusCodeExtractDebugInfo (
|
|||||||
// The first 12 * UINTN bytes of the string are really an
|
// The first 12 * UINTN bytes of the string are really an
|
||||||
// argument stack to support varargs on the Format string.
|
// argument stack to support varargs on the Format string.
|
||||||
//
|
//
|
||||||
|
#ifdef __APPLE__
|
||||||
|
// This is non portable C code you can't assume VA_LIST is pointer
|
||||||
|
return FALSE;
|
||||||
|
#else
|
||||||
*Marker = (VA_LIST) (DebugInfo + 1);
|
*Marker = (VA_LIST) (DebugInfo + 1);
|
||||||
|
#endif
|
||||||
*Format = (CHAR8 *)(((UINT64 *)*Marker) + 12);
|
*Format = (CHAR8 *)(((UINT64 *)*Marker) + 12);
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
|
@ -280,7 +280,12 @@ GlueReportStatusCodeExtractDebugInfo (
|
|||||||
// The first 12 * UINTN bytes of the string are really an
|
// The first 12 * UINTN bytes of the string are really an
|
||||||
// argument stack to support varargs on the Format string.
|
// argument stack to support varargs on the Format string.
|
||||||
//
|
//
|
||||||
|
#ifdef __APPLE__
|
||||||
|
// This is non portable C code you can't assume VA_LIST is pointer
|
||||||
|
return FALSE;
|
||||||
|
#else
|
||||||
*Marker = (VA_LIST) (DebugInfo + 1);
|
*Marker = (VA_LIST) (DebugInfo + 1);
|
||||||
|
#endif
|
||||||
*Format = (CHAR8 *)(((UINT64 *)*Marker) + 12);
|
*Format = (CHAR8 *)(((UINT64 *)*Marker) + 12);
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
|
@ -332,9 +332,10 @@ Returns:
|
|||||||
// The first 12 * UINTN bytes of the string are really an
|
// The first 12 * UINTN bytes of the string are really an
|
||||||
// arguement stack to support varargs on the Format string.
|
// arguement stack to support varargs on the Format string.
|
||||||
//
|
//
|
||||||
#ifdef EFIARM
|
#if (defined (EFIARM) || defined(__APPLE__))
|
||||||
// It is not legal C code to case VA_LIST to a pointer. VA_LIST can
|
// It is not legal C code to case VA_LIST to a pointer. VA_LIST can
|
||||||
// be a structure.
|
// be a structure.
|
||||||
|
return FALSE;
|
||||||
#else
|
#else
|
||||||
*Marker = (VA_LIST) (DebugInfo + 1);
|
*Marker = (VA_LIST) (DebugInfo + 1);
|
||||||
*Format = (CHAR8 *)(((UINT64 *)*Marker) + 12);
|
*Format = (CHAR8 *)(((UINT64 *)*Marker) + 12);
|
||||||
|
@ -58,14 +58,6 @@ Abstract:
|
|||||||
#include "PeiLib.h"
|
#include "PeiLib.h"
|
||||||
#include "Print.h"
|
#include "Print.h"
|
||||||
|
|
||||||
STATIC
|
|
||||||
CHAR8 *
|
|
||||||
GetFlagsAndWidth (
|
|
||||||
IN CHAR8 *Format,
|
|
||||||
OUT UINTN *Flags,
|
|
||||||
OUT UINTN *Width,
|
|
||||||
IN OUT VA_LIST *Marker
|
|
||||||
);
|
|
||||||
|
|
||||||
STATIC
|
STATIC
|
||||||
UINTN
|
UINTN
|
||||||
@ -195,7 +187,8 @@ Returns:
|
|||||||
UINTN BufferLeft;
|
UINTN BufferLeft;
|
||||||
UINT64 Value;
|
UINT64 Value;
|
||||||
EFI_GUID *TmpGUID;
|
EFI_GUID *TmpGUID;
|
||||||
|
BOOLEAN Done;
|
||||||
|
|
||||||
//
|
//
|
||||||
// Process the format string. Stop if Buffer is over run.
|
// Process the format string. Stop if Buffer is over run.
|
||||||
//
|
//
|
||||||
@ -218,8 +211,50 @@ Returns:
|
|||||||
|
|
||||||
//
|
//
|
||||||
// Now it's time to parse what follows after %
|
// Now it's time to parse what follows after %
|
||||||
//
|
//
|
||||||
Format = GetFlagsAndWidth (Format, &Flags, &Width, &Marker);
|
Flags = 0;
|
||||||
|
Width = 0;
|
||||||
|
for (Done = FALSE; !Done; ) {
|
||||||
|
Format++;
|
||||||
|
|
||||||
|
switch (*Format) {
|
||||||
|
|
||||||
|
case '-': Flags |= LEFT_JUSTIFY; break;
|
||||||
|
case '+': Flags |= PREFIX_SIGN; break;
|
||||||
|
case ' ': Flags |= PREFIX_BLANK; break;
|
||||||
|
case ',': Flags |= COMMA_TYPE; break;
|
||||||
|
case 'L':
|
||||||
|
case 'l': Flags |= LONG_TYPE; break;
|
||||||
|
|
||||||
|
case '*':
|
||||||
|
Width = VA_ARG (Marker, UINTN);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case '0':
|
||||||
|
Flags |= PREFIX_ZERO;
|
||||||
|
case '1':
|
||||||
|
case '2':
|
||||||
|
case '3':
|
||||||
|
case '4':
|
||||||
|
case '5':
|
||||||
|
case '6':
|
||||||
|
case '7':
|
||||||
|
case '8':
|
||||||
|
case '9':
|
||||||
|
Count = 0;
|
||||||
|
do {
|
||||||
|
Count = (Count * 10) + *Format - '0';
|
||||||
|
Format++;
|
||||||
|
} while ((*Format >= '0') && (*Format <= '9'));
|
||||||
|
Format--;
|
||||||
|
Width = Count;
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
Done = TRUE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
switch (*Format) {
|
switch (*Format) {
|
||||||
case 'p':
|
case 'p':
|
||||||
//
|
//
|
||||||
@ -367,87 +402,6 @@ Returns:
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
STATIC
|
|
||||||
CHAR8 *
|
|
||||||
GetFlagsAndWidth (
|
|
||||||
IN CHAR8 *Format,
|
|
||||||
OUT UINTN *Flags,
|
|
||||||
OUT UINTN *Width,
|
|
||||||
IN OUT VA_LIST *Marker
|
|
||||||
)
|
|
||||||
/*++
|
|
||||||
|
|
||||||
Routine Description:
|
|
||||||
|
|
||||||
AvSPrint worker function that parses flag and width information from the
|
|
||||||
Format string and returns the next index into the Format string that needs
|
|
||||||
to be parsed. See file headed for details of Flag and Width.
|
|
||||||
|
|
||||||
Arguments:
|
|
||||||
|
|
||||||
Format - Current location in the AvSPrint format string.
|
|
||||||
|
|
||||||
Flags - Returns flags
|
|
||||||
|
|
||||||
Width - Returns width of element
|
|
||||||
|
|
||||||
Marker - Vararg list that may be paritally consumed and returned.
|
|
||||||
|
|
||||||
Returns:
|
|
||||||
|
|
||||||
Pointer indexed into the Format string for all the information parsed
|
|
||||||
by this routine.
|
|
||||||
|
|
||||||
--*/
|
|
||||||
{
|
|
||||||
UINTN Count;
|
|
||||||
BOOLEAN Done;
|
|
||||||
|
|
||||||
*Flags = 0;
|
|
||||||
*Width = 0;
|
|
||||||
for (Done = FALSE; !Done; ) {
|
|
||||||
Format++;
|
|
||||||
|
|
||||||
switch (*Format) {
|
|
||||||
|
|
||||||
case '-': *Flags |= LEFT_JUSTIFY; break;
|
|
||||||
case '+': *Flags |= PREFIX_SIGN; break;
|
|
||||||
case ' ': *Flags |= PREFIX_BLANK; break;
|
|
||||||
case ',': *Flags |= COMMA_TYPE; break;
|
|
||||||
case 'L':
|
|
||||||
case 'l': *Flags |= LONG_TYPE; break;
|
|
||||||
|
|
||||||
case '*':
|
|
||||||
*Width = VA_ARG (*Marker, UINTN);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case '0':
|
|
||||||
*Flags |= PREFIX_ZERO;
|
|
||||||
case '1':
|
|
||||||
case '2':
|
|
||||||
case '3':
|
|
||||||
case '4':
|
|
||||||
case '5':
|
|
||||||
case '6':
|
|
||||||
case '7':
|
|
||||||
case '8':
|
|
||||||
case '9':
|
|
||||||
Count = 0;
|
|
||||||
do {
|
|
||||||
Count = (Count * 10) + *Format - '0';
|
|
||||||
Format++;
|
|
||||||
} while ((*Format >= '0') && (*Format <= '9'));
|
|
||||||
Format--;
|
|
||||||
*Width = Count;
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
Done = TRUE;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return Format;
|
|
||||||
}
|
|
||||||
|
|
||||||
static CHAR8 mHexStr[] = { '0','1','2','3','4','5','6','7',
|
static CHAR8 mHexStr[] = { '0','1','2','3','4','5','6','7',
|
||||||
'8','9','A','B','C','D','E','F' };
|
'8','9','A','B','C','D','E','F' };
|
||||||
|
|
||||||
|
@ -59,8 +59,8 @@ ASM_PFX(SwitchStacks):
|
|||||||
#SwitchStacks ENDP
|
#SwitchStacks ENDP
|
||||||
|
|
||||||
|
|
||||||
.equ EFI_SUCCESS, 0
|
.set EFI_SUCCESS, 0
|
||||||
.equ EFI_WARN_RETURN_FROM_LONG_JUMP, 5
|
.set EFI_WARN_RETURN_FROM_LONG_JUMP, 5
|
||||||
|
|
||||||
#
|
#
|
||||||
#Routine Description:
|
#Routine Description:
|
||||||
@ -99,19 +99,19 @@ ASM_PFX(TransferControlSetJump):
|
|||||||
mov %r13,0x40(%rdx)
|
mov %r13,0x40(%rdx)
|
||||||
mov %r14,0x48(%rdx)
|
mov %r14,0x48(%rdx)
|
||||||
mov %r15,0x50(%rdx)
|
mov %r15,0x50(%rdx)
|
||||||
#; save non-volatile fp registers
|
#; save non-volatile fp registers
|
||||||
stmxcsr 0x60(%rdx)
|
stmxcsr 0x60(%rdx)
|
||||||
lea 0x68(%rdx), %rax
|
lea 0x68(%rdx), %rax
|
||||||
movdqu %xmm6, (%rax)
|
movdqu %xmm6, (%rax)
|
||||||
movdqu %xmm7, 0x10(%rax)
|
movdqu %xmm7, 0x10(%rax)
|
||||||
movdqu %xmm8, 0x20(%rax)
|
movdqu %xmm8, 0x20(%rax)
|
||||||
movdqu %xmm9, 0x30(%rax)
|
movdqu %xmm9, 0x30(%rax)
|
||||||
movdqu %xmm10, 0x40(%rax)
|
movdqu %xmm10, 0x40(%rax)
|
||||||
movdqu %xmm11, 0x50(%rax)
|
movdqu %xmm11, 0x50(%rax)
|
||||||
movdqu %xmm12, 0x60(%rax)
|
movdqu %xmm12, 0x60(%rax)
|
||||||
movdqu %xmm13, 0x70(%rax)
|
movdqu %xmm13, 0x70(%rax)
|
||||||
movdqu %xmm14, 0x80(%rax)
|
movdqu %xmm14, 0x80(%rax)
|
||||||
movdqu %xmm15, 0x90(%rax)
|
movdqu %xmm15, 0x90(%rax)
|
||||||
mov (%rsp),%rax
|
mov (%rsp),%rax
|
||||||
mov %rax,0x58(%rdx)
|
mov %rax,0x58(%rdx)
|
||||||
mov $0x0,%rax
|
mov $0x0,%rax
|
||||||
@ -129,19 +129,19 @@ ASM_PFX(TransferControlSetJump):
|
|||||||
#
|
#
|
||||||
ASM_PFX(TransferControlLongJump):
|
ASM_PFX(TransferControlLongJump):
|
||||||
# set return from SetJump to EFI_WARN_RETURN_FROM_LONG_JUMP
|
# set return from SetJump to EFI_WARN_RETURN_FROM_LONG_JUMP
|
||||||
#; load non-volatile fp registers
|
#; load non-volatile fp registers
|
||||||
ldmxcsr 0x60(%rdx)
|
ldmxcsr 0x60(%rdx)
|
||||||
lea 0x68(%rdx), %rax
|
lea 0x68(%rdx), %rax
|
||||||
movdqu (%rax), %xmm6
|
movdqu (%rax), %xmm6
|
||||||
movdqu 0x10(%rax), %xmm7
|
movdqu 0x10(%rax), %xmm7
|
||||||
movdqu 0x20(%rax), %xmm8
|
movdqu 0x20(%rax), %xmm8
|
||||||
movdqu 0x30(%rax), %xmm9
|
movdqu 0x30(%rax), %xmm9
|
||||||
movdqu 0x40(%rax), %xmm10
|
movdqu 0x40(%rax), %xmm10
|
||||||
movdqu 0x50(%rax), %xmm11
|
movdqu 0x50(%rax), %xmm11
|
||||||
movdqu 0x60(%rax), %xmm12
|
movdqu 0x60(%rax), %xmm12
|
||||||
movdqu 0x70(%rax), %xmm13
|
movdqu 0x70(%rax), %xmm13
|
||||||
movdqu 0x80(%rax), %xmm14
|
movdqu 0x80(%rax), %xmm14
|
||||||
movdqu 0x90(%rax), %xmm15
|
movdqu 0x90(%rax), %xmm15
|
||||||
mov $0x5,%rax
|
mov $0x5,%rax
|
||||||
mov (%rdx),%rbx
|
mov (%rdx),%rbx
|
||||||
mov 0x8(%rdx),%rsp
|
mov 0x8(%rdx),%rsp
|
||||||
|
@ -20,7 +20,7 @@
|
|||||||
#*****************************************************************************
|
#*****************************************************************************
|
||||||
#include <EfiBind.h>
|
#include <EfiBind.h>
|
||||||
|
|
||||||
|
#ifndef __APPLE__
|
||||||
|
|
||||||
.data
|
.data
|
||||||
|
|
||||||
@ -240,3 +240,5 @@ FarCallRet:
|
|||||||
_16Idtr:
|
_16Idtr:
|
||||||
.word 0x3ff #FWORD (1 SHL 10) - 1
|
.word 0x3ff #FWORD (1 SHL 10) - 1
|
||||||
.byte 0x00
|
.byte 0x00
|
||||||
|
|
||||||
|
#endif
|
||||||
|
Loading…
x
Reference in New Issue
Block a user