#include <linux/types.h>
 
 #include <asm/rwonce.h>
+#include <asm/sections.h>
 
 /* Static key: true if any KUnit tests are currently running */
 DECLARE_STATIC_KEY_FALSE(kunit_running);
        return kunit_kmalloc_array(test, n, size, gfp | __GFP_ZERO);
 }
 
+
+/**
+ * kunit_kfree_const() - conditionally free test managed memory
+ * @x: pointer to the memory
+ *
+ * Calls kunit_kfree() only if @x is not in .rodata section.
+ * See kunit_kstrdup_const() for more information.
+ */
+void kunit_kfree_const(struct kunit *test, const void *x);
+
+/**
+ * kunit_kstrdup() - Duplicates a string into a test managed allocation.
+ *
+ * @test: The test context object.
+ * @str: The NULL-terminated string to duplicate.
+ * @gfp: flags passed to underlying kmalloc().
+ *
+ * See kstrdup() and kunit_kmalloc_array() for more information.
+ */
+static inline char *kunit_kstrdup(struct kunit *test, const char *str, gfp_t gfp)
+{
+       size_t len;
+       char *buf;
+
+       if (!str)
+               return NULL;
+
+       len = strlen(str) + 1;
+       buf = kunit_kmalloc(test, len, gfp);
+       if (buf)
+               memcpy(buf, str, len);
+       return buf;
+}
+
+/**
+ * kunit_kstrdup_const() - Conditionally duplicates a string into a test managed allocation.
+ *
+ * @test: The test context object.
+ * @str: The NULL-terminated string to duplicate.
+ * @gfp: flags passed to underlying kmalloc().
+ *
+ * Calls kunit_kstrdup() only if @str is not in the rodata section. Must be freed with
+ * kunit_kfree_const() -- not kunit_kfree().
+ * See kstrdup_const() and kunit_kmalloc_array() for more information.
+ */
+const char *kunit_kstrdup_const(struct kunit *test, const char *str, gfp_t gfp);
+
 /**
  * kunit_vm_mmap() - Allocate KUnit-tracked vm_mmap() area
  * @test: The test context object.
 
        if (!driver)
                return ERR_PTR(err);
 
-       driver->name = name;
+       driver->name = kunit_kstrdup_const(test, name, GFP_KERNEL);
        driver->bus = &kunit_bus_type;
        driver->owner = THIS_MODULE;
 
        const struct device_driver *driver = to_kunit_device(dev)->driver;
 
        kunit_release_action(test, device_unregister_wrapper, dev);
-       if (driver)
+       if (driver) {
+               const char *driver_name = driver->name;
                kunit_release_action(test, driver_unregister_wrapper, (void *)driver);
+               kunit_kfree_const(test, driver_name);
+       }
 }
 EXPORT_SYMBOL_GPL(kunit_device_unregister);
 
 
 }
 EXPORT_SYMBOL_GPL(kunit_kfree);
 
+void kunit_kfree_const(struct kunit *test, const void *x)
+{
+#if !IS_MODULE(CONFIG_KUNIT)
+       if (!is_kernel_rodata((unsigned long)x))
+#endif
+               kunit_kfree(test, x);
+}
+EXPORT_SYMBOL_GPL(kunit_kfree_const);
+
+const char *kunit_kstrdup_const(struct kunit *test, const char *str, gfp_t gfp)
+{
+#if !IS_MODULE(CONFIG_KUNIT)
+       if (is_kernel_rodata((unsigned long)str))
+               return str;
+#endif
+       return kunit_kstrdup(test, str, gfp);
+}
+EXPORT_SYMBOL_GPL(kunit_kstrdup_const);
+
 void kunit_cleanup(struct kunit *test)
 {
        struct kunit_resource *res;