|
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__ */
|