Changeset c7f8408d in rtems


Ignore:
Timestamp:
Dec 2, 2009, 1:41:57 AM (9 years ago)
Author:
Till Straumann <strauman@…>
Branches:
4.10, 4.11, master
Children:
6ce625e
Parents:
fbee4ff
Message:

2009-12-01 Till Straumann <strauman@…>

  • new-exceptions/cpu.c, new-exceptions/cpu_asm.S, new-exceptions/bspsupport/ppc_exc_asm_macros.h, new-exceptions/bspsupport/ppc_exc_initialize.c, new-exceptions/bspsupport/vectors.h: Added AltiVec? support (save/restore volatile vregs across exceptions).
Location:
c/src/lib/libcpu/powerpc
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • c/src/lib/libcpu/powerpc/ChangeLog

    rfbee4ff rc7f8408d  
     12009-12-01      Till Straumann <strauman@slac.stanford.edu>
     2
     3        * new-exceptions/cpu.c, new-exceptions/cpu_asm.S,
     4        new-exceptions/bspsupport/ppc_exc_asm_macros.h,
     5        new-exceptions/bspsupport/ppc_exc_initialize.c,
     6        new-exceptions/bspsupport/vectors.h:
     7        Added AltiVec support (save/restore volatile vregs
     8        across exceptions).
     9       
    1102009-12-01      Till Straumann <strauman@slac.stanford.edu>
    211
  • c/src/lib/libcpu/powerpc/new-exceptions/bspsupport/ppc_exc_asm_macros.h

    rfbee4ff rc7f8408d  
    521521wrap_change_msr_done_\_FLVR:
    522522
     523#ifdef __ALTIVEC__
     524        LA  SCRATCH_REGISTER_0, _CPU_save_altivec_volatile
     525        mtctr SCRATCH_REGISTER_0
     526        addi r3, FRAME_REGISTER, EXC_VEC_OFFSET
     527        bctrl
     528        /*
     529         * Establish defaults for vrsave and vscr
     530         */
     531        li       SCRATCH_REGISTER_0, 0
     532        mtvrsave SCRATCH_REGISTER_0
     533        /*
     534         * Use java/c9x mode; clear saturation bit
     535         */
     536        vxor     0, 0, 0
     537        mtvscr   0
     538        /*
     539         * Reload VECTOR_REGISTER
     540         */
     541        lwz          VECTOR_REGISTER, EXCEPTION_NUMBER_OFFSET(FRAME_REGISTER)
     542#endif
     543
    523544        /*
    524545         * Call high level exception handler
     
    619640
    620641wrap_thread_dispatching_done_\_FLVR:
     642
     643#ifdef __ALTIVEC__
     644        LA  SCRATCH_REGISTER_0, _CPU_load_altivec_volatile
     645        mtctr   SCRATCH_REGISTER_0     
     646        addi    r3, FRAME_REGISTER, EXC_VEC_OFFSET     
     647        bctrl
     648#endif
    621649
    622650        /* Restore MSR? */
  • c/src/lib/libcpu/powerpc/new-exceptions/bspsupport/ppc_exc_initialize.c

    rfbee4ff rc7f8408d  
    136136  ppc_exc_msr_bits = ppc_machine_state_register() & (MSR_DR | MSR_IR | MSR_RI);
    137137
     138#ifdef __ALTIVEC__
     139  /* Need vector unit enabled to save/restore altivec context */
     140  ppc_exc_msr_bits |= MSR_VE;
     141#endif
     142 
    138143  if (ppc_cpu_is(PPC_e200z6)) {
    139144    ppc_exc_initialize_e200();
  • c/src/lib/libcpu/powerpc/new-exceptions/bspsupport/vectors.h

    rfbee4ff rc7f8408d  
    190190#define EXC_LR_OFFSET 160
    191191
     192#define EXC_GENERIC_SIZE 176
     193
     194#ifdef __ALTIVEC__
     195#define EXC_VEC_OFFSET EXC_GENERIC_SIZE
     196#ifndef PPC_CACHE_ALIGNMENT
     197#error "Missing include file!"
     198#endif
     199/*   20 volatile registers
     200 * + cache-aligned area for vcsr, vrsave
     201 * + area for alignment
     202 */
     203#define EXC_VEC_SIZE   (16*20 + 2*PPC_CACHE_ALIGNMENT)
     204#else
     205#define EXC_VEC_SIZE   (0)
     206#endif
     207
    192208/* Exception stack frame -> BSP_Exception_frame */
    193209#define FRAME_LINK_SPACE 8
     
    198214 * exception may need more registers to be processed...)
    199215 */
    200 #define EXCEPTION_FRAME_END 176
     216#define EXCEPTION_FRAME_END (EXC_GENERIC_SIZE + EXC_VEC_SIZE)
    201217
    202218/** @} */
  • c/src/lib/libcpu/powerpc/new-exceptions/cpu.c

    rfbee4ff rc7f8408d  
    3434#include <rtems/score/thread.h>
    3535#include <rtems/score/interr.h>
     36#include <rtems/score/cpu.h>
    3637#include <rtems/powerpc/powerpc.h>
    3738
     
    4647{
    4748  /* Do nothing */
     49#ifdef __ALTIVEC__
     50  _CPU_Initialize_altivec();
     51#endif
    4852}
    4953
     
    145149#error unsupported PPC_ABI
    146150#endif
     151
     152#ifdef __ALTIVEC__
     153  _CPU_Context_initialize_altivec(the_context);
     154#endif
    147155}
    148156
  • c/src/lib/libcpu/powerpc/new-exceptions/cpu_asm.S

    rfbee4ff rc7f8408d  
    294294        isync
    295295        /* This assumes that all the registers are in the given order */
    296         li      r5, 32
    297         addi    r3,r3,-4
    298 #if ( PPC_USE_DATA_CACHE )
    299         dcbz    r5, r3
    300 #endif
    301         stw     r1, GP_1+4(r3)
    302         stw     r2, GP_2+4(r3)
     296#if ( PPC_USE_DATA_CACHE )
     297#if PPC_CACHE_ALIGNMENT != 32
     298#error "code assumes PPC_CACHE_ALIGNMENT == 32!"
     299#endif
     300        li      r5, PPC_CACHE_ALIGNMENT
     301#endif
     302        addi    r9,r3,-4
     303#if ( PPC_USE_DATA_CACHE )
     304        dcbz    r5, r9
     305#endif
     306        stw     r1, GP_1+4(r9)
     307        stw     r2, GP_2+4(r9)
    303308#if (PPC_USE_MULTIPLE == 1)
    304         addi    r3, r3, GP_18+4
    305 #if ( PPC_USE_DATA_CACHE )
    306         dcbz    r5, r3
    307 #endif
    308         stmw    r13, GP_13-GP_18(r3)
     309        addi    r9, r9, GP_18+4
     310#if ( PPC_USE_DATA_CACHE )
     311        dcbz    r5, r9
     312#endif
     313        stmw    r13, GP_13-GP_18(r9)
    309314#else
    310         stw     r13, GP_13+4(r3)
    311         stw     r14, GP_14+4(r3)
    312         stw     r15, GP_15+4(r3)
    313         stw     r16, GP_16+4(r3)
    314         stw     r17, GP_17+4(r3)
    315         stwu    r18, GP_18+4(r3)
    316 #if ( PPC_USE_DATA_CACHE )
    317         dcbz    r5, r3
    318 #endif
    319         stw     r19, GP_19-GP_18(r3)
    320         stw     r20, GP_20-GP_18(r3)
    321         stw     r21, GP_21-GP_18(r3)
    322         stw     r22, GP_22-GP_18(r3)
    323         stw     r23, GP_23-GP_18(r3)
    324         stw     r24, GP_24-GP_18(r3)
    325         stw     r25, GP_25-GP_18(r3)
    326         stw     r26, GP_26-GP_18(r3)
    327         stw     r27, GP_27-GP_18(r3)
    328         stw     r28, GP_28-GP_18(r3)
    329         stw     r29, GP_29-GP_18(r3)
    330         stw     r30, GP_30-GP_18(r3)
    331         stw     r31, GP_31-GP_18(r3)
     315        stw     r13, GP_13+4(r9)
     316        stw     r14, GP_14+4(r9)
     317        stw     r15, GP_15+4(r9)
     318        stw     r16, GP_16+4(r9)
     319        stw     r17, GP_17+4(r9)
     320        stwu    r18, GP_18+4(r9)
     321#if ( PPC_USE_DATA_CACHE )
     322        dcbz    r5, r9
     323#endif
     324        stw     r19, GP_19-GP_18(r9)
     325        stw     r20, GP_20-GP_18(r9)
     326        stw     r21, GP_21-GP_18(r9)
     327        stw     r22, GP_22-GP_18(r9)
     328        stw     r23, GP_23-GP_18(r9)
     329        stw     r24, GP_24-GP_18(r9)
     330        stw     r25, GP_25-GP_18(r9)
     331        stw     r26, GP_26-GP_18(r9)
     332        stw     r27, GP_27-GP_18(r9)
     333        stw     r28, GP_28-GP_18(r9)
     334        stw     r29, GP_29-GP_18(r9)
     335        stw     r30, GP_30-GP_18(r9)
     336        stw     r31, GP_31-GP_18(r9)
    332337#endif
    333338#if ( PPC_USE_DATA_CACHE )
     
    335340#endif
    336341        mfcr    r6
    337         stw     r6, GP_CR-GP_18(r3)
     342        stw     r6, GP_CR-GP_18(r9)
    338343        mflr    r7
    339         stw     r7, GP_PC-GP_18(r3)
     344        stw     r7, GP_PC-GP_18(r9)
    340345        mfmsr   r8
    341         stw     r8, GP_MSR-GP_18(r3)
     346        stw     r8, GP_MSR-GP_18(r9)
     347
     348#ifdef __ALTIVEC__
     349        mr      r14, r4
     350        EXTERN_PROC(_CPU_Context_switch_altivec)
     351        bl              _CPU_Context_switch_altivec
     352        mr      r4, r14
     353#if ( PPC_USE_DATA_CACHE )
     354        li      r5, PPC_CACHE_ALIGNMENT
     355#endif
     356#endif
    342357
    343358#if ( PPC_USE_DATA_CACHE )
     
    432447        lwz     r31, GP_31(r3)
    433448#endif
    434 
     449#ifdef __ALTIVEC__
     450        EXTERN_PROC(_CPU_Context_restore_altivec)
     451        b _CPU_Context_restore_altivec
     452#endif
    435453        blr
Note: See TracChangeset for help on using the changeset viewer.