diff --git a/racket/src/ChezScheme/README.md b/racket/src/ChezScheme/README.md
index 5821dd3495..fac65a93c4 100644
--- a/racket/src/ChezScheme/README.md
+++ b/racket/src/ChezScheme/README.md
@@ -12,6 +12,8 @@ Supported platforms:
* OpenBSD: x86, x86_64
* NetBSD: x86, x86_64
* Solaris: x86, x86_64
+ * Android: ARMv7, AArch64
+ * iOS: AArch64
As a superset of the language described in the
[Revised6 Report on the Algorithmic Language Scheme](http://www.r6rs.org)
diff --git a/racket/src/ChezScheme/c/Mf-base b/racket/src/ChezScheme/c/Mf-base
index 2dddc636a7..65b16b93be 100644
--- a/racket/src/ChezScheme/c/Mf-base
+++ b/racket/src/ChezScheme/c/Mf-base
@@ -22,7 +22,7 @@ Main=../boot/$m/main.$o
Scheme=../bin/$m/scheme
# CFLAGS is propagated separately:
-SetConfigEnv = CC="${CC}" CPPFLAGS="${CPPFLAGS}" AR="${AR}" ARFLAGS="${ARFLAGS}"
+SetConfigEnv = CC="${CC}" CPPFLAGS="${CPPFLAGS}" AR="${AR}" ARFLAGS="${ARFLAGS}" RANLIB="${RANLIB}"
# One of these sets is referenced in Mf-config to select between
# linking with kernel.o or libkernel.a
diff --git a/racket/src/ChezScheme/c/atomic.h b/racket/src/ChezScheme/c/atomic.h
index 854de274b5..8610394748 100644
--- a/racket/src/ChezScheme/c/atomic.h
+++ b/racket/src/ChezScheme/c/atomic.h
@@ -5,7 +5,7 @@
# define ACQUIRE_FENCE() __asm__ __volatile__ ("dmb ish" : : : "memory")
# define RELEASE_FENCE() ACQUIRE_FENCE()
#elif defined(__arm__)
-# if arm_isa_version == 7
+# if (arm_isa_version >= 7) || (__ARM_ARCH >= 7)
# define STORE_FENCE() __asm__ __volatile__ ("dmb ishst" : : : "memory")
# define ACQUIRE_FENCE() __asm__ __volatile__ ("dmb ish" : : : "memory")
# define RELEASE_FENCE() ACQUIRE_FENCE()
@@ -72,15 +72,18 @@ FORCEINLINE int CAS_STORE_RELEASE(volatile void *addr, void *old_val, void *new_
return ret;
}
#elif defined(__arm__)
-FORCEINLINE int S_cas_any_fence(volatile void *addr, void *old_val, void *new_val) {
+FORCEINLINE int S_cas_any_fence(int load_acquire, volatile void *addr, void *old_val, void *new_val) {
int ret;
- __asm__ __volatile__ ("mcr p15, 0, %0, c7, c10, 5\n\t"
- "mov %0, #0\n\t"
+ if (load_acquire)
+ ACQUIRE_FENCE();
+ else
+ RELEASE_FENCE();
+ __asm__ __volatile__ ("mov %0, #0\n\t"
"0:\n\t"
- "ldrex r12, [%1, #0]\n\t"
+ "ldrex r12, [%1]\n\t"
"cmp r12, %2\n\t"
"bne 1f\n\t"
- "strex r7, %3, [%1, #0]\n\t"
+ "strex r7, %3, [%1]\n\t"
"cmp r7, #0\n\t"
"bne 1f\n\t"
"it eq\n\t"
@@ -91,7 +94,8 @@ FORCEINLINE int S_cas_any_fence(volatile void *addr, void *old_val, void *new_va
: "cc", "memory", "r12", "r7");
return ret;
}
-# define CAS_ANY_FENCE(a, old, new) S_cas_any_fence(a, old, new)
+# define CAS_LOAD_ACQUIRE(a, old, new) S_cas_any_fence(1, a, old, new)
+# define CAS_STORE_RELEASE(a, old, new) S_cas_any_fence(0, a, old, new)
#elif (__GNUC__ >= 5) || defined(__clang__)
# define CAS_ANY_FENCE(a, old, new) __sync_bool_compare_and_swap(a, old, new)
#elif defined(_MSC_VER)
diff --git a/racket/src/ChezScheme/c/prim5.c b/racket/src/ChezScheme/c/prim5.c
index 905d3859fc..f718afeb79 100644
--- a/racket/src/ChezScheme/c/prim5.c
+++ b/racket/src/ChezScheme/c/prim5.c
@@ -2088,7 +2088,12 @@ static void s_free(uptr addr) {
}
#ifdef FEATURE_ICONV
-#ifdef WIN32
+#ifdef DISABLE_ICONV
+# define iconv_t int
+#define ICONV_OPEN(to, from) -1
+#define ICONV(cd, in, inb, out, outb) -1
+#define ICONV_CLOSE(cd) -1
+#elif defined(WIN32)
typedef void *iconv_t;
typedef iconv_t (*iconv_open_ft)(const char *tocode, const char *fromcode);
typedef size_t (*iconv_ft)(iconv_t cd, char **inbuf, size_t *inbytesleft, char **outbuf, size_t *outbytesleft);
diff --git a/racket/src/ChezScheme/c/version.h b/racket/src/ChezScheme/c/version.h
index 7adcbed8b0..0d8ddcece6 100644
--- a/racket/src/ChezScheme/c/version.h
+++ b/racket/src/ChezScheme/c/version.h
@@ -134,7 +134,9 @@ typedef char *memcpy_t;
#define MAKE_NAN(x) { x = 0.0; x = x / x; }
#define GETWD(x) getcwd((x),PATH_MAX)
typedef int tputsputcchar;
-#define LOCKF
+#ifndef __ANDROID__
+# define LOCKF
+#endif
#define DIRMARKERP(c) ((c) == '/')
#ifndef DISABLE_X11
# define LIBX11 "libX11.so"
@@ -149,6 +151,10 @@ typedef int tputsputcchar;
#define NSECCTIME(sb) (sb).st_ctim.tv_nsec
#define NSECMTIME(sb) (sb).st_mtim.tv_nsec
#define ICONV_INBUF_TYPE char **
+#ifdef __ANDROID__
+# define NOFILE 256
+# define NO_USELOCALE
+#endif
#define UNUSED __attribute__((__unused__))
#endif
@@ -175,7 +181,7 @@ typedef int tputsputcchar;
#define SECMTIME(sb) (sb).st_mtimespec.tv_sec
#define NSECATIME(sb) (sb).st_atimespec.tv_nsec
#define NSECCTIME(sb) (sb).st_ctimespec.tv_nsec
-#define NSECMTIME(sb) (sb).st_mtimespec.tv_nsec
+#define NSECM