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