1 /*  This file is part of the program psim.
2 
3     Copyright (C) 1994-1997, Andrew Cagney <cagney@highland.com.au>
4 
5     This program is free software; you can redistribute it and/or modify
6     it under the terms of the GNU General Public License as published by
7     the Free Software Foundation; either version 2 of the License, or
8     (at your option) any later version.
9 
10     This program is distributed in the hope that it will be useful,
11     but WITHOUT ANY WARRANTY; without even the implied warranty of
12     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13     GNU General Public License for more details.
14 
15     You should have received a copy of the GNU General Public License
16     along with this program; if not, write to the Free Software
17     Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
18 
19     */
20 
21 
22 #ifndef _DEBUG_H_
23 #define _DEBUG_H_
24 
25 #include "filter_filename.h"
26 
27 typedef enum {
28   trace_invalid,
29   trace_tbd,
30   /**/
31   trace_gdb,
32   trace_os_emul,
33   /**/
34   trace_events,
35   trace_device_tree,
36   trace_devices,
37   trace_binary_device,
38   trace_com_device,
39   trace_console_device,
40   trace_core_device,
41   trace_disk_device,
42   trace_eeprom_device,
43   trace_file_device,
44   trace_glue_device,
45   trace_halt_device,
46   trace_htab_device,
47   trace_icu_device,
48   trace_ide_device,
49   trace_memory_device,
50   trace_opic_device,
51   trace_pal_device,
52   trace_pass_device,
53   trace_phb_device,
54   trace_stack_device,
55   trace_register_device,
56   trace_vm_device,
57   /**/
58   trace_disklabel_package,
59   /**/
60   trace_semantics,
61   trace_idecode,
62   trace_alu,
63   trace_load_store,
64   trace_model,
65   /**/
66   trace_vm,
67   trace_core,
68   trace_interrupts,
69   trace_psim,
70   trace_device_init,
71   trace_cpu,
72   trace_breakpoint,
73   trace_opts,
74   trace_print_info,
75   trace_print_device_tree,
76   trace_dump_device_tree,
77   nr_trace_options
78 } trace_options;
79 
80 
81 
82 extern int ppc_trace[nr_trace_options];
83 
84 /* simple */
85 #define TRACE(OBJECT, ARGS) \
86 do { \
87   if (WITH_TRACE) { \
88     if (ppc_trace[OBJECT]) { \
89       printf_filtered("%s:%d: ", filter_filename(__FILE__), __LINE__); \
90       printf_filtered ARGS; \
91     } \
92   } \
93 } while (0)
94 
95 /* issue */
96 #define ITRACE(OBJECT, ARGS) \
97 do { \
98   if (WITH_TRACE) { \
99     if (ppc_trace[OBJECT]) { \
100       printf_filtered("%s:%d:0x%08lx:%s ", itable[MY_INDEX].file, itable[MY_INDEX].line_nr, (long)cia, itable[MY_INDEX].name); \
101       printf_filtered ARGS; \
102     } \
103   } \
104 } while (0)
105 
106 /* device */
107 #define DTRACE(OBJECT, ARGS) \
108 do { \
109   if (WITH_TRACE) { \
110     int trace_device = device_trace(me); \
111     if (ppc_trace[trace_devices] \
112 	|| ppc_trace[trace_##OBJECT##_device] \
113 	|| trace_device) { \
114       printf_filtered("%s:%d:%s:%s%s ", \
115 		      filter_filename(__FILE__), __LINE__, #OBJECT, \
116 		      trace_device ? device_path(me) : "", \
117 		      trace_device ? ":" : ""); \
118       printf_filtered ARGS; \
119     } \
120   } \
121 } while (0)
122 
123 /* device instance */
124 #define DITRACE(OBJECT, ARGS) \
125 do { \
126   if (WITH_TRACE) { \
127     device *me = device_instance_device(instance); \
128     int trace_device = device_trace(me); \
129     if (ppc_trace[trace_devices] \
130 	|| ppc_trace[trace_##OBJECT##_device] \
131 	|| trace_device) { \
132       printf_filtered("%s:%d:%s:%s%s ", \
133 		      filter_filename(__FILE__), __LINE__, #OBJECT, \
134 		      trace_device ? device_path(me) : "", \
135 		      trace_device ? ":" : ""); \
136       printf_filtered ARGS; \
137     } \
138   } \
139 } while (0)
140 
141 /* package */
142 #define PTRACE(OBJECT, ARGS) \
143 do { \
144   if (WITH_TRACE) { \
145     if (ppc_trace[trace_##OBJECT##_package]) { \
146       printf_filtered("%s:%d:%s: ", filter_filename(__FILE__), __LINE__, #OBJECT); \
147       printf_filtered ARGS; \
148     } \
149   } \
150 } while (0)
151 
152 
153 #define ASSERT(EXPRESSION) \
154 do { \
155   if (WITH_ASSERT) { \
156     if (!(EXPRESSION)) { \
157       error("%s:%d: assertion failed - %s\n", \
158 	    filter_filename(__FILE__), __LINE__, #EXPRESSION); \
159     } \
160   } \
161 } while (0)
162 
163 /* Parse OPTION updating the trace array */
164 extern void
165 trace_option(const char *option, int setting);
166 
167 /* Output the list of trace options */
168 extern void trace_usage
169 (int verbose);
170 
171 
172 #endif /* _DEBUG_H_ */
173