[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [xen staging] libxc/save: Write X86_{CPUID,MSR}_DATA records
commit f6b2b8ec53de8a6f178e53b180e47b05d6d2ea72 Author: Andrew Cooper <andrew.cooper3@xxxxxxxxxx> AuthorDate: Tue Dec 17 12:41:02 2019 +0000 Commit: Andrew Cooper <andrew.cooper3@xxxxxxxxxx> CommitDate: Fri May 29 17:33:03 2020 +0100 libxc/save: Write X86_{CPUID,MSR}_DATA records With the destination side now able to understand X86_{CPUID,MSR}_DATA records (and compatibly handle their absense), update the sending logic to obtain and forward this data from Xen. Signed-off-by: Andrew Cooper <andrew.cooper3@xxxxxxxxxx> Acked-by: Ian Jackson <ian.jackson@xxxxxxxxxxxxx> --- tools/libxc/xc_sr_common_x86.c | 50 ++++++++++++++++++++++++++++++++++++++++ tools/libxc/xc_sr_common_x86.h | 6 +++++ tools/libxc/xc_sr_save_x86_hvm.c | 2 +- tools/libxc/xc_sr_save_x86_pv.c | 12 +++++++++- 4 files changed, 68 insertions(+), 2 deletions(-) diff --git a/tools/libxc/xc_sr_common_x86.c b/tools/libxc/xc_sr_common_x86.c index 8980299e9a..6267655dab 100644 --- a/tools/libxc/xc_sr_common_x86.c +++ b/tools/libxc/xc_sr_common_x86.c @@ -42,6 +42,56 @@ int handle_x86_tsc_info(struct xc_sr_context *ctx, struct xc_sr_record *rec) return 0; } +int write_x86_cpu_policy_records(struct xc_sr_context *ctx) +{ + xc_interface *xch = ctx->xch; + struct xc_sr_record cpuid = { .type = REC_TYPE_X86_CPUID_POLICY, }; + struct xc_sr_record msrs = { .type = REC_TYPE_X86_MSR_POLICY, }; + uint32_t nr_leaves = 0, nr_msrs = 0; + int rc; + + if ( xc_get_cpu_policy_size(xch, &nr_leaves, &nr_msrs) < 0 ) + { + PERROR("Unable to get CPU Policy size"); + return -1; + } + + cpuid.data = malloc(nr_leaves * sizeof(xen_cpuid_leaf_t)); + msrs.data = malloc(nr_msrs * sizeof(xen_msr_entry_t)); + if ( !cpuid.data || !msrs.data ) + { + ERROR("Cannot allocate memory for CPU Policy"); + rc = -1; + goto out; + } + + if ( xc_get_domain_cpu_policy(xch, ctx->domid, &nr_leaves, cpuid.data, + &nr_msrs, msrs.data) ) + { + PERROR("Unable to get d%d CPU Policy", ctx->domid); + rc = -1; + goto out; + } + + cpuid.length = nr_leaves * sizeof(xen_cpuid_leaf_t); + if ( cpuid.length ) + { + rc = write_record(ctx, &cpuid); + if ( rc ) + goto out; + } + + msrs.length = nr_msrs * sizeof(xen_msr_entry_t); + if ( msrs.length ) + rc = write_record(ctx, &msrs); + + out: + free(cpuid.data); + free(msrs.data); + + return rc; +} + int handle_x86_cpuid_policy(struct xc_sr_context *ctx, struct xc_sr_record *rec) { xc_interface *xch = ctx->xch; diff --git a/tools/libxc/xc_sr_common_x86.h b/tools/libxc/xc_sr_common_x86.h index c458c1aa37..d1050981dd 100644 --- a/tools/libxc/xc_sr_common_x86.h +++ b/tools/libxc/xc_sr_common_x86.h @@ -14,6 +14,12 @@ int write_x86_tsc_info(struct xc_sr_context *ctx); */ int handle_x86_tsc_info(struct xc_sr_context *ctx, struct xc_sr_record *rec); +/* + * Obtains a domains CPU Policy from Xen, and writes X86_{CPUID,MSR}_POLICY + * records into the stream. + */ +int write_x86_cpu_policy_records(struct xc_sr_context *ctx); + /* * Parses an X86_CPUID_POLICY record and stashes the content for application * when a STATIC_DATA_END record is encountered. diff --git a/tools/libxc/xc_sr_save_x86_hvm.c b/tools/libxc/xc_sr_save_x86_hvm.c index bab9bd2877..0b2abb26bd 100644 --- a/tools/libxc/xc_sr_save_x86_hvm.c +++ b/tools/libxc/xc_sr_save_x86_hvm.c @@ -171,7 +171,7 @@ static int x86_hvm_setup(struct xc_sr_context *ctx) static int x86_hvm_static_data(struct xc_sr_context *ctx) { - return 0; + return write_x86_cpu_policy_records(ctx); } static int x86_hvm_start_of_stream(struct xc_sr_context *ctx) diff --git a/tools/libxc/xc_sr_save_x86_pv.c b/tools/libxc/xc_sr_save_x86_pv.c index 46019d962d..c7e246ef4f 100644 --- a/tools/libxc/xc_sr_save_x86_pv.c +++ b/tools/libxc/xc_sr_save_x86_pv.c @@ -1054,7 +1054,17 @@ static int x86_pv_setup(struct xc_sr_context *ctx) static int x86_pv_static_data(struct xc_sr_context *ctx) { - return write_x86_pv_info(ctx); + int rc; + + rc = write_x86_pv_info(ctx); + if ( rc ) + return rc; + + rc = write_x86_cpu_policy_records(ctx); + if ( rc ) + return rc; + + return 0; } static int x86_pv_start_of_stream(struct xc_sr_context *ctx) -- generated by git-patchbot for /home/xen/git/xen.git#staging
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |