112 lines
2.5 KiB
C
112 lines
2.5 KiB
C
/*++
|
|
|
|
Copyright (c) 2001 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
physical.c
|
|
|
|
Abstract:
|
|
|
|
This module implements the XBOX physical memory management services.
|
|
|
|
--*/
|
|
|
|
#include "basedll.h"
|
|
#pragma hdrstop
|
|
|
|
LPVOID
|
|
WINAPI
|
|
XPhysicalAlloc(
|
|
IN SIZE_T dwSize,
|
|
IN ULONG_PTR ulPhysicalAddress,
|
|
IN ULONG_PTR ulAlignment,
|
|
IN DWORD flProtect
|
|
)
|
|
{
|
|
ULONG ulLowestAcceptableAddress;
|
|
ULONG ulHighestAcceptableAddress;
|
|
LPVOID lpAddress;
|
|
|
|
RIP_ON_NOT_TRUE("XPhysicalAlloc()", (dwSize != 0));
|
|
RIP_ON_NOT_TRUE("XPhysicalAlloc()", ((ulAlignment & (ulAlignment - 1)) == 0));
|
|
RIP_ON_NOT_TRUE("XPhysicalAlloc()",
|
|
((flProtect & ~(PAGE_READWRITE | PAGE_READONLY | PAGE_WRITECOMBINE | PAGE_NOCACHE)) == 0));
|
|
|
|
if (ulPhysicalAddress != MAXULONG_PTR) {
|
|
|
|
RIP_ON_NOT_TRUE("XPhysicalAlloc()", (BYTE_OFFSET(ulPhysicalAddress) == 0));
|
|
|
|
ulLowestAcceptableAddress = ulPhysicalAddress;
|
|
ulHighestAcceptableAddress = ulPhysicalAddress + dwSize - 1;
|
|
|
|
//
|
|
// Ignore the alignment parameter; the caller gave us a physical address
|
|
// and we assume it has the appropriate alignment already applied.
|
|
//
|
|
|
|
ulAlignment = 0;
|
|
|
|
} else {
|
|
ulLowestAcceptableAddress = 0;
|
|
ulHighestAcceptableAddress = MAXULONG_PTR;
|
|
}
|
|
|
|
lpAddress = MmAllocateContiguousMemoryEx(dwSize, ulLowestAcceptableAddress,
|
|
ulHighestAcceptableAddress, ulAlignment, flProtect);
|
|
|
|
if (lpAddress == NULL) {
|
|
SetLastError(ERROR_NOT_ENOUGH_MEMORY);
|
|
}
|
|
|
|
return lpAddress;
|
|
}
|
|
|
|
SIZE_T
|
|
WINAPI
|
|
XPhysicalSize(
|
|
IN LPVOID lpAddress
|
|
)
|
|
{
|
|
RIP_ON_NOT_TRUE("XPhysicalSize()", ((ULONG_PTR)lpAddress >= 0x80000000));
|
|
|
|
return MmQueryAllocationSize(lpAddress);
|
|
}
|
|
|
|
VOID
|
|
WINAPI
|
|
XPhysicalProtect(
|
|
IN LPVOID lpAddress,
|
|
IN SIZE_T dwSize,
|
|
IN DWORD flNewProtect
|
|
)
|
|
{
|
|
RIP_ON_NOT_TRUE("XPhysicalProtect()", ((ULONG_PTR)lpAddress >= 0x80000000));
|
|
RIP_ON_NOT_TRUE("XPhysicalProtect()",
|
|
((flNewProtect & ~(PAGE_READWRITE | PAGE_READONLY | PAGE_WRITECOMBINE | PAGE_NOCACHE)) == 0));
|
|
|
|
if (dwSize != 0) {
|
|
MmSetAddressProtect(lpAddress, dwSize, flNewProtect);
|
|
}
|
|
}
|
|
|
|
VOID
|
|
WINAPI
|
|
XPhysicalFree(
|
|
IN LPVOID lpAddress
|
|
)
|
|
{
|
|
RIP_ON_NOT_TRUE("XPhysicalFree()", ((ULONG_PTR)lpAddress >= 0x80000000));
|
|
|
|
MmFreeContiguousMemory(lpAddress);
|
|
}
|
|
|
|
DWORD
|
|
WINAPI
|
|
XQueryMemoryProtect(
|
|
IN LPVOID lpAddress
|
|
)
|
|
{
|
|
return MmQueryAddressProtect(lpAddress);
|
|
}
|