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