return ERROR_FAIL;
}
- xc_config->colors.max_colors = d_config->b_info.num_colors;
- set_xen_guest_handle_raw(xc_config->colors.colors, d_config->b_info.colors);
+ config->arch.colors.max_colors = d_config->b_info.num_colors;
+ config->arch.colors.colors = 0;
+ for (i = 0; i < d_config->b_info.num_colors; i++)
+ config->arch.colors.colors |= ((unsigned long long)1 <<
+ d_config->b_info.colors[i]);
LOG(DEBUG, "Setup domain colors");
return 0;
}
else
{
+ int i, k;
+
d->colors = xzalloc_array(uint32_t, config->arch.colors.max_colors);
- if ( !d->colors ){
+ if ( !d->colors )
+ {
rc = -ENOMEM;
printk(XENLOG_ERR "Failed to alloc colors for dom%u\n",
d->domain_id);
}
d->max_colors = config->arch.colors.max_colors;
- if ( d->domain_id <= max_init_domid )
- memcpy(d->colors, config->arch.colors.colors.p, d->max_colors * sizeof(uint32_t));
- else
+ for ( i = 0, k = 0; k < d->max_colors && i < 64; i++ )
{
- rc = copy_from_guest(d->colors, config->arch.colors.colors, d->max_colors);
- if ( rc != 0 )
- {
- rc = -EINVAL;
- printk(XENLOG_ERR "Failed to copy colors for dom%u\n", d->domain_id);
- goto fail;
- }
+ if ( config->arch.colors.colors & (1ULL << i) )
+ d->colors[k++] = i;
}
}
struct dt_device_node *node;
const struct dt_device_node *chosen = dt_find_node_by_path("/chosen");
u64 col_val = 0;
- uint32_t *colors = NULL;
int rc;
BUG_ON(chosen == NULL);
}
d_cfg.arch.colors.max_colors = 0;
+ d_cfg.arch.colors.colors = 0ULL;
rc = dt_property_read_u64(node, "colors", &col_val);
if ( rc && col_val )
{
- int i, k;
+ int i;
if ( !get_max_colors() )
panic("Coloring requested but no colors configuration found!\n");
printk("Colored configuration: 0x%"PRIx64"\n", col_val);
/* Calculate number of bit set */
- for ( i = 0; i < get_max_colors(); i++)
- if ( col_val & (1 << i) )
+ for ( i = 0; i < 64; i++)
+ if ( col_val & (1ULL << i) )
d_cfg.arch.colors.max_colors++;
-
- colors = xzalloc_array(uint32_t, d_cfg.arch.colors.max_colors);
- if ( !colors )
- panic("Cannot allocate memory");
- for ( i = 0, k = 0; k < d_cfg.arch.colors.max_colors; i++ )
- if ( col_val & (1 << i) )
- colors[k++] = i;
- set_xen_guest_handle(d_cfg.arch.colors.colors, colors);
+ d_cfg.arch.colors.colors = col_val;
}
d = domain_create(++max_init_domid, &d_cfg, false);
panic("Could not set up domain %s\n", dt_node_name(node));
domain_unpause_by_systemcontroller(d);
- xfree(colors);
}
}
typedef struct vcpu_guest_context vcpu_guest_context_t;
DEFINE_XEN_GUEST_HANDLE(vcpu_guest_context_t);
-__DEFINE_XEN_GUEST_HANDLE(col, uint32_t);
-
struct color_guest_config {
uint32_t max_colors;
- XEN_GUEST_HANDLE(col) colors;
+ uint64_t colors;
};
/*