# Copyright 2020 The Fuchsia Authors
#
# Use of this source code is governed by a MIT-style
# license that can be found in the LICENSE file or at
# https://opensource.org/licenses/MIT

import("//build/config/zircon/standard.gni")
import("//build/toolchain/zircon/zircon_toolchain_suite.gni")
import("//build/unification/global_variables.gni")
import("//zircon/kernel/arch/$zircon_cpu/phys/phys.gni")
import("zbi_executable.gni")

if (current_toolchain == default_toolchain) {
  # Default toolchain (current_cpu == "") just defines the phys environment.
  # Note: see //zircon/kernel/arch/x86/phys:kernel.phys32 too.
  foreach(cpu, standard_fuchsia_cpus) {
    kernel_cpu = cpu
    if (kernel_cpu == "x64") {
      kernel_cpu = "x86"
    }

    zircon_toolchain_suite("kernel.phys_$cpu") {
      cpu = cpu
      os = "fuchsia"
      environment = "kernel.phys"
      with_shared = false

      toolchain_tags = [ "kernel" ]

      configs = [ "//zircon/kernel/phys:phys_config" ] + phys_configs

      # Always enable frame pointers. This works because frame_pointers
      # is added as part of :phys_config below.
      remove_common_configs = [ "//build/config/zircon:default_frame_pointers" ]

      exclude_variant_tags = [
        # There is no possibility of fancy runtimes like ASan for phys.
        "instrumentation-runtime",

        # TOOD(51994): Remove this when profile is supported.
        "instrumented",
      ]

      # Append the arch-specific lists.  The phys/phys.gni file in each
      # arch subdirectory defines phys_* lists to append to the parameters.
      toolchain_tags += phys_tags
      exclude_variant_tags += phys_exclude_variant_tags
    }
  }
} else if (toolchain.environment == "kernel.phys") {
  kernel_cpu = current_cpu
  if (current_cpu == "x64") {
    kernel_cpu = "x86"
  }

  config("phys_config") {
    configs = [
      "//zircon/kernel:standalone",
      "//zircon/kernel:warnings",
      "//zircon/kernel/arch/$kernel_cpu:abi",
      ":defines",

      # Don't emit extra code making static initializers thread-safe (we don't
      # have threads or any of the corresponding library support.)
      "//build/config/zircon:no_threadsafe_statics",

      # All physmem code is inherently sensitive and in a position for
      # any bug to be unusually dangerous.  So compile with minimal
      # undefined behavior checking in all builds, regardless of variant.
      "//build/config/zircon/instrumentation:ubsan-trap",
    ]

    # Always enable frame pointers.
    configs += [ "//build/config/zircon:frame_pointers" ]

    include_dirs = [ "include" ]
  }

  group("phys_config_deps") {
  }
}

if (toolchain.environment == "kernel.phys" ||
    toolchain.environment == "kernel.phys32") {
  # All the code gets built here in the phys environment.

  config("defines") {
    # Always enable tests and asserts in phys code.
    defines = [ "LK_DEBUGLEVEL=2" ]
  }

  config("includes") {
    include_dirs = [ "include" ]
  }

  config("load-pic") {
    # ZBI executables can be loaded anywhere, so they are linked at 0.
    ldflags = [ "-Wl,-defsym,PHYS_LOAD_ADDRESS=0" ]
  }

  source_set("symbolize") {
    public = [
      "include/phys/frame-pointer.h",
      "include/phys/stack.h",
      "include/phys/symbolize.h",
    ]

    sources = [
      "frame-pointer.cc",
      "panic.cc",
      "stack.cc",
      "symbolize.cc",
    ]

    deps = [
      "//zircon/kernel/arch/$zircon_cpu/phys",
      "//zircon/kernel/lib/ktl",
      "//zircon/kernel/lib/libc",
    ]

    public_deps = [
      # "symbolize.h" has #include <phys/main.h>.
      ":main",
    ]

    public_configs = [ ":includes" ]
  }

  # This is used implicitly by phys_executable() targets,
  # including zbi_executable() targets.
  source_set("phys_executable.deps") {
    deps = [ ":symbolize" ]
  }

  # This is used implicitly by zbi_executable() targets.
  source_set("zbi_executable.deps") {
    sources = [
      "zbi-header.S",
      "zbi-main.cc",
    ]
    deps = [
      ":arch-header",
      ":main",
      ":zbi-memory",
      "//zircon/kernel/arch/$zircon_cpu/phys",
      "//zircon/kernel/lib/arch",
      "//zircon/kernel/lib/boot-options",
      "//zircon/system/ulib/uart",
      "//zircon/system/ulib/zbitl",
    ]
  }

  # Transitive dependencies for the <phys/main.h> header.
  source_set("main") {
    public = [ "include/phys/main.h" ]

    public_configs = [ ":includes" ]

    public_deps = [
      # "main.h" has #include <lib/arch/ticks.h>.
      "//zircon/kernel/lib/arch",
    ]

    # If the toolchain is compiling a PIE executable, include required libraries.
    if (toolchain.tags + [ "static-pie" ] - [ "static-pie" ] !=
        toolchain.tags) {
      public_deps += [
        # "main.h" has #include <lib/static-pie/static-pie.h>
        "//zircon/system/ulib/static-pie",
      ]
    }
  }

  # Transitive dependencies for the <phys/arch.h> header.
  source_set("arch-header") {
    public = [ "include/phys/arch.h" ]

    public_configs = [ ":includes" ]

    public_deps = [
      "//zircon/kernel/lib/libc",
      "//zircon/kernel/phys/lib/memalloc",
      "//zircon/system/ulib/zbitl",
    ]
  }

  # This is linked into the special-case phys_executable() tests that
  # are run directly as QEMU kernels.
  source_set("qemu-header") {
    sources = [ "qemu-header.S" ]
    public_configs = [ "//zircon/kernel/arch/$zircon_cpu/phys:qemu.config" ]
  }

  source_set("allocation") {
    public = [ "include/phys/allocation.h" ]
    sources = [ "allocation.cc" ]
    deps = [
      ":main",
      "//zircon/kernel/phys/lib/memalloc",
    ]
    public_deps = [
      "//zircon/kernel/lib/ktl",
      "//zircon/kernel/lib/libc",

      # allocation.h has #include <fbl/alloc_checker.h>.
      "//zircon/system/ulib/fbl",

      # allocation.h has #include <lib/fitx/result.h>.
      "//zircon/system/ulib/zxc",
    ]
    public_configs = [ ":includes" ]
  }

  source_set("zbitl-allocation") {
    public = [ "include/phys/zbitl-allocation.h" ]
    sources = [ "zbitl-allocation.cc" ]
    deps = [
      ":allocation",
      "//zircon/system/ulib/fbl",
    ]
    public_deps = [
      "//zircon/kernel/lib/ktl",
      "//zircon/kernel/lib/libc",

      # zbitl-allocation.h has #include <lib/fitx/result.h>.
      "//zircon/system/ulib/zxc",
    ]
    public_configs = [ ":includes" ]
  }

  # This is a little library instead of a source_set() so it can be included
  # implicitly by zbi_executable() without adding bloat to the tiny tests that
  # don't use it.
  static_library("zbi-memory") {
    sources = [ "zbi-memory.cc" ]
    deps = [
      ":allocation",
      ":arch-header",
      ":main",
      "//zircon/kernel/arch/$zircon_cpu/phys:address-space",
      "//zircon/kernel/lib/arch",
      "//zircon/kernel/phys/lib/memalloc",
      "//zircon/kernel/phys/lib/page-table",
      "//zircon/system/ulib/zbitl",
    ]
    public_deps = [
      "//zircon/kernel/lib/ktl",
      "//zircon/kernel/lib/libc",

      # allocation.h has #include <fbl/alloc_checker.h>.
      "//zircon/system/ulib/fbl",
    ]
  }

  source_set("boot-zbi") {
    public = [ "include/phys/boot-zbi.h" ]
    sources = [ "boot-zbi.cc" ]
    public_deps = [
      ":allocation",
      ":symbolize",
      "//zircon/kernel/lib/arch",
      "//zircon/kernel/lib/ktl",
      "//zircon/kernel/lib/libc",
      "//zircon/system/ulib/pretty",
      "//zircon/system/ulib/zbitl",
      "//zircon/system/ulib/zxc",
    ]
  }
}

group("tests") {
  testonly = true
  deps = [
    "boot-shim:tests",
    "lib:tests",
    "test",
    "//zircon/kernel/arch/$zircon_cpu/phys:tests",
  ]
}

zbi_executable("physboot") {
  sources = [ "physboot.cc" ]
  deps = [
    ":allocation",
    ":boot-zbi",
    ":main",
    ":symbolize",
    ":zbitl-allocation",
    "//zircon/kernel/lib/arch",
    "//zircon/kernel/lib/boot-options",
    "//zircon/kernel/lib/ktl",
    "//zircon/kernel/lib/libc",
    "//zircon/system/ulib/pretty",
    "//zircon/system/ulib/zbitl",
  ]
}
