Annotation of researchv10no/cmd/cfront/libC/task/hw_stack.c, revision 1.1

1.1     ! root        1: /*ident        "%W%" */
        !             2: /**************************************************************************
        !             3:                        Copyright (c) 1984 AT&T
        !             4:                          All Rights Reserved   
        !             5: 
        !             6:        THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF AT&T
        !             7:        
        !             8:        The copyright notice above does not evidence any        
        !             9:        actual or intended publication of such source code.
        !            10: 
        !            11: *****************************************************************************/
        !            12: #include "hw_stack.h"
        !            13: 
        !            14: /* Machine-dependent asms and functions for task library.
        !            15:  * Porting these requires intimate knowledge of the stack frame layout,
        !            16:  * call and return sequences for the machine.
        !            17:  */
        !            18: 
        !            19: #ifdef PROC_3B
        !            20: 
        !            21: asm("  .text");
        !            22: asm("  .globl  SAVE_REGS");
        !            23: asm("  .align  4");
        !            24: asm("SAVE_REGS:");
        !            25: asm("  save &6");
        !            26: asm("  movw    0(%ap),%r1 ");          /* ptr to HW_REGS */
        !            27: asm("  movw    -24(%fp),0(%r1) ");     /* move caller's r3 to arg.r3 */
        !            28: asm("  movw    -20(%fp),4(%r1) ");     /* move caller's r4 to arg.r4 */
        !            29: asm("  movw    -16(%fp),8(%r1) ");     /* move caller's r5 to arg.r5 */
        !            30: asm("  movw    -12(%fp),12(%r1) ");    /* move caller's r6 to arg.r6 */
        !            31: asm("  movw    -8(%fp),16(%r1) ");     /* move caller's r7 to arg.r7 */
        !            32: asm("  movw    -4(%fp),20(%r1) ");     /* move caller's r8 to arg.r8 */
        !            33: asm("  ret &6");
        !            34: 
        !            35: /* save_saved_regs copies n_saved regs saved in stack frame defined by fp
        !            36:  * to a HW_REGS structure.
        !            37:  */
        !            38: void
        !            39: save_saved_regs(HW_REGS *regsp, int* fp)
        !            40: {
        !            41:        FrameLayout layout(fp);
        !            42:        register int* p = FIRST_SAVED_REG_P(fp, layout.n_saved);
        !            43:        switch(layout.n_saved)  {       
        !            44:                case 6:
        !            45:                        regsp->r3 = *p++;
        !            46:                        /* FALLTHROUGH */
        !            47:                case 5:
        !            48:                        regsp->r4 = *p++;
        !            49:                        /* FALLTHROUGH */
        !            50:                case 4:
        !            51:                        regsp->r5 = *p++;
        !            52:                        /* FALLTHROUGH */
        !            53:                case 3:
        !            54:                        regsp->r6 = *p++;
        !            55:                        /* FALLTHROUGH */
        !            56:                case 2:
        !            57:                        regsp->r7 = *p++;
        !            58:                        /* FALLTHROUGH */
        !            59:                case 1:
        !            60:                        regsp->r8 = *p++;
        !            61:                        /* FALLTHROUGH */
        !            62:                default:
        !            63:                        break;
        !            64:        }
        !            65: }
        !            66: 
        !            67: /* On the 3Bs, the current ap is the caller's sp, but we want caller's sp - 1
        !            68:  * to point to last used word in stack, to correspond with sp's on 386, vax,
        !            69:  * sun
        !            70:  */
        !            71: asm("  .text");
        !            72: asm("  .globl  TOP");
        !            73: asm("  .align  4");
        !            74: asm("TOP:");
        !            75: asm("  save &0");
        !            76: asm("  movw    %ap,%r0");  /* caller's sp */
        !            77: asm("  addw2   &4,%r0");   /* caller's sp - 1 */
        !            78: asm("  ret &0");
        !            79: 
        !            80: /* These assembly language functions should be replaced by new-style
        !            81:  * asms, when (if) they are implemented for C++.
        !            82:  * for example:  
        !            83:  * asm void
        !            84:  * set_r3(p)
        !            85:  * {
        !            86:  *     % mem p;
        !            87:  *     movw *p,%r3
        !            88:  * }
        !            89:  */
        !            90: 
        !            91: asm("  .text");
        !            92: asm("  .globl  set_r3");
        !            93: asm("  .align  4");
        !            94: asm("set_r3:");
        !            95: asm("  save &0");
        !            96: asm("  movw    0(%ap),%r1 ");          /* ptr to register saved in stack */
        !            97: asm("  movw 0(%r1),%r3 ");
        !            98: asm("  ret &0");
        !            99: 
        !           100: asm("  .text");
        !           101: asm("  .globl  set_r4");
        !           102: asm("  .align  4");
        !           103: asm("set_r4:");
        !           104: asm("  save &0");
        !           105: asm("  movw    0(%ap),%r1 ");          /* ptr to register saved in stack */
        !           106: asm("  movw 0(%r1),%r4 ");
        !           107: asm("  ret &0");
        !           108: 
        !           109: asm("  .text");
        !           110: asm("  .globl  set_r5");
        !           111: asm("  .align  4");
        !           112: asm("set_r5:");
        !           113: asm("  save &0");
        !           114: asm("  movw    0(%ap),%r1 ");          /* ptr to register saved in stack */
        !           115: asm("  movw 0(%r1),%r5 ");
        !           116: asm("  ret &0");
        !           117: 
        !           118: asm("  .text");
        !           119: asm("  .globl  set_r6");
        !           120: asm("  .align  4");
        !           121: asm("set_r6:");
        !           122: asm("  save &0");
        !           123: asm("  movw    0(%ap),%r1 ");          /* ptr to register saved in stack */
        !           124: asm("  movw 0(%r1),%r6 ");
        !           125: asm("  ret &0");
        !           126: 
        !           127: asm("  .text");
        !           128: asm("  .globl  set_r7");
        !           129: asm("  .align  4");
        !           130: asm("set_r7:");
        !           131: asm("  save &0");
        !           132: asm("  movw    0(%ap),%r1 ");          /* ptr to register saved in stack */
        !           133: asm("  movw 0(%r1),%r7 ");
        !           134: asm("  ret &0");
        !           135: 
        !           136: asm("  .text");
        !           137: asm("  .globl  set_r8");
        !           138: asm("  .align  4");
        !           139: asm("set_r8:");
        !           140: asm("  save &0");
        !           141: asm("  movw    0(%ap),%r1 ");          /* ptr to register saved in stack */
        !           142: asm("  movw 0(%r1),%r8 ");
        !           143: asm("  ret &0");
        !           144: 
        !           145: #ifdef u3b
        !           146: 
        !           147: asm("  .text");
        !           148: asm("  .globl  AP");
        !           149: asm("  .align  4");
        !           150: asm("AP:");
        !           151: asm("  save &0");
        !           152: asm("  movw    -48(%fp),%r0");  /* r0 = caller's ap */
        !           153: asm("  ret &0");
        !           154: 
        !           155: asm("  .text");
        !           156: asm("  .globl  FP");
        !           157: asm("  .align  4");
        !           158: asm("FP:");
        !           159: asm("  save &0");
        !           160: asm("  movw    -44(%fp),%r0");  /* r0 = caller's fp */
        !           161: asm("  ret &0");
        !           162: 
        !           163: /* On the 3B20 the sp is restored from the current ap on a return
        !           164:  * FUDGE_SP overwrites the saved ap with a new value (the 1st arg), causing
        !           165:  * the caller's ap to be changed to the new value.
        !           166:  * As a precaution, the 1st arg of caller is copied down to where new ap
        !           167:  * will point.  (In case caller references 1st arg (implicit "this" arg)
        !           168:  * to set return value.)
        !           169:  * 2nd arg unnecessary on 3B20. 
        !           170:  */
        !           171: asm("  .text");
        !           172: asm("  .globl  FUDGE_SP");
        !           173: asm("  .align  4");
        !           174: asm("FUDGE_SP:");
        !           175: asm("  save &0");
        !           176: asm("  movw    -48(%fp),%r1");         /* r1 = caller's ap */
        !           177: asm("  movw    0(%ap),%r0");           /* r0 = 1st arg (de_ap) */
        !           178: asm("  movw    0(%r1),0(%r0)");        /* *r0 = caller's 1st arg */
        !           179: asm("  movw    0(%ap),-48(%fp)");      /* overwrite saved ap */
        !           180: asm("  ret &0");
        !           181: 
        !           182: #else  /* BELLMAC_CHIP */
        !           183: 
        !           184: 
        !           185: asm("  .text");
        !           186: asm("  .globl  AP");
        !           187: asm("  .align  4");
        !           188: asm("AP:");
        !           189: asm("  save &0");
        !           190: asm("  movw    -32(%fp),%r0");  /* r0 = caller's ap */ 
        !           191: asm("  ret &0");
        !           192: 
        !           193: asm("  .text");
        !           194: asm("  .globl  FP");
        !           195: asm("  .align  4");
        !           196: asm("FP:");
        !           197: asm("  save &0");
        !           198: asm("  movw    -28(%fp),%r0");  /* r0 = caller's fp */ 
        !           199: asm("  ret &0");
        !           200: 
        !           201: /* On BELLMAC_CHIP machines, sp is restored from current ap on return.
        !           202:  * FUDGE_SP overwrites the saved ap with a new value (the 1st arg), causing
        !           203:  * the caller's ap to be changed to the new value.
        !           204:  * As a precaution, the 1st arg of caller is copied down to where new ap
        !           205:  * will point.  (In case caller references 1st arg (implicit "this" arg)
        !           206:  * to set return value.)
        !           207:  * 2nd arg unnecessary on BELLMAC_CHIP machines.
        !           208:  */ 
        !           209: asm("  .text");
        !           210: asm("  .globl  FUDGE_SP");
        !           211: asm("  .align  4");
        !           212: asm("FUDGE_SP:");
        !           213: asm("  save &0");
        !           214: asm("  movw    -32(%fp),%r1");         /* r1 = caller's ap */
        !           215: asm("  movw    0(%ap),%r0");           /* r0 = 1st arg (de_ap) */
        !           216: asm("  movw    0(%r1),0(%r0)");        /* *r0 = caller's 1st arg */
        !           217: asm("  movw    0(%ap),-32(%fp)");      /* overwrite saved  ap */
        !           218: asm("  ret &0");
        !           219: #endif /* BELLMAC_CHIP */
        !           220: #endif /* PROC_3B */
        !           221: 
        !           222: 
        !           223: #ifdef vax
        !           224: /* save all caller regs in HW_REGS structure */
        !           225: asm("  .globl _SAVE_REGS");
        !           226: asm("  .align  1");
        !           227: asm("_SAVE_REGS:");
        !           228: asm("  .word   0xfc0 ");       /* entry mask; save all user regs (r11-r6) */
        !           229: asm("  movl    4(ap),r1 ");            /* ptr to HW_REGS */
        !           230: asm("  movl    20(fp),0(r1) ");        /* move caller's r6 to arg.r6 */
        !           231: asm("  movl    24(fp),4(r1) ");        /* move caller's r7 to arg.r7 */
        !           232: asm("  movl    28(fp),8(r1) ");        /* move caller's r8 to arg.r8 */
        !           233: asm("  movl    32(fp),12(r1) ");       /* move caller's r9 to arg.r9 */
        !           234: asm("  movl    36(fp),16(r1) ");       /* move caller's r10 to arg.r10 */
        !           235: asm("  movl    40(fp),20(r1) ");       /* move caller's r11 to arg.r11 */
        !           236: asm("  ret");
        !           237: 
        !           238: asm("  .globl _FP");
        !           239: asm("  .align  1");
        !           240: asm("_FP:");
        !           241: asm("  .word   0x0000");       /* entry mask; save no regs */
        !           242: asm("  movl 12(fp),r0");       /* r0 = caller's fp */
        !           243: asm("  ret");
        !           244: 
        !           245: /* On the vax, when there are no args, the current ap is the caller's sp */
        !           246: asm("  .globl _TOP");
        !           247: asm("  .align  1");
        !           248: asm("_TOP:");
        !           249: asm("  .word   0x0000");       /* entry mask; save no regs */
        !           250: asm("  movl ap,r0");           /* r0 = caller's sp */
        !           251: asm("  ret");
        !           252: /* More general (independent of #args) would be:  addl3 $1,(ap),r0 # r0=nargs + 1
        !           253:  *     ashl $2,r0,r0 # r0 = nargs * 4 (scale to bytes) addl2 ap,r0 #caller's sp
        !           254:  */
        !           255: 
        !           256: asm("  .globl _set_r6");
        !           257: asm("  .align  1");
        !           258: asm("_set_r6:");
        !           259: asm("  .word   0x0 ");                 /*  save no regs  */
        !           260: asm("  movl    4(ap),r1 ");            /* ptr to register saved in stack */
        !           261: asm("  movl    (r1),r6 ");
        !           262: asm("  ret");
        !           263: 
        !           264: asm("  .globl _set_r7");
        !           265: asm("  .align  1");
        !           266: asm("_set_r7:");
        !           267: asm("  .word   0x0 ");                 /*  save no regs  */
        !           268: asm("  movl    4(ap),r1 ");            /* ptr to register saved in stack */
        !           269: asm("  movl    (r1),r7 ");
        !           270: asm("  ret");
        !           271: 
        !           272: asm("  .globl _set_r8");
        !           273: asm("  .align  1");
        !           274: asm("_set_r8:");
        !           275: asm("  .word   0x0 ");                 /*  save no regs  */
        !           276: asm("  movl    4(ap),r1 ");            /* ptr to register saved in stack */
        !           277: asm("  movl    (r1),r8 ");
        !           278: asm("  ret");
        !           279: 
        !           280: asm("  .globl _set_r9");
        !           281: asm("  .align  1");
        !           282: asm("_set_r9:");
        !           283: asm("  .word   0x0 ");                 /*  save no regs  */
        !           284: asm("  movl    4(ap),r1 ");            /* ptr to register saved in stack */
        !           285: asm("  movl    (r1),r9 ");
        !           286: asm("  ret");
        !           287: 
        !           288: asm("  .globl _set_r10");
        !           289: asm("  .align  1");
        !           290: asm("_set_r10:");
        !           291: asm("  .word   0x0 ");                 /*  save no regs  */
        !           292: asm("  movl    4(ap),r1 ");            /* ptr to register saved in stack */
        !           293: asm("  movl    (r1),r10 ");
        !           294: asm("  ret");
        !           295: 
        !           296: asm("  .globl _set_r11");
        !           297: asm("  .align  1");
        !           298: asm("_set_r11:");
        !           299: asm("  .word   0x0 ");                 /*  save no regs  */
        !           300: asm("  movl    4(ap),r1 ");            /* ptr to register saved in stack */
        !           301: asm("  movl    (r1),r11 ");
        !           302: asm("  ret");
        !           303: 
        !           304: #endif
        !           305: 
        !           306: #ifdef mc68000         /* Really, ifdef sun--stack frame layout
        !           307:                         * is different on a UNIX PC, for example
        !           308:                         */
        !           309: asm("  .text");
        !           310: asm("  .globl  _SAVE_REGS");
        !           311: asm("_SAVE_REGS:");
        !           312: asm("  link    a6,#-40");
        !           313: asm("  moveml  #0x3cfc,sp@");          /* save d2-d7, a2-a5    */
        !           314: asm("  movl    a6@(8),a0");            /* a0 = arg--ptr to HW_REGS */
        !           315: asm("  movl    a6@(-40),a0@");         /* move caller's d2 to arg.d2 */
        !           316: asm("  movl    a6@(-36),a0@(4)");      /* move caller's d3 to arg.d3 */
        !           317: asm("  movl    a6@(-32),a0@(8)");      /* move caller's d4 to arg.d4 */
        !           318: asm("  movl    a6@(-28),a0@(12)");     /* move caller's d5 to arg.d5 */
        !           319: asm("  movl    a6@(-24),a0@(16)");     /* move caller's d6 to arg.d6 */
        !           320: asm("  movl    a6@(-20),a0@(20)");     /* move caller's d7 to arg.d7 */
        !           321: asm("  movl    a6@(-16),a0@(32)");     /* move caller's a2 to arg.a2 */
        !           322: asm("  movl    a6@(-12),a0@(36)");     /* move caller's a3 to arg.a3 */
        !           323: asm("  movl    a6@(-8),a0@(40)");      /* move caller's a4 to arg.a4 */
        !           324: asm("  movl    a6@(-4),a0@(44)");      /* move caller's a5 to arg.a5 */
        !           325: asm("  moveml  a6@(-40),#0x3cfc");             /* restore d2-d7, a2-a5 */
        !           326: asm("  unlk    a6");
        !           327: asm("  rts");
        !           328: 
        !           329: /* save_saved_regs copies regs saved in stack frame defined by fp
        !           330:  * to a HW_REGS structure.  Uses FrameLayout() to find which regs are saved.
        !           331:  */
        !           332: void
        !           333: save_saved_regs(HW_REGS *regsp, int* fp)
        !           334: {
        !           335:        FrameLayout layout(fp);
        !           336:        register int* p = FIRST_SAVED_REG_P(fp,layout.offset);
        !           337:        register int* rp = (int*)regsp;
        !           338: 
        !           339:        register unsigned short mask = layout.mask;
        !           340:        // start with d2, end with a5
        !           341:        for (register int m = 0x4; m != 0x2000; m <<=1) {
        !           342:                if (m & mask) {
        !           343:                        *rp++ = *p++;
        !           344:                } else {
        !           345:                        rp++;
        !           346:                }
        !           347:        }
        !           348: }
        !           349: 
        !           350: /* On the 68k, without a link inst, fp (a6) doesn't move on a call */
        !           351: asm("  .text");
        !           352: asm("  .globl  _FP");
        !           353: asm("_FP:");
        !           354: asm("  lea     a6@,a0");
        !           355: asm("  movl    a0,d0");        /* for compilers that return everything in d0*/
        !           356: asm("  rts");
        !           357: 
        !           358: /* On the 68k, a call (via jsr or bsr) pushes the pc on the stack;
        !           359:    the caller's sp is the current sp + 1 */
        !           360: asm("  .text");
        !           361: asm("  .globl  _TOP");
        !           362: asm("_TOP:");
        !           363: asm("  lea     sp@(4),a0");
        !           364: asm("  movl    a0,d0");        /* for compilers that return everything in d0*/
        !           365: asm("  rts");
        !           366: 
        !           367: /* On the 68k, immediately before the rts, the sp is pointing at the
        !           368:  * return pc on the stack.  The rts pops the pc off the stack.
        !           369:  * To reset the sp correctly after fudging the stack, we'll save the
        !           370:  * pointer to "skip's" return-pc in Skip_pc_p, and fudge_return() will
        !           371:  * overwrite task::task's return pc with the address of fudge_sp,
        !           372:  * a function that will reset the sp to Skip_pc_p, and then do the rts.
        !           373:  * Ugly, but it should work.
        !           374:  */
        !           375: // NOTE:  The following definition of Skip_pc_p appears in fudge.c.68k,
        !           376: // because of an apparent bug in the Sun-3 compiler.  It seems to get
        !           377: // confused by intermingling of definitions and asms.
        !           378: //  int*       Skip_pc_p;      // global to hold fudged return pc.
        !           379:                        // Set in FUDGE_SP, used by fudge_sp a few instructions
        !           380:                        // later.  Be careful not to add intervening insts.
        !           381: //Note:  1st arg unnecessary on Sun-2/3
        !           382: void
        !           383: FUDGE_SP(int*, int* de_fp)
        !           384: {
        !           385:        Skip_pc_p = OLD_PC_P(de_fp);
        !           386: }
        !           387: 
        !           388: asm("  .text");
        !           389: asm("  .globl  _fudge_sp");
        !           390: asm("_fudge_sp:");
        !           391: asm("  movl    _Skip_pc_p,a7");
        !           392: asm("  rts");
        !           393: 
        !           394: asm("  .text");
        !           395: asm("  .globl  _set_d2");
        !           396: asm("_set_d2:");
        !           397: asm("  movl    sp@(4),a0");    /* arg is ptr to register saved in stack */
        !           398: asm("  movl    a0@,d2");
        !           399: asm("  rts");
        !           400: 
        !           401: asm("  .text");
        !           402: asm("  .globl  _set_d3");
        !           403: asm("_set_d3:");
        !           404: asm("  movl    sp@(4),a0");    /* arg is ptr to register saved in stack */
        !           405: asm("  movl    a0@,d3");
        !           406: asm("  rts");
        !           407: 
        !           408: asm("  .text");
        !           409: asm("  .globl  _set_d4");
        !           410: asm("_set_d4:");
        !           411: asm("  movl    sp@(4),a0");    /* arg is ptr to register saved in stack */
        !           412: asm("  movl    a0@,d4");
        !           413: asm("  rts");
        !           414: 
        !           415: asm("  .text");
        !           416: asm("  .globl  _set_d5");
        !           417: asm("_set_d5:");
        !           418: asm("  movl    sp@(4),a0");    /* arg is ptr to register saved in stack */
        !           419: asm("  movl    a0@,d5");
        !           420: asm("  rts");
        !           421: 
        !           422: asm("  .text");
        !           423: asm("  .globl  _set_d6");
        !           424: asm("_set_d6:");
        !           425: asm("  movl    sp@(4),a0");    /* arg is ptr to register saved in stack */
        !           426: asm("  movl    a0@,d6");
        !           427: asm("  rts");
        !           428: 
        !           429: asm("  .text");
        !           430: asm("  .globl  _set_d7");
        !           431: asm("_set_d7:");
        !           432: asm("  movl    sp@(4),a0");    /* arg is ptr to register saved in stack */
        !           433: asm("  movl    a0@,d7");
        !           434: asm("  rts");
        !           435: 
        !           436: asm("  .text");
        !           437: asm("  .globl  _set_a2");
        !           438: asm("_set_a2:");
        !           439: asm("  movl    sp@(4),a0");    /* arg is ptr to register saved in stack */
        !           440: asm("  movl    a0@,a2");
        !           441: asm("  rts");
        !           442: 
        !           443: asm("  .text");
        !           444: asm("  .globl  _set_a3");
        !           445: asm("_set_a3:");
        !           446: asm("  movl    sp@(4),a0");    /* arg is ptr to register saved in stack */
        !           447: asm("  movl    a0@,a3");
        !           448: asm("  rts");
        !           449: 
        !           450: asm("  .text");
        !           451: asm("  .globl  _set_a4");
        !           452: asm("_set_a4:");
        !           453: asm("  movl    sp@(4),a0");    /* arg is ptr to register saved in stack */
        !           454: asm("  movl    a0@,a4");
        !           455: asm("  rts");
        !           456: 
        !           457: asm("  .text");
        !           458: asm("  .globl  _set_a5");
        !           459: asm("_set_a5:");
        !           460: asm("  movl    sp@(4),a0");    /* arg is ptr to register saved in stack */
        !           461: asm("  movl    a0@,a5");
        !           462: asm("  rts");
        !           463: 
        !           464: #endif /* mc68000 */
        !           465: 
        !           466: #ifdef i386
        !           467: 
        !           468: asm("  .text");
        !           469: asm("  .globl SAVE_REGS");
        !           470: asm("SAVE_REGS:");
        !           471: asm("  pushl   %ebp");                 /* save caller's fp */
        !           472: asm("  movl    %esp,%ebp");            /* fp = sp */
        !           473: asm("  pushl   %edi");                 /* save edi */
        !           474: asm("  pushl   %esi");                 /* save esi */
        !           475: asm("  pushl   %ebx");                 /* save ebx */
        !           476: asm("  movl    8(%ebp),%eax");         /* eax = arg--ptr to HW_REGS */
        !           477: asm("  movl    -4(%ebp),%ecx");        /* ecx = caller's edi */
        !           478: asm("  movl    %ecx,0(%eax)");         /* arg.edi = ecx */
        !           479: asm("  movl    -8(%ebp),%ecx");        /* ecx = caller's esi */
        !           480: asm("  movl    %ecx,4(%eax)");         /* arg.esi = ecx */
        !           481: asm("  movl    -12(%ebp),%ecx");       /* ecx = caller's ebx */
        !           482: asm("  movl    %ecx,8(%eax)");         /* arg.ebx = ecx */
        !           483: asm("  popl    %ebx");
        !           484: asm("  popl    %esi");
        !           485: asm("  popl    %edi");
        !           486: asm("  leave");
        !           487: asm("  ret");
        !           488: 
        !           489: /* save_saved_regs copies regs saved in stack frame defined by fp
        !           490:  * to a HW_REGS structure.  Uses FrameLayout() to find which regs are saved.
        !           491:  */
        !           492: void
        !           493: save_saved_regs(HW_REGS *regsp, int* fp)
        !           494: {
        !           495:        FrameLayout layout(fp);
        !           496:        register int* p = FIRST_SAVED_REG_P(fp,layout.offset);
        !           497:        register int* rp = (int*)regsp;
        !           498: 
        !           499:        register unsigned short mask = layout.mask;
        !           500:        for (register short m = 1; m != 0x08; m <<=1) {
        !           501:                if (m & mask) {
        !           502:                        *rp++ = *p--;
        !           503:                } else {
        !           504:                        rp++;
        !           505:                }
        !           506:        }
        !           507: }
        !           508: 
        !           509: /* On the i386, without a specific inst, fp (ebp) doesn't move on a call */
        !           510: asm(".text");
        !           511: asm(".globl    FP");
        !           512: asm("FP:");
        !           513: asm("  movl    %ebp,%eax");
        !           514: asm("  ret");
        !           515: 
        !           516: /* On the i386, a call pushes the pc on the stack;
        !           517:    the caller's sp is the current sp + 1 */
        !           518: asm(".text");
        !           519: asm(".globl    TOP");
        !           520: asm("TOP:");
        !           521: asm("  leal    4(%esp),%eax");
        !           522: asm("  ret");
        !           523: 
        !           524: 
        !           525: /* On the i386, immediately before the ret, the sp is pointing at the
        !           526:  * return pc on the stack.  The ret pops the pc off the stack.
        !           527:  * To reset the sp correctly after fudging the stack, we'll save the
        !           528:  * pointer to "skip's" return-pc in Skip_pc_p, and fudge_return() will
        !           529:  * overwrite task::task's return pc with the address of fudge_sp,
        !           530:  * a function that will reset the sp to Skip_pc_p, and then do the ret.
        !           531:  * Ugly, but it should work.
        !           532:  */
        !           533: // NOTE:  The following definition of Skip_pc_p appears in fudge.c.386,
        !           534: // because of an apparent bug in the Sun-3 compiler.  It seems to get
        !           535: // confused by intermingling of definitions and asms.
        !           536: // int*        Skip_pc_p;      // global to hold fudged return pc.
        !           537:                        // Set in FUDGE_SP, used by fudge_sp a few instructions
        !           538:                        // later.  Be careful not to add intervening insts.
        !           539: //Note:  1st arg unnecessary on i386
        !           540: void
        !           541: FUDGE_SP(int*, int* de_fp)
        !           542: {
        !           543:        Skip_pc_p = OLD_PC_P(de_fp);
        !           544: }
        !           545: 
        !           546: asm("  .text");
        !           547: asm("  .globl  fudge_sp");
        !           548: asm("fudge_sp:");
        !           549: asm("  movl    Skip_pc_p,%esp");
        !           550: asm("  ret");
        !           551: 
        !           552: asm(".text");
        !           553: asm(".globl    set_edi");
        !           554: asm("set_edi:");
        !           555: asm("  movl    4(%esp),%eax");
        !           556: asm("  movl    0(%eax),%edi");
        !           557: asm("  ret");
        !           558: 
        !           559: asm(".text");
        !           560: asm(".globl    set_esi");
        !           561: asm("set_esi:");
        !           562: asm("  movl    4(%esp),%eax");
        !           563: asm("  movl    0(%eax),%esi");
        !           564: asm("  ret");
        !           565: 
        !           566: asm(".text");
        !           567: asm(".globl    set_ebx");
        !           568: asm("set_ebx:");
        !           569: asm("  movl    4(%esp),%eax");
        !           570: asm("  movl    0(%eax),%ebx");
        !           571: asm("  ret");
        !           572: 
        !           573: #endif /* i386 */

unix.superglobalmegacorp.com

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