memset(&parse_error, 0, sizeof(struct parse_events_error));
        ret = parse_events(perf_evlist, extra_events.buf, &parse_error);
        if (ret) {
-               pr_err("Cannot set up events %s\n", extra_events.buf);
+               parse_events_print_error(&parse_error, extra_events.buf);
                goto out;
        }
        strbuf_release(&extra_events);
 
        struct perf_pmu_info info;
        struct perf_pmu *pmu;
        struct perf_evsel *evsel;
+       struct parse_events_error *err = parse_state->error;
        LIST_HEAD(config_terms);
 
        pmu = perf_pmu__find(name);
-       if (!pmu)
+       if (!pmu) {
+               if (asprintf(&err->str,
+                               "Cannot find PMU `%s'. Missing kernel support?",
+                               name) < 0)
+                       err->str = NULL;
                return -EINVAL;
+       }
 
        if (pmu->default_config) {
                memcpy(&attr, pmu->default_config,
        return ws.ws_col > MAX_WIDTH ? MAX_WIDTH : ws.ws_col;
 }
 
-static void parse_events_print_error(struct parse_events_error *err,
-                                    const char *event)
+void parse_events_print_error(struct parse_events_error *err,
+                             const char *event)
 {
        const char *str = "invalid or unsupported event: ";
        char _buf[MAX_WIDTH];
                zfree(&err->str);
                zfree(&err->help);
        }
-
-       fprintf(stderr, "Run 'perf list' for a list of valid events\n");
 }
 
 #undef MAX_WIDTH
        struct parse_events_error err = { .idx = 0, };
        int ret = parse_events(evlist, str, &err);
 
-       if (ret)
+       if (ret) {
                parse_events_print_error(&err, str);
+               fprintf(stderr, "Run 'perf list' for a list of valid events\n");
+       }
 
        return ret;
 }
 
 int valid_event_mount(const char *eventfs);
 char *parse_events_formats_error_string(char *additional_terms);
 
+void parse_events_print_error(struct parse_events_error *err,
+                             const char *event);
+
 #ifdef HAVE_LIBELF_SUPPORT
 /*
  * If the probe point starts with '%',