#include "util/build-id.h"
 #include "util/debug.h"
 #include "util/dso.h"
+#include "util/map.h"
 #include <subcmd/pager.h>
 #include <subcmd/parse-options.h>
 #include "util/session.h"
 #include "util/symbol.h"
 #include "util/data.h"
 #include <errno.h>
+#include <inttypes.h>
 #include <linux/err.h>
 
+static int buildid__map_cb(struct map *map, void *arg __maybe_unused)
+{
+       const struct dso *dso = map->dso;
+       char bid_buf[SBUILD_ID_SIZE];
+
+       memset(bid_buf, 0, sizeof(bid_buf));
+       if (dso->has_build_id)
+               build_id__sprintf(&dso->bid, bid_buf);
+       printf("%s %16" PRIx64 " %16" PRIx64, bid_buf, map->start, map->end);
+       if (dso->long_name != NULL) {
+               printf(" %s", dso->long_name);
+       } else if (dso->short_name != NULL) {
+               printf(" %s", dso->short_name);
+       }
+       printf("\n");
+
+       return 0;
+}
+
+static void buildid__show_kernel_maps(void)
+{
+       struct machine *machine;
+
+       machine = machine__new_host();
+       machine__for_each_kernel_map(machine, buildid__map_cb, NULL);
+       machine__delete(machine);
+}
+
 static int sysfs__fprintf_build_id(FILE *fp)
 {
        char sbuild_id[SBUILD_ID_SIZE];
 int cmd_buildid_list(int argc, const char **argv)
 {
        bool show_kernel = false;
+       bool show_kernel_maps = false;
        bool with_hits = false;
        bool force = false;
        const struct option options[] = {
        OPT_STRING('i', "input", &input_name, "file", "input file name"),
        OPT_BOOLEAN('f', "force", &force, "don't complain, do it"),
        OPT_BOOLEAN('k', "kernel", &show_kernel, "Show current kernel build id"),
+       OPT_BOOLEAN('m', "kernel-maps", &show_kernel_maps,
+           "Show build id of current kernel + modules"),
        OPT_INCR('v', "verbose", &verbose, "be more verbose"),
        OPT_END()
        };
        argc = parse_options(argc, argv, options, buildid_list_usage, 0);
        setup_pager();
 
-       if (show_kernel)
+       if (show_kernel) {
                return !(sysfs__fprintf_build_id(stdout) > 0);
+       } else if (show_kernel_maps) {
+               buildid__show_kernel_maps();
+               return 0;
+       }
 
        return perf_session__list_build_ids(force, with_hits);
 }