Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -18,3 +18,5 @@ jobs:
secrets: inherit
with:
cpptest_enabled: true
build_params: all tests
nightly: true
5 changes: 3 additions & 2 deletions hal/aarch64/cpu.c
Original file line number Diff line number Diff line change
Expand Up @@ -83,7 +83,7 @@ int hal_cpuCreateContext(cpu_context_t **nctx, startFn_t start, void *kstack, si
}


int hal_cpuPushSignal(void *kstack, void (*handler)(void), cpu_context_t *signalCtx, int n, unsigned int oldmask, const int src)
int hal_cpuPushSignal(void *kstack, void (*trampoline)(void), void (*handler)(int signo), cpu_context_t *signalCtx, int n, unsigned int oldmask, const int src)
{
cpu_context_t *ctx = (void *)((char *)kstack - sizeof(cpu_context_t));
const struct stackArg args[] = {
Expand All @@ -92,6 +92,7 @@ int hal_cpuPushSignal(void *kstack, void (*handler)(void), cpu_context_t *signal
{ &ctx->pc, sizeof(ctx->pc) },
{ &signalCtx, sizeof(signalCtx) },
{ &oldmask, sizeof(oldmask) },
{ &handler, sizeof(handler) },
{ &n, sizeof(n) },
};

Expand All @@ -100,7 +101,7 @@ int hal_cpuPushSignal(void *kstack, void (*handler)(void), cpu_context_t *signal
hal_memcpy(signalCtx, ctx, sizeof(cpu_context_t));

/* parasoft-suppress-next-line MISRAC2012-RULE_11_1 "Program counter must be set to the address of the function" */
signalCtx->pc = (u64)handler;
signalCtx->pc = (u64)trampoline;
signalCtx->sp -= sizeof(cpu_context_t);

hal_stackPutArgs((void **)&signalCtx->sp, sizeof(args) / sizeof(args[0]), args);
Expand Down
9 changes: 5 additions & 4 deletions hal/armv7a/cpu.c
Original file line number Diff line number Diff line change
Expand Up @@ -97,7 +97,7 @@ int hal_cpuCreateContext(cpu_context_t **nctx, startFn_t start, void *kstack, si
}


int hal_cpuPushSignal(void *kstack, void (*handler)(void), cpu_context_t *signalCtx, int n, unsigned int oldmask, const int src)
int hal_cpuPushSignal(void *kstack, void (*trampoline)(void), void (*handler)(int signo), cpu_context_t *signalCtx, int n, unsigned int oldmask, const int src)
{
cpu_context_t *ctx = (void *)((char *)kstack - sizeof(cpu_context_t));
const struct stackArg args[] = {
Expand All @@ -106,19 +106,20 @@ int hal_cpuPushSignal(void *kstack, void (*handler)(void), cpu_context_t *signal
{ &ctx->pc, sizeof(ctx->pc) },
{ &signalCtx, sizeof(signalCtx) },
{ &oldmask, sizeof(oldmask) },
{ &handler, sizeof(handler) },
{ &n, sizeof(n) },
};
/* parasoft-suppress-next-line MISRAC2012-RULE_11_1 "Get address of function pointer as 32-bit number." */
const u32 handler_addr = (u32)handler;
const u32 trampoline_addr = (u32)trampoline;

(void)src;

hal_memcpy(signalCtx, ctx, sizeof(cpu_context_t));

signalCtx->pc = handler_addr & ~1U;
signalCtx->pc = trampoline_addr & ~1U;
signalCtx->sp -= sizeof(cpu_context_t);

if ((handler_addr & 1U) != 0U) {
if ((trampoline_addr & 1U) != 0U) {
signalCtx->psr |= THUMB_STATE;
}
else {
Expand Down
5 changes: 3 additions & 2 deletions hal/armv7m/cpu.c
Original file line number Diff line number Diff line change
Expand Up @@ -155,7 +155,7 @@ int hal_cpuCreateContext(cpu_context_t **nctx, startFn_t start, void *kstack, si
}


int hal_cpuPushSignal(void *kstack, void (*handler)(void), cpu_context_t *signalCtx, int n, unsigned int oldmask, const int src)
int hal_cpuPushSignal(void *kstack, void (*trampoline)(void), void (*handler)(int signo), cpu_context_t *signalCtx, int n, unsigned int oldmask, const int src)
{
cpu_context_t *ctx = (void *)((char *)kstack - sizeof(cpu_context_t));
struct stackArg args[] = {
Expand All @@ -164,6 +164,7 @@ int hal_cpuPushSignal(void *kstack, void (*handler)(void), cpu_context_t *signal
{ &ctx->hwctx.pc, sizeof(ctx->hwctx.pc) },
{ &signalCtx, sizeof(signalCtx) },
{ &oldmask, sizeof(oldmask) },
{ &handler, sizeof(handler) },
{ &n, sizeof(n) },
{ 0, 0 } /* Reserve space for optional HWCTX */
};
Expand All @@ -174,7 +175,7 @@ int hal_cpuPushSignal(void *kstack, void (*handler)(void), cpu_context_t *signal
signalCtx->psp -= sizeof(cpu_context_t);

/* parasoft-suppress-next-line MISRAC2012-RULE_11_1 "Need to assign function address to processor register" */
signalCtx->hwctx.pc = (u32)handler;
signalCtx->hwctx.pc = (u32)trampoline;

/* Set default PSR, clear potential ICI/IT flags */
signalCtx->hwctx.psr = 0x01000000U;
Expand Down
7 changes: 4 additions & 3 deletions hal/armv7r/cpu.c
Original file line number Diff line number Diff line change
Expand Up @@ -96,7 +96,7 @@ int hal_cpuCreateContext(cpu_context_t **nctx, startFn_t start, void *kstack, si
}


int hal_cpuPushSignal(void *kstack, void (*handler)(void), cpu_context_t *signalCtx, int n, unsigned int oldmask, const int src)
int hal_cpuPushSignal(void *kstack, void (*trampoline)(void), void (*handler)(int signo), cpu_context_t *signalCtx, int n, unsigned int oldmask, const int src)
{
cpu_context_t *ctx = (void *)((char *)kstack - sizeof(cpu_context_t));
const struct stackArg args[] = {
Expand All @@ -105,6 +105,7 @@ int hal_cpuPushSignal(void *kstack, void (*handler)(void), cpu_context_t *signal
{ &ctx->pc, sizeof(ctx->pc) },
{ &signalCtx, sizeof(signalCtx) },
{ &oldmask, sizeof(oldmask) },
{ &handler, sizeof(handler) },
{ &n, sizeof(n) },
};

Expand All @@ -113,10 +114,10 @@ int hal_cpuPushSignal(void *kstack, void (*handler)(void), cpu_context_t *signal
hal_memcpy(signalCtx, ctx, sizeof(cpu_context_t));

/* parasoft-suppress-next-line MISRAC2012-RULE_11_1 "Program counter must be set to the address of the function" */
signalCtx->pc = (u32)handler & ~0x1U;
signalCtx->pc = (u32)trampoline & ~0x1U;
signalCtx->sp -= sizeof(cpu_context_t);
/* parasoft-suppress-next-line MISRAC2012-RULE_11_1 "Checking in what processor mode code must be executed" */
if (((u32)handler & 0x1U) != 0U) {
if (((u32)trampoline & 0x1U) != 0U) {
signalCtx->psr |= THUMB_STATE;
}
else {
Expand Down
5 changes: 3 additions & 2 deletions hal/armv8m/cpu.c
Original file line number Diff line number Diff line change
Expand Up @@ -137,7 +137,7 @@ int hal_cpuCreateContext(cpu_context_t **nctx, startFn_t start, void *kstack, si
}


int hal_cpuPushSignal(void *kstack, void (*handler)(void), cpu_context_t *signalCtx, int n, unsigned int oldmask, const int src)
int hal_cpuPushSignal(void *kstack, void (*trampoline)(void), void (*handler)(int signo), cpu_context_t *signalCtx, int n, unsigned int oldmask, const int src)
{
cpu_context_t *ctx = (void *)((char *)kstack - sizeof(cpu_context_t));
struct stackArg args[] = {
Expand All @@ -146,6 +146,7 @@ int hal_cpuPushSignal(void *kstack, void (*handler)(void), cpu_context_t *signal
{ &ctx->hwctx.pc, sizeof(ctx->hwctx.pc) },
{ &signalCtx, sizeof(signalCtx) },
{ &oldmask, sizeof(oldmask) },
{ &handler, sizeof(handler) },
{ &n, sizeof(n) },
{ 0U, 0U } /* Reserve space for optional HWCTX */
};
Expand All @@ -155,7 +156,7 @@ int hal_cpuPushSignal(void *kstack, void (*handler)(void), cpu_context_t *signal

signalCtx->psp -= sizeof(cpu_context_t);
/* parasoft-suppress-next-line MISRAC2012-RULE_11_1 "Need to assign function address to processor register" */
signalCtx->hwctx.pc = (u32)handler;
signalCtx->hwctx.pc = (u32)trampoline;

/* Set default PSR, clear potential ICI/IT flags */
signalCtx->hwctx.psr = DEFAULT_PSR;
Expand Down
9 changes: 5 additions & 4 deletions hal/armv8r/cpu.c
Original file line number Diff line number Diff line change
Expand Up @@ -96,7 +96,7 @@ int hal_cpuCreateContext(cpu_context_t **nctx, startFn_t start, void *kstack, si
}


int hal_cpuPushSignal(void *kstack, void (*handler)(void), cpu_context_t *signalCtx, int n, unsigned int oldmask, const int src)
int hal_cpuPushSignal(void *kstack, void (*trampoline)(void), void (*handler)(int signo), cpu_context_t *signalCtx, int n, unsigned int oldmask, const int src)
{
cpu_context_t *ctx = (void *)((char *)kstack - sizeof(cpu_context_t));
const struct stackArg args[] = {
Expand All @@ -105,19 +105,20 @@ int hal_cpuPushSignal(void *kstack, void (*handler)(void), cpu_context_t *signal
{ &ctx->pc, sizeof(ctx->pc) },
{ &signalCtx, sizeof(signalCtx) },
{ &oldmask, sizeof(oldmask) },
{ &handler, sizeof(handler) },
{ &n, sizeof(n) },
};
/* parasoft-suppress-next-line MISRAC2012-RULE_11_1 "Program counter must be set to the address of the function" */
u32 handler_addr = (u32)handler;
u32 trampoline_addr = (u32)trampoline;

(void)src;

hal_memcpy(signalCtx, ctx, sizeof(cpu_context_t));

signalCtx->pc = handler_addr & ~1U;
signalCtx->pc = trampoline_addr & ~1U;
signalCtx->sp -= sizeof(cpu_context_t);

if ((handler_addr & 1U) != 0U) {
if ((trampoline_addr & 1U) != 0U) {
signalCtx->psr |= THUMB_STATE;
}
else {
Expand Down
2 changes: 1 addition & 1 deletion hal/cpu.h
Original file line number Diff line number Diff line change
Expand Up @@ -108,7 +108,7 @@ int hal_cpuSupervisorMode(cpu_context_t *ctx);


/* oldmask: mask to be restored in sigreturn after handling the signal */
int hal_cpuPushSignal(void *kstack, void (*handler)(void), cpu_context_t *signalCtx, int n, unsigned int oldmask, const int src);
int hal_cpuPushSignal(void *kstack, void (*trampoline)(void), void (*handler)(int signo), cpu_context_t *signalCtx, int n, unsigned int oldmask, const int src);


void hal_cpuSigreturn(void *kstack, void *ustack, cpu_context_t **ctx);
Expand Down
5 changes: 3 additions & 2 deletions hal/ia32/cpu.c
Original file line number Diff line number Diff line change
Expand Up @@ -173,7 +173,7 @@ int hal_cpuCreateContext(cpu_context_t **nctx, startFn_t start, void *kstack, si
}


int hal_cpuPushSignal(void *kstack, void (*handler)(void), cpu_context_t *signalCtx, int n, unsigned int oldmask, const int src)
int hal_cpuPushSignal(void *kstack, void (*trampoline)(void), void (*handler)(int signo), cpu_context_t *signalCtx, int n, unsigned int oldmask, const int src)
{
cpu_context_t *ctx = (void *)((char *)kstack - sizeof(cpu_context_t));
const struct stackArg args[] = {
Expand All @@ -182,14 +182,15 @@ int hal_cpuPushSignal(void *kstack, void (*handler)(void), cpu_context_t *signal
{ &signalCtx, sizeof(signalCtx) },
{ &oldmask, sizeof(oldmask) },
{ &n, sizeof(n) },
{ &handler, sizeof(handler) },
};

(void)src;

hal_memcpy(signalCtx, ctx, sizeof(cpu_context_t));

/* parasoft-suppress-next-line MISRAC2012-RULE_11_1 "Need to assign function address to processor register" */
signalCtx->eip = (u32)handler;
signalCtx->eip = (u32)trampoline;
signalCtx->esp -= sizeof(cpu_context_t);

hal_stackPutArgs((void **)&signalCtx->esp, sizeof(args) / sizeof(args[0]), args);
Expand Down
5 changes: 3 additions & 2 deletions hal/riscv64/cpu.c
Original file line number Diff line number Diff line change
Expand Up @@ -198,14 +198,15 @@ int hal_cpuCreateContext(cpu_context_t **nctx, startFn_t start, void *kstack, si
}


int hal_cpuPushSignal(void *kstack, void (*handler)(void), cpu_context_t *signalCtx, int n, unsigned int oldmask, const int src)
int hal_cpuPushSignal(void *kstack, void (*trampoline)(void), void (*handler)(int signo), cpu_context_t *signalCtx, int n, unsigned int oldmask, const int src)
{
cpu_context_t *ctx = (void *)((char *)kstack - sizeof(cpu_context_t));
const struct stackArg args[] = {
{ &ctx->sp, sizeof(ctx->sp) },
{ &ctx->sepc, sizeof(ctx->sepc) },
{ &signalCtx, sizeof(signalCtx) },
{ &oldmask, sizeof(oldmask) },
{ &handler, sizeof(handler) },
{ &n, sizeof(n) },
};

Expand All @@ -214,7 +215,7 @@ int hal_cpuPushSignal(void *kstack, void (*handler)(void), cpu_context_t *signal
hal_memcpy(signalCtx, ctx, sizeof(cpu_context_t));

/* parasoft-suppress-next-line MISRAC2012-RULE_11_1 "Need to assign function address to processor register" */
signalCtx->sepc = (u64)handler;
signalCtx->sepc = (u64)trampoline;
signalCtx->sp -= sizeof(cpu_context_t);

hal_stackPutArgs((void **)&signalCtx->sp, sizeof(args) / sizeof(args[0]), args);
Expand Down
7 changes: 4 additions & 3 deletions hal/sparcv8leon/cpu.c
Original file line number Diff line number Diff line change
Expand Up @@ -151,7 +151,7 @@ void _hal_cpuSetKernelStack(void *kstack)
}


int hal_cpuPushSignal(void *kstack, void (*handler)(void), cpu_context_t *signalCtx, int n, unsigned int oldmask, const int src)
int hal_cpuPushSignal(void *kstack, void (*trampoline)(void), void (*handler)(int signo), cpu_context_t *signalCtx, int n, unsigned int oldmask, const int src)
{
cpu_context_t *ctx = (void *)((char *)kstack - sizeof(cpu_context_t));
const struct stackArg args[] = {
Expand All @@ -161,13 +161,14 @@ int hal_cpuPushSignal(void *kstack, void (*handler)(void), cpu_context_t *signal
{ &ctx->pc, sizeof(ctx->pc) },
{ &signalCtx, sizeof(signalCtx) },
{ &oldmask, sizeof(oldmask) },
{ &handler, sizeof(handler) },
{ &n, sizeof(n) },
};
hal_memcpy(signalCtx, ctx, sizeof(cpu_context_t));

/* parasoft-begin-suppress MISRAC2012-RULE_11_1 "Need to assign function address to processor register" */
signalCtx->pc = (u32)handler;
signalCtx->npc = (u32)handler + 4U;
signalCtx->pc = (u32)trampoline;
signalCtx->npc = (u32)trampoline + 4U;
/* parasoft-end-suppress MISRAC2012-RULE_11_1 */
signalCtx->sp -= sizeof(cpu_context_t);

Expand Down
102 changes: 101 additions & 1 deletion include/signal.h
Original file line number Diff line number Diff line change
Expand Up @@ -17,8 +17,108 @@
#ifndef _PH_SIGNAL_H_
#define _PH_SIGNAL_H_

enum { signal_kill = 1, signal_segv, signal_illegal, signal_cancel = 32 };
#include "types.h"


#ifdef __cplusplus
extern "C" {
#endif


typedef void (*sighandler_t)(int signo);


#define SIGNULL 0
#define SIGHUP 1
#define SIGINT 2
#define SIGQUIT 3
#define SIGILL 4
#define SIGTRAP 5
#define SIGABRT 6
#define SIGIOT SIGABRT
#define SIGEMT 7
#define SIGFPE 8
#define SIGKILL 9
#define SIGBUS 10
#define SIGSEGV 11
#define SIGSYS 12
#define SIGPIPE 13
#define SIGALRM 14
#define SIGTERM 15
#define SIGURG 16
#define SIGSTOP 17
#define SIGTSTP 18
#define SIGCONT 19
#define SIGCHLD 20
#define SIGTTIN 21
#define SIGTTOU 22
#define SIGIO 23
#define SIGXCPU 24
#define SIGXFSZ 25
#define SIGVTALRM 26
#define SIGPROF 27
#define SIGWINCH 28
#define SIGINFO 29
#define SIGUSR1 30
#define SIGUSR2 31
#define PH_SIGCANCEL 32
Comment thread
etiaro marked this conversation as resolved.

#define NSIG 32

/* clang-format off */
#define SIG_DFL ((sighandler_t)0)
#define SIG_IGN ((sighandler_t)-1)
#define SIG_ERR ((sighandler_t)-2)
/* clang-format on */


enum { SIG_BLOCK,
SIG_SETMASK,
SIG_UNBLOCK };


#define SA_NOCLDSTOP (1U << 0)
#define SA_NOCLDWAIT (1U << 1)
#define SA_NODEFER (1U << 2)
#define SA_ONSTACK (1U << 3)
#define SA_RESETHAND (1U << 4)
#define SA_RESTART (1U << 5)
#define SA_RESTORER (1U << 6)
#define SA_SIGINFO (1U << 7)


typedef unsigned int sigset_t;
typedef int sig_atomic_t;


union sigval {
int sival_int;
void *sival_ptr;
};
Comment thread
etiaro marked this conversation as resolved.


typedef struct {
int si_signo;
int si_code;
pid_t si_pid;
uid_t si_uid;
void *si_addr;
int si_status;
union sigval si_value;
} siginfo_t;


struct sigaction {
union {
sighandler_t sa_handler;
void (*sa_sigaction)(int signo, siginfo_t *info, void *context);
};
sigset_t sa_mask;
int sa_flags;
};

#ifdef __cplusplus
}
#endif

#endif
3 changes: 1 addition & 2 deletions include/syscalls.h
Original file line number Diff line number Diff line change
Expand Up @@ -66,8 +66,7 @@
ID(sys_perf_stop) \
ID(syspageprog) \
ID(va2pa) \
ID(signalHandle) \
ID(signalPost) \
ID(signalAction) \
ID(signalMask) \
ID(signalSuspend) \
ID(priority) \
Expand Down
3 changes: 3 additions & 0 deletions main.c
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,9 @@ static void main_initthr(void *unused)
_hal_start();
_usrv_start();

/* Disable "killing" init thread */
proc_current()->sigmask = ~0U;

lib_printf("main: Starting syspage programs:");
syspage_progShow();

Expand Down
Loading
Loading