home *** CD-ROM | disk | FTP | other *** search
- /*
- * HITEST.C - Test Routines for HIMEM.SYS
- *
- * Copyright (c) 1988, Microsoft Corporation
- */
-
- #include "xmm.h"
-
- int quiet = 0;
-
- #define MAXHANDLES (32*2)
- #define BUFLEN 1024
-
- struct HandleInfo {
- short Handle;
- short Length;
- short Filler;
- unsigned long RealAddress;
- };
-
- struct HandleInfo HandleTable[MAXHANDLES];
-
- struct XMM_Move MoveS;
-
- short BufferLow[BUFLEN];
- short BufferExt[BUFLEN];
- short BufferHi[BUFLEN];
-
- main(argc, argv)
- char *argv[];
- {
- long XMM_Ret;
- int Request_Amount;
- int Handle, hi;
- long Alloc_Ret;
- short TotalAllocated = 0;
- short Handles;
- short MemPerHandle;
-
- if ( argc > 1 && argv[1][0] == 'q' )
- quiet = 1;
-
- if ( XMM_Installed() ) {
- printf("Extended Memory Manager Found\n\n");
- XMM_Ret = XMM_Version();
- printf("XMM Version %4X, Internal Version %4x\n\n",
- (short)XMM_Ret, (short)(XMM_Ret >> 16));
- } else {
- printf("No Extended Memory Manager Present\n\n");
- Exit_Test();
- }
- Request_Amount = 0;
- do {
- XMM_Ret = XMM_RequestHMA(Request_Amount);
- if ( XMM_Ret == 0 )
- break;
- Request_Amount++;
- } while ( Request_Amount );
- if ( XMM_Ret == 0 ) {
- printf("Got HMA with Request of %d Kb\n", Request_Amount);
- if ( XMM_RequestHMA(Request_Amount) == 0 ) {
- printf("Unexpected success requesting HMA again\n");
- }
- XMM_Ret = XMM_ReleaseHMA();
- if ( XMM_Ret )
- Error("Could not release HMA", XMM_Ret);
- else
- printq("Released HMA\n");
- } else {
- Error("Could not Get HMA", XMM_Ret);
- }
- EnableA20();
- EnableA20();
- DisableA20();
- EnableA20();
- DisableA20();
- EnableA20();
- DisableA20();
- DisableA20();
-
- /* Soak up all extended memory and handles */
- hi = 0;
- while ( hi < MAXHANDLES ) {
- long FreeExtended;
- FreeExtended = XMM_QueryLargestFree();
- if ( FreeExtended < 0 ) {
- if ( XMSERROR(FreeExtended) == (char)0xA0 )
- FreeExtended = 0L;
- else {
- Error("Query Free Extended Failed", FreeExtended);
- break;
- }
- }
- if ( hi < MAXHANDLES -1 && FreeExtended > 1 )
- FreeExtended /= 2;
- if ( !quiet )
- printf("Attempt to Allocate %d Kb\n", FreeExtended);
- Alloc_Ret = XMM_AllocateExtended(FreeExtended);
- if ( Alloc_Ret < 0 ) {
- if ( XMSERROR(Alloc_Ret) == (char)0xA1 )
- break;
- Error("Allocate Failed", Alloc_Ret);
- } else {
- TotalAllocated += FreeExtended;
- HandleTable[hi].Handle = (short)Alloc_Ret;
- }
- hi++;
- }
- Handles = hi;
- printf("%d Kb Free Found and Allocated \n", TotalAllocated);
- printf("%d handle(s) allocated\n", Handles);
- printq("Freeing first handle\n");
- XMM_Ret = XMM_FreeExtended(HandleTable[0].Handle);
- if ( XMM_Ret )
- Error("Free Extended Memory Block", XMM_Ret);
- printq("Reallocate first handle with 0 length\n");
- Alloc_Ret = XMM_AllocateExtended(0);
- if ( Alloc_Ret < 0 )
- Error("Zero Length Allocate failed", Alloc_Ret);
- else
- HandleTable[0].Handle = (short)Alloc_Ret;
- hi = 0;
- while ( hi < Handles ) {
- if ( HandleTable[hi].Handle == 0 )
- break;
- if ( !quiet )
- printf("Freeing Handle #%d (%x)\n", hi,
- HandleTable[hi].Handle);
- XMM_Ret = XMM_FreeExtended(HandleTable[hi].Handle);
- if ( XMM_Ret )
- Error("Free Extended Memory Block", XMM_Ret);
- hi++;
- }
-
- if ( Handles == 0 )
- Exit_Test();
- MemPerHandle = TotalAllocated / Handles + 1;
- if ( (long)BUFLEN < MemPerHandle * 512L )
- MemPerHandle = BUFLEN/512;
- if ( !quiet )
- printf("Allocating in %d Kb chunks\n", MemPerHandle);
- hi = 0;
- while ( hi < Handles ) {
- XMM_Ret = XMM_AllocateExtended(MemPerHandle);
- if ( XMM_Ret < 0 ) {
- if ( XMSERROR(XMM_Ret) != 0xA0 )
- Error("Allocate", XMM_Ret);
- break;
- }
- HandleTable[hi].Handle = (short)XMM_Ret;
- HandleTable[hi].Length = MemPerHandle;
- XMM_Ret = XMM_LockExtended((short)XMM_Ret);
- if ( XMM_Ret < 0 ) {
- printf("Handle %4x: ", HandleTable[hi].Handle);
- Error("Lock Failed", XMM_Ret);
- }
- if ( !quiet )
- printf("Handle %4x: Real Address %lx\n", HandleTable[hi].Handle,XMM_Ret);
- HandleTable[hi].RealAddress = XMM_Ret;
- XMM_Ret = XMM_FreeExtended(HandleTable[hi].Handle);
- if ( XMM_Ret >= 0 ) {
- printf("Unexpected success freeing locked Handle\n");
- break;
- } else if ( XMSERROR(XMM_Ret) != (char)0xAB ) {
- Error("Freeing Locked Handle", XMM_Ret);
- }
- Fill(BufferExt, HandleTable[hi].Handle ^ 0xAAAA, BUFLEN);
- MoveS.Length = MemPerHandle*1024L;
- MoveS.SourceHandle = 0;
- (char far *)MoveS.SourceOffset = (char far *)BufferExt;
- MoveS.DestHandle = HandleTable[hi].Handle;
- MoveS.DestOffset = 0L;
- XMM_Ret = XMM_MoveExtended(&MoveS);
- if ( XMM_Ret < 0 )
- Error("Move to Extended Memory Failed", XMM_Ret);
- hi++;
- }
- Handles = hi; /* How many we got this time */
-
- if ( hi == 0 )
- Exit_Test();
-
- while ( --hi >= 0 ) {
- if ( !quiet )
- printf("Checking Handle %x\n", HandleTable[hi].Handle);
- Fill(BufferLow, HandleTable[hi].Handle ^ 0xAAAA, BUFLEN);
- MoveS.Length = MemPerHandle*1024L;
- MoveS.SourceHandle = HandleTable[hi].Handle;
- MoveS.SourceOffset = 0L;
- MoveS.DestHandle = 0;
- (char far *)MoveS.DestOffset = (char far *)BufferHi;
- XMM_Ret = XMM_MoveExtended(&MoveS);
- if ( XMM_Ret < 0 )
- Error("Move from Extended Memory Failed", XMM_Ret);
- if ( Cmp(BufferLow, BufferHi, BUFLEN) )
- printf("Comparison Failed, Handle %x\n",
- HandleTable[hi].Handle);
- XMM_Ret = XMM_UnlockExtended(HandleTable[hi].Handle);
- if ( XMM_Ret < 0 )
- Error("Unlock of Extended Memory Failed", XMM_Ret);
- }
-
- hi = 0;
- while ( hi < Handles ) {
- Fill(BufferLow, HandleTable[hi].Handle ^ 0xAAAA, BUFLEN);
- MoveS.Length = MemPerHandle*1024L;
- MoveS.SourceHandle = HandleTable[hi].Handle;
- MoveS.SourceOffset = 0L;
- MoveS.DestHandle = 0;
- (char far *)MoveS.DestOffset = (char far *)BufferHi;
- XMM_Ret = XMM_MoveExtended(&MoveS);
- if ( XMM_Ret < 0 )
- Error("Move from Unlocked Extended Memory Failed", XMM_Ret);
- if ( Cmp(BufferLow, BufferHi, MemPerHandle*512) )
- printf("Comparison Failed, Unlocked Handle %x\n",
- HandleTable[hi].Handle);
-
- /* Check weird cases */
- MoveS.Length = 1;
- XMM_Ret = XMM_MoveExtended(&MoveS);
- if ( XMSERROR(XMM_Ret) != (char)0xA7 )
- Error("Move Extended with Odd Length", XMM_Ret);
-
- MoveS.Length = MemPerHandle*1024L + 2;
- XMM_Ret = XMM_MoveExtended(&MoveS);
- if ( XMSERROR(XMM_Ret) != (char)0xA7 )
- Error("Move Extended with Length too long", XMM_Ret);
-
- MoveS.Length = MemPerHandle*1024L -2;
- MoveS.SourceOffset = 4L;
- XMM_Ret = XMM_MoveExtended(&MoveS);
- if ( XMM_Ret >= 0 )
- Error("Move Extended Base+Length too large", XMM_Ret);
-
- XMM_Ret = XMM_FreeExtended(HandleTable[hi].Handle);
- if ( XMM_Ret < 0 )
- Error("Free of Extended Memory Failed", XMM_Ret);
-
- XMM_Ret = XMM_MoveExtended(&MoveS);
- if ( XMSERROR(XMM_Ret) != (char)0xA3 )
- Error("Move Extended from Invalid Handle", XMM_Ret);
- hi++;
- }
-
- TestWrap();
-
- Exit_Test();
- }
-
- TestWrap()
- {
- long XMM_Ret;
-
- printq("Try Moves from Wrap Area\n");
- MoveS.Length = BUFLEN*2;
- MoveS.SourceHandle = 0;
- MoveS.SourceOffset = 0xFFFFF800L;
- XMM_Ret = XMM_MoveExtended(&MoveS);
- if ( XMM_Ret < 0 )
- Error("Move Extended at end of Conventional", XMM_Ret);
-
- MoveS.Length += 2;
- XMM_Ret = XMM_MoveExtended(&MoveS);
- if ( XMSERROR(XMM_Ret) != (char)0xA7 )
- Error("Move Extended overflowing end of Conventional", XMM_Ret);
- }
-
- EnableA20()
- {
- long XMM_Ret;
-
- printq("Enable A20: ");
- XMM_Ret = XMM_EnableA20();
- if ( XMM_Ret < 0 )
- Error("A20 not enabled", XMM_Ret);
- QueryA20();
- }
-
- DisableA20()
- {
- long XMM_Ret;
-
- printq("Disable A20: ");
- XMM_Ret = XMM_DisableA20();
- if ( XMM_Ret < 0 )
- Error("A20 not disabled", XMM_Ret);
- QueryA20();
- }
-
- QueryA20()
- {
- long XMM_Ret;
-
- printq("Query A20: ");
- XMM_Ret = XMM_QueryA20();
- if ( XMM_Ret == 1 )
- printq("A20 Enabled\n");
- else if ( XMM_Ret == 0 )
- printq("A20 Disabled\n");
- else
- Error("Failed", XMM_Ret);
- }
-
- Fill(ptr, pattern, count)
- int *ptr;
- {
- while ( count-- )
- *ptr++ = pattern++;
- }
-
- Cmp(ptr1, ptr2, count)
- int *ptr1, *ptr2;
- {
- while ( count-- )
- if ( *ptr1++ != *ptr2++ )
- return(1);
-
- return(0);
- }
-
- printq(arg)
- {
- if ( !quiet )
- printf(arg);
- }
-
- Error(string, code)
- char *string;
- long code;
- {
- if ( code < 0 ) {
- code = XMSERROR(code);
- printf("%s, Error Code %2x\n", string, (unsigned)code);
- } else if ( !quiet )
- printf("%s\n", string);
- }
-
- Exit_Test()
- {
- printf("\nXMM Test Completed\n");
- exit(0);
- }
-