Changeset 414f59c in mainline


Ignore:
Timestamp:
2005-12-01T20:27:22Z (19 years ago)
Author:
Jakub Jermar <jakub@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
8ac5fe7
Parents:
22e10ab
Message:

sparc64 work.
The context_save/context_restore needed two other improvements.
First, storing of %fp because of window_fills.
Second, flushing all active windows before CONTEXT_LOAD to make CWP - 1 the overlap window.

Files:
4 edited

Legend:

Unmodified
Added
Removed
  • arch/sparc64/include/context.h

    r22e10ab r414f59c  
    4848#endif
    4949
    50 #define context_set(c, _pc, stack, size)                                                                \
    51         (c)->pc = ((__address) _pc) - 8;                                                                \
    52         (c)->sp = ((__address) stack) + ALIGN((size), STACK_ALIGNMENT) - (STACK_BIAS + SP_DELTA)
     50#define context_set(c, _pc, stack, size)                                                                \
     51        (c)->pc = ((__address) _pc) - 8;                                                                \
     52        (c)->sp = ((__address) stack) + ALIGN((size), STACK_ALIGNMENT) - (STACK_BIAS + SP_DELTA);       \
     53        (c)->fp = -STACK_BIAS
     54       
    5355
    5456/*
     
    6567        __address sp;           /* %o6 */
    6668        __address pc;           /* %o7 */
     69        __address fp;
    6770        ipl_t ipl;
    6871};
  • arch/sparc64/include/context_offset.h

    r22e10ab r414f59c  
    88#define OFFSET_SP  0x28
    99#define OFFSET_PC  0x30
     10#define OFFSET_FP  0x38
  • arch/sparc64/src/context.S

    r22e10ab r414f59c  
    2929#include <arch/context_offset.h>
    3030#include <arch/stack.h>
     31
     32/**
     33 * Both context_save_arch() and context_restore_arch() are
     34 * leaf-optimized procedures. Both of them touch %sp and
     35 * %fp and thus break SCD 2.4 compliance. However, these
     36 * functions are special enough to be allowed this
     37 * kind of behavior. Moreover, this kind of optimization
     38 * is very important and prevents any window spill/
     39 * fill/clean traps in these very core kernel functions.
     40 */
    3141       
    3242.text   
     
    3646
    3747.macro CONTEXT_STORE r
    38         stx %o1, [\r + OFFSET_I1]
    39         stx %o2, [\r + OFFSET_I2]
    40         stx %o3, [\r + OFFSET_I3]
    41         stx %o4, [\r + OFFSET_I4]
    42         stx %o5, [\r + OFFSET_I5]
     48        stx %o1, [\r + OFFSET_O1]
     49        stx %o2, [\r + OFFSET_O2]
     50        stx %o3, [\r + OFFSET_O3]
     51        stx %o4, [\r + OFFSET_O4]
     52        stx %o5, [\r + OFFSET_O5]
    4353        stx %o7, [\r + OFFSET_PC]
    4454        stx %sp, [\r + OFFSET_SP]
     55        stx %fp, [\r + OFFSET_FP]
    4556.endm
    4657
    4758.macro CONTEXT_LOAD r
    48         ldx [\r + OFFSET_I1], %o1
    49         ldx [\r + OFFSET_I2], %o2
    50         ldx [\r + OFFSET_I3], %o3
    51         ldx [\r + OFFSET_I4], %o4
    52         ldx [\r + OFFSET_I5], %o5
     59        ldx [\r + OFFSET_O1], %o1
     60        ldx [\r + OFFSET_O2], %o2
     61        ldx [\r + OFFSET_O3], %o3
     62        ldx [\r + OFFSET_O4], %o4
     63        ldx [\r + OFFSET_O5], %o5
    5364        ldx [\r + OFFSET_PC], %o7
    5465        ldx [\r + OFFSET_SP], %sp
     66        ldx [\r + OFFSET_FP], %fp
    5567.endm
    5668
    57        
    5869context_save_arch:
    5970        CONTEXT_STORE %o0
    60 
    61         # context_save returns 1
    6271        retl
    63         mov 1, %o0
     72        mov 1, %o0              ! context_save_arch returns 1
    6473
    6574context_restore_arch:
     75        #
     76        # Flush all active windows.
     77        # This is essential, because CONTEXT_LOAD overwrites
     78        # %sp of CWP - 1 with the value written to %fp of CWP.
     79        # Flushing all active windows mitigates this problem
     80        # as CWP - 1 becomes the overlap window.
     81        #
     82        flushw
     83       
    6684        CONTEXT_LOAD %o0
    67 
    68         # context_restore returns 0
    6985        retl
    70         xor %o0, %o0, %o0
     86        xor %o0, %o0, %o0       ! context_restore_arch returns 0
  • tools/sparc64/gencontext.c

    r22e10ab r414f59c  
    3535        fprintf(f,"#define OFFSET_SP  0x%x\n",((int)&pctx->sp) - (int )pctx);
    3636        fprintf(f,"#define OFFSET_PC  0x%x\n",((int)&pctx->pc) - (int )pctx);
     37        fprintf(f,"#define OFFSET_FP  0x%x\n",((int)&pctx->fp) - (int )pctx);
    3738
    3839        fclose(f);
Note: See TracChangeset for help on using the changeset viewer.