xref: /aosp_15_r20/external/executorch/backends/apple/mps/runtime/MPSDelegateHeader.mm (revision 523fa7a60841cd1ecfb9cc4201f1ca8b03ed023a)
1//
2//  Copyright (c) 2024 Apple Inc. All rights reserved.
3//  Provided subject to the LICENSE file in the top level directory.
4//
5
6#include <executorch/backends/apple/mps/runtime/MPSDelegateHeader.h>
7
8#include <cstring>
9
10#include <executorch/runtime/core/error.h>
11#include <executorch/runtime/core/result.h>
12
13namespace executorch {
14namespace backends {
15namespace mps {
16namespace delegate {
17
18using executorch::runtime::Error;
19using executorch::runtime::Result;
20
21/// Interprets the 8 bytes at `data` as a little-endian uint64_t.
22uint64_t getUInt64LE(const uint8_t* data) {
23  return (uint64_t)data[0] | ((uint64_t)data[1] << 8) |
24      ((uint64_t)data[2] << 16) | ((uint64_t)data[3] << 24) |
25      ((uint64_t)data[4] << 32) | ((uint64_t)data[5] << 40) |
26      ((uint64_t)data[6] << 48) | ((uint64_t)data[7] << 56);
27}
28
29Result<MPSDelegateHeader> MPSDelegateHeader::Parse(const void* data, size_t size) {
30  const uint8_t* header_data = (const uint8_t*)data;
31
32  if (size < MPSDelegateHeader::kMinSize) {
33    return Error::InvalidArgument;
34  }
35
36  const uint8_t* magic_start = header_data + MPSDelegateHeader::kMagicOffset;
37  if (std::memcmp(magic_start, MPSDelegateHeader::kMagic, MPSDelegateHeader::kMagicSize) != 0) {
38    return Error::NotFound;
39  }
40
41  uint64_t constant_data_offset = getUInt64LE(header_data + MPSDelegateHeader::kConstantDataSegmentOffset);
42  uint64_t constant_data_size = getUInt64LE(header_data + MPSDelegateHeader::kConstantDataSizeOffset);
43  uint64_t flatbuffer_offset = MPSDelegateHeader::kFlatbufferDataOffsetOffset;
44  uint64_t flatbuffer_size = size - flatbuffer_offset;
45
46  return MPSDelegateHeader{
47      constant_data_offset,
48      constant_data_size,
49      flatbuffer_offset,
50      flatbuffer_size};
51}
52
53} // namespace delegate
54} // namespace mps
55} // namespace backends
56} // namespace executorch
57