POSIX Pthreads to emulate APs and implement threads\r
\r
Copyright (c) 2011, Apple Inc. All rights reserved.\r
-Copyright (c) 2011, Intel Corporation. All rights reserved.<BR>\r
+Copyright (c) 2011 - 2019, Intel Corporation. All rights reserved.<BR>\r
\r
SPDX-License-Identifier: BSD-2-Clause-Patent\r
\r
#include "Host.h"\r
#include <pthread.h>\r
\r
-\r
UINTN\r
EFIAPI\r
PthreadMutexLock (\r
- IN VOID *Mutex\r
+ IN VOID *Mutex\r
)\r
{\r
return (UINTN)pthread_mutex_lock ((pthread_mutex_t *)Mutex);\r
}\r
\r
-\r
-\r
UINTN\r
EFIAPI\r
PthreadMutexUnLock (\r
- IN VOID *Mutex\r
+ IN VOID *Mutex\r
)\r
{\r
return (UINTN)pthread_mutex_unlock ((pthread_mutex_t *)Mutex);\r
}\r
\r
-\r
UINTN\r
EFIAPI\r
PthreadMutexTryLock (\r
- IN VOID *Mutex\r
+ IN VOID *Mutex\r
)\r
{\r
return (UINTN)pthread_mutex_trylock ((pthread_mutex_t *)Mutex);\r
}\r
\r
-\r
VOID *\r
PthreadMutexInit (\r
IN VOID\r
)\r
{\r
- pthread_mutex_t *Mutex;\r
- int err;\r
+ pthread_mutex_t *Mutex;\r
+ int err;\r
\r
Mutex = malloc (sizeof (pthread_mutex_t));\r
- err = pthread_mutex_init (Mutex, NULL);\r
+ err = pthread_mutex_init (Mutex, NULL);\r
if (err == 0) {\r
return Mutex;\r
}\r
return NULL;\r
}\r
\r
-\r
UINTN\r
PthreadMutexDestroy (\r
- IN VOID *Mutex\r
+ IN VOID *Mutex\r
)\r
{\r
if (Mutex != NULL) {\r
\r
// Can't store this data on PthreadCreate stack so we need a global\r
typedef struct {\r
- pthread_mutex_t Mutex;\r
- THREAD_THUNK_THREAD_ENTRY Start;\r
+ pthread_mutex_t Mutex;\r
+ THREAD_THUNK_THREAD_ENTRY Start;\r
} THREAD_MANGLE;\r
\r
-THREAD_MANGLE mThreadMangle = {\r
+THREAD_MANGLE mThreadMangle = {\r
PTHREAD_MUTEX_INITIALIZER,\r
NULL\r
};\r
VOID *Context\r
)\r
{\r
- THREAD_THUNK_THREAD_ENTRY Start;\r
- sigset_t SigMask;\r
+ THREAD_THUNK_THREAD_ENTRY Start;\r
+ sigset_t SigMask;\r
\r
// Save global on the stack before we unlock\r
- Start = mThreadMangle.Start;\r
+ Start = mThreadMangle.Start;\r
pthread_mutex_unlock (&mThreadMangle.Mutex);\r
\r
// Mask all signals to the APs\r
// This is a great example of how all problems in computer\r
// science can be solved by adding another level of indirection\r
//\r
- return (VOID *)ReverseGasketUint64 ((CALL_BACK)Start, (UINTN)Context);\r
+ return (VOID *)ReverseGasketUint64 ((UINTN)Start, (UINTN)Context);\r
}\r
\r
UINTN\r
PthreadCreate (\r
- IN VOID *Thread,\r
- IN VOID *Attribute,\r
- IN THREAD_THUNK_THREAD_ENTRY Start,\r
- IN VOID *Context\r
+ IN VOID *Thread,\r
+ IN VOID *Attribute,\r
+ IN THREAD_THUNK_THREAD_ENTRY Start,\r
+ IN VOID *Context\r
)\r
{\r
- int err;\r
- BOOLEAN EnabledOnEntry;\r
+ int err;\r
+ BOOLEAN EnabledOnEntry;\r
\r
//\r
// Threads inherit interrupt state so disable interrupts before we start thread\r
EnabledOnEntry = FALSE;\r
}\r
\r
- // Aquire lock for global, SecFakePthreadStart runs in a different thread.\r
+ // Acquire lock for global, SecFakePthreadStart runs in a different thread.\r
pthread_mutex_lock (&mThreadMangle.Mutex);\r
- mThreadMangle.Start = Start;\r
+ mThreadMangle.Start = Start;\r
\r
err = pthread_create (Thread, Attribute, SecFakePthreadStart, Context);\r
if (err != 0) {\r
return err;\r
}\r
\r
-\r
VOID\r
PthreadExit (\r
- IN VOID *ValuePtr\r
+ IN VOID *ValuePtr\r
)\r
{\r
pthread_exit (ValuePtr);\r
return;\r
}\r
\r
-\r
UINTN\r
PthreadSelf (\r
VOID\r
return (UINTN)pthread_self ();\r
}\r
\r
-\r
-EMU_THREAD_THUNK_PROTOCOL gPthreadThunk = {\r
+EMU_THREAD_THUNK_PROTOCOL gPthreadThunk = {\r
GasketPthreadMutexLock,\r
GasketPthreadMutexUnLock,\r
GasketPthreadMutexTryLock,\r
GasketPthreadSelf\r
};\r
\r
-\r
EFI_STATUS\r
PthreadOpen (\r
- IN EMU_IO_THUNK_PROTOCOL *This\r
+ IN EMU_IO_THUNK_PROTOCOL *This\r
)\r
{\r
if (This->Instance != 0) {\r
return EFI_SUCCESS;\r
}\r
\r
-\r
EFI_STATUS\r
PthreadClose (\r
- IN EMU_IO_THUNK_PROTOCOL *This\r
+ IN EMU_IO_THUNK_PROTOCOL *This\r
)\r
{\r
return EFI_SUCCESS;\r
}\r
\r
-\r
-EMU_IO_THUNK_PROTOCOL gPthreadThunkIo = {\r
+EMU_IO_THUNK_PROTOCOL gPthreadThunkIo = {\r
&gEmuThreadThunkProtocolGuid,\r
NULL,\r
NULL,\r
GasketPthreadClose,\r
NULL\r
};\r
-\r
-\r