LIB_H += util/build-id.h
 LIB_H += util/debug.h
 LIB_H += util/debugfs.h
+LIB_H += util/sysfs.h
 LIB_H += util/event.h
 LIB_H += util/evsel.h
 LIB_H += util/evlist.h
 LIB_OBJS += $(OUTPUT)util/config.o
 LIB_OBJS += $(OUTPUT)util/ctype.o
 LIB_OBJS += $(OUTPUT)util/debugfs.o
+LIB_OBJS += $(OUTPUT)util/sysfs.o
 LIB_OBJS += $(OUTPUT)util/environment.o
 LIB_OBJS += $(OUTPUT)util/event.o
 LIB_OBJS += $(OUTPUT)util/evlist.o
 
--- /dev/null
+
+#include "util.h"
+#include "sysfs.h"
+
+static const char * const sysfs_known_mountpoints[] = {
+       "/sys",
+       0,
+};
+
+static int sysfs_found;
+char sysfs_mountpoint[PATH_MAX];
+
+static int sysfs_valid_mountpoint(const char *sysfs)
+{
+       struct statfs st_fs;
+
+       if (statfs(sysfs, &st_fs) < 0)
+               return -ENOENT;
+       else if (st_fs.f_type != (long) SYSFS_MAGIC)
+               return -ENOENT;
+
+       return 0;
+}
+
+const char *sysfs_find_mountpoint(void)
+{
+       const char * const *ptr;
+       char type[100];
+       FILE *fp;
+
+       if (sysfs_found)
+               return (const char *) sysfs_mountpoint;
+
+       ptr = sysfs_known_mountpoints;
+       while (*ptr) {
+               if (sysfs_valid_mountpoint(*ptr) == 0) {
+                       sysfs_found = 1;
+                       strcpy(sysfs_mountpoint, *ptr);
+                       return sysfs_mountpoint;
+               }
+               ptr++;
+       }
+
+       /* give up and parse /proc/mounts */
+       fp = fopen("/proc/mounts", "r");
+       if (fp == NULL)
+               return NULL;
+
+       while (!sysfs_found &&
+              fscanf(fp, "%*s %" STR(PATH_MAX) "s %99s %*s %*d %*d\n",
+                     sysfs_mountpoint, type) == 2) {
+
+               if (strcmp(type, "sysfs") == 0)
+                       sysfs_found = 1;
+       }
+
+       fclose(fp);
+
+       return sysfs_found ? sysfs_mountpoint : NULL;
+}