[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [PATCH v10 06/11] x86/time: add a domain context record for tsc_info...
From: Paul Durrant <pdurrant@xxxxxxxxxx> ... and update xen-domctx to dump some information describing the record. NOTE: Whilst the record is x86 specific, it is visible directly in the common header as context record numbers should be unique across all architectures. Signed-off-by: Paul Durrant <pdurrant@xxxxxxxxxx> Reviewed-by: Jan Beulich <jbeulich@xxxxxxxx> --- Cc: Ian Jackson <iwj@xxxxxxxxxxxxxx> Cc: Wei Liu <wl@xxxxxxx> Cc: Andrew Cooper <andrew.cooper3@xxxxxxxxxx> Cc: George Dunlap <george.dunlap@xxxxxxxxxx> Cc: Julien Grall <julien@xxxxxxx> Cc: Stefano Stabellini <sstabellini@xxxxxxxxxx> Cc: "Roger Pau Monné" <roger.pau@xxxxxxxxxx> v10: - Re-base - Amend the specification now there is one - Kept Jan's R-b as the changes are cosmetic v8: - Removed stray blank line v7: - New in v7 --- docs/specs/domain-context.md | 32 ++++++++++++++++++++++++++++++++ tools/misc/xen-domctx.c | 12 ++++++++++++ xen/arch/x86/time.c | 30 ++++++++++++++++++++++++++++++ xen/include/public/save.h | 8 ++++++++ 4 files changed, 82 insertions(+) diff --git a/docs/specs/domain-context.md b/docs/specs/domain-context.md index 95e9f9d1ab..8aa3466d96 100644 --- a/docs/specs/domain-context.md +++ b/docs/specs/domain-context.md @@ -155,6 +155,38 @@ The record body contains the following fields: | `buffer` | The shared info (`length` being architecture | | | dependent[4]) | +### TSC_INFO + +``` + 0 1 2 3 4 5 6 7 octet ++-------+-------+-------+-------+-------+-------+-------+-------+ +| type == 3 | instance == 0 | ++-------------------------------+-------------------------------+ +| length == 20 | ++-------------------------------+-------------------------------+ +| mode | khz | ++-------------------------------+-------------------------------+ +| nsec | ++-------------------------------+-------------------------------+ +| incarnation | ++-------------------------------+ +``` + +The record body contains the following fields: + +| Field | Description | +|---------------|-----------------------------------------------| +| `mode` | 0x00000000: Default (emulate if necessary) | +| | 0x00000001: Always emulate | +| | 0x00000002: Never emulate | +| | | +| `khz` | The TSC frequency in kHz | +| | | +| `nsec` | Elapsed time in nanoseconds | +| | | +| `incarnation` | Incarnation (counter indicating how many | +| | times the TSC value has been set) | + * * * [1] See https://xenbits.xen.org/gitweb/?p=xen.git;a=blob;f=docs/designs/non-cooperative-migration.md diff --git a/tools/misc/xen-domctx.c b/tools/misc/xen-domctx.c index 5ea6de50d1..1a5dfb9d5a 100644 --- a/tools/misc/xen-domctx.c +++ b/tools/misc/xen-domctx.c @@ -136,6 +136,17 @@ static void dump_shared_info(void) #undef GET_FIELD_PTR } +static void dump_tsc_info(void) +{ + struct domain_context_tsc_info *t; + + GET_PTR(t); + + printf(" TSC_INFO: mode: %u incarnation: %u\n" + " khz %u nsec: %"PRIu64"\n", + t->mode, t->incarnation, t->khz, t->nsec); +} + static void dump_end(void) { struct domain_context_end *e; @@ -225,6 +236,7 @@ int main(int argc, char **argv) { case DOMAIN_CONTEXT_START: dump_start(); break; case DOMAIN_CONTEXT_SHARED_INFO: dump_shared_info(); break; + case DOMAIN_CONTEXT_TSC_INFO: dump_tsc_info(); break; case DOMAIN_CONTEXT_END: dump_end(); break; default: printf("Unknown type %u: skipping\n", rec->type); diff --git a/xen/arch/x86/time.c b/xen/arch/x86/time.c index 8938c0f435..aec4bfb0f3 100644 --- a/xen/arch/x86/time.c +++ b/xen/arch/x86/time.c @@ -26,6 +26,7 @@ #include <xen/symbols.h> #include <xen/keyhandler.h> #include <xen/guest_access.h> +#include <xen/save.h> #include <asm/io.h> #include <asm/iocap.h> #include <asm/msr.h> @@ -2451,6 +2452,35 @@ int tsc_set_info(struct domain *d, return 0; } +static int save_tsc_info(struct domain *d, struct domain_ctxt_state *c, + bool dry_run) +{ + struct domain_context_tsc_info t = {}; + + if ( !dry_run ) + tsc_get_info(d, &t.mode, &t.nsec, &t.khz, &t.incarnation); + + return domain_save_ctxt_rec(c, DOMAIN_CONTEXT_TSC_INFO, 0, &t, sizeof(t)); +} + +static int load_tsc_info(struct domain *d, struct domain_ctxt_state *c) +{ + struct domain_context_tsc_info t; + unsigned int i; + int rc; + + rc = domain_load_ctxt_rec(c, DOMAIN_CONTEXT_TSC_INFO, &i, &t, sizeof(t)); + if ( rc ) + return rc; + + if ( i ) /* expect only a single instance */ + return -ENXIO; + + return tsc_set_info(d, t.mode, t.nsec, t.khz, t.incarnation); +} + +DOMAIN_REGISTER_CTXT_TYPE(TSC_INFO, save_tsc_info, load_tsc_info); + /* vtsc may incur measurable performance degradation, diagnose with this */ static void dump_softtsc(unsigned char key) { diff --git a/xen/include/public/save.h b/xen/include/public/save.h index bccbaadd0b..86881864cf 100644 --- a/xen/include/public/save.h +++ b/xen/include/public/save.h @@ -50,6 +50,7 @@ enum { DOMAIN_CONTEXT_END, DOMAIN_CONTEXT_START, DOMAIN_CONTEXT_SHARED_INFO, + DOMAIN_CONTEXT_TSC_INFO, /* New types go here */ DOMAIN_CONTEXT_NR_TYPES }; @@ -69,6 +70,13 @@ struct domain_context_shared_info { uint8_t buffer[XEN_FLEX_ARRAY_DIM]; }; +struct domain_context_tsc_info { + uint32_t mode; + uint32_t khz; + uint64_t nsec; + uint32_t incarnation; +}; + /* Terminating entry */ struct domain_context_end {}; -- 2.20.1
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |