There is no need for struct vcpu to live below the 4G boundary for PV guests,
or for HVM vcpus using HAP.
Plumb struct domain into alloc_vcpu_struct() so the x86 version can query the
domain's type and paging settings.
Signed-off-by: Andrew Cooper <andrew.cooper3@citrix.com>
Reviewed-by: Jan Beulich <jbeulich@suse.com>
Reviewed-by: Wei Liu <wei.liu2@citrix.com>
Acked-by: Julien Grall <julien.grall@arm.com>
#define MAX_PAGES_PER_VCPU 1
#endif
-struct vcpu *alloc_vcpu_struct(void)
+struct vcpu *alloc_vcpu_struct(const struct domain *d)
{
struct vcpu *v;
free_xenheap_page(d);
}
-struct vcpu *alloc_vcpu_struct(void)
+struct vcpu *alloc_vcpu_struct(const struct domain *d)
{
struct vcpu *v;
/*
* may require that the shadow CR3 points below 4GB, and hence the whole
* structure must satisfy this restriction. Thus we specify MEMF_bits(32).
*/
+ unsigned int memflags =
+ (is_hvm_domain(d) && paging_mode_shadow(d)) ? MEMF_bits(32) : 0;
+
BUILD_BUG_ON(sizeof(*v) > PAGE_SIZE);
- v = alloc_xenheap_pages(0, MEMF_bits(32));
+ v = alloc_xenheap_pages(0, memflags);
if ( v != NULL )
clear_page(v);
return v;
BUG_ON((!is_idle_domain(d) || vcpu_id) && d->vcpu[vcpu_id]);
- if ( (v = alloc_vcpu_struct()) == NULL )
+ if ( (v = alloc_vcpu_struct(d)) == NULL )
return NULL;
v->domain = d;
void free_domain_struct(struct domain *d);
/* Allocate/free a VCPU structure. */
-struct vcpu *alloc_vcpu_struct(void);
+struct vcpu *alloc_vcpu_struct(const struct domain *d);
void free_vcpu_struct(struct vcpu *v);
/* Allocate/free a PIRQ structure. */