aboutsummaryrefslogtreecommitdiff
path: root/src/libthread/Linux-arm-swapcontext.c
blob: 433588002ab9afaf25259ddf581fc87551ef39a4 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include "threadimpl.h"

void
makecontext(ucontext_t *uc, void (*fn)(void), int argc, ...)
{
        int i, *sp;
        va_list arg;
        
        sp = (int*)uc->uc_stack.ss_sp+uc->uc_stack.ss_size/4;
        va_start(arg, argc);
        for(i=0; i<4 && i<argc; i++)
                uc->uc_mcontext.gregs[i] = va_arg(arg, uint);
        va_end(arg);
        uc->uc_mcontext.gregs[13] = (uint)sp;
        uc->uc_mcontext.gregs[14] = (uint)fn;
}

int
swapcontext(ucontext_t *oucp, const ucontext_t *ucp)
{
        if(getcontext(oucp) == 0)
                setcontext(ucp);
        return 0;
}