On 06/17/16 11:26, Kevin O'Connor wrote:
On Fri, Jun 17, 2016 at 03:20:10PM +0800, Haozhong Zhang wrote:
OS usually expects BIOS to set certain bits in MSR_IA32_FEATURE_CONTROL for some features (e.g. VMX and LMCE). QEMU provides a fw_cfg file "etc/msr_feature_control" to advise bits that should be set in MSR_IA32_FEATURE_CONTROL. If this file exists, SeaBIOS will set the advised bits in that MSR.
Thanks - see my comments below.
--- /dev/null +++ b/src/fw/msr_feature_control.c @@ -0,0 +1,16 @@ +#include "util.h" // msr_feature_control_setup, wrmsr_smp +#include "romfile.h" // romfile_find
+#define MSR_IA32_FEATURE_CONTROL 0x0000003a
+void msr_feature_control_setup(void) +{
- struct romfile_s *f = romfile_find("etc/msr_feature_control");
- if (!f)
return;
- u64 feature_control_bits;
- f->copy(f, &feature_control_bits, sizeof(feature_control_bits));
- if (feature_control_bits)
wrmsr_smp(MSR_IA32_FEATURE_CONTROL, feature_control_bits);
+}
Can you use romfile_loadint() instead? Something like:
u64 feature_control_bits = romfile_loadint("etc/msr_feature_control", 0); if (feature_control_bits) wrmsr_smp(MSR_IA32_FEATURE_CONTROL, feature_control_bits);
That should avoid the need for the separate romfile_find() call and it has the added benefit of additional sanity checks.
Also, I think this code is small enough it can be placed directly in paravirt.c and does not need its own c file.
I'll use romfile_loadint and place the code in paravirt.c in the next version.
Thanks, Haozhong