Prechádzať zdrojové kódy

[Pal/Linux-SGX] OCALL cleanup: split ocall_wake_thread()

Previously, ocall_wake_thread() was used for two unrelated flows: to resume
an existing thread (via interrupting signal) and to clone a thread. This commit
splits ocall_wake_thread() into ocall_resume_thread() and ocall_clone_thread().
Dmitrii Kuvaiskii 4 rokov pred
rodič
commit
6349952a4b

+ 2 - 2
Pal/src/host/Linux-SGX/db_threading.c

@@ -116,7 +116,7 @@ int _DkThreadCreate (PAL_HANDLE * handle, int (*callback) (void *),
     LISTP_ADD_TAIL(&new_thread->thread, &thread_list, list);
     _DkInternalUnlock(&thread_list_lock);
 
-    int ret = ocall_wake_thread(NULL);
+    int ret = ocall_clone_thread();
     if (IS_ERR(ret))
         return unix_to_pal_error(ERRNO(ret));
 
@@ -154,7 +154,7 @@ noreturn void _DkThreadExit (void)
 
 int _DkThreadResume (PAL_HANDLE threadHandle)
 {
-    int ret = ocall_wake_thread(threadHandle->thread.tcs);
+    int ret = ocall_resume_thread(threadHandle->thread.tcs);
     return IS_ERR(ret) ? unix_to_pal_error(ERRNO(ret)) : ret;
 }
 

+ 8 - 2
Pal/src/host/Linux-SGX/enclave_ocalls.c

@@ -461,9 +461,15 @@ int ocall_getdents (int fd, struct linux_dirent64 * dirp, unsigned int size)
     return retval;
 }
 
-int ocall_wake_thread (void * tcs)
+int ocall_resume_thread (void * tcs)
 {
-    return sgx_ocall(OCALL_WAKE_THREAD, tcs);
+    return sgx_ocall(OCALL_RESUME_THREAD, tcs);
+}
+
+int ocall_clone_thread (void)
+{
+    void* dummy = NULL;
+    return sgx_ocall(OCALL_CLONE_THREAD, dummy);
 }
 
 int ocall_create_process(const char* uri, int nargs, const char** args, int procfds[3],

+ 3 - 1
Pal/src/host/Linux-SGX/enclave_ocalls.h

@@ -76,7 +76,9 @@ int ocall_sock_setopt (int sockfd, int level, int optname,
 
 int ocall_sock_shutdown (int sockfd, int how);
 
-int ocall_wake_thread (void * tcs);
+int ocall_resume_thread (void * tcs);
+
+int ocall_clone_thread (void);
 
 int ocall_create_process(const char* uri, int nargs, const char** args, int procfds[3],
                          unsigned int* pid);

+ 2 - 1
Pal/src/host/Linux-SGX/ocall_types.h

@@ -37,7 +37,8 @@ enum {
     OCALL_LSEEK,
     OCALL_MKDIR,
     OCALL_GETDENTS,
-    OCALL_WAKE_THREAD,
+    OCALL_RESUME_THREAD,
+    OCALL_CLONE_THREAD,
     OCALL_CREATE_PROCESS,
     OCALL_FUTEX,
     OCALL_SOCKETPAIR,

+ 12 - 4
Pal/src/host/Linux-SGX/sgx_enclave.c

@@ -215,10 +215,17 @@ static int sgx_ocall_getdents(void * pms)
     return ret;
 }
 
-static int sgx_ocall_wake_thread(void * pms)
+static int sgx_ocall_resume_thread(void * pms)
 {
-    ODEBUG(OCALL_WAKE_THREAD, pms);
-    return pms ? interrupt_thread(pms) : clone_thread();
+    ODEBUG(OCALL_RESUME_THREAD, pms);
+    return interrupt_thread(pms);
+}
+
+static int sgx_ocall_clone_thread(void * pms)
+{
+    __UNUSED(pms);
+    ODEBUG(OCALL_CLONE_THREAD, pms);
+    return clone_thread();
 }
 
 static int sgx_ocall_create_process(void * pms)
@@ -692,7 +699,8 @@ sgx_ocall_fn_t ocall_table[OCALL_NR] = {
         [OCALL_LSEEK]           = sgx_ocall_lseek,
         [OCALL_MKDIR]           = sgx_ocall_mkdir,
         [OCALL_GETDENTS]        = sgx_ocall_getdents,
-        [OCALL_WAKE_THREAD]     = sgx_ocall_wake_thread,
+        [OCALL_RESUME_THREAD]   = sgx_ocall_resume_thread,
+        [OCALL_CLONE_THREAD]    = sgx_ocall_clone_thread,
         [OCALL_CREATE_PROCESS]  = sgx_ocall_create_process,
         [OCALL_FUTEX]           = sgx_ocall_futex,
         [OCALL_SOCKETPAIR]      = sgx_ocall_socketpair,