.text
.globl qswitch, qrestore, qinit, qirestore, qstart
#if USE_ALL
#define PUSHAL pushal
#define POPAL popal
#endif
#if USE_CALLU1
#define PUSHAL \
pushl %ebx ; \
pushl %esi ; \
pushl %edi ; \
pushl %ebp
#define POPAL \
popl %ebp ; \
popl %edi ; \
popl %esi ; \
popl %ebx
#endif
#if USE_CALLU2
#define PUSHAL \
subl $16,%esp ; \
movl %ebx,(%esp) ; \
movl %esi,4(%esp) ; \
movl %edi,8(%esp) ; \
movl %ebp,12(%esp)
#define POPAL \
movl (%esp),%ebx ; \
movl 4(%esp),%esi ; \
movl 8(%esp),%edi ; \
movl 12(%esp),%ebp ; \
addl $16,%esp
#endif
qswitch:
movl 8(%esp),%eax
movl 4(%esp),%edx
PUSHAL
pushl $qrestore
movl %esp,(%edx)
movl %eax,%esp
ret
qstart:
movl 4(%esp),%esp
ret
qrestore:
POPAL
ret
qinit:
movl 4(%esp),%eax
subl $16,%eax
movl $qirestore,0(%eax)
movl 8(%esp),%ecx
movl %ecx,4(%eax)
movl $0,8(%eax)
movl 12(%esp),%ecx
movl %ecx,12(%eax)
ret
qirestore:
ret