Blame src/perfctr-2.6.x/linux/drivers/perfctr/marshal.h

Packit 577717
/* $Id: marshal.h,v 1.1 2003/08/19 13:37:07 mikpe Exp $
Packit 577717
 * Performance-monitoring counters driver.
Packit 577717
 * Structure marshalling support.
Packit 577717
 *
Packit 577717
 * Copyright (C) 2003  Mikael Pettersson
Packit 577717
 */
Packit 577717
Packit 577717
/*
Packit 577717
 * Each encoded datum starts with a 32-bit header word, containing
Packit 577717
 * the datum's type (1 bit: UINT32 or UINT64), the target's field
Packit 577717
 * tag (16 bits), and the target field's array index (15 bits).
Packit 577717
 *
Packit 577717
 * After the header follows the datum's value, in one (for UINT32)
Packit 577717
 * or two (for UINT64) words. Multi-word values are emitted in
Packit 577717
 * native word order.
Packit 577717
 *
Packit 577717
 * To encode a struct, encode each field with a non-zero value,
Packit 577717
 * and place the encodings in sequence. The field order is arbitrary.
Packit 577717
 *
Packit 577717
 * To decode an encoded struct, first memset() the target struct
Packit 577717
 * to zero. Then decode each encoded field in the sequence and
Packit 577717
 * update the corresponding field in the target struct.
Packit 577717
 */
Packit 577717
#define PERFCTR_HEADER(TYPE,TAG,ITEMNR) (((TAG)<<16)|((ITEMNR)<<1)|(TYPE))
Packit 577717
#define PERFCTR_HEADER_TYPE(H)		((H) & 0x1)
Packit 577717
#define PERFCTR_HEADER_ITEMNR(H)	(((H) >> 1) & 0x7FFF)
Packit 577717
#define PERFCTR_HEADER_TAG(H)		((H) >> 16)
Packit 577717
Packit 577717
#define PERFCTR_HEADER_UINT32		0
Packit 577717
#define PERFCTR_HEADER_UINT64		1
Packit 577717
Packit 577717
/*
Packit 577717
 * A field descriptor describes a struct field to the
Packit 577717
 * encoding and decoding procedures.
Packit 577717
 *
Packit 577717
 * To keep the descriptors small, field tags and array sizes
Packit 577717
 * are currently restricted to 8 and 7 bits, respectively.
Packit 577717
 * This does not change the encoded format.
Packit 577717
 */
Packit 577717
struct perfctr_field_desc {
Packit 577717
	unsigned short offset;	/* offsetof() for this field */
Packit 577717
	unsigned char tag;	/* identifying tag in encoded format */
Packit 577717
	unsigned char type;	/* base type (1 bit), array size - 1 (7 bits) */
Packit 577717
};
Packit 577717
Packit 577717
#define PERFCTR_TYPE_ARRAY(N,T)	((((N) - 1) << 1) | (T))
Packit 577717
#define PERFCTR_TYPE_BASE(T)	((T) & 0x1)
Packit 577717
#define PERFCTR_TYPE_NRITEMS(T)	(((T) >> 1) + 1)
Packit 577717
Packit 577717
#define PERFCTR_TYPE_BYTES4	0	/* uint32 or char[4] */
Packit 577717
#define PERFCTR_TYPE_UINT64	1	/* long long */
Packit 577717
Packit 577717
struct perfctr_struct_desc {
Packit 577717
	unsigned short total_sizeof;	/* for buffer allocation and decode memset() */
Packit 577717
	unsigned short total_nrfields;	/* for buffer allocation */
Packit 577717
	unsigned short nrfields;
Packit 577717
	unsigned short nrsubs;
Packit 577717
	/* Note: the fields must be in ascending tag order */
Packit 577717
	const struct perfctr_field_desc *fields;
Packit 577717
	const struct perfctr_sub_struct_desc {
Packit 577717
		unsigned short offset;
Packit 577717
		const struct perfctr_struct_desc *sdesc;
Packit 577717
	} *subs;
Packit 577717
};
Packit 577717
Packit 577717
struct perfctr_marshal_stream {
Packit 577717
	unsigned int size;
Packit 577717
	unsigned int *buffer;
Packit 577717
	unsigned int pos;
Packit 577717
	unsigned int error;
Packit 577717
};
Packit 577717
Packit 577717
extern void perfctr_encode_struct(const void *address,
Packit 577717
				  const struct perfctr_struct_desc *sdesc,
Packit 577717
				  struct perfctr_marshal_stream *stream);
Packit 577717
Packit 577717
extern int perfctr_decode_struct(void *address,
Packit 577717
				 const struct perfctr_struct_desc *sdesc,
Packit 577717
				 struct perfctr_marshal_stream *stream);
Packit 577717
Packit 577717
extern const struct perfctr_struct_desc perfctr_sum_ctrs_sdesc;
Packit 577717
extern const struct perfctr_struct_desc perfctr_cpu_control_sdesc;
Packit 577717
extern const struct perfctr_struct_desc perfctr_info_sdesc;
Packit 577717
extern const struct perfctr_struct_desc vperfctr_control_sdesc;
Packit 577717
extern const struct perfctr_struct_desc gperfctr_cpu_control_sdesc;
Packit 577717
extern const struct perfctr_struct_desc gperfctr_cpu_state_only_cpu_sdesc;
Packit 577717
extern const struct perfctr_struct_desc gperfctr_cpu_state_sdesc;
Packit 577717
Packit 577717
#ifdef __KERNEL__
Packit 577717
extern int perfctr_copy_to_user(struct perfctr_struct_buf *argp,
Packit 577717
				void *struct_address,
Packit 577717
				const struct perfctr_struct_desc *sdesc);
Packit 577717
extern int perfctr_copy_from_user(void *struct_address,
Packit 577717
				  struct perfctr_struct_buf *argp,
Packit 577717
				  const struct perfctr_struct_desc *sdesc);
Packit 577717
#else
Packit 577717
extern int perfctr_ioctl_w(int fd, unsigned int cmd, const void *arg,
Packit 577717
			   const struct perfctr_struct_desc *sdesc);
Packit 577717
extern int perfctr_ioctl_r(int fd, unsigned int cmd, void *res,
Packit 577717
			   const struct perfctr_struct_desc *sdesc);
Packit 577717
extern int perfctr_ioctl_wr(int fd, unsigned int cmd, void *argres,
Packit 577717
			    const struct perfctr_struct_desc *arg_sdesc,
Packit 577717
			    const struct perfctr_struct_desc *res_sdesc);
Packit 577717
#endif /* __KERNEL__ */