PAPI 7.1.0.0
Loading...
Searching...
No Matches
vmware.c
Go to the documentation of this file.
1/****************************/
2/* THIS IS OPEN SOURCE CODE */
3/****************************/
4
23#include <stdio.h>
24#include <string.h>
25#include <stdlib.h>
26#include <stdint.h>
27
28#include <unistd.h>
29#include <dlfcn.h>
30
31/* Headers required by PAPI */
32#include "papi.h"
33#include "papi_internal.h"
34#include "papi_vector.h"
35#include "papi_memory.h"
36
37#define VMWARE_MAX_COUNTERS 256
38
39#define VMWARE_CPU_LIMIT_MHZ 0
40#define VMWARE_CPU_RESERVATION_MHZ 1
41#define VMWARE_CPU_SHARES 2
42#define VMWARE_CPU_STOLEN_MS 3
43#define VMWARE_CPU_USED_MS 4
44#define VMWARE_ELAPSED_MS 5
45
46#define VMWARE_MEM_ACTIVE_MB 6
47#define VMWARE_MEM_BALLOONED_MB 7
48#define VMWARE_MEM_LIMIT_MB 8
49#define VMWARE_MEM_MAPPED_MB 9
50#define VMWARE_MEM_OVERHEAD_MB 10
51#define VMWARE_MEM_RESERVATION_MB 11
52#define VMWARE_MEM_SHARED_MB 12
53#define VMWARE_MEM_SHARES 13
54#define VMWARE_MEM_SWAPPED_MB 14
55#define VMWARE_MEM_TARGET_SIZE_MB 15
56#define VMWARE_MEM_USED_MB 16
57
58#define VMWARE_HOST_CPU_MHZ 17
59
60/* The following 3 require VMWARE_PSEUDO_PERFORMANCE env_var to be set. */
61
62#define VMWARE_HOST_TSC 18
63#define VMWARE_ELAPSED_TIME 19
64#define VMWARE_ELAPSED_APPARENT 20
65
66/* Begin PAPI definitions */
68
69
70void (*_dl_non_dynamic_init)(void) __attribute__((weak));
71
73struct _vmware_register {
74 unsigned int selector;
77};
78
86};
87
89 struct _vmware_register ra_bits;
90};
91
92
93inline uint64_t rdpmc(int c)
94{
95 uint32_t low, high;
96 __asm__ __volatile__("rdpmc" : "=a" (low), "=d" (high) : "c" (c));
97 return (uint64_t)high << 32 | (uint64_t)low;
98}
99
100
101
102#ifdef VMGUESTLIB
103/* Headers required by VMware */
104#include "vmGuestLib.h"
105
106/* Functions to dynamically load from the GuestLib library. */
107char const * (*GuestLib_GetErrorText)(VMGuestLibError);
108VMGuestLibError (*GuestLib_OpenHandle)(VMGuestLibHandle*);
109VMGuestLibError (*GuestLib_CloseHandle)(VMGuestLibHandle);
110VMGuestLibError (*GuestLib_UpdateInfo)(VMGuestLibHandle handle);
111VMGuestLibError (*GuestLib_GetSessionId)(VMGuestLibHandle handle, VMSessionId *id);
112VMGuestLibError (*GuestLib_GetCpuReservationMHz)(VMGuestLibHandle handle, uint32 *cpuReservationMHz);
113VMGuestLibError (*GuestLib_GetCpuLimitMHz)(VMGuestLibHandle handle, uint32 *cpuLimitMHz);
114VMGuestLibError (*GuestLib_GetCpuShares)(VMGuestLibHandle handle, uint32 *cpuShares);
115VMGuestLibError (*GuestLib_GetCpuUsedMs)(VMGuestLibHandle handle, uint64 *cpuUsedMs);
116VMGuestLibError (*GuestLib_GetHostProcessorSpeed)(VMGuestLibHandle handle, uint32 *mhz);
117VMGuestLibError (*GuestLib_GetMemReservationMB)(VMGuestLibHandle handle, uint32 *memReservationMB);
118VMGuestLibError (*GuestLib_GetMemLimitMB)(VMGuestLibHandle handle, uint32 *memLimitMB);
119VMGuestLibError (*GuestLib_GetMemShares)(VMGuestLibHandle handle, uint32 *memShares);
120VMGuestLibError (*GuestLib_GetMemMappedMB)(VMGuestLibHandle handle, uint32 *memMappedMB);
121VMGuestLibError (*GuestLib_GetMemActiveMB)(VMGuestLibHandle handle, uint32 *memActiveMB);
122VMGuestLibError (*GuestLib_GetMemOverheadMB)(VMGuestLibHandle handle, uint32 *memOverheadMB);
123VMGuestLibError (*GuestLib_GetMemBalloonedMB)(VMGuestLibHandle handle, uint32 *memBalloonedMB);
124VMGuestLibError (*GuestLib_GetMemSwappedMB)(VMGuestLibHandle handle, uint32 *memSwappedMB);
125VMGuestLibError (*GuestLib_GetMemSharedMB)(VMGuestLibHandle handle, uint32 *memSharedMB);
126VMGuestLibError (*GuestLib_GetMemSharedSavedMB)(VMGuestLibHandle handle, uint32 *memSharedSavedMB);
127VMGuestLibError (*GuestLib_GetMemUsedMB)(VMGuestLibHandle handle, uint32 *memUsedMB);
128VMGuestLibError (*GuestLib_GetElapsedMs)(VMGuestLibHandle handle, uint64 *elapsedMs);
129VMGuestLibError (*GuestLib_GetResourcePoolPath)(VMGuestLibHandle handle, size_t *bufferSize, char *pathBuffer);
130VMGuestLibError (*GuestLib_GetCpuStolenMs)(VMGuestLibHandle handle, uint64 *cpuStolenMs);
131VMGuestLibError (*GuestLib_GetMemTargetSizeMB)(VMGuestLibHandle handle, uint64 *memTargetSizeMB);
132VMGuestLibError (*GuestLib_GetHostNumCpuCores)(VMGuestLibHandle handle, uint32 *hostNumCpuCores);
133VMGuestLibError (*GuestLib_GetHostCpuUsedMs)(VMGuestLibHandle handle, uint64 *hostCpuUsedMs);
134VMGuestLibError (*GuestLib_GetHostMemSwappedMB)(VMGuestLibHandle handle, uint64 *hostMemSwappedMB);
135VMGuestLibError (*GuestLib_GetHostMemSharedMB)(VMGuestLibHandle handle, uint64 *hostMemSharedMB);
136VMGuestLibError (*GuestLib_GetHostMemUsedMB)(VMGuestLibHandle handle, uint64 *hostMemUsedMB);
137VMGuestLibError (*GuestLib_GetHostMemPhysMB)(VMGuestLibHandle handle, uint64 *hostMemPhysMB);
138VMGuestLibError (*GuestLib_GetHostMemPhysFreeMB)(VMGuestLibHandle handle, uint64 *hostMemPhysFreeMB);
139VMGuestLibError (*GuestLib_GetHostMemKernOvhdMB)(VMGuestLibHandle handle, uint64 *hostMemKernOvhdMB);
140VMGuestLibError (*GuestLib_GetHostMemMappedMB)(VMGuestLibHandle handle, uint64 *hostMemMappedMB);
141VMGuestLibError (*GuestLib_GetHostMemUnmappedMB)(VMGuestLibHandle handle, uint64 *hostMemUnmappedMB);
142
143
144static void *dlHandle = NULL;
145
146
147/*
148 * Macro to load a single GuestLib function from the shared library.
149 */
150
151#define LOAD_ONE_FUNC(funcname) \
152do { \
153funcname = dlsym(dlHandle, "VM" #funcname); \
154if ((dlErrStr = dlerror()) != NULL) { \
155fprintf(stderr, "Failed to load \'%s\': \'%s\'\n", \
156#funcname, dlErrStr); \
157return FALSE; \
158} \
159} while (0)
160
161#endif
162
168};
169
174#ifdef VMGUESTLIB
175 VMGuestLibHandle glHandle;
176#endif
177};
178
179
180
181
182
183
184/*
185 *-----------------------------------------------------------------------------
186 *
187 * LoadFunctions --
188 *
189 * Load the functions from the shared library.
190 *
191 * Results:
192 * TRUE on success
193 * FALSE on failure
194 *
195 * Side effects:
196 * None
197 *
198 * Credit: VMware
199 *-----------------------------------------------------------------------------
200 */
201
202static int
204{
205
206#ifdef VMGUESTLIB
207 /*
208 * First, try to load the shared library.
209 */
210
211 /* Attempt to guess if we were statically linked to libc, if so bail */
212 if ( _dl_non_dynamic_init != NULL ) {
213 strncpy(_vmware_vector.cmp_info.disabled_reason, "The VMware component does not support statically linking of libc.", PAPI_MAX_STR_LEN);
214 return PAPI_ENOSUPP;
215 }
216
217 char const *dlErrStr;
218 char filename[BUFSIZ];
219
220 sprintf(filename,"%s","libvmGuestLib.so");
221 dlHandle = dlopen(filename, RTLD_NOW);
222 if (!dlHandle) {
223 dlErrStr = dlerror();
224 fprintf(stderr, "dlopen of %s failed: \'%s\'\n", filename,
225 dlErrStr);
226
227 sprintf(filename,"%s/lib/lib64/libvmGuestLib.so",VMWARE_INCDIR);
228 dlHandle = dlopen(filename, RTLD_NOW);
229 if (!dlHandle) {
230 dlErrStr = dlerror();
231 fprintf(stderr, "dlopen of %s failed: \'%s\'\n", filename,
232 dlErrStr);
233
234 sprintf(filename,"%s/lib/lib32/libvmGuestLib.so",VMWARE_INCDIR);
235 dlHandle = dlopen(filename, RTLD_NOW);
236 if (!dlHandle) {
237 dlErrStr = dlerror();
238 fprintf(stderr, "dlopen of %s failed: \'%s\'\n", filename,
239 dlErrStr);
240 return PAPI_ECMP;
241 }
242 }
243 }
244
245 /* Load all the individual library functions. */
246 LOAD_ONE_FUNC(GuestLib_GetErrorText);
247 LOAD_ONE_FUNC(GuestLib_OpenHandle);
248 LOAD_ONE_FUNC(GuestLib_CloseHandle);
249 LOAD_ONE_FUNC(GuestLib_UpdateInfo);
250 LOAD_ONE_FUNC(GuestLib_GetSessionId);
251 LOAD_ONE_FUNC(GuestLib_GetCpuReservationMHz);
252 LOAD_ONE_FUNC(GuestLib_GetCpuLimitMHz);
253 LOAD_ONE_FUNC(GuestLib_GetCpuShares);
254 LOAD_ONE_FUNC(GuestLib_GetCpuUsedMs);
255 LOAD_ONE_FUNC(GuestLib_GetHostProcessorSpeed);
256 LOAD_ONE_FUNC(GuestLib_GetMemReservationMB);
257 LOAD_ONE_FUNC(GuestLib_GetMemLimitMB);
258 LOAD_ONE_FUNC(GuestLib_GetMemShares);
259 LOAD_ONE_FUNC(GuestLib_GetMemMappedMB);
260 LOAD_ONE_FUNC(GuestLib_GetMemActiveMB);
261 LOAD_ONE_FUNC(GuestLib_GetMemOverheadMB);
262 LOAD_ONE_FUNC(GuestLib_GetMemBalloonedMB);
263 LOAD_ONE_FUNC(GuestLib_GetMemSwappedMB);
264 LOAD_ONE_FUNC(GuestLib_GetMemSharedMB);
265 LOAD_ONE_FUNC(GuestLib_GetMemSharedSavedMB);
266 LOAD_ONE_FUNC(GuestLib_GetMemUsedMB);
267 LOAD_ONE_FUNC(GuestLib_GetElapsedMs);
268 LOAD_ONE_FUNC(GuestLib_GetResourcePoolPath);
269 LOAD_ONE_FUNC(GuestLib_GetCpuStolenMs);
270 LOAD_ONE_FUNC(GuestLib_GetMemTargetSizeMB);
271 LOAD_ONE_FUNC(GuestLib_GetHostNumCpuCores);
272 LOAD_ONE_FUNC(GuestLib_GetHostCpuUsedMs);
273 LOAD_ONE_FUNC(GuestLib_GetHostMemSwappedMB);
274 LOAD_ONE_FUNC(GuestLib_GetHostMemSharedMB);
275 LOAD_ONE_FUNC(GuestLib_GetHostMemUsedMB);
276 LOAD_ONE_FUNC(GuestLib_GetHostMemPhysMB);
277 LOAD_ONE_FUNC(GuestLib_GetHostMemPhysFreeMB);
278 LOAD_ONE_FUNC(GuestLib_GetHostMemKernOvhdMB);
279 LOAD_ONE_FUNC(GuestLib_GetHostMemMappedMB);
280 LOAD_ONE_FUNC(GuestLib_GetHostMemUnmappedMB);
281#endif
282 return PAPI_OK;
283}
284
285
286
290static int num_events = 0;
291static int use_pseudo=0;
292static int use_guestlib=0;
293
294/************************************************************************/
295/* Below is the actual "hardware implementation" of our VMWARE counters */
296/************************************************************************/
297
301static long long
302_vmware_hardware_read( struct _vmware_context *context, int starting)
303{
304
305 int i;
306
307 if (use_pseudo) {
308 context->values[VMWARE_HOST_TSC]=rdpmc(0x10000);
309 context->values[VMWARE_ELAPSED_TIME]=rdpmc(0x10001);
310 context->values[VMWARE_ELAPSED_APPARENT]=rdpmc(0x10002);
311 }
312
313
314#ifdef VMGUESTLIB
315 static VMSessionId sessionId = 0;
316 VMSessionId tmpSession;
317 uint32_t temp32;
318 uint64_t temp64;
319 VMGuestLibError glError;
320
321 if (use_guestlib) {
322
323 glError = GuestLib_UpdateInfo(context->glHandle);
324 if (glError != VMGUESTLIB_ERROR_SUCCESS) {
325 fprintf(stderr,"UpdateInfo failed: %s\n",
326 GuestLib_GetErrorText(glError));
327 return PAPI_ECMP;
328 }
329
330 /* Retrieve and check the session ID */
331 glError = GuestLib_GetSessionId(context->glHandle, &tmpSession);
332 if (glError != VMGUESTLIB_ERROR_SUCCESS) {
333 fprintf(stderr, "Failed to get session ID: %s\n",
334 GuestLib_GetErrorText(glError));
335 return PAPI_ECMP;
336 }
337
338 if (tmpSession == 0) {
339 fprintf(stderr, "Error: Got zero sessionId from GuestLib\n");
340 return PAPI_ECMP;
341 }
342
343 if (sessionId == 0) {
344 sessionId = tmpSession;
345 } else if (tmpSession != sessionId) {
346 sessionId = tmpSession;
347 }
348
349 glError = GuestLib_GetCpuLimitMHz(context->glHandle,&temp32);
350 context->values[VMWARE_CPU_LIMIT_MHZ]=temp32;
351 if (glError != VMGUESTLIB_ERROR_SUCCESS) {
352 fprintf(stderr,"Failed to get CPU limit: %s\n",
353 GuestLib_GetErrorText(glError));
354 return PAPI_ECMP;
355 }
356
357 glError = GuestLib_GetCpuReservationMHz(context->glHandle,&temp32);
358 context->values[VMWARE_CPU_RESERVATION_MHZ]=temp32;
359 if (glError != VMGUESTLIB_ERROR_SUCCESS) {
360 fprintf(stderr,"Failed to get CPU reservation: %s\n",
361 GuestLib_GetErrorText(glError));
362 return PAPI_ECMP;
363 }
364
365 glError = GuestLib_GetCpuShares(context->glHandle,&temp32);
366 context->values[VMWARE_CPU_SHARES]=temp32;
367 if (glError != VMGUESTLIB_ERROR_SUCCESS) {
368 fprintf(stderr,"Failed to get cpu shares: %s\n",
369 GuestLib_GetErrorText(glError));
370 return PAPI_ECMP;
371 }
372
373 glError = GuestLib_GetCpuStolenMs(context->glHandle,&temp64);
374 context->values[VMWARE_CPU_STOLEN_MS]=temp64;
375 if (glError != VMGUESTLIB_ERROR_SUCCESS) {
376 if (glError == VMGUESTLIB_ERROR_UNSUPPORTED_VERSION) {
377 context->values[VMWARE_CPU_STOLEN_MS]=0;
378 fprintf(stderr, "Skipping CPU stolen, not supported...\n");
379 } else {
380 fprintf(stderr, "Failed to get CPU stolen: %s\n",
381 GuestLib_GetErrorText(glError));
382 return PAPI_ECMP;
383 }
384 }
385
386 glError = GuestLib_GetCpuUsedMs(context->glHandle,&temp64);
387 context->values[VMWARE_CPU_USED_MS]=temp64;
388 if (glError != VMGUESTLIB_ERROR_SUCCESS) {
389 fprintf(stderr, "Failed to get used ms: %s\n",
390 GuestLib_GetErrorText(glError));
391 return PAPI_ECMP;
392 }
393
394 glError = GuestLib_GetElapsedMs(context->glHandle, &temp64);
395 context->values[VMWARE_ELAPSED_MS]=temp64;
396 if (glError != VMGUESTLIB_ERROR_SUCCESS) {
397 fprintf(stderr, "Failed to get elapsed ms: %s\n",
398 GuestLib_GetErrorText(glError));
399 return PAPI_ECMP;
400 }
401
402 glError = GuestLib_GetMemActiveMB(context->glHandle, &temp32);
403 context->values[VMWARE_MEM_ACTIVE_MB]=temp32;
404 if (glError != VMGUESTLIB_ERROR_SUCCESS) {
405 fprintf(stderr, "Failed to get active mem: %s\n",
406 GuestLib_GetErrorText(glError));
407 return PAPI_ECMP;
408 }
409
410 glError = GuestLib_GetMemBalloonedMB(context->glHandle, &temp32);
411 context->values[VMWARE_MEM_BALLOONED_MB]=temp32;
412 if (glError != VMGUESTLIB_ERROR_SUCCESS) {
413 fprintf(stderr, "Failed to get ballooned mem: %s\n",
414 GuestLib_GetErrorText(glError));
415 return PAPI_ECMP;
416 }
417
418 glError = GuestLib_GetMemLimitMB(context->glHandle, &temp32);
419 context->values[VMWARE_MEM_LIMIT_MB]=temp32;
420 if (glError != VMGUESTLIB_ERROR_SUCCESS) {
421 fprintf(stderr,"Failed to get mem limit: %s\n",
422 GuestLib_GetErrorText(glError));
423 return PAPI_ECMP;
424 }
425
426 glError = GuestLib_GetMemMappedMB(context->glHandle, &temp32);
427 context->values[VMWARE_MEM_MAPPED_MB]=temp32;
428 if (glError != VMGUESTLIB_ERROR_SUCCESS) {
429 fprintf(stderr, "Failed to get mapped mem: %s\n",
430 GuestLib_GetErrorText(glError));
431 return PAPI_ECMP;
432 }
433
434 glError = GuestLib_GetMemOverheadMB(context->glHandle, &temp32);
435 context->values[VMWARE_MEM_OVERHEAD_MB]=temp32;
436 if (glError != VMGUESTLIB_ERROR_SUCCESS) {
437 fprintf(stderr, "Failed to get overhead mem: %s\n",
438 GuestLib_GetErrorText(glError));
439 return PAPI_ECMP;
440 }
441
442 glError = GuestLib_GetMemReservationMB(context->glHandle, &temp32);
443 context->values[VMWARE_MEM_RESERVATION_MB]=temp32;
444 if (glError != VMGUESTLIB_ERROR_SUCCESS) {
445 fprintf(stderr, "Failed to get mem reservation: %s\n",
446 GuestLib_GetErrorText(glError));
447 return PAPI_ECMP;
448 }
449
450 glError = GuestLib_GetMemSharedMB(context->glHandle, &temp32);
451 context->values[VMWARE_MEM_SHARED_MB]=temp32;
452 if (glError != VMGUESTLIB_ERROR_SUCCESS) {
453 fprintf(stderr, "Failed to get swapped mem: %s\n",
454 GuestLib_GetErrorText(glError));
455 return PAPI_ECMP;
456 }
457
458 glError = GuestLib_GetMemShares(context->glHandle, &temp32);
459 context->values[VMWARE_MEM_SHARES]=temp32;
460 if (glError != VMGUESTLIB_ERROR_SUCCESS) {
461 if (glError == VMGUESTLIB_ERROR_NOT_AVAILABLE) {
462 context->values[VMWARE_MEM_SHARES]=0;
463 fprintf(stderr, "Skipping mem shares, not supported...\n");
464 } else {
465 fprintf(stderr, "Failed to get mem shares: %s\n",
466 GuestLib_GetErrorText(glError));
467 return PAPI_ECMP;
468 }
469 }
470
471 glError = GuestLib_GetMemSwappedMB(context->glHandle, &temp32);
472 context->values[VMWARE_MEM_SWAPPED_MB]=temp32;
473 if (glError != VMGUESTLIB_ERROR_SUCCESS) {
474 fprintf(stderr, "Failed to get swapped mem: %s\n",
475 GuestLib_GetErrorText(glError));
476 return PAPI_ECMP;
477 }
478
479 glError = GuestLib_GetMemTargetSizeMB(context->glHandle, &temp64);
480 context->values[VMWARE_MEM_TARGET_SIZE_MB]=temp64;
481 if (glError != VMGUESTLIB_ERROR_SUCCESS) {
482 if (glError == VMGUESTLIB_ERROR_UNSUPPORTED_VERSION) {
484 fprintf(stderr, "Skipping target mem size, not supported...\n");
485 } else {
486 fprintf(stderr, "Failed to get target mem size: %s\n",
487 GuestLib_GetErrorText(glError));
488 return PAPI_ECMP;
489 }
490 }
491
492 glError = GuestLib_GetMemUsedMB(context->glHandle, &temp32);
493 context->values[VMWARE_MEM_USED_MB]=temp32;
494 if (glError != VMGUESTLIB_ERROR_SUCCESS) {
495 fprintf(stderr, "Failed to get swapped mem: %s\n",
496 GuestLib_GetErrorText(glError));
497 return PAPI_ECMP;
498 }
499
500 glError = GuestLib_GetHostProcessorSpeed(context->glHandle, &temp32);
501 context->values[VMWARE_HOST_CPU_MHZ]=temp32;
502 if (glError != VMGUESTLIB_ERROR_SUCCESS) {
503 fprintf(stderr, "Failed to get host proc speed: %s\n",
504 GuestLib_GetErrorText(glError));
505 return PAPI_ECMP;
506 }
507 }
508
509#endif
510
511 if (starting) {
512
513 for(i=0;i<VMWARE_MAX_COUNTERS;i++) {
514 context->start_values[i]=context->values[i];
515 }
516
517 }
518
519 return PAPI_OK;
520}
521
522/********************************************************************/
523/* Below are the functions required by the PAPI component interface */
524/********************************************************************/
525
527int
529{
530 (void) ctx;
531
532
533#ifdef VMGUESTLIB
534
535 struct _vmware_context *context;
536 VMGuestLibError glError;
537
538 context=(struct _vmware_context *)ctx;
539
540 if (use_guestlib) {
541 glError = GuestLib_OpenHandle(&(context->glHandle));
542 if (glError != VMGUESTLIB_ERROR_SUCCESS) {
543 fprintf(stderr,"OpenHandle failed: %s\n",
544 GuestLib_GetErrorText(glError));
545 return PAPI_ECMP;
546 }
547 }
548
549#endif
550
551 return PAPI_OK;
552}
553
554
559int
561{
562 int retval = PAPI_OK;
563 (void) cidx;
564
565 int result;
566
567 SUBDBG( "_vmware_init_component..." );
568
569 /* Initialize and try to load the VMware library */
570 /* Try to load the library. */
572
573 if (result!=PAPI_OK) {
575 "GuestLibTest: Failed to load shared library",
578 goto fn_fail;
579 }
580
581 /* we know in advance how many events we want */
582 /* for actual hardware this might have to be determined dynamically */
583
584 /* Allocate memory for the our event table */
586 calloc( VMWARE_MAX_COUNTERS, sizeof ( struct _vmware_native_event_entry ));
587 if ( _vmware_native_table == NULL ) {
589 goto fn_fail;
590 }
591
592
593#ifdef VMGUESTLIB
594
595 /* Detect if GuestLib works */
596 {
597
598 VMGuestLibError glError;
599 VMGuestLibHandle glHandle;
600
601 use_guestlib=0;
602
603 /* try to open */
604 glError = GuestLib_OpenHandle(&glHandle);
605 if (glError != VMGUESTLIB_ERROR_SUCCESS) {
606 fprintf(stderr,"OpenHandle failed: %s\n",
607 GuestLib_GetErrorText(glError));
608 }
609 else {
610 /* open worked, try to update */
611 glError = GuestLib_UpdateInfo(glHandle);
612 if (glError != VMGUESTLIB_ERROR_SUCCESS) {
613 fprintf(stderr,"UpdateInfo failed: %s\n",
614 GuestLib_GetErrorText(glError));
615 }
616 else {
617 /* update worked, things work! */
618 use_guestlib=1;
619 }
620 /* shut things down */
621 glError = GuestLib_CloseHandle(glHandle);
622 }
623
624 }
625
626
627
628 if (use_guestlib) {
629
630 /* fill in the event table parameters */
632 "CPU_LIMIT" );
634 "Retrieves the upper limit of processor use in MHz "
635 "available to the virtual machine.",
637 strcpy( _vmware_native_table[num_events].units,"MHz");
641 num_events++;
642
644 "CPU_RESERVATION" );
646 "Retrieves the minimum processing power in MHz "
647 "reserved for the virtual machine.",
649 strcpy( _vmware_native_table[num_events].units,"MHz");
653 num_events++;
654
656 "CPU_SHARES" );
658 "Retrieves the number of CPU shares allocated "
659 "to the virtual machine.",
661 strcpy( _vmware_native_table[num_events].units,"shares");
665 num_events++;
666
668 "CPU_STOLEN" );
670 "Retrieves the number of milliseconds that the "
671 "virtual machine was in a ready state (able to "
672 "transition to a run state), but was not scheduled to run.",
678 num_events++;
679
681 "CPU_USED" );
683 "Retrieves the number of milliseconds during which "
684 "the virtual machine has used the CPU. This value "
685 "includes the time used by the guest operating system "
686 "and the time used by virtualization code for tasks for "
687 "this virtual machine. You can combine this value with "
688 "the elapsed time (VMWARE_ELAPSED) to estimate the "
689 "effective virtual machine CPU speed. This value is a "
690 "subset of elapsedMs.",
696 num_events++;
697
699 "ELAPSED" );
701 "Retrieves the number of milliseconds that have passed "
702 "in the virtual machine since it last started running on "
703 "the server. The count of elapsed time restarts each time "
704 "the virtual machine is powered on, resumed, or migrated "
705 "using VMotion. This value counts milliseconds, regardless "
706 "of whether the virtual machine is using processing power "
707 "during that time. You can combine this value with the CPU "
708 "time used by the virtual machine (VMWARE_CPU_USED) to "
709 "estimate the effective virtual machine xCPU speed. "
710 "cpuUsedMS is a subset of this value.",
716 num_events++;
717
719 "MEM_ACTIVE" );
721 "Retrieves the amount of memory the virtual machine is "
722 "actively using in MB - Its estimated working set size.",
728 num_events++;
729
731 "MEM_BALLOONED" );
733 "Retrieves the amount of memory that has been reclaimed "
734 "from this virtual machine by the vSphere memory balloon "
735 "driver (also referred to as the 'vmemctl' driver) in MB.",
741 num_events++;
742
744 "MEM_LIMIT" );
746 "Retrieves the upper limit of memory that is available "
747 "to the virtual machine in MB.",
753 num_events++;
754
756 "MEM_MAPPED" );
758 "Retrieves the amount of memory that is allocated to "
759 "the virtual machine in MB. Memory that is ballooned, "
760 "swapped, or has never been accessed is excluded.",
766 num_events++;
767
769 "MEM_OVERHEAD" );
771 "Retrieves the amount of 'overhead' memory associated "
772 "with this virtual machine that is currently consumed "
773 "on the host system in MB. Overhead memory is additional "
774 "memory that is reserved for data structures required by "
775 "the virtualization layer.",
781 num_events++;
782
784 "MEM_RESERVATION" );
786 "Retrieves the minimum amount of memory that is "
787 "reserved for the virtual machine in MB.",
793 num_events++;
794
796 "MEM_SHARED" );
798 "Retrieves the amount of physical memory associated "
799 "with this virtual machine that is copy-on-write (COW) "
800 "shared on the host in MB.",
806 num_events++;
807
809 "MEM_SHARES" );
811 "Retrieves the number of memory shares allocated to "
812 "the virtual machine.",
814 strcpy( _vmware_native_table[num_events].units,"shares");
818 num_events++;
819
821 "MEM_SWAPPED" );
823 "Retrieves the amount of memory that has been reclaimed "
824 "from this virtual machine by transparently swapping "
825 "guest memory to disk in MB.",
831 num_events++;
832
834 "MEM_TARGET_SIZE" );
836 "Retrieves the size of the target memory allocation "
837 "for this virtual machine in MB.",
843 num_events++;
844
846 "MEM_USED" );
848 "Retrieves the estimated amount of physical host memory "
849 "currently consumed for this virtual machine's "
850 "physical memory.",
856 num_events++;
857
859 "HOST_CPU" );
861 "Retrieves the speed of the ESX system's physical "
862 "CPU in MHz.",
864 strcpy( _vmware_native_table[num_events].units,"MHz");
868 num_events++;
869 }
870
871#endif
872
873 /* For VMWare Pseudo Performance Counters */
874 if ( getenv( "PAPI_VMWARE_PSEUDOPERFORMANCE" ) ) {
875
876 use_pseudo=1;
877
879 "HOST_TSC" );
881 "Physical host TSC",
883 strcpy( _vmware_native_table[num_events].units,"cycles");
887 num_events++;
888
890 "ELAPSED_TIME" );
892 "Elapsed real time in ns.",
898 num_events++;
899
901 "ELAPSED_APPARENT" );
903 "Elapsed apparent time in ns.",
909 num_events++;
910 }
911
912 if (num_events==0) {
914 "VMware SDK not installed, and PAPI_VMWARE_PSEUDOPERFORMANCE not set",
917 goto fn_fail;
918 }
919
921
922 fn_exit:
923 _papi_hwd[cidx]->cmp_info.disabled = retval;
924 return retval;
925 fn_fail:
926 goto fn_exit;
927}
928
930int
932{
933 (void) ctl;
934
935 return PAPI_OK;
936}
937
942int
943_vmware_ntv_enum_events( unsigned int *EventCode, int modifier )
944{
945
946 switch ( modifier ) {
947 /* return EventCode of first event */
948 case PAPI_ENUM_FIRST:
949 if (num_events==0) return PAPI_ENOEVNT;
950 *EventCode = 0;
951 return PAPI_OK;
952 break;
953 /* return EventCode of passed-in Event */
954 case PAPI_ENUM_EVENTS:{
955 int index = *EventCode;
956
957 if ( index < num_events - 1 ) {
958 *EventCode = *EventCode + 1;
959 return PAPI_OK;
960 } else {
961 return PAPI_ENOEVNT;
962 }
963 break;
964 }
965 default:
966 return PAPI_EINVAL;
967 }
968 return PAPI_EINVAL;
969}
970
971int
972_vmware_ntv_code_to_info(unsigned int EventCode, PAPI_event_info_t *info)
973{
974
975 int index = EventCode;
976
977 if ( ( index < 0) || (index >= num_events )) return PAPI_ENOEVNT;
978
979 strncpy( info->symbol, _vmware_native_table[index].name,
980 sizeof(info->symbol));
981
982 strncpy( info->long_descr, _vmware_native_table[index].description,
983 sizeof(info->symbol));
984
985 strncpy( info->units, _vmware_native_table[index].units,
986 sizeof(info->units));
987
988 return PAPI_OK;
989}
990
991
997int
998_vmware_ntv_code_to_name( unsigned int EventCode, char *name, int len )
999{
1000 int index = EventCode;
1001
1002 if ( index >= 0 && index < num_events ) {
1003 strncpy( name, _vmware_native_table[index].name, len );
1004 }
1005 return PAPI_OK;
1006}
1007
1013int
1014_vmware_ntv_code_to_descr( unsigned int EventCode, char *name, int len )
1015{
1016 int index = EventCode;
1017
1018 if ( index >= 0 && index < num_events ) {
1019 strncpy( name, _vmware_native_table[index].description, len );
1020 }
1021 return PAPI_OK;
1022}
1023
1025int
1028 int count,
1029 hwd_context_t *ctx )
1030{
1031 (void) ctx;
1032
1033 struct _vmware_control_state *control;
1034
1035 int i, index;
1036
1037 control=(struct _vmware_control_state *)ctl;
1038
1039 for ( i = 0; i < count; i++ ) {
1040 index = native[i].ni_event;
1042 native[i].ni_position = i;
1043 }
1044 control->num_events=count;
1045
1046 return PAPI_OK;
1047}
1048
1050int
1052{
1053 struct _vmware_context *context;
1054 (void) ctl;
1055
1056 context=(struct _vmware_context *)ctx;
1057
1058 _vmware_hardware_read( context, 1 );
1059
1060 return PAPI_OK;
1061}
1062
1064int
1066{
1067
1068 struct _vmware_context *context;
1069 (void) ctl;
1070
1071 context=(struct _vmware_context *)ctx;
1072
1073 _vmware_hardware_read( context, 0 );
1074
1075 return PAPI_OK;
1076}
1077
1079int
1082 long_long **events, int flags )
1083{
1084
1085 struct _vmware_context *context;
1086 struct _vmware_control_state *control;
1087
1088 (void) flags;
1089 int i;
1090
1091 context=(struct _vmware_context *)ctx;
1092 control=(struct _vmware_control_state *)ctl;
1093
1094 _vmware_hardware_read( context, 0 );
1095
1096 for (i=0; i<control->num_events; i++) {
1097
1100 report_difference) {
1101 control->value[i]=context->values[control->which_counter[i]]-
1102 context->start_values[control->which_counter[i]];
1103 } else {
1104 control->value[i]=context->values[control->which_counter[i]];
1105 }
1106 // printf("%d %d %lld-%lld=%lld\n",i,control->which_counter[i],
1107 // context->values[control->which_counter[i]],
1108 // context->start_values[control->which_counter[i]],
1109 // control->value[i]);
1110
1111 }
1112
1113 *events = control->value;
1114
1115 return PAPI_OK;
1116}
1117
1119/* otherwise, the updated state is written to ESI->hw_start */
1120int
1122{
1123 (void) ctx;
1124 (void) ctrl;
1125 (void) events;
1126 SUBDBG( "_vmware_write... %p %p", ctx, ctrl );
1127 /* FIXME... this should actually carry out the write, though */
1128 /* this is non-trivial as which counter being written has to be */
1129 /* determined somehow. */
1130 return PAPI_OK;
1131}
1132
1134int
1136{
1137 (void) ctx;
1138 (void) ctl;
1139
1140 return PAPI_OK;
1141}
1142
1144int
1146{
1147 (void) ctx;
1148
1149#ifdef VMGUESTLIB
1150 VMGuestLibError glError;
1151 struct _vmware_context *context;
1152
1153 context=(struct _vmware_context *)ctx;
1154
1155 if (use_guestlib) {
1156 glError = GuestLib_CloseHandle(context->glHandle);
1157 if (glError != VMGUESTLIB_ERROR_SUCCESS) {
1158 fprintf(stderr, "Failed to CloseHandle: %s\n",
1159 GuestLib_GetErrorText(glError));
1160 return PAPI_ECMP;
1161 }
1162 }
1163#endif
1164
1165 return PAPI_OK;
1166}
1167
1169int
1171{
1172
1173#ifdef VMGUESTLIB
1174 if (dlclose(dlHandle)) {
1175 fprintf(stderr, "dlclose failed\n");
1176 return EXIT_FAILURE;
1177 }
1178#endif
1179
1180 return PAPI_OK;
1181}
1182
1183
1189int
1191{
1192
1193 (void) ctx;
1194 (void) code;
1195 (void) option;
1196
1197 SUBDBG( "_vmware_ctl..." );
1198
1199 return PAPI_OK;
1200}
1201
1211int
1213{
1214 (void) ctl;
1215
1216 int found = 0;
1217 SUBDBG( "_vmware_set_domain..." );
1218 if ( PAPI_DOM_USER & domain ) {
1219 SUBDBG( " PAPI_DOM_USER " );
1220 found = 1;
1221 }
1222 if ( PAPI_DOM_KERNEL & domain ) {
1223 SUBDBG( " PAPI_DOM_KERNEL " );
1224 found = 1;
1225 }
1226 if ( PAPI_DOM_OTHER & domain ) {
1227 SUBDBG( " PAPI_DOM_OTHER " );
1228 found = 1;
1229 }
1230 if ( PAPI_DOM_ALL & domain ) {
1231 SUBDBG( " PAPI_DOM_ALL " );
1232 found = 1;
1233 }
1234 if ( !found ) {
1235 return ( PAPI_EINVAL );
1236 }
1237 return PAPI_OK;
1238}
1239
1242 .cmp_info = {
1243 /* default component information (unspecified values are initialized to 0) */
1244 .name = "vmware",
1245 .short_name = "vmware",
1246 .description = "Provide support for VMware vmguest and pseudo counters",
1247 .version = "5.0",
1248 .num_mpx_cntrs = VMWARE_MAX_COUNTERS,
1249 .num_cntrs = VMWARE_MAX_COUNTERS,
1250 .default_domain = PAPI_DOM_USER,
1251 .available_domains = PAPI_DOM_USER,
1252 .default_granularity = PAPI_GRN_THR,
1253 .available_granularities = PAPI_GRN_THR,
1254 .hardware_intr_sig = PAPI_INT_SIGNAL,
1255
1256 /* component specific cmp_info initializations */
1257 .fast_real_timer = 0,
1258 .fast_virtual_timer = 0,
1259 .attach = 0,
1260 .attach_must_ptrace = 0,
1261 },
1262 /* sizes of framework-opaque component-private structures */
1263 .size = {
1264 .context = sizeof ( struct _vmware_context ),
1265 .control_state = sizeof ( struct _vmware_control_state ),
1266 .reg_value = sizeof ( struct _vmware_register ),
1267 .reg_alloc = sizeof ( struct _vmware_reg_alloc ),
1268 }
1269 ,
1270 /* function pointers in this component */
1271 .init_thread = _vmware_init_thread,
1272 .init_component = _vmware_init_component,
1273 .init_control_state = _vmware_init_control_state,
1274 .start = _vmware_start,
1275 .stop = _vmware_stop,
1276 .read = _vmware_read,
1277 .write = _vmware_write,
1278 .shutdown_thread = _vmware_shutdown_thread,
1279 .shutdown_component = _vmware_shutdown_component,
1280 .ctl = _vmware_ctl,
1281
1282 .update_control_state = _vmware_update_control_state,
1283 .set_domain = _vmware_set_domain,
1284 .reset = _vmware_reset,
1285
1286 .ntv_enum_events = _vmware_ntv_enum_events,
1287 .ntv_code_to_name = _vmware_ntv_code_to_name,
1288 .ntv_code_to_descr = _vmware_ntv_code_to_descr,
1289 .ntv_code_to_info = _vmware_ntv_code_to_info,
1290
1291};
1292
static papi_handle_t handle
Definition: Gamum.c:21
volatile int result
int i
unsigned long long uint64
Definition: cat_arch.h:3
static long count
struct papi_vectors * _papi_hwd[]
#define PAPI_DOM_USER
Definition: f90papi.h:174
#define PAPI_ENUM_EVENTS
Definition: f90papi.h:224
#define PAPI_DOM_OTHER
Definition: f90papi.h:21
#define PAPI_OK
Definition: f90papi.h:73
#define PAPI_ENUM_FIRST
Definition: f90papi.h:85
#define PAPI_MIN_STR_LEN
Definition: f90papi.h:208
#define PAPI_DOM_KERNEL
Definition: f90papi.h:254
#define PAPI_ENOEVNT
Definition: f90papi.h:139
#define PAPI_EINVAL
Definition: f90papi.h:115
#define PAPI_ENOSUPP
Definition: f90papi.h:244
#define PAPI_MAX_STR_LEN
Definition: f90papi.h:77
#define PAPI_ECMP
Definition: f90papi.h:214
#define PAPI_ENOMEM
Definition: f90papi.h:16
#define PAPI_GRN_THR
Definition: f90papi.h:265
#define PAPI_HUGE_STR_LEN
Definition: f90papi.h:120
#define PAPI_DOM_ALL
Definition: f90papi.h:261
char events[MAX_EVENTS][BUFSIZ]
static double c[MATRIX_SIZE][MATRIX_SIZE]
Definition: libmsr_basic.c:40
unsigned long AO_t __attribute__((__aligned__(4)))
Definition: m68k.h:21
Return codes and api definitions.
#define long_long
Definition: papi.h:559
#define SUBDBG(format, args...)
Definition: papi_debug.h:64
FILE * stderr
#define PAPI_INT_SIGNAL
Definition: papi_internal.h:52
static int native
static int cidx
char units[MAX_EVENTS][BUFSIZ]
Definition: powercap_plot.c:15
const char * name
Definition: rocs.c:225
char name[PAPI_MAX_STR_LEN]
Definition: papi.h:627
char disabled_reason[PAPI_HUGE_STR_LEN]
Definition: papi.h:634
char units[PAPI_MIN_STR_LEN]
Definition: papi.h:969
char symbol[PAPI_HUGE_STR_LEN]
Definition: papi.h:960
char long_descr[PAPI_HUGE_STR_LEN]
Definition: papi.h:963
long long start_values[VMWARE_MAX_COUNTERS]
Definition: vmware.c:173
long long values[VMWARE_MAX_COUNTERS]
Definition: vmware.c:172
int which_counter[VMWARE_MAX_COUNTERS]
Definition: vmware.c:166
long long value[VMWARE_MAX_COUNTERS]
Definition: vmware.c:165
Definition: vmware.c:80
int which_counter
Definition: vmware.c:84
char units[PAPI_MIN_STR_LEN]
Definition: vmware.c:83
char name[PAPI_MAX_STR_LEN]
Definition: vmware.c:81
char description[PAPI_HUGE_STR_LEN]
Definition: vmware.c:82
int report_difference
Definition: vmware.c:85
struct _vmware_register ra_bits
Definition: vmware.c:89
PAPI_component_info_t cmp_info
Definition: papi_vector.h:20
int _vmware_ctl(hwd_context_t *ctx, int code, _papi_int_option_t *option)
Definition: vmware.c:1190
#define VMWARE_CPU_USED_MS
Definition: vmware.c:43
static int LoadFunctions(void)
Definition: vmware.c:203
int _vmware_start(hwd_context_t *ctx, hwd_control_state_t *ctl)
Definition: vmware.c:1051
#define VMWARE_MEM_MAPPED_MB
Definition: vmware.c:49
static int num_events
Definition: vmware.c:290
#define VMWARE_MEM_SHARED_MB
Definition: vmware.c:52
int _vmware_read(hwd_context_t *ctx, hwd_control_state_t *ctl, long_long **events, int flags)
Definition: vmware.c:1080
#define VMWARE_HOST_TSC
Definition: vmware.c:62
int _vmware_update_control_state(hwd_control_state_t *ctl, NativeInfo_t *native, int count, hwd_context_t *ctx)
Definition: vmware.c:1026
#define VMWARE_CPU_RESERVATION_MHZ
Definition: vmware.c:40
int _vmware_init_control_state(hwd_control_state_t *ctl)
Definition: vmware.c:931
#define VMWARE_ELAPSED_MS
Definition: vmware.c:44
#define VMWARE_MEM_OVERHEAD_MB
Definition: vmware.c:50
#define VMWARE_ELAPSED_TIME
Definition: vmware.c:63
#define VMWARE_MAX_COUNTERS
Definition: vmware.c:37
static int use_guestlib
Definition: vmware.c:292
int _vmware_ntv_code_to_descr(unsigned int EventCode, char *name, int len)
Definition: vmware.c:1014
uint64_t rdpmc(int c)
Definition: vmware.c:93
#define VMWARE_MEM_LIMIT_MB
Definition: vmware.c:48
#define VMWARE_MEM_ACTIVE_MB
Definition: vmware.c:46
#define VMWARE_MEM_SWAPPED_MB
Definition: vmware.c:54
static struct _vmware_native_event_entry * _vmware_native_table
Definition: vmware.c:288
#define VMWARE_CPU_LIMIT_MHZ
Definition: vmware.c:39
static int use_pseudo
Definition: vmware.c:291
#define VMWARE_CPU_STOLEN_MS
Definition: vmware.c:42
int _vmware_init_thread(hwd_context_t *ctx)
Definition: vmware.c:528
int _vmware_ntv_code_to_name(unsigned int EventCode, char *name, int len)
Definition: vmware.c:998
#define VMWARE_MEM_USED_MB
Definition: vmware.c:56
int _vmware_reset(hwd_context_t *ctx, hwd_control_state_t *ctl)
Definition: vmware.c:1135
#define VMWARE_ELAPSED_APPARENT
Definition: vmware.c:64
int _vmware_init_component(int cidx)
Definition: vmware.c:560
int _vmware_shutdown_thread(hwd_context_t *ctx)
Definition: vmware.c:1145
int _vmware_ntv_code_to_info(unsigned int EventCode, PAPI_event_info_t *info)
Definition: vmware.c:972
static long long _vmware_hardware_read(struct _vmware_context *context, int starting)
Definition: vmware.c:302
#define VMWARE_MEM_BALLOONED_MB
Definition: vmware.c:47
papi_vector_t _vmware_vector
Definition: vmware.c:67
void(* _dl_non_dynamic_init)(void)
Definition: vmware.c:70
int _vmware_ntv_enum_events(unsigned int *EventCode, int modifier)
Definition: vmware.c:943
int _vmware_set_domain(hwd_control_state_t *ctl, int domain)
Definition: vmware.c:1212
#define VMWARE_HOST_CPU_MHZ
Definition: vmware.c:58
#define VMWARE_MEM_SHARES
Definition: vmware.c:53
int _vmware_shutdown_component(void)
Definition: vmware.c:1170
int _vmware_write(hwd_context_t *ctx, hwd_control_state_t *ctrl, long_long events[])
Definition: vmware.c:1121
int _vmware_stop(hwd_context_t *ctx, hwd_control_state_t *ctl)
Definition: vmware.c:1065
#define VMWARE_MEM_TARGET_SIZE_MB
Definition: vmware.c:55
#define VMWARE_CPU_SHARES
Definition: vmware.c:41
#define VMWARE_MEM_RESERVATION_MB
Definition: vmware.c:51
int retval
Definition: zero_fork.c:53