blob: c82648b78710beb9f3d6eb513b17da23af51d2bd [file] [log] [blame]
/****************************************************************************
*
* 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;
}