diff --git a/gnu/packages/chez.scm b/gnu/packages/chez.scm
index 26f653ea9d..5d152b3db5 100644
--- a/gnu/packages/chez.scm
+++ b/gnu/packages/chez.scm
@@ -37,6 +37,7 @@ (define-module (gnu packages chez)
   #:use-module (gnu packages compression)
   #:use-module (gnu packages ncurses)
   #:use-module (gnu packages ghostscript)
+  #:use-module (gnu packages libffi)
   #:use-module (gnu packages linux)
   #:use-module (gnu packages netpbm)
   #:use-module (gnu packages racket)
@@ -49,6 +50,7 @@ (define-module (gnu packages chez)
   #:use-module (srfi srfi-26)
   #:export (chez-scheme-for-system
             racket-cs-native-supported-system?
+            nix-system->pbarch-machine-type
             unpack-nanopass+stex))
 
 ;; Commentary:
@@ -231,6 +233,28 @@ (define* (chez-upstream-features-for-system #:optional
     (and=> (assoc-ref %chez-features-table chez-os)
            (cut assoc-ref <> chez-arch))))
 
+(define* (nix-system->pbarch-machine-type #:optional
+                                          (system
+                                           (or (%current-target-system)
+                                               (%current-system)))
+                                          #:key (threads? #t))
+  "Return a string naming the pseudo–machine type used by Racket's variant of
+Chez Scheme to represent the appropriate ``pbarch'' backend for SYSTEM: that
+is, the ``portable bytecode'' backend specialized for SYSTEM's word size and
+endianness.  The result will name the threaded machine type unless THREADS? is
+provided and is #f."
+  (string-append (if threads?
+                     "t"
+                     "")
+                 "pb"
+                 (if (target-64bit? system)
+                     "64"
+                     "32")
+                 ;; missing (guix utils) predicate target-little-endian?
+                 (if (target-ppc32? system)
+                     "b"
+                     "l")))
+
 (define* (racket-cs-native-supported-system? #:optional
                                              (system
                                               (or (%current-target-system)
@@ -449,10 +473,14 @@ (define-public chez-scheme-for-racket
     ;; When updating, remember to also update %racket-version in racket.scm.
     (source #f) ; avoid problematic cycle with racket.scm
     (inputs
-     (modify-inputs (package-inputs chez-scheme)
-       (delete "libx11" "util-linux:lib")
-        (replace "chez-scheme-bootstrap-bootfiles"
-          chez-scheme-for-racket-bootstrap-bootfiles)))
+     (let ((inputs (modify-inputs (package-inputs chez-scheme)
+                     (replace "chez-scheme-bootstrap-bootfiles"
+                       chez-scheme-for-racket-bootstrap-bootfiles)
+                     (delete "libx11" "util-linux:lib"))))
+       (if (racket-cs-native-supported-system?)
+           inputs
+           (modify-inputs inputs
+             (prepend libffi)))))
     (native-inputs
      (let ((native-inputs (modify-inputs (package-native-inputs chez-scheme)
                             (prepend zuo))))
@@ -473,10 +501,16 @@ (define-public chez-scheme-for-racket
        ((#:configure-flags cfg-flags #~'())
         #~`("--disable-x11"
             "--threads" ;; ok to potentially duplicate
-            #$@(if (%current-target-system)
-                   (list (string-append "-m="
-                                        (racket-cs-native-supported-system?)))
-                   '())
+            #$(string-append "-m=" (or (racket-cs-native-supported-system?)
+                                       (nix-system->pbarch-machine-type)))
+            ;; ^ could skip -m= for non-cross non-pbarch builds
+            #$@(if (racket-cs-native-supported-system?)
+                   #~()
+                   ;; not inferred on non-native platforms: see
+                   ;; https://racket.discourse.group/t/950/9
+                   #~("--enable-libffi"
+                      "CFLAGS=-g -O2 -D_REENTRANT -pthread"
+                      "LIBS=-lm -ldl -lrt -lffi -lncurses"))
             #$@(if (%current-target-system)
                    (list (string-append "--toolprefix="
                                         (%current-target-system)
@@ -543,10 +577,7 @@ (define-public chez-scheme-for-racket
               (add-after 'unpack 'chdir
                 (lambda args
                   (chdir "racket/src/ChezScheme"))))))))
-    ;; TODO: How to build pbarch/pbchunks for other systems?
-    ;; See https://racket.discourse.group/t/950
-    (supported-systems (filter racket-cs-native-supported-system?
-                               %supported-systems))
+    (supported-systems %supported-systems)
     (home-page "https://github.com/racket/ChezScheme")
     ;; ^ This is downstream of https://github.com/racket/racket,
     ;; but it's designed to be a friendly landing place for people
@@ -559,13 +590,17 @@ (define-public chez-scheme-for-racket
 Main additions to Chez Scheme in the Racket variant:
 @itemize @bullet
 @item
-AArch64 support
+AArch64 code generation
 @item
-Portable bytes (@code{pb}) support, which is mainly useful for bootstrapping
-a build on any supported platform
+Portable bytecode (@code{pb}) mode, which is mainly useful for bootstrapping a
+build on any platform, but can also be used on platforms without native-code
+generation, compiled via Emscripten, linked with @code{libffi}, or used with
+bytecode partially compiled to C
 @item
 Unboxed floating-point arithmetic and flvectors
 @item
+Faster multiplication and division for large exact numbers
+@item
 Type reconstruction during optimization (especially for safe code)
 @item
 Continuation attachments
@@ -576,8 +611,6 @@ (define-public chez-scheme-for-racket
 @item
 Ordered finalization, immobile (but collectable) objects, weak/ephemeron
 generic hash tables, and reference bytevectors
-@item
-Faster multiplication and division for large exact numbers
 @end itemize")
     (license asl2.0)))
 
@@ -655,13 +688,18 @@ (define-public chez-scheme-for-racket-bootstrap-bootfiles
                          "makefiles/boot.zuo"
                          (search-input-file (or native-inputs inputs)
                                             "/bin/scheme")
-                         #$(racket-cs-native-supported-system?)))
+                         #$(or (racket-cs-native-supported-system?)
+                               (nix-system->pbarch-machine-type))))
                      (else
                       ;; bootstrapping
                       #~(invoke
                          (search-input-file (or native-inputs inputs)
                                             "/opt/racket-vm/bin/racket")
-                         "rktboot/main.rkt"))))))))))
+                         "rktboot/main.rkt"
+                         #$@(if (racket-cs-native-supported-system?)
+                                #~()
+                                (let ((m (nix-system->pbarch-machine-type)))
+                                  #~("--machine" #$m)))))))))))))
     (supported-systems
      (package-supported-systems chez-scheme-for-racket))
     (home-page "https://github.com/racket/ChezScheme")
diff --git a/gnu/packages/racket.scm b/gnu/packages/racket.scm
index 90e5e88be5..2fecae31f8 100644
--- a/gnu/packages/racket.scm
+++ b/gnu/packages/racket.scm
@@ -313,7 +313,7 @@ (define-public racket-vm-cgc
      (version %racket-version)
      (source %racket-origin)
      (inputs (list ncurses ;; <- common to all variants (for #%terminal)
-                   libffi)) ;; <- only for BC variants
+                   libffi)) ;; <- for BC and non-native CS variants
      (native-inputs (cons* zuo ;; <- for all variants
                            libtool ;; <- only for BC variants
                            (if (%current-target-system)
@@ -419,10 +419,8 @@ (define-public racket-vm-bc
     (description "The Racket BC (``before Chez'' or ``bytecode'')
 implementation was the default before Racket 8.0.  It uses a compiler written
 in C targeting architecture-independent bytecode, plus a JIT compiler on most
-platforms.  Racket BC has a different C API and supports a slightly different
-set of architectures than the current default runtime system, Racket CS (based
-on ``Chez Scheme'').  It is the recommended implementation for architectures
-that Racket CS doesn't support.
+platforms.  Racket BC has a different C API than the current default runtime
+system, Racket CS (based on ``Chez Scheme'').
 
 This package is the normal implementation of Racket BC with a precise garbage
 collector, 3M (``Moving Memory Manager'').")
@@ -435,9 +433,12 @@ (define-public racket-vm-cs
     (inherit racket-vm-bc)
     (name "racket-vm-cs")
     (inputs
-     (modify-inputs (package-inputs racket-vm-cgc)
-       (prepend zlib lz4)
-       (delete "libffi")))
+     (let ((inputs (modify-inputs (package-inputs racket-vm-cgc)
+                     (prepend zlib lz4))))
+       (if (racket-cs-native-supported-system?)
+           (modify-inputs inputs
+             (delete "libffi"))
+           inputs)))
     (native-inputs
      (let ((native-inputs (package-native-inputs racket-vm-cgc)))
        (modify-inputs (if (%current-target-system)
@@ -466,12 +467,19 @@ (define-public racket-vm-cs
                                 #+(this-package-native-input
                                    "chez-scheme-for-racket")
                                 "/bin/scheme")
+                 #$@(if (racket-cs-native-supported-system?)
+                        #~()
+                        #~(#$(string-append "--enable-mach="
+                                            (nix-system->pbarch-machine-type))
+                           "--enable-pb"))
                  #$racket-vm-common-configure-flags))))
     (synopsis "Racket CS implementation")
     (description "The Racket CS implementation, which uses ``Chez Scheme'' as
 its core compiler and runtime system, has been the default Racket VM
 implementation since Racket 8.0.  It performs better than the Racket BC
-implementation for most programs.
+implementation for most programs.  On systems for which Racket CS cannot
+generate machine code, this package uses a variant of its ``portable
+bytecode'' backend specialized for word size and endianness.
 
 Using the Racket VM packages directly is not recommended: instead, install the
 @code{racket-minimal} or @code{racket} packages.")
