/*
 * RANDOM_KMALLOC_CACHES research — exposes random_kmalloc_seed via debugfs.
 * The seed is __ro_after_init unsigned long, EXPORT_SYMBOL'd.
 * After this module loads, /sys/kernel/debug/rand_kmalloc_seed reads it.
 *
 * Module is for legitimate kernel-mitigation research (AppArmor-licensed
 * defensive security context). Not for shipping.
 */
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/debugfs.h>
#include <linux/seq_file.h>
#include <linux/random.h>

extern unsigned long random_kmalloc_seed;

static int seed_show(struct seq_file *m, void *v)
{
    seq_printf(m, "0x%016lx\n", random_kmalloc_seed);
    return 0;
}
DEFINE_SHOW_ATTRIBUTE(seed);

static struct dentry *dbgdir;

static int __init seed_leak_init(void)
{
    dbgdir = debugfs_create_dir("rand_kmalloc_research", NULL);
    if (IS_ERR(dbgdir)) return PTR_ERR(dbgdir);
    debugfs_create_file("seed", 0444, dbgdir, NULL, &seed_fops);
    pr_info("seed_leak: random_kmalloc_seed = 0x%016lx\n", random_kmalloc_seed);
    return 0;
}
static void __exit seed_leak_exit(void)
{
    debugfs_remove_recursive(dbgdir);
}
module_init(seed_leak_init);
module_exit(seed_leak_exit);
MODULE_LICENSE("GPL");
MODULE_DESCRIPTION("RANDOM_KMALLOC_CACHES research helper");
