// Copyright 2016 The Fuchsia Authors
// Copyright (c) 2008-2012 Travis Geiselbrecht
//
// 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

#pragma once

#include <stddef.h>
#include <stdio.h>
#include <string.h>
#include <zircon/compiler.h>
#include <platform/debug.h>

#if !defined(LK_DEBUGLEVEL)
#define LK_DEBUGLEVEL 0
#endif

/* debug levels */
#define CRITICAL 0
#define ALWAYS 0
#define INFO 1
#define SPEW 2

__BEGIN_CDECLS

typedef int(hexdump_print_fn_t)(const char* fmt, ...);

#if !DISABLE_DEBUG_OUTPUT

/* dump memory */
void hexdump_very_ex(const void *ptr,
                     size_t len,
                     uint64_t disp_addr_start,
                     hexdump_print_fn_t* pfn);
void hexdump8_very_ex(const void *ptr,
                      size_t len,
                      uint64_t disp_addr_start,
                      hexdump_print_fn_t* pfn);

#else

/* Obtain the panic file descriptor. */
static inline FILE *get_panic_fd(void) { return NULL; }

/* dump memory */
static inline void hexdump_very_ex(const void *ptr,
                                   size_t len,
                                   uint64_t disp_addr_start,
                                   hexdump_print_fn_t* pfn) { }
static inline void hexdump8_very_ex(const void *ptr,
                                    size_t len,
                                    uint64_t disp_addr_start,
                                    hexdump_print_fn_t* pfn) { }

#endif /* DISABLE_DEBUG_OUTPUT */

static inline void hexdump_ex(const void *ptr, size_t len, uint64_t disp_addr_start)
{
    hexdump_very_ex(ptr, len, disp_addr_start, _printf);
}

static inline void hexdump8_ex(const void *ptr, size_t len, uint64_t disp_addr_start)
{
    hexdump8_very_ex(ptr, len, disp_addr_start, _printf);
}

static inline void hexdump(const void *ptr, size_t len)
{
    hexdump_ex(ptr, len, (uint64_t)((addr_t)ptr));
}

static inline void hexdump8(const void *ptr, size_t len)
{
    hexdump8_ex(ptr, len, (uint64_t)((addr_t)ptr));
}

#define dprintf(level, x...) do { if ((level) <= LK_DEBUGLEVEL) { printf(x); } } while (0)

/* systemwide halts */
void _panic(void *caller, void *frame, const char *fmt, ...) __PRINTFLIKE(3, 4) __NO_RETURN;

#define panic(x...) _panic(__GET_CALLER(), __GET_FRAME(), x)

void _panic_no_format(const char *msg, size_t len) __NO_RETURN;

__NO_RETURN static inline void panic_no_format(const char* msg) {
    _panic_no_format(msg, __builtin_strlen(msg));
}

#define PANIC_UNIMPLEMENTED panic("%s unimplemented\n", __PRETTY_FUNCTION__)

void __stack_chk_fail(void) __NO_RETURN;

uintptr_t choose_stack_guard(void);

/* spin the cpu for a period of (short) time */
void spin(uint32_t usecs);

/* spin the cpu for a certain number of cpu cycles */
void spin_cycles(uint32_t usecs);

__END_CDECLS
