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);
|
||
|
}
|