@@ -564,26 +564,40 @@ void VM_Version::initialize() {
564564 check_virtualizations ();
565565}
566566
567- void VM_Version::check_virtualizations () {
568567#if defined(LINUX)
569- const char * info_file = " /sys/devices/virtual/dmi/id/product_name" ;
570- // check for various strings in the dmi data indicating virtualizations
568+ static bool check_info_file (const char * fpath,
569+ const char * virt1, VirtualizationType vt1,
570+ const char * virt2, VirtualizationType vt2) {
571571 char line[500 ];
572- FILE* fp = os::fopen (info_file , " r" );
572+ FILE* fp = os::fopen (fpath , " r" );
573573 if (fp == nullptr ) {
574- return ;
574+ return false ;
575575 }
576576 while (fgets (line, sizeof (line), fp) != nullptr ) {
577- if (strcasestr (line, " KVM" ) != 0 ) {
578- Abstract_VM_Version::_detected_virtualization = KVM;
579- break ;
577+ if (strcasestr (line, virt1) != 0 ) {
578+ Abstract_VM_Version::_detected_virtualization = vt1;
579+ fclose (fp);
580+ return true ;
580581 }
581- if (strcasestr (line, " VMware" ) != 0 ) {
582- Abstract_VM_Version::_detected_virtualization = VMWare;
583- break ;
582+ if (virt2 != NULL && strcasestr (line, virt2) != 0 ) {
583+ Abstract_VM_Version::_detected_virtualization = vt2;
584+ fclose (fp);
585+ return true ;
584586 }
585587 }
586588 fclose (fp);
589+ return false ;
590+ }
591+ #endif
592+
593+ void VM_Version::check_virtualizations () {
594+ #if defined(LINUX)
595+ const char * pname_file = " /sys/devices/virtual/dmi/id/product_name" ;
596+ const char * tname_file = " /sys/hypervisor/type" ;
597+ if (check_info_file (pname_file, " KVM" , KVM, " VMWare" , VMWare)) {
598+ return ;
599+ }
600+ check_info_file (tname_file, " Xen" , XenHVM, NULL , NoDetectedVirtualization);
587601#endif
588602}
589603
0 commit comments