diff --git a/src/_cffi_src/build_openssl.py b/src/_cffi_src/build_openssl.py
index 49f846ce8d3a64b8be5337616e90d02fbdebd26d_c3JjL19jZmZpX3NyYy9idWlsZF9vcGVuc3NsLnB5..0a7f1c0932d73ebcdde201691928773a98037be4_c3JjL19jZmZpX3NyYy9idWlsZF9vcGVuc3NsLnB5 100644
--- a/src/_cffi_src/build_openssl.py
+++ b/src/_cffi_src/build_openssl.py
@@ -40,7 +40,10 @@
         # -lpthread required due to usage of pthread an potential
         # existance of a static part containing e.g. pthread_atfork
         # (https://github.com/pyca/cryptography/issues/5084)
-        return ["ssl", "crypto", "pthread"]
+        if sys.platform == 'zos':
+            return ["ssl", "crypto"]
+        else:
+            return ["ssl", "crypto", "pthread"]
 
 
 def _extra_compile_args(platform):
diff --git a/src/_cffi_src/openssl/callbacks.py b/src/_cffi_src/openssl/callbacks.py
index 49f846ce8d3a64b8be5337616e90d02fbdebd26d_c3JjL19jZmZpX3NyYy9vcGVuc3NsL2NhbGxiYWNrcy5weQ==..0a7f1c0932d73ebcdde201691928773a98037be4_c3JjL19jZmZpX3NyYy9vcGVuc3NsL2NhbGxiYWNrcy5weQ== 100644
--- a/src/_cffi_src/openssl/callbacks.py
+++ b/src/_cffi_src/openssl/callbacks.py
@@ -20,6 +20,10 @@
 #include <stdlib.h>
 #include <pthread.h>
 #endif
+
+#ifdef __MVS__
+#include <errno.h>
+#endif
 """
 
 TYPES = """
@@ -66,7 +70,19 @@
         perror("Fatal error in callback initialization: " #call);       \
         abort();                                                        \
     }
+#ifdef __MVS__
+/*  When pthread_mutex_init is called more than once on the same mutex,
+    on z/OS this throws an EBUSY error.
+*/
+#define ASSERT_STATUS_INIT(call)                                        \
+    if ((call) != 0 && errno != EBUSY) {                                \
+        perror("Fatal error in callback initialization: " #call);       \
+        abort();                                                        \
+    }
+#else
+#define ASSERT_STATUS_INIT ASSERT_STATUS
+#endif
 static inline void cryptography_mutex_init(Cryptography_mutex *mutex) {
 #if !defined(pthread_mutexattr_default)
 #  define pthread_mutexattr_default ((pthread_mutexattr_t *)NULL)
 #endif
@@ -69,8 +85,8 @@
 static inline void cryptography_mutex_init(Cryptography_mutex *mutex) {
 #if !defined(pthread_mutexattr_default)
 #  define pthread_mutexattr_default ((pthread_mutexattr_t *)NULL)
 #endif
-    ASSERT_STATUS(pthread_mutex_init(mutex, pthread_mutexattr_default));
+    ASSERT_STATUS_INIT(pthread_mutex_init(mutex, pthread_mutexattr_default));
 }
 static inline void cryptography_mutex_lock(Cryptography_mutex *mutex) {
     ASSERT_STATUS(pthread_mutex_lock(mutex));
diff --git a/src/_cffi_src/openssl/src/osrandom_engine.h b/src/_cffi_src/openssl/src/osrandom_engine.h
index 49f846ce8d3a64b8be5337616e90d02fbdebd26d_c3JjL19jZmZpX3NyYy9vcGVuc3NsL3NyYy9vc3JhbmRvbV9lbmdpbmUuaA==..0a7f1c0932d73ebcdde201691928773a98037be4_c3JjL19jZmZpX3NyYy9vcGVuc3NsL3NyYy9vc3JhbmRvbV9lbmdpbmUuaA== 100644
--- a/src/_cffi_src/openssl/src/osrandom_engine.h
+++ b/src/_cffi_src/openssl/src/osrandom_engine.h
@@ -6,7 +6,9 @@
   #include <fcntl.h>
   #include <unistd.h>
    /* for defined(BSD) */
-  #include <sys/param.h>
+  #ifndef __MVS__
+    #include <sys/param.h>
+  #endif
 
   #ifdef BSD
     /* for SYS_getentropy */