Messages in this thread | | | Date | Mon, 25 Sep 2006 16:35:02 -0400 | From | Mathieu Desnoyers <> | Subject | Re: [PATCH] Linux Kernel Markers 0.11 for 2.6.17 |
| |
* Jeremy Fitzhardinge (jeremy@goop.org) wrote: > 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. >
Would it be correct if we put dependencies on a label corresponding to the previous asm in the read constraints for each asm ?
> >>>+#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? >
Yes, those are all pointers and a single MARK declares 7 of them. Please tell me if I goofed up in assembly typing.
Regards,
Mathieu
OpenPGP public key: http://krystal.dyndns.org:8080/key/compudj.gpg Key fingerprint: 8CD5 52C3 8E3C 4140 715F BA06 3F25 A8FE 3BAE 9A68 - To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
| |