summaryrefslogtreecommitdiffstats
path: root/private/mvdm/xms.486/xmsmemr.c
diff options
context:
space:
mode:
Diffstat (limited to 'private/mvdm/xms.486/xmsmemr.c')
-rw-r--r--private/mvdm/xms.486/xmsmemr.c167
1 files changed, 167 insertions, 0 deletions
diff --git a/private/mvdm/xms.486/xmsmemr.c b/private/mvdm/xms.486/xmsmemr.c
new file mode 100644
index 000000000..9a495d671
--- /dev/null
+++ b/private/mvdm/xms.486/xmsmemr.c
@@ -0,0 +1,167 @@
+/*++
+
+Copyright (c) 1992 Microsoft Corporation
+
+Module Name:
+
+ xmscmt86.c
+
+Abstract:
+
+ This module conains the memory commit/decommit/move routines
+ for risc.
+
+Author:
+
+ Dave Hastings (daveh) creation-date 25-Jan-1994
+
+Revision History:
+
+
+--*/
+#include <xms.h>
+#include <suballoc.h>
+#include <softpc.h>
+
+NTSTATUS
+xmsCommitBlock(
+ ULONG BaseAddress,
+ ULONG Size
+ )
+/*++
+
+Routine Description:
+
+ This routine commits a block of memory using sas_manage_xms.
+
+Arguments:
+
+ BaseAddress -- Supplies the base address to commit memory at
+ Size -- Supplies the size of the block to commit
+
+Return Value:
+
+ 0 if successfull
+
+--*/
+{
+ BOOL Status;
+
+ //
+ // Perform the allocation
+ //
+ Status = sas_manage_xms(
+ (PVOID)BaseAddress,
+ Size,
+ 1
+ );
+
+ //
+ // We elected to have 0 indicate success, because that allows
+ // us to directly pass back NTSTATUS codes. On x86 we use
+ // NT memory management to do the commit for us, and the returned
+ // status code contains more information than just success or failure
+ //
+
+ if (Status) {
+ return STATUS_SUCCESS;
+ } else {
+ return -1;
+ }
+}
+
+NTSTATUS
+xmsDecommitBlock(
+ ULONG BaseAddress,
+ ULONG Size
+ )
+/*++
+
+Routine Description:
+
+ This routine commits a block of memory using sas_manage_xms.
+
+Arguments:
+
+ BaseAddress -- Supplies the base address to decommit memory at
+ Size -- Supplies the size of the block to decommit
+
+Return Value:
+
+ 0 if successful
+
+--*/
+{
+ BOOL Status;
+
+ //
+ // Perform the allocation
+ //
+ Status = sas_manage_xms(
+ (PVOID)BaseAddress,
+ Size,
+ 2
+ );
+
+ //
+ // We elected to have 0 indicate success, because that allows
+ // us to directly pass back NTSTATUS codes. On x86 we use
+ // NT memory management to do the commit for us, and the returned
+ // status code contains more information than just success or failure
+ //
+ if (Status) {
+ return STATUS_SUCCESS;
+ } else {
+ return -1;
+ }
+}
+
+VOID
+xmsMoveMemory(
+ ULONG Destination,
+ ULONG Source,
+ ULONG Count
+ )
+/*++
+
+Routine Description:
+
+ This routine moves a block of memory, and notifies the emulator.
+ It correctly handles overlapping source and destination
+
+Arguments:
+
+ Destination -- Supplies a pointer to the destination Intel (NOT Linear)
+ Address
+ Source -- Supplies a pointer to the source Intel Address
+ Count -- Supplies the number of bytes to move
+
+Return Value:
+
+ None.
+
+--*/
+{
+ ULONG SoftpcBase;
+
+ //
+ // Get the linear address of the beginning of Intel memory
+ //
+ SoftpcBase = (ULONG) GetVDMAddr(0,0);
+
+ //
+ // Move the memory
+ //
+ RtlMoveMemory(
+ (PVOID)((ULONG)Destination + SoftpcBase),
+ (PVOID)((ULONG)Source + SoftpcBase),
+ Count
+ );
+
+ // WARNING!!!! Donot use Sim32FlushVDMPoiner unless you know the exact segment
+ // address. In this case, we have no idea what the segment value is, all we
+ // know is its "linear address".
+
+ sas_overwrite_memory((PBYTE)Destination, Count);
+
+}