Support Trusty, an embedded platform.

Trusty doesn't have setjmp.h and nor does it have threads.

Change-Id: I005f7a009a13e6632513be9fab2bbe62294519a4
Reviewed-on: https://boringssl-review.googlesource.com/4660
Reviewed-by: Adam Langley <agl@google.com>
diff --git a/crypto/CMakeLists.txt b/crypto/CMakeLists.txt
index 06cbd44..5927a05 100644
--- a/crypto/CMakeLists.txt
+++ b/crypto/CMakeLists.txt
@@ -144,6 +144,7 @@
   crypto.c
   mem.c
   thread.c
+  thread_none.c
   thread_pthread.c
   thread_win.c
   ex_data.c
diff --git a/crypto/cpu-arm.c b/crypto/cpu-arm.c
index e7538cb..74e937b 100644
--- a/crypto/cpu-arm.c
+++ b/crypto/cpu-arm.c
@@ -17,9 +17,12 @@
 #if defined(OPENSSL_ARM) || defined(OPENSSL_AARCH64)
 
 #include <inttypes.h>
+#include <string.h>
+
+#if !defined(OPENSSL_TRUSTY)
 #include <setjmp.h>
 #include <signal.h>
-#include <string.h>
+#endif
 
 #include "arm_arch.h"
 
@@ -59,7 +62,7 @@
   }
 }
 
-#if !defined(OPENSSL_NO_ASM) && defined(OPENSSL_ARM)
+#if !defined(OPENSSL_NO_ASM) && defined(OPENSSL_ARM) && !defined(OPENSSL_TRUSTY)
 
 static sigjmp_buf sigill_jmp;
 
@@ -113,11 +116,11 @@
 
 #else
 
-static int probe_for_NEON() {
+static int probe_for_NEON(void) {
   return 0;
 }
 
-#endif  /* !OPENSSL_NO_ASM && OPENSSL_ARM */
+#endif  /* !OPENSSL_NO_ASM && OPENSSL_ARM && !OPENSSL_TRUSTY */
 
 void OPENSSL_cpuid_setup(void) {
   if (getauxval == NULL) {
diff --git a/crypto/internal.h b/crypto/internal.h
index a4cd3d8..42125db 100644
--- a/crypto/internal.h
+++ b/crypto/internal.h
@@ -112,12 +112,13 @@
 #include <openssl/ex_data.h>
 #include <openssl/thread.h>
 
-#if !defined(OPENSSL_WINDOWS)
-#include <pthread.h>
-#else
+#if defined(OPENSSL_NO_THREADS)
+#elif defined(OPENSSL_WINDOWS)
 #pragma warning(push, 3)
 #include <windows.h>
 #pragma warning(pop)
+#else
+#include <pthread.h>
 #endif
 
 #if defined(__cplusplus)
@@ -332,12 +333,15 @@
 
 /* Thread-safe initialisation. */
 
-#if !defined(OPENSSL_WINDOWS)
-typedef pthread_once_t CRYPTO_once_t;
-#define CRYPTO_ONCE_INIT PTHREAD_ONCE_INIT
-#else
+#if defined(OPENSSL_NO_THREADS)
+typedef uint32_t CRYPTO_once_t;
+#define CRYPTO_ONCE_INIT 0
+#elif defined(OPENSSL_WINDOWS)
 typedef LONG CRYPTO_once_t;
 #define CRYPTO_ONCE_INIT 0
+#else
+typedef pthread_once_t CRYPTO_once_t;
+#define CRYPTO_ONCE_INIT PTHREAD_ONCE_INIT
 #endif
 
 /* CRYPTO_once calls |init| exactly once per process. This is thread-safe: if
@@ -365,17 +369,20 @@
  * |CRYPTO_once_t| to ensure that the lock is setup before use. This is done
  * automatically by |CRYPTO_STATIC_MUTEX_lock_*|. */
 
-#if !defined(OPENSSL_WINDOWS)
-struct CRYPTO_STATIC_MUTEX {
-  pthread_rwlock_t lock;
-};
-#define CRYPTO_STATIC_MUTEX_INIT { PTHREAD_RWLOCK_INITIALIZER }
-#else
+#if defined(OPENSSL_NO_THREADS)
+struct CRYPTO_STATIC_MUTEX {};
+#define CRYPTO_STATIC_MUTEX_INIT {}
+#elif defined(OPENSSL_WINDOWS)
 struct CRYPTO_STATIC_MUTEX {
   CRYPTO_once_t once;
   CRITICAL_SECTION lock;
 };
 #define CRYPTO_STATIC_MUTEX_INIT { CRYPTO_ONCE_INIT, { 0 } }
+#else
+struct CRYPTO_STATIC_MUTEX {
+  pthread_rwlock_t lock;
+};
+#define CRYPTO_STATIC_MUTEX_INIT { PTHREAD_RWLOCK_INITIALIZER }
 #endif
 
 /* CRYPTO_MUTEX_init initialises |lock|. If |lock| is a static variable, use a
diff --git a/crypto/thread_none.c b/crypto/thread_none.c
new file mode 100644
index 0000000..cf4e85a
--- /dev/null
+++ b/crypto/thread_none.c
@@ -0,0 +1,55 @@
+/* Copyright (c) 2015, Google Inc.
+ *
+ * Permission to use, copy, modify, and/or distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
+ * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
+ * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
+ * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */
+
+#include "internal.h"
+
+#if defined(OPENSSL_NO_THREADS)
+
+void CRYPTO_MUTEX_init(CRYPTO_MUTEX *lock) {}
+
+void CRYPTO_MUTEX_lock_read(CRYPTO_MUTEX *lock) {}
+
+void CRYPTO_MUTEX_lock_write(CRYPTO_MUTEX *lock) {}
+
+void CRYPTO_MUTEX_unlock(CRYPTO_MUTEX *lock) {}
+
+void CRYPTO_MUTEX_cleanup(CRYPTO_MUTEX *lock) {}
+
+void CRYPTO_STATIC_MUTEX_lock_read(struct CRYPTO_STATIC_MUTEX *lock) {}
+
+void CRYPTO_STATIC_MUTEX_lock_write(struct CRYPTO_STATIC_MUTEX *lock) {}
+
+void CRYPTO_STATIC_MUTEX_unlock(struct CRYPTO_STATIC_MUTEX *lock) {}
+
+void CRYPTO_once(CRYPTO_once_t *once, void (*init)(void)) {
+  if (*once) {
+    return;
+  }
+  *once = 1;
+  init();
+}
+
+static void *g_thread_locals[NUM_OPENSSL_THREAD_LOCALS];
+
+void *CRYPTO_get_thread_local(thread_local_data_t index) {
+  return g_thread_locals[index];
+}
+
+int CRYPTO_set_thread_local(thread_local_data_t index, void *value,
+                            thread_local_destructor_t destructor) {
+  g_thread_locals[index] = value;
+  return 1;
+}
+
+#endif  /* OPENSSL_NO_THREADS */
diff --git a/crypto/thread_pthread.c b/crypto/thread_pthread.c
index 4188c4c..59c4b8d 100644
--- a/crypto/thread_pthread.c
+++ b/crypto/thread_pthread.c
@@ -14,7 +14,7 @@
 
 #include "internal.h"
 
-#if !defined(OPENSSL_WINDOWS)
+#if !defined(OPENSSL_WINDOWS) && !defined(OPENSSL_NO_THREADS)
 
 #include <pthread.h>
 #include <stdlib.h>
@@ -159,4 +159,4 @@
   return 1;
 }
 
-#endif  /* !OPENSSL_WINDOWS */
+#endif  /* !OPENSSL_WINDOWS && !OPENSSL_NO_THREADS */
diff --git a/crypto/thread_test.c b/crypto/thread_test.c
index 04d71c5..cecda88 100644
--- a/crypto/thread_test.c
+++ b/crypto/thread_test.c
@@ -17,6 +17,8 @@
 #include <stdio.h>
 
 
+#if !defined(OPENSSL_NO_THREADS)
+
 #if defined(OPENSSL_WINDOWS)
 
 #pragma warning(push, 3)
@@ -189,3 +191,12 @@
   printf("PASS\n");
   return 0;
 }
+
+#else  /* OPENSSL_NO_THREADS */
+
+int main(int argc, char **argv) {
+  printf("PASS\n");
+  return 0;
+}
+
+#endif
diff --git a/crypto/thread_win.c b/crypto/thread_win.c
index fc8e50a..5efd8be 100644
--- a/crypto/thread_win.c
+++ b/crypto/thread_win.c
@@ -14,7 +14,7 @@
 
 #include "internal.h"
 
-#if defined(OPENSSL_WINDOWS)
+#if defined(OPENSSL_WINDOWS) && !defined(OPENSSL_NO_THREADS)
 
 #pragma warning(push, 3)
 #include <windows.h>
@@ -279,4 +279,4 @@
   return 1;
 }
 
-#endif  /* OPENSSL_WINDOWS */
+#endif  /* OPENSSL_WINDOWS && !OPENSSL_NO_THREADS */
diff --git a/include/openssl/asn1.h b/include/openssl/asn1.h
index 7c62161..4baf81c 100644
--- a/include/openssl/asn1.h
+++ b/include/openssl/asn1.h
@@ -61,6 +61,8 @@
 
 #include <openssl/base.h>
 
+#include <time.h>
+
 #include <openssl/bio.h>
 #include <openssl/stack.h>
 
diff --git a/include/openssl/base.h b/include/openssl/base.h
index b9c60fb..b769ad5 100644
--- a/include/openssl/base.h
+++ b/include/openssl/base.h
@@ -103,6 +103,11 @@
 #define OPENSSL_WINDOWS
 #endif
 
+#if defined(TRUSTY)
+#define OPENSSL_TRUSTY
+#define OPENSSL_NO_THREADS
+#endif
+
 #define OPENSSL_IS_BORINGSSL
 #define OPENSSL_VERSION_NUMBER 0x10002000
 
diff --git a/include/openssl/thread.h b/include/openssl/thread.h
index 31ce3b3..f6e7529 100644
--- a/include/openssl/thread.h
+++ b/include/openssl/thread.h
@@ -66,7 +66,9 @@
 #endif
 
 
-#if defined(OPENSSL_WINDOWS)
+#if defined(OPENSSL_NO_THREADS)
+typedef struct crypto_mutex_st {} CRYPTO_MUTEX;
+#elif defined(OPENSSL_WINDOWS)
 /* CRYPTO_MUTEX can appear in public header files so we really don't want to
  * pull in windows.h. It's statically asserted that this structure is large
  * enough to contain a Windows CRITICAL_SECTION by thread_win.c. */