Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

106 lines
2.7 KiB

/**
*** Copyright (C) 1996-97 Intel Corporation. All rights reserved.
***
*** The information and source code contained herein is the exclusive
*** property of Intel Corporation and may not be disclosed, examined
*** or reproduced in whole or in part without explicit written authorization
*** from the company.
**/
/*++
Copyright (c) 1996 Intel Corporation
Module Name:
floatem.c
Abstract:
This module implements IA64 machine dependent floating point emulation
functions to support the IEEE floating point standard.
Author:
Marius Cornea-Hasegan Sep-96
Environment:
Kernel mode only.
Revision History:
Modfied Jan. 97, Jan 98, Jun 98 (new API)
--*/
#include "ki.h"
#include "ntfpia64.h"
#include "floatem.h"
extern LONG
HalFpEmulate (
ULONG trap_type,
BUNDLE *pBundle,
ULONGLONG *pipsr,
ULONGLONG *pfpsr,
ULONGLONG *pisr,
ULONGLONG *ppreds,
ULONGLONG *pifs,
FP_STATE *fp_state
);
#define ALL_FP_REGISTERS_SAVED 0xFFFFFFFFFFFFFFFFi64
int
fp_emulate (
int trap_type,
BUNDLE *pbundle,
ULONGLONG *pipsr,
ULONGLONG *pfpsr,
ULONGLONG *pisr,
ULONGLONG *ppreds,
ULONGLONG *pifs,
void *fp_state
)
{
//
// Pointer to old Floating point state FLOATING_POINT_STATE
//
FLOATING_POINT_STATE *Ptr0FPState;
PKEXCEPTION_FRAME LocalExceptionFramePtr;
PKTRAP_FRAME LocalTrapFramePtr;
FP_STATE FpState;
int Status;
ASSERT( KeGetCurrentIrql() >= APC_LEVEL);
Ptr0FPState = (PFLOATING_POINT_STATE) fp_state;
LocalExceptionFramePtr = (PKEXCEPTION_FRAME) (Ptr0FPState->ExceptionFrame);
LocalTrapFramePtr = (PKTRAP_FRAME) (Ptr0FPState->TrapFrame);
FpState.bitmask_low64 = ALL_FP_REGISTERS_SAVED;
FpState.bitmask_high64 = ALL_FP_REGISTERS_SAVED;
FpState.fp_state_low_preserved =(FP_STATE_LOW_PRESERVED *) &(LocalExceptionFramePtr->FltS0);
FpState.fp_state_low_volatile = (FP_STATE_LOW_VOLATILE *) &(LocalTrapFramePtr->FltT0);
FpState.fp_state_high_preserved = (FP_STATE_HIGH_PRESERVED *) &(LocalExceptionFramePtr->FltS4);
FpState.fp_state_high_volatile = (FP_STATE_HIGH_VOLATILE *)GET_HIGH_FLOATING_POINT_REGISTER_SAVEAREA(KeGetCurrentThread()->StackBase);
Status = HalFpEmulate(trap_type,
pbundle,
(PULONGLONG)pipsr,
(PULONGLONG)pfpsr,
(PULONGLONG)pisr,
(PULONGLONG)ppreds,
(PULONGLONG)pifs,
&FpState
);
return Status;
}