|
|
/**
*** 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, EM_int64_t *pipsr, EM_int64_t *pfpsr, EM_int64_t *pisr, EM_int64_t *ppreds, EM_int64_t *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; KIRQL OldIrql; BOOLEAN LessThanAPC; int Status;
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;
(FLOAT128 *)FpState.fp_state_low_preserved = &(LocalExceptionFramePtr->FltS0); (FLOAT128 *)FpState.fp_state_low_volatile = &(LocalTrapFramePtr->FltT0); (FLOAT128 *)FpState.fp_state_high_preserved = &(LocalExceptionFramePtr->FltS4);
(FLOAT128 *)FpState.fp_state_high_volatile = (PFLOAT128)GET_HIGH_FLOATING_POINT_REGISTER_SAVEAREA(KeGetCurrentThread()->StackBase);
if (KeGetCurrentIrql() < APC_LEVEL) { LessThanAPC = 1; } else { LessThanAPC = 0; }
if (LessThanAPC) { KeRaiseIrql (APC_LEVEL, &OldIrql); }
Status = HalFpEmulate(trap_type, pbundle, pipsr, pfpsr, pisr, ppreds, pifs, &FpState ); if (LessThanAPC) { KeLowerIrql (OldIrql); }
return Status; }
|