// Copyright 2019 The Cobalt Authors. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

#ifndef STARBOARD_ELF_LOADER_PROGRAM_TABLE_H_
#define STARBOARD_ELF_LOADER_PROGRAM_TABLE_H_

#include "starboard/elf_loader/elf.h"
#include "starboard/elf_loader/file.h"

namespace starboard {
namespace elf_loader {

// Loads the ELF's binary program table and memory maps
// the loadable segments.
//
// To properly initialize the program table and the segments
// the following calls are required:
//  1. LoadProgramHeader()
//  2. LoadSegments()
//
// After those calls the ProgramTable class is fully functional and
// the segments properly loaded.

class ProgramTable {
 public:
  ProgramTable();

  // Loads the program header.
  bool LoadProgramHeader(const Ehdr* elf_header, File* elf_file);

  // Loads the segments.
  bool LoadSegments(File* elf_file);

  // Retrieves the dynamic section table.
  void GetDynamicSection(Dyn** dynamic,
                         size_t* dynamic_count,
                         Word* dynamic_flags);

  // Adjusts the memory protection of read only segments.
  // This call is used to make text segments writable in order
  // to apply relocations. After the relocations are done the
  // protection is restored to its original read only state.
  int AdjustMemoryProtectionOfReadOnlySegments(int extra_prot_flags);

  // Reserves a contiguous block of memory, page aligned for mapping all
  // the segments of the binary.
  bool ReserveLoadMemory();

  // Retrieves the base load address for the binary.
  Addr GetBaseMemoryAddress();

  // Publish the memory mapping information of the library to
  // the EvergreenInfo API.
  void PublishEvergreenInfo(const char* file_path);

  ~ProgramTable();

 private:
  // Calculates the memory size of the binary.
  size_t GetLoadMemorySize();

 private:
  size_t phdr_num_;
  void* phdr_mmap_;
  Phdr* phdr_table_;
  Addr phdr_size_;

  // First page of reserved address space.
  void* load_start_;

  // Size in bytes of reserved address space.
  Addr load_size_;

  // The base memory address. All virtual addresses
  // from the ELF file are offsets from this address.
  Addr base_memory_address_;

  SB_DISALLOW_COPY_AND_ASSIGN(ProgramTable);
};

}  // namespace elf_loader
}  // namespace starboard

#endif  // STARBOARD_ELF_LOADER_PROGRAM_TABLE_H_
