powerpc/tracing: tracepoints for RTAS entry and exit
[sfrench/cifs-2.6.git] / arch / powerpc / include / asm / trace.h
index 08cd60cd70b74eb951efe581f3a8c2f49479e694..82cc2c6704e6e94dde79e5fe98331ffb13e04681 100644 (file)
@@ -119,6 +119,109 @@ TRACE_EVENT_FN_COND(hcall_exit,
 );
 #endif
 
+#ifdef CONFIG_PPC_RTAS
+
+#include <asm/rtas-types.h>
+
+TRACE_EVENT(rtas_input,
+
+       TP_PROTO(struct rtas_args *rtas_args, const char *name),
+
+       TP_ARGS(rtas_args, name),
+
+       TP_STRUCT__entry(
+               __field(__u32, nargs)
+               __string(name, name)
+               __dynamic_array(__u32, inputs, be32_to_cpu(rtas_args->nargs))
+       ),
+
+       TP_fast_assign(
+               __entry->nargs = be32_to_cpu(rtas_args->nargs);
+               __assign_str(name, name);
+               be32_to_cpu_array(__get_dynamic_array(inputs), rtas_args->args, __entry->nargs);
+       ),
+
+       TP_printk("%s arguments: %s", __get_str(name),
+                 __print_array(__get_dynamic_array(inputs), __entry->nargs, 4)
+       )
+);
+
+TRACE_EVENT(rtas_output,
+
+       TP_PROTO(struct rtas_args *rtas_args, const char *name),
+
+       TP_ARGS(rtas_args, name),
+
+       TP_STRUCT__entry(
+               __field(__u32, nr_other)
+               __field(__s32, status)
+               __string(name, name)
+               __dynamic_array(__u32, other_outputs, be32_to_cpu(rtas_args->nret) - 1)
+       ),
+
+       TP_fast_assign(
+               __entry->nr_other = be32_to_cpu(rtas_args->nret) - 1;
+               __entry->status = be32_to_cpu(rtas_args->rets[0]);
+               __assign_str(name, name);
+               be32_to_cpu_array(__get_dynamic_array(other_outputs),
+                                 &rtas_args->rets[1], __entry->nr_other);
+       ),
+
+       TP_printk("%s status: %d, other outputs: %s", __get_str(name), __entry->status,
+                 __print_array(__get_dynamic_array(other_outputs),
+                               __entry->nr_other, 4)
+       )
+);
+
+DECLARE_EVENT_CLASS(rtas_parameter_block,
+
+       TP_PROTO(struct rtas_args *rtas_args),
+
+       TP_ARGS(rtas_args),
+
+       TP_STRUCT__entry(
+               __field(u32, token)
+               __field(u32, nargs)
+               __field(u32, nret)
+               __array(__u32, params, 16)
+       ),
+
+       TP_fast_assign(
+               __entry->token = be32_to_cpu(rtas_args->token);
+               __entry->nargs = be32_to_cpu(rtas_args->nargs);
+               __entry->nret = be32_to_cpu(rtas_args->nret);
+               be32_to_cpu_array(__entry->params, rtas_args->args, ARRAY_SIZE(rtas_args->args));
+       ),
+
+       TP_printk("token=%u nargs=%u nret=%u params:"
+                 " [0]=0x%08x [1]=0x%08x [2]=0x%08x [3]=0x%08x"
+                 " [4]=0x%08x [5]=0x%08x [6]=0x%08x [7]=0x%08x"
+                 " [8]=0x%08x [9]=0x%08x [10]=0x%08x [11]=0x%08x"
+                 " [12]=0x%08x [13]=0x%08x [14]=0x%08x [15]=0x%08x",
+                 __entry->token, __entry->nargs, __entry->nret,
+                 __entry->params[0], __entry->params[1], __entry->params[2], __entry->params[3],
+                 __entry->params[4], __entry->params[5], __entry->params[6], __entry->params[7],
+                 __entry->params[8], __entry->params[9], __entry->params[10], __entry->params[11],
+                 __entry->params[12], __entry->params[13], __entry->params[14], __entry->params[15]
+       )
+);
+
+DEFINE_EVENT(rtas_parameter_block, rtas_ll_entry,
+
+       TP_PROTO(struct rtas_args *rtas_args),
+
+       TP_ARGS(rtas_args)
+);
+
+DEFINE_EVENT(rtas_parameter_block, rtas_ll_exit,
+
+       TP_PROTO(struct rtas_args *rtas_args),
+
+       TP_ARGS(rtas_args)
+);
+
+#endif /* CONFIG_PPC_RTAS */
+
 #ifdef CONFIG_PPC_POWERNV
 extern int opal_tracepoint_regfunc(void);
 extern void opal_tracepoint_unregfunc(void);