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