original files of m241
This commit is contained in:
@@ -0,0 +1,287 @@
|
||||
/* fppLib.h - floating-point coprocessor support library header */
|
||||
|
||||
/*
|
||||
* Copyright (c) 1998,2002-2003,2010,2011 Wind River Systems, Inc.
|
||||
*
|
||||
* The right to copy, distribute, modify or otherwise make use of this
|
||||
* software may be licensed only pursuant to the terms of an applicable
|
||||
* Wind River license agreement.
|
||||
*/
|
||||
|
||||
/*
|
||||
modification history
|
||||
--------------------
|
||||
01j,05sep11,elp Added xmm registers to host regset (CQID: WIND00286339)
|
||||
01i,06apr11,elp added xmm8-xmm15
|
||||
01h,30sep10,elp fixed FPXREG_FPX() macro.
|
||||
01g,14sep10,elp Added SSE support (64-bits).
|
||||
01f,14jan10,elp 64bits support.
|
||||
01e,19aug03,dbt Added PAL support.
|
||||
01d,17jun03,jmp code cleanup.
|
||||
01c,27mar03,jmp rewrote from i86.
|
||||
01b,03may02,jmp added fppDtoDx() & fppDxtoD().
|
||||
01a,29apr98,cym derived from i86
|
||||
*/
|
||||
|
||||
#ifndef __INCfppSimntLibh
|
||||
#define __INCfppSimntLibh
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/* number of fp registers on coprocessor */
|
||||
|
||||
#define FP_NUM_REGS 8 /* number of FP registers */
|
||||
#define XSAVE_HEADER 64 /* number of bytes in the XSAVE header */
|
||||
|
||||
#ifdef _WRS_CONFIG_LP64
|
||||
#define XMM_NUM_REGS 16 /* number of XMM registers */
|
||||
#define FP_NUM_RESERVED 6 /* reserved area in FPX_CONTEXT */
|
||||
|
||||
/* FPREG_SET structure offsets */
|
||||
|
||||
#define FPREG_FPCR 0x00 /* offset to FPCR in FPREG_SET */
|
||||
#define FPREG_FPSR 0x04 /* offset to FPSR in FPREG_SET */
|
||||
#define FPREG_FPTAG 0x08 /* offset to FPTAG in FPREG_SET */
|
||||
#define FPREG_OP 0x0c /* offset to OP in FPREG_SET */
|
||||
#define FPREG_IP 0x10 /* offset to IP in FPREG_SET */
|
||||
#define FPREG_CS 0x14 /* offset to CS in FPREG_SET */
|
||||
#define FPREG_DP 0x18 /* offset to DP in FPREG_SET */
|
||||
#define FPREG_DS 0x1c /* offset to DS in FPREG_SET */
|
||||
#define FPREG_FPX(n) (0x20 + (n)*sizeof(DOUBLEX)) /* offset to FPX(n) */
|
||||
|
||||
#else /* _WRS_CONFIG_LP64 */
|
||||
|
||||
#define XMM_NUM_REGS 8 /* number of XMM registers */
|
||||
#define FP_NUM_RESERVED 14 /* reserved area in FPX_CONTEXT */
|
||||
|
||||
/* FPREG_SET structure offsets */
|
||||
|
||||
#define FPREG_FPCR 0x00 /* offset to FPCR in FPREG_SET */
|
||||
#define FPREG_FPSR 0x04 /* offset to FPSR in FPREG_SET */
|
||||
#define FPREG_FPTAG 0x08 /* offset to FPTAG in FPREG_SET */
|
||||
#define FPREG_OP 0x0c /* offset to OP in FPREG_SET */
|
||||
#define FPREG_IP 0x10 /* offset to IP in FPREG_SET */
|
||||
#define FPREG_CS 0x12 /* offset to CS in FPREG_SET */
|
||||
#define FPREG_DP 0x14 /* offset to DP in FPREG_SET */
|
||||
#define FPREG_DS 0x18 /* offset to DS in FPREG_SET */
|
||||
#define FPREG_FPX(n) (0x1c + (n)*sizeof(DOUBLEX)) /* offset to FPX(n) */
|
||||
|
||||
#endif /* _WRS_CONFIG_LP64 */
|
||||
|
||||
/* FPO_CONTEXT structure offsets */
|
||||
|
||||
#define FPO_CONTEXT_FPCR 0x00 /* offset to FPCR in FPO_CONTEXT */
|
||||
#define FPO_CONTEXT_FPSR 0x04 /* offset to FPSR in FPO_CONTEXT */
|
||||
#define FPO_CONTEXT_FPTAG 0x08 /* offset to FPTAG in FPO_CONTEXT */
|
||||
#define FPO_CONTEXT_IP 0x0c /* offset to IP in FPO_CONTEXT */
|
||||
#define FPO_CONTEXT_CS 0x10 /* offset to CS in FPO_CONTEXT */
|
||||
#define FPO_CONTEXT_OP 0x12 /* offset to OP in FPO_CONTEXT */
|
||||
#define FPO_CONTEXT_DP 0x14 /* offset to DP in FPO_CONTEXT */
|
||||
#define FPO_CONTEXT_DS 0x18 /* offset to DS in FPO_CONTEXT */
|
||||
#define FPO_CONTEXT_FPX(n) (0x1c + (n)*sizeof(DOUBLEX))
|
||||
|
||||
/* FPX_CONTEXT - structure offsets for New FP context */
|
||||
|
||||
#define FPX_CONTEXT_FPCR 0x00 /* offset to FPCR in FPX_CONTEXT */
|
||||
#define FPX_CONTEXT_FPSR 0x02 /* offset to FPSR in FPX_CONTEXT */
|
||||
#define FPX_CONTEXT_FPTAG 0x04 /* offset to FPTAG in FPX_CONTEXT */
|
||||
#define FPX_CONTEXT_OP 0x06 /* offset to OP in FPX_CONTEXT */
|
||||
#define FPX_CONTEXT_IP 0x08 /* offset to IP in FPX_CONTEXT */
|
||||
#define FPX_CONTEXT_CS 0x0c /* offset to CS in FPX_CONTEXT */
|
||||
#define FPX_CONTEXT_DP 0x10 /* offset to DP in FPX_CONTEXT */
|
||||
#define FPX_CONTEXT_DS 0x14 /* offset to DS in FPX_CONTEXT */
|
||||
#define FPX_CONTEXT_RSVD0 0x18 /* offset to RESERVED0 in FPX_CONTEXT */
|
||||
#define FPX_CONTEXT_RSVD1 0x1c /* offset to RESERVED1 in FPX_CONTEXT */
|
||||
#define FPX_CONTEXT_FPX(n) (0x20 + (n)*sizeof(DOUBLEX_SSE)) /* FPX(n) */
|
||||
|
||||
/* FPU Control Word register */
|
||||
#define FPCR_PC_MASK 0xfcff /* Precision Control Field mask */
|
||||
#define FPCR_PC_DOUBLE 0x0200 /* Double precision */
|
||||
|
||||
#ifndef _ASMLANGUAGE
|
||||
|
||||
/* DOUBLEX - double extended precision */
|
||||
|
||||
typedef struct
|
||||
{
|
||||
unsigned char f[10];
|
||||
} DOUBLEX;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
UCHAR f[10]; /* ST[0-7] or MM[0-7] */
|
||||
UCHAR r[6]; /* reserved */
|
||||
} DOUBLEX_SSE;
|
||||
|
||||
/* FPO_CONTEXT - Old FP context used by fsave/frstor instruction */
|
||||
|
||||
typedef struct fpOcontext
|
||||
{
|
||||
int fpcr; /* 0x00: 4 control word */
|
||||
int fpsr; /* 0x04: 4 status word */
|
||||
int fptag; /* 0x08: 4 tag word */
|
||||
int ip; /* 0x0c: 4 instruction pointer */
|
||||
short cs; /* 0x10: 2 instr pointer selector */
|
||||
short op; /* 0x12: 2 last FP instr op code */
|
||||
int dp; /* 0x14: 4 data pointer */
|
||||
int ds; /* 0x18: 4 data pointer selector */
|
||||
DOUBLEX fpx[FP_NUM_REGS]; /* 0x1c: 8*10 FR[0-7] non-TOS rel. order */
|
||||
} FPO_CONTEXT; /* 108 bytes total */
|
||||
|
||||
/* FPX_CONTEXT - New FP context used by fxsave/fxrstor instruction */
|
||||
|
||||
typedef struct fpXcontext
|
||||
{
|
||||
short fpcr; /* 0x00: 2 control word */
|
||||
short fpsr; /* 0x02: 2 status word */
|
||||
short fptag; /* 0x04: 2 tag word */
|
||||
short op; /* 0x06: 2 last FP instr op code */
|
||||
int ip; /* 0x08: 4 instruction pointer */
|
||||
int cs; /* 0x0c: 4 instr pointer selector */
|
||||
int dp; /* 0x10: 4 data pointer */
|
||||
int ds; /* 0x14: 4 data pointer selector */
|
||||
int reserved0; /* 0x18: 4 reserved */
|
||||
int reserved1; /* 0x1c: 4 reserved */
|
||||
DOUBLEX_SSE fpx[FP_NUM_REGS]; /* 0x20: 8*16 FR[0-7] non-TOS rel. order */
|
||||
DOUBLEX_SSE xmm[XMM_NUM_REGS]; /* 8*16 XMM[0-7] */
|
||||
DOUBLEX_SSE res2[FP_NUM_RESERVED]; /* 14*16 reserved */
|
||||
} FPX_CONTEXT; /* 512 bytes total */
|
||||
|
||||
/* FPX_EXT_CONTEXT - Extended FP context used by xsave/xrstor instruction */
|
||||
|
||||
typedef struct fpXExtContext
|
||||
{
|
||||
short fpcr; /* 0x00: 2 control word */
|
||||
short fpsr; /* 0x02: 2 status word */
|
||||
short fptag; /* 0x04: 2 tag word */
|
||||
short op; /* 0x06: 2 last FP instr op code */
|
||||
int ip; /* 0x08: 4 instr pointer */
|
||||
int cs; /* 0x0c: 4 instr pointer selector */
|
||||
int dp; /* 0x10: 4 data pointer */
|
||||
int ds; /* 0x14: 4 data pointer selector */
|
||||
int reserved0; /* 0x18: 4 reserved */
|
||||
int reserved1; /* 0x20: 4 reserved */
|
||||
DOUBLEX_SSE fpx[FP_NUM_REGS]; /* 0x24: 8*16 FR[0-7] */
|
||||
DOUBLEX_SSE xmm[XMM_NUM_REGS]; /* 8*16 XMM[0-7] */
|
||||
DOUBLEX_SSE res2[FP_NUM_RESERVED]; /* 14*16 reserved */
|
||||
UCHAR xSaveHeader[XSAVE_HEADER]; /* 64 XSave header */
|
||||
DOUBLEX_SSE ymm[XMM_NUM_REGS]; /* 8*16 higher 128 bits of YMM[0-7] */
|
||||
} FPX_EXT_CONTEXT; /* 704 bytes total */
|
||||
|
||||
/* FP_CONTEXT - Common FP context */
|
||||
|
||||
typedef struct fpContext
|
||||
{
|
||||
union u
|
||||
{
|
||||
FPO_CONTEXT o; /* old FPO_CONTEXT for fsave/frstor */
|
||||
FPX_CONTEXT x; /* new FPX_CONTEXT for fxsave/fxrstor */
|
||||
FPX_EXT_CONTEXT x_ext; /* FPX_EXT_CONTEXT xsave/xrestore */
|
||||
} u;
|
||||
} FP_CONTEXT;
|
||||
|
||||
#ifdef _WRS_CONFIG_LP64
|
||||
/* FPREG_SET - FP register set that is different from FP_CONTEXT */
|
||||
|
||||
typedef struct fpregOSet
|
||||
{
|
||||
int fpcr; /* 0x00: control word */
|
||||
int fpsr; /* 0x04: status word */
|
||||
int fptag; /* 0x08: tag word */
|
||||
int op; /* 0x0c: last FP instruction op code */
|
||||
int ip; /* 0x10: instruction pointer */
|
||||
int cs; /* 0x14: instruction pointer selector */
|
||||
int dp; /* 0x18: data pointer */
|
||||
int ds; /* 0x1c: data pointer selector */
|
||||
DOUBLEX fpx[FP_NUM_REGS]; /* 0x20: FR[0-7] non-TOS rel. order */
|
||||
} FPREGO_SET;
|
||||
|
||||
#else /* _WRS_CONFIG_LP64 */
|
||||
|
||||
typedef FPO_CONTEXT FPREGO_SET;
|
||||
|
||||
#endif /* _WRS_CONFIG_LP64 */
|
||||
|
||||
typedef struct fpregXSet
|
||||
{
|
||||
int fpcr; /* 0x00: control word */
|
||||
int fpsr; /* 0x04: status word */
|
||||
int fptag; /* 0x08: tag word */
|
||||
int op; /* 0x0c: last FP instruction op code */
|
||||
int ip; /* 0x10: instruction pointer */
|
||||
int cs; /* 0x14: instruction pointer selector */
|
||||
int dp; /* 0x18: data pointer */
|
||||
int ds; /* 0x1c: data pointer selector */
|
||||
DOUBLEX fpx[FP_NUM_REGS]; /* 0x20: FR[0-7] non-TOS rel. order */
|
||||
DOUBLEX_SSE xmm[XMM_NUM_REGS]; /* [8|16]*16 XMM[0-[7|15]] */
|
||||
} FPREGX_SET;
|
||||
|
||||
typedef struct fpregXExtSet
|
||||
{
|
||||
int fpcr; /* 0x00: control word */
|
||||
int fpsr; /* 0x04: status word */
|
||||
int fptag; /* 0x08: tag word */
|
||||
int op; /* 0x0c: last FP instruction op code */
|
||||
int ip; /* 0x10: instruction pointer */
|
||||
int cs; /* 0x14: instruction pointer selector */
|
||||
int dp; /* 0x18: data pointer */
|
||||
int ds; /* 0x1c: data pointer selector */
|
||||
DOUBLEX fpx[FP_NUM_REGS]; /* 0x20: FR[0-7] non-TOS rel. order */
|
||||
DOUBLEX_SSE xmm[XMM_NUM_REGS]; /* [8|16]*16 XMM[0-[7|15]] */
|
||||
DOUBLEX_SSE ymm[XMM_NUM_REGS]; /* [8|16]*16 higher 128 bits of YMM */
|
||||
} FPREGXEXT_SET;
|
||||
|
||||
typedef struct fpregSet
|
||||
{
|
||||
union n
|
||||
{
|
||||
FPREGO_SET o;
|
||||
FPREGX_SET x;
|
||||
FPREGXEXT_SET x_ext;
|
||||
} n;
|
||||
} FPREG_SET;
|
||||
|
||||
/* variable declarations */
|
||||
|
||||
extern REG_INDEX fpRegName[]; /* f-point data register table */
|
||||
extern REG_INDEX fpCtlRegName[]; /* f-point control register table */
|
||||
extern FUNCPTR fppCreateHookRtn; /* arch dependent create hook routine */
|
||||
extern FUNCPTR fppDisplayHookRtn; /* arch dependent display routine */
|
||||
|
||||
/* func ptr to fppSave/fppXsave */
|
||||
|
||||
extern void (* _func_fppSaveRtn) (FP_CONTEXT *);
|
||||
|
||||
/* func ptr to fppRestore/fppXrestore */
|
||||
|
||||
extern void (* _func_fppRestoreRtn) (FP_CONTEXT *);
|
||||
|
||||
/* function declarations */
|
||||
|
||||
extern void fppArchInit (void);
|
||||
extern STATUS fppProbe (void);
|
||||
extern void fppDtoDx (DOUBLEX * pDx, double * pDouble);
|
||||
extern void fppDxtoD (double * pDouble, DOUBLEX * pDx);
|
||||
|
||||
extern void fppRegsToCtx (FPREG_SET * pFpRegSet, FP_CONTEXT * pFpContext);
|
||||
extern void fppCtxToRegs (FP_CONTEXT * pFpContext, FPREG_SET * pFpRegSet);
|
||||
#ifdef _WRS_CONFIG_LP64
|
||||
extern void fppXregsToCtx (FPREG_SET * pFpRegSet, FP_CONTEXT * pFpContext);
|
||||
extern void fppXctxToRegs (FP_CONTEXT * pFpContext, FPREG_SET * pFpRegSet);
|
||||
#endif /* _WRS_CONFIG_LP64 */
|
||||
|
||||
extern FP_CONTEXT * fppCtxCreate (TASK_ID tid);
|
||||
extern STATUS fppCtxDelete (FP_CONTEXT * pCtx);
|
||||
extern void fppCtxShow (FP_CONTEXT * pFpContext);
|
||||
extern STATUS fppEnable (void);
|
||||
extern STATUS fppDisable (void);
|
||||
|
||||
#endif /* _ASMLANGUAGE */
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* __INCfppSimntLibh */
|
||||
Reference in New Issue
Block a user