diff --git a/kernel/CMakeLists.txt b/kernel/CMakeLists.txt index 2bbe5878..deab4d0e 100644 --- a/kernel/CMakeLists.txt +++ b/kernel/CMakeLists.txt @@ -125,6 +125,7 @@ elseif("${BANAN_ARCH}" STREQUAL "i386") ${KERNEL_SOURCES} arch/i386/boot.S arch/i386/PageTable.cpp + arch/i386/Signal.S arch/i386/Syscall.S arch/i386/Thread.S ) diff --git a/kernel/arch/i386/Signal.S b/kernel/arch/i386/Signal.S new file mode 100644 index 00000000..41a3b834 --- /dev/null +++ b/kernel/arch/i386/Signal.S @@ -0,0 +1,29 @@ +.section .userspace, "aw" + +// stack contains +// return address +// signal number +// signal handler + +.global signal_trampoline +signal_trampoline: + pushl %ebp + movl %esp, %ebp + subl $8, %esp + + pusha + + movl 40(%esp), %edi + movl 36(%esp), %eax + + subl $12, %esp + pushl %edi + call *%eax + addl $16, %esp + + popa + + leave + addl $8, %esp + + ret