// Copyright 2018 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef SYSROOT_ZIRCON_BOOT_BOOTFS_H_
#define SYSROOT_ZIRCON_BOOT_BOOTFS_H_

// Local modification for Estelle. See lib/fuchsia/README.estelle.md.
#include <common.h>  // <stdint.h>

// The payload (after decompression) of an item in BOOTFS format consists
// of separate "file" images that are each aligned to ZBI_BOOTFS_PAGE_SIZE
// bytes from the beginning of the item payload.  The first "file" consists
// of a zbi_bootfs_header_t followed by directory entries.
#define ZBI_BOOTFS_PAGE_SIZE (4096u)

#define ZBI_BOOTFS_PAGE_ALIGN(size) \
  (((size) + ZBI_BOOTFS_PAGE_SIZE - 1) & ~(ZBI_BOOTFS_PAGE_SIZE - 1))

typedef struct {
  // Must be ZBI_BOOTFS_MAGIC.
  uint32_t magic;

  // Size in bytes of all the directory entries.
  // Does not include the size of the zbi_bootfs_header_t.
  uint32_t dirsize;

  // Reserved for future use.  Set to 0.
  uint32_t reserved0;
  uint32_t reserved1;
} zbi_bootfs_header_t;

// LSW of sha256("bootfs")
#define ZBI_BOOTFS_MAGIC (0xa56d3ff9)

// Each directory entry holds a pathname and gives the offset and size
// of the contents of the file by that name.
typedef struct {
  // Length of the name[] field at the end.  This length includes the
  // NUL terminator, which must be present, but does not include any
  // alignment padding required before the next directory entry.
  uint32_t name_len;

  // Length of the file in bytes.  This is an exact size that is not
  // rounded, though the file is always padded with zeros up to a
  // multiple of ZBI_BOOTFS_PAGE_SIZE.
  uint32_t data_len;

  // Offset from the beginning of the payload (zbi_bootfs_header_t) to
  // the file's data.  This must be a multiple of ZBI_BOOTFS_PAGE_SIZE.
  uint32_t data_off;

  // Pathname of the file, a UTF-8 string.  This must include a NUL
  // terminator at the end.  It must not begin with a '/', but it may
  // contain '/' separators for subdirectories.
  char name[];
} zbi_bootfs_dirent_t;

// Each directory entry has a variable size of [16,268] bytes that
// must be a multiple of 4 bytes.
#define ZBI_BOOTFS_DIRENT_SIZE(name_len) \
  ((sizeof(zbi_bootfs_dirent_t) + (name_len) + 3) & -(size_t)4)

// zbi_bootfs_dirent_t.name_len must be > 1 and <= ZBI_BOOTFS_MAX_NAME_LEN.
#define ZBI_BOOTFS_MAX_NAME_LEN (256)

#endif  // SYSROOT_ZIRCON_BOOT_BOOTFS_H_
