#include <9pm/u.h>
#include <9pm/libc.h>

__declspec(naked)
void
pm_longjmp(pm_jmp_buf jb, int val)
{
	_asm {
		mov ebx, [esp+4]
		mov eax, [esp+8]
		cmp eax, 0
		jne nofix
		mov eax, 1
nofix:
		mov ebp, [ebx]
		mov edi, [ebx+8]
		mov esi, [ebx+12]
		mov esp, [ebx+16]
		mov ecx, [ebx+20]
		mov [esp], ecx
		mov ebx, [ebx+4]
		ret
	}
}

__declspec(naked)
int
pm_setjmp(pm_jmp_buf jb)
{
	_asm {
		mov eax, [esp+4]
		mov [eax], ebp
		mov [eax+4], ebx
		mov [eax+8], edi
		mov [eax+12], esi
		mov [eax+16], esp
		mov ebx, [esp]		/* return pc */
		mov [eax+20], ebx
		xor eax, eax
		ret
	}
}


syntax highlighted by Code2HTML, v. 0.9.1