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
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;
|
|
}
|