diff --git a/include/sigframe.h b/include/sigframe.h index afc2c9d7e..845c47d64 100644 --- a/include/sigframe.h +++ b/include/sigframe.h @@ -5,6 +5,9 @@ #ifndef __CR_SIGFRAME_H__ #define __CR_SIGFRAME_H__ +#include "asm/types.h" +#include "protobuf/core.pb-c.h" + struct rt_sigframe; #ifndef __ARCH_SI_PREAMBLE_SIZE @@ -43,4 +46,18 @@ extern int construct_sigframe(struct rt_sigframe *sigframe, struct rt_sigframe *rsigframe, CoreEntry *core); +/* + * FIXME Convert it to inline helper, which requires + * to unweave types mess we've generated for + * run-time data. + */ +#define setup_sas(sigframe, sas) \ +do { \ + if ((sas)) { \ + RT_SIGFRAME_UC((sigframe)).uc_stack.ss_sp = (void *)decode_pointer((sas)->ss_sp); \ + RT_SIGFRAME_UC((sigframe)).uc_stack.ss_flags = (int)(sas)->ss_flags; \ + RT_SIGFRAME_UC((sigframe)).uc_stack.ss_size = (size_t)(sas)->ss_size; \ + } \ +} while (0) + #endif /* __CR_SIGFRAME_H__ */ diff --git a/sigframe.c b/sigframe.c index 68c9776ab..0c7e60093 100644 --- a/sigframe.c +++ b/sigframe.c @@ -31,5 +31,7 @@ int construct_sigframe(struct rt_sigframe *sigframe, if (restore_gpregs(sigframe, CORE_THREAD_ARCH_INFO(core)->gpregs)) return -1; + setup_sas(sigframe, core->thread_core->sas); + return 0; }