1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859 |
- use alloc::vec::Vec;
- #[derive(Debug, Default, Clone, Copy)]
- #[allow(dead_code)]
- pub struct KvmCpuidEntry2 {
- pub function: u32,
- pub index: u32,
- pub flags: KvmCpuidFlag,
- pub eax: u32,
- pub ebx: u32,
- pub ecx: u32,
- pub edx: u32,
- padding: [u32; 3],
- }
- impl KvmCpuidEntry2 {
- pub fn find(
- entries: &Vec<KvmCpuidEntry2>,
- function: u32,
- index: Option<u32>,
- ) -> Option<KvmCpuidEntry2> {
- for e in entries {
- if e.function != function {
- continue;
- }
- if !e
- .flags
- .contains(KvmCpuidFlag::KVM_CPUID_FLAG_SIGNIFCANT_INDEX)
- || Some(e.index) == index
- {
- return Some(*e);
- }
- if index.is_none() {
- return Some(*e);
- }
- }
- None
- }
- }
- bitflags! {
- pub struct KvmCpuidFlag: u32 {
- /// 表示CPUID函数的输入索引值是重要的,它会影响CPUID函数的行为或返回值
- const KVM_CPUID_FLAG_SIGNIFCANT_INDEX = 1 << 0;
- /// 表示CPUID函数是有状态的,即它的行为可能受到先前CPUID函数调用的影响
- const KVM_CPUID_FLAG_STATEFUL_FUNC = 1 << 1;
- /// 表示CPUID函数的状态应该在下一次CPUID函数调用中读取
- const KVM_CPUID_FLAG_STATE_READ_NEXT = 1 << 2;
- }
- }
- impl Default for KvmCpuidFlag {
- fn default() -> Self {
- Self::empty()
- }
- }
|