// 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();

  ~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_
