cpuid.rs 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. use alloc::vec::Vec;
  2. #[derive(Debug, Default, Clone, Copy)]
  3. #[allow(dead_code)]
  4. pub struct KvmCpuidEntry2 {
  5. pub function: u32,
  6. pub index: u32,
  7. pub flags: KvmCpuidFlag,
  8. pub eax: u32,
  9. pub ebx: u32,
  10. pub ecx: u32,
  11. pub edx: u32,
  12. padding: [u32; 3],
  13. }
  14. impl KvmCpuidEntry2 {
  15. pub fn find(
  16. entries: &Vec<KvmCpuidEntry2>,
  17. function: u32,
  18. index: Option<u32>,
  19. ) -> Option<KvmCpuidEntry2> {
  20. for e in entries {
  21. if e.function != function {
  22. continue;
  23. }
  24. if !e
  25. .flags
  26. .contains(KvmCpuidFlag::KVM_CPUID_FLAG_SIGNIFCANT_INDEX)
  27. || Some(e.index) == index
  28. {
  29. return Some(*e);
  30. }
  31. if index.is_none() {
  32. return Some(*e);
  33. }
  34. }
  35. None
  36. }
  37. }
  38. bitflags! {
  39. pub struct KvmCpuidFlag: u32 {
  40. /// 表示CPUID函数的输入索引值是重要的,它会影响CPUID函数的行为或返回值
  41. const KVM_CPUID_FLAG_SIGNIFCANT_INDEX = 1 << 0;
  42. /// 表示CPUID函数是有状态的,即它的行为可能受到先前CPUID函数调用的影响
  43. const KVM_CPUID_FLAG_STATEFUL_FUNC = 1 << 1;
  44. /// 表示CPUID函数的状态应该在下一次CPUID函数调用中读取
  45. const KVM_CPUID_FLAG_STATE_READ_NEXT = 1 << 2;
  46. }
  47. }
  48. impl Default for KvmCpuidFlag {
  49. fn default() -> Self {
  50. Self::empty()
  51. }
  52. }