--- /dev/null
+//
+// TraceDataHeader.hpp
+// KDBG
+//
+// Created by James McIlree on 10/25/12.
+// Copyright (c) 2014 Apple. All rights reserved.
+//
+
+//
+// We have to specialize this, as the K64 min alignment is 4 bytes longer,
+// to maintain 8 byte alignment for the uint64_t _TOD_secs.
+//
+
+template <typename KERNEL_SIZE> class TraceDataHeaderFields {};
+
+template <>
+class TraceDataHeaderFields<Kernel32> {
+ public:
+ uint32_t version;
+ uint32_t thread_count;
+ uint32_t TOD_secs_top_half;
+ uint32_t TOD_secs_bottom_half;
+ uint32_t TOD_usecs;
+
+ // NOTE! The compiler has shown a tendency to place this on non 8 byte
+ // aligned addresses when stack allocating. We need to construct the
+ // uint64_t values by logical-or and shifting, treating as a pointer
+ // will fail!
+
+ TraceDataHeaderFields(uint32_t v, uint32_t tc, uint64_t s, uint32_t us) :
+ version(v),
+ thread_count(tc),
+ TOD_usecs(us)
+ {
+ TOD_secs_top_half = (uint32_t)(s >> 32);
+ TOD_secs_bottom_half = (uint32_t)(s & 0xFFFFFFFF);
+ }
+
+ uint64_t TOD_secs() {
+ return ((uint64_t)TOD_secs_top_half << 32) | (uint64_t)TOD_secs_bottom_half;
+ }
+};
+
+template <>
+class TraceDataHeaderFields<Kernel64> {
+ public:
+ uint32_t version;
+ uint32_t thread_count;
+ uint64_t _TOD_secs;
+ uint32_t TOD_usecs;
+ uint32_t _force_alignment; // Need to force 8 byte alignment in 32 bit code
+
+ TraceDataHeaderFields(uint32_t v, uint32_t tc, uint64_t s, uint32_t us) :
+ version(v),
+ thread_count(tc),
+ _TOD_secs(s),
+ TOD_usecs(us),
+ _force_alignment(0)
+ {
+ }
+
+ uint64_t TOD_secs() {
+ return _TOD_secs;
+ }
+};
+
+template <typename KERNEL_SIZE>
+class TraceDataHeader {
+ private:
+ TraceDataHeaderFields<KERNEL_SIZE> _fields;
+
+ public:
+ TraceDataHeader() : _fields(0, 0, 0, 0) {}
+ TraceDataHeader(uint32_t v, uint32_t tc, uint64_t s, uint32_t us) : _fields(v, tc, s, us) {}
+
+ uint32_t version() const { return _fields.version; }
+ uint32_t thread_count() const { return _fields.thread_count; }
+ uint64_t TOD_secs() const { return _fields.TOD_secs(); }
+ uint32_t TOD_usecs() const { return _fields.TOD_usecs; }
+};
+