You've already forked slimbootloader
mirror of
https://github.com/Dasharo/slimbootloader.git
synced 2026-03-06 15:26:20 -08:00
* Sync BaseTools to align with edk2-stable202311 Keep the SBL specific change (e.g. Lz4). Signed-off-by: Guo Dong <guo.dong@intel.com> * feat: Sync MdePkg from EDK2 edk2-stable202311 branch Only sync required file without any changes to EDK2 files. Signed-off-by: Guo Dong <guo.dong@intel.com> * feat: Update MdePkg for SBL after sync from EDK2 Signed-off-by: Guo Dong <guo.dong@intel.com> * Update SBL after updating Basetool and MdePkg After Sync BaseTool and MdePkg to edk2-stable202311, Need update SBL code to align with this change. Signed-off-by: Guo Dong <guo.dong@intel.com> * feat: rollback some changes after mdepkg sync New change from MdePkg requires new NASM version. To make sure NASM 2.14.02 still works, just rollback few changes. Signed-off-by: Guo Dong <guo.dong@intel.com> * feat: Update component size to fix build failure After syncing BaseTool and MdePkg, some components would have a little bigger size. So update the config to fix the build failure. Signed-off-by: Guo Dong <guo.dong@intel.com> * feat: Remove unused asl code Some ASL files don't exist but they are included in other asl files. It would cause build failure with new build BaseTool. So just remove them to fix the build failure. Signed-off-by: Guo Dong <guo.dong@intel.com> --------- Signed-off-by: Guo Dong <guo.dong@intel.com>
118 lines
3.5 KiB
C
118 lines
3.5 KiB
C
/** @file
|
|
Math worker functions.
|
|
|
|
Copyright (c) 2021, Intel Corporation. All rights reserved.<BR>
|
|
SPDX-License-Identifier: BSD-2-Clause-Patent
|
|
|
|
**/
|
|
|
|
#include "BaseLibInternals.h"
|
|
|
|
/**
|
|
This function is identical to perform QuickSort,
|
|
except that is uses the pre-allocated buffer so the in place sorting does not need to
|
|
allocate and free buffers constantly.
|
|
|
|
Each element must be equal sized.
|
|
|
|
if BufferToSort is NULL, then ASSERT.
|
|
if CompareFunction is NULL, then ASSERT.
|
|
if BufferOneElement is NULL, then ASSERT.
|
|
if ElementSize is < 1, then ASSERT.
|
|
|
|
if Count is < 2 then perform no action.
|
|
|
|
@param[in, out] BufferToSort on call a Buffer of (possibly sorted) elements
|
|
on return a buffer of sorted elements
|
|
@param[in] Count the number of elements in the buffer to sort
|
|
@param[in] ElementSize Size of an element in bytes
|
|
@param[in] CompareFunction The function to call to perform the comparison
|
|
of any 2 elements
|
|
@param[out] BufferOneElement Caller provided buffer whose size equals to ElementSize.
|
|
It's used by QuickSort() for swapping in sorting.
|
|
**/
|
|
VOID
|
|
EFIAPI
|
|
QuickSort (
|
|
IN OUT VOID *BufferToSort,
|
|
IN CONST UINTN Count,
|
|
IN CONST UINTN ElementSize,
|
|
IN BASE_SORT_COMPARE CompareFunction,
|
|
OUT VOID *BufferOneElement
|
|
)
|
|
{
|
|
VOID *Pivot;
|
|
UINTN LoopCount;
|
|
UINTN NextSwapLocation;
|
|
|
|
ASSERT (BufferToSort != NULL);
|
|
ASSERT (CompareFunction != NULL);
|
|
ASSERT (BufferOneElement != NULL);
|
|
ASSERT (ElementSize >= 1);
|
|
|
|
if (Count < 2) {
|
|
return;
|
|
}
|
|
|
|
NextSwapLocation = 0;
|
|
|
|
//
|
|
// pick a pivot (we choose last element)
|
|
//
|
|
Pivot = ((UINT8 *)BufferToSort + ((Count - 1) * ElementSize));
|
|
|
|
//
|
|
// Now get the pivot such that all on "left" are below it
|
|
// and everything "right" are above it
|
|
//
|
|
for (LoopCount = 0; LoopCount < Count -1; LoopCount++) {
|
|
//
|
|
// if the element is less than or equal to the pivot
|
|
//
|
|
if (CompareFunction ((VOID *)((UINT8 *)BufferToSort + ((LoopCount) * ElementSize)), Pivot) <= 0) {
|
|
//
|
|
// swap
|
|
//
|
|
CopyMem (BufferOneElement, (UINT8 *)BufferToSort + (NextSwapLocation * ElementSize), ElementSize);
|
|
CopyMem ((UINT8 *)BufferToSort + (NextSwapLocation * ElementSize), (UINT8 *)BufferToSort + ((LoopCount) * ElementSize), ElementSize);
|
|
CopyMem ((UINT8 *)BufferToSort + ((LoopCount)*ElementSize), BufferOneElement, ElementSize);
|
|
|
|
//
|
|
// increment NextSwapLocation
|
|
//
|
|
NextSwapLocation++;
|
|
}
|
|
}
|
|
|
|
//
|
|
// swap pivot to it's final position (NextSwapLocation)
|
|
//
|
|
CopyMem (BufferOneElement, Pivot, ElementSize);
|
|
CopyMem (Pivot, (UINT8 *)BufferToSort + (NextSwapLocation * ElementSize), ElementSize);
|
|
CopyMem ((UINT8 *)BufferToSort + (NextSwapLocation * ElementSize), BufferOneElement, ElementSize);
|
|
|
|
//
|
|
// Now recurse on 2 partial lists. neither of these will have the 'pivot' element
|
|
// IE list is sorted left half, pivot element, sorted right half...
|
|
//
|
|
if (NextSwapLocation >= 2) {
|
|
QuickSort (
|
|
BufferToSort,
|
|
NextSwapLocation,
|
|
ElementSize,
|
|
CompareFunction,
|
|
BufferOneElement
|
|
);
|
|
}
|
|
|
|
if ((Count - NextSwapLocation - 1) >= 2) {
|
|
QuickSort (
|
|
(UINT8 *)BufferToSort + (NextSwapLocation + 1) * ElementSize,
|
|
Count - NextSwapLocation - 1,
|
|
ElementSize,
|
|
CompareFunction,
|
|
BufferOneElement
|
|
);
|
|
}
|
|
}
|