qemu/trace/ftrace.c
<<
>>
Prefs
   1/*
   2 * Ftrace trace backend
   3 *
   4 * Copyright (C) 2013 Hitachi, Ltd.
   5 * Created by Eiichi Tsukata <eiichi.tsukata.xh@hitachi.com>
   6 *
   7 * This work is licensed under the terms of the GNU GPL, version 2.  See
   8 * the COPYING file in the top-level directory.
   9 *
  10 */
  11
  12#include "qemu/osdep.h"
  13#include "trace.h"
  14#include "trace/control.h"
  15
  16int trace_marker_fd;
  17
  18static int find_debugfs(char *debugfs)
  19{
  20    char type[100];
  21    FILE *fp;
  22
  23    fp = fopen("/proc/mounts", "r");
  24    if (fp == NULL) {
  25        return 0;
  26    }
  27
  28    while (fscanf(fp, "%*s %" STR(PATH_MAX) "s %99s %*s %*d %*d\n",
  29                  debugfs, type) == 2) {
  30        if (strcmp(type, "debugfs") == 0) {
  31            break;
  32        }
  33    }
  34    fclose(fp);
  35
  36    if (strcmp(type, "debugfs") != 0) {
  37        return 0;
  38    }
  39    return 1;
  40}
  41
  42bool ftrace_init(void)
  43{
  44    char debugfs[PATH_MAX];
  45    char path[PATH_MAX];
  46    int debugfs_found;
  47    int trace_fd = -1;
  48
  49    debugfs_found = find_debugfs(debugfs);
  50    if (debugfs_found) {
  51        snprintf(path, PATH_MAX, "%s/tracing/tracing_on", debugfs);
  52        trace_fd = open(path, O_WRONLY);
  53        if (trace_fd < 0) {
  54            perror("Could not open ftrace 'tracing_on' file");
  55            return false;
  56        } else {
  57            if (write(trace_fd, "1", 1) < 0) {
  58                perror("Could not write to 'tracing_on' file");
  59                close(trace_fd);
  60                return false;
  61            }
  62            close(trace_fd);
  63        }
  64        snprintf(path, PATH_MAX, "%s/tracing/trace_marker", debugfs);
  65        trace_marker_fd = open(path, O_WRONLY);
  66        if (trace_marker_fd < 0) {
  67            perror("Could not open ftrace 'trace_marker' file");
  68            return false;
  69        }
  70    } else {
  71        fprintf(stderr, "debugfs is not mounted\n");
  72        return false;
  73    }
  74
  75    return true;
  76}
  77