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:
andrewfish 2011-07-12 02:57:30 +00:00
parent d12bed15b3
commit 271d2c7f99
15 changed files with 264 additions and 367 deletions

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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 (

View File

@ -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 (

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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);

View File

@ -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' };

View File

@ -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

View File

@ -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