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

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