diff --git a/RELEASE-NOTES.md b/RELEASE-NOTES.md
index 133282a..d199fed 100644
--- a/RELEASE-NOTES.md
+++ b/RELEASE-NOTES.md
@@ -43,15 +43,15 @@
 These changes include stability improvements and bugs fixes.
 The gem5 testing suite has also been expanded to include gem5 in SystemC tests.
 
-### Improved GPU support.
+### Improved GPU support
 
 Users may now simulate an AMD GPU device in full system mode using the ROCm 4.2 compute stack.
 Until v21.2, gem5 only supported GPU simulation in Syscall-Emulation mode with ROCm 4.0.
 See [`src/gpu-fs/README.md`](https://gem5.googlesource.com/public/gem5-resources/+/refs/heads/stable/src/gpu-fs/) in gem5-resources and example scripts in [`configs/example/gpufs/`](https://gem5.googlesource.com/public/gem5/+/refs/tags/v22.0.0.0/configs/example/gpufs/) for example scripts which run GPU full system simulations.
 
-A [GPU Ruby random tester has been added](https://gem5-review.googlesource.com/c/public/gem5/+/59272) to help validate the correctness of the CPU and GPU Ruby coherence protocols as part of every kokoro check-in.  
-This helps validate the correctness of the protocols before new changes are checked in.  
-Currently the tester focuses on the protocols used with the GPU, but the ideas are extensible to other protocols.  
+A [GPU Ruby random tester has been added](https://gem5-review.googlesource.com/c/public/gem5/+/59272) to help validate the correctness of the CPU and GPU Ruby coherence protocols as part of every kokoro check-in.
+This helps validate the correctness of the protocols before new changes are checked in.
+Currently the tester focuses on the protocols used with the GPU, but the ideas are extensible to other protocols.
 The work is based on "Autonomous Data-Race-Free GPU Testing", IISWC 2019, Tuan Ta, Xianwei Zhang, Anthony Gutierrez, and Bradford M. Beckmann.
 
 ### An Arm board has been added to the gem5 Standard Library
@@ -113,6 +113,25 @@
 - New bootloader is required for Arm VExpress_GEM5_Foundation platform. See https://gem5.atlassian.net/browse/GEM5-1222 for details.
 - The MemCtrl interface has been updated to use more inheritance to make extending it to other memory types (e.g., HBM pseudo channels) easier.
 
+# Version 21.2.1.1
+
+**[HOTFIX]** In order to ensure v21 of gem5 remains compatible with future changes, the gem5 stdlib downloader has been updated to obtain the resources.json file from <https://resources.gem5.org/resources.json>.
+As this domain is under the gem5 project control, unlike the previous googlesource URL, we can ensure longer-term stability.
+The fix also ensures the downloader can parse plain-text JSON and base64 encoding of the resources.json file.
+
+# Version 21.2.1.0
+
+Version 21.2.1 is a minor gem5 release consisting of bug fixes. The 21.2.1 release:
+
+* Fixes a bug in which [a RCV instruction is wrongly regarded as a branch](https://gem5.atlassian.net/browse/GEM5-1137).
+* Removes outdated and incomplete standard library documentation.
+Users wishing to learn more about the gem5 standard library should consult materials [on the gem5 website](https://www.gem5.org/documentation/gem5-stdlib/overview).
+* Adds a VirtIO entropy device (VirtIORng) to RISC-V.
+Without this, [RISCV Disk images can take considerable time to boot and occasionally do so in error](https://gem5.atlassian.net/browse/GEM5-1151).
+* Removes the 'typing.final' decorator from the standard library.
+'typing.final' was introduced in Python 3.8, but v21.2 of gem5 supports Python 3.6.
+* Fixes the broken NPB stdlib example test.
+
 # Version 21.2.0.0
 
 ## API (user-facing) changes
diff --git a/src/dev/virtio/VirtIORng 2.py b/src/dev/virtio/VirtIORng 2.py
new file mode 100644
index 0000000..13df059
--- /dev/null
+++ b/src/dev/virtio/VirtIORng 2.py
@@ -0,0 +1,48 @@
+# -*- mode:python -*-
+
+# Copyright (c) 2022  Institute of Computing Technology, Chinese
+#                     Academy of Sciences
+# All rights reserved.
+#
+# The license below extends only to copyright in the software and shall
+# not be construed as granting a license to any other intellectual
+# property including but not limited to intellectual property relating
+# to a hardware implementation of the functionality of the software
+# licensed hereunder.  You may use the software subject to the license
+# terms below provided that you ensure that this notice is replicated
+# unmodified and in its entirety in all distributions of the software,
+# modified or unmodified, in source code or in binary form.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are
+# met: redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer;
+# redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in the
+# documentation and/or other materials provided with the distribution;
+# neither the name of the copyright holders nor the names of its
+# contributors may be used to endorse or promote products derived from
+# this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+from m5.params import *
+from m5.proxy import *
+from m5.objects.VirtIO import VirtIODeviceBase
+
+class VirtIORng(VirtIODeviceBase):
+    type = 'VirtIORng'
+    cxx_header = 'dev/virtio/rng.hh'
+    cxx_class = 'gem5::VirtIORng'
+
+    qSize = Param.Unsigned(16, "Request queue size")
diff --git a/src/dev/virtio/rng 2.cc b/src/dev/virtio/rng 2.cc
new file mode 100644
index 0000000..c26568e
--- /dev/null
+++ b/src/dev/virtio/rng 2.cc
@@ -0,0 +1,94 @@
+/*
+ * Copyright (c) 2022  Institute of Computing Technology, Chinese Academy
+ *                     of Sciences
+ * All rights reserved
+ *
+ * The license below extends only to copyright in the software and shall
+ * not be construed as granting a license to any other intellectual
+ * property including but not limited to intellectual property relating
+ * to a hardware implementation of the functionality of the software
+ * licensed hereunder.  You may use the software subject to the license
+ * terms below provided that you ensure that this notice is replicated
+ * unmodified and in its entirety in all distributions of the software,
+ * modified or unmodified, in source code or in binary form.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met: redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer;
+ * redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution;
+ * neither the name of the copyright holders nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "dev/virtio/rng.hh"
+
+#include "base/random.hh"
+#include "debug/VIORng.hh"
+#include "params/VirtIORng.hh"
+#include "sim/system.hh"
+
+namespace gem5
+{
+
+VirtIORng::VirtIORng(const Params &params)
+    : VirtIODeviceBase(params, ID_RNG, 0, 0),
+      qReq(params.system->physProxy, byteOrder, params.qSize, *this)
+{
+    registerQueue(qReq);
+}
+
+VirtIORng::~VirtIORng()
+{
+}
+
+VirtIORng::RngQueue::RngQueue(PortProxy &proxy, ByteOrder bo, uint16_t size,
+    VirtIORng &_parent)
+    : VirtQueue(proxy, bo, size), parent(_parent)
+{
+}
+
+void
+VirtIORng::readConfig(PacketPtr pkt, Addr cfgOffset)
+{
+    // There are no configuration for RNG device
+    pkt->makeResponse();
+}
+
+void
+VirtIORng::RngQueue::trySend()
+{
+    DPRINTF(VIORng, "try send\n");
+
+    VirtDescriptor *d;
+    while ((d = consumeDescriptor())) {
+        DPRINTF(VIORng, "Got descriptor (len: %i)\n", d->size());
+        size_t len = 0;
+        while (len < d->size()) {
+            uint8_t byte = gem5::random_mt.random<uint8_t>();
+            d->chainWrite(len, &byte, sizeof(uint8_t));
+            ++len;
+        }
+
+        // Tell the guest that we are done with this descriptor.
+        produceDescriptor(d, len);
+        parent.kick();
+    }
+}
+
+} // namespace gem5
diff --git a/src/dev/virtio/rng 2.hh b/src/dev/virtio/rng 2.hh
new file mode 100644
index 0000000..7be2354
--- /dev/null
+++ b/src/dev/virtio/rng 2.hh
@@ -0,0 +1,97 @@
+/*
+ * Copyright (c) 2022  Institute of Computing Technology, Chinese Academy
+ *                     of Sciences
+ * All rights reserved
+ *
+ * The license below extends only to copyright in the software and shall
+ * not be construed as granting a license to any other intellectual
+ * property including but not limited to intellectual property relating
+ * to a hardware implementation of the functionality of the software
+ * licensed hereunder.  You may use the software subject to the license
+ * terms below provided that you ensure that this notice is replicated
+ * unmodified and in its entirety in all distributions of the software,
+ * modified or unmodified, in source code or in binary form.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met: redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer;
+ * redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution;
+ * neither the name of the copyright holders nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef __DEV_VIRTIO_RNG_HH__
+#define __DEV_VIRTIO_RNG_HH__
+
+#include "base/compiler.hh"
+#include "dev/virtio/base.hh"
+
+namespace gem5
+{
+
+struct VirtIORngParams;
+
+/**
+ * VirtIO Rng
+ *
+ * @see https://github.com/rustyrussell/virtio-spec
+ * @see http://docs.oasis-open.org/virtio/virtio/v1.0/virtio-v1.0.html
+ */
+class VirtIORng : public VirtIODeviceBase
+{
+  public:
+    typedef VirtIORngParams Params;
+    VirtIORng(const Params &params);
+    virtual ~VirtIORng();
+
+    void readConfig(PacketPtr pkt, Addr cfgOffset);
+
+  protected:
+    /** VirtIO device ID */
+    static const DeviceId ID_RNG = 0x04;
+
+  protected:
+    /**
+     * Virtqueue for data going from the host to the guest.
+     */
+    class RngQueue
+        : public VirtQueue
+    {
+      public:
+        RngQueue(PortProxy &proxy, ByteOrder bo, uint16_t size,
+                 VirtIORng &_parent);
+        virtual ~RngQueue() {}
+
+        void onNotify() { trySend(); }
+
+        /** Try to send data pending data from the terminal. */
+        void trySend();
+
+        std::string name() const { return parent.name() + ".qRecv"; }
+
+      protected:
+        VirtIORng &parent;
+    };
+    /** Receive queue for port 0 */
+    RngQueue qReq;
+};
+
+} // namespace gem5
+
+#endif // __DEV_VIRTIO_RNG_HH__
