From: Ben Gras Date: Wed, 2 Dec 2009 16:35:05 +0000 (+0000) Subject: Part of the FPU changes; forgot to add these files in FPU commit. X-Git-Tag: v3.1.6~174 X-Git-Url: http://zhaoyanbai.com/repos/nslookup.html?a=commitdiff_plain;h=38fecc5de1c0cdea991aedf64865c6141f560724;p=minix.git Part of the FPU changes; forgot to add these files in FPU commit. --- diff --git a/include/sys/fpu.h b/include/sys/fpu.h new file mode 100644 index 000000000..42bda9840 --- /dev/null +++ b/include/sys/fpu.h @@ -0,0 +1,50 @@ +#ifndef FPU_H +#define FPU_H + +/* x87 FPU state, MMX Technolodgy. + * 108 bytes.*/ +struct fpu_regs_s { + u16_t fp_control; /* control */ + u16_t fp_unused_1; + u16_t fp_status; /* status */ + u16_t fp_unused_2; + u16_t fp_tag; /* register tags */ + u16_t fp_unused_3; + u32_t fp_eip; /* eip at failed instruction */ + u16_t fp_cs; /* cs at failed instruction */ + u16_t fp_opcode; /* opcode of failed instruction */ + u32_t fp_dp; /* data address */ + u16_t fp_ds; /* data segment */ + u16_t fp_unused_4; + u16_t fp_st_regs[8][5]; /* 8 80-bit FP registers */ +}; + +/* x87 FPU, MMX Technolodgy and SSE state. + * 512 bytes (if you need size use FPU_XFP_SIZE). */ +struct xfp_save { + u16_t fp_control; /* control */ + u16_t fp_status; /* status */ + u16_t fp_tag; /* register tags */ + u16_t fp_opcode; /* opcode of failed instruction */ + u32_t fp_eip; /* eip at failed instruction */ + u16_t fp_cs; /* cs at failed instruction */ + u16_t fp_unused_1; + u32_t fp_dp; /* data address */ + u16_t fp_ds; /* data segment */ + u16_t fp_unused_2; + u32_t fp_mxcsr; /* MXCSR */ + u32_t fp_mxcsr_mask; /* MXCSR_MASK */ + u16_t fp_st_regs[8][8]; /* 128 bytes for ST/MM regs */ + u32_t fp_xreg_word[32]; /* space for 8 128-bit XMM registers */ + u32_t fp_padding[56]; +}; + +/* Size of xfp_save structure. */ +#define FPU_XFP_SIZE 512 + +union fpu_state_u { + struct fpu_regs_s fpu_regs; + struct xfp_save xfp_regs; +}; + +#endif /* #ifndef FPU_H */ diff --git a/include/sys/stackframe.h b/include/sys/stackframe.h new file mode 100644 index 000000000..a1b16e58e --- /dev/null +++ b/include/sys/stackframe.h @@ -0,0 +1,36 @@ +#ifndef STACK_FRAME_H +#define STACK_FRAME_H + +typedef unsigned reg_t; /* machine register */ +typedef reg_t segdesc_t; + +/* The stack frame layout is determined by the software, but for efficiency + * it is laid out so the assembly code to use it is as simple as possible. + * 80286 protected mode and all real modes use the same frame, built with + * 16-bit registers. Real mode lacks an automatic stack switch, so little + * is lost by using the 286 frame for it. The 386 frame differs only in + * having 32-bit registers and more segment registers. The same names are + * used for the larger registers to avoid differences in the code. + */ +struct stackframe_s { + u16_t gs; /* last item pushed by save */ + u16_t fs; /* ^ */ + u16_t es; /* | */ + u16_t ds; /* | */ + reg_t di; /* di through cx are not accessed in C */ + reg_t si; /* order is to match pusha/popa */ + reg_t fp; /* bp */ + reg_t st; /* hole for another copy of sp */ + reg_t bx; /* | */ + reg_t dx; /* | */ + reg_t cx; /* | */ + reg_t retreg; /* ax and above are all pushed by save */ + reg_t retadr; /* return address for assembly code save() */ + reg_t pc; /* ^ last item pushed by interrupt */ + reg_t cs; /* | */ + reg_t psw; /* | */ + reg_t sp; /* | */ + reg_t ss; /* these are pushed by CPU during interrupt */ +}; + +#endif /* #ifndef STACK_FRAME_H */