// 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

#include <stdio.h>
#include <zircon/assert.h>

#include <phys/frame-pointer.h>
#include <phys/main.h>
#include <phys/stack.h>
#include <phys/symbolize.h>

// This is what ZX_ASSERT calls.
PHYS_SINGLETHREAD void __zx_panic(const char* format, ...) {
  // Print the message.
  va_list args;
  va_start(args, format);
  vprintf(format, args);
  va_end(args);

  // Now print the backtrace and stack dump.

  FramePointer frame_pointer_backtrace = FramePointer::BackTrace();

  uintptr_t scsp = GetShadowCallStackPointer();
  ShadowCallStackBacktrace shadow_call_stack_backtrace = boot_shadow_call_stack.BackTrace(scsp);
  if (shadow_call_stack_backtrace.empty()) {
    shadow_call_stack_backtrace = phys_exception_shadow_call_stack.BackTrace(scsp);
  }

  if (gSymbolize) {
    gSymbolize->PrintBacktraces(frame_pointer_backtrace, shadow_call_stack_backtrace);

    uintptr_t sp = reinterpret_cast<uintptr_t>(__builtin_frame_address(0));
    gSymbolize->PrintStack(sp);
  }

  // Now crash.
  ArchPanicReset();
}
