;*** dxvcpi.inc - include file for vcpi functions/maintenance ; ; Copyright 1990-1991, Microsoft Corporation ; ; Purpose: ; ; Revision History: ; ; 08-07-90 earleh rearranged things to allow building Pmode data ; structures with total size exceeding that of LIM 3.2 page ; frame ; 05/09/90 jimmat Started incorporating VCPI changes from languages group. ; ; [] 20-Feb-1990 Dans Created ; ;************************************************************************/ CurrentCpu = @Cpu ;select 386 assembly if not already ife (CurrentCpu AND 0008h) .386 endif ; ; Hungarian used: ; la Linear Address ; za Physical Address ; ; ; ; Miscellaneous equates ; EMS_INT = 067h VCPIINT = 067h CBEMMSTR = 8h CPTDX = 1h ; count of user page tables dx uses CPTDXEXT = (CPTDX+1) ; count of total page tables dx uses CBPAGE386 = 1000h ; bytes in 386 page CBPAGE386LIM = 1000h-1 DXINDOS = 00000001b DXINEMS = 00000010b ; obsolete DXINVCPI = 00000100b DXINXMS = 00001000b ; ; See dxvcpi.asm for a rough sketch of the memory block that the ; following variables describe DXLINEARBASE = 80000000h ; Linear base of DX system memory VCPIPTOFF = 0 * CBPAGE386 ; vcpi's 0th page table DXPT1OFF = 1 * CBPAGE386 ; dx's first user page table DXPTSYSOFF = DXPT1OFF + (CPTDX * CBPAGE386) ; dx's system page table DXPDOFF = DXPTSYSOFF + CBPAGE386 ; page directory DXLASTPTOFF = DXPDOFF DXBOOTPTOFF = DXPTSYSOFF ; ; Last user page table is used to bootstrap our protected mode ; data into extended memory. ; DXTEMPPTOFF = DXPTSYSOFF - CBPAGE386 DX_TEMP_LINEARBASE = (DXTEMPPTOFF - VCPIPTOFF) shl 10 ; ; The next number comes from the dosx.map file, and is equal to the ; offset of the CODEENDPM symbol, plus whatever padding we want to use ; so we don't have to update this include file too often. ; if DEBUG DXPMCODESIZE = 04900H else ; DEBUG DXPMCODESIZE = 04000H endif ; DEBUG IDTOFF = DXLASTPTOFF + CBPAGE386 IDTSIZE = CDSCIDTDEFAULT * 8 IDTLIM = IDTSIZE - 1 TSSOFF = IDTOFF + IDTSIZE TSSTOP = TSSOFF + (type TSS386) GDTOFF = ((TSSTOP + 0fh) shr 4) shl 4 ; paragraph align GDTLIM = GDT_SIZE - 1 GDTTOP = GDTOFF + GDT_SIZE DXPMCODEOFF = ((GDTTOP + 0fh) shr 4) shl 4 ; paragraph align LDTOFF = ((DXPMCODEOFF + DXPMCODESIZE + CBPAGE386 - 1) shr 12) shl 12 LDTSIZE = CDSCMAXLDT * 8 LDTLIM = LDTSIZE - 1 LDTTOP = LDTOFF + LDTSIZE ; ; Final place where page tables are mapped in Protected mode is ; at the first linear page boundary after the end of the LDT. ; USERPT = (LDTTOP + CBPAGE386 - 1) shr 12 USERPTOFF = ((LDTTOP + CBPAGE386 - 1) shr 12) shl 12 ; ; The total number of 386 pages we need for the block that holds our ; system tables and protected mode code. ; DXPMPAGES = (LDTTOP + (CBPAGE386 - 1)) shr 12 DXPMBYTES = DXPMPAGES shl 12 DXPMPARAGRAPHS = DXPMBYTES shr 4 ; ; compile time asserts for sizes/offsets/alignment ; .ERRE (type TSS386) GE 104 .ERRE TSSTOP LE GDTOFF .ERRE IDTOFF EQ ((IDTOFF SHR 4) SHL 4) ; ; Limits of tables ; DXPTMAX = CPTDX * CBPAGE386 ; space we allocate for ; user page tables ; ; Linear pointers to bases of various tables when running under vcpi ; ; For a selDXPD descriptor (dos extender's page directory) ; LADXPDBASE = DXLINEARBASE + DXPDOFF ; For a selDXPT descriptor (dos extender's page tables) ; LADXPTBASE = DXLINEARBASE + USERPTOFF ; (Plus runtime value.) ; For a selGDT descriptor ; LADXGDTBASE = DXLINEARBASE + GDTOFF ; For a selLDT descriptor ; LADXLDTBASE = DXLINEARBASE + LDTOFF ; For a selIDT descriptor ; LADXIDTBASE = DXLINEARBASE + IDTOFF ; For a selTSS descriptor ; LADXTSS1BASE = DXLINEARBASE + TSSOFF LADXTSS2BASE = DXLINEARBASE + TSSOFF + type TSS386 ; For a SEL_DXPMCODE descriptor ; LADXPMCODEBASE = DXLINEARBASE + DXPMCODEOFF ; ; vcpi/ems service macros ; RMvcpi macro fCode ifnb mov ax, fCode endif int VCPIINT endm PMvcpi macro fCode ifnb mov ax, fCode endif cCall CallVCPIPM endm emscall macro fCode ifnb mov ax, fCode endif int EMS_INT endm ; EMS functions/subfunctions GETFRAMEADDRESS = 04100h ALLOCATEPAGES = 05A00h GETNUMOFPAGES = 04200h MAPHANDLEPAGE = 04400h DEALLOCATEPAGES = 04500h GETEMSVER = 04600h SETHANDLENAME = 05301h GETPAGEADDRS = 05800h GETNUMPAGEMAP = 05801h page ; ; VCPI functions/subfunctions ; all functions take the vcpi function code in ax as input ; all functions return ah=0 if successful, ah != 0 if failure ; if function return has no ah value, it can't fail (ah == 0) ; ; ; vcpi version, presence ; vcpiVER = 0de00h ; ; input: ; return: ah = 0, bl = vcpi minor revision, bh = major revision ; ; get protect mode interface ; vcpiPMINTERFACE = 0de01h ; ; input: es:di = ptr to 4k page table, ; ds:si = ptr to 3 entries in GDT ; return: di = 1st unused page table entry, ; ebx = offset in server CS of PM entry point ; ; get max physical address in system ; vcpiMAXPHYSADDR = 0de02h ; ; input: ; return: edx = physical addr of highest 4k page that ; could ever be allocated ; ; count of free 4k pages ; ; Note: This call gives the total 386 pages available to all tasks ; in the system from the VCPI server. According to VCPI version 1.0, ; however, we should only allocate as much memory as there is EMS ; memory available. The following call, therefore, is not real useful ; to us. ; vcpiCFREEPAGES = 0de03h ; ; input: ; return: edx = number of free 4k pages ; ; allocate a 4k page ; vcpiALLOCPAGE = 0de04h ; ; input: ; return: ah = 0, edx = physical address of allocated 4k page ; ah != 0, edx = trashed ; ; free a 4k page ; vcpiFREEPAGE = 0de05h ; ; input: edx = physical address of page to free ; return: ah = 0 ; ah != 0 ; ; physical address of page in 1st meg ; vcpiPHYSADDRPAGE= 0de06h ; ; input: cx = page number (linear addr of page SHR by 12) ; return: ah = 0, edx = physical address of 4k page ; ah != 0 ; ; read cr0 ; vcpiREADCR0 = 0de07h ; ; input: ; return: ebx = cr0 value ; ; read debug registers ; vcpiREADDRx = 0de08h ; ; input: es:di = ptr to 8 dwords, dr0 first, dr4, dr5 not present ; return: ; ; load debug registers ; vcpiLOADDRx = 0de09h ; ; input: es:di = ptr to 8 dwords, dr0 first, dr4, dr5 not present ; return: ; ; get mapping of hardware interrupts ; vcpiGET8259MAP = 0de0ah ; ; input: ; return: bx = 1st vector mapping for master 8259a ; cx = 1st vector mapping for slave 8259a ; set mapping of hardware interrupts ; vcpiSET8259MAP = 0de0bh ; ; input: interrupts disabled ; bx = 1st vector mapping for master 8259a ; cx = 1st vector mapping for slave 8259a ; return: ; ; switch from v86 mode to protect mode or protect mode to v86 mode ; vcpiSWITCHTOPM = 0de0ch ; ; input: interrupts disabled ; esi = linear address (in first megabyte) of data ; structure (v86topm struc) ; ; return: (output in pm) ; gdtr, idtr, ldtr, tr loaded ; ss:esp must have 16 bytes of space on it, pm must ; set up it's stack ; eax = trashed ; esi = trashed ; ds, es, fs, gs all modified ; interrupts disabled ; vcpiSWITCHTOV86 = 0de0ch ; ; input: interrupts disabled ; STACK: 28 dword gs ; 24 dword fs ; 20 dword ds ; 1c dword es ; 18 dword ss ; 14 dword esp ; 10 dword eflags reserved ; 0c dword cs xfer to ; 08 dword eip xfer to ; 00 qword far32 return (garbage) ; ; ; return: (output in rm) ; ss:esp loaded with values from stack ; segment registers loaded with stack values ; eax = trashed ; interrupts disabled ; ; structures ; VTP struc zaCr3VTP dd 0 ; physical addr of page directory laGdtrVTP dd 0 ; linear addr in first meg of gdtr laIdtrVTP dd 0 ; linear addr in first meg of idtr selLdtVTP dw 0 ; selector of ldt selTrVTP dw 0 ; selector of tr ipVTP dw 0 ; 48-bit address of protect unusedVTP dw 0 ; mode entry point to xfer to csVTP dw 0 ; VTP ends ife (CurrentCpu AND 0008h) ;restore cpu type if not 386 if (CurrentCpu AND 0080h) .286p else .286 endif endif