xref: /aosp_15_r20/external/executorch/schema/extended_header.h (revision 523fa7a60841cd1ecfb9cc4201f1ca8b03ed023a)
1*523fa7a6SAndroid Build Coastguard Worker /*
2*523fa7a6SAndroid Build Coastguard Worker  * Copyright (c) Meta Platforms, Inc. and affiliates.
3*523fa7a6SAndroid Build Coastguard Worker  * All rights reserved.
4*523fa7a6SAndroid Build Coastguard Worker  *
5*523fa7a6SAndroid Build Coastguard Worker  * This source code is licensed under the BSD-style license found in the
6*523fa7a6SAndroid Build Coastguard Worker  * LICENSE file in the root directory of this source tree.
7*523fa7a6SAndroid Build Coastguard Worker  */
8*523fa7a6SAndroid Build Coastguard Worker 
9*523fa7a6SAndroid Build Coastguard Worker #pragma once
10*523fa7a6SAndroid Build Coastguard Worker 
11*523fa7a6SAndroid Build Coastguard Worker #include <executorch/runtime/core/result.h>
12*523fa7a6SAndroid Build Coastguard Worker 
13*523fa7a6SAndroid Build Coastguard Worker namespace executorch {
14*523fa7a6SAndroid Build Coastguard Worker namespace runtime {
15*523fa7a6SAndroid Build Coastguard Worker 
16*523fa7a6SAndroid Build Coastguard Worker /**
17*523fa7a6SAndroid Build Coastguard Worker  * An extended, ExecuTorch-specific header that may be embedded in the
18*523fa7a6SAndroid Build Coastguard Worker  * serialized Program data header.
19*523fa7a6SAndroid Build Coastguard Worker  *
20*523fa7a6SAndroid Build Coastguard Worker  * For details see //executorch/docs/source/pte-file-format.md
21*523fa7a6SAndroid Build Coastguard Worker  */
22*523fa7a6SAndroid Build Coastguard Worker struct ExtendedHeader {
23*523fa7a6SAndroid Build Coastguard Worker   /**
24*523fa7a6SAndroid Build Coastguard Worker    * To find the header, callers should provide at least this many bytes of the
25*523fa7a6SAndroid Build Coastguard Worker    * head of the serialized Program data.
26*523fa7a6SAndroid Build Coastguard Worker    */
27*523fa7a6SAndroid Build Coastguard Worker   static constexpr size_t kNumHeadBytes = 64;
28*523fa7a6SAndroid Build Coastguard Worker 
29*523fa7a6SAndroid Build Coastguard Worker   /**
30*523fa7a6SAndroid Build Coastguard Worker    * The offset into the Program serialized program data where the extended
31*523fa7a6SAndroid Build Coastguard Worker    * header should begin.
32*523fa7a6SAndroid Build Coastguard Worker    */
33*523fa7a6SAndroid Build Coastguard Worker   static constexpr size_t kHeaderOffset = 8;
34*523fa7a6SAndroid Build Coastguard Worker 
35*523fa7a6SAndroid Build Coastguard Worker   /**
36*523fa7a6SAndroid Build Coastguard Worker    * The magic bytes that identify the header.
37*523fa7a6SAndroid Build Coastguard Worker    *
38*523fa7a6SAndroid Build Coastguard Worker    * This is the canonical definition of the expected value. If the header
39*523fa7a6SAndroid Build Coastguard Worker    * layout ever changes in a compatibility-breaking way, increment the digits
40*523fa7a6SAndroid Build Coastguard Worker    * in the magic. But, doing so will prevent older binaries from recognizing
41*523fa7a6SAndroid Build Coastguard Worker    * the presence of the header. The compatibility-preserving way to make
42*523fa7a6SAndroid Build Coastguard Worker    * changes is to increase the header's length field and add new fields at the
43*523fa7a6SAndroid Build Coastguard Worker    * end.
44*523fa7a6SAndroid Build Coastguard Worker    */
45*523fa7a6SAndroid Build Coastguard Worker   static constexpr size_t kMagicSize = 4;
46*523fa7a6SAndroid Build Coastguard Worker   static constexpr char kMagic[kMagicSize] = {'e', 'h', '0', '0'};
47*523fa7a6SAndroid Build Coastguard Worker 
48*523fa7a6SAndroid Build Coastguard Worker   /**
49*523fa7a6SAndroid Build Coastguard Worker    * Look for and parse an ExtendedHeader in the provided data.
50*523fa7a6SAndroid Build Coastguard Worker    *
51*523fa7a6SAndroid Build Coastguard Worker    * @param[in] data The contents of the beginning of the serialized binary
52*523fa7a6SAndroid Build Coastguard Worker    *     Program data, starting at offset 0 (i.e., the head of the file).
53*523fa7a6SAndroid Build Coastguard Worker    * @param[in] size Length of `data` in bytes. Must be >= kNumHeadBytes or this
54*523fa7a6SAndroid Build Coastguard Worker    *     call will fail.
55*523fa7a6SAndroid Build Coastguard Worker    *
56*523fa7a6SAndroid Build Coastguard Worker    * @returns an ExtendedHeader if the header was found and is valid. Returns an
57*523fa7a6SAndroid Build Coastguard Worker    *     error if size was too short, if the header was not found, or if the
58*523fa7a6SAndroid Build Coastguard Worker    *     header appeared to be corrupt.
59*523fa7a6SAndroid Build Coastguard Worker    */
60*523fa7a6SAndroid Build Coastguard Worker   static Result<ExtendedHeader> Parse(const void* data, size_t size);
61*523fa7a6SAndroid Build Coastguard Worker 
62*523fa7a6SAndroid Build Coastguard Worker   /**
63*523fa7a6SAndroid Build Coastguard Worker    * The size in bytes of the Program flatbuffer data, starting from offset
64*523fa7a6SAndroid Build Coastguard Worker    * zero.
65*523fa7a6SAndroid Build Coastguard Worker    */
66*523fa7a6SAndroid Build Coastguard Worker   uint64_t program_size;
67*523fa7a6SAndroid Build Coastguard Worker 
68*523fa7a6SAndroid Build Coastguard Worker   /**
69*523fa7a6SAndroid Build Coastguard Worker    * The offset in bytes of the first segment, if present. Zero if no segment
70*523fa7a6SAndroid Build Coastguard Worker    * is present.
71*523fa7a6SAndroid Build Coastguard Worker    */
72*523fa7a6SAndroid Build Coastguard Worker   uint64_t segment_base_offset;
73*523fa7a6SAndroid Build Coastguard Worker };
74*523fa7a6SAndroid Build Coastguard Worker 
75*523fa7a6SAndroid Build Coastguard Worker } // namespace runtime
76*523fa7a6SAndroid Build Coastguard Worker } // namespace executorch
77