aboutsummaryrefslogtreecommitdiff
#include <kapi/cpu.hpp>

#include <arch/cpu/initialization.hpp>

#include <kapi/system.hpp>

#include <atomic>

namespace kapi::cpu
{

  auto init() -> void
  {
    auto static constinit is_initialized = std::atomic_flag{};

    if (is_initialized.test_and_set())
    {
      system::panic("[x86_64] CPU has already been initialized.");
    }

    arch::cpu::initialize_descriptors();
    arch::cpu::initialize_legacy_interrupts();
  }

  auto halt() -> void
  {
    asm volatile("1: hlt\njmp 1b");
    __builtin_unreachable();
  }

  auto current_id() -> id
  {
    // TODO: implement actual ID reading once APs are being set up.
    return id{.value = 0};
  }

}  // namespace kapi::cpu