Fix SGX simulation mode broken by the interrupt subsystem

The new interrupt subsystem breaks the simulation mode in two ways:

1. The signal 64 is not handled by Intel SGX SDK in simulation mode. A
handled real-time signal crashes the process.

2. The newly-enabled test case exit_group depends on interrupts. But
enclave interrupts, like enclave exceptions, are not supported in
simulation mode.

This commit ensures signal 64 is ignored by default and exit_group test
case is not enabled in simulation mode.
This commit is contained in:
Tate, Hongliang Tian 2020-07-11 14:15:39 +00:00
parent 3382a68807
commit a3ad465ce3
4 changed files with 45 additions and 0 deletions

@ -4,6 +4,7 @@
#include "pal_error.h" #include "pal_error.h"
#include "pal_interrupt_thread.h" #include "pal_interrupt_thread.h"
#include "pal_log.h" #include "pal_log.h"
#include "pal_sig_handler.h"
#include "pal_syscall.h" #include "pal_syscall.h"
#include "pal_thread_counter.h" #include "pal_thread_counter.h"
#include "errno2str.h" #include "errno2str.h"
@ -29,6 +30,10 @@ int occlum_pal_init(const struct occlum_pal_attr *attr) {
return -1; return -1;
} }
if (pal_register_sig_handlers() < 0) {
return -1;
}
if (pal_init_enclave(attr->instance_dir) < 0) { if (pal_init_enclave(attr->instance_dir) < 0) {
return -1; return -1;
} }

@ -0,0 +1,19 @@
#include "pal_sig_handler.h"
#include "pal_log.h"
#include <signal.h>
#include <string.h>
// Signal 64 is used to notify interrupts
#define SIGRT_INTERRUPT 64
int pal_register_sig_handlers(void) {
struct sigaction action;
action.sa_handler = SIG_IGN;
memset(&action.sa_mask, 0, sizeof(action.sa_mask));
action.sa_flags = 0;
if (sigaction(SIGRT_INTERRUPT, &action, NULL) < 0) {
PAL_ERROR("Failed to regiter signal handlers");
return -1;
}
return 0;
}

@ -0,0 +1,15 @@
#ifndef __PAL_SIG_HANDLER_H__
#define __PAL_SIG_HANDLER_H__
// Register signal handlers for PAL.
//
// Currently, there is only one signal number that needs to be covered: signal
// 64, which is used to notify interrupts (see LibOS code for more info). For
// a hardware-mode enclave, the signal is handled by the signal handlers
// registered by Intel SGX SDK. So we are ok in this case. But for a
// simulation-mode enclave, there is no signal handler registered by Intel SGX
// SDK. Without a signal handler, the delivery of the signal will kill the
// process. This crash can be prevented by this API.
int pal_register_sig_handlers(void);
#endif /* __PAL_SIG_HANDLER_H__ */

@ -38,6 +38,11 @@ static void *futex_wait_thread_func(void *_) {
// exit_group syscall should terminate all threads in a thread group. // exit_group syscall should terminate all threads in a thread group.
int test_exit_group_to_force_threads_terminate(void) { int test_exit_group_to_force_threads_terminate(void) {
#ifdef SGX_MODE_SIM
printf("WARNING: Skip this test case as we do not support "
"enclave interruption in SGX simulation mode\n");
return 0;
#else
// Create three types of threads that will not exit voluntarily // Create three types of threads that will not exit voluntarily
pthread_t busyloop_thread; pthread_t busyloop_thread;
if (pthread_create(&busyloop_thread, NULL, busyloop_thread_func, NULL) < 0) { if (pthread_create(&busyloop_thread, NULL, busyloop_thread_func, NULL) < 0) {
@ -63,6 +68,7 @@ int test_exit_group_to_force_threads_terminate(void) {
// main function returns. If Occlum can terminate normally, this means // main function returns. If Occlum can terminate normally, this means
// exit_group syscall taking effect. // exit_group syscall taking effect.
return 0; return 0;
#endif
} }
// ============================================================================ // ============================================================================