the restorer function pointer provided in the kernel sigaction
structure is interpreted by the kernel as a raw code address, not a
function descriptor.
this commit moves the declarations of the __restore and __restore_rt
symbols to ksigaction.h so that arch versions of the file can override
them, and introduces a version for sh which declares them as objects
rather than functions.
an alternate solution would have been defining SA_RESTORER to 0 so
that the functions are not used, but this both requires executable
stack (since the sh kernel does not have a vdso page with permanent
restorer functions) and crashes on qemu user-level emulation.
* mips-specific preprocessor conditionals in sigaction.c. */
void (*restorer)();
};
+
+void __restore(), __restore_rt();
--- /dev/null
+struct k_sigaction {
+ void (*handler)(int);
+ unsigned long flags;
+ void *restorer;
+ unsigned mask[2];
+};
+
+extern unsigned char __restore[], __restore_rt[];
void (*restorer)(void);
unsigned mask[2];
};
+
+void __restore(), __restore_rt();
.global __restore
-.type __restore, @function
__restore:
mov #119, r3 !__NR_sigreturn
trapa #31
or r0, r0
.global __restore_rt
-.type __restore_rt, @function
__restore_rt:
mov #100, r3 !__NR_rt_sigreturn
add #73, r3
#include "libc.h"
#include "ksigaction.h"
-void __restore(), __restore_rt();
-
static int unmask_done;
static unsigned long handler_set[_NSIG/(8*sizeof(long))];