18cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd/**
28cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * @file abi_test.cpp
38cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * Import sample files from other ABI
48cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd *
58cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * @remark Copyright 2002 OProfile authors
68cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * @remark Read the file COPYING
78cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd *
88cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * @author Graydon Hoare
98cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd */
108cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
118cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#include "abi.h"
128cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#include "odb.h"
138cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#include "popt_options.h"
148cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#include "op_sample_file.h"
158cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#include "op_cpu_type.h"
168cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#include "op_config.h"
178cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
188cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#include <fstream>
198cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#include <iostream>
208cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
218cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#include <cstdlib>
228cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#include <cstring>
238cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
248cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddusing namespace std;
258cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
268cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddnamespace {
278cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	string db_filename;
288cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	string abi_filename;
298cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd}
308cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
318cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
328cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddpopt::option options_array[] = {
338cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	popt::option(db_filename, "db", 'd', "output db to file", "filename"),
348cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	popt::option(abi_filename, "abi", 'a', "output abi to file", "filename")
358cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd};
368cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
378cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
388cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddint main(int argc, char const ** argv)
398cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd{
408cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	vector<string> rest;
418cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	popt::parse_options(argc, argv, rest);
428cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
438cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	if (abi_filename.empty() && db_filename.empty()) {
448cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		cerr << "error: no file specified to work on" << endl;
458cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		exit(1);
468cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	}
478cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
488cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
498cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	if (!abi_filename.empty()) {
508cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		ofstream file(abi_filename.c_str());
518cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		if (!file) {
528cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			cerr << "error: cannot open " << abi_filename
538cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			     << " for writing" << endl;
548cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			exit(1);
558cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		}
568cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		file << abi();
578cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	}
588cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
598cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	if (!db_filename.empty()) {
608cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		odb_t dest;
618cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		int rc = odb_open(&dest, db_filename.c_str(), ODB_RDWR,
628cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		                  sizeof(struct opd_header));
638cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
648cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		if (rc) {
658cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			cerr << "odb_open() fail:\n"
668cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			     << strerror(rc) << endl;
678cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			exit(EXIT_FAILURE);
688cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		}
698cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
708cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		struct opd_header * header;
718cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		header = static_cast<struct opd_header *>(odb_get_data(&dest));
728cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		memset(header, '\0', sizeof(struct opd_header));
738cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		header->version = OPD_VERSION;
748cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		memcpy(header->magic, OPD_MAGIC, sizeof(header->magic));
758cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		header->is_kernel = 1;
768cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		/* ICACHE_FETCHES */
778cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		header->ctr_event = 0x80;
788cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		header->ctr_um = 0x0;
798cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		header->cpu_type = CPU_ATHLON;
808cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		header->ctr_count = 0xdeadbeef;
818cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		header->cpu_speed = 0;
828cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		header->mtime = 1034790063;
838cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		header->cg_to_is_kernel = 1;
848cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		header->anon_start = 0;
858cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		header->cg_to_anon_start = 0;
868cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
878cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		for (int i = 0; i < 3793; ++i) {
888cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			int rc = odb_add_node(&dest, i, i);
898cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			if (rc != EXIT_SUCCESS) {
908cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				cerr << strerror(rc) << endl;
918cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				exit(EXIT_FAILURE);
928cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			}
938cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		}
948cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		odb_close(&dest);
958cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	}
968cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd}
97