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;
}
Ejemplo n.º 4
0
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;
}