1*4882a593Smuzhiyun /* 2*4882a593Smuzhiyun * Copyright © 2011-2016 Intel Corporation 3*4882a593Smuzhiyun * 4*4882a593Smuzhiyun * Permission is hereby granted, free of charge, to any person obtaining a 5*4882a593Smuzhiyun * copy of this software and associated documentation files (the "Software"), 6*4882a593Smuzhiyun * to deal in the Software without restriction, including without limitation 7*4882a593Smuzhiyun * the rights to use, copy, modify, merge, publish, distribute, sublicense, 8*4882a593Smuzhiyun * and/or sell copies of the Software, and to permit persons to whom the 9*4882a593Smuzhiyun * Software is furnished to do so, subject to the following conditions: 10*4882a593Smuzhiyun * 11*4882a593Smuzhiyun * The above copyright notice and this permission notice (including the next 12*4882a593Smuzhiyun * paragraph) shall be included in all copies or substantial portions of the 13*4882a593Smuzhiyun * Software. 14*4882a593Smuzhiyun * 15*4882a593Smuzhiyun * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16*4882a593Smuzhiyun * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17*4882a593Smuzhiyun * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 18*4882a593Smuzhiyun * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19*4882a593Smuzhiyun * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 20*4882a593Smuzhiyun * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS 21*4882a593Smuzhiyun * IN THE SOFTWARE. 22*4882a593Smuzhiyun * 23*4882a593Smuzhiyun * Authors: 24*4882a593Smuzhiyun * Jike Song <jike.song@intel.com> 25*4882a593Smuzhiyun * 26*4882a593Smuzhiyun * Contributors: 27*4882a593Smuzhiyun * Zhi Wang <zhi.a.wang@intel.com> 28*4882a593Smuzhiyun * 29*4882a593Smuzhiyun */ 30*4882a593Smuzhiyun 31*4882a593Smuzhiyun #if !defined(_GVT_TRACE_H_) || defined(TRACE_HEADER_MULTI_READ) 32*4882a593Smuzhiyun #define _GVT_TRACE_H_ 33*4882a593Smuzhiyun 34*4882a593Smuzhiyun #include <linux/types.h> 35*4882a593Smuzhiyun #include <linux/stringify.h> 36*4882a593Smuzhiyun #include <linux/tracepoint.h> 37*4882a593Smuzhiyun #include <asm/tsc.h> 38*4882a593Smuzhiyun 39*4882a593Smuzhiyun #undef TRACE_SYSTEM 40*4882a593Smuzhiyun #define TRACE_SYSTEM gvt 41*4882a593Smuzhiyun 42*4882a593Smuzhiyun TRACE_EVENT(spt_alloc, 43*4882a593Smuzhiyun TP_PROTO(int id, void *spt, int type, unsigned long mfn, 44*4882a593Smuzhiyun unsigned long gpt_gfn), 45*4882a593Smuzhiyun 46*4882a593Smuzhiyun TP_ARGS(id, spt, type, mfn, gpt_gfn), 47*4882a593Smuzhiyun 48*4882a593Smuzhiyun TP_STRUCT__entry( 49*4882a593Smuzhiyun __field(int, id) 50*4882a593Smuzhiyun __field(void *, spt) 51*4882a593Smuzhiyun __field(int, type) 52*4882a593Smuzhiyun __field(unsigned long, mfn) 53*4882a593Smuzhiyun __field(unsigned long, gpt_gfn) 54*4882a593Smuzhiyun ), 55*4882a593Smuzhiyun 56*4882a593Smuzhiyun TP_fast_assign( 57*4882a593Smuzhiyun __entry->id = id; 58*4882a593Smuzhiyun __entry->spt = spt; 59*4882a593Smuzhiyun __entry->type = type; 60*4882a593Smuzhiyun __entry->mfn = mfn; 61*4882a593Smuzhiyun __entry->gpt_gfn = gpt_gfn; 62*4882a593Smuzhiyun ), 63*4882a593Smuzhiyun 64*4882a593Smuzhiyun TP_printk("VM%d [alloc] spt %p type %d mfn 0x%lx gfn 0x%lx\n", 65*4882a593Smuzhiyun __entry->id, 66*4882a593Smuzhiyun __entry->spt, 67*4882a593Smuzhiyun __entry->type, 68*4882a593Smuzhiyun __entry->mfn, 69*4882a593Smuzhiyun __entry->gpt_gfn) 70*4882a593Smuzhiyun ); 71*4882a593Smuzhiyun 72*4882a593Smuzhiyun TRACE_EVENT(spt_free, 73*4882a593Smuzhiyun TP_PROTO(int id, void *spt, int type), 74*4882a593Smuzhiyun 75*4882a593Smuzhiyun TP_ARGS(id, spt, type), 76*4882a593Smuzhiyun 77*4882a593Smuzhiyun TP_STRUCT__entry( 78*4882a593Smuzhiyun __field(int, id) 79*4882a593Smuzhiyun __field(void *, spt) 80*4882a593Smuzhiyun __field(int, type) 81*4882a593Smuzhiyun ), 82*4882a593Smuzhiyun 83*4882a593Smuzhiyun TP_fast_assign( 84*4882a593Smuzhiyun __entry->id = id; 85*4882a593Smuzhiyun __entry->spt = spt; 86*4882a593Smuzhiyun __entry->type = type; 87*4882a593Smuzhiyun ), 88*4882a593Smuzhiyun 89*4882a593Smuzhiyun TP_printk("VM%u [free] spt %p type %d\n", 90*4882a593Smuzhiyun __entry->id, 91*4882a593Smuzhiyun __entry->spt, 92*4882a593Smuzhiyun __entry->type) 93*4882a593Smuzhiyun ); 94*4882a593Smuzhiyun 95*4882a593Smuzhiyun #define MAX_BUF_LEN 256 96*4882a593Smuzhiyun 97*4882a593Smuzhiyun TRACE_EVENT(gma_index, 98*4882a593Smuzhiyun TP_PROTO(const char *prefix, unsigned long gma, 99*4882a593Smuzhiyun unsigned long index), 100*4882a593Smuzhiyun 101*4882a593Smuzhiyun TP_ARGS(prefix, gma, index), 102*4882a593Smuzhiyun 103*4882a593Smuzhiyun TP_STRUCT__entry( 104*4882a593Smuzhiyun __array(char, buf, MAX_BUF_LEN) 105*4882a593Smuzhiyun ), 106*4882a593Smuzhiyun 107*4882a593Smuzhiyun TP_fast_assign( 108*4882a593Smuzhiyun snprintf(__entry->buf, MAX_BUF_LEN, 109*4882a593Smuzhiyun "%s gma 0x%lx index 0x%lx\n", prefix, gma, index); 110*4882a593Smuzhiyun ), 111*4882a593Smuzhiyun 112*4882a593Smuzhiyun TP_printk("%s", __entry->buf) 113*4882a593Smuzhiyun ); 114*4882a593Smuzhiyun 115*4882a593Smuzhiyun TRACE_EVENT(gma_translate, 116*4882a593Smuzhiyun TP_PROTO(int id, char *type, int ring_id, int root_entry_type, 117*4882a593Smuzhiyun unsigned long gma, unsigned long gpa), 118*4882a593Smuzhiyun 119*4882a593Smuzhiyun TP_ARGS(id, type, ring_id, root_entry_type, gma, gpa), 120*4882a593Smuzhiyun 121*4882a593Smuzhiyun TP_STRUCT__entry( 122*4882a593Smuzhiyun __array(char, buf, MAX_BUF_LEN) 123*4882a593Smuzhiyun ), 124*4882a593Smuzhiyun 125*4882a593Smuzhiyun TP_fast_assign( 126*4882a593Smuzhiyun snprintf(__entry->buf, MAX_BUF_LEN, 127*4882a593Smuzhiyun "VM%d %s ring %d root_entry_type %d gma 0x%lx -> gpa 0x%lx\n", 128*4882a593Smuzhiyun id, type, ring_id, root_entry_type, gma, gpa); 129*4882a593Smuzhiyun ), 130*4882a593Smuzhiyun 131*4882a593Smuzhiyun TP_printk("%s", __entry->buf) 132*4882a593Smuzhiyun ); 133*4882a593Smuzhiyun 134*4882a593Smuzhiyun TRACE_EVENT(spt_refcount, 135*4882a593Smuzhiyun TP_PROTO(int id, char *action, void *spt, int before, int after), 136*4882a593Smuzhiyun 137*4882a593Smuzhiyun TP_ARGS(id, action, spt, before, after), 138*4882a593Smuzhiyun 139*4882a593Smuzhiyun TP_STRUCT__entry( 140*4882a593Smuzhiyun __array(char, buf, MAX_BUF_LEN) 141*4882a593Smuzhiyun ), 142*4882a593Smuzhiyun 143*4882a593Smuzhiyun TP_fast_assign( 144*4882a593Smuzhiyun snprintf(__entry->buf, MAX_BUF_LEN, 145*4882a593Smuzhiyun "VM%d [%s] spt %p before %d -> after %d\n", 146*4882a593Smuzhiyun id, action, spt, before, after); 147*4882a593Smuzhiyun ), 148*4882a593Smuzhiyun 149*4882a593Smuzhiyun TP_printk("%s", __entry->buf) 150*4882a593Smuzhiyun ); 151*4882a593Smuzhiyun 152*4882a593Smuzhiyun TRACE_EVENT(spt_change, 153*4882a593Smuzhiyun TP_PROTO(int id, char *action, void *spt, unsigned long gfn, 154*4882a593Smuzhiyun int type), 155*4882a593Smuzhiyun 156*4882a593Smuzhiyun TP_ARGS(id, action, spt, gfn, type), 157*4882a593Smuzhiyun 158*4882a593Smuzhiyun TP_STRUCT__entry( 159*4882a593Smuzhiyun __array(char, buf, MAX_BUF_LEN) 160*4882a593Smuzhiyun ), 161*4882a593Smuzhiyun 162*4882a593Smuzhiyun TP_fast_assign( 163*4882a593Smuzhiyun snprintf(__entry->buf, MAX_BUF_LEN, 164*4882a593Smuzhiyun "VM%d [%s] spt %p gfn 0x%lx type %d\n", 165*4882a593Smuzhiyun id, action, spt, gfn, type); 166*4882a593Smuzhiyun ), 167*4882a593Smuzhiyun 168*4882a593Smuzhiyun TP_printk("%s", __entry->buf) 169*4882a593Smuzhiyun ); 170*4882a593Smuzhiyun 171*4882a593Smuzhiyun TRACE_EVENT(spt_guest_change, 172*4882a593Smuzhiyun TP_PROTO(int id, const char *tag, void *spt, int type, u64 v, 173*4882a593Smuzhiyun unsigned long index), 174*4882a593Smuzhiyun 175*4882a593Smuzhiyun TP_ARGS(id, tag, spt, type, v, index), 176*4882a593Smuzhiyun 177*4882a593Smuzhiyun TP_STRUCT__entry( 178*4882a593Smuzhiyun __array(char, buf, MAX_BUF_LEN) 179*4882a593Smuzhiyun ), 180*4882a593Smuzhiyun 181*4882a593Smuzhiyun TP_fast_assign( 182*4882a593Smuzhiyun snprintf(__entry->buf, MAX_BUF_LEN, 183*4882a593Smuzhiyun "VM%d [%s] spt %p type %d entry 0x%llx index 0x%lx\n", 184*4882a593Smuzhiyun id, tag, spt, type, v, index); 185*4882a593Smuzhiyun ), 186*4882a593Smuzhiyun 187*4882a593Smuzhiyun TP_printk("%s", __entry->buf) 188*4882a593Smuzhiyun ); 189*4882a593Smuzhiyun 190*4882a593Smuzhiyun TRACE_EVENT(oos_change, 191*4882a593Smuzhiyun TP_PROTO(int id, const char *tag, int page_id, void *gpt, int type), 192*4882a593Smuzhiyun 193*4882a593Smuzhiyun TP_ARGS(id, tag, page_id, gpt, type), 194*4882a593Smuzhiyun 195*4882a593Smuzhiyun TP_STRUCT__entry( 196*4882a593Smuzhiyun __array(char, buf, MAX_BUF_LEN) 197*4882a593Smuzhiyun ), 198*4882a593Smuzhiyun 199*4882a593Smuzhiyun TP_fast_assign( 200*4882a593Smuzhiyun snprintf(__entry->buf, MAX_BUF_LEN, 201*4882a593Smuzhiyun "VM%d [oos %s] page id %d gpt %p type %d\n", 202*4882a593Smuzhiyun id, tag, page_id, gpt, type); 203*4882a593Smuzhiyun ), 204*4882a593Smuzhiyun 205*4882a593Smuzhiyun TP_printk("%s", __entry->buf) 206*4882a593Smuzhiyun ); 207*4882a593Smuzhiyun 208*4882a593Smuzhiyun TRACE_EVENT(oos_sync, 209*4882a593Smuzhiyun TP_PROTO(int id, int page_id, void *gpt, int type, u64 v, 210*4882a593Smuzhiyun unsigned long index), 211*4882a593Smuzhiyun 212*4882a593Smuzhiyun TP_ARGS(id, page_id, gpt, type, v, index), 213*4882a593Smuzhiyun 214*4882a593Smuzhiyun TP_STRUCT__entry( 215*4882a593Smuzhiyun __array(char, buf, MAX_BUF_LEN) 216*4882a593Smuzhiyun ), 217*4882a593Smuzhiyun 218*4882a593Smuzhiyun TP_fast_assign( 219*4882a593Smuzhiyun snprintf(__entry->buf, MAX_BUF_LEN, 220*4882a593Smuzhiyun "VM%d [oos sync] page id %d gpt %p type %d entry 0x%llx index 0x%lx\n", 221*4882a593Smuzhiyun id, page_id, gpt, type, v, index); 222*4882a593Smuzhiyun ), 223*4882a593Smuzhiyun 224*4882a593Smuzhiyun TP_printk("%s", __entry->buf) 225*4882a593Smuzhiyun ); 226*4882a593Smuzhiyun 227*4882a593Smuzhiyun #define GVT_CMD_STR_LEN 40 228*4882a593Smuzhiyun TRACE_EVENT(gvt_command, 229*4882a593Smuzhiyun TP_PROTO(u8 vgpu_id, u8 ring_id, u32 ip_gma, u32 *cmd_va, 230*4882a593Smuzhiyun u32 cmd_len, u32 buf_type, u32 buf_addr_type, 231*4882a593Smuzhiyun void *workload, const char *cmd_name), 232*4882a593Smuzhiyun 233*4882a593Smuzhiyun TP_ARGS(vgpu_id, ring_id, ip_gma, cmd_va, cmd_len, buf_type, 234*4882a593Smuzhiyun buf_addr_type, workload, cmd_name), 235*4882a593Smuzhiyun 236*4882a593Smuzhiyun TP_STRUCT__entry( 237*4882a593Smuzhiyun __field(u8, vgpu_id) 238*4882a593Smuzhiyun __field(u8, ring_id) 239*4882a593Smuzhiyun __field(u32, ip_gma) 240*4882a593Smuzhiyun __field(u32, buf_type) 241*4882a593Smuzhiyun __field(u32, buf_addr_type) 242*4882a593Smuzhiyun __field(u32, cmd_len) 243*4882a593Smuzhiyun __field(void*, workload) 244*4882a593Smuzhiyun __dynamic_array(u32, raw_cmd, cmd_len) 245*4882a593Smuzhiyun __array(char, cmd_name, GVT_CMD_STR_LEN) 246*4882a593Smuzhiyun ), 247*4882a593Smuzhiyun 248*4882a593Smuzhiyun TP_fast_assign( 249*4882a593Smuzhiyun __entry->vgpu_id = vgpu_id; 250*4882a593Smuzhiyun __entry->ring_id = ring_id; 251*4882a593Smuzhiyun __entry->ip_gma = ip_gma; 252*4882a593Smuzhiyun __entry->buf_type = buf_type; 253*4882a593Smuzhiyun __entry->buf_addr_type = buf_addr_type; 254*4882a593Smuzhiyun __entry->cmd_len = cmd_len; 255*4882a593Smuzhiyun __entry->workload = workload; 256*4882a593Smuzhiyun snprintf(__entry->cmd_name, GVT_CMD_STR_LEN, "%s", cmd_name); 257*4882a593Smuzhiyun memcpy(__get_dynamic_array(raw_cmd), cmd_va, cmd_len * sizeof(*cmd_va)); 258*4882a593Smuzhiyun ), 259*4882a593Smuzhiyun 260*4882a593Smuzhiyun 261*4882a593Smuzhiyun TP_printk("vgpu%d ring %d: address_type %u, buf_type %u, ip_gma %08x,cmd (name=%s,len=%u,raw cmd=%s), workload=%p\n", 262*4882a593Smuzhiyun __entry->vgpu_id, 263*4882a593Smuzhiyun __entry->ring_id, 264*4882a593Smuzhiyun __entry->buf_addr_type, 265*4882a593Smuzhiyun __entry->buf_type, 266*4882a593Smuzhiyun __entry->ip_gma, 267*4882a593Smuzhiyun __entry->cmd_name, 268*4882a593Smuzhiyun __entry->cmd_len, 269*4882a593Smuzhiyun __print_array(__get_dynamic_array(raw_cmd), 270*4882a593Smuzhiyun __entry->cmd_len, 4), 271*4882a593Smuzhiyun __entry->workload) 272*4882a593Smuzhiyun ); 273*4882a593Smuzhiyun 274*4882a593Smuzhiyun #define GVT_TEMP_STR_LEN 10 275*4882a593Smuzhiyun TRACE_EVENT(write_ir, 276*4882a593Smuzhiyun TP_PROTO(int id, char *reg_name, unsigned int reg, unsigned int new_val, 277*4882a593Smuzhiyun unsigned int old_val, bool changed), 278*4882a593Smuzhiyun 279*4882a593Smuzhiyun TP_ARGS(id, reg_name, reg, new_val, old_val, changed), 280*4882a593Smuzhiyun 281*4882a593Smuzhiyun TP_STRUCT__entry( 282*4882a593Smuzhiyun __field(int, id) 283*4882a593Smuzhiyun __array(char, buf, GVT_TEMP_STR_LEN) 284*4882a593Smuzhiyun __field(unsigned int, reg) 285*4882a593Smuzhiyun __field(unsigned int, new_val) 286*4882a593Smuzhiyun __field(unsigned int, old_val) 287*4882a593Smuzhiyun __field(bool, changed) 288*4882a593Smuzhiyun ), 289*4882a593Smuzhiyun 290*4882a593Smuzhiyun TP_fast_assign( 291*4882a593Smuzhiyun __entry->id = id; 292*4882a593Smuzhiyun snprintf(__entry->buf, GVT_TEMP_STR_LEN, "%s", reg_name); 293*4882a593Smuzhiyun __entry->reg = reg; 294*4882a593Smuzhiyun __entry->new_val = new_val; 295*4882a593Smuzhiyun __entry->old_val = old_val; 296*4882a593Smuzhiyun __entry->changed = changed; 297*4882a593Smuzhiyun ), 298*4882a593Smuzhiyun 299*4882a593Smuzhiyun TP_printk("VM%u write [%s] %x, new %08x, old %08x, changed %08x\n", 300*4882a593Smuzhiyun __entry->id, __entry->buf, __entry->reg, __entry->new_val, 301*4882a593Smuzhiyun __entry->old_val, __entry->changed) 302*4882a593Smuzhiyun ); 303*4882a593Smuzhiyun 304*4882a593Smuzhiyun TRACE_EVENT(propagate_event, 305*4882a593Smuzhiyun TP_PROTO(int id, const char *irq_name, int bit), 306*4882a593Smuzhiyun 307*4882a593Smuzhiyun TP_ARGS(id, irq_name, bit), 308*4882a593Smuzhiyun 309*4882a593Smuzhiyun TP_STRUCT__entry( 310*4882a593Smuzhiyun __field(int, id) 311*4882a593Smuzhiyun __array(char, buf, GVT_TEMP_STR_LEN) 312*4882a593Smuzhiyun __field(int, bit) 313*4882a593Smuzhiyun ), 314*4882a593Smuzhiyun 315*4882a593Smuzhiyun TP_fast_assign( 316*4882a593Smuzhiyun __entry->id = id; 317*4882a593Smuzhiyun snprintf(__entry->buf, GVT_TEMP_STR_LEN, "%s", irq_name); 318*4882a593Smuzhiyun __entry->bit = bit; 319*4882a593Smuzhiyun ), 320*4882a593Smuzhiyun 321*4882a593Smuzhiyun TP_printk("Set bit (%d) for (%s) for vgpu (%d)\n", 322*4882a593Smuzhiyun __entry->bit, __entry->buf, __entry->id) 323*4882a593Smuzhiyun ); 324*4882a593Smuzhiyun 325*4882a593Smuzhiyun TRACE_EVENT(inject_msi, 326*4882a593Smuzhiyun TP_PROTO(int id, unsigned int address, unsigned int data), 327*4882a593Smuzhiyun 328*4882a593Smuzhiyun TP_ARGS(id, address, data), 329*4882a593Smuzhiyun 330*4882a593Smuzhiyun TP_STRUCT__entry( 331*4882a593Smuzhiyun __field(int, id) 332*4882a593Smuzhiyun __field(unsigned int, address) 333*4882a593Smuzhiyun __field(unsigned int, data) 334*4882a593Smuzhiyun ), 335*4882a593Smuzhiyun 336*4882a593Smuzhiyun TP_fast_assign( 337*4882a593Smuzhiyun __entry->id = id; 338*4882a593Smuzhiyun __entry->address = address; 339*4882a593Smuzhiyun __entry->data = data; 340*4882a593Smuzhiyun ), 341*4882a593Smuzhiyun 342*4882a593Smuzhiyun TP_printk("vgpu%d:inject msi address %x data %x\n", 343*4882a593Smuzhiyun __entry->id, __entry->address, __entry->data) 344*4882a593Smuzhiyun ); 345*4882a593Smuzhiyun 346*4882a593Smuzhiyun TRACE_EVENT(render_mmio, 347*4882a593Smuzhiyun TP_PROTO(int old_id, int new_id, char *action, unsigned int reg, 348*4882a593Smuzhiyun unsigned int old_val, unsigned int new_val), 349*4882a593Smuzhiyun 350*4882a593Smuzhiyun TP_ARGS(old_id, new_id, action, reg, old_val, new_val), 351*4882a593Smuzhiyun 352*4882a593Smuzhiyun TP_STRUCT__entry( 353*4882a593Smuzhiyun __field(int, old_id) 354*4882a593Smuzhiyun __field(int, new_id) 355*4882a593Smuzhiyun __array(char, buf, GVT_TEMP_STR_LEN) 356*4882a593Smuzhiyun __field(unsigned int, reg) 357*4882a593Smuzhiyun __field(unsigned int, old_val) 358*4882a593Smuzhiyun __field(unsigned int, new_val) 359*4882a593Smuzhiyun ), 360*4882a593Smuzhiyun 361*4882a593Smuzhiyun TP_fast_assign( 362*4882a593Smuzhiyun __entry->old_id = old_id; 363*4882a593Smuzhiyun __entry->new_id = new_id; 364*4882a593Smuzhiyun snprintf(__entry->buf, GVT_TEMP_STR_LEN, "%s", action); 365*4882a593Smuzhiyun __entry->reg = reg; 366*4882a593Smuzhiyun __entry->old_val = old_val; 367*4882a593Smuzhiyun __entry->new_val = new_val; 368*4882a593Smuzhiyun ), 369*4882a593Smuzhiyun 370*4882a593Smuzhiyun TP_printk("VM%u -> VM%u %s reg %x, old %08x new %08x\n", 371*4882a593Smuzhiyun __entry->old_id, __entry->new_id, 372*4882a593Smuzhiyun __entry->buf, __entry->reg, 373*4882a593Smuzhiyun __entry->old_val, __entry->new_val) 374*4882a593Smuzhiyun ); 375*4882a593Smuzhiyun 376*4882a593Smuzhiyun #endif /* _GVT_TRACE_H_ */ 377*4882a593Smuzhiyun 378*4882a593Smuzhiyun /* This part must be out of protection */ 379*4882a593Smuzhiyun #undef TRACE_INCLUDE_PATH 380*4882a593Smuzhiyun #define TRACE_INCLUDE_PATH . 381*4882a593Smuzhiyun #undef TRACE_INCLUDE_FILE 382*4882a593Smuzhiyun #define TRACE_INCLUDE_FILE trace 383*4882a593Smuzhiyun #include <trace/define_trace.h> 384