.section .userspace, "aw"

// stack contains
//    return address
//    signal number
//    signal handler

.global signal_trampoline
signal_trampoline:
	pushl %ebp
	movl %esp, %ebp

	pusha

	movl 40(%esp), %edi
	movl 36(%esp), %eax

	// align stack to 16 bytes
	movl %esp, %ebx
	andl $0x0F, %ebx
	subl %ebx, %esp

	subl $12, %esp
	pushl %edi
	call *%eax
	addl $16, %esp

	// restore stack
	addl %ebx, %esp
	popa

	leave
	addl $8, %esp

	ret