grub-devel
[Top][All Lists]
Advanced

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

[PATCH] add cpumodelname mod to kernel for in grub.cfg to get cpu_mode_n


From: wangyouwan
Subject: [PATCH] add cpumodelname mod to kernel for in grub.cfg to get cpu_mode_name, load different versions of the kernel through the path composed of names. like this: linux /cpu_mode_name/vmlinuz-5.7.7-amd64-desktop
Date: Tue, 28 Dec 2021 09:31:00 +0800

From: ut000745 <wangyouwan@uniontech.com>

Signed-off-by: wangyouwan <wangyouwan@uniontech.com>
---
 grub-core/Makefile.core.def         |  1 +
 grub-core/kern/i386/coreboot/init.c |  5 ++
 grub-core/kern/i386/cpumodelname.c  | 73 +++++++++++++++++++++++++++++
 grub-core/kern/i386/efi/init.c      |  3 ++
 grub-core/kern/i386/pc/init.c       |  3 ++
 include/grub/i386/cpumodelname.h    | 24 ++++++++++
 6 files changed, 109 insertions(+)
 create mode 100644 grub-core/kern/i386/cpumodelname.c
 create mode 100644 include/grub/i386/cpumodelname.h

diff --git a/grub-core/Makefile.core.def b/grub-core/Makefile.core.def
index 8022e1c0a..2d46b945a 100644
--- a/grub-core/Makefile.core.def
+++ b/grub-core/Makefile.core.def
@@ -214,6 +214,7 @@ kernel = {
 
   x86 = kern/i386/tsc.c;
   x86 = kern/i386/tsc_pit.c;
+  x86 = kern/i386/cpumodelname.c;
   i386_efi = kern/i386/efi/tsc.c;
   x86_64_efi = kern/i386/efi/tsc.c;
   i386_efi = kern/i386/tsc_pmtimer.c;
diff --git a/grub-core/kern/i386/coreboot/init.c 
b/grub-core/kern/i386/coreboot/init.c
index 3314f027f..68675ac66 100644
--- a/grub-core/kern/i386/coreboot/init.c
+++ b/grub-core/kern/i386/coreboot/init.c
@@ -35,6 +35,7 @@
 #include <grub/cpu/floppy.h>
 #include <grub/cpu/tsc.h>
 #include <grub/video.h>
+#include <grub/cpu/cpumodelname.h>
 
 extern grub_uint8_t _start[];
 extern grub_uint8_t _end[];
@@ -109,6 +110,8 @@ grub_machine_init (void)
   grub_gfxterm_init ();
 
   grub_tsc_init ();
+
+  grub_cpu_model_name_init ();
 }
 
 #else
@@ -124,6 +127,8 @@ grub_machine_init (void)
   grub_machine_mmap_iterate (heap_init, NULL);
 
   grub_tsc_init ();
+
+  grub_cpu_model_name_init ();
 }
 
 #endif
diff --git a/grub-core/kern/i386/cpumodelname.c 
b/grub-core/kern/i386/cpumodelname.c
new file mode 100644
index 000000000..49adbcf14
--- /dev/null
+++ b/grub-core/kern/i386/cpumodelname.c
@@ -0,0 +1,73 @@
+/* kern/i386/cpumodelname.c - x86 get cpu model name
+ *
+ *  GRUB  --  GRand Unified Bootloader
+ *  Copyright (C) 2008  Free Software Foundation, Inc.
+ *
+ *  GRUB is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation, either version 3 of the License, or
+ *  (at your option) any later version.
+ *
+ *  GRUB is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with GRUB.  If not, see <http://www.gnu.org/licenses/>.
+ */
+#include <grub/mm.h>
+#include <grub/dl.h>
+#include <grub/env.h>
+#include <grub/i386/cpuid.h>
+#include <grub/i386/cpumodelname.h>
+
+GRUB_MOD_LICENSE ("GPLv3+");
+
+static void
+grub_get_model_name (void)
+{
+    char *ret = NULL;
+    grub_uint32_t x86_model_id[12];
+
+    char cpumodelname[6] = {0};
+    const char *list[] = {"Intel","AMD","zhaoxin"};
+    unsigned i;
+
+    grub_cpuid (0x80000002, x86_model_id[0], x86_model_id[1], x86_model_id[2], 
x86_model_id[3]);
+    grub_cpuid (0x80000003, x86_model_id[4], x86_model_id[5], x86_model_id[6], 
x86_model_id[7]);
+    grub_cpuid (0x80000004, x86_model_id[8], x86_model_id[9], 
x86_model_id[10], x86_model_id[11]);
+
+    for (i = 0; i < sizeof(list)/sizeof(list[0]); i++)
+    {
+        ret = grub_strstr ((char *)x86_model_id, list[i]);
+        if (ret != NULL)
+        {
+            grub_strncpy (cpumodelname, list[i], grub_strlen(list[i]) + 1);
+            break;
+        }
+    }
+
+    grub_env_set ("cpu_model_name", cpumodelname);
+    grub_env_export ("cpu_model_name");
+
+}
+
+void
+grub_cpu_model_name_init (void)
+{
+    unsigned int ext_level;
+    unsigned int eax, ebx, ecx, edx;
+
+    if (!grub_cpu_is_cpuid_supported ())
+        return;
+
+    grub_cpuid (0x80000000, eax, ebx, ecx, edx);
+    ext_level = eax;
+
+    if (ext_level < 0x80000004)
+        return;
+
+    grub_get_model_name ();
+
+}
diff --git a/grub-core/kern/i386/efi/init.c b/grub-core/kern/i386/efi/init.c
index 46476e27e..099265140 100644
--- a/grub-core/kern/i386/efi/init.c
+++ b/grub-core/kern/i386/efi/init.c
@@ -27,12 +27,15 @@
 #include <grub/efi/efi.h>
 #include <grub/i386/tsc.h>
 #include <grub/loader.h>
+#include <grub/i386/cpumodelname.h>
 
 void
 grub_machine_init (void)
 {
   grub_efi_init ();
   grub_tsc_init ();
+
+  grub_cpu_model_name_init ();
 }
 
 void
diff --git a/grub-core/kern/i386/pc/init.c b/grub-core/kern/i386/pc/init.c
index 27bc68b8a..b8251be8a 100644
--- a/grub-core/kern/i386/pc/init.c
+++ b/grub-core/kern/i386/pc/init.c
@@ -35,6 +35,7 @@
 #include <grub/cpu/cpuid.h>
 #include <grub/cpu/tsc.h>
 #include <grub/machine/time.h>
+#include <grub/cpu/cpumodelname.h>
 
 struct mem_region
 {
@@ -260,6 +261,8 @@ grub_machine_init (void)
     }
 
   grub_tsc_init ();
+
+  grub_cpu_model_name_init ();
 }
 
 void
diff --git a/include/grub/i386/cpumodelname.h b/include/grub/i386/cpumodelname.h
new file mode 100644
index 000000000..838fe1603
--- /dev/null
+++ b/include/grub/i386/cpumodelname.h
@@ -0,0 +1,24 @@
+/*
+ *  GRUB  --  GRand Unified Bootloader
+ *  Copyright (C) 2019  Free Software Foundation, Inc.
+ *
+ *  GRUB is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation, either version 3 of the License, or
+ *  (at your option) any later version.
+ *
+ *  GRUB is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with GRUB.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef GRUB_CPUMODENAME_H
+#define GRUB_CPUMODENAME_H 1
+
+void grub_cpu_model_name_init (void);
+
+#endif /* GRUB_CPUMODENAME_H */
-- 
2.20.1






reply via email to

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