252 lines
7.2 KiB
C
252 lines
7.2 KiB
C
/****************************************************************************
|
|
*
|
|
* SciTech OS Portability Manager Library
|
|
*
|
|
* ========================================================================
|
|
*
|
|
* The contents of this file are subject to the SciTech MGL Public
|
|
* License Version 1.0 (the "License"); you may not use this file
|
|
* except in compliance with the License. You may obtain a copy of
|
|
* the License at http://www.scitechsoft.com/mgl-license.txt
|
|
*
|
|
* Software distributed under the License is distributed on an
|
|
* "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
|
|
* implied. See the License for the specific language governing
|
|
* rights and limitations under the License.
|
|
*
|
|
* The Original Code is Copyright (C) 1991-1998 SciTech Software, Inc.
|
|
*
|
|
* The Initial Developer of the Original Code is SciTech Software, Inc.
|
|
* All Rights Reserved.
|
|
*
|
|
* ========================================================================
|
|
*
|
|
* Language: ANSI C
|
|
* Environment: 32-bit Windows NT device drivers.
|
|
*
|
|
* Description: Implementation for the real mode software interrupt
|
|
* handling functions.
|
|
*
|
|
****************************************************************************/
|
|
|
|
#include "pmapi.h"
|
|
#include "drvlib/os/os.h"
|
|
#include "sdd/sddhelp.h"
|
|
#include "mtrr.h"
|
|
#include "oshdr.h"
|
|
|
|
/*----------------------------- Implementation ----------------------------*/
|
|
|
|
/****************************************************************************
|
|
REMARKS:
|
|
We do have limited BIOS access under Windows NT device drivers.
|
|
****************************************************************************/
|
|
ibool PMAPI PM_haveBIOSAccess(void)
|
|
{
|
|
/* Return false unless we have full buffer passing! */
|
|
return false;
|
|
}
|
|
|
|
/****************************************************************************
|
|
PARAMETERS:
|
|
len - Place to store the length of the buffer
|
|
rseg - Place to store the real mode segment of the buffer
|
|
roff - Place to store the real mode offset of the buffer
|
|
|
|
REMARKS:
|
|
This function returns the address and length of the global VESA transfer
|
|
buffer that is used for communicating with the VESA BIOS functions from
|
|
Win16 and Win32 programs under Windows.
|
|
****************************************************************************/
|
|
void * PMAPI PM_getVESABuf(
|
|
uint *len,
|
|
uint *rseg,
|
|
uint *roff)
|
|
{
|
|
/* No buffers supported under Windows NT (Windows XP has them however if */
|
|
/* we ever decide to support this!) */
|
|
return NULL;
|
|
}
|
|
|
|
/****************************************************************************
|
|
REMARKS:
|
|
Issue a protected mode software interrupt.
|
|
****************************************************************************/
|
|
int PMAPI PM_int386(
|
|
int intno,
|
|
PMREGS *in,
|
|
PMREGS *out)
|
|
{
|
|
PMSREGS sregs;
|
|
PM_segread(&sregs);
|
|
return PM_int386x(intno,in,out,&sregs);
|
|
}
|
|
|
|
/****************************************************************************
|
|
REMARKS:
|
|
Map a real mode pointer to a protected mode pointer.
|
|
****************************************************************************/
|
|
void * PMAPI PM_mapRealPointer(
|
|
uint r_seg,
|
|
uint r_off)
|
|
{
|
|
/* Not used for Windows NT drivers! */
|
|
return NULL;
|
|
}
|
|
|
|
/****************************************************************************
|
|
REMARKS:
|
|
Allocate a block of real mode memory
|
|
****************************************************************************/
|
|
void * PMAPI PM_allocRealSeg(
|
|
uint size,
|
|
uint *r_seg,
|
|
uint *r_off)
|
|
{
|
|
/* Not supported in NT drivers */
|
|
(void)size;
|
|
(void)r_seg;
|
|
(void)r_off;
|
|
return NULL;
|
|
}
|
|
|
|
/****************************************************************************
|
|
REMARKS:
|
|
Free a block of real mode memory.
|
|
****************************************************************************/
|
|
void PMAPI PM_freeRealSeg(
|
|
void *mem)
|
|
{
|
|
/* Not supported in NT drivers */
|
|
(void)mem;
|
|
}
|
|
|
|
/****************************************************************************
|
|
REMARKS:
|
|
Issue a real mode interrupt (parameters in DPMI compatible structure)
|
|
****************************************************************************/
|
|
void PMAPI DPMI_int86(
|
|
int intno,
|
|
DPMI_regs *regs)
|
|
{
|
|
/* Not used in NT drivers */
|
|
}
|
|
|
|
/****************************************************************************
|
|
REMARKS:
|
|
Call a V86 real mode function with the specified register values
|
|
loaded before the call. The call returns with a far ret.
|
|
****************************************************************************/
|
|
void PMAPI PM_callRealMode(
|
|
uint seg,
|
|
uint off,
|
|
RMREGS *regs,
|
|
RMSREGS *sregs)
|
|
{
|
|
/* TODO!! */
|
|
#if 0
|
|
CLIENT_STRUCT saveRegs;
|
|
|
|
/* Bail if we do not have BIOS access (ie: the VxD was dynamically
|
|
* loaded, and not statically loaded.
|
|
*/
|
|
if (!_PM_haveBIOS)
|
|
return;
|
|
|
|
TRACE("SDDHELP: Entering PM_callRealMode()\n");
|
|
Begin_Nest_V86_Exec();
|
|
LoadV86Registers(&saveRegs,regs,sregs);
|
|
Simulate_Far_Call(seg, off);
|
|
Resume_Exec();
|
|
ReadV86Registers(&saveRegs,regs,sregs);
|
|
End_Nest_Exec();
|
|
TRACE("SDDHELP: Exiting PM_callRealMode()\n");
|
|
#endif
|
|
}
|
|
|
|
/****************************************************************************
|
|
REMARKS:
|
|
Issue a V86 real mode interrupt with the specified register values
|
|
loaded before the interrupt.
|
|
****************************************************************************/
|
|
int PMAPI PM_int86(
|
|
int intno,
|
|
RMREGS *in,
|
|
RMREGS *out)
|
|
{
|
|
/* TODO!! */
|
|
#if 0
|
|
RMSREGS sregs = {0};
|
|
CLIENT_STRUCT saveRegs;
|
|
ushort oldDisable;
|
|
|
|
/* Disable pass-up to our VxD handler so we directly call BIOS */
|
|
TRACE("SDDHELP: Entering PM_int86()\n");
|
|
if (disableTSRFlag) {
|
|
oldDisable = *disableTSRFlag;
|
|
*disableTSRFlag = 0;
|
|
}
|
|
Begin_Nest_V86_Exec();
|
|
LoadV86Registers(&saveRegs,in,&sregs);
|
|
Exec_Int(intno);
|
|
ReadV86Registers(&saveRegs,out,&sregs);
|
|
End_Nest_Exec();
|
|
|
|
/* Re-enable pass-up to our VxD handler if previously enabled */
|
|
if (disableTSRFlag)
|
|
*disableTSRFlag = oldDisable;
|
|
|
|
TRACE("SDDHELP: Exiting PM_int86()\n");
|
|
#else
|
|
*out = *in;
|
|
#endif
|
|
return out->x.ax;
|
|
}
|
|
|
|
/****************************************************************************
|
|
REMARKS:
|
|
Issue a V86 real mode interrupt with the specified register values
|
|
loaded before the interrupt.
|
|
****************************************************************************/
|
|
int PMAPI PM_int86x(
|
|
int intno,
|
|
RMREGS *in,
|
|
RMREGS *out,
|
|
RMSREGS *sregs)
|
|
{
|
|
/* TODO!! */
|
|
#if 0
|
|
CLIENT_STRUCT saveRegs;
|
|
ushort oldDisable;
|
|
|
|
/* Bail if we do not have BIOS access (ie: the VxD was dynamically
|
|
* loaded, and not statically loaded.
|
|
*/
|
|
if (!_PM_haveBIOS) {
|
|
*out = *in;
|
|
return out->x.ax;
|
|
}
|
|
|
|
/* Disable pass-up to our VxD handler so we directly call BIOS */
|
|
TRACE("SDDHELP: Entering PM_int86x()\n");
|
|
if (disableTSRFlag) {
|
|
oldDisable = *disableTSRFlag;
|
|
*disableTSRFlag = 0;
|
|
}
|
|
Begin_Nest_V86_Exec();
|
|
LoadV86Registers(&saveRegs,in,sregs);
|
|
Exec_Int(intno);
|
|
ReadV86Registers(&saveRegs,out,sregs);
|
|
End_Nest_Exec();
|
|
|
|
/* Re-enable pass-up to our VxD handler if previously enabled */
|
|
if (disableTSRFlag)
|
|
*disableTSRFlag = oldDisable;
|
|
|
|
TRACE("SDDHELP: Exiting PM_int86x()\n");
|
|
#else
|
|
*out = *in;
|
|
#endif
|
|
return out->x.ax;
|
|
}
|