1/**
2 * \file
3 * \brief Debugging functions
4 */
5
6/*
7 * Copyright (c) 2008, 2010, 2011, ETH Zurich.
8 * All rights reserved.
9 *
10 * This file is distributed under the terms in the attached LICENSE file.
11 * If you do not find this file, copies can be found by writing to:
12 * ETH Zurich D-INFK, Haldeneggsteig 4, CH-8092 Zurich. Attn: Systems Group.
13 */
14
15#ifndef BARRELFISH_DEBUG_H
16#define BARRELFISH_DEBUG_H
17
18#include <sys/cdefs.h>
19
20#include <errors/errno.h>
21#include <barrelfish/caddr.h>
22#include <stddef.h>
23#include <stdlib.h>
24#include <barrelfish_kpi/registers_arch.h>
25
26__BEGIN_DECLS
27
28struct capability;
29errval_t debug_cap_identify(struct capref cap, struct capability *ret);
30errval_t debug_dump_hw_ptables(void);
31errval_t debug_cap_trace_ctrl(uintptr_t types, genpaddr_t start_addr, gensize_t size);
32void debug_cspace(struct capref root);
33void debug_my_cspace(void);
34void debug_printf(const char *fmt, ...) __attribute__((format(printf, 1, 2)));
35int debug_print_cap(char *buf, size_t len, struct capability *cap);
36int debug_print_cap_at_capref(char *buf, size_t len, struct capref cap);
37int debug_print_capref(char *buf, size_t len, struct capref cap);
38int debug_print_cnoderef(char *buf, size_t len, struct cnoderef cnode);
39
40void debug_print_save_area(arch_registers_state_t *state);
41void debug_print_fpu_state(arch_registers_state_t *state);
42void debug_dump(arch_registers_state_t *state);
43void debug_call_chain(arch_registers_state_t *state);
44void debug_return_addresses(void);
45void debug_dump_mem_around_addr(lvaddr_t addr);
46void debug_dump_mem(lvaddr_t base, lvaddr_t limit, lvaddr_t point);
47
48void debug_err(const char *file, const char *func, int line,
49               errval_t err, const char *msg, ...);
50void user_panic_fn(const char *file, const char *func, int line,
51                   const char *msg, ...)
52    __attribute__((noreturn));
53
54#ifdef NDEBUG
55# define DEBUG_ERR(err, msg...) ((void)0)
56# define HERE ((void)0)
57#else
58# define DEBUG_ERR(err, msg...) debug_err(__FILE__, __func__, __LINE__, err, msg)
59# include <barrelfish/dispatch.h>
60# define HERE fprintf(stderr, "Disp %.*s.%u: %s, %s, %u\n", \
61                        DISP_NAME_LEN, disp_name(), disp_get_core_id(), \
62                      __FILE__, __func__, __LINE__)
63#endif
64
65/**
66 * \brief Prints out a string, errval and then aborts the domain
67 */
68#define USER_PANIC_ERR(err, msg...) do {               \
69    debug_err(__FILE__, __func__, __LINE__, err, msg); \
70    abort();                                           \
71} while (0)
72
73/**
74 * \brief Prints out a string and abort the domain
75 */
76#define USER_PANIC(msg...)                                 \
77    user_panic_fn(__FILE__, __func__, __LINE__, msg);      \
78
79__END_DECLS
80
81#endif //BARRELFISH_DEBUG_H
82