/* * Stage 4 of the trace events. * * Override the macros in to include the following: * * For those macros defined with TRACE_EVENT: * * static struct trace_event_call event_; * * static void trace_event_raw_event_(void *__data, proto) * { * struct trace_event_file *trace_file = __data; * struct trace_event_call *event_call = trace_file->event_call; * struct ftrace_data_offsets_ __maybe_unused __data_offsets; * unsigned long eflags = trace_file->flags; * enum event_trigger_type __tt = ETT_NONE; * struct ring_buffer_event *event; * struct trace_event_raw_ *entry; <-- defined in stage 1 * struct ring_buffer *buffer; * unsigned long irq_flags; * int __data_size; * int pc; * * if (!(eflags & EVENT_FILE_FL_TRIGGER_COND)) { * if (eflags & EVENT_FILE_FL_TRIGGER_MODE) * event_triggers_call(trace_file, NULL); * if (eflags & EVENT_FILE_FL_SOFT_DISABLED) * return; * } * * local_save_flags(irq_flags); * pc = preempt_count(); * * __data_size = ftrace_get_offsets_(&__data_offsets, args); * * event = trace_event_buffer_lock_reserve(&buffer, trace_file, * event_->event.type, * sizeof(*entry) + __data_size, * irq_flags, pc); * if (!event) * return; * entry = ring_buffer_event_data(event); * * { ; } <-- Here we assign the entries by the __field and * __array macros. * * if (eflags & EVENT_FILE_FL_TRIGGER_COND) * __tt = event_triggers_call(trace_file, entry); * * if (test_bit(EVENT_FILE_FL_SOFT_DISABLED_BIT, * &trace_file->flags)) * ring_buffer_discard_commit(buffer, event); * else if (!filter_check_discard(trace_file, entry, buffer, event)) * trace_buffer_unlock_commit(buffer, event, irq_flags, pc); * * if (__tt) * event_triggers_post_call(trace_file, __tt); * } * * static struct trace_event ftrace_event_type_ = { * .trace = trace_raw_output_, <-- stage 2 * }; * * static char print_fmt_[] = ; * * static struct trace_event_class __used event_class_