I could declare my jump_select_label directly in assembly then.
+call_label: \These asm volatiles won't do anything at all. What are you trying to achieve?
+ asm volatile ("" : : ); \
+ MARK_CALL(name, format, ## args); \
+ asm volatile ("" : : ); \
+over_label: \
+ asm volatile ("" : : ); \
I want to make sure that the call_label's address will be exactly after the 2nd
byte of the jump instruction. The over_label does not really matter, as long as
it points to a correct spot in the execution flow. The most important is that
it stays near the jump instruction.
I could probably do all this in assembly too.
+#ifdef CONFIG_MARKERSSeems like a bad idea that MARK() can put one type of record in .markers, but MARK_JUMP and MARK_CALL can put different records in the same section? How do you distinguish them? Or are they certain to be exclusive? Either way, I'd probably put different mark records in different sections: .markers.jump, .markers.call, markers.labels. And define appropriate structures for the record types in each section.
+#define MARK(name, format, args...) \
+ do { \
+ __label__ here; \
+here: asm volatile( ".section .markers, \"a\";\n\t" \
+ ".long %0, %1;\n\t" \
+ ".previous;\n\t" : : \
+ "m" (*(#name)), \
+ "m" (*&&here)); \
struct __mark_marker {
const char *name;
const void *location;
char *select;
const void *jump_call;
const void *jump_over;
marker_probe_func **call;
const char *format;
};
is the structure which defines a complete record in the mark section. They are
all tied to the same marker site, so I think it makes sense to keep them in the
same record.
Right, well, I wanted to keep a generic caller and try to make assumptions about
the stack layout in the called function but if there is now way to do this, we
can think of using the varargs in the probe.