|
|
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
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.