Mathieu Desnoyers wrote:
I could declare my jump_select_label directly in assembly then.
Maybe, but it could be tricky to make that label visible to C code.
+call_label: \
+ asm volatile ("" : : ); \
+ MARK_CALL(name, format, ## args); \
+ asm volatile ("" : : ); \
+over_label: \
+ asm volatile ("" : : ); \
These asm volatiles won't do anything at all. What are you trying to
achieve?
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.
The "volatile" modifier for "asm" *only* means that the asm emitted if
the code is reachable at all; it doesn't make any constraints about
relative ordering of the various asm volatile statement with respect to
each other, or with respect to other code.
I could probably do all this in assembly too.
Perhaps, though doing as much as possible visible to gcc has its
benefits. Tricky either way.
+#ifdef CONFIG_MARKERS
+#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)); \
Seems 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.
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.
I don't understand. Your asms put things into the marker section with
".long A, B, C". Does does that correspond to this structure?
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.
i386 is about the only architecture which uses the stack for calls by
default.
J
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
[Index of Archives]
[Kernel Newbies]
[Netfilter]
[Bugtraq]
[Photo]
[Stuff]
[Gimp]
[Yosemite News]
[MIPS Linux]
[ARM Linux]
[Linux Security]
[Linux RAID]
[Video 4 Linux]
[Linux for the blind]
[Linux Resources]