Changeset b49f4ae in mainline


Ignore:
Timestamp:
2005-09-06T09:56:26Z (19 years ago)
Author:
Ondrej Palkovsky <ondrap@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
50a4e25
Parents:
a5d1331
Message:

Added architecture independent hooks for fpu lazy context switching.
It is enabled by defining FPU_LAZY

Files:
21 edited

Legend:

Unmodified
Added
Removed
  • arch/amd64/Makefile.inc

    ra5d1331 rb49f4ae  
    1111BFD_ARCH=i386:x86-64
    1212
    13 DEFS=-DARCH=$(ARCH)
     13DEFS=-DARCH=$(ARCH) -DFPU_LAZY
    1414
    1515ifdef SMP
  • arch/amd64/include/cpu.h

    ra5d1331 rb49f4ae  
    5252
    5353
    54 extern void set_TS_flag(void);
    55 extern void reset_TS_flag(void);
    5654extern void set_efer_flag(int flag);
    5755extern __u64 read_efer_flag(void);
  • arch/amd64/src/cpu/cpu.c

    ra5d1331 rb49f4ae  
    9191 *
    9292 */
    93 void set_TS_flag(void)
     93void fpu_disable(void)
    9494{
    9595        __asm__ volatile (
     
    103103}
    104104
    105 void reset_TS_flag(void)
     105void fpu_enable(void)
    106106{
    107107        __asm__ volatile (
  • arch/amd64/src/fpu_context.c

    ra5d1331 rb49f4ae  
    3434void fpu_context_save(fpu_context_t *fctx)
    3535{
    36 }
    37 
    38 void fpu_context_restore(fpu_context_t *fctx)
    39 {
    40         if(THREAD==CPU->fpu_owner)
    41                 reset_TS_flag();
    42         else
    43                 set_TS_flag();
    44 }
    45 
    46 
    47 void fpu_lazy_context_save(fpu_context_t *fctx)
    48 {
    49         /* TODO: We need malloc that allocates on 16-byte boundary !! */
     36        /* Align on 16-byte boundary */
    5037        if (((__u64)fctx) & 0xf)
    5138                fctx = (fpu_context_t *)((((__u64)fctx) | 0xf) + 1);
     
    5744}
    5845
    59 void fpu_lazy_context_restore(fpu_context_t *fctx)
     46void fpu_context_restore(fpu_context_t *fctx)
    6047{
    6148        /* TODO: We need malloc that allocates on 16-byte boundary !! */
  • arch/amd64/src/interrupt.c

    ra5d1331 rb49f4ae  
    3939#include <symtab.h>
    4040#include <arch/asm.h>
    41 
     41#include <proc/scheduler.h>
    4242
    4343
     
    139139void nm_fault(__u8 n, __native stack[])
    140140{
    141         reset_TS_flag();
    142         if (CPU->fpu_owner != NULL) { 
    143                 fpu_lazy_context_save(&CPU->fpu_owner->saved_fpu_context);
    144                 /* don't prevent migration */
    145                 CPU->fpu_owner->fpu_context_engaged=0;
    146         }
    147         if (THREAD->fpu_context_exists)
    148                 fpu_lazy_context_restore(&THREAD->saved_fpu_context);
    149         else {
    150                 fpu_init();
    151                 THREAD->fpu_context_exists=1;
    152         }
    153         CPU->fpu_owner=THREAD;
    154         THREAD->fpu_context_engaged = 1;
     141#ifdef FPU_LAZY     
     142        scheduler_fpu_lazy_request();
     143#else
     144        panic("fpu fault");
     145#endif
    155146}
    156147
  • arch/ia32/Makefile.inc

    ra5d1331 rb49f4ae  
    88
    99
    10 DEFS:=-DARCH=$(ARCH)
     10DEFS:=-DARCH=$(ARCH) -DFPU_LAZY
    1111
    1212ifdef SMP
  • arch/ia32/Makefile.inc.cross

    ra5d1331 rb49f4ae  
    88LD=$(IA-32_BINUTILS_DIR)/$(IA-32_TARGET)-ld
    99OBJCOPY=$(IA-32_BINUTILS_DIR)/$(IA-32_TARGET)-objcopy
     10OBJDUMP=$(IA-32_BINUTILS_DIR)/$(IA-32_TARGET)-objdump
    1011
    1112BFD_NAME=elf32-i386
    1213BFD_ARCH=i386
    1314
    14 DEFS:=-DARCH=$(ARCH)
     15DEFS:=-DARCH=$(ARCH) -DFPU_LAZY
    1516
    1617ifdef SMP
     
    2526CFLAGS=$(CPPFLAGS) -nostdlib -fno-builtin -fomit-frame-pointer -Werror-implicit-function-declaration -Wmissing-prototypes -Werror -O3
    2627LFLAGS=-M -no-check-sections
     28
     29../arch/$(ARCH)/_link.ld: ../arch/$(ARCH)/_link.ld.in
     30        $(CC) $(CFLAGS) -E -x c $< | grep -v "^\#" > $@
    2731
    2832arch_sources= \
  • arch/ia32/include/cpu.h

    ra5d1331 rb49f4ae  
    4242};
    4343
    44 
    45 void set_TS_flag(void);
    46 void reset_TS_flag(void);
    47 
    4844#endif
  • arch/ia32/include/fpu_context.h

    ra5d1331 rb49f4ae  
    3838
    3939
    40 
    4140#endif
  • arch/ia32/src/cpu/cpu.c

    ra5d1331 rb49f4ae  
    6363};
    6464
    65 void set_TS_flag(void)
     65void fpu_disable(void)
    6666{
    67         asm
    68         (
     67        __asm__ volatile (
    6968                "mov %%cr0,%%eax;"
    7069                "or $8,%%eax;"
     
    7675}
    7776
    78 void reset_TS_flag(void)
     77void fpu_enable(void)
    7978{
    80         asm
    81         (
     79        __asm__ volatile (
    8280                "mov %%cr0,%%eax;"
    8381                "and $0xffFFffF7,%%eax;"
  • arch/ia32/src/fpu_context.c

    ra5d1331 rb49f4ae  
    3434void fpu_context_save(fpu_context_t *fctx)
    3535{
    36 }
    37 
    38 
    39 void fpu_context_restore(fpu_context_t *fctx)
    40 {
    41         if (THREAD==CPU->fpu_owner)
    42                 reset_TS_flag();
    43         else {
    44                 set_TS_flag();
    45                 if (CPU->fpu_owner != NULL)
    46                         (CPU->fpu_owner)->fpu_context_engaged=1;
    47         }
    48 }
    49 
    50 
    51 void fpu_lazy_context_save(fpu_context_t *fctx)
    52 {
    5336        __asm__ volatile (
    5437                "fnsave %0"
     
    5740}
    5841
    59 void fpu_lazy_context_restore(fpu_context_t *fctx)
     42
     43void fpu_context_restore(fpu_context_t *fctx)
    6044{
    6145        __asm__ volatile (
  • arch/ia32/src/interrupt.c

    ra5d1331 rb49f4ae  
    110110void nm_fault(__u8 n, __native stack[])
    111111{
    112         reset_TS_flag();
    113         if (CPU->fpu_owner != NULL) { 
    114                 fpu_lazy_context_save(&((CPU->fpu_owner)->saved_fpu_context));
    115                 CPU->fpu_owner->fpu_context_engaged=0; /* don't prevent migration */
    116         }
    117         if (THREAD->fpu_context_exists)
    118                 fpu_lazy_context_restore(&(THREAD->saved_fpu_context));
    119         else {
    120                 fpu_init();
    121                 THREAD->fpu_context_exists=1;
    122         }
    123         CPU->fpu_owner=THREAD;
     112#ifdef FPU_LAZY     
     113        scheduler_fpu_lazy_request();
     114#else
     115        panic("fpu fault");
     116#endif
    124117}
    125118
  • arch/ia64/src/dummy.s

    ra5d1331 rb49f4ae  
    4343.global frame_arch_init
    4444.global dummy
     45.global fpu_enable
     46.global fpu_disable
     47.gloabl fpu_init
    4548
    4649before_thread_runs_arch:
     
    5760cpu_sleep:
    5861frame_arch_init:
     62fpu_init:
     63fpu_enable:
     64fpu_disable:   
    5965
    6066dummy:
  • arch/ia64/src/fpu_context.c

    ra5d1331 rb49f4ae  
    3939}
    4040
    41 
    42 void fpu_lazy_context_save(fpu_context_t *fctx)
    43 {
    44 }
    45 
    46 void fpu_lazy_context_restore(fpu_context_t *fctx)
    47 {
    48 }
  • arch/mips/src/dummy.s

    ra5d1331 rb49f4ae  
    3535.global before_thread_runs_arch
    3636.global dummy
     37.global fpu_enable
     38.global fpu_disable
     39.global fpu_init
    3740
    3841before_thread_runs_arch:
     
    4043calibrate_delay_loop:
    4144asm_delay_loop:
     45fpu_enable:
     46fpu_disable:
     47fpu_init:       
    4248
    4349dummy:
  • arch/mips/src/fpu_context.c

    ra5d1331 rb49f4ae  
    3939}
    4040
    41 
    42 void fpu_lazy_context_save(fpu_context_t *fctx)
    43 {
    44 }
    45 
    46 void fpu_lazy_context_restore(fpu_context_t *fctx)
    47 {
    48 }
  • arch/ppc/src/dummy.s

    ra5d1331 rb49f4ae  
    3333.global before_thread_runs_arch
    3434.global dummy
     35.global fpu_init
     36.global fpu_enable
     37.global fpu_disable
    3538
    3639before_thread_runs_arch:
    3740userspace:
    3841asm_delay_loop:
     42fpu_init:
     43fpu_enable:     
     44fpu_disable:   
    3945
    4046dummy:
  • arch/ppc/src/fpu_context.c

    ra5d1331 rb49f4ae  
    3838{
    3939}
    40 
    41 
    42 void fpu_lazy_context_save(fpu_context_t *fctx)
    43 {
    44 }
    45 
    46 void fpu_lazy_context_restore(fpu_context_t *fctx)
    47 {
    48 
    49 }
  • include/fpu_context.h

    ra5d1331 rb49f4ae  
    3636extern void fpu_context_save(fpu_context_t *);
    3737extern void fpu_context_restore(fpu_context_t *);
    38 extern void fpu_lazy_context_save(fpu_context_t *);
    39 extern void fpu_lazy_context_restore(fpu_context_t *);
    4038extern void fpu_init(void);
     39extern void fpu_enable(void);
     40extern void fpu_disable(void);
    4141
    4242
  • include/proc/scheduler.h

    ra5d1331 rb49f4ae  
    5252extern void scheduler_init(void);
    5353
     54extern void scheduler_fpu_lazy_request(void);
    5455extern void scheduler(void);
    5556extern void kcpulb(void *arg);
  • src/proc/scheduler.c

    ra5d1331 rb49f4ae  
    6161void before_thread_runs(void)
    6262{
    63         before_thread_runs_arch();
    64         fpu_context_restore(&(THREAD->saved_fpu_context));
    65 }
    66 
     63        before_thread_runs_arch();
     64#ifdef FPU_LAZY
     65        if(THREAD==CPU->fpu_owner)
     66                fpu_enable();
     67        else
     68                fpu_disable();
     69#else
     70        fpu_enable();
     71        if (THREAD->fpu_context_exists)
     72                fpu_context_restore(&(THREAD->saved_fpu_context));
     73        else {
     74                fpu_init();
     75                THREAD->fpu_context_exists=1;
     76        }
     77#endif
     78}
     79
     80#ifdef FPU_LAZY
     81void scheduler_fpu_lazy_request(void)
     82{
     83        fpu_enable();
     84        if (CPU->fpu_owner != NULL) { 
     85                fpu_context_save(&CPU->fpu_owner->saved_fpu_context);
     86                /* don't prevent migration */
     87                CPU->fpu_owner->fpu_context_engaged=0;
     88        }
     89        if (THREAD->fpu_context_exists)
     90                fpu_context_restore(&THREAD->saved_fpu_context);
     91        else {
     92                fpu_init();
     93                THREAD->fpu_context_exists=1;
     94        }
     95        CPU->fpu_owner=THREAD;
     96        THREAD->fpu_context_engaged = 1;
     97}
     98#endif
    6799
    68100/** Initialize scheduler
     
    241273        if (THREAD) {
    242274                spinlock_lock(&THREAD->lock);
     275#ifndef FPU_LAZY
    243276                fpu_context_save(&(THREAD->saved_fpu_context));
     277#endif
    244278                if (!context_save(&THREAD->saved_context)) {
    245279                        /*
Note: See TracChangeset for help on using the changeset viewer.