190 lines
5.0 KiB
C
190 lines
5.0 KiB
C
/*++
|
||
|
||
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) );
|
||
}
|
||
}
|