Changeset 3b05862f in mainline


Ignore:
Timestamp:
2006-03-15T16:12:37Z (19 years ago)
Author:
Jakub Vana <jakub.vana@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
2f7342d
Parents:
b629483
Message:

ia32 MMX and SSEx support

Location:
arch/ia32
Files:
8 edited

Legend:

Unmodified
Added
Removed
  • arch/ia32/include/cpu.h

    rb629483 r3b05862f  
    4242};
    4343
     44
     45#define CR4_OSFXSR_MASK (1<<9)
     46
    4447#endif
  • arch/ia32/include/cpuid.h

    rb629483 r3b05862f  
    3838        __u32 cpuid_edx;
    3939} __attribute__ ((packed));
     40
     41struct __cpuid_extended_feature_info {
     42        unsigned sse3 :  1;
     43        unsigned      : 31;
     44} __attribute__ ((packed));
     45
     46typedef union cpuid_extended_feature_info
     47{
     48        struct __cpuid_extended_feature_info bits;
     49        __u32                                word;
     50}cpuid_extended_feature_info;
     51
     52
     53struct __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
     62typedef union cpuid_feature_info
     63{
     64        struct __cpuid_feature_info bits;
     65        __u32                word       ;
     66}cpuid_feature_info;
     67
    4068
    4169static inline __u32 has_cpuid(void)
  • arch/ia32/include/fpu_context.h

    rb629483 r3b05862f  
    3535#define FPU_CONTEXT_ALIGN 16
    3636
     37void fpu_fxsr(void);
     38void fpu_fsr(void);
     39
     40
    3741struct fpu_context {
    3842        /* TODO: We need malloc that aligns structures on 16-byte boundary */
  • arch/ia32/include/interrupt.h

    rb629483 r3b05862f  
    8585extern void nm_fault(int n, istate_t *istate);
    8686extern void ss_fault(int n, istate_t *istate);
     87extern void simd_fp_exception(int n, istate_t *istate);
    8788extern void page_fault(int n, istate_t *istate);
    8889extern void syscall(int n, istate_t *istate);
  • arch/ia32/src/cpu/cpu.c

    rb629483 r3b05862f  
    9393void cpu_arch_init(void)
    9494{
     95        __u32 help=0;
     96       
    9597        CPU->arch.tss = tss_p;
    9698        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       
    97120}
    98121
  • arch/ia32/src/fpu_context.c

    rb629483 r3b05862f  
    3232#include <cpu.h>
    3333
    34 void fpu_context_save(fpu_context_t *fctx)
     34typedef void (*fpu_context_function)(fpu_context_t *fctx);
     35
     36static fpu_context_function fpu_save,fpu_restore;
     37
     38
     39
     40static void fpu_context_f_save(fpu_context_t *fctx)
    3541{
    3642        __asm__ volatile (
     
    4046}
    4147
    42 
    43 void fpu_context_restore(fpu_context_t *fctx)
     48static void fpu_context_f_restore(fpu_context_t *fctx)
    4449{
    4550        __asm__ volatile (
     
    4954}
    5055
     56static void fpu_context_fx_save(fpu_context_t *fctx)
     57{
     58        __asm__ volatile (
     59                "fxsave %0"
     60                : "=m"(*fctx)
     61                );
     62}
     63
     64static 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*/
     75void 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*/
     83void fpu_fsr(void)
     84{
     85        fpu_save=fpu_context_f_save;
     86        fpu_restore=fpu_context_f_restore;
     87}
     88
     89
     90
     91void fpu_context_save(fpu_context_t *fctx)
     92{
     93        fpu_save(fctx);
     94}
     95
     96void fpu_context_restore(fpu_context_t *fctx)
     97{
     98        fpu_restore(fctx);
     99}
     100
     101
     102
    51103void fpu_init()
    52104{
     105        __u32 help0=0,help1=0;
    53106        __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)
    55115        );
    56116}
  • arch/ia32/src/interrupt.c

    rb629483 r3b05862f  
    8989}
    9090
     91void 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
    91105void nm_fault(int n, istate_t *istate)
    92106{
  • arch/ia32/src/pm.c

    rb629483 r3b05862f  
    131131        exc_register( 7, "nm_fault", (iroutine) nm_fault);
    132132        exc_register(12, "ss_fault", (iroutine) ss_fault);
     133        exc_register(19, "simd_fp", (iroutine) simd_fp_exception);
    133134}
    134135
Note: See TracChangeset for help on using the changeset viewer.