1 2 /* 3 * sw.S 4 * 5 * $DragonFly: src/test/sysperf/sw.S,v 1.1 2003/08/12 02:29:44 dillon Exp $ 6 */ 7 .text 8 .globl qswitch, qrestore, qinit, qirestore, qstart 9 10#if USE_ALL 11 12#define PUSHAL pushal 13#define POPAL popal 14 15#endif 16 17#if USE_CALLU1 18 19#define PUSHAL \ 20 pushl %ebx ; \ 21 pushl %esi ; \ 22 pushl %edi ; \ 23 pushl %ebp 24 25#define POPAL \ 26 popl %ebp ; \ 27 popl %edi ; \ 28 popl %esi ; \ 29 popl %ebx 30 31#endif 32 33#if USE_CALLU2 34 35#define PUSHAL \ 36 subl $16,%esp ; \ 37 movl %ebx,(%esp) ; \ 38 movl %esi,4(%esp) ; \ 39 movl %edi,8(%esp) ; \ 40 movl %ebp,12(%esp) 41 42#define POPAL \ 43 movl (%esp),%ebx ; \ 44 movl 4(%esp),%esi ; \ 45 movl 8(%esp),%edi ; \ 46 movl 12(%esp),%ebp ; \ 47 addl $16,%esp 48 49#endif 50 51 /* qswitch(&olddesc, newdesc) */ 52qswitch: 53 movl 8(%esp),%eax /* new state */ 54 movl 4(%esp),%edx /* save old state */ 55 PUSHAL 56 pushl $qrestore 57 movl %esp,(%edx) 58 movl %eax,%esp 59 ret 60 61 /* qstart(newdesc) */ 62qstart: 63 movl 4(%esp),%esp 64 ret 65 66qrestore: 67 POPAL 68 ret 69 70 /* newdesc = qinit(topofstk, func, arg) */ 71qinit: 72 movl 4(%esp),%eax 73 subl $16,%eax 74 movl $qirestore,0(%eax) 75 movl 8(%esp),%ecx 76 movl %ecx,4(%eax) 77 movl $0,8(%eax) 78 movl 12(%esp),%ecx 79 movl %ecx,12(%eax) 80 ret /* return eax */ 81 82qirestore: 83 ret 84