110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project/** 210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project * @file daemon/oprofiled.c 310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project * Initialisation and setup 410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project * 510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project * @remark Copyright 2002, 2003 OProfile authors 610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project * @remark Read the file COPYING 710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project * 810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project * @author John Levon 910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project * @author Philippe Elie 1010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project * Modified by Aravind Menon for Xen 1110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project * These modifications are: 1210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project * Copyright (C) 2005 Hewlett-Packard Co. 1310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project */ 1410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 1510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project#include "config.h" 1610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 1710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project#include "oprofiled.h" 1810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project#include "opd_printf.h" 1910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project#include "opd_events.h" 205a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Cheng#include "opd_extended.h" 2110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 2210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project#include "op_config.h" 2310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project#include "op_version.h" 2410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project#include "op_hw_config.h" 2510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project#include "op_libiberty.h" 2610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project#include "op_file.h" 2710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project#include "op_abi.h" 2810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project#include "op_string.h" 2910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project#include "op_cpu_type.h" 3010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project#include "op_popt.h" 3110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project#include "op_lockfile.h" 3210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project#include "op_list.h" 3310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project#include "op_fileio.h" 3410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 3510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project#include <sys/types.h> 3610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project#include <sys/resource.h> 3710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project#include <stdlib.h> 3810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project#include <fcntl.h> 3910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project#include <stdio.h> 4010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project#include <string.h> 4110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project#include <unistd.h> 4210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project#include <errno.h> 4310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project#include <assert.h> 4410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project#include <dirent.h> 4510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project#include <limits.h> 4610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 4710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Projectsig_atomic_t signal_alarm; 4810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Projectsig_atomic_t signal_hup; 4910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Projectsig_atomic_t signal_term; 5010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Projectsig_atomic_t signal_child; 5110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Projectsig_atomic_t signal_usr1; 5210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Projectsig_atomic_t signal_usr2; 5310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 5410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Projectuint op_nr_counters; 5510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Projectop_cpu cpu_type; 565a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Chengint no_event_ok; 5710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Projectint vsfile; 5810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Projectint vsamples; 5910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Projectint varcs; 6010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Projectint vmodule; 6110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Projectint vmisc; 625a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Chengint vext; 6310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Projectint separate_lib; 6410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Projectint separate_kernel; 6510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Projectint separate_thread; 6610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Projectint separate_cpu; 6710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Projectint no_vmlinux; 6810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Projectchar * vmlinux; 6910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Projectchar * kernel_range; 7010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Projectchar * session_dir; 7110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Projectint no_xen; 7210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Projectchar * xenimage; 7310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Projectchar * xen_range; 7410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Projectstatic char * verbose; 7510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Projectstatic char * binary_name_filter; 7610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Projectstatic char * events; 775a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Chengstatic char * ext_feature; 7810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Projectstatic int showvers; 7910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Projectstatic struct oprofiled_ops * opd_ops; 8010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Projectextern struct oprofiled_ops opd_24_ops; 8110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Projectextern struct oprofiled_ops opd_26_ops; 8210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 8310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project#define OPD_IMAGE_FILTER_HASH_SIZE 32 8410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Projectstatic struct list_head images_filter[OPD_IMAGE_FILTER_HASH_SIZE]; 8510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 8610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Projectstatic struct poptOption options[] = { 8710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project { "session-dir", 0, POPT_ARG_STRING, &session_dir, 0, "place sample database in dir instead of default location", "/var/lib/oprofile", }, 8810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project { "kernel-range", 'r', POPT_ARG_STRING, &kernel_range, 0, "Kernel VMA range", "start-end", }, 8910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project { "vmlinux", 'k', POPT_ARG_STRING, &vmlinux, 0, "vmlinux kernel image", "file", }, 9010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project { "no-vmlinux", 0, POPT_ARG_NONE, &no_vmlinux, 0, "vmlinux kernel image file not available", NULL, }, 9110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project { "xen-range", 0, POPT_ARG_STRING, &xen_range, 0, "Xen VMA range", "start-end", }, 9210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project { "xen-image", 0, POPT_ARG_STRING, &xenimage, 0, "Xen image", "file", }, 9310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project { "image", 0, POPT_ARG_STRING, &binary_name_filter, 0, "image name filter", "profile these comma separated image" }, 9410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project { "separate-lib", 0, POPT_ARG_INT, &separate_lib, 0, "separate library samples for each distinct application", "[0|1]", }, 9510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project { "separate-kernel", 0, POPT_ARG_INT, &separate_kernel, 0, "separate kernel samples for each distinct application", "[0|1]", }, 9610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project { "separate-thread", 0, POPT_ARG_INT, &separate_thread, 0, "thread-profiling mode", "[0|1]" }, 9710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project { "separate-cpu", 0, POPT_ARG_INT, &separate_cpu, 0, "separate samples for each CPU", "[0|1]" }, 9810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project { "events", 'e', POPT_ARG_STRING, &events, 0, "events list", "[events]" }, 9910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project { "version", 'v', POPT_ARG_NONE, &showvers, 0, "show version", NULL, }, 10010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project { "verbose", 'V', POPT_ARG_STRING, &verbose, 0, "be verbose in log file", "all,sfile,arcs,samples,module,misc", }, 1015a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Cheng { "ext-feature", 'x', POPT_ARG_STRING, &ext_feature, 1, "enable extended feature", "<extended-feature-name>:[args]", }, 10210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project POPT_AUTOHELP 10310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project { NULL, 0, 0, NULL, 0, NULL, NULL, }, 10410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project}; 10510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 10610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 10710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Projectvoid opd_open_logfile(void) 10810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project{ 10910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project if (open(op_log_file, O_WRONLY|O_CREAT|O_NOCTTY|O_APPEND, 0644) == -1) { 11010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project perror("oprofiled: couldn't re-open stdout: "); 11110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project exit(EXIT_FAILURE); 11210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project } 11310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 11410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project if (dup2(1, 2) == -1) { 11510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project perror("oprofiled: couldn't dup stdout to stderr: "); 11610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project exit(EXIT_FAILURE); 11710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project } 11810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project} 11910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 12010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 12110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project/** 12210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project * opd_fork - fork and return as child 12310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project * 12410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project * fork() and exit the parent with _exit(). 12510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project * Failure is fatal. 12610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project */ 12710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Projectstatic void opd_fork(void) 12810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project{ 12910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project switch (fork()) { 13010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project case -1: 13110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project perror("oprofiled: fork() failed: "); 13210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project exit(EXIT_FAILURE); 13310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project break; 13410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project case 0: 13510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project break; 13610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project default: 13710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project /* parent */ 13810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project _exit(EXIT_SUCCESS); 13910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project break; 14010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project } 14110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project} 14210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 14310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 14410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Projectstatic void opd_go_daemon(void) 14510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project{ 14610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project opd_fork(); 14710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 14810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project if (chdir(op_session_dir)) { 14910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project fprintf(stderr, "oprofiled: opd_go_daemon: couldn't chdir to %s: %s", 15010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project op_session_dir, strerror(errno)); 15110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project exit(EXIT_FAILURE); 15210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project } 15310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 15410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project if (setsid() < 0) { 15510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project perror("oprofiled: opd_go_daemon: couldn't setsid: "); 15610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project exit(EXIT_FAILURE); 15710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project } 15810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 15910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project opd_fork(); 16010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project} 16110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 16210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 16310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Projectstatic void opd_write_abi(void) 16410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project{ 16510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project char * cbuf; 16610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 16710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project cbuf = xmalloc(strlen(op_session_dir) + 5); 16810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project strcpy(cbuf, op_session_dir); 16910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project strcat(cbuf, "/abi"); 17010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project op_write_abi_to_file(cbuf); 17110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project free(cbuf); 17210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project} 17310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 17410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 17510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project/** 17610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project * opd_alarm - sync files and report stats 17710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project */ 17810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Projectstatic void opd_alarm(int val __attribute__((unused))) 17910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project{ 18010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project signal_alarm = 1; 18110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project} 18210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 18310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 18410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project/* re-open logfile for logrotate */ 18510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Projectstatic void opd_sighup(int val __attribute__((unused))) 18610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project{ 18710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project signal_hup = 1; 18810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project} 18910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 19010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 19110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Projectstatic void opd_sigterm(int val __attribute__((unused))) 19210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project{ 19310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project signal_term = 1; 19410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project} 19510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 19610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Projectstatic void opd_sigchild(int val __attribute__((unused))) 19710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project{ 19810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project signal_child = 1; 19910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project} 20010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 20110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 20210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Projectstatic void opd_sigusr1(int val __attribute__((unused))) 20310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project{ 20410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project signal_usr1 = 1; 20510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project} 20610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 20710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 20810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Projectstatic void opd_sigusr2(int val __attribute__((unused))) 20910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project{ 21010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project signal_usr2 = 1; 21110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project} 21210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 21310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 21410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Projectstatic void opd_setup_signals(void) 21510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project{ 21610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project struct sigaction act; 21710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 21810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project act.sa_handler = opd_alarm; 21910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project act.sa_flags = 0; 22010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project sigemptyset(&act.sa_mask); 22110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 22210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project if (sigaction(SIGALRM, &act, NULL)) { 22310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project perror("oprofiled: install of SIGALRM handler failed: "); 22410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project exit(EXIT_FAILURE); 22510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project } 22610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 22710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project act.sa_handler = opd_sighup; 22810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project act.sa_flags = 0; 22910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project sigemptyset(&act.sa_mask); 23010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project sigaddset(&act.sa_mask, SIGALRM); 23110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 23210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project if (sigaction(SIGHUP, &act, NULL)) { 23310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project perror("oprofiled: install of SIGHUP handler failed: "); 23410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project exit(EXIT_FAILURE); 23510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project } 23610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 23710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project act.sa_handler = opd_sigterm; 23810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project act.sa_flags = 0; 23910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project sigemptyset(&act.sa_mask); 24010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project sigaddset(&act.sa_mask, SIGTERM); 24110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 24210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project if (sigaction(SIGTERM, &act, NULL)) { 24310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project perror("oprofiled: install of SIGTERM handler failed: "); 24410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project exit(EXIT_FAILURE); 24510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project } 24610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 24710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project act.sa_handler = opd_sigchild; 24810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project act.sa_flags = 0; 24910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project sigemptyset(&act.sa_mask); 25010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project sigaddset(&act.sa_mask, SIGCHLD); 25110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 25210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project if (sigaction(SIGCHLD, &act, NULL)) { 25310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project perror("oprofiled: install of SIGCHLD handler failed: "); 25410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project exit(EXIT_FAILURE); 25510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project } 25610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 25710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project act.sa_handler = opd_sigusr1; 25810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project act.sa_flags = 0; 25910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project sigemptyset(&act.sa_mask); 26010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project sigaddset(&act.sa_mask, SIGTERM); 26110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 26210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project if (sigaction(SIGUSR1, &act, NULL)) { 26310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project perror("oprofiled: install of SIGUSR1 handler failed: "); 26410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project exit(EXIT_FAILURE); 26510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project } 26610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 26710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project act.sa_handler = opd_sigusr2; 26810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project act.sa_flags = 0; 26910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project sigemptyset(&act.sa_mask); 27010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project sigaddset(&act.sa_mask, SIGTERM); 27110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 27210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project if (sigaction(SIGUSR2, &act, NULL)) { 27310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project perror("oprofiled: install of SIGUSR2 handler failed: "); 27410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project exit(EXIT_FAILURE); 27510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project } 27610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project} 27710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 27810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 27910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Projectstruct opd_hashed_name { 28010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project char * name; 28110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project struct list_head next; 28210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project}; 28310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 28410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 28510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Projectstatic void add_image_filter(char const * name) 28610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project{ 28710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project size_t hash; 28810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project struct opd_hashed_name * elt = xmalloc(sizeof(struct opd_hashed_name)); 28910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project elt->name = xmalloc(PATH_MAX); 29010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project if (!realpath(name, elt->name)) { 29110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project free(elt->name); 29210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project free(elt); 29310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project return; 29410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project } 29510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project hash = op_hash_string(elt->name); 29610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project verbprintf(vmisc, "Adding to image filter: \"%s\"\n", elt->name); 29710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project list_add(&elt->next, &images_filter[hash % OPD_IMAGE_FILTER_HASH_SIZE]); 29810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project} 29910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 30010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 30110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Projectstatic void opd_parse_image_filter(void) 30210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project{ 30310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project size_t i; 30410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project char const * last = binary_name_filter; 30510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project char const * cur = binary_name_filter; 30610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 30710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project if (!binary_name_filter) 30810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project return; 30910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 31010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project for (i = 0; i < OPD_IMAGE_FILTER_HASH_SIZE; ++i) 31110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project list_init(&images_filter[i]); 31210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 31310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project while ((cur = strchr(last, ',')) != NULL) { 31410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project char * tmp = op_xstrndup(last, cur - last); 31510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project add_image_filter(tmp); 31610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project free(tmp); 31710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project last = cur + 1; 31810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project } 31910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project add_image_filter(last); 32010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project} 32110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 32210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 32310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Projectint is_image_ignored(char const * name) 32410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project{ 32510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project size_t hash; 32610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project struct list_head * pos; 32710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 32810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project if (!binary_name_filter) 32910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project return 0; 33010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 33110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project hash = op_hash_string(name); 33210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 33310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project list_for_each(pos, &images_filter[hash % OPD_IMAGE_FILTER_HASH_SIZE]) { 33410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project struct opd_hashed_name * hashed_name = 33510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project list_entry(pos, struct opd_hashed_name, next); 33610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project if (!strcmp(hashed_name->name, name)) 33710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project return 0; 33810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project } 33910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 34010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project return 1; 34110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project} 34210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 34310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 34410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project/** return the int in the given oprofilefs file */ 34510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Projectint opd_read_fs_int(char const * path, char const * name, int fatal) 34610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project{ 34710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project char filename[PATH_MAX + 1]; 34810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project snprintf(filename, PATH_MAX, "%s/%s", path, name); 34910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project return op_read_int_from_file(filename, fatal); 35010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project} 35110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 35210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 35310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Projectstatic void opd_handle_verbose_option(char const * name) 35410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project{ 35510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project if (!strcmp(name, "all")) { 35610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project vsfile = 1; 35710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project vsamples = 1; 35810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project varcs = 1; 35910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project vmodule = 1; 36010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project vmisc = 1; 3615a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Cheng vext= 1; 36210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project } else if (!strcmp(name, "sfile")) { 36310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project vsfile = 1; 36410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project } else if (!strcmp(name, "arcs")) { 36510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project varcs = 1; 36610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project } else if (!strcmp(name, "samples")) { 36710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project vsamples = 1; 36810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project } else if (!strcmp(name, "module")) { 36910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project vmodule = 1; 37010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project } else if (!strcmp(name, "misc")) { 37110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project vmisc = 1; 3725a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Cheng } else if (!strcmp(name, "ext")) { 3735a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Cheng vext= 1; 37410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project } else { 37510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project fprintf(stderr, "unknown verbose options\n"); 37610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project exit(EXIT_FAILURE); 37710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project } 37810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project} 37910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 38010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Projectstatic void opd_parse_verbose(void) 38110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project{ 38210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project char const * last = verbose; 38310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project char const * cur = verbose; 38410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 38510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project if (!verbose) 38610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project return; 38710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 38810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project while ((cur = strchr(last, ',')) != NULL) { 38910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project char * tmp = op_xstrndup(last, cur - last); 39010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project opd_handle_verbose_option(tmp); 39110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project free(tmp); 39210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project last = cur + 1; 39310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project } 39410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project opd_handle_verbose_option(last); 39510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project} 39610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 39710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 39810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Projectstatic void opd_options(int argc, char const * argv[]) 39910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project{ 40010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project poptContext optcon; 40110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project char * tmp; 40210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 40310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project optcon = op_poptGetContext(NULL, argc, argv, options, 0); 40410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 40510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project if (showvers) 40610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project show_version(argv[0]); 40710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 40810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project opd_parse_verbose(); 40910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 41010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project if (separate_kernel) 41110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project separate_lib = 1; 41210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 41310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project cpu_type = op_get_cpu_type(); 41410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project op_nr_counters = op_get_nr_counters(cpu_type); 41510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 41610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project if (!no_vmlinux) { 41710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project if (!vmlinux || !strcmp("", vmlinux)) { 41810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project fprintf(stderr, "oprofiled: no vmlinux specified.\n"); 41910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project poptPrintHelp(optcon, stderr, 0); 42010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project exit(EXIT_FAILURE); 42110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project } 42210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 42310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project /* canonicalise vmlinux filename. fix #637805 */ 42410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project tmp = xmalloc(PATH_MAX); 42510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project if (realpath(vmlinux, tmp)) 42610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project vmlinux = tmp; 42710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project else 42810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project free(tmp); 42910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 43010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project if (!kernel_range || !strcmp("", kernel_range)) { 43110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project fprintf(stderr, "oprofiled: no kernel VMA range specified.\n"); 43210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project poptPrintHelp(optcon, stderr, 0); 43310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project exit(EXIT_FAILURE); 43410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project } 43510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project } 43610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 4375a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Cheng if(opd_ext_initialize(ext_feature) != EXIT_SUCCESS) 4385a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Cheng exit(EXIT_FAILURE); 4395a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Cheng 4405a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Cheng if (events == NULL && no_event_ok == 0) { 44110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project fprintf(stderr, "oprofiled: no events specified.\n"); 44210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project poptPrintHelp(optcon, stderr, 0); 44310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project exit(EXIT_FAILURE); 44410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project } 44510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 44610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project if (!xenimage || !strcmp("", xenimage)) { 44710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project no_xen = 1; 44810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project } else { 44910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project no_xen = 0; 45010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 45110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project /* canonicalise xen image filename. */ 45210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project tmp = xmalloc(PATH_MAX); 45310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project if (realpath(xenimage, tmp)) 45410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project xenimage = tmp; 45510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project else 45610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project free(tmp); 45710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 45810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project if (!xen_range || !strcmp("", xen_range)) { 45910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project fprintf(stderr, "oprofiled: no Xen VMA range specified.\n"); 46010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project poptPrintHelp(optcon, stderr, 0); 46110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project exit(EXIT_FAILURE); 46210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project } 46310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project } 46410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 4655a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Cheng if (events != NULL) 4665a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Cheng opd_parse_events(events); 46710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 46810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project opd_parse_image_filter(); 46910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 47010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project poptFreeContext(optcon); 47110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project} 47210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 47310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 47410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project/* determine what kernel we're running and which daemon 47510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project * to use 47610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project */ 47710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Projectstatic struct oprofiled_ops * get_ops(void) 47810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project{ 47910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project switch (op_get_interface()) { 48010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project#ifndef ANDROID 48110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project case OP_INTERFACE_24: 48210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project printf("Using 2.4 OProfile kernel interface.\n"); 48310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project return &opd_24_ops; 48410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project#endif 48510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project case OP_INTERFACE_26: 48610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project printf("Using 2.6+ OProfile kernel interface.\n"); 48710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project return &opd_26_ops; 48810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project default: 48910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project break; 49010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project } 49110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 49210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project fprintf(stderr, "Couldn't determine kernel version.\n"); 49310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project exit(EXIT_FAILURE); 49410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project return NULL; 49510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project} 49610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 49710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 49810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Projectint main(int argc, char const * argv[]) 49910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project{ 50010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project int err; 50110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project struct rlimit rlim = { 2048, 2048 }; 50210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 50310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project opd_options(argc, argv); 50410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project init_op_config_dirs(session_dir); 50510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 50610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project opd_setup_signals(); 50710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 50810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project err = setrlimit(RLIMIT_NOFILE, &rlim); 50910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project if (err) 51010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project perror("warning: could not set RLIMIT_NOFILE to 2048: "); 51110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 51210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project opd_write_abi(); 51310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 51410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project opd_ops = get_ops(); 51510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 51610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project opd_ops->init(); 51710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 51810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project opd_go_daemon(); 51910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 52010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project /* clean up every 10 minutes */ 52110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project alarm(60 * 10); 52210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 52310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project if (op_write_lock_file(op_lock_file)) { 52410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project fprintf(stderr, "oprofiled: could not create lock file %s\n", 52510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project op_lock_file); 52610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project exit(EXIT_FAILURE); 52710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project } 52810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 52910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project opd_ops->start(); 53010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 53110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project opd_ops->exit(); 53210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 53310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project return 0; 53410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project} 535