diff -ur -x .cproject -x .project -x '*.swp' xen-4.6.1/tools/firmware/hvmloader/hvmloader.c xen-4.6.1-new/tools/firmware/hvmloader/hvmloader.c --- xen-4.6.1/tools/firmware/hvmloader/hvmloader.c 2016-02-09 16:44:19.000000000 +0200 +++ xen-4.6.1-new/tools/firmware/hvmloader/hvmloader.c 2016-07-04 23:31:32.815000000 +0300 @@ -127,9 +127,11 @@ if ( !strcmp("XenVMMXenVMM", signature) ) break; + if ( !strcmp("ZenZenZenZen", signature) ) + break; } - BUG_ON(strcmp("XenVMMXenVMM", signature) || ((eax - base) < 2)); + BUG_ON( (strcmp("XenVMMXenVMM", signature) && strcmp("ZenZenZenZen", signature) ) || ((eax - base) < 2)); /* Fill in hypercall transfer pages. */ cpuid(base + 2, &eax, &ebx, &ecx, &edx); diff -ur -x .cproject -x .project -x '*.swp' xen-4.6.1/tools/libxl/libxl_create.c xen-4.6.1-new/tools/libxl/libxl_create.c --- xen-4.6.1/tools/libxl/libxl_create.c 2016-07-09 16:47:05.181000000 +0300 +++ xen-4.6.1-new/tools/libxl/libxl_create.c 2016-07-04 23:49:54.802000000 +0300 @@ -284,6 +284,8 @@ libxl_defbool_setdefault(&b_info->u.hvm.acpi_s4, true); libxl_defbool_setdefault(&b_info->u.hvm.nx, true); libxl_defbool_setdefault(&b_info->u.hvm.viridian, false); + libxl_defbool_setdefault(&b_info->u.hvm.spoof_viridian, false); + libxl_defbool_setdefault(&b_info->u.hvm.spoof_xen, false); libxl_defbool_setdefault(&b_info->u.hvm.hpet, true); libxl_defbool_setdefault(&b_info->u.hvm.vpt_align, true); libxl_defbool_setdefault(&b_info->u.hvm.nested_hvm, false); @@ -1263,6 +1265,11 @@ libxl__device_console_add(gc, domid, &console, state, &device); libxl__device_console_dispose(&console); + LOG(DEBUG, "Checking spoofing for guest (domid %d): xen %d, vir %d", domid, + libxl_defbool_val(d_config->b_info.u.hvm.spoof_xen), + libxl_defbool_val(d_config->b_info.u.hvm.spoof_viridian) + ); + dcs->dmss.dm.guest_domid = domid; if (libxl_defbool_val(d_config->b_info.device_model_stubdomain)) libxl__spawn_stub_dm(egc, &dcs->dmss); diff -ur -x .cproject -x .project -x '*.swp' xen-4.6.1/tools/libxl/libxl_dom.c xen-4.6.1-new/tools/libxl/libxl_dom.c --- xen-4.6.1/tools/libxl/libxl_dom.c 2016-07-09 16:47:05.212000000 +0300 +++ xen-4.6.1-new/tools/libxl/libxl_dom.c 2016-07-04 23:31:32.819000000 +0300 @@ -287,6 +287,10 @@ libxl_defbool_val(info->u.hvm.nested_hvm)); xc_hvm_param_set(handle, domid, HVM_PARAM_ALTP2M, libxl_defbool_val(info->u.hvm.altp2m)); + xc_hvm_param_set(handle, domid, HVM_PARAM_SPOOF_XEN, + libxl_defbool_val(info->u.hvm.spoof_xen)); + xc_hvm_param_set(handle, domid, HVM_PARAM_SPOOF_VIRIDIAN, + libxl_defbool_val(info->u.hvm.spoof_viridian)); } int libxl__build_pre(libxl__gc *gc, uint32_t domid, diff -ur -x .cproject -x .project -x '*.swp' xen-4.6.1/tools/libxl/libxl_types.idl xen-4.6.1-new/tools/libxl/libxl_types.idl --- xen-4.6.1/tools/libxl/libxl_types.idl 2016-02-09 16:44:19.000000000 +0200 +++ xen-4.6.1-new/tools/libxl/libxl_types.idl 2016-07-09 16:31:16.181000000 +0300 @@ -468,6 +468,8 @@ ("viridian", libxl_defbool), ("viridian_enable", libxl_bitmap), ("viridian_disable", libxl_bitmap), + ("spoof_viridian", libxl_defbool), + ("spoof_xen", libxl_defbool), ("timeoffset", string), ("hpet", libxl_defbool), ("vpt_align", libxl_defbool), diff -ur -x .cproject -x .project -x '*.swp' xen-4.6.1/tools/libxl/xl_cmdimpl.c xen-4.6.1-new/tools/libxl/xl_cmdimpl.c --- xen-4.6.1/tools/libxl/xl_cmdimpl.c 2016-07-09 16:47:05.027000000 +0300 +++ xen-4.6.1-new/tools/libxl/xl_cmdimpl.c 2016-07-04 23:32:38.046000000 +0300 @@ -1507,6 +1507,10 @@ xlu_cfg_get_defbool(config, "hpet", &b_info->u.hvm.hpet, 0); xlu_cfg_get_defbool(config, "vpt_align", &b_info->u.hvm.vpt_align, 0); + xlu_cfg_get_defbool(config, "spoof_xen", &b_info->u.hvm.spoof_xen, 0); + xlu_cfg_get_defbool(config, "spoof_viridian", &b_info->u.hvm.spoof_viridian, 0); + + switch (xlu_cfg_get_list(config, "viridian", &viridian, &num_viridian, 1)) { diff -ur -x .cproject -x .project -x '*.swp' xen-4.6.1/tools/misc/xen-detect.c xen-4.6.1-new/tools/misc/xen-detect.c --- xen-4.6.1/tools/misc/xen-detect.c 2016-02-09 16:44:19.000000000 +0200 +++ xen-4.6.1-new/tools/misc/xen-detect.c 2016-07-04 23:31:32.809000000 +0300 @@ -69,6 +69,8 @@ if ( !strcmp("XenVMMXenVMM", signature) && (regs[0] >= (base + 2)) ) goto found; + if ( !strcmp("ZenZenZenZen", signature) && (regs[0] >= (base + 2)) ) + goto found; } return 0; diff -ur -x .cproject -x .project -x '*.swp' xen-4.6.1/xen/arch/x86/hvm/hvm.c xen-4.6.1-new/xen/arch/x86/hvm/hvm.c --- xen-4.6.1/xen/arch/x86/hvm/hvm.c 2016-02-09 16:44:19.000000000 +0200 +++ xen-4.6.1-new/xen/arch/x86/hvm/hvm.c 2016-07-09 16:33:35.429000000 +0300 @@ -6047,6 +6050,14 @@ case HVM_PARAM_IOREQ_SERVER_PFN: d->arch.hvm_domain.ioreq_gmfn.base = a.value; break; + case HVM_PARAM_SPOOF_XEN: + printk("spoof_xen %" PRId64 " - curr dom %d, dom %d\n", a.value, curr_d->domain_id, d->domain_id); + d->arch.hvm_domain.spoof_xen = a.value; + break; + case HVM_PARAM_SPOOF_VIRIDIAN: + printk("spoof_vir %" PRId64 " - curr dom %d, dom %d\n", a.value, curr_d->domain_id, d->domain_id); + d->arch.hvm_domain.spoof_viridian = a.value; + break; case HVM_PARAM_NR_IOREQ_SERVER_PAGES: { unsigned int i; diff -ur -x .cproject -x .project -x '*.swp' xen-4.6.1/xen/arch/x86/hvm/viridian.c xen-4.6.1-new/xen/arch/x86/hvm/viridian.c --- xen-4.6.1/xen/arch/x86/hvm/viridian.c 2016-02-09 16:44:19.000000000 +0200 +++ xen-4.6.1-new/xen/arch/x86/hvm/viridian.c 2016-07-09 16:39:34.327000000 +0300 @@ -72,9 +72,16 @@ { case 0: *eax = 0x40000006; /* Maximum leaf */ - *ebx = 0x7263694d; /* Magic numbers */ - *ecx = 0x666F736F; - *edx = 0x76482074; + if (!d->arch.hvm_domain.spoof_viridian) { // "Microsoft Hv" + *ebx = 0x7263694d; // rciM + *ecx = 0x666F736F; // foso + *edx = 0x76482074; // vH t + } else { + printk("wetware cpuid_viridian_leaves spoof_vir\n"); // "Wetware Labs" + *ebx = 0x77746557; // wteW + *ecx = 0x20657261; // era + *edx = 0x7362614C; // sbaL + } break; case 1: *eax = 0x31237648; /* Version number */ diff -ur -x .cproject -x .project -x '*.swp' xen-4.6.1/xen/arch/x86/traps.c xen-4.6.1-new/xen/arch/x86/traps.c --- xen-4.6.1/xen/arch/x86/traps.c 2016-02-09 16:44:19.000000000 +0200 +++ xen-4.6.1-new/xen/arch/x86/traps.c 2016-07-04 23:31:32.653000000 +0300 @@ -779,9 +781,18 @@ { case 0: *eax = base + limit; /* Largest leaf */ - *ebx = XEN_CPUID_SIGNATURE_EBX; - *ecx = XEN_CPUID_SIGNATURE_ECX; - *edx = XEN_CPUID_SIGNATURE_EDX; + if (!currd->arch.hvm_domain.spoof_xen ) { + printk("cpuid_hypervisor_leaves - real id. domid %d\n",currd->domain_id); + *ebx = XEN_CPUID_SIGNATURE_EBX; + *ecx = XEN_CPUID_SIGNATURE_ECX; + *edx = XEN_CPUID_SIGNATURE_EDX; + } else + { + printk("cpuid_hypervisor_leaves - spoofed id. domid %d\n",currd->domain_id); + *ebx = ZEN_CPUID_SIGNATURE_EBX; + *ecx = ZEN_CPUID_SIGNATURE_ECX; + *edx = ZEN_CPUID_SIGNATURE_EDX; + } break; case 1: diff -ur -x .cproject -x .project -x '*.swp' xen-4.6.1/xen/include/asm-x86/hvm/domain.h xen-4.6.1-new/xen/include/asm-x86/hvm/domain.h --- xen-4.6.1/xen/include/asm-x86/hvm/domain.h 2016-02-09 16:44:19.000000000 +0200 +++ xen-4.6.1-new/xen/include/asm-x86/hvm/domain.h 2016-07-04 23:31:32.667000000 +0300 @@ -130,6 +130,9 @@ struct list_head msixtbl_list; spinlock_t msixtbl_list_lock; + bool_t spoof_xen; + bool_t spoof_viridian; + struct viridian_domain viridian; bool_t hap_enabled; diff -ur -x .cproject -x .project -x '*.swp' xen-4.6.1/xen/include/public/arch-x86/cpuid.h xen-4.6.1-new/xen/include/public/arch-x86/cpuid.h --- xen-4.6.1/xen/include/public/arch-x86/cpuid.h 2016-02-09 16:44:19.000000000 +0200 +++ xen-4.6.1-new/xen/include/public/arch-x86/cpuid.h 2016-07-09 16:45:16.126000000 +0300 @@ -53,6 +53,10 @@ #define XEN_CPUID_SIGNATURE_ECX 0x65584d4d /* "MMXe" */ #define XEN_CPUID_SIGNATURE_EDX 0x4d4d566e /* "nVMM" */ +#define ZEN_CPUID_SIGNATURE_EBX 0x5A6e655A /* "ZenZ" */ +#define ZEN_CPUID_SIGNATURE_ECX 0x655A6e65 /* "enZe" */ +#define ZEN_CPUID_SIGNATURE_EDX 0x6e655A6e /* "nZen" */ + /* * Leaf 2 (0x40000x01) * EAX[31:16]: Xen major version. diff -ur -x .cproject -x .project -x '*.swp' xen-4.6.1/xen/include/public/hvm/params.h xen-4.6.1-new/xen/include/public/hvm/params.h --- xen-4.6.1/xen/include/public/hvm/params.h 2016-02-09 16:44:19.000000000 +0200 +++ xen-4.6.1-new/xen/include/public/hvm/params.h 2016-07-04 23:31:32.672000000 +0300 @@ -192,6 +192,11 @@ /* Boolean: Enable altp2m */ #define HVM_PARAM_ALTP2M 35 -#define HVM_NR_PARAMS 36 +#define HVM_PARAM_SPOOF_XEN 36 + +#define HVM_PARAM_SPOOF_VIRIDIAN 37 + +#define HVM_NR_PARAMS 38 + #endif /* __XEN_PUBLIC_HVM_PARAMS_H__ */