#include <asm/procinfo.h>
#include <asm/regs.h>
#include <asm/tee/tee.h>
+#include <asm/setup.h>
#include <asm/vfp.h>
#include <asm/vgic.h>
#include <asm/vtimer.h>
}
d->max_colors = config->arch.colors.max_colors;
- if ( copy_from_guest(d->colors, config->arch.colors.colors,
- d->max_colors) )
+ if ( d->domain_id <= max_init_domid )
+ memcpy(d->colors, config->arch.colors.colors.p, d->max_colors * sizeof(uint32_t));
+ else
{
- rc = -EINVAL;
- printk(XENLOG_ERR "Failed to copy colors for dom%u\n", d->domain_id);
- goto fail;
+ 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 ( !check_domain_colors(d) )
- {
- rc = -EINVAL;
- printk(XENLOG_ERR "Failed to check colors for dom%u\n", d->domain_id);
- goto fail;
- }
+ if ( !check_domain_colors(d) )
+ {
+ rc = -EINVAL;
+ printk(XENLOG_ERR "Failed to check colors for dom%u\n", d->domain_id);
+ goto fail;
}
+
+ printk("Dom%u colors: [ ", d->domain_id);
+ for ( int i = 0; i < d->max_colors; i++ )
+ printk("%u ", d->colors[i]);
+ printk("]\n");
#endif
return 0;
const struct dt_device_node *node)
{
struct kernel_info kinfo = {};
- int rc, i, k;
+ int rc;
u64 mem;
- u64 col_val;
rc = dt_property_read_u64(node, "memory", &mem);
if ( !rc )
return -ENOMEM;
d->max_pages = ~0U;
- rc = dt_property_read_u64(node, "colors", &col_val);
-
- if ( get_max_colors() && col_val )
- {
- printk("Colored configuration: 0x%"PRIx64"\n", col_val);
- d->max_colors = 0;
- if ( d->colors )
- xfree(d->colors);
-
- /* Calculate number of bit set */
- for ( i = 0; i < get_max_colors(); i++)
- if ( col_val & (1 << i) )
- d->max_colors++;
-
- d->colors = xzalloc_array(uint32_t, d->max_colors);
- for ( i = 0, k = 0; k < d->max_colors; i++ )
- if ( col_val & (1 << i) )
- d->colors[k++] = i;
-
- printk("DomU config: [ ");
- for ( k = 0; k < d->max_colors; k++ )
- printk("%u ", d->colors[k]);
- printk("]\n");
- }
-
kinfo.d = d;
rc = kernel_probe(&kinfo, node);
{
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;
BUG_ON(chosen == NULL);
dt_for_each_child_node(chosen, node)
GUEST_VPL011_SPI - 32 + 1);
}
+ d_cfg.arch.colors.max_colors = 0;
+ dt_property_read_u64(node, "colors", &col_val);
+ if ( get_max_colors() && col_val )
+ {
+ int i, k;
+
+ 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) )
+ 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 = domain_create(++max_init_domid, &d_cfg, false);
+
if ( IS_ERR(d) )
panic("Error creating domain %s\n", dt_node_name(node));
panic("Could not set up domain %s\n", dt_node_name(node));
domain_unpause_by_systemcontroller(d);
+ xfree(colors);
}
}