xref: /plan9/sys/src/libc/power/notejmp.c (revision 7dd7cddf99dd7472612f1413b4da293630e6b1bc)
1*7dd7cddfSDavid du Colombier #include <u.h>
2*7dd7cddfSDavid du Colombier #include <libc.h>
3*7dd7cddfSDavid du Colombier #include <ureg.h>
4*7dd7cddfSDavid du Colombier 
5*7dd7cddfSDavid du Colombier int	__noterestore(void);
6*7dd7cddfSDavid du Colombier 
7*7dd7cddfSDavid du Colombier void
notejmp(void * vr,jmp_buf j,int ret)8*7dd7cddfSDavid du Colombier notejmp(void *vr, jmp_buf j, int ret)
9*7dd7cddfSDavid du Colombier {
10*7dd7cddfSDavid du Colombier 	struct Ureg *r = vr;
11*7dd7cddfSDavid du Colombier 
12*7dd7cddfSDavid du Colombier 	/*
13*7dd7cddfSDavid du Colombier 	 * song and dance to get around the kernel smashing r3 in noted
14*7dd7cddfSDavid du Colombier 	 */
15*7dd7cddfSDavid du Colombier 	r->r4 = ret;
16*7dd7cddfSDavid du Colombier 	if(ret == 0)
17*7dd7cddfSDavid du Colombier 		r->r4 = 1;
18*7dd7cddfSDavid du Colombier 	r->r5 = j[JMPBUFPC] - JMPBUFDPC;
19*7dd7cddfSDavid du Colombier 	r->pc = (ulong)__noterestore;
20*7dd7cddfSDavid du Colombier 	r->sp = j[JMPBUFSP];
21*7dd7cddfSDavid du Colombier 	noted(NCONT);
22*7dd7cddfSDavid du Colombier }
23