Hi,

I have some disks that can be booted both physically and virtually,
and it is helpful to have different options depending on the type of
platform being used.  It's fine having different menu entries to
select at boot time, but I wanted to automate this in the
configuration.

I didn't find a solution through searching, so I modified a module to
supply sufficient information.  The CPU model name was unique enough
for my purpose of detecting whether it is a virtual machine (and I can
imagine additional use cases when GRUB2 is on a portable drive).  The
following patch can be used with configuration like this:

    insmod cpuid
    if [ "$cpuid_model_name" = "QEMU Virtual CPU ...

Would something like this be useful to have upstream?  Alternatively,
if there is a better way to get at various platform identifiers with
config scripts, can someone point me in the right direction?

Thanks.

David

=== modified file 'grub-core/commands/i386/cpuid.c'
--- grub-core/commands/i386/cpuid.c    2012-03-03 12:09:14 +0000
+++ grub-core/commands/i386/cpuid.c    2013-01-30 19:08:48 +0000
@@ -68,6 +68,8 @@
   unsigned int eax, ebx, ecx, edx;
   unsigned int max_level;
   unsigned int ext_level;
+  unsigned int vendor[4] = { 0 };
+  unsigned int model[12];

   /* See if we can use cpuid.  */
   asm volatile ("pushfl; pushfl; popl %0; movl %0,%1; xorl %2,%0;"
@@ -78,7 +80,10 @@
     goto done;

   /* Check the highest input value for eax.  */
-  cpuid (0, eax, ebx, ecx, edx);
+  cpuid (0, eax, vendor[0], vendor[2], vendor[1]);
+  /* Save the CPU vendor ID string. */
+  grub_env_set ("cpuid_vendor_id", (const char *)vendor);
+  grub_env_export ("cpuid_vendor_id");
   /* We only look at the first four characters.  */
   max_level = eax;
   if (max_level == 0)
@@ -91,6 +96,16 @@

   cpuid (0x80000001, eax, ebx, ecx, edx);
   grub_cpuid_has_longmode = !!(edx & bit_LM);
+
+  /* Assemble the CPU model name. */
+  if (ext_level >= 0x80000004)
+    {
+      cpuid(0x80000002, model[0], model[1], model[ 2], model[ 3]);
+      cpuid(0x80000003, model[4], model[5], model[ 6], model[ 7]);
+      cpuid(0x80000004, model[8], model[9], model[10], model[11]);
+      grub_env_set ("cpuid_model_name", (const char *)model);
+      grub_env_export ("cpuid_model_name");
+    }
 done:
 #endif

_______________________________________________
Grub-devel mailing list
Grub-devel@gnu.org
https://lists.gnu.org/mailman/listinfo/grub-devel

Reply via email to