mirror of
https://git.savannah.gnu.org/git/grub.git
synced 2026-10-21 06:49:35 +00:00
i386/msr: Extract and improve MSR support detection code
Currently rdmsr and wrmsr commands have own MSR support detection code. This code is the same. So, it is duplicated. Additionally, this code cannot be reused by others. Hence, extract this code to a function and make it public. By the way, improve a code a bit. Additionally, use GRUB_ERR_BAD_DEVICE instead of GRUB_ERR_BUG to signal an error because errors encountered by this new routine are not bugs. Signed-off-by: Daniel Kiper <daniel.kiper@oracle.com> Signed-off-by: Sergii Dmytruk <sergii.dmytruk@3mdeb.com> Reviewed-by: Ross Philipson <ross.philipson@oracle.com> Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
This commit is contained in:
1 parent
929fafdf5e
commit
1b1061409d
3 files changed
+39
-32
No files matched your search
@@ -42,27 +42,16 @@ static const struct grub_arg_option options[] =
|
||||
static grub_err_t
|
||||
grub_cmd_msr_read (grub_extcmd_context_t ctxt, int argc, char **argv)
|
||||
{
|
||||
grub_uint32_t manufacturer[3], max_cpuid, a, b, c, features, addr;
|
||||
grub_err_t err;
|
||||
grub_uint32_t addr;
|
||||
grub_uint64_t value;
|
||||
const char *ptr;
|
||||
char buf[sizeof("1122334455667788")];
|
||||
|
||||
/*
|
||||
* The CPUID instruction should be used to determine whether MSRs
|
||||
* are supported. (CPUID.01H:EDX[5] = 1)
|
||||
*/
|
||||
if (! grub_cpu_is_cpuid_supported ())
|
||||
return grub_error (GRUB_ERR_BUG, N_("unsupported instruction"));
|
||||
err = grub_cpu_is_msr_supported ();
|
||||
|
||||
grub_cpuid (0, max_cpuid, manufacturer[0], manufacturer[2], manufacturer[1]);
|
||||
|
||||
if (max_cpuid < 1)
|
||||
return grub_error (GRUB_ERR_BUG, N_("unsupported instruction"));
|
||||
|
||||
grub_cpuid (1, a, b, c, features);
|
||||
|
||||
if (!(features & (1 << 5)))
|
||||
return grub_error (GRUB_ERR_BUG, N_("unsupported instruction"));
|
||||
if (err != GRUB_ERR_NONE)
|
||||
return grub_error (err, N_("RDMSR is unsupported"));
|
||||
|
||||
if (argc != 1)
|
||||
return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("one argument expected"));
|
||||
|
||||
Reference in new issue
Block a user