Changeset 9e1c942 in mainline


Ignore:
Timestamp:
2006-03-15T18:25:45Z (19 years ago)
Author:
Jakub Vana <jakub.vana@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
9a2d6e1
Parents:
8e0eb63
Message:

Itanium FPU active context switch

Files:
9 edited

Legend:

Unmodified
Added
Removed
  • arch/ia64/include/fpu_context.h

    r8e0eb63 r9e1c942  
    3030#define __ia64_FPU_CONTEXT_H__
    3131
     32#define ARCH_HAS_FPU 1
     33#define FPU_CONTEXT_ALIGN 16
     34
    3235#include <arch/types.h>
    3336
  • arch/ia64/include/interrupt.h

    r8e0eb63 r9e1c942  
    7979extern int break_instruction(__u64 vector, istate_t *istate);
    8080extern void universal_handler(__u64 vector, istate_t *istate);
     81extern void nop_handler(__u64 vector, istate_t *istate);
    8182extern void external_interrupt(__u64 vector, istate_t *istate);
     83extern void disabled_fp_register(__u64 vector, istate_t *istate);
     84
     85
    8286
    8387#endif
  • arch/ia64/include/register.h

    r8e0eb63 r9e1c942  
    3737#define PSR_DT_MASK     (1<<17)
    3838#define PSR_RT_MASK     (1<<27)
     39
     40#define PSR_DFL_MASK    (1<<18)
     41#define PSR_DFH_MASK    (1<<19)
     42
    3943#define PSR_IT_MASK     0x0000001000000000
    4044
  • arch/ia64/src/dummy.s

    r8e0eb63 r9e1c942  
    3333.global cpu_sleep
    3434.global dummy
    35 .global fpu_enable
    36 .global fpu_disable
    37 .global fpu_init
    3835
    3936calibrate_delay_loop:
    4037asm_delay_loop:
    4138cpu_sleep:
    42 fpu_init:
    43 fpu_enable:
    44 fpu_disable:   
    4539
    4640dummy:
  • arch/ia64/src/fpu_context.c

    r8e0eb63 r9e1c942  
    2929
    3030#include <fpu_context.h>
     31#include <arch/register.h>
    3132#include <print.h>
    3233
    3334void fpu_context_save(fpu_context_t *fctx){
    34                 return;
    3535                asm volatile(
    3636                        "stf.spill [%2]=f2,0x80\n"
     
    189189void fpu_context_restore(fpu_context_t *fctx)
    190190{
    191                 return;
    192191                asm volatile(
    193192                        "ldf.fill f2=[%2],0x80\n"
     
    344343}
    345344
    346 
    347 
     345void fpu_disable(void)
     346{
     347                asm volatile(
     348                        "ssm %0;;\n"
     349                        "srlz.i\n"
     350                        "srlz.d;;\n"
     351                        :
     352                        :"i" (PSR_DFL_MASK|PSR_DFH_MASK)
     353                );
     354
     355}
     356
     357void fpu_enable(void)
     358{
     359                asm volatile(
     360                        "rsm %0;;\n"
     361                        "srlz.i\n"
     362                        "srlz.d;;\n"
     363                        :
     364                        :"i" (PSR_DFL_MASK|PSR_DFH_MASK)
     365                );
     366
     367}
     368
     369void fpu_init(void)
     370{
     371                __u64 a = 0;
     372                fpu_enable();
     373                asm volatile
     374                (
     375                        "mov %0=ar.fpsr;;\n"
     376                        "or %0=%0,%1;;\n"
     377                        "mov ar.fpsr=%0;;\n"
     378                        : "+r" (a)
     379                        : "r" (0x38)
     380                );
     381               
     382                asm volatile(
     383                        "mov f2=f0\n"
     384                        "mov f3=f0\n"
     385                        "mov f4=f0\n"
     386                        "mov f5=f0\n"
     387                        "mov f6=f0\n"
     388                        "mov f7=f0\n"
     389                        "mov f8=f0\n"
     390                        "mov f9=f0\n"
     391
     392                        "mov f10=f0\n"
     393                        "mov f11=f0\n"
     394                        "mov f12=f0\n"
     395                        "mov f13=f0\n"
     396                        "mov f14=f0\n"
     397                        "mov f15=f0\n"
     398                        "mov f16=f0\n"
     399                        "mov f17=f0\n"
     400                        "mov f18=f0\n"
     401                        "mov f19=f0\n"
     402
     403                        "mov f20=f0\n"
     404                        "mov f21=f0\n"
     405                        "mov f22=f0\n"
     406                        "mov f23=f0\n"
     407                        "mov f24=f0\n"
     408                        "mov f25=f0\n"
     409                        "mov f26=f0\n"
     410                        "mov f27=f0\n"
     411                        "mov f28=f0\n"
     412                        "mov f29=f0\n"
     413
     414                        "mov f30=f0\n"
     415                        "mov f31=f0\n"
     416                        "mov f32=f0\n"
     417                        "mov f33=f0\n"
     418                        "mov f34=f0\n"
     419                        "mov f35=f0\n"
     420                        "mov f36=f0\n"
     421                        "mov f37=f0\n"
     422                        "mov f38=f0\n"
     423                        "mov f39=f0\n"
     424
     425                        "mov f40=f0\n"
     426                        "mov f41=f0\n"
     427                        "mov f42=f0\n"
     428                        "mov f43=f0\n"
     429                        "mov f44=f0\n"
     430                        "mov f45=f0\n"
     431                        "mov f46=f0\n"
     432                        "mov f47=f0\n"
     433                        "mov f48=f0\n"
     434                        "mov f49=f0\n"
     435
     436                        "mov f50=f0\n"
     437                        "mov f51=f0\n"
     438                        "mov f52=f0\n"
     439                        "mov f53=f0\n"
     440                        "mov f54=f0\n"
     441                        "mov f55=f0\n"
     442                        "mov f56=f0\n"
     443                        "mov f57=f0\n"
     444                        "mov f58=f0\n"
     445                        "mov f59=f0\n"
     446
     447                        "mov f60=f0\n"
     448                        "mov f61=f0\n"
     449                        "mov f62=f0\n"
     450                        "mov f63=f0\n"
     451                        "mov f64=f0\n"
     452                        "mov f65=f0\n"
     453                        "mov f66=f0\n"
     454                        "mov f67=f0\n"
     455                        "mov f68=f0\n"
     456                        "mov f69=f0\n"
     457
     458                        "mov f70=f0\n"
     459                        "mov f71=f0\n"
     460                        "mov f72=f0\n"
     461                        "mov f73=f0\n"
     462                        "mov f74=f0\n"
     463                        "mov f75=f0\n"
     464                        "mov f76=f0\n"
     465                        "mov f77=f0\n"
     466                        "mov f78=f0\n"
     467                        "mov f79=f0\n"
     468
     469                        "mov f80=f0\n"
     470                        "mov f81=f0\n"
     471                        "mov f82=f0\n"
     472                        "mov f83=f0\n"
     473                        "mov f84=f0\n"
     474                        "mov f85=f0\n"
     475                        "mov f86=f0\n"
     476                        "mov f87=f0\n"
     477                        "mov f88=f0\n"
     478                        "mov f89=f0\n"
     479
     480                        "mov f90=f0\n"
     481                        "mov f91=f0\n"
     482                        "mov f92=f0\n"
     483                        "mov f93=f0\n"
     484                        "mov f94=f0\n"
     485                        "mov f95=f0\n"
     486                        "mov f96=f0\n"
     487                        "mov f97=f0\n"
     488                        "mov f98=f0\n"
     489                        "mov f99=f0\n"
     490
     491                        "mov f100=f0\n"
     492                        "mov f101=f0\n"
     493                        "mov f102=f0\n"
     494                        "mov f103=f0\n"
     495                        "mov f104=f0\n"
     496                        "mov f105=f0\n"
     497                        "mov f106=f0\n"
     498                        "mov f107=f0\n"
     499                        "mov f108=f0\n"
     500                        "mov f109=f0\n"
     501
     502                        "mov f110=f0\n"
     503                        "mov f111=f0\n"
     504                        "mov f112=f0\n"
     505                        "mov f113=f0\n"
     506                        "mov f114=f0\n"
     507                        "mov f115=f0\n"
     508                        "mov f116=f0\n"
     509                        "mov f117=f0\n"
     510                        "mov f118=f0\n"
     511                        "mov f119=f0\n"
     512
     513                        "mov f120=f0\n"
     514                        "mov f121=f0\n"
     515                        "mov f122=f0\n"
     516                        "mov f123=f0\n"
     517                        "mov f124=f0\n"
     518                        "mov f125=f0\n"
     519                        "mov f126=f0\n"
     520                        "mov f127=f0\n"
     521
     522                );
     523
     524                fpu_enable();
     525}
     526
  • arch/ia64/src/interrupt.c

    r8e0eb63 r9e1c942  
    4343#include <syscall/syscall.h>
    4444#include <print.h>
     45#include <proc/scheduler.h>
    4546
    4647#define VECTORS_64_BUNDLE       20
     
    174175}
    175176
     177
     178void disabled_fp_register(__u64 vector, istate_t *istate)
     179{
     180#ifdef CONFIG_CPU_LAZY
     181        scheduler_fpu_lazy_request();   
     182#endif
     183}
     184
     185
     186void nop_handler(__u64 vector, istate_t *istate)
     187{
     188}
     189
     190
     191
    176192/** Handle syscall. */
    177193int break_instruction(__u64 vector, istate_t *istate)
  • arch/ia64/src/ivt.S

    r8e0eb63 r9e1c942  
    434434        HEAVYWEIGHT_HANDLER 0x5300
    435435        HEAVYWEIGHT_HANDLER 0x5400 general_exception
    436         HEAVYWEIGHT_HANDLER 0x5500
     436        HEAVYWEIGHT_HANDLER 0x5500 disabled_fp_register
    437437        HEAVYWEIGHT_HANDLER 0x5600
    438438        HEAVYWEIGHT_HANDLER 0x5700
     
    442442        HEAVYWEIGHT_HANDLER 0x5b00
    443443        HEAVYWEIGHT_HANDLER 0x5c00
    444         HEAVYWEIGHT_HANDLER 0x5d00
     444        HEAVYWEIGHT_HANDLER 0x5d00 
    445445        HEAVYWEIGHT_HANDLER 0x5e00
    446446        HEAVYWEIGHT_HANDLER 0x5f00
  • kernel.config

    r8e0eb63 r9e1c942  
    5858
    5959# Lazy FPU context switching
    60 ! [(ARCH=mips32&MIPS_MACHINE!=msim&MIPS_MACHINE!=simics)|ARCH=amd64|ARCH=ia32] CONFIG_FPU_LAZY (y/n)
     60! [(ARCH=mips32&MIPS_MACHINE!=msim&MIPS_MACHINE!=simics)|ARCH=amd64|ARCH=ia32|ARCH=ia64] CONFIG_FPU_LAZY (y/n)
    6161
    6262# Power off on halt
     
    8282@ "synch/semaphore1" Semaphore test 1
    8383@ "synch/semaphore2" Sempahore test 2
    84 @ [ARCH=ia32|ARCH=amd64] "fpu/fpu1" Intel fpu test 1
     84@ [ARCH=ia32|ARCH=amd64|ARCH=ia64] "fpu/fpu1" Intel fpu test 1
    8585@ [ARCH=ia32|ARCH=amd64] "fpu/sse1" Intel Sse test 1
    8686@ [ARCH=mips32&MIPS_MACHINE!=msim&MIPS_MACHINE!=simics] "fpu/mips1" Mips FPU test 1
  • test/fpu/fpu1/test.c

    r8e0eb63 r9e1c942  
    3737
    3838#include <arch.h>
    39 
    40 #define THREADS         150*2
    41 #define ATTEMPTS        100
     39#include <arch/arch.h>
     40
     41#define THREADS         15*2
     42#define ATTEMPTS        10
    4243
    4344#define E_10e8  271828182
    4445#define PI_10e8 314159265
    4546
     47
     48#ifdef __ia32_ARCH_H__
    4649static inline double sqrt(double x) { double v; __asm__ ("fsqrt\n" : "=t" (v) : "0" (x)); return v; }
     50#endif
     51
     52#ifdef __amd64_ARCH_H__
     53static inline double sqrt(double x) { double v; __asm__ ("fsqrt\n" : "=t" (v) : "0" (x)); return v; }
     54#endif
     55
     56#ifdef __ia64_ARCH_H__
     57static inline long double sqrt(long double a)
     58{   
     59        long double x = 1;
     60        long double lx = 0;
     61
     62        if(a<0.00000000000000001) return 0;
     63               
     64        while(x!=lx)
     65        {
     66                lx=x;
     67                x=(x+(a/x))/2;
     68        }
     69        return x;
     70}
     71#endif
     72
     73
    4774
    4875static atomic_t threads_ok;
     
    76103static void pi(void *data)
    77104{
     105
     106#ifdef __ia64_ARCH_H__
     107#undef PI_10e8 
     108#define PI_10e8 3141592
     109#endif
     110
    78111        int i;
    79112        double lpi, pi;
     
    97130                }
    98131
     132#ifdef __ia64_ARCH_H__
     133                if((int)(1000000*pi)!=PI_10e8)
     134                        panic("tid%d: pi*10e8=%d should be %d\n", THREAD->tid, (__native) (1000000*pi),(__native) (PI_10e8/100));
     135#else
    99136                if((int)(100000000*pi)!=PI_10e8)
    100137                        panic("tid%d: pi*10e8=%d should be %d\n", THREAD->tid, (__native) (100000000*pi),(__native) PI_10e8);
     138#endif
     139
    101140        }
    102141
     
    134173        printf("Test passed.\n");
    135174}
     175
     176/*
     177static void pi(void *data)
     178{
     179#undef PI_10e8 
     180#define PI_10e8 3141592
     181
     182
     183        int i;
     184        double lpi, pi;
     185        double n, ab, ad;
     186
     187
     188        printf("pi test\n");
     189
     190        waitq_sleep(&can_start);
     191
     192
     193        for (i = 0; i<ATTEMPTS; i++) {
     194                lpi = -1;
     195                pi = 0;
     196
     197                for (n=2, ab = sqrt(2); lpi != pi; n *= 2, ab = ad) {
     198                        double sc, cd;
     199
     200                        sc = sqrt(1 - (ab*ab/4));
     201                        cd = 1 - sc;
     202                        ad = sqrt(ab*ab/4 + cd*cd);
     203                        lpi = pi;
     204                        pi = 2 * n * ad;
     205                }
     206
     207                atomic_inc(&threads_ok);
     208                if((int)(1000000*pi)!=PI_10e8)
     209                        panic("tid%d: pi*10e6=%d\n", THREAD->tid, (int) 1000000*pi);
     210        }
     211
     212        printf("tid%d: pi*10e6=%d\n", THREAD->tid, (int) 1000000*pi);
     213}
     214*/
Note: See TracChangeset for help on using the changeset viewer.