|
Packit |
577717 |
/****************************/
|
|
Packit |
577717 |
/* THIS IS OPEN SOURCE CODE */
|
|
Packit |
577717 |
/****************************/
|
|
Packit |
577717 |
|
|
Packit |
577717 |
/**
|
|
Packit |
577717 |
* @file mware.c
|
|
Packit |
577717 |
* @author Matt Johnson
|
|
Packit |
577717 |
* mrj@eecs.utk.edu
|
|
Packit |
577717 |
* @author John Nelson
|
|
Packit |
577717 |
* jnelso37@eecs.utk.edu
|
|
Packit |
577717 |
* @author Vince Weaver
|
|
Packit |
577717 |
* vweaver1@eecs.utk.edu
|
|
Packit |
577717 |
*
|
|
Packit |
577717 |
* @ingroup papi_components
|
|
Packit |
577717 |
*
|
|
Packit |
577717 |
* VMware component
|
|
Packit |
577717 |
*
|
|
Packit |
577717 |
* @brief
|
|
Packit |
577717 |
* This is the VMware component for PAPI-V. It will allow user access to
|
|
Packit |
577717 |
* hardware information available from a VMware virtual machine.
|
|
Packit |
577717 |
*/
|
|
Packit |
577717 |
|
|
Packit |
577717 |
#include <stdio.h>
|
|
Packit |
577717 |
#include <string.h>
|
|
Packit |
577717 |
#include <stdlib.h>
|
|
Packit |
577717 |
#include <stdint.h>
|
|
Packit |
577717 |
|
|
Packit |
577717 |
#include <unistd.h>
|
|
Packit |
577717 |
#include <dlfcn.h>
|
|
Packit |
577717 |
|
|
Packit |
577717 |
/* Headers required by PAPI */
|
|
Packit |
577717 |
#include "papi.h"
|
|
Packit |
577717 |
#include "papi_internal.h"
|
|
Packit |
577717 |
#include "papi_vector.h"
|
|
Packit |
577717 |
#include "papi_memory.h"
|
|
Packit |
577717 |
|
|
Packit |
577717 |
#define VMWARE_MAX_COUNTERS 256
|
|
Packit |
577717 |
|
|
Packit |
577717 |
#define VMWARE_CPU_LIMIT_MHZ 0
|
|
Packit |
577717 |
#define VMWARE_CPU_RESERVATION_MHZ 1
|
|
Packit |
577717 |
#define VMWARE_CPU_SHARES 2
|
|
Packit |
577717 |
#define VMWARE_CPU_STOLEN_MS 3
|
|
Packit |
577717 |
#define VMWARE_CPU_USED_MS 4
|
|
Packit |
577717 |
#define VMWARE_ELAPSED_MS 5
|
|
Packit |
577717 |
|
|
Packit |
577717 |
#define VMWARE_MEM_ACTIVE_MB 6
|
|
Packit |
577717 |
#define VMWARE_MEM_BALLOONED_MB 7
|
|
Packit |
577717 |
#define VMWARE_MEM_LIMIT_MB 8
|
|
Packit |
577717 |
#define VMWARE_MEM_MAPPED_MB 9
|
|
Packit |
577717 |
#define VMWARE_MEM_OVERHEAD_MB 10
|
|
Packit |
577717 |
#define VMWARE_MEM_RESERVATION_MB 11
|
|
Packit |
577717 |
#define VMWARE_MEM_SHARED_MB 12
|
|
Packit |
577717 |
#define VMWARE_MEM_SHARES 13
|
|
Packit |
577717 |
#define VMWARE_MEM_SWAPPED_MB 14
|
|
Packit |
577717 |
#define VMWARE_MEM_TARGET_SIZE_MB 15
|
|
Packit |
577717 |
#define VMWARE_MEM_USED_MB 16
|
|
Packit |
577717 |
|
|
Packit |
577717 |
#define VMWARE_HOST_CPU_MHZ 17
|
|
Packit |
577717 |
|
|
Packit |
577717 |
/* The following 3 require VMWARE_PSEUDO_PERFORMANCE env_var to be set. */
|
|
Packit |
577717 |
|
|
Packit |
577717 |
#define VMWARE_HOST_TSC 18
|
|
Packit |
577717 |
#define VMWARE_ELAPSED_TIME 19
|
|
Packit |
577717 |
#define VMWARE_ELAPSED_APPARENT 20
|
|
Packit |
577717 |
|
|
Packit |
577717 |
/* Begin PAPI definitions */
|
|
Packit |
577717 |
papi_vector_t _vmware_vector;
|
|
Packit |
577717 |
|
|
Packit |
577717 |
|
|
Packit |
577717 |
void (*_dl_non_dynamic_init)(void) __attribute__((weak));
|
|
Packit |
577717 |
|
|
Packit |
577717 |
/** Structure that stores private information for each event */
|
|
Packit |
577717 |
struct _vmware_register {
|
|
Packit |
577717 |
unsigned int selector;
|
|
Packit |
577717 |
/**< Signifies which counter slot is being used */
|
|
Packit |
577717 |
/**< Indexed from 1 as 0 has a special meaning */
|
|
Packit |
577717 |
};
|
|
Packit |
577717 |
|
|
Packit |
577717 |
/** This structure is used to build the table of events */
|
|
Packit |
577717 |
struct _vmware_native_event_entry {
|
|
Packit |
577717 |
char name[PAPI_MAX_STR_LEN]; /**< Name of the counter */
|
|
Packit |
577717 |
char description[PAPI_HUGE_STR_LEN]; /**< Description of counter */
|
|
Packit |
577717 |
char units[PAPI_MIN_STR_LEN];
|
|
Packit |
577717 |
int which_counter;
|
|
Packit |
577717 |
int report_difference;
|
|
Packit |
577717 |
};
|
|
Packit |
577717 |
|
|
Packit |
577717 |
struct _vmware_reg_alloc {
|
|
Packit |
577717 |
struct _vmware_register ra_bits;
|
|
Packit |
577717 |
};
|
|
Packit |
577717 |
|
|
Packit |
577717 |
|
|
Packit |
577717 |
inline uint64_t rdpmc(int c)
|
|
Packit |
577717 |
{
|
|
Packit |
577717 |
uint32_t low, high;
|
|
Packit |
577717 |
__asm__ __volatile__("rdpmc" : "=a" (low), "=d" (high) : "c" (c));
|
|
Packit |
577717 |
return (uint64_t)high << 32 | (uint64_t)low;
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
|
|
Packit |
577717 |
|
|
Packit |
577717 |
#ifdef VMGUESTLIB
|
|
Packit |
577717 |
/* Headers required by VMware */
|
|
Packit |
577717 |
#include "vmGuestLib.h"
|
|
Packit |
577717 |
|
|
Packit |
577717 |
/* Functions to dynamically load from the GuestLib library. */
|
|
Packit |
577717 |
char const * (*GuestLib_GetErrorText)(VMGuestLibError);
|
|
Packit |
577717 |
VMGuestLibError (*GuestLib_OpenHandle)(VMGuestLibHandle*);
|
|
Packit |
577717 |
VMGuestLibError (*GuestLib_CloseHandle)(VMGuestLibHandle);
|
|
Packit |
577717 |
VMGuestLibError (*GuestLib_UpdateInfo)(VMGuestLibHandle handle);
|
|
Packit |
577717 |
VMGuestLibError (*GuestLib_GetSessionId)(VMGuestLibHandle handle, VMSessionId *id);
|
|
Packit |
577717 |
VMGuestLibError (*GuestLib_GetCpuReservationMHz)(VMGuestLibHandle handle, uint32 *cpuReservationMHz);
|
|
Packit |
577717 |
VMGuestLibError (*GuestLib_GetCpuLimitMHz)(VMGuestLibHandle handle, uint32 *cpuLimitMHz);
|
|
Packit |
577717 |
VMGuestLibError (*GuestLib_GetCpuShares)(VMGuestLibHandle handle, uint32 *cpuShares);
|
|
Packit |
577717 |
VMGuestLibError (*GuestLib_GetCpuUsedMs)(VMGuestLibHandle handle, uint64 *cpuUsedMs);
|
|
Packit |
577717 |
VMGuestLibError (*GuestLib_GetHostProcessorSpeed)(VMGuestLibHandle handle, uint32 *mhz);
|
|
Packit |
577717 |
VMGuestLibError (*GuestLib_GetMemReservationMB)(VMGuestLibHandle handle, uint32 *memReservationMB);
|
|
Packit |
577717 |
VMGuestLibError (*GuestLib_GetMemLimitMB)(VMGuestLibHandle handle, uint32 *memLimitMB);
|
|
Packit |
577717 |
VMGuestLibError (*GuestLib_GetMemShares)(VMGuestLibHandle handle, uint32 *memShares);
|
|
Packit |
577717 |
VMGuestLibError (*GuestLib_GetMemMappedMB)(VMGuestLibHandle handle, uint32 *memMappedMB);
|
|
Packit |
577717 |
VMGuestLibError (*GuestLib_GetMemActiveMB)(VMGuestLibHandle handle, uint32 *memActiveMB);
|
|
Packit |
577717 |
VMGuestLibError (*GuestLib_GetMemOverheadMB)(VMGuestLibHandle handle, uint32 *memOverheadMB);
|
|
Packit |
577717 |
VMGuestLibError (*GuestLib_GetMemBalloonedMB)(VMGuestLibHandle handle, uint32 *memBalloonedMB);
|
|
Packit |
577717 |
VMGuestLibError (*GuestLib_GetMemSwappedMB)(VMGuestLibHandle handle, uint32 *memSwappedMB);
|
|
Packit |
577717 |
VMGuestLibError (*GuestLib_GetMemSharedMB)(VMGuestLibHandle handle, uint32 *memSharedMB);
|
|
Packit |
577717 |
VMGuestLibError (*GuestLib_GetMemSharedSavedMB)(VMGuestLibHandle handle, uint32 *memSharedSavedMB);
|
|
Packit |
577717 |
VMGuestLibError (*GuestLib_GetMemUsedMB)(VMGuestLibHandle handle, uint32 *memUsedMB);
|
|
Packit |
577717 |
VMGuestLibError (*GuestLib_GetElapsedMs)(VMGuestLibHandle handle, uint64 *elapsedMs);
|
|
Packit |
577717 |
VMGuestLibError (*GuestLib_GetResourcePoolPath)(VMGuestLibHandle handle, size_t *bufferSize, char *pathBuffer);
|
|
Packit |
577717 |
VMGuestLibError (*GuestLib_GetCpuStolenMs)(VMGuestLibHandle handle, uint64 *cpuStolenMs);
|
|
Packit |
577717 |
VMGuestLibError (*GuestLib_GetMemTargetSizeMB)(VMGuestLibHandle handle, uint64 *memTargetSizeMB);
|
|
Packit |
577717 |
VMGuestLibError (*GuestLib_GetHostNumCpuCores)(VMGuestLibHandle handle, uint32 *hostNumCpuCores);
|
|
Packit |
577717 |
VMGuestLibError (*GuestLib_GetHostCpuUsedMs)(VMGuestLibHandle handle, uint64 *hostCpuUsedMs);
|
|
Packit |
577717 |
VMGuestLibError (*GuestLib_GetHostMemSwappedMB)(VMGuestLibHandle handle, uint64 *hostMemSwappedMB);
|
|
Packit |
577717 |
VMGuestLibError (*GuestLib_GetHostMemSharedMB)(VMGuestLibHandle handle, uint64 *hostMemSharedMB);
|
|
Packit |
577717 |
VMGuestLibError (*GuestLib_GetHostMemUsedMB)(VMGuestLibHandle handle, uint64 *hostMemUsedMB);
|
|
Packit |
577717 |
VMGuestLibError (*GuestLib_GetHostMemPhysMB)(VMGuestLibHandle handle, uint64 *hostMemPhysMB);
|
|
Packit |
577717 |
VMGuestLibError (*GuestLib_GetHostMemPhysFreeMB)(VMGuestLibHandle handle, uint64 *hostMemPhysFreeMB);
|
|
Packit |
577717 |
VMGuestLibError (*GuestLib_GetHostMemKernOvhdMB)(VMGuestLibHandle handle, uint64 *hostMemKernOvhdMB);
|
|
Packit |
577717 |
VMGuestLibError (*GuestLib_GetHostMemMappedMB)(VMGuestLibHandle handle, uint64 *hostMemMappedMB);
|
|
Packit |
577717 |
VMGuestLibError (*GuestLib_GetHostMemUnmappedMB)(VMGuestLibHandle handle, uint64 *hostMemUnmappedMB);
|
|
Packit |
577717 |
|
|
Packit |
577717 |
|
|
Packit |
577717 |
static void *dlHandle = NULL;
|
|
Packit |
577717 |
|
|
Packit |
577717 |
|
|
Packit |
577717 |
/*
|
|
Packit |
577717 |
* Macro to load a single GuestLib function from the shared library.
|
|
Packit |
577717 |
*/
|
|
Packit |
577717 |
|
|
Packit |
577717 |
#define LOAD_ONE_FUNC(funcname) \
|
|
Packit |
577717 |
do { \
|
|
Packit |
577717 |
funcname = dlsym(dlHandle, "VM" #funcname); \
|
|
Packit |
577717 |
if ((dlErrStr = dlerror()) != NULL) { \
|
|
Packit |
577717 |
fprintf(stderr, "Failed to load \'%s\': \'%s\'\n", \
|
|
Packit |
577717 |
#funcname, dlErrStr); \
|
|
Packit |
577717 |
return FALSE; \
|
|
Packit |
577717 |
} \
|
|
Packit |
577717 |
} while (0)
|
|
Packit |
577717 |
|
|
Packit |
577717 |
#endif
|
|
Packit |
577717 |
|
|
Packit |
577717 |
/** Holds control flags, usually out-of band configuration of the hardware */
|
|
Packit |
577717 |
struct _vmware_control_state {
|
|
Packit |
577717 |
long long value[VMWARE_MAX_COUNTERS];
|
|
Packit |
577717 |
int which_counter[VMWARE_MAX_COUNTERS];
|
|
Packit |
577717 |
int num_events;
|
|
Packit |
577717 |
};
|
|
Packit |
577717 |
|
|
Packit |
577717 |
/** Holds per-thread information */
|
|
Packit |
577717 |
struct _vmware_context {
|
|
Packit |
577717 |
long long values[VMWARE_MAX_COUNTERS];
|
|
Packit |
577717 |
long long start_values[VMWARE_MAX_COUNTERS];
|
|
Packit |
577717 |
#ifdef VMGUESTLIB
|
|
Packit |
577717 |
VMGuestLibHandle glHandle;
|
|
Packit |
577717 |
#endif
|
|
Packit |
577717 |
};
|
|
Packit |
577717 |
|
|
Packit |
577717 |
|
|
Packit |
577717 |
|
|
Packit |
577717 |
|
|
Packit |
577717 |
|
|
Packit |
577717 |
|
|
Packit |
577717 |
/*
|
|
Packit |
577717 |
*-----------------------------------------------------------------------------
|
|
Packit |
577717 |
*
|
|
Packit |
577717 |
* LoadFunctions --
|
|
Packit |
577717 |
*
|
|
Packit |
577717 |
* Load the functions from the shared library.
|
|
Packit |
577717 |
*
|
|
Packit |
577717 |
* Results:
|
|
Packit |
577717 |
* TRUE on success
|
|
Packit |
577717 |
* FALSE on failure
|
|
Packit |
577717 |
*
|
|
Packit |
577717 |
* Side effects:
|
|
Packit |
577717 |
* None
|
|
Packit |
577717 |
*
|
|
Packit |
577717 |
* Credit: VMware
|
|
Packit |
577717 |
*-----------------------------------------------------------------------------
|
|
Packit |
577717 |
*/
|
|
Packit |
577717 |
|
|
Packit |
577717 |
static int
|
|
Packit |
577717 |
LoadFunctions(void)
|
|
Packit |
577717 |
{
|
|
Packit |
577717 |
|
|
Packit |
577717 |
#ifdef VMGUESTLIB
|
|
Packit |
577717 |
/*
|
|
Packit |
577717 |
* First, try to load the shared library.
|
|
Packit |
577717 |
*/
|
|
Packit |
577717 |
|
|
Packit |
577717 |
/* Attempt to guess if we were statically linked to libc, if so bail */
|
|
Packit |
577717 |
if ( _dl_non_dynamic_init != NULL ) {
|
|
Packit |
577717 |
strncpy(_vmware_vector.cmp_info.disabled_reason, "The VMware component does not support statically linking of libc.", PAPI_MAX_STR_LEN);
|
|
Packit |
577717 |
return PAPI_ENOSUPP;
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
char const *dlErrStr;
|
|
Packit |
577717 |
char filename[BUFSIZ];
|
|
Packit |
577717 |
|
|
Packit |
577717 |
sprintf(filename,"%s","libvmGuestLib.so");
|
|
Packit |
577717 |
dlHandle = dlopen(filename, RTLD_NOW);
|
|
Packit |
577717 |
if (!dlHandle) {
|
|
Packit |
577717 |
dlErrStr = dlerror();
|
|
Packit |
577717 |
fprintf(stderr, "dlopen of %s failed: \'%s\'\n", filename,
|
|
Packit |
577717 |
dlErrStr);
|
|
Packit |
577717 |
|
|
Packit |
577717 |
sprintf(filename,"%s/lib/lib64/libvmGuestLib.so",VMWARE_INCDIR);
|
|
Packit |
577717 |
dlHandle = dlopen(filename, RTLD_NOW);
|
|
Packit |
577717 |
if (!dlHandle) {
|
|
Packit |
577717 |
dlErrStr = dlerror();
|
|
Packit |
577717 |
fprintf(stderr, "dlopen of %s failed: \'%s\'\n", filename,
|
|
Packit |
577717 |
dlErrStr);
|
|
Packit |
577717 |
|
|
Packit |
577717 |
sprintf(filename,"%s/lib/lib32/libvmGuestLib.so",VMWARE_INCDIR);
|
|
Packit |
577717 |
dlHandle = dlopen(filename, RTLD_NOW);
|
|
Packit |
577717 |
if (!dlHandle) {
|
|
Packit |
577717 |
dlErrStr = dlerror();
|
|
Packit |
577717 |
fprintf(stderr, "dlopen of %s failed: \'%s\'\n", filename,
|
|
Packit |
577717 |
dlErrStr);
|
|
Packit |
577717 |
return PAPI_ECMP;
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
/* Load all the individual library functions. */
|
|
Packit |
577717 |
LOAD_ONE_FUNC(GuestLib_GetErrorText);
|
|
Packit |
577717 |
LOAD_ONE_FUNC(GuestLib_OpenHandle);
|
|
Packit |
577717 |
LOAD_ONE_FUNC(GuestLib_CloseHandle);
|
|
Packit |
577717 |
LOAD_ONE_FUNC(GuestLib_UpdateInfo);
|
|
Packit |
577717 |
LOAD_ONE_FUNC(GuestLib_GetSessionId);
|
|
Packit |
577717 |
LOAD_ONE_FUNC(GuestLib_GetCpuReservationMHz);
|
|
Packit |
577717 |
LOAD_ONE_FUNC(GuestLib_GetCpuLimitMHz);
|
|
Packit |
577717 |
LOAD_ONE_FUNC(GuestLib_GetCpuShares);
|
|
Packit |
577717 |
LOAD_ONE_FUNC(GuestLib_GetCpuUsedMs);
|
|
Packit |
577717 |
LOAD_ONE_FUNC(GuestLib_GetHostProcessorSpeed);
|
|
Packit |
577717 |
LOAD_ONE_FUNC(GuestLib_GetMemReservationMB);
|
|
Packit |
577717 |
LOAD_ONE_FUNC(GuestLib_GetMemLimitMB);
|
|
Packit |
577717 |
LOAD_ONE_FUNC(GuestLib_GetMemShares);
|
|
Packit |
577717 |
LOAD_ONE_FUNC(GuestLib_GetMemMappedMB);
|
|
Packit |
577717 |
LOAD_ONE_FUNC(GuestLib_GetMemActiveMB);
|
|
Packit |
577717 |
LOAD_ONE_FUNC(GuestLib_GetMemOverheadMB);
|
|
Packit |
577717 |
LOAD_ONE_FUNC(GuestLib_GetMemBalloonedMB);
|
|
Packit |
577717 |
LOAD_ONE_FUNC(GuestLib_GetMemSwappedMB);
|
|
Packit |
577717 |
LOAD_ONE_FUNC(GuestLib_GetMemSharedMB);
|
|
Packit |
577717 |
LOAD_ONE_FUNC(GuestLib_GetMemSharedSavedMB);
|
|
Packit |
577717 |
LOAD_ONE_FUNC(GuestLib_GetMemUsedMB);
|
|
Packit |
577717 |
LOAD_ONE_FUNC(GuestLib_GetElapsedMs);
|
|
Packit |
577717 |
LOAD_ONE_FUNC(GuestLib_GetResourcePoolPath);
|
|
Packit |
577717 |
LOAD_ONE_FUNC(GuestLib_GetCpuStolenMs);
|
|
Packit |
577717 |
LOAD_ONE_FUNC(GuestLib_GetMemTargetSizeMB);
|
|
Packit |
577717 |
LOAD_ONE_FUNC(GuestLib_GetHostNumCpuCores);
|
|
Packit |
577717 |
LOAD_ONE_FUNC(GuestLib_GetHostCpuUsedMs);
|
|
Packit |
577717 |
LOAD_ONE_FUNC(GuestLib_GetHostMemSwappedMB);
|
|
Packit |
577717 |
LOAD_ONE_FUNC(GuestLib_GetHostMemSharedMB);
|
|
Packit |
577717 |
LOAD_ONE_FUNC(GuestLib_GetHostMemUsedMB);
|
|
Packit |
577717 |
LOAD_ONE_FUNC(GuestLib_GetHostMemPhysMB);
|
|
Packit |
577717 |
LOAD_ONE_FUNC(GuestLib_GetHostMemPhysFreeMB);
|
|
Packit |
577717 |
LOAD_ONE_FUNC(GuestLib_GetHostMemKernOvhdMB);
|
|
Packit |
577717 |
LOAD_ONE_FUNC(GuestLib_GetHostMemMappedMB);
|
|
Packit |
577717 |
LOAD_ONE_FUNC(GuestLib_GetHostMemUnmappedMB);
|
|
Packit |
577717 |
#endif
|
|
Packit |
577717 |
return PAPI_OK;
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
|
|
Packit |
577717 |
|
|
Packit |
577717 |
/** This table contains the native events */
|
|
Packit |
577717 |
static struct _vmware_native_event_entry *_vmware_native_table;
|
|
Packit |
577717 |
/** number of events in the table*/
|
|
Packit |
577717 |
static int num_events = 0;
|
|
Packit |
577717 |
static int use_pseudo=0;
|
|
Packit |
577717 |
static int use_guestlib=0;
|
|
Packit |
577717 |
|
|
Packit |
577717 |
/************************************************************************/
|
|
Packit |
577717 |
/* Below is the actual "hardware implementation" of our VMWARE counters */
|
|
Packit |
577717 |
/************************************************************************/
|
|
Packit |
577717 |
|
|
Packit |
577717 |
/** Code that reads event values.
|
|
Packit |
577717 |
You might replace this with code that accesses
|
|
Packit |
577717 |
hardware or reads values from the operatings system. */
|
|
Packit |
577717 |
static long long
|
|
Packit |
577717 |
_vmware_hardware_read( struct _vmware_context *context, int starting)
|
|
Packit |
577717 |
{
|
|
Packit |
577717 |
|
|
Packit |
577717 |
int i;
|
|
Packit |
577717 |
|
|
Packit |
577717 |
if (use_pseudo) {
|
|
Packit |
577717 |
context->values[VMWARE_HOST_TSC]=rdpmc(0x10000);
|
|
Packit |
577717 |
context->values[VMWARE_ELAPSED_TIME]=rdpmc(0x10001);
|
|
Packit |
577717 |
context->values[VMWARE_ELAPSED_APPARENT]=rdpmc(0x10002);
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
|
|
Packit |
577717 |
#ifdef VMGUESTLIB
|
|
Packit |
577717 |
static VMSessionId sessionId = 0;
|
|
Packit |
577717 |
VMSessionId tmpSession;
|
|
Packit |
577717 |
uint32_t temp32;
|
|
Packit |
577717 |
uint64_t temp64;
|
|
Packit |
577717 |
VMGuestLibError glError;
|
|
Packit |
577717 |
|
|
Packit |
577717 |
if (use_guestlib) {
|
|
Packit |
577717 |
|
|
Packit |
577717 |
glError = GuestLib_UpdateInfo(context->glHandle);
|
|
Packit |
577717 |
if (glError != VMGUESTLIB_ERROR_SUCCESS) {
|
|
Packit |
577717 |
fprintf(stderr,"UpdateInfo failed: %s\n",
|
|
Packit |
577717 |
GuestLib_GetErrorText(glError));
|
|
Packit |
577717 |
return PAPI_ECMP;
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
/* Retrieve and check the session ID */
|
|
Packit |
577717 |
glError = GuestLib_GetSessionId(context->glHandle, &tmpSession);
|
|
Packit |
577717 |
if (glError != VMGUESTLIB_ERROR_SUCCESS) {
|
|
Packit |
577717 |
fprintf(stderr, "Failed to get session ID: %s\n",
|
|
Packit |
577717 |
GuestLib_GetErrorText(glError));
|
|
Packit |
577717 |
return PAPI_ECMP;
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
if (tmpSession == 0) {
|
|
Packit |
577717 |
fprintf(stderr, "Error: Got zero sessionId from GuestLib\n");
|
|
Packit |
577717 |
return PAPI_ECMP;
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
if (sessionId == 0) {
|
|
Packit |
577717 |
sessionId = tmpSession;
|
|
Packit |
577717 |
} else if (tmpSession != sessionId) {
|
|
Packit |
577717 |
sessionId = tmpSession;
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
glError = GuestLib_GetCpuLimitMHz(context->glHandle,&temp32);
|
|
Packit |
577717 |
context->values[VMWARE_CPU_LIMIT_MHZ]=temp32;
|
|
Packit |
577717 |
if (glError != VMGUESTLIB_ERROR_SUCCESS) {
|
|
Packit |
577717 |
fprintf(stderr,"Failed to get CPU limit: %s\n",
|
|
Packit |
577717 |
GuestLib_GetErrorText(glError));
|
|
Packit |
577717 |
return PAPI_ECMP;
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
glError = GuestLib_GetCpuReservationMHz(context->glHandle,&temp32);
|
|
Packit |
577717 |
context->values[VMWARE_CPU_RESERVATION_MHZ]=temp32;
|
|
Packit |
577717 |
if (glError != VMGUESTLIB_ERROR_SUCCESS) {
|
|
Packit |
577717 |
fprintf(stderr,"Failed to get CPU reservation: %s\n",
|
|
Packit |
577717 |
GuestLib_GetErrorText(glError));
|
|
Packit |
577717 |
return PAPI_ECMP;
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
glError = GuestLib_GetCpuShares(context->glHandle,&temp32);
|
|
Packit |
577717 |
context->values[VMWARE_CPU_SHARES]=temp32;
|
|
Packit |
577717 |
if (glError != VMGUESTLIB_ERROR_SUCCESS) {
|
|
Packit |
577717 |
fprintf(stderr,"Failed to get cpu shares: %s\n",
|
|
Packit |
577717 |
GuestLib_GetErrorText(glError));
|
|
Packit |
577717 |
return PAPI_ECMP;
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
glError = GuestLib_GetCpuStolenMs(context->glHandle,&temp64);
|
|
Packit |
577717 |
context->values[VMWARE_CPU_STOLEN_MS]=temp64;
|
|
Packit |
577717 |
if (glError != VMGUESTLIB_ERROR_SUCCESS) {
|
|
Packit |
577717 |
if (glError == VMGUESTLIB_ERROR_UNSUPPORTED_VERSION) {
|
|
Packit |
577717 |
context->values[VMWARE_CPU_STOLEN_MS]=0;
|
|
Packit |
577717 |
fprintf(stderr, "Skipping CPU stolen, not supported...\n");
|
|
Packit |
577717 |
} else {
|
|
Packit |
577717 |
fprintf(stderr, "Failed to get CPU stolen: %s\n",
|
|
Packit |
577717 |
GuestLib_GetErrorText(glError));
|
|
Packit |
577717 |
return PAPI_ECMP;
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
glError = GuestLib_GetCpuUsedMs(context->glHandle,&temp64);
|
|
Packit |
577717 |
context->values[VMWARE_CPU_USED_MS]=temp64;
|
|
Packit |
577717 |
if (glError != VMGUESTLIB_ERROR_SUCCESS) {
|
|
Packit |
577717 |
fprintf(stderr, "Failed to get used ms: %s\n",
|
|
Packit |
577717 |
GuestLib_GetErrorText(glError));
|
|
Packit |
577717 |
return PAPI_ECMP;
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
glError = GuestLib_GetElapsedMs(context->glHandle, &temp64);
|
|
Packit |
577717 |
context->values[VMWARE_ELAPSED_MS]=temp64;
|
|
Packit |
577717 |
if (glError != VMGUESTLIB_ERROR_SUCCESS) {
|
|
Packit |
577717 |
fprintf(stderr, "Failed to get elapsed ms: %s\n",
|
|
Packit |
577717 |
GuestLib_GetErrorText(glError));
|
|
Packit |
577717 |
return PAPI_ECMP;
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
glError = GuestLib_GetMemActiveMB(context->glHandle, &temp32);
|
|
Packit |
577717 |
context->values[VMWARE_MEM_ACTIVE_MB]=temp32;
|
|
Packit |
577717 |
if (glError != VMGUESTLIB_ERROR_SUCCESS) {
|
|
Packit |
577717 |
fprintf(stderr, "Failed to get active mem: %s\n",
|
|
Packit |
577717 |
GuestLib_GetErrorText(glError));
|
|
Packit |
577717 |
return PAPI_ECMP;
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
glError = GuestLib_GetMemBalloonedMB(context->glHandle, &temp32);
|
|
Packit |
577717 |
context->values[VMWARE_MEM_BALLOONED_MB]=temp32;
|
|
Packit |
577717 |
if (glError != VMGUESTLIB_ERROR_SUCCESS) {
|
|
Packit |
577717 |
fprintf(stderr, "Failed to get ballooned mem: %s\n",
|
|
Packit |
577717 |
GuestLib_GetErrorText(glError));
|
|
Packit |
577717 |
return PAPI_ECMP;
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
glError = GuestLib_GetMemLimitMB(context->glHandle, &temp32);
|
|
Packit |
577717 |
context->values[VMWARE_MEM_LIMIT_MB]=temp32;
|
|
Packit |
577717 |
if (glError != VMGUESTLIB_ERROR_SUCCESS) {
|
|
Packit |
577717 |
fprintf(stderr,"Failed to get mem limit: %s\n",
|
|
Packit |
577717 |
GuestLib_GetErrorText(glError));
|
|
Packit |
577717 |
return PAPI_ECMP;
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
glError = GuestLib_GetMemMappedMB(context->glHandle, &temp32);
|
|
Packit |
577717 |
context->values[VMWARE_MEM_MAPPED_MB]=temp32;
|
|
Packit |
577717 |
if (glError != VMGUESTLIB_ERROR_SUCCESS) {
|
|
Packit |
577717 |
fprintf(stderr, "Failed to get mapped mem: %s\n",
|
|
Packit |
577717 |
GuestLib_GetErrorText(glError));
|
|
Packit |
577717 |
return PAPI_ECMP;
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
glError = GuestLib_GetMemOverheadMB(context->glHandle, &temp32);
|
|
Packit |
577717 |
context->values[VMWARE_MEM_OVERHEAD_MB]=temp32;
|
|
Packit |
577717 |
if (glError != VMGUESTLIB_ERROR_SUCCESS) {
|
|
Packit |
577717 |
fprintf(stderr, "Failed to get overhead mem: %s\n",
|
|
Packit |
577717 |
GuestLib_GetErrorText(glError));
|
|
Packit |
577717 |
return PAPI_ECMP;
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
glError = GuestLib_GetMemReservationMB(context->glHandle, &temp32);
|
|
Packit |
577717 |
context->values[VMWARE_MEM_RESERVATION_MB]=temp32;
|
|
Packit |
577717 |
if (glError != VMGUESTLIB_ERROR_SUCCESS) {
|
|
Packit |
577717 |
fprintf(stderr, "Failed to get mem reservation: %s\n",
|
|
Packit |
577717 |
GuestLib_GetErrorText(glError));
|
|
Packit |
577717 |
return PAPI_ECMP;
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
glError = GuestLib_GetMemSharedMB(context->glHandle, &temp32);
|
|
Packit |
577717 |
context->values[VMWARE_MEM_SHARED_MB]=temp32;
|
|
Packit |
577717 |
if (glError != VMGUESTLIB_ERROR_SUCCESS) {
|
|
Packit |
577717 |
fprintf(stderr, "Failed to get swapped mem: %s\n",
|
|
Packit |
577717 |
GuestLib_GetErrorText(glError));
|
|
Packit |
577717 |
return PAPI_ECMP;
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
glError = GuestLib_GetMemShares(context->glHandle, &temp32);
|
|
Packit |
577717 |
context->values[VMWARE_MEM_SHARES]=temp32;
|
|
Packit |
577717 |
if (glError != VMGUESTLIB_ERROR_SUCCESS) {
|
|
Packit |
577717 |
if (glError == VMGUESTLIB_ERROR_NOT_AVAILABLE) {
|
|
Packit |
577717 |
context->values[VMWARE_MEM_SHARES]=0;
|
|
Packit |
577717 |
fprintf(stderr, "Skipping mem shares, not supported...\n");
|
|
Packit |
577717 |
} else {
|
|
Packit |
577717 |
fprintf(stderr, "Failed to get mem shares: %s\n",
|
|
Packit |
577717 |
GuestLib_GetErrorText(glError));
|
|
Packit |
577717 |
return PAPI_ECMP;
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
glError = GuestLib_GetMemSwappedMB(context->glHandle, &temp32);
|
|
Packit |
577717 |
context->values[VMWARE_MEM_SWAPPED_MB]=temp32;
|
|
Packit |
577717 |
if (glError != VMGUESTLIB_ERROR_SUCCESS) {
|
|
Packit |
577717 |
fprintf(stderr, "Failed to get swapped mem: %s\n",
|
|
Packit |
577717 |
GuestLib_GetErrorText(glError));
|
|
Packit |
577717 |
return PAPI_ECMP;
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
glError = GuestLib_GetMemTargetSizeMB(context->glHandle, &temp64);
|
|
Packit |
577717 |
context->values[VMWARE_MEM_TARGET_SIZE_MB]=temp64;
|
|
Packit |
577717 |
if (glError != VMGUESTLIB_ERROR_SUCCESS) {
|
|
Packit |
577717 |
if (glError == VMGUESTLIB_ERROR_UNSUPPORTED_VERSION) {
|
|
Packit |
577717 |
context->values[VMWARE_MEM_TARGET_SIZE_MB]=0;
|
|
Packit |
577717 |
fprintf(stderr, "Skipping target mem size, not supported...\n");
|
|
Packit |
577717 |
} else {
|
|
Packit |
577717 |
fprintf(stderr, "Failed to get target mem size: %s\n",
|
|
Packit |
577717 |
GuestLib_GetErrorText(glError));
|
|
Packit |
577717 |
return PAPI_ECMP;
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
glError = GuestLib_GetMemUsedMB(context->glHandle, &temp32);
|
|
Packit |
577717 |
context->values[VMWARE_MEM_USED_MB]=temp32;
|
|
Packit |
577717 |
if (glError != VMGUESTLIB_ERROR_SUCCESS) {
|
|
Packit |
577717 |
fprintf(stderr, "Failed to get swapped mem: %s\n",
|
|
Packit |
577717 |
GuestLib_GetErrorText(glError));
|
|
Packit |
577717 |
return PAPI_ECMP;
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
glError = GuestLib_GetHostProcessorSpeed(context->glHandle, &temp32);
|
|
Packit |
577717 |
context->values[VMWARE_HOST_CPU_MHZ]=temp32;
|
|
Packit |
577717 |
if (glError != VMGUESTLIB_ERROR_SUCCESS) {
|
|
Packit |
577717 |
fprintf(stderr, "Failed to get host proc speed: %s\n",
|
|
Packit |
577717 |
GuestLib_GetErrorText(glError));
|
|
Packit |
577717 |
return PAPI_ECMP;
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
#endif
|
|
Packit |
577717 |
|
|
Packit |
577717 |
if (starting) {
|
|
Packit |
577717 |
|
|
Packit |
577717 |
for(i=0;i
|
|
Packit |
577717 |
context->start_values[i]=context->values[i];
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
return PAPI_OK;
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
/********************************************************************/
|
|
Packit |
577717 |
/* Below are the functions required by the PAPI component interface */
|
|
Packit |
577717 |
/********************************************************************/
|
|
Packit |
577717 |
|
|
Packit |
577717 |
/** This is called whenever a thread is initialized */
|
|
Packit |
577717 |
int
|
|
Packit |
577717 |
_vmware_init_thread( hwd_context_t *ctx )
|
|
Packit |
577717 |
{
|
|
Packit |
577717 |
(void) ctx;
|
|
Packit |
577717 |
|
|
Packit |
577717 |
|
|
Packit |
577717 |
#ifdef VMGUESTLIB
|
|
Packit |
577717 |
|
|
Packit |
577717 |
struct _vmware_context *context;
|
|
Packit |
577717 |
VMGuestLibError glError;
|
|
Packit |
577717 |
|
|
Packit |
577717 |
context=(struct _vmware_context *)ctx;
|
|
Packit |
577717 |
|
|
Packit |
577717 |
if (use_guestlib) {
|
|
Packit |
577717 |
glError = GuestLib_OpenHandle(&(context->glHandle));
|
|
Packit |
577717 |
if (glError != VMGUESTLIB_ERROR_SUCCESS) {
|
|
Packit |
577717 |
fprintf(stderr,"OpenHandle failed: %s\n",
|
|
Packit |
577717 |
GuestLib_GetErrorText(glError));
|
|
Packit |
577717 |
return PAPI_ECMP;
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
#endif
|
|
Packit |
577717 |
|
|
Packit |
577717 |
return PAPI_OK;
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
|
|
Packit |
577717 |
/** Initialize hardware counters, setup the function vector table
|
|
Packit |
577717 |
* and get hardware information, this routine is called when the
|
|
Packit |
577717 |
* PAPI process is initialized (IE PAPI_library_init)
|
|
Packit |
577717 |
*/
|
|
Packit |
577717 |
int
|
|
Packit |
577717 |
_vmware_init_component( int cidx )
|
|
Packit |
577717 |
{
|
|
Packit |
577717 |
|
|
Packit |
577717 |
(void) cidx;
|
|
Packit |
577717 |
|
|
Packit |
577717 |
int result;
|
|
Packit |
577717 |
|
|
Packit |
577717 |
SUBDBG( "_vmware_init_component..." );
|
|
Packit |
577717 |
|
|
Packit |
577717 |
/* Initialize and try to load the VMware library */
|
|
Packit |
577717 |
/* Try to load the library. */
|
|
Packit |
577717 |
result=LoadFunctions();
|
|
Packit |
577717 |
|
|
Packit |
577717 |
if (result!=PAPI_OK) {
|
|
Packit |
577717 |
strncpy(_vmware_vector.cmp_info.disabled_reason,
|
|
Packit |
577717 |
"GuestLibTest: Failed to load shared library",
|
|
Packit |
577717 |
PAPI_MAX_STR_LEN);
|
|
Packit |
577717 |
return PAPI_ECMP;
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
/* we know in advance how many events we want */
|
|
Packit |
577717 |
/* for actual hardware this might have to be determined dynamically */
|
|
Packit |
577717 |
|
|
Packit |
577717 |
/* Allocate memory for the our event table */
|
|
Packit |
577717 |
_vmware_native_table = ( struct _vmware_native_event_entry * )
|
|
Packit |
577717 |
calloc( VMWARE_MAX_COUNTERS, sizeof ( struct _vmware_native_event_entry ));
|
|
Packit |
577717 |
if ( _vmware_native_table == NULL ) {
|
|
Packit |
577717 |
return PAPI_ENOMEM;
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
|
|
Packit |
577717 |
#ifdef VMGUESTLIB
|
|
Packit |
577717 |
|
|
Packit |
577717 |
/* Detect if GuestLib works */
|
|
Packit |
577717 |
{
|
|
Packit |
577717 |
|
|
Packit |
577717 |
VMGuestLibError glError;
|
|
Packit |
577717 |
VMGuestLibHandle glHandle;
|
|
Packit |
577717 |
|
|
Packit |
577717 |
use_guestlib=0;
|
|
Packit |
577717 |
|
|
Packit |
577717 |
/* try to open */
|
|
Packit |
577717 |
glError = GuestLib_OpenHandle(&glHandle);
|
|
Packit |
577717 |
if (glError != VMGUESTLIB_ERROR_SUCCESS) {
|
|
Packit |
577717 |
fprintf(stderr,"OpenHandle failed: %s\n",
|
|
Packit |
577717 |
GuestLib_GetErrorText(glError));
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
else {
|
|
Packit |
577717 |
/* open worked, try to update */
|
|
Packit |
577717 |
glError = GuestLib_UpdateInfo(glHandle);
|
|
Packit |
577717 |
if (glError != VMGUESTLIB_ERROR_SUCCESS) {
|
|
Packit |
577717 |
fprintf(stderr,"UpdateInfo failed: %s\n",
|
|
Packit |
577717 |
GuestLib_GetErrorText(glError));
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
else {
|
|
Packit |
577717 |
/* update worked, things work! */
|
|
Packit |
577717 |
use_guestlib=1;
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
/* shut things down */
|
|
Packit |
577717 |
glError = GuestLib_CloseHandle(glHandle);
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
|
|
Packit |
577717 |
|
|
Packit |
577717 |
if (use_guestlib) {
|
|
Packit |
577717 |
|
|
Packit |
577717 |
/* fill in the event table parameters */
|
|
Packit |
577717 |
strcpy( _vmware_native_table[num_events].name,
|
|
Packit |
577717 |
"CPU_LIMIT" );
|
|
Packit |
577717 |
strncpy( _vmware_native_table[num_events].description,
|
|
Packit |
577717 |
"Retrieves the upper limit of processor use in MHz "
|
|
Packit |
577717 |
"available to the virtual machine.",
|
|
Packit |
577717 |
PAPI_HUGE_STR_LEN);
|
|
Packit |
577717 |
strcpy( _vmware_native_table[num_events].units,"MHz");
|
|
Packit |
577717 |
_vmware_native_table[num_events].which_counter=
|
|
Packit |
577717 |
VMWARE_CPU_LIMIT_MHZ;
|
|
Packit |
577717 |
_vmware_native_table[num_events].report_difference=0;
|
|
Packit |
577717 |
num_events++;
|
|
Packit |
577717 |
|
|
Packit |
577717 |
strcpy( _vmware_native_table[num_events].name,
|
|
Packit |
577717 |
"CPU_RESERVATION" );
|
|
Packit |
577717 |
strncpy( _vmware_native_table[num_events].description,
|
|
Packit |
577717 |
"Retrieves the minimum processing power in MHz "
|
|
Packit |
577717 |
"reserved for the virtual machine.",
|
|
Packit |
577717 |
PAPI_HUGE_STR_LEN);
|
|
Packit |
577717 |
strcpy( _vmware_native_table[num_events].units,"MHz");
|
|
Packit |
577717 |
_vmware_native_table[num_events].which_counter=
|
|
Packit |
577717 |
VMWARE_CPU_RESERVATION_MHZ;
|
|
Packit |
577717 |
_vmware_native_table[num_events].report_difference=0;
|
|
Packit |
577717 |
num_events++;
|
|
Packit |
577717 |
|
|
Packit |
577717 |
strcpy( _vmware_native_table[num_events].name,
|
|
Packit |
577717 |
"CPU_SHARES" );
|
|
Packit |
577717 |
strncpy( _vmware_native_table[num_events].description,
|
|
Packit |
577717 |
"Retrieves the number of CPU shares allocated "
|
|
Packit |
577717 |
"to the virtual machine.",
|
|
Packit |
577717 |
PAPI_HUGE_STR_LEN);
|
|
Packit |
577717 |
strcpy( _vmware_native_table[num_events].units,"shares");
|
|
Packit |
577717 |
_vmware_native_table[num_events].which_counter=
|
|
Packit |
577717 |
VMWARE_CPU_SHARES;
|
|
Packit |
577717 |
_vmware_native_table[num_events].report_difference=0;
|
|
Packit |
577717 |
num_events++;
|
|
Packit |
577717 |
|
|
Packit |
577717 |
strcpy( _vmware_native_table[num_events].name,
|
|
Packit |
577717 |
"CPU_STOLEN" );
|
|
Packit |
577717 |
strncpy( _vmware_native_table[num_events].description,
|
|
Packit |
577717 |
"Retrieves the number of milliseconds that the "
|
|
Packit |
577717 |
"virtual machine was in a ready state (able to "
|
|
Packit |
577717 |
"transition to a run state), but was not scheduled to run.",
|
|
Packit |
577717 |
PAPI_HUGE_STR_LEN);
|
|
Packit |
577717 |
strcpy( _vmware_native_table[num_events].units,"ms");
|
|
Packit |
577717 |
_vmware_native_table[num_events].which_counter=
|
|
Packit |
577717 |
VMWARE_CPU_STOLEN_MS;
|
|
Packit |
577717 |
_vmware_native_table[num_events].report_difference=0;
|
|
Packit |
577717 |
num_events++;
|
|
Packit |
577717 |
|
|
Packit |
577717 |
strcpy( _vmware_native_table[num_events].name,
|
|
Packit |
577717 |
"CPU_USED" );
|
|
Packit |
577717 |
strncpy( _vmware_native_table[num_events].description,
|
|
Packit |
577717 |
"Retrieves the number of milliseconds during which "
|
|
Packit |
577717 |
"the virtual machine has used the CPU. This value "
|
|
Packit |
577717 |
"includes the time used by the guest operating system "
|
|
Packit |
577717 |
"and the time used by virtualization code for tasks for "
|
|
Packit |
577717 |
"this virtual machine. You can combine this value with "
|
|
Packit |
577717 |
"the elapsed time (VMWARE_ELAPSED) to estimate the "
|
|
Packit |
577717 |
"effective virtual machine CPU speed. This value is a "
|
|
Packit |
577717 |
"subset of elapsedMs.",
|
|
Packit |
577717 |
PAPI_HUGE_STR_LEN );
|
|
Packit |
577717 |
strcpy( _vmware_native_table[num_events].units,"ms");
|
|
Packit |
577717 |
_vmware_native_table[num_events].which_counter=
|
|
Packit |
577717 |
VMWARE_CPU_USED_MS;
|
|
Packit |
577717 |
_vmware_native_table[num_events].report_difference=1;
|
|
Packit |
577717 |
num_events++;
|
|
Packit |
577717 |
|
|
Packit |
577717 |
strcpy( _vmware_native_table[num_events].name,
|
|
Packit |
577717 |
"ELAPSED" );
|
|
Packit |
577717 |
strncpy( _vmware_native_table[num_events].description,
|
|
Packit |
577717 |
"Retrieves the number of milliseconds that have passed "
|
|
Packit |
577717 |
"in the virtual machine since it last started running on "
|
|
Packit |
577717 |
"the server. The count of elapsed time restarts each time "
|
|
Packit |
577717 |
"the virtual machine is powered on, resumed, or migrated "
|
|
Packit |
577717 |
"using VMotion. This value counts milliseconds, regardless "
|
|
Packit |
577717 |
"of whether the virtual machine is using processing power "
|
|
Packit |
577717 |
"during that time. You can combine this value with the CPU "
|
|
Packit |
577717 |
"time used by the virtual machine (VMWARE_CPU_USED) to "
|
|
Packit |
577717 |
"estimate the effective virtual machine xCPU speed. "
|
|
Packit |
577717 |
"cpuUsedMS is a subset of this value.",
|
|
Packit |
577717 |
PAPI_HUGE_STR_LEN );
|
|
Packit |
577717 |
strcpy( _vmware_native_table[num_events].units,"ms");
|
|
Packit |
577717 |
_vmware_native_table[num_events].which_counter=
|
|
Packit |
577717 |
VMWARE_ELAPSED_MS;
|
|
Packit |
577717 |
_vmware_native_table[num_events].report_difference=1;
|
|
Packit |
577717 |
num_events++;
|
|
Packit |
577717 |
|
|
Packit |
577717 |
strcpy( _vmware_native_table[num_events].name,
|
|
Packit |
577717 |
"MEM_ACTIVE" );
|
|
Packit |
577717 |
strncpy( _vmware_native_table[num_events].description,
|
|
Packit |
577717 |
"Retrieves the amount of memory the virtual machine is "
|
|
Packit |
577717 |
"actively using in MB - Its estimated working set size.",
|
|
Packit |
577717 |
PAPI_HUGE_STR_LEN );
|
|
Packit |
577717 |
strcpy( _vmware_native_table[num_events].units,"MB");
|
|
Packit |
577717 |
_vmware_native_table[num_events].which_counter=
|
|
Packit |
577717 |
VMWARE_MEM_ACTIVE_MB;
|
|
Packit |
577717 |
_vmware_native_table[num_events].report_difference=0;
|
|
Packit |
577717 |
num_events++;
|
|
Packit |
577717 |
|
|
Packit |
577717 |
strcpy( _vmware_native_table[num_events].name,
|
|
Packit |
577717 |
"MEM_BALLOONED" );
|
|
Packit |
577717 |
strncpy( _vmware_native_table[num_events].description,
|
|
Packit |
577717 |
"Retrieves the amount of memory that has been reclaimed "
|
|
Packit |
577717 |
"from this virtual machine by the vSphere memory balloon "
|
|
Packit |
577717 |
"driver (also referred to as the 'vmemctl' driver) in MB.",
|
|
Packit |
577717 |
PAPI_HUGE_STR_LEN );
|
|
Packit |
577717 |
strcpy( _vmware_native_table[num_events].units,"MB");
|
|
Packit |
577717 |
_vmware_native_table[num_events].which_counter=
|
|
Packit |
577717 |
VMWARE_MEM_BALLOONED_MB;
|
|
Packit |
577717 |
_vmware_native_table[num_events].report_difference=0;
|
|
Packit |
577717 |
num_events++;
|
|
Packit |
577717 |
|
|
Packit |
577717 |
strcpy( _vmware_native_table[num_events].name,
|
|
Packit |
577717 |
"MEM_LIMIT" );
|
|
Packit |
577717 |
strncpy( _vmware_native_table[num_events].description,
|
|
Packit |
577717 |
"Retrieves the upper limit of memory that is available "
|
|
Packit |
577717 |
"to the virtual machine in MB.",
|
|
Packit |
577717 |
PAPI_HUGE_STR_LEN );
|
|
Packit |
577717 |
strcpy( _vmware_native_table[num_events].units,"MB");
|
|
Packit |
577717 |
_vmware_native_table[num_events].which_counter=
|
|
Packit |
577717 |
VMWARE_MEM_LIMIT_MB;
|
|
Packit |
577717 |
_vmware_native_table[num_events].report_difference=0;
|
|
Packit |
577717 |
num_events++;
|
|
Packit |
577717 |
|
|
Packit |
577717 |
strcpy( _vmware_native_table[num_events].name,
|
|
Packit |
577717 |
"MEM_MAPPED" );
|
|
Packit |
577717 |
strncpy( _vmware_native_table[num_events].description,
|
|
Packit |
577717 |
"Retrieves the amount of memory that is allocated to "
|
|
Packit |
577717 |
"the virtual machine in MB. Memory that is ballooned, "
|
|
Packit |
577717 |
"swapped, or has never been accessed is excluded.",
|
|
Packit |
577717 |
PAPI_HUGE_STR_LEN );
|
|
Packit |
577717 |
strcpy( _vmware_native_table[num_events].units,"MB");
|
|
Packit |
577717 |
_vmware_native_table[num_events].which_counter=
|
|
Packit |
577717 |
VMWARE_MEM_MAPPED_MB;
|
|
Packit |
577717 |
_vmware_native_table[num_events].report_difference=0;
|
|
Packit |
577717 |
num_events++;
|
|
Packit |
577717 |
|
|
Packit |
577717 |
strcpy( _vmware_native_table[num_events].name,
|
|
Packit |
577717 |
"MEM_OVERHEAD" );
|
|
Packit |
577717 |
strncpy( _vmware_native_table[num_events].description,
|
|
Packit |
577717 |
"Retrieves the amount of 'overhead' memory associated "
|
|
Packit |
577717 |
"with this virtual machine that is currently consumed "
|
|
Packit |
577717 |
"on the host system in MB. Overhead memory is additional "
|
|
Packit |
577717 |
"memory that is reserved for data structures required by "
|
|
Packit |
577717 |
"the virtualization layer.",
|
|
Packit |
577717 |
PAPI_HUGE_STR_LEN );
|
|
Packit |
577717 |
strcpy( _vmware_native_table[num_events].units,"MB");
|
|
Packit |
577717 |
_vmware_native_table[num_events].which_counter=
|
|
Packit |
577717 |
VMWARE_MEM_OVERHEAD_MB;
|
|
Packit |
577717 |
_vmware_native_table[num_events].report_difference=0;
|
|
Packit |
577717 |
num_events++;
|
|
Packit |
577717 |
|
|
Packit |
577717 |
strcpy( _vmware_native_table[num_events].name,
|
|
Packit |
577717 |
"MEM_RESERVATION" );
|
|
Packit |
577717 |
strncpy( _vmware_native_table[num_events].description,
|
|
Packit |
577717 |
"Retrieves the minimum amount of memory that is "
|
|
Packit |
577717 |
"reserved for the virtual machine in MB.",
|
|
Packit |
577717 |
PAPI_HUGE_STR_LEN );
|
|
Packit |
577717 |
strcpy( _vmware_native_table[num_events].units,"MB");
|
|
Packit |
577717 |
_vmware_native_table[num_events].which_counter=
|
|
Packit |
577717 |
VMWARE_MEM_RESERVATION_MB;
|
|
Packit |
577717 |
_vmware_native_table[num_events].report_difference=0;
|
|
Packit |
577717 |
num_events++;
|
|
Packit |
577717 |
|
|
Packit |
577717 |
strcpy( _vmware_native_table[num_events].name,
|
|
Packit |
577717 |
"MEM_SHARED" );
|
|
Packit |
577717 |
strncpy( _vmware_native_table[num_events].description,
|
|
Packit |
577717 |
"Retrieves the amount of physical memory associated "
|
|
Packit |
577717 |
"with this virtual machine that is copy-on-write (COW) "
|
|
Packit |
577717 |
"shared on the host in MB.",
|
|
Packit |
577717 |
PAPI_HUGE_STR_LEN );
|
|
Packit |
577717 |
strcpy( _vmware_native_table[num_events].units,"MB");
|
|
Packit |
577717 |
_vmware_native_table[num_events].which_counter=
|
|
Packit |
577717 |
VMWARE_MEM_SHARED_MB;
|
|
Packit |
577717 |
_vmware_native_table[num_events].report_difference=0;
|
|
Packit |
577717 |
num_events++;
|
|
Packit |
577717 |
|
|
Packit |
577717 |
strcpy( _vmware_native_table[num_events].name,
|
|
Packit |
577717 |
"MEM_SHARES" );
|
|
Packit |
577717 |
strncpy( _vmware_native_table[num_events].description,
|
|
Packit |
577717 |
"Retrieves the number of memory shares allocated to "
|
|
Packit |
577717 |
"the virtual machine.",
|
|
Packit |
577717 |
PAPI_HUGE_STR_LEN );
|
|
Packit |
577717 |
strcpy( _vmware_native_table[num_events].units,"shares");
|
|
Packit |
577717 |
_vmware_native_table[num_events].which_counter=
|
|
Packit |
577717 |
VMWARE_MEM_SHARES;
|
|
Packit |
577717 |
_vmware_native_table[num_events].report_difference=0;
|
|
Packit |
577717 |
num_events++;
|
|
Packit |
577717 |
|
|
Packit |
577717 |
strcpy( _vmware_native_table[num_events].name,
|
|
Packit |
577717 |
"MEM_SWAPPED" );
|
|
Packit |
577717 |
strncpy( _vmware_native_table[num_events].description,
|
|
Packit |
577717 |
"Retrieves the amount of memory that has been reclaimed "
|
|
Packit |
577717 |
"from this virtual machine by transparently swapping "
|
|
Packit |
577717 |
"guest memory to disk in MB.",
|
|
Packit |
577717 |
PAPI_HUGE_STR_LEN );
|
|
Packit |
577717 |
strcpy( _vmware_native_table[num_events].units,"MB");
|
|
Packit |
577717 |
_vmware_native_table[num_events].which_counter=
|
|
Packit |
577717 |
VMWARE_MEM_SWAPPED_MB;
|
|
Packit |
577717 |
_vmware_native_table[num_events].report_difference=0;
|
|
Packit |
577717 |
num_events++;
|
|
Packit |
577717 |
|
|
Packit |
577717 |
strcpy( _vmware_native_table[num_events].name,
|
|
Packit |
577717 |
"MEM_TARGET_SIZE" );
|
|
Packit |
577717 |
strncpy( _vmware_native_table[num_events].description,
|
|
Packit |
577717 |
"Retrieves the size of the target memory allocation "
|
|
Packit |
577717 |
"for this virtual machine in MB.",
|
|
Packit |
577717 |
PAPI_HUGE_STR_LEN );
|
|
Packit |
577717 |
strcpy( _vmware_native_table[num_events].units,"MB");
|
|
Packit |
577717 |
_vmware_native_table[num_events].which_counter=
|
|
Packit |
577717 |
VMWARE_MEM_TARGET_SIZE_MB;
|
|
Packit |
577717 |
_vmware_native_table[num_events].report_difference=0;
|
|
Packit |
577717 |
num_events++;
|
|
Packit |
577717 |
|
|
Packit |
577717 |
strcpy( _vmware_native_table[num_events].name,
|
|
Packit |
577717 |
"MEM_USED" );
|
|
Packit |
577717 |
strncpy( _vmware_native_table[num_events].description,
|
|
Packit |
577717 |
"Retrieves the estimated amount of physical host memory "
|
|
Packit |
577717 |
"currently consumed for this virtual machine's "
|
|
Packit |
577717 |
"physical memory.",
|
|
Packit |
577717 |
PAPI_HUGE_STR_LEN );
|
|
Packit |
577717 |
strcpy( _vmware_native_table[num_events].units,"MB");
|
|
Packit |
577717 |
_vmware_native_table[num_events].which_counter=
|
|
Packit |
577717 |
VMWARE_MEM_USED_MB;
|
|
Packit |
577717 |
_vmware_native_table[num_events].report_difference=0;
|
|
Packit |
577717 |
num_events++;
|
|
Packit |
577717 |
|
|
Packit |
577717 |
strcpy( _vmware_native_table[num_events].name,
|
|
Packit |
577717 |
"HOST_CPU" );
|
|
Packit |
577717 |
strncpy( _vmware_native_table[num_events].description,
|
|
Packit |
577717 |
"Retrieves the speed of the ESX system's physical "
|
|
Packit |
577717 |
"CPU in MHz.",
|
|
Packit |
577717 |
PAPI_HUGE_STR_LEN );
|
|
Packit |
577717 |
strcpy( _vmware_native_table[num_events].units,"MHz");
|
|
Packit |
577717 |
_vmware_native_table[num_events].which_counter=
|
|
Packit |
577717 |
VMWARE_HOST_CPU_MHZ;
|
|
Packit |
577717 |
_vmware_native_table[num_events].report_difference=0;
|
|
Packit |
577717 |
num_events++;
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
#endif
|
|
Packit |
577717 |
|
|
Packit |
577717 |
/* For VMWare Pseudo Performance Counters */
|
|
Packit |
577717 |
if ( getenv( "PAPI_VMWARE_PSEUDOPERFORMANCE" ) ) {
|
|
Packit |
577717 |
|
|
Packit |
577717 |
use_pseudo=1;
|
|
Packit |
577717 |
|
|
Packit |
577717 |
strcpy( _vmware_native_table[num_events].name,
|
|
Packit |
577717 |
"HOST_TSC" );
|
|
Packit |
577717 |
strncpy( _vmware_native_table[num_events].description,
|
|
Packit |
577717 |
"Physical host TSC",
|
|
Packit |
577717 |
PAPI_HUGE_STR_LEN );
|
|
Packit |
577717 |
strcpy( _vmware_native_table[num_events].units,"cycles");
|
|
Packit |
577717 |
_vmware_native_table[num_events].which_counter=
|
|
Packit |
577717 |
VMWARE_HOST_TSC;
|
|
Packit |
577717 |
_vmware_native_table[num_events].report_difference=1;
|
|
Packit |
577717 |
num_events++;
|
|
Packit |
577717 |
|
|
Packit |
577717 |
strcpy( _vmware_native_table[num_events].name,
|
|
Packit |
577717 |
"ELAPSED_TIME" );
|
|
Packit |
577717 |
strncpy( _vmware_native_table[num_events].description,
|
|
Packit |
577717 |
"Elapsed real time in ns.",
|
|
Packit |
577717 |
PAPI_HUGE_STR_LEN );
|
|
Packit |
577717 |
strcpy( _vmware_native_table[num_events].units,"ns");
|
|
Packit |
577717 |
_vmware_native_table[num_events].which_counter=
|
|
Packit |
577717 |
VMWARE_ELAPSED_TIME;
|
|
Packit |
577717 |
_vmware_native_table[num_events].report_difference=1;
|
|
Packit |
577717 |
num_events++;
|
|
Packit |
577717 |
|
|
Packit |
577717 |
strcpy( _vmware_native_table[num_events].name,
|
|
Packit |
577717 |
"ELAPSED_APPARENT" );
|
|
Packit |
577717 |
strncpy( _vmware_native_table[num_events].description,
|
|
Packit |
577717 |
"Elapsed apparent time in ns.",
|
|
Packit |
577717 |
PAPI_HUGE_STR_LEN );
|
|
Packit |
577717 |
strcpy( _vmware_native_table[num_events].units,"ns");
|
|
Packit |
577717 |
_vmware_native_table[num_events].which_counter=
|
|
Packit |
577717 |
VMWARE_ELAPSED_APPARENT;
|
|
Packit |
577717 |
_vmware_native_table[num_events].report_difference=1;
|
|
Packit |
577717 |
num_events++;
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
if (num_events==0) {
|
|
Packit |
577717 |
strncpy(_vmware_vector.cmp_info.disabled_reason,
|
|
Packit |
577717 |
"VMware SDK not installed, and PAPI_VMWARE_PSEUDOPERFORMANCE not set",
|
|
Packit |
577717 |
PAPI_MAX_STR_LEN);
|
|
Packit |
577717 |
return PAPI_ECMP;
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
_vmware_vector.cmp_info.num_native_events = num_events;
|
|
Packit |
577717 |
|
|
Packit |
577717 |
return PAPI_OK;
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
/** Setup the counter control structure */
|
|
Packit |
577717 |
int
|
|
Packit |
577717 |
_vmware_init_control_state( hwd_control_state_t *ctl )
|
|
Packit |
577717 |
{
|
|
Packit |
577717 |
(void) ctl;
|
|
Packit |
577717 |
|
|
Packit |
577717 |
return PAPI_OK;
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
/** Enumerate Native Events
|
|
Packit |
577717 |
@param EventCode is the event of interest
|
|
Packit |
577717 |
@param modifier is one of PAPI_ENUM_FIRST, PAPI_ENUM_EVENTS
|
|
Packit |
577717 |
*/
|
|
Packit |
577717 |
int
|
|
Packit |
577717 |
_vmware_ntv_enum_events( unsigned int *EventCode, int modifier )
|
|
Packit |
577717 |
{
|
|
Packit |
577717 |
|
|
Packit |
577717 |
switch ( modifier ) {
|
|
Packit |
577717 |
/* return EventCode of first event */
|
|
Packit |
577717 |
case PAPI_ENUM_FIRST:
|
|
Packit |
577717 |
if (num_events==0) return PAPI_ENOEVNT;
|
|
Packit |
577717 |
*EventCode = 0;
|
|
Packit |
577717 |
return PAPI_OK;
|
|
Packit |
577717 |
break;
|
|
Packit |
577717 |
/* return EventCode of passed-in Event */
|
|
Packit |
577717 |
case PAPI_ENUM_EVENTS:{
|
|
Packit |
577717 |
int index = *EventCode;
|
|
Packit |
577717 |
|
|
Packit |
577717 |
if ( index < num_events - 1 ) {
|
|
Packit |
577717 |
*EventCode = *EventCode + 1;
|
|
Packit |
577717 |
return PAPI_OK;
|
|
Packit |
577717 |
} else {
|
|
Packit |
577717 |
return PAPI_ENOEVNT;
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
break;
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
default:
|
|
Packit |
577717 |
return PAPI_EINVAL;
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
return PAPI_EINVAL;
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
int
|
|
Packit |
577717 |
_vmware_ntv_code_to_info(unsigned int EventCode, PAPI_event_info_t *info)
|
|
Packit |
577717 |
{
|
|
Packit |
577717 |
|
|
Packit |
577717 |
int index = EventCode;
|
|
Packit |
577717 |
|
|
Packit |
577717 |
if ( ( index < 0) || (index >= num_events )) return PAPI_ENOEVNT;
|
|
Packit |
577717 |
|
|
Packit |
577717 |
strncpy( info->symbol, _vmware_native_table[index].name,
|
|
Packit |
577717 |
sizeof(info->symbol));
|
|
Packit |
577717 |
|
|
Packit |
577717 |
strncpy( info->long_descr, _vmware_native_table[index].description,
|
|
Packit |
577717 |
sizeof(info->symbol));
|
|
Packit |
577717 |
|
|
Packit |
577717 |
strncpy( info->units, _vmware_native_table[index].units,
|
|
Packit |
577717 |
sizeof(info->units));
|
|
Packit |
577717 |
|
|
Packit |
577717 |
return PAPI_OK;
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
|
|
Packit |
577717 |
/** Takes a native event code and passes back the name
|
|
Packit |
577717 |
@param EventCode is the native event code
|
|
Packit |
577717 |
@param name is a pointer for the name to be copied to
|
|
Packit |
577717 |
@param len is the size of the string
|
|
Packit |
577717 |
*/
|
|
Packit |
577717 |
int
|
|
Packit |
577717 |
_vmware_ntv_code_to_name( unsigned int EventCode, char *name, int len )
|
|
Packit |
577717 |
{
|
|
Packit |
577717 |
int index = EventCode;
|
|
Packit |
577717 |
|
|
Packit |
577717 |
if ( index >= 0 && index < num_events ) {
|
|
Packit |
577717 |
strncpy( name, _vmware_native_table[index].name, len );
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
return PAPI_OK;
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
/** Takes a native event code and passes back the event description
|
|
Packit |
577717 |
@param EventCode is the native event code
|
|
Packit |
577717 |
@param name is a pointer for the description to be copied to
|
|
Packit |
577717 |
@param len is the size of the string
|
|
Packit |
577717 |
*/
|
|
Packit |
577717 |
int
|
|
Packit |
577717 |
_vmware_ntv_code_to_descr( unsigned int EventCode, char *name, int len )
|
|
Packit |
577717 |
{
|
|
Packit |
577717 |
int index = EventCode;
|
|
Packit |
577717 |
|
|
Packit |
577717 |
if ( index >= 0 && index < num_events ) {
|
|
Packit |
577717 |
strncpy( name, _vmware_native_table[index].description, len );
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
return PAPI_OK;
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
/** Triggered by eventset operations like add or remove */
|
|
Packit |
577717 |
int
|
|
Packit |
577717 |
_vmware_update_control_state( hwd_control_state_t *ctl,
|
|
Packit |
577717 |
NativeInfo_t *native,
|
|
Packit |
577717 |
int count,
|
|
Packit |
577717 |
hwd_context_t *ctx )
|
|
Packit |
577717 |
{
|
|
Packit |
577717 |
(void) ctx;
|
|
Packit |
577717 |
|
|
Packit |
577717 |
struct _vmware_control_state *control;
|
|
Packit |
577717 |
|
|
Packit |
577717 |
int i, index;
|
|
Packit |
577717 |
|
|
Packit |
577717 |
control=(struct _vmware_control_state *)ctl;
|
|
Packit |
577717 |
|
|
Packit |
577717 |
for ( i = 0; i < count; i++ ) {
|
|
Packit |
577717 |
index = native[i].ni_event;
|
|
Packit |
577717 |
control->which_counter[i]=_vmware_native_table[index].which_counter;
|
|
Packit |
577717 |
native[i].ni_position = i;
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
control->num_events=count;
|
|
Packit |
577717 |
|
|
Packit |
577717 |
return PAPI_OK;
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
/** Triggered by PAPI_start() */
|
|
Packit |
577717 |
int
|
|
Packit |
577717 |
_vmware_start( hwd_context_t *ctx, hwd_control_state_t *ctl )
|
|
Packit |
577717 |
{
|
|
Packit |
577717 |
struct _vmware_context *context;
|
|
Packit |
577717 |
(void) ctl;
|
|
Packit |
577717 |
|
|
Packit |
577717 |
context=(struct _vmware_context *)ctx;
|
|
Packit |
577717 |
|
|
Packit |
577717 |
_vmware_hardware_read( context, 1 );
|
|
Packit |
577717 |
|
|
Packit |
577717 |
return PAPI_OK;
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
/** Triggered by PAPI_stop() */
|
|
Packit |
577717 |
int
|
|
Packit |
577717 |
_vmware_stop( hwd_context_t *ctx, hwd_control_state_t *ctl )
|
|
Packit |
577717 |
{
|
|
Packit |
577717 |
|
|
Packit |
577717 |
struct _vmware_context *context;
|
|
Packit |
577717 |
(void) ctl;
|
|
Packit |
577717 |
|
|
Packit |
577717 |
context=(struct _vmware_context *)ctx;
|
|
Packit |
577717 |
|
|
Packit |
577717 |
_vmware_hardware_read( context, 0 );
|
|
Packit |
577717 |
|
|
Packit |
577717 |
return PAPI_OK;
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
/** Triggered by PAPI_read() */
|
|
Packit |
577717 |
int
|
|
Packit |
577717 |
_vmware_read( hwd_context_t *ctx,
|
|
Packit |
577717 |
hwd_control_state_t *ctl,
|
|
Packit |
577717 |
long_long **events, int flags )
|
|
Packit |
577717 |
{
|
|
Packit |
577717 |
|
|
Packit |
577717 |
struct _vmware_context *context;
|
|
Packit |
577717 |
struct _vmware_control_state *control;
|
|
Packit |
577717 |
|
|
Packit |
577717 |
(void) flags;
|
|
Packit |
577717 |
int i;
|
|
Packit |
577717 |
|
|
Packit |
577717 |
context=(struct _vmware_context *)ctx;
|
|
Packit |
577717 |
control=(struct _vmware_control_state *)ctl;
|
|
Packit |
577717 |
|
|
Packit |
577717 |
_vmware_hardware_read( context, 0 );
|
|
Packit |
577717 |
|
|
Packit |
577717 |
for (i=0; i<control->num_events; i++) {
|
|
Packit |
577717 |
|
|
Packit |
577717 |
if (_vmware_native_table[
|
|
Packit |
577717 |
_vmware_native_table[control->which_counter[i]].which_counter].
|
|
Packit |
577717 |
report_difference) {
|
|
Packit |
577717 |
control->value[i]=context->values[control->which_counter[i]]-
|
|
Packit |
577717 |
context->start_values[control->which_counter[i]];
|
|
Packit |
577717 |
} else {
|
|
Packit |
577717 |
control->value[i]=context->values[control->which_counter[i]];
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
// printf("%d %d %lld-%lld=%lld\n",i,control->which_counter[i],
|
|
Packit |
577717 |
// context->values[control->which_counter[i]],
|
|
Packit |
577717 |
// context->start_values[control->which_counter[i]],
|
|
Packit |
577717 |
// control->value[i]);
|
|
Packit |
577717 |
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
*events = control->value;
|
|
Packit |
577717 |
|
|
Packit |
577717 |
return PAPI_OK;
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
/** Triggered by PAPI_write(), but only if the counters are running */
|
|
Packit |
577717 |
/* otherwise, the updated state is written to ESI->hw_start */
|
|
Packit |
577717 |
int
|
|
Packit |
577717 |
_vmware_write( hwd_context_t * ctx, hwd_control_state_t * ctrl, long_long events[] )
|
|
Packit |
577717 |
{
|
|
Packit |
577717 |
(void) ctx;
|
|
Packit |
577717 |
(void) ctrl;
|
|
Packit |
577717 |
(void) events;
|
|
Packit |
577717 |
SUBDBG( "_vmware_write... %p %p", ctx, ctrl );
|
|
Packit |
577717 |
/* FIXME... this should actually carry out the write, though */
|
|
Packit |
577717 |
/* this is non-trivial as which counter being written has to be */
|
|
Packit |
577717 |
/* determined somehow. */
|
|
Packit |
577717 |
return PAPI_OK;
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
/** Triggered by PAPI_reset */
|
|
Packit |
577717 |
int
|
|
Packit |
577717 |
_vmware_reset( hwd_context_t *ctx, hwd_control_state_t *ctl )
|
|
Packit |
577717 |
{
|
|
Packit |
577717 |
(void) ctx;
|
|
Packit |
577717 |
(void) ctl;
|
|
Packit |
577717 |
|
|
Packit |
577717 |
return PAPI_OK;
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
/** Shutting down a context */
|
|
Packit |
577717 |
int
|
|
Packit |
577717 |
_vmware_shutdown_thread( hwd_context_t *ctx )
|
|
Packit |
577717 |
{
|
|
Packit |
577717 |
(void) ctx;
|
|
Packit |
577717 |
|
|
Packit |
577717 |
#ifdef VMGUESTLIB
|
|
Packit |
577717 |
VMGuestLibError glError;
|
|
Packit |
577717 |
struct _vmware_context *context;
|
|
Packit |
577717 |
|
|
Packit |
577717 |
context=(struct _vmware_context *)ctx;
|
|
Packit |
577717 |
|
|
Packit |
577717 |
if (use_guestlib) {
|
|
Packit |
577717 |
glError = GuestLib_CloseHandle(context->glHandle);
|
|
Packit |
577717 |
if (glError != VMGUESTLIB_ERROR_SUCCESS) {
|
|
Packit |
577717 |
fprintf(stderr, "Failed to CloseHandle: %s\n",
|
|
Packit |
577717 |
GuestLib_GetErrorText(glError));
|
|
Packit |
577717 |
return PAPI_ECMP;
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
#endif
|
|
Packit |
577717 |
|
|
Packit |
577717 |
return PAPI_OK;
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
/** Triggered by PAPI_shutdown() */
|
|
Packit |
577717 |
int
|
|
Packit |
577717 |
_vmware_shutdown_component( void )
|
|
Packit |
577717 |
{
|
|
Packit |
577717 |
|
|
Packit |
577717 |
#ifdef VMGUESTLIB
|
|
Packit |
577717 |
if (dlclose(dlHandle)) {
|
|
Packit |
577717 |
fprintf(stderr, "dlclose failed\n");
|
|
Packit |
577717 |
return EXIT_FAILURE;
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
#endif
|
|
Packit |
577717 |
|
|
Packit |
577717 |
return PAPI_OK;
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
|
|
Packit |
577717 |
/** This function sets various options in the component
|
|
Packit |
577717 |
@param ctx
|
|
Packit |
577717 |
@param code valid are PAPI_SET_DEFDOM, PAPI_SET_DOMAIN, PAPI_SETDEFGRN, PAPI_SET_GRANUL and PAPI_SET_INHERIT
|
|
Packit |
577717 |
@param option
|
|
Packit |
577717 |
*/
|
|
Packit |
577717 |
int
|
|
Packit |
577717 |
_vmware_ctl( hwd_context_t *ctx, int code, _papi_int_option_t *option )
|
|
Packit |
577717 |
{
|
|
Packit |
577717 |
|
|
Packit |
577717 |
(void) ctx;
|
|
Packit |
577717 |
(void) code;
|
|
Packit |
577717 |
(void) option;
|
|
Packit |
577717 |
|
|
Packit |
577717 |
SUBDBG( "_vmware_ctl..." );
|
|
Packit |
577717 |
|
|
Packit |
577717 |
return PAPI_OK;
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
/** This function has to set the bits needed to count different domains
|
|
Packit |
577717 |
In particular: PAPI_DOM_USER, PAPI_DOM_KERNEL PAPI_DOM_OTHER
|
|
Packit |
577717 |
By default return PAPI_EINVAL if none of those are specified
|
|
Packit |
577717 |
and PAPI_OK with success
|
|
Packit |
577717 |
PAPI_DOM_USER is only user context is counted
|
|
Packit |
577717 |
PAPI_DOM_KERNEL is only the Kernel/OS context is counted
|
|
Packit |
577717 |
PAPI_DOM_OTHER is Exception/transient mode (like user TLB misses)
|
|
Packit |
577717 |
PAPI_DOM_ALL is all of the domains
|
|
Packit |
577717 |
*/
|
|
Packit |
577717 |
int
|
|
Packit |
577717 |
_vmware_set_domain( hwd_control_state_t *ctl, int domain )
|
|
Packit |
577717 |
{
|
|
Packit |
577717 |
(void) ctl;
|
|
Packit |
577717 |
|
|
Packit |
577717 |
int found = 0;
|
|
Packit |
577717 |
SUBDBG( "_vmware_set_domain..." );
|
|
Packit |
577717 |
if ( PAPI_DOM_USER & domain ) {
|
|
Packit |
577717 |
SUBDBG( " PAPI_DOM_USER " );
|
|
Packit |
577717 |
found = 1;
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
if ( PAPI_DOM_KERNEL & domain ) {
|
|
Packit |
577717 |
SUBDBG( " PAPI_DOM_KERNEL " );
|
|
Packit |
577717 |
found = 1;
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
if ( PAPI_DOM_OTHER & domain ) {
|
|
Packit |
577717 |
SUBDBG( " PAPI_DOM_OTHER " );
|
|
Packit |
577717 |
found = 1;
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
if ( PAPI_DOM_ALL & domain ) {
|
|
Packit |
577717 |
SUBDBG( " PAPI_DOM_ALL " );
|
|
Packit |
577717 |
found = 1;
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
if ( !found ) {
|
|
Packit |
577717 |
return ( PAPI_EINVAL );
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
return PAPI_OK;
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
/** Vector that points to entry points for our component */
|
|
Packit |
577717 |
papi_vector_t _vmware_vector = {
|
|
Packit |
577717 |
.cmp_info = {
|
|
Packit |
577717 |
/* default component information (unspecified values are initialized to 0) */
|
|
Packit |
577717 |
.name = "vmware",
|
|
Packit |
577717 |
.short_name = "vmware",
|
|
Packit |
577717 |
.description = "Provide support for VMware vmguest and pseudo counters",
|
|
Packit |
577717 |
.version = "5.0",
|
|
Packit |
577717 |
.num_mpx_cntrs = VMWARE_MAX_COUNTERS,
|
|
Packit |
577717 |
.num_cntrs = VMWARE_MAX_COUNTERS,
|
|
Packit |
577717 |
.default_domain = PAPI_DOM_USER,
|
|
Packit |
577717 |
.available_domains = PAPI_DOM_USER,
|
|
Packit |
577717 |
.default_granularity = PAPI_GRN_THR,
|
|
Packit |
577717 |
.available_granularities = PAPI_GRN_THR,
|
|
Packit |
577717 |
.hardware_intr_sig = PAPI_INT_SIGNAL,
|
|
Packit |
577717 |
|
|
Packit |
577717 |
/* component specific cmp_info initializations */
|
|
Packit |
577717 |
.fast_real_timer = 0,
|
|
Packit |
577717 |
.fast_virtual_timer = 0,
|
|
Packit |
577717 |
.attach = 0,
|
|
Packit |
577717 |
.attach_must_ptrace = 0,
|
|
Packit |
577717 |
},
|
|
Packit |
577717 |
/* sizes of framework-opaque component-private structures */
|
|
Packit |
577717 |
.size = {
|
|
Packit |
577717 |
.context = sizeof ( struct _vmware_context ),
|
|
Packit |
577717 |
.control_state = sizeof ( struct _vmware_control_state ),
|
|
Packit |
577717 |
.reg_value = sizeof ( struct _vmware_register ),
|
|
Packit |
577717 |
.reg_alloc = sizeof ( struct _vmware_reg_alloc ),
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
,
|
|
Packit |
577717 |
/* function pointers in this component */
|
|
Packit |
577717 |
.init_thread = _vmware_init_thread,
|
|
Packit |
577717 |
.init_component = _vmware_init_component,
|
|
Packit |
577717 |
.init_control_state = _vmware_init_control_state,
|
|
Packit |
577717 |
.start = _vmware_start,
|
|
Packit |
577717 |
.stop = _vmware_stop,
|
|
Packit |
577717 |
.read = _vmware_read,
|
|
Packit |
577717 |
.write = _vmware_write,
|
|
Packit |
577717 |
.shutdown_thread = _vmware_shutdown_thread,
|
|
Packit |
577717 |
.shutdown_component = _vmware_shutdown_component,
|
|
Packit |
577717 |
.ctl = _vmware_ctl,
|
|
Packit |
577717 |
|
|
Packit |
577717 |
.update_control_state = _vmware_update_control_state,
|
|
Packit |
577717 |
.set_domain = _vmware_set_domain,
|
|
Packit |
577717 |
.reset = _vmware_reset,
|
|
Packit |
577717 |
|
|
Packit |
577717 |
.ntv_enum_events = _vmware_ntv_enum_events,
|
|
Packit |
577717 |
.ntv_code_to_name = _vmware_ntv_code_to_name,
|
|
Packit |
577717 |
.ntv_code_to_descr = _vmware_ntv_code_to_descr,
|
|
Packit |
577717 |
.ntv_code_to_info = _vmware_ntv_code_to_info,
|
|
Packit |
577717 |
|
|
Packit |
577717 |
};
|
|
Packit |
577717 |
|