On 16/06/2016 19:12, Dr. David Alan Gilbert (git) wrote: > if (env->features[FEAT_8000_0001_EDX] & CPUID_EXT2_LM) { > - /* 64 bit processor */ > -/* XXX: The physical address space is limited to 42 bits in exec.c. */ > - *eax = 0x00003028; /* 48 bits virtual, 40 bits physical */ > + /* 64 bit processor, 48 bits virtual, configurable > + * physical bits. > + */ > + *eax = 0x00003000 + cpu->phys_bits;
This probably ought to be range checked in realize. I think you can also implement the magic 0 value there and have a bit less indentation. In addition, "-cpu host" should have phys-bits=0. Otherwise looks great. Paolo > } else { > if (env->features[FEAT_1_EDX] & CPUID_PSE36) { > *eax = 0x00000024; /* 36 bits physical */ > @@ -3273,6 +3274,7 @@ static Property x86_cpu_properties[] = { > DEFINE_PROP_BOOL("enforce", X86CPU, enforce_cpuid, false), > DEFINE_PROP_BOOL("kvm", X86CPU, expose_kvm, true), > DEFINE_PROP_BOOL("fill-mtrr-mask", X86CPU, fill_mtrr_mask, true), > + DEFINE_PROP_UINT32("phys-bits", X86CPU, phys_bits, 40), > DEFINE_PROP_UINT32("level", X86CPU, env.cpuid_level, 0), > DEFINE_PROP_UINT32("xlevel", X86CPU, env.cpuid_xlevel, 0), > DEFINE_PROP_UINT32("xlevel2", X86CPU, env.cpuid_xlevel2, 0), > diff --git a/target-i386/cpu.h b/target-i386/cpu.h > index 13d8501..fccba72 100644 > --- a/target-i386/cpu.h > +++ b/target-i386/cpu.h > @@ -1184,6 +1184,9 @@ struct X86CPU { > /* if true fill the top bits of the MTRR_PHYSMASKn variable range */ > bool fill_mtrr_mask; > > + /* Number of physical address bits supported */ > + uint32_t phys_bits;