aboutsummaryrefslogtreecommitdiff
path: root/src/libthread/OpenBSD-power.c
blob: c3c7e72bdf380c05c4688bbb3374189971ff5f3b (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
27
28
29
30
31
32
33
34
35
36
37
38
#include "threadimpl.h"

void
makecontext(ucontext_t *ucp, void (*func)(void), int argc, ...)
{
	ulong *sp, *tos;
	va_list arg;

	tos = (ulong*)ucp->uc_stack.ss_sp+ucp->uc_stack.ss_size/sizeof(ulong);
	sp = (ulong*)((ulong)(tos-16) & ~15);
	ucp->mc.pc = (long)func;
	ucp->mc.sp = (long)sp;
	va_start(arg, argc);
	ucp->mc.r3 = va_arg(arg, long);
	va_end(arg);
}

int
getcontext(ucontext_t *uc)
{
	return _getmcontext(&uc->mc);
}

int
setcontext(ucontext_t *uc)
{
	_setmcontext(&uc->mc);
	return 0;
}

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