Changeset 3b05862f in mainline
- Timestamp:
- 2006-03-15T16:12:37Z (19 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 2f7342d
- Parents:
- b629483
- Location:
- arch/ia32
- Files:
-
- 8 edited
Legend:
- Unmodified
- Added
- Removed
-
arch/ia32/include/cpu.h
rb629483 r3b05862f 42 42 }; 43 43 44 45 #define CR4_OSFXSR_MASK (1<<9) 46 44 47 #endif -
arch/ia32/include/cpuid.h
rb629483 r3b05862f 38 38 __u32 cpuid_edx; 39 39 } __attribute__ ((packed)); 40 41 struct __cpuid_extended_feature_info { 42 unsigned sse3 : 1; 43 unsigned : 31; 44 } __attribute__ ((packed)); 45 46 typedef union cpuid_extended_feature_info 47 { 48 struct __cpuid_extended_feature_info bits; 49 __u32 word; 50 }cpuid_extended_feature_info; 51 52 53 struct __cpuid_feature_info { 54 unsigned : 23; 55 unsigned mmx : 1; 56 unsigned fxsr : 1; 57 unsigned sse : 1; 58 unsigned sse2 : 1; 59 unsigned : 5; 60 } __attribute__ ((packed)); 61 62 typedef union cpuid_feature_info 63 { 64 struct __cpuid_feature_info bits; 65 __u32 word ; 66 }cpuid_feature_info; 67 40 68 41 69 static inline __u32 has_cpuid(void) -
arch/ia32/include/fpu_context.h
rb629483 r3b05862f 35 35 #define FPU_CONTEXT_ALIGN 16 36 36 37 void fpu_fxsr(void); 38 void fpu_fsr(void); 39 40 37 41 struct fpu_context { 38 42 /* TODO: We need malloc that aligns structures on 16-byte boundary */ -
arch/ia32/include/interrupt.h
rb629483 r3b05862f 85 85 extern void nm_fault(int n, istate_t *istate); 86 86 extern void ss_fault(int n, istate_t *istate); 87 extern void simd_fp_exception(int n, istate_t *istate); 87 88 extern void page_fault(int n, istate_t *istate); 88 89 extern void syscall(int n, istate_t *istate); -
arch/ia32/src/cpu/cpu.c
rb629483 r3b05862f 93 93 void cpu_arch_init(void) 94 94 { 95 __u32 help=0; 96 95 97 CPU->arch.tss = tss_p; 96 98 CPU->fpu_owner=NULL; 99 100 cpuid_feature_info fi; 101 cpuid_extended_feature_info efi; 102 103 cpu_info_t info; 104 cpuid(1, &info); 105 106 fi.word=info.cpuid_edx; 107 efi.word=info.cpuid_ecx; 108 109 if(fi.bits.fxsr) fpu_fxsr(); 110 else fpu_fsr(); 111 112 if(fi.bits.sse) asm volatile ( 113 "mov %%cr4,%0;\n" 114 "or %1,%0;\n" 115 "mov %0,%%cr4;\n" 116 :"+r"(help) 117 :"i"(CR4_OSFXSR_MASK|(1<<10)) 118 ); 119 97 120 } 98 121 -
arch/ia32/src/fpu_context.c
rb629483 r3b05862f 32 32 #include <cpu.h> 33 33 34 void fpu_context_save(fpu_context_t *fctx) 34 typedef void (*fpu_context_function)(fpu_context_t *fctx); 35 36 static fpu_context_function fpu_save,fpu_restore; 37 38 39 40 static void fpu_context_f_save(fpu_context_t *fctx) 35 41 { 36 42 __asm__ volatile ( … … 40 46 } 41 47 42 43 void fpu_context_restore(fpu_context_t *fctx) 48 static void fpu_context_f_restore(fpu_context_t *fctx) 44 49 { 45 50 __asm__ volatile ( … … 49 54 } 50 55 56 static void fpu_context_fx_save(fpu_context_t *fctx) 57 { 58 __asm__ volatile ( 59 "fxsave %0" 60 : "=m"(*fctx) 61 ); 62 } 63 64 static void fpu_context_fx_restore(fpu_context_t *fctx) 65 { 66 __asm__ volatile ( 67 "fxrstor %0" 68 : "=m"(*fctx) 69 ); 70 } 71 72 /* 73 Setup using fxsr instruction 74 */ 75 void fpu_fxsr(void) 76 { 77 fpu_save=fpu_context_fx_save; 78 fpu_restore=fpu_context_fx_restore; 79 } 80 /* 81 Setup using not fxsr instruction 82 */ 83 void fpu_fsr(void) 84 { 85 fpu_save=fpu_context_f_save; 86 fpu_restore=fpu_context_f_restore; 87 } 88 89 90 91 void fpu_context_save(fpu_context_t *fctx) 92 { 93 fpu_save(fctx); 94 } 95 96 void fpu_context_restore(fpu_context_t *fctx) 97 { 98 fpu_restore(fctx); 99 } 100 101 102 51 103 void fpu_init() 52 104 { 105 __u32 help0=0,help1=0; 53 106 __asm__ volatile ( 54 "fninit;" 107 "fninit;\n" 108 "stmxcsr %0\n" 109 "mov %0,%1;\n" 110 "or %2,%1;\n" 111 "mov %1,%0;\n" 112 "ldmxcsr %0;\n" 113 :"+m"(help0),"+r"(help1) 114 :"i"(0x1f80) 55 115 ); 56 116 } -
arch/ia32/src/interrupt.c
rb629483 r3b05862f 89 89 } 90 90 91 void simd_fp_exception(int n, istate_t *istate) 92 { 93 94 PRINT_INFO_ERRCODE(istate); 95 __u32 mxcsr; 96 asm 97 ( 98 "stmxcsr %0;\n" 99 :"=m"(mxcsr) 100 ); 101 printf("MXCSR: %X\n",(__native)(mxcsr)); 102 panic("SIMD FP exception(19)\n"); 103 } 104 91 105 void nm_fault(int n, istate_t *istate) 92 106 { -
arch/ia32/src/pm.c
rb629483 r3b05862f 131 131 exc_register( 7, "nm_fault", (iroutine) nm_fault); 132 132 exc_register(12, "ss_fault", (iroutine) ss_fault); 133 exc_register(19, "simd_fp", (iroutine) simd_fp_exception); 133 134 } 134 135
Note:
See TracChangeset
for help on using the changeset viewer.