NT4/private/ntos/boot/lib/alpha/alphamem.c
2020-09-30 17:12:29 +02:00

190 lines
5.0 KiB
C
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*++
Copyright (c) 1991 Microsoft Corporation
Module Name:
alphamem.c
Abstract:
This module implements the Alpha AXP specific OS loader memory allocation
routines.
Author:
David N. Cutler (davec) 19-May-1991
Rod N. Gamache [DEC] 6-July-1993
Taken mostly from BLMEMORY.C.
Revision History:
--*/
#include "bldr.h"
//
// Define memory allocation descriptor listhead and heap storage variables.
//
extern PLOADER_PARAMETER_BLOCK BlLoaderBlock;
ARC_STATUS
BlAllocateSpecialMemory (
IN TYPE_OF_MEMORY MemoryType,
IN ULONG BasePage,
IN ULONG PageCount,
OUT PULONG ActualBase
)
/*++
Routine Description:
This routine allocates memory and generates one of more memory
descriptors to describe the allocated region. The first attempt
is to allocate the specified region of memory that is of type
LoaderSpecialMemory. If the memory is not available, then the smallest
region of 'special' memory that satisfies the request is allocated.
Arguments:
MemoryType - Supplies the memory type that is to be assigend to
the generated descriptor.
BasePage - Supplies the base page number of the desired region.
PageCount - Supplies the number of pages required.
ActualBase - Supplies a pointer to a variable that receives the
page number of the allocated region.
Return Value:
ESUCCESS is returned if an available block of 'special' memory can be
allocated. Otherwise, return a unsuccessful status.
--*/
{
PMEMORY_ALLOCATION_DESCRIPTOR SpecialDescriptor;
PMEMORY_ALLOCATION_DESCRIPTOR NextDescriptor;
PLIST_ENTRY NextEntry;
LONG Offset;
ARC_STATUS Status;
//
// Attempt to find a 'special' memory descriptor that encompasses the
// specified region or a 'special' memory descriptor that is large
// enough to satisfy the request.
//
SpecialDescriptor = NULL;
NextEntry = BlLoaderBlock->MemoryDescriptorListHead.Flink;
while (NextEntry != &BlLoaderBlock->MemoryDescriptorListHead) {
NextDescriptor = CONTAINING_RECORD(NextEntry,
MEMORY_ALLOCATION_DESCRIPTOR,
ListEntry);
if (NextDescriptor->MemoryType == LoaderSpecialMemory) {
Offset = BasePage - NextDescriptor->BasePage;
if ((Offset >= 0) &&
(NextDescriptor->PageCount >= (ULONG)(Offset + PageCount))) {
Status = BlGenerateDescriptor(NextDescriptor,
MemoryType,
BasePage,
PageCount);
*ActualBase = BasePage;
return Status;
} else {
if (NextDescriptor->PageCount >= PageCount) {
if ((SpecialDescriptor == NULL) ||
((SpecialDescriptor != NULL) &&
(NextDescriptor->PageCount < SpecialDescriptor->PageCount))) {
SpecialDescriptor = NextDescriptor;
}
}
}
}
NextEntry = NextEntry->Flink;
}
//
// If a 'special' region that is large enough to satisfy the request was
// found, then allocate the space from that descriptor. Otherwise,
// return an unsuccessful status.
//
if (SpecialDescriptor != NULL) {
*ActualBase = SpecialDescriptor->BasePage;
return BlGenerateDescriptor(SpecialDescriptor,
MemoryType,
SpecialDescriptor->BasePage,
PageCount);
} else {
return ENOMEM;
}
}
ARC_STATUS
BlAllocateAnyMemory (
IN TYPE_OF_MEMORY MemoryType,
IN ULONG BasePage,
IN ULONG PageCount,
OUT PULONG ActualBase
)
/*++
Routine Description:
This routine allocates memory and generates one of more memory
descriptors to describe the allocated region. The first attempt
is to allocate the specified region of memory that is of type
LoaderSpecialMemory. If the memory is not available, then a region
of Free memory is requested. Arguments are the same as
BlAllocateSpecialMemory and BlAllocateDescriptor.
Arguments:
MemoryType - Supplies the memory type that is to be assigend to
the generated descriptor.
BasePage - Supplies the base page number of the desired region.
PageCount - Supplies the number of pages required.
ActualBase - Supplies a pointer to a variable that receives the
page number of the allocated region.
Return Value:
ESUCCESS is returned if an available block of 'special' memory can be
allocated. Otherwise, return a unsuccessful status.
--*/
{
ARC_STATUS Status;
Status = BlAllocateSpecialMemory(MemoryType,
BasePage,
PageCount,
ActualBase);
if ( Status == ESUCCESS ) {
return Status;
} else {
return ( BlAllocateDescriptor(MemoryType,
BasePage,
PageCount,
ActualBase) );
}
}