Suggestion for patch

Dmitry V. Levin ldv at altlinux.org
Sat Feb 9 03:05:21 UTC 2013


Hi,

On Thu, Feb 07, 2013 at 03:15:17PM +0000, Frediano Ziglio wrote:
>   I was trying to add support to Xen ioctl to strace. To distinguish
> from other ioctl I used the entire code (not only type and number but
> also size and direction) so I changed sys_ioctl in io.c to call a
> function that check for the entire code and return true if it handled
> the syscall. Is it fine to do it?

It is probably OK, at least I couldn't think up a better alternative yet.

> The ioctl of Xen are quite complicated to decode cause there are single
> ioctls that accept a structure that internally have a command field that
> specify the operation and an union with all data for operations,
> something like
> 
> struct my_operation {
>   int operation;
>   union {
>     struct operation1_data operation1;
>     struct operation2_data operation2;
>     struct operation3_data operation3;
>     ...
>   } u;
> };
> 
> Just to complicate more some field in operationX_data can be for output,
> input or input/output. I found no way to store some informations in tcb
> structure. I'd like to print something when syscall enters (input
> parameters) and something when syscall leaves, somethings like
> 
> ioctl(FD, IOCTL, {op=my_op,u={field_inout=5}}->{u={field_inout=3}}) = 0
> 
> (->) to separate input and output. Is there a  specific syntax to
> separate input and output?

This is uncharted territory, we had nothing like this before.
Anyway, a space before and after this delimiter wouldn't harm.

> +extern int ioctl_decode_exact(struct tcb *tcp);

A declaration would have to go to defs.h

>  int
>  sys_ioctl(struct tcb *tcp)
>  {
> @@ -384,6 +386,12 @@ sys_ioctl(struct tcb *tcp)
>  	if (entering(tcp)) {
>  		printfd(tcp, tcp->u_arg[0]);
>  		tprints(", ");
> +	}
> +
> +	if (ioctl_decode_exact(tcp))
> +		return 0;
> +
> +	if (entering(tcp)) {
>  		iop = ioctl_lookup(tcp->u_arg[1]);
>  		if (iop) {
>  			tprints(iop->symbol);

I'd rather put this ioctl_decode_exact() call to both branches.

> +#include <xenctrl.h>
> +#include <xen/sys/evtchn.h>
> +#include <xen/sys/privcmd.h>

Availability of these headers has to be checked in configure.ac so that
HAVE_XENCTRL_H and other macros could be used here.

I'd prefer to put this complicated xen ioctl parser to separate xen.c
source file.

> +// hold information on status
> +// need flush if space is not enough
> +typedef struct {
> +	char *dest, *dest_end;
> +	char buffer[256];
> +} print_status;
> +
> +static inline void
> +status_init(print_status *status)
> +{
> +	status->dest     = status->buffer;
> +	status->dest_end = status->buffer + sizeof(status->buffer);
> +}
> +
> +static void
> +assure_space(print_status *status, size_t needed)
> +{
> +	/* assert(needed <= sizeof(status->buffer)); */
> +	if (needed > status->dest_end - status->dest) {
> +		tprints(status->buffer);
> +		status->buffer[0] = 0;
> +		status->dest = status->buffer;
> +	}
> +}
> +
> +static inline void
> +status_flush(print_status *status)
> +{
> +	assure_space(status, sizeof(status->buffer));
> +}
> +
> +static void
> +status_printf(print_status *status, const char *fmt, ...)
> +{
> +	int l;
> +	va_list ap;
> +
> +	assure_space(status, 64);
> +	va_start(ap, fmt);
> +	l = vsprintf(status->dest, fmt, ap);
> +	va_end(ap);
> +	status->dest += l;
> +}

Why do we need additional buffering on top of tprintf/tprints?
Does the latter perform so badly?


-- 
ldv
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 198 bytes
Desc: not available
URL: <http://lists.strace.io/pipermail/strace-devel/attachments/20130209/36c0f8e0/attachment.bin>


More information about the Strace-devel mailing list