Annotation of qemu/roms/openbios/arch/sparc64/switch.S, revision 1.1

1.1     ! root        1: #include "pstate.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:         .register %g2, #scratch
        !            11:         .register %g3, #scratch
        !            12:         .register %g6, #scratch
        !            13:         .register %g7, #scratch
        !            14: 
        !            15: /*
        !            16:  * Switch execution context
        !            17:  * This saves registers in the stack, then
        !            18:  * switches the stack, and restores everything from the new stack.
        !            19:  * This function takes no argument. New stack pointer is
        !            20:  * taken from global variable __context, and old stack pointer
        !            21:  * is also saved to __context. This way we can just jump to
        !            22:  * this routine to get back to the original context.
        !            23:  */
        !            24: 
        !            25: /* XXX: totally bogus for sparc, need to save and restore all windows */
        !            26: __switch_context:
        !            27: 
        !            28:        /* make sure caller's windows are on caller's stack */
        !            29:        flushw;
        !            30: 
        !            31:        /* Save everything in current stack */
        !            32: 
        !            33:        setx    __context, %g2, %g1
        !            34:         stx     %g3, [%g1 + 24]
        !            35:         stx     %g4, [%g1 + 32]
        !            36:         stx     %g5, [%g1 + 40]
        !            37:         stx     %g6, [%g1 + 48]
        !            38:         stx     %g7, [%g1 + 56]
        !            39: 
        !            40:         stx     %o0, [%g1 + 64]
        !            41:         stx     %o1, [%g1 + 72]
        !            42:         stx     %o2, [%g1 + 80]
        !            43:         stx     %o3, [%g1 + 88]
        !            44:         stx     %o4, [%g1 + 96]
        !            45:         stx     %o5, [%g1 + 104]
        !            46:         stx     %o6, [%g1 + 112]
        !            47:         stx     %o7, [%g1 + 120]
        !            48: 
        !            49:         stx     %l0, [%g1 + 128]
        !            50:         stx     %l1, [%g1 + 136]
        !            51:         stx     %l2, [%g1 + 144]
        !            52:         stx     %l3, [%g1 + 152]
        !            53:         stx     %l4, [%g1 + 160]
        !            54:         stx     %l5, [%g1 + 168]
        !            55:         stx     %l6, [%g1 + 176]
        !            56:         stx     %l7, [%g1 + 184]
        !            57: 
        !            58:         stx     %i0, [%g1 + 192]
        !            59:         stx     %i1, [%g1 + 200]
        !            60:         stx     %i2, [%g1 + 208]
        !            61:         stx     %i3, [%g1 + 216]
        !            62:         stx     %i4, [%g1 + 224]
        !            63:         stx     %i5, [%g1 + 232]
        !            64:         stx     %i6, [%g1 + 240]
        !            65:         stx     %i7, [%g1 + 248]
        !            66: 
        !            67: __switch_context_nosave:
        !            68:        /* Interrupts are not allowed... */
        !            69:        /* make sure caller's windows are on caller's stack */
        !            70:        flushw
        !            71:        /* Load all registers
        !            72:         */
        !            73:        setx    __context, %g2, %g1
        !            74:         ldx     [%g1], %g1
        !            75:         ldx     [%g1 + 16], %g2
        !            76:         ldx     [%g1 + 24], %g3
        !            77:         ldx     [%g1 + 32], %g4
        !            78:         ldx     [%g1 + 40], %g5
        !            79:         ldx     [%g1 + 48], %g6
        !            80:         ldx     [%g1 + 56], %g7
        !            81: 
        !            82:         ldx     [%g1 + 64], %o0
        !            83:         ldx     [%g1 + 72], %o1
        !            84:         ldx     [%g1 + 80], %o2
        !            85:         ldx     [%g1 + 88], %o3
        !            86:         ldx     [%g1 + 96], %o4
        !            87:         ldx     [%g1 + 104], %o5
        !            88:         ldx     [%g1 + 112], %o6
        !            89:         ldx     [%g1 + 120], %o7
        !            90: 
        !            91:         ldx     [%g1 + 128], %l0
        !            92:         ldx     [%g1 + 136], %l1
        !            93:         ldx     [%g1 + 144], %l2
        !            94:         ldx     [%g1 + 152], %l3
        !            95:         ldx     [%g1 + 160], %l4
        !            96:         ldx     [%g1 + 168], %l5
        !            97:         ldx     [%g1 + 176], %l6
        !            98:         ldx     [%g1 + 184], %l7
        !            99: 
        !           100:         ldx     [%g1 + 192], %i0
        !           101:         ldx     [%g1 + 200], %i1
        !           102:         ldx     [%g1 + 208], %i2
        !           103:         ldx     [%g1 + 216], %i3
        !           104:         ldx     [%g1 + 224], %i4
        !           105:         ldx     [%g1 + 232], %i5
        !           106:         ldx     [%g1 + 240], %i6
        !           107:         ldx     [%g1 + 248], %i7
        !           108: 
        !           109:         ldx     [%g1 + 256], %g1
        !           110:                /* Finally, load new %pc */
        !           111:         jmp     %g1
        !           112:          clr    %g1
        !           113: 
        !           114: __exit_context:
        !           115:        /* Get back to the original context */
        !           116:        call    __switch_context
        !           117:         nop
        !           118: 
        !           119:        /* We get here if the other context attempt to switch to this
        !           120:         * dead context. This should not happen. */
        !           121: 
        !           122: halt:
        !           123:        b       halt
        !           124:         nop

unix.superglobalmegacorp.com

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