diff options
Diffstat (limited to 'UnixPkg/Library')
-rw-r--r-- | UnixPkg/Library/UnixBaseLib/GetPowerOfTwo64.c | 4 | ||||
-rw-r--r-- | UnixPkg/Library/UnixBaseLib/MultS64x64.c | 2 | ||||
-rw-r--r-- | UnixPkg/Library/UnixBaseLib/String.c | 51 | ||||
-rw-r--r-- | UnixPkg/Library/UnixBaseLib/X64/LongJump.S | 42 | ||||
-rw-r--r-- | UnixPkg/Library/UnixBaseLib/X64/SetJump.S | 33 | ||||
-rw-r--r-- | UnixPkg/Library/UnixBaseLib/X64/SwitchStack.S | 42 |
6 files changed, 24 insertions, 150 deletions
diff --git a/UnixPkg/Library/UnixBaseLib/GetPowerOfTwo64.c b/UnixPkg/Library/UnixBaseLib/GetPowerOfTwo64.c index 4623c2a656..3574bc4d3c 100644 --- a/UnixPkg/Library/UnixBaseLib/GetPowerOfTwo64.c +++ b/UnixPkg/Library/UnixBaseLib/GetPowerOfTwo64.c @@ -1,7 +1,7 @@ /** @file
Math worker functions.
- Copyright (c) 2006 - 2008, Intel Corporation. All rights reserved.<BR>
+ Copyright (c) 2006 - 2010, Intel Corporation. All rights reserved.<BR>
This program and the accompanying materials
are licensed and made available under the terms and conditions of the BSD License
which accompanies this distribution. The full text of the license may be found at
@@ -40,5 +40,5 @@ GetPowerOfTwo64 ( return 0;
}
- return LShiftU64 (1, HighBitSet64 (Operand));
+ return LShiftU64 (1, (UINTN) HighBitSet64 (Operand));
}
diff --git a/UnixPkg/Library/UnixBaseLib/MultS64x64.c b/UnixPkg/Library/UnixBaseLib/MultS64x64.c index cbeaf02117..229c76ce68 100644 --- a/UnixPkg/Library/UnixBaseLib/MultS64x64.c +++ b/UnixPkg/Library/UnixBaseLib/MultS64x64.c @@ -38,5 +38,5 @@ MultS64x64 ( IN INT64 Multiplier
)
{
- return (INT64)MultU64x64 (Multiplicand, Multiplier);
+ return (INT64)MultU64x64 ((UINT64) Multiplicand, (UINT64) Multiplier);
}
diff --git a/UnixPkg/Library/UnixBaseLib/String.c b/UnixPkg/Library/UnixBaseLib/String.c index 2279720951..273291a915 100644 --- a/UnixPkg/Library/UnixBaseLib/String.c +++ b/UnixPkg/Library/UnixBaseLib/String.c @@ -14,17 +14,6 @@ #include "BaseLibInternals.h"
-#define QUOTIENT_MAX_UINTN_DIVIDED_BY_10 ((UINTN) -1 / 10)
-#define REMAINDER_MAX_UINTN_DIVIDED_BY_10 ((UINTN) -1 % 10)
-
-#define QUOTIENT_MAX_UINTN_DIVIDED_BY_16 ((UINTN) -1 / 16)
-#define REMAINDER_MAX_UINTN_DIVIDED_BY_16 ((UINTN) -1 % 16)
-
-#define QUOTIENT_MAX_UINT64_DIVIDED_BY_10 ((UINT64) -1 / 10)
-#define REMAINDER_MAX_UINT64_DIVIDED_BY_10 ((UINT64) -1 % 10)
-
-#define QUOTIENT_MAX_UINT64_DIVIDED_BY_16 ((UINT64) -1 / 16)
-#define REMAINDER_MAX_UINT64_DIVIDED_BY_16 ((UINT64) -1 % 16)
/**
Copies one Null-terminated Unicode string to another Null-terminated Unicode
@@ -681,10 +670,7 @@ StrDecimalToUintn ( // If the number represented by String overflows according
// to the range defined by UINTN, then ASSERT().
//
- ASSERT ((Result < QUOTIENT_MAX_UINTN_DIVIDED_BY_10) ||
- ((Result == QUOTIENT_MAX_UINTN_DIVIDED_BY_10) &&
- (*String - L'0') <= REMAINDER_MAX_UINTN_DIVIDED_BY_10)
- );
+ ASSERT (Result <= ((((UINTN) ~0) - (*String - L'0')) / 10));
Result = Result * 10 + (*String - L'0');
String++;
@@ -763,10 +749,7 @@ StrDecimalToUint64 ( // If the number represented by String overflows according
// to the range defined by UINTN, then ASSERT().
//
- ASSERT ((Result < QUOTIENT_MAX_UINT64_DIVIDED_BY_10) ||
- ((Result == QUOTIENT_MAX_UINT64_DIVIDED_BY_10) &&
- (*String - L'0') <= REMAINDER_MAX_UINT64_DIVIDED_BY_10)
- );
+ ASSERT (Result <= DivU64x32 (((UINT64) ~0) - (*String - L'0') , 10));
Result = MultU64x32 (Result, 10) + (*String - L'0');
String++;
@@ -855,10 +838,7 @@ StrHexToUintn ( // If the Hex Number represented by String overflows according
// to the range defined by UINTN, then ASSERT().
//
- ASSERT ((Result < QUOTIENT_MAX_UINTN_DIVIDED_BY_16) ||
- ((Result == QUOTIENT_MAX_UINTN_DIVIDED_BY_16) &&
- (InternalHexCharToUintn (*String) <= REMAINDER_MAX_UINTN_DIVIDED_BY_16))
- );
+ ASSERT (Result <= ((((UINTN) ~0) - InternalHexCharToUintn (*String)) >> 4));
Result = (Result << 4) + InternalHexCharToUintn (*String);
String++;
@@ -949,10 +929,7 @@ StrHexToUint64 ( // If the Hex Number represented by String overflows according
// to the range defined by UINTN, then ASSERT().
//
- ASSERT ((Result < QUOTIENT_MAX_UINT64_DIVIDED_BY_16)||
- ((Result == QUOTIENT_MAX_UINT64_DIVIDED_BY_16) &&
- (InternalHexCharToUintn (*String) <= REMAINDER_MAX_UINT64_DIVIDED_BY_16))
- );
+ ASSERT (Result <= RShiftU64 (((UINT64) ~0) - InternalHexCharToUintn (*String) , 4));
Result = LShiftU64 (Result, 4);
Result = Result + InternalHexCharToUintn (*String);
@@ -1716,10 +1693,7 @@ AsciiStrDecimalToUintn ( // If the number represented by String overflows according
// to the range defined by UINTN, then ASSERT().
//
- ASSERT ((Result < QUOTIENT_MAX_UINTN_DIVIDED_BY_10) ||
- ((Result == QUOTIENT_MAX_UINTN_DIVIDED_BY_10) &&
- (*String - '0') <= REMAINDER_MAX_UINTN_DIVIDED_BY_10)
- );
+ ASSERT (Result <= ((((UINTN) ~0) - (*String - L'0')) / 10));
Result = Result * 10 + (*String - '0');
String++;
@@ -1793,10 +1767,7 @@ AsciiStrDecimalToUint64 ( // If the number represented by String overflows according
// to the range defined by UINTN, then ASSERT().
//
- ASSERT ((Result < QUOTIENT_MAX_UINT64_DIVIDED_BY_10) ||
- ((Result == QUOTIENT_MAX_UINT64_DIVIDED_BY_10) &&
- (*String - '0') <= REMAINDER_MAX_UINT64_DIVIDED_BY_10)
- );
+ ASSERT (Result <= DivU64x32 (((UINT64) ~0) - (*String - L'0') , 10));
Result = MultU64x32 (Result, 10) + (*String - '0');
String++;
@@ -1884,10 +1855,7 @@ AsciiStrHexToUintn ( // If the Hex Number represented by String overflows according
// to the range defined by UINTN, then ASSERT().
//
- ASSERT ((Result < QUOTIENT_MAX_UINTN_DIVIDED_BY_16) ||
- ((Result == QUOTIENT_MAX_UINTN_DIVIDED_BY_16) &&
- (InternalAsciiHexCharToUintn (*String) <= REMAINDER_MAX_UINTN_DIVIDED_BY_16))
- );
+ ASSERT (Result <= ((((UINTN) ~0) - InternalHexCharToUintn (*String)) >> 4));
Result = (Result << 4) + InternalAsciiHexCharToUintn (*String);
String++;
@@ -1979,10 +1947,7 @@ AsciiStrHexToUint64 ( // If the Hex Number represented by String overflows according
// to the range defined by UINTN, then ASSERT().
//
- ASSERT ((Result < QUOTIENT_MAX_UINT64_DIVIDED_BY_16) ||
- ((Result == QUOTIENT_MAX_UINT64_DIVIDED_BY_16) &&
- (InternalAsciiHexCharToUintn (*String) <= REMAINDER_MAX_UINT64_DIVIDED_BY_16))
- );
+ ASSERT (Result <= RShiftU64 (((UINT64) ~0) - InternalHexCharToUintn (*String) , 4));
Result = LShiftU64 (Result, 4);
Result = Result + InternalAsciiHexCharToUintn (*String);
diff --git a/UnixPkg/Library/UnixBaseLib/X64/LongJump.S b/UnixPkg/Library/UnixBaseLib/X64/LongJump.S index d17592cf37..f20446fcf0 100644 --- a/UnixPkg/Library/UnixBaseLib/X64/LongJump.S +++ b/UnixPkg/Library/UnixBaseLib/X64/LongJump.S @@ -23,12 +23,12 @@ # VOID
# EFIAPI
# InternalLongJump (
-# IN BASE_LIBRARY_JUMP_BUFFER *JumpBuffer, // %rcx
-# IN UINTN Value // %rdx
+# IN BASE_LIBRARY_JUMP_BUFFER *JumpBuffer,
+# IN UINTN Value
# );
#------------------------------------------------------------------------------
-ASM_GLOBAL ASM_PFX(EfiInternalLongJump)
-ASM_PFX(EfiInternalLongJump):
+ASM_GLOBAL ASM_PFX(InternalLongJump)
+ASM_PFX(InternalLongJump):
mov (%rcx), %rbx
mov 0x8(%rcx), %rsp
mov 0x10(%rcx), %rbp
@@ -52,37 +52,3 @@ ASM_PFX(EfiInternalLongJump): movdqu 0xE8(%rcx), %xmm15
mov %rdx, %rax # set return value
jmp *0x48(%rcx)
-
-#------------------------------------------------------------------------------
-# VOID
-# EFIAPI
-# UnixInternalLongJump (
-# IN BASE_LIBRARY_JUMP_BUFFER *JumpBuffer, // %rdi
-# IN UINTN Value // %rsi
-# );
-#------------------------------------------------------------------------------
-ASM_GLOBAL ASM_PFX(InternalLongJump)
-ASM_PFX(InternalLongJump):
- mov (%rdi), %rbx
- mov 0x8(%rdi), %rsp
- mov 0x10(%rdi), %rbp
- mov 0x18(%rdi), %rdi
- mov 0x20(%rdi), %rsi
- mov 0x28(%rdi), %r12
- mov 0x30(%rdi), %r13
- mov 0x38(%rdi), %r14
- mov 0x40(%rdi), %r15
- # load non-volatile fp registers
- ldmxcsr 0x50(%rdi)
- movdqu 0x58(%rdi), %xmm6
- movdqu 0x68(%rdi), %xmm7
- movdqu 0x78(%rdi), %xmm8
- movdqu 0x88(%rdi), %xmm9
- movdqu 0x98(%rdi), %xmm10
- movdqu 0xA8(%rdi), %xmm11
- movdqu 0xB8(%rdi), %xmm12
- movdqu 0xC8(%rdi), %xmm13
- movdqu 0xD8(%rdi), %xmm14
- movdqu 0xE8(%rdi), %xmm15
- mov %rsi, %rax # set return value
- jmp *0x48(%rdi)
diff --git a/UnixPkg/Library/UnixBaseLib/X64/SetJump.S b/UnixPkg/Library/UnixBaseLib/X64/SetJump.S index b5fd38ab6a..ea9e225a93 100644 --- a/UnixPkg/Library/UnixBaseLib/X64/SetJump.S +++ b/UnixPkg/Library/UnixBaseLib/X64/SetJump.S @@ -19,8 +19,8 @@ #
#------------------------------------------------------------------------------
-ASM_GLOBAL ASM_PFX(EfiSetJump)
-ASM_PFX(EfiSetJump):
+ASM_GLOBAL ASM_PFX(SetJump)
+ASM_PFX(SetJump):
push %rcx
add $0xffffffffffffffe0,%rsp
call ASM_PFX(InternalAssertJumpBuffer)
@@ -51,32 +51,3 @@ ASM_PFX(EfiSetJump): movdqu %xmm15, 0xE8(%rcx)
xor %rax,%rax
jmpq *%rdx
-
-
-ASM_GLOBAL ASM_PFX(SetJump)
-ASM_PFX(SetJump):
- pop %rdx
- mov %rbx,(%rdi) # Rbx
- mov %rsp,0x8(%rdi)
- mov %rbp,0x10(%rdi)
- mov %rcx,0x18(%rdi)
- mov %rsi,0x20(%rdi)
- mov %r12,0x28(%rdi)
- mov %r13,0x30(%rdi)
- mov %r14,0x38(%rdi)
- mov %r15,0x40(%rdi)
- mov %rdx,0x48(%rdi)
- # save non-volatile fp registers
- stmxcsr 0x50(%rdi)
- movdqu %xmm6, 0x58(%rdi)
- movdqu %xmm7, 0x68(%rdi)
- movdqu %xmm8, 0x78(%rdi)
- movdqu %xmm9, 0x88(%rdi)
- movdqu %xmm10, 0x98(%rdi)
- movdqu %xmm11, 0xA8(%rdi)
- movdqu %xmm12, 0xB8(%rdi)
- movdqu %xmm13, 0xC8(%rdi)
- movdqu %xmm14, 0xD8(%rdi)
- movdqu %xmm15, 0xE8(%rdi)
- xor %rax,%rax
- jmpq *%rdx
diff --git a/UnixPkg/Library/UnixBaseLib/X64/SwitchStack.S b/UnixPkg/Library/UnixBaseLib/X64/SwitchStack.S index b6dff5ed77..3a84b0d22f 100644 --- a/UnixPkg/Library/UnixBaseLib/X64/SwitchStack.S +++ b/UnixPkg/Library/UnixBaseLib/X64/SwitchStack.S @@ -35,45 +35,17 @@ # None
#
#------------------------------------------------------------------------------
-ASM_GLOBAL ASM_PFX(EfiInternalSwitchStack)
-ASM_PFX(EfiInternalSwitchStack):
- mov %rcx, %rax
- mov %rdx, %rcx
- mov %r8, %rdx
- #
- # Reserve space for register parameters (rcx, rdx, r8 & r9) on the stack,
- # in case the callee wishes to spill them.
- #
- lea -0x20(%r9), %rsp
- call *%rax
-
-
-
-#------------------------------------------------------------------------------
-# Routine Description:
-#
-# Routine for switching stacks with 2 parameters (Unix ABI)
-#
-# Arguments:
-#
-# (rdi) EntryPoint - Entry point with new stack.
-# (rsi) Context1 - Parameter1 for entry point.
-# (rdx) Context2 - Parameter2 for entry point.
-# (rcx) NewStack - The pointer to new stack.
-#
-# Returns:
-#
-# None
-#
-#------------------------------------------------------------------------------
ASM_GLOBAL ASM_PFX(InternalSwitchStack)
ASM_PFX(InternalSwitchStack):
- mov %rdi, %rax
- mov %rsi, %rdi
- mov %rdx, %rsi
+ movq %rcx, %rax
+ movq %rdx, %rcx
+ movq %r8, %rdx
+ movq %r9, %rsp
+
#
# Reserve space for register parameters (rcx, rdx, r8 & r9) on the stack,
# in case the callee wishes to spill them.
#
- lea -0x20(%rcx), %rsp
+ subq $40, %rsp // 32-byte shadow space plus alignment pad
+
call *%rax
|