Annotation of qemu/roms/openbios/arch/sparc32/switch.S, revision 1.1.1.1

1.1       root        1: #include "psr.h"
                      2: #include "asm/asi.h"
                      3: #define ASI_BP ASI_M_BYPASS
                      4: #define REGWIN_SZ   0x40
                      5: 
                      6:        .globl  __switch_context, __switch_context_nosave, __exit_context, halt
                      7: 
                      8:        .text
                      9:        .align  4
                     10: 
                     11: #define STACKFRAME_SZ     0x60
                     12: 
                     13: /* These are just handy. */
                     14: #define _SV    save    %sp, -STACKFRAME_SZ, %sp
                     15: #define _RS     restore
                     16: 
                     17: #define FLUSH_ALL_KERNEL_WINDOWS \
                     18:        _SV; _SV; _SV; _SV; _SV; _SV; _SV; \
                     19:        _RS; _RS; _RS; _RS; _RS; _RS; _RS;
                     20: 
                     21: /*
                     22:  * Switch execution context
                     23:  * This saves registers in the stack, then
                     24:  * switches the stack, and restores everything from the new stack.
                     25:  * This function takes no argument. New stack pointer is
                     26:  * taken from global variable __context, and old stack pointer
                     27:  * is also saved to __context. This way we can just jump to
                     28:  * this routine to get back to the original context.
                     29:  */
                     30: 
                     31: __switch_context:
                     32:         FLUSH_ALL_KERNEL_WINDOWS
                     33:        /* Save everything in stack */
                     34:         st      %fp, [%fp + 120 -144]
                     35:         add     %fp, -144, %fp
                     36:         st      %g1, [%fp + 4]
                     37:         st      %g2, [%fp + 8]
                     38:         st      %g3, [%fp + 12]
                     39:         st      %g4, [%fp + 16]
                     40:         st      %g5, [%fp + 20]
                     41:         st      %g6, [%fp + 24]
                     42:         st      %g7, [%fp + 28]
                     43: 
                     44:         st      %o0, [%fp + 32]
                     45:         st      %o1, [%fp + 36]
                     46:         st      %o2, [%fp + 40]
                     47:         st      %o3, [%fp + 44]
                     48:         st      %o4, [%fp + 48]
                     49:         st      %o5, [%fp + 52]
                     50:         st      %sp, [%fp + 56]
                     51:         st      %o7, [%fp + 60]
                     52: 
                     53:         st      %l0, [%fp + 64]
                     54:         st      %l1, [%fp + 68]
                     55:         st      %l2, [%fp + 72]
                     56:         st      %l3, [%fp + 76]
                     57:         st      %l4, [%fp + 80]
                     58:         st      %l5, [%fp + 84]
                     59:         st      %l6, [%fp + 88]
                     60:         st      %l7, [%fp + 92]
                     61: 
                     62:         st      %i0, [%fp + 96]
                     63:         st      %i1, [%fp + 100]
                     64:         st      %i2, [%fp + 104]
                     65:         st      %i3, [%fp + 108]
                     66:         st      %i4, [%fp + 112]
                     67:         st      %i5, [%fp + 116]
                     68:         st      %i7, [%fp + 124]
                     69: 
                     70:         /* ctx->return_address:  Return to caller */
                     71:         st      %o7, [%fp + 128]
                     72: 
                     73:        /* Interrupts are not allowed... */
                     74: 
                     75:        /* Turn on Supervisor, EnableFloating, and all the PIL bits.
                     76:         * Also puts us in register window zero with traps off.
                     77:         */
                     78: #if 0
                     79:        set     (PSR_PS | PSR_S | PSR_PIL | PSR_EF), %g2
                     80:        wr      %g2, 0x0, %psr
                     81: #endif
                     82:         set     __context, %g1
                     83:         /* Swap ctx pointer with %fp and jump*/
                     84:         ba     __set_context
                     85:          swap      [%g1], %fp
                     86: __switch_context_nosave:
                     87:         set     __context, %g1
                     88:         /* load %fp from ctx pointer */
                     89:         ld      [%g1], %fp
                     90: __set_context:
                     91:        /* Load all registers */
                     92:         /* offset 0: %g0, no need to load */
                     93:         ld      [%fp + 4], %g1
                     94:         ld      [%fp + 8], %g2
                     95:         ld      [%fp + 12], %g3
                     96:         ld      [%fp + 16], %g4
                     97:         ld      [%fp + 20], %g5
                     98:         ld      [%fp + 24], %g6
                     99:         ld      [%fp + 28], %g7
                    100: 
                    101:         /* offset 32: %o0, loaded from ctx->param */
                    102:         ld      [%fp + 36], %o1
                    103:         ld      [%fp + 40], %o2
                    104:         ld      [%fp + 44], %o3
                    105:         ld      [%fp + 48], %o4
                    106:         ld      [%fp + 52], %o5
                    107:         ld      [%fp + 56], %sp
                    108:         /* offset 60: %o7, loaded from ctx->return_addr */
                    109: 
                    110:         ld      [%fp + 64], %l0
                    111:         ld      [%fp + 68], %l1
                    112:         ld      [%fp + 72], %l2
                    113:         ld      [%fp + 76], %l3
                    114:         ld      [%fp + 80], %l4
                    115:         ld      [%fp + 84], %l5
                    116:         ld      [%fp + 88], %l6
                    117:         ld      [%fp + 92], %l7
                    118: 
                    119:         ld      [%fp + 96], %i0
                    120:         ld      [%fp + 100], %i1
                    121:         ld      [%fp + 104], %i2
                    122:         ld      [%fp + 108], %i3
                    123:         ld      [%fp + 112], %i4
                    124:         ld      [%fp + 116], %i5
                    125:         ld      [%fp + 124], %i7
                    126: 
                    127:         /* ctx->return_addr */
                    128:         ld      [%fp + 136], %o7
                    129: 
                    130:         /* ctx->param */
                    131:         ld      [%fp + 140], %o0
                    132: 
                    133:         /* ctx->pc, save %g1 to %y and load to %g1 */
                    134:         mov     %g1, %y
                    135:         ld      [%fp + 128], %g1
                    136:         /* %fp last */
                    137:         ld      [%fp + 120], %fp
                    138:         /* Finally, get the new %pc from %g1 and restore %g1*/
                    139:         jmp     %g1
                    140:          mov    %y, %g1
                    141: 
                    142:         FLUSH_ALL_KERNEL_WINDOWS
                    143: __exit_context:
                    144:        /* Get back to the original context */
                    145:        call    __switch_context
                    146:         nop
                    147: 
                    148:        /* We get here if the other context attempt to switch to this
                    149:         * dead context. This should not happen. */
                    150: 
                    151: halt:
                    152:        b       halt
                    153:         nop

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.