static void get_flags(struct flags *f) { char * tmp; int n; f->vcpus = xenstore_get("platform/vcpu/number"); f->vcpu_affinity = malloc(sizeof(char*) * f->vcpus); for (n = 0; n < f->vcpus; n++) { f->vcpu_affinity[n] = xenstore_gets("platform/vcpu/%d/affinity", n); } f->vcpus_current = xenstore_get("platform/vcpu/current"); f->vcpu_weight = xenstore_get("platform/vcpu/weight"); f->vcpu_cap = xenstore_get("platform/vcpu/cap"); f->nx = xenstore_get("platform/nx"); f->viridian = xenstore_get("platform/viridian"); f->viridian_time_ref_count = xenstore_get("platform/viridian_time_ref_count"); f->viridian_reference_tsc = xenstore_get("platform/viridian_reference_tsc"); f->apic = xenstore_get("platform/apic"); f->pae = xenstore_get("platform/pae"); f->tsc_mode = xenstore_get("platform/tsc_mode"); f->nested_hvm = xenstore_get("platform/exp-nested-hvm"); f->cores_per_socket = xenstore_get("platform/cores-per-socket"); /* Params going to hvmloader - need to convert "true" -> '1' as Xapi gets * this wrong when migrating from older hosts. */ f->acpi = hvmloader_flag("platform/acpi"); f->acpi_s4 = hvmloader_flag("platform/acpi_s4"); f->acpi_s3 = hvmloader_flag("platform/acpi_s3"); /* * HACK - Migrated VMs wont have this xs key set, so the naive action * would result in the HPET mysteriously disappearing. If the key is not * present then enable the hpet to match its default. */ tmp = xenstore_gets("platform/hpet"); if ( tmp && strlen(tmp) ) f->hpet = xenstore_get("platform/hpet"); else f->hpet = 1; free(tmp); xg_info("Determined the following parameters from xenstore:\n"); xg_info("vcpu/number:%d vcpu/weight:%d vcpu/cap:%d\n", f->vcpus, f->vcpu_weight, f->vcpu_cap); xg_info("nx: %d, pae %d, cores-per-socket %u\n", f->nx, f->pae, f->cores_per_socket); xg_info("apic: %d acpi: %d acpi_s4: %d acpi_s3: %d tsc_mode: %d hpet: %d\n", f->apic, f->acpi, f->acpi_s4, f->acpi_s3, f->tsc_mode, f->hpet); xg_info("viridian: %d, time_ref_count: %d, reference_tsc: %d\n", f->viridian, f->viridian_time_ref_count, f->viridian_reference_tsc); for (n = 0; n < f->vcpus; n++){ xg_info("vcpu/%d/affinity:%s\n", n, (f->vcpu_affinity[n])?f->vcpu_affinity[n]:"unset"); } }
static void get_flags(struct flags *f, int domid) { int n; f->vcpus = xenstore_get(domid, "platform/vcpu/number"); f->vcpu_affinity = (const char**)(malloc(sizeof(char*) * f->vcpus)); for (n = 0; n < f->vcpus; n++) { f->vcpu_affinity[n] = xenstore_gets(domid, "platform/vcpu/%d/affinity", n); } f->vcpus_current = xenstore_get(domid, "platform/vcpu/current"); f->vcpu_weight = xenstore_get(domid, "platform/vcpu/weight"); f->vcpu_cap = xenstore_get(domid, "platform/vcpu/cap"); f->nx = xenstore_get(domid, "platform/nx"); f->viridian = xenstore_get(domid, "platform/viridian"); f->apic = xenstore_get(domid, "platform/apic"); f->acpi = xenstore_get(domid, "platform/acpi"); f->pae = xenstore_get(domid, "platform/pae"); f->acpi_s4 = xenstore_get(domid, "platform/acpi_s4"); f->acpi_s3 = xenstore_get(domid, "platform/acpi_s3"); f->mmio_size_mib = xenstore_get(domid, "platform/mmio_size_mib"); f->tsc_mode = xenstore_get(domid, "platform/tsc_mode"); openlog("xenguest",LOG_NDELAY,LOG_DAEMON); syslog(LOG_INFO|LOG_DAEMON,"Determined the following parameters from xenstore:"); syslog(LOG_INFO|LOG_DAEMON,"vcpu/number:%d vcpu/weight:%d vcpu/cap:%d nx: %d viridian: %d apic: %d acpi: %d pae: %d acpi_s4: %d acpi_s3: %d mmio_size_mib: %ld tsc_mode %d", f->vcpus,f->vcpu_weight,f->vcpu_cap,f->nx,f->viridian,f->apic,f->acpi,f->pae,f->acpi_s4,f->acpi_s3,f->mmio_size_mib,f->tsc_mode); for (n = 0; n < f->vcpus; n++){ syslog(LOG_INFO|LOG_DAEMON,"vcpu/%d/affinity:%s", n, (f->vcpu_affinity[n])?f->vcpu_affinity[n]:"unset"); } closelog(); }
static int set_genid(void) { uint64_t paddr = 0; void *vaddr; char *genid_val_str; char *end; uint64_t genid[2]; int rc = -1; xc_get_hvm_param(xch, domid, HVM_PARAM_VM_GENERATION_ID_ADDR, &paddr); if (paddr == 0) return 0; genid_val_str = xenstore_gets("platform/generation-id"); if ( !genid_val_str ) return 0; errno = 0; genid[0] = strtoull(genid_val_str, &end, 0); genid[1] = 0; if ( end && end[0] == ':' ) genid[1] = strtoull(end+1, NULL, 0); if ( errno ) { xg_err("strtoull of '%s' failed: %s\n", genid_val_str, strerror(errno)); goto out; } else if ( genid[0] == 0 || genid[1] == 0 ) { xg_err("'%s' is not a valid generation id\n", genid_val_str); goto out; } vaddr = xc_map_foreign_range(xch, domid, XC_PAGE_SIZE, PROT_READ | PROT_WRITE, paddr >> XC_PAGE_SHIFT); if (vaddr == NULL) { xg_err("Failed to map VM generation ID page: %s\n", strerror(errno)); goto out; } memcpy(vaddr + (paddr & ~XC_PAGE_MASK), genid, 2 * sizeof(*genid)); munmap(vaddr, XC_PAGE_SIZE); /* * FIXME: Inject ACPI Notify event. */ xg_info("Wrote generation ID %"PRId64":%"PRId64" at 0x%"PRIx64"\n", genid[0], genid[1], paddr); rc = 0; out: free(genid_val_str); return rc; }
static void get_flags(struct flags *f, int domid) { int n; size_t host_pv_kernel_max_size; size_t host_pv_ramdisk_max_size; size_t vm_pv_kernel_max_size; size_t vm_pv_ramdisk_max_size; f->vcpus = xenstore_get(domid, "platform/vcpu/number"); f->vcpu_affinity = (const char**)(malloc(sizeof(char*) * f->vcpus)); for (n = 0; n < f->vcpus; n++) { f->vcpu_affinity[n] = xenstore_gets(domid, "platform/vcpu/%d/affinity", n); } f->vcpus_current = xenstore_get(domid, "platform/vcpu/current"); f->vcpu_weight = xenstore_get(domid, "platform/vcpu/weight"); f->vcpu_cap = xenstore_get(domid, "platform/vcpu/cap"); f->nx = xenstore_get(domid, "platform/nx"); f->viridian = xenstore_get(domid, "platform/viridian"); f->apic = xenstore_get(domid, "platform/apic"); f->acpi = xenstore_get(domid, "platform/acpi"); f->pae = xenstore_get(domid, "platform/pae"); f->acpi_s4 = xenstore_get(domid, "platform/acpi_s4"); f->acpi_s3 = xenstore_get(domid, "platform/acpi_s3"); f->mmio_size_mib = xenstore_get(domid, "platform/mmio_size_mib"); f->tsc_mode = xenstore_get(domid, "platform/tsc_mode"); xenstore_get_host_limits(&host_pv_kernel_max_size, &host_pv_ramdisk_max_size); vm_pv_kernel_max_size = xenstore_get(domid, "pv-kernel-max-size"); vm_pv_ramdisk_max_size = xenstore_get(domid, "pv-ramdisk-max-size"); f->kernel_max_size = vm_pv_kernel_max_size ? vm_pv_kernel_max_size : host_pv_kernel_max_size; f->ramdisk_max_size = vm_pv_ramdisk_max_size ? vm_pv_ramdisk_max_size : host_pv_ramdisk_max_size; syslog(LOG_INFO|LOG_DAEMON,"Determined the following parameters from xenstore:"); syslog(LOG_INFO|LOG_DAEMON,"vcpu/number:%d vcpu/weight:%d vcpu/cap:%d nx: %d viridian: %d apic: %d acpi: %d pae: %d acpi_s4: %d acpi_s3: %d mmio_size_mib: %ld tsc_mode %d", f->vcpus,f->vcpu_weight,f->vcpu_cap,f->nx,f->viridian,f->apic,f->acpi,f->pae,f->acpi_s4,f->acpi_s3,f->mmio_size_mib,f->tsc_mode); for (n = 0; n < f->vcpus; n++){ syslog(LOG_INFO|LOG_DAEMON,"vcpu/%d/affinity:%s", n, (f->vcpu_affinity[n])?f->vcpu_affinity[n]:"unset"); } syslog(LOG_INFO|LOG_DAEMON,"kernel/ramdisk host limits: (%zu,%zu), VM overrides: (%zu,%zu)", host_pv_kernel_max_size, host_pv_ramdisk_max_size, vm_pv_kernel_max_size, vm_pv_ramdisk_max_size); }
static int hvmloader_flag(const char *key) { /* Params going to hvmloader need to convert "true" -> '1' as Xapi gets * this wrong when migrating from older hosts. */ char *val = xenstore_gets("%s",key); int ret = -1; if ( val ) { if ( !strcmp(val, "1") ) { ret = 1; goto out; } else if ( !strcmp(val, "0") ) { ret = 0; goto out; } if ( !strcasecmp(val, "true") ) ret = 1; else { errno = 0; ret = strtol(val, NULL, 0); if ( errno ) ret = 0; } xg_info("HVMLoader error: Fixing up key '%s' from '%s' to '%d'\n", key, val, ret); xenstore_putsv(key, "%d", !!ret); } else xenstore_puts(key, "0"); out: free(val); return ret; }