qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Qemu-devel] Re: [PATCH] Add definitions for current cpu models..


From: Marcelo Tosatti
Subject: [Qemu-devel] Re: [PATCH] Add definitions for current cpu models..
Date: Thu, 24 Dec 2009 11:05:21 -0200
User-agent: Mutt/1.5.19 (2009-01-05)

On Mon, Dec 21, 2009 at 01:46:36AM -0500, john cooper wrote:
> This adds definitions for contemporary processors
> which may be selected via -cpu <model>, as an
> alternative to the existing use of -cpu qemu64
> augmented with a series of feature flags.
> 
> The primary motivation was determination of a
> least common denominator within a given processor
> class for simplification of guest migration.  It
> is still possible to modify an arbitrary model via
> additional feature flags however the goal here was
> to make doing so unnecessary in typical usage.  The
> other consideration was providing models names
> reflective of current processors.  Both AMD and
> Intel have reviewed the models in terms of balancing
> generality of migration vs. excessive feature
> downgrade relative to released silicon. 
> 
> A cpu feature 'check' option is also added which
> warns when feature flags (either implicit in a cpu
> model or explicit on the command line) would have
> otherwise been quietly disabled for a guest.
> 
> This patch was tested relative to qemu-kvm.git.
> 
> Signed-off-by: john cooper <address@hidden>
> ---
> 
> diff --git a/target-i386/helper.c b/target-i386/helper.c
> index 9a50da6..a706cae 100644
> --- a/target-i386/helper.c
> +++ b/target-i386/helper.c
> @@ -44,7 +44,7 @@ static const char *feature_name[] = {
>  static const char *ext_feature_name[] = {
>      "pni" /* Intel,AMD sse3 */, NULL, NULL, "monitor", "ds_cpl", "vmx", NULL 
> /* Linux smx */, "est",
>      "tm2", "ssse3", "cid", NULL, NULL, "cx16", "xtpr", NULL,
> -    NULL, NULL, "dca", NULL, NULL, "x2apic", NULL, "popcnt",
> +    NULL, NULL, "dca", "sse4.1", "sse4.2", "x2apic", NULL, "popcnt",
>      NULL, NULL, NULL, NULL, NULL, NULL, NULL, "hypervisor",
>  };

Separate patch?

>  static const char *ext2_feature_name[] = {
> @@ -60,6 +60,18 @@ static const char *ext3_feature_name[] = {
>      NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
>  };
>  
> +/* collects per-function cpuid data
> + */
> +typedef struct model_features_t {
> +    uint32_t *guest_feat;
> +    uint32_t *host_feat;
> +    uint32_t check_feat;
> +    const char **flag_names;
> +    uint32_t cpuid;
> +    } model_features_t;
> +
> +int check_cpuid = 0;
> +
>  static void add_flagname_to_bitmaps(const char *flagname, uint32_t *features,
>                                      uint32_t *ext_features,
>                                      uint32_t *ext2_features,
> @@ -171,6 +183,139 @@ static x86_def_t x86_defs[] = {
>          .model_id = "AMD Phenom(tm) 9550 Quad-Core Processor"
>      },
>      {
> +        .name = "Merom",
> +        .level = 2,
> +        .vendor1 = CPUID_VENDOR_INTEL_1,
> +        .vendor2 = CPUID_VENDOR_INTEL_2,
> +        .vendor3 = CPUID_VENDOR_INTEL_3,
> +        .family = 6, /* P6 */
> +        .model = 2,
> +        .stepping = 3,
> +        .features = PPRO_FEATURES | 
> +        /* these features are needed for Win64 and aren't fully implemented 
> */
> +            CPUID_MTRR | CPUID_CLFLUSH | CPUID_MCA |
> +        /* this feature is needed for Solaris and isn't fully implemented */
> +            CPUID_PSE36,
> +        .ext_features = CPUID_EXT_SSE3,              /* from qemu64 */
> +        .ext2_features = (PPRO_FEATURES & 0x0183F3FF) | 
> +            CPUID_EXT2_LM | CPUID_EXT2_SYSCALL | CPUID_EXT2_NX,
> +        .ext3_features = CPUID_EXT3_SVM,     /* from qemu64 */
> +        .xlevel = 0x8000000A,
> +        .model_id = "Intel Merom Core 2",
> +    },
> +    {
> +        .name = "Penryn",
> +        .level = 2,
> +        .vendor1 = CPUID_VENDOR_INTEL_1,
> +        .vendor2 = CPUID_VENDOR_INTEL_2,
> +        .vendor3 = CPUID_VENDOR_INTEL_3,
> +        .family = 6, /* P6 */
> +        .model = 2,
> +        .stepping = 3,
> +        .features = PPRO_FEATURES | 
> +        /* these features are needed for Win64 and aren't fully implemented 
> */
> +            CPUID_MTRR | CPUID_CLFLUSH | CPUID_MCA |
> +        /* this feature is needed for Solaris and isn't fully implemented */
> +            CPUID_PSE36,
> +        .ext_features = CPUID_EXT_SSE3 |
> +            CPUID_EXT_CX16 | CPUID_EXT_SSSE3 | CPUID_EXT_SSE41,
> +        .ext2_features = (PPRO_FEATURES & 0x0183F3FF) | 
> +            CPUID_EXT2_LM | CPUID_EXT2_SYSCALL | CPUID_EXT2_NX,
> +        .ext3_features = CPUID_EXT3_SVM,
> +        .xlevel = 0x8000000A,
> +        .model_id = "Intel Penryn Core 2",
> +    },
> +    {
> +        .name = "Nehalem",
> +        .level = 2,
> +        .vendor1 = CPUID_VENDOR_INTEL_1,
> +        .vendor2 = CPUID_VENDOR_INTEL_2,
> +        .vendor3 = CPUID_VENDOR_INTEL_3,
> +        .family = 6, /* P6 */
> +        .model = 2,
> +        .stepping = 3,
> +        .features = PPRO_FEATURES | 
> +        /* these features are needed for Win64 and aren't fully implemented 
> */
> +            CPUID_MTRR | CPUID_CLFLUSH | CPUID_MCA |
> +        /* this feature is needed for Solaris and isn't fully implemented */
> +            CPUID_PSE36,
> +        .ext_features = CPUID_EXT_SSE3 |
> +            CPUID_EXT_CX16 | CPUID_EXT_SSSE3 | CPUID_EXT_SSE41 |
> +            CPUID_EXT_SSE42 | CPUID_EXT_POPCNT,
> +        .ext2_features = (PPRO_FEATURES & 0x0183F3FF) | 
> +            CPUID_EXT2_LM | CPUID_EXT2_SYSCALL | CPUID_EXT2_NX,
> +        .ext3_features = CPUID_EXT3_SVM,
> +        .xlevel = 0x8000000A,
> +        .model_id = "Intel Nehalem Core i7",
> +    },
> +    {
> +        .name = "Opteron_G1",
> +        .level = 5,
> +        .vendor1 = CPUID_VENDOR_INTEL_1,
> +        .vendor2 = CPUID_VENDOR_INTEL_2,
> +        .vendor3 = CPUID_VENDOR_INTEL_3,
> +        .family = 15,
> +        .model = 6,
> +        .stepping = 1,
> +        .features = PPRO_FEATURES | 
> +        /* these features are needed for Win64 and aren't fully implemented 
> */
> +            CPUID_MTRR | CPUID_CLFLUSH | CPUID_MCA |
> +        /* this feature is needed for Solaris and isn't fully implemented */
> +            CPUID_PSE36,
> +        .ext_features = CPUID_EXT_SSE3 | CPUID_EXT_MONITOR,
> +        .ext2_features = (PPRO_FEATURES & 0x0183F3FF) | 
> +            CPUID_EXT2_LM | CPUID_EXT2_SYSCALL | CPUID_EXT2_NX,
> +        .ext3_features = CPUID_EXT3_SVM,
> +        .xlevel = 0x80000008,
> +        .model_id = "AMD Opteron G1",
> +    },
> +    {
> +        .name = "Opteron_G2",
> +        .level = 5,
> +        .vendor1 = CPUID_VENDOR_INTEL_1,
> +        .vendor2 = CPUID_VENDOR_INTEL_2,
> +        .vendor3 = CPUID_VENDOR_INTEL_3,

Silly question: why a CPU named "Opteron_G2" uses intel vendor id's?

> +static int unavailable_host_feature(struct model_features_t *f, uint32_t 
> mask)
> +{
> +    int i;
> +
> +    for (i = 0; i < 32; ++i)
> +        if (1 << i & mask) {
> +            fprintf(stderr, "warning: host cpuid %04x_%04x lacks requested"
> +                " flag '%s' [0x%08x]\n",
> +                f->cpuid >> 16, f->cpuid & 0xffff,
> +                f->flag_names[i] ? f->flag_names[i] : "[reserved]", mask);
> +            break;
> +        }
> +    return 0;
> +}

Deserves a separate patch, too.




reply via email to

[Prev in Thread] Current Thread [Next in Thread]