|  | #define	setcontext(u)	_setmcontext(&(u)->mc) | 
|  | #define	getcontext(u)	_getmcontext(&(u)->mc) | 
|  | typedef struct mcontext mcontext_t; | 
|  | typedef struct ucontext ucontext_t; | 
|  | struct mcontext | 
|  | { | 
|  | ulong	pc;		/* lr */ | 
|  | ulong	cr;		/* mfcr */ | 
|  | ulong	ctr;		/* mfcr */ | 
|  | ulong	xer;		/* mfcr */ | 
|  | ulong	sp;		/* callee saved: r1 */ | 
|  | ulong	toc;		/* callee saved: r2 */ | 
|  | ulong	r3;		/* first arg to function, return register: r3 */ | 
|  | ulong	gpr[19];	/* callee saved: r13-r31 */ | 
|  | /* | 
|  | // XXX: currently do not save vector registers or floating-point state | 
|  | //	ulong	pad; | 
|  | //	uvlong	fpr[18];	/ * callee saved: f14-f31 * / | 
|  | //	ulong	vr[4*12];	/ * callee saved: v20-v31, 256-bits each * / | 
|  | */ | 
|  | }; | 
|  |  | 
|  | struct ucontext | 
|  | { | 
|  | struct { | 
|  | void *ss_sp; | 
|  | uint ss_size; | 
|  | } uc_stack; | 
|  | sigset_t uc_sigmask; | 
|  | mcontext_t mc; | 
|  | }; | 
|  |  | 
|  | void makecontext(ucontext_t*, void(*)(void), int, ...); | 
|  | int swapcontext(ucontext_t*, ucontext_t*); | 
|  | int _getmcontext(mcontext_t*); | 
|  | void _setmcontext(mcontext_t*); | 
|  |  |