/* CTF 1.8 */
trace {
	major = 0;
	minor = 1;
	uuid = "f816d884-6cea-11e0-ac7a-8f5f4e9f7724";
	byte_order = be;	/* Assuming big endian streams */
};

/* Architecture with 32-bit pointers, 32-bit integers, 32-bit longs */

typealias integer { size = 32; align = 32; signed = false; } := uint32_t;
typealias integer { size = 64; align = 64; signed = false; } := uint64_t;
typealias integer { size = 32; align = 32; signed = false; } := void *;

stream {
	event.header := struct {
		uint32_t id;
		uint64_t timestamp;
	};
	event.context := struct {	/*
		uint32_t thread_id;	 * This context belongs to all
		void *func_called;	 * events in this stream.
		void *called_from;	 */
		uint32_t event_count;	/* for debug */
	};			
};

/*
 * All events have empty context/fields, because their field layout is
 * replicated for all events of the stream (in this particular trace
 * layout). See ctf-embedded-2.txt for a more compact layout.
 */

event { name = invalid; id = 0; };
event { name = func_enter; id = 1; };
event { name = func_exit; id = 2; };

event {
	name = timer_tick;	/* or sync_point... */
	id = 3;
	fields := {
		uint64_t monotonic_value;
		uint64_t tsc_value;
		uint32_t seqnum;
	};
};

event {
	name = freq_change;
	id = 4;
	fields := {
		uint64_t new_freq;
	};
}

clock {
	name = monotonic;
	uuid = ;
};

clock {
	name = seqnum;
	uuid = ;
};

clock {
	name = tsc;
	sync_points = {
		map {
			parent.clock = monotonic;
			parent.value = event.timer_tick.monotonic_value;
			value = event.timer_tick.tsc_value;
		};
		map {
			parent.clock = seqnum;
			parent.value = event.timer_tick.seqnum;
			value = event.timer_tick.tsc_value;
		};
	};

	freq = {
		update = event.freq_change.new_freq;
	};
	uuid = ;
};
