Skip to content

Commit

Permalink
implement function updating the cpuid based on tdx caps just like qemu
Browse files Browse the repository at this point in the history
Signed-off-by: Jake Correnti <[email protected]>
  • Loading branch information
jakecorrenti committed Jul 26, 2024
1 parent 771f034 commit 4b2381b
Show file tree
Hide file tree
Showing 2 changed files with 207 additions and 44 deletions.
89 changes: 45 additions & 44 deletions src/launch/cpu.rs
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@ pub enum FeatureWord {
FeatSgx12_0Eax, // CPUID[EAX=0x12, ECX=0].EAX (SGX)
FeatSgx12_0Ebx, // CPUID[EAX=0x12, ECX=0].EBX (SGX MISCSELECT[31:0])
FeatSgx12_1Eax, // CPUID[EAX=0x12, ECX=1].EAX (SGX ATTRIBUTES[31:0])
FEATURE_WORDS,
}

const CPUID_MSR: u32 = 1 << 5;
Expand Down Expand Up @@ -123,10 +124,10 @@ pub struct TdxCpuidLookupEntry {
}

use std::collections::HashMap;
pub fn get_cpuid_lookup() -> HashMap<FeatureWord, TdxCpuidLookupEntry> {
pub fn get_cpuid_lookup() -> HashMap<u32, TdxCpuidLookupEntry> {
let mut map = HashMap::new();
map.insert(
FeatureWord::Feat1Edx,
FeatureWord::Feat1Edx as u32,
TdxCpuidLookupEntry {
tdx_fixed0: (1 << 10) | (1 << 20) | CPUID_IA64,
tdx_fixed1: CPUID_MSR
Expand All @@ -143,7 +144,7 @@ pub fn get_cpuid_lookup() -> HashMap<FeatureWord, TdxCpuidLookupEntry> {
},
);
map.insert(
FeatureWord::Feat1Ecx,
FeatureWord::Feat1Ecx as u32,
TdxCpuidLookupEntry {
tdx_fixed0: CPUID_EXT_VMX | CPUID_EXT_SMX | (1 << 16),
tdx_fixed1: CPUID_EXT_CX16
Expand All @@ -160,7 +161,7 @@ pub fn get_cpuid_lookup() -> HashMap<FeatureWord, TdxCpuidLookupEntry> {
);

map.insert(
FeatureWord::Feat8000_0001Edx,
FeatureWord::Feat8000_0001Edx as u32,
TdxCpuidLookupEntry {
tdx_fixed1: CPUID_EXT2_NX | CPUID_EXT2_PDPE1GB | CPUID_EXT2_RDTSCP | CPUID_EXT2_LM,
tdx_fixed0: 0,
Expand All @@ -171,7 +172,7 @@ pub fn get_cpuid_lookup() -> HashMap<FeatureWord, TdxCpuidLookupEntry> {
);

map.insert(
FeatureWord::Feat7_0Ebx,
FeatureWord::Feat7_0Ebx as u32,
TdxCpuidLookupEntry {
tdx_fixed0: CPUID_7_0_EBX_TSC_ADJUST | CPUID_7_0_EBX_SGX | CPUID_7_0_EBX_MPX,
tdx_fixed1: CPUID_7_0_EBX_FSGSBASE
Expand All @@ -188,7 +189,7 @@ pub fn get_cpuid_lookup() -> HashMap<FeatureWord, TdxCpuidLookupEntry> {
);

map.insert(
FeatureWord::Feat7_0Ecx,
FeatureWord::Feat7_0Ecx as u32,
TdxCpuidLookupEntry {
tdx_fixed0: CPUID_7_0_ECX_FZM
| CPUID_7_0_ECX_MAWAU
Expand All @@ -202,7 +203,7 @@ pub fn get_cpuid_lookup() -> HashMap<FeatureWord, TdxCpuidLookupEntry> {
);

map.insert(
FeatureWord::Feat7_0Edx,
FeatureWord::Feat7_0Edx as u32,
TdxCpuidLookupEntry {
tdx_fixed0: 0,
tdx_fixed1: CPUID_7_0_EDX_SPEC_CTRL
Expand All @@ -216,7 +217,7 @@ pub fn get_cpuid_lookup() -> HashMap<FeatureWord, TdxCpuidLookupEntry> {
);

map.insert(
FeatureWord::Feat8000_0008Ebx,
FeatureWord::Feat8000_0008Ebx as u32,
TdxCpuidLookupEntry {
tdx_fixed0: !CPUID_8000_0008_EBX_WBNOINVD,
tdx_fixed1: CPUID_8000_0008_EBX_WBNOINVD,
Expand All @@ -227,7 +228,7 @@ pub fn get_cpuid_lookup() -> HashMap<FeatureWord, TdxCpuidLookupEntry> {
);

map.insert(
FeatureWord::FeatXsave,
FeatureWord::FeatXsave as u32,
TdxCpuidLookupEntry {
tdx_fixed0: 0,
tdx_fixed1: CPUID_XSAVE_XSAVEOPT | CPUID_XSAVE_XSAVEC | CPUID_XSAVE_XSAVES,
Expand All @@ -238,7 +239,7 @@ pub fn get_cpuid_lookup() -> HashMap<FeatureWord, TdxCpuidLookupEntry> {
);

map.insert(
FeatureWord::Feat6Eax,
FeatureWord::Feat6Eax as u32,
TdxCpuidLookupEntry {
tdx_fixed0: 0,
tdx_fixed1: 0,
Expand All @@ -249,7 +250,7 @@ pub fn get_cpuid_lookup() -> HashMap<FeatureWord, TdxCpuidLookupEntry> {
);

map.insert(
FeatureWord::Feat8000_0007Edx,
FeatureWord::Feat8000_0007Edx as u32,
TdxCpuidLookupEntry {
tdx_fixed0: 0,
tdx_fixed1: 0,
Expand All @@ -260,7 +261,7 @@ pub fn get_cpuid_lookup() -> HashMap<FeatureWord, TdxCpuidLookupEntry> {
);

map.insert(
FeatureWord::FeatKvm,
FeatureWord::FeatKvm as u32,
TdxCpuidLookupEntry {
tdx_fixed0: 0,
tdx_fixed1: 0,
Expand Down Expand Up @@ -290,10 +291,10 @@ pub enum FeatureWordInfoType {

#[derive(Debug)]
pub struct FeatureWordInfoCpuid {
eax: u32,
needs_ecx: bool,
ecx: Option<u32>,
reg: X86Reg,
pub eax: u32,
pub needs_ecx: bool,
pub ecx: Option<u32>,
pub reg: X86Reg,
}

#[derive(Debug)]
Expand All @@ -303,11 +304,11 @@ pub struct FeatureWordInfoEntry {
}

// TODO: add MSR feature words
pub fn get_feature_word_info_lookup() -> HashMap<FeatureWord, FeatureWordInfoEntry> {
pub fn get_feature_word_info_lookup() -> HashMap<u32, FeatureWordInfoEntry> {
let mut map = HashMap::new();

map.insert(
FeatureWord::Feat1Edx,
FeatureWord::Feat1Edx as u32,
FeatureWordInfoEntry {
r#type: FeatureWordInfoType::CpuidFeatureWord,
cpuid: FeatureWordInfoCpuid {
Expand All @@ -320,7 +321,7 @@ pub fn get_feature_word_info_lookup() -> HashMap<FeatureWord, FeatureWordInfoEnt
);

map.insert(
FeatureWord::Feat1Ecx,
FeatureWord::Feat1Ecx as u32,
FeatureWordInfoEntry {
r#type: FeatureWordInfoType::CpuidFeatureWord,
cpuid: FeatureWordInfoCpuid {
Expand All @@ -333,7 +334,7 @@ pub fn get_feature_word_info_lookup() -> HashMap<FeatureWord, FeatureWordInfoEnt
);

map.insert(
FeatureWord::Feat8000_0001Edx,
FeatureWord::Feat8000_0001Edx as u32,
FeatureWordInfoEntry {
r#type: FeatureWordInfoType::CpuidFeatureWord,
cpuid: FeatureWordInfoCpuid {
Expand All @@ -346,7 +347,7 @@ pub fn get_feature_word_info_lookup() -> HashMap<FeatureWord, FeatureWordInfoEnt
);

map.insert(
FeatureWord::Feat8000_0001Ecx,
FeatureWord::Feat8000_0001Ecx as u32,
FeatureWordInfoEntry {
r#type: FeatureWordInfoType::CpuidFeatureWord,
cpuid: FeatureWordInfoCpuid {
Expand All @@ -359,7 +360,7 @@ pub fn get_feature_word_info_lookup() -> HashMap<FeatureWord, FeatureWordInfoEnt
);

map.insert(
FeatureWord::FeatC000_0001Edx,
FeatureWord::FeatC000_0001Edx as u32,
FeatureWordInfoEntry {
r#type: FeatureWordInfoType::CpuidFeatureWord,
cpuid: FeatureWordInfoCpuid {
Expand All @@ -372,7 +373,7 @@ pub fn get_feature_word_info_lookup() -> HashMap<FeatureWord, FeatureWordInfoEnt
);

map.insert(
FeatureWord::FeatKvm,
FeatureWord::FeatKvm as u32,
FeatureWordInfoEntry {
r#type: FeatureWordInfoType::CpuidFeatureWord,
cpuid: FeatureWordInfoCpuid {
Expand All @@ -385,7 +386,7 @@ pub fn get_feature_word_info_lookup() -> HashMap<FeatureWord, FeatureWordInfoEnt
);

map.insert(
FeatureWord::FeatKvmHints,
FeatureWord::FeatKvmHints as u32,
FeatureWordInfoEntry {
r#type: FeatureWordInfoType::CpuidFeatureWord,
cpuid: FeatureWordInfoCpuid {
Expand All @@ -398,7 +399,7 @@ pub fn get_feature_word_info_lookup() -> HashMap<FeatureWord, FeatureWordInfoEnt
);

map.insert(
FeatureWord::FeatSvm,
FeatureWord::FeatSvm as u32,
FeatureWordInfoEntry {
r#type: FeatureWordInfoType::CpuidFeatureWord,
cpuid: FeatureWordInfoCpuid {
Expand All @@ -411,7 +412,7 @@ pub fn get_feature_word_info_lookup() -> HashMap<FeatureWord, FeatureWordInfoEnt
);

map.insert(
FeatureWord::Feat7_0Ebx,
FeatureWord::Feat7_0Ebx as u32,
FeatureWordInfoEntry {
r#type: FeatureWordInfoType::CpuidFeatureWord,
cpuid: FeatureWordInfoCpuid {
Expand All @@ -424,7 +425,7 @@ pub fn get_feature_word_info_lookup() -> HashMap<FeatureWord, FeatureWordInfoEnt
);

map.insert(
FeatureWord::Feat7_0Ecx,
FeatureWord::Feat7_0Ecx as u32,
FeatureWordInfoEntry {
r#type: FeatureWordInfoType::CpuidFeatureWord,
cpuid: FeatureWordInfoCpuid {
Expand All @@ -437,7 +438,7 @@ pub fn get_feature_word_info_lookup() -> HashMap<FeatureWord, FeatureWordInfoEnt
);

map.insert(
FeatureWord::Feat7_0Edx,
FeatureWord::Feat7_0Edx as u32,
FeatureWordInfoEntry {
r#type: FeatureWordInfoType::CpuidFeatureWord,
cpuid: FeatureWordInfoCpuid {
Expand All @@ -450,7 +451,7 @@ pub fn get_feature_word_info_lookup() -> HashMap<FeatureWord, FeatureWordInfoEnt
);

map.insert(
FeatureWord::Feat7_1Eax,
FeatureWord::Feat7_1Eax as u32,
FeatureWordInfoEntry {
r#type: FeatureWordInfoType::CpuidFeatureWord,
cpuid: FeatureWordInfoCpuid {
Expand All @@ -463,7 +464,7 @@ pub fn get_feature_word_info_lookup() -> HashMap<FeatureWord, FeatureWordInfoEnt
);

map.insert(
FeatureWord::Feat7_1Edx,
FeatureWord::Feat7_1Edx as u32,
FeatureWordInfoEntry {
r#type: FeatureWordInfoType::CpuidFeatureWord,
cpuid: FeatureWordInfoCpuid {
Expand All @@ -476,7 +477,7 @@ pub fn get_feature_word_info_lookup() -> HashMap<FeatureWord, FeatureWordInfoEnt
);

map.insert(
FeatureWord::Feat7_2Edx,
FeatureWord::Feat7_2Edx as u32,
FeatureWordInfoEntry {
r#type: FeatureWordInfoType::CpuidFeatureWord,
cpuid: FeatureWordInfoCpuid {
Expand All @@ -489,7 +490,7 @@ pub fn get_feature_word_info_lookup() -> HashMap<FeatureWord, FeatureWordInfoEnt
);

map.insert(
FeatureWord::Feat8000_0007Edx,
FeatureWord::Feat8000_0007Edx as u32,
FeatureWordInfoEntry {
r#type: FeatureWordInfoType::CpuidFeatureWord,
cpuid: FeatureWordInfoCpuid {
Expand All @@ -502,7 +503,7 @@ pub fn get_feature_word_info_lookup() -> HashMap<FeatureWord, FeatureWordInfoEnt
);

map.insert(
FeatureWord::Feat8000_0008Ebx,
FeatureWord::Feat8000_0008Ebx as u32,
FeatureWordInfoEntry {
r#type: FeatureWordInfoType::CpuidFeatureWord,
cpuid: FeatureWordInfoCpuid {
Expand All @@ -515,7 +516,7 @@ pub fn get_feature_word_info_lookup() -> HashMap<FeatureWord, FeatureWordInfoEnt
);

map.insert(
FeatureWord::Feat8000_0021Eax,
FeatureWord::Feat8000_0021Eax as u32,
FeatureWordInfoEntry {
r#type: FeatureWordInfoType::CpuidFeatureWord,
cpuid: FeatureWordInfoCpuid {
Expand All @@ -528,7 +529,7 @@ pub fn get_feature_word_info_lookup() -> HashMap<FeatureWord, FeatureWordInfoEnt
);

map.insert(
FeatureWord::FeatXsave,
FeatureWord::FeatXsave as u32,
FeatureWordInfoEntry {
r#type: FeatureWordInfoType::CpuidFeatureWord,
cpuid: FeatureWordInfoCpuid {
Expand All @@ -541,7 +542,7 @@ pub fn get_feature_word_info_lookup() -> HashMap<FeatureWord, FeatureWordInfoEnt
);

map.insert(
FeatureWord::FeatXsaveXssLo,
FeatureWord::FeatXsaveXssLo as u32,
FeatureWordInfoEntry {
r#type: FeatureWordInfoType::CpuidFeatureWord,
cpuid: FeatureWordInfoCpuid {
Expand All @@ -554,7 +555,7 @@ pub fn get_feature_word_info_lookup() -> HashMap<FeatureWord, FeatureWordInfoEnt
);

map.insert(
FeatureWord::FeatXsaveXssHi,
FeatureWord::FeatXsaveXssHi as u32,
FeatureWordInfoEntry {
r#type: FeatureWordInfoType::CpuidFeatureWord,
cpuid: FeatureWordInfoCpuid {
Expand All @@ -567,7 +568,7 @@ pub fn get_feature_word_info_lookup() -> HashMap<FeatureWord, FeatureWordInfoEnt
);

map.insert(
FeatureWord::Feat6Eax,
FeatureWord::Feat6Eax as u32,
FeatureWordInfoEntry {
r#type: FeatureWordInfoType::CpuidFeatureWord,
cpuid: FeatureWordInfoCpuid {
Expand All @@ -580,7 +581,7 @@ pub fn get_feature_word_info_lookup() -> HashMap<FeatureWord, FeatureWordInfoEnt
);

map.insert(
FeatureWord::FeatXcr0Lo,
FeatureWord::FeatXcr0Lo as u32,
FeatureWordInfoEntry {
r#type: FeatureWordInfoType::CpuidFeatureWord,
cpuid: FeatureWordInfoCpuid {
Expand All @@ -593,7 +594,7 @@ pub fn get_feature_word_info_lookup() -> HashMap<FeatureWord, FeatureWordInfoEnt
);

map.insert(
FeatureWord::FeatXcr0Hi,
FeatureWord::FeatXcr0Hi as u32,
FeatureWordInfoEntry {
r#type: FeatureWordInfoType::CpuidFeatureWord,
cpuid: FeatureWordInfoCpuid {
Expand All @@ -608,7 +609,7 @@ pub fn get_feature_word_info_lookup() -> HashMap<FeatureWord, FeatureWordInfoEnt
// NOTE: add MSR Feature Word Entries here

map.insert(
FeatureWord::Feat14_0Ecx,
FeatureWord::Feat14_0Ecx as u32,
FeatureWordInfoEntry {
r#type: FeatureWordInfoType::CpuidFeatureWord,
cpuid: FeatureWordInfoCpuid {
Expand All @@ -621,7 +622,7 @@ pub fn get_feature_word_info_lookup() -> HashMap<FeatureWord, FeatureWordInfoEnt
);

map.insert(
FeatureWord::FeatSgx12_0Eax,
FeatureWord::FeatSgx12_0Eax as u32,
FeatureWordInfoEntry {
r#type: FeatureWordInfoType::CpuidFeatureWord,
cpuid: FeatureWordInfoCpuid {
Expand All @@ -634,7 +635,7 @@ pub fn get_feature_word_info_lookup() -> HashMap<FeatureWord, FeatureWordInfoEnt
);

map.insert(
FeatureWord::FeatSgx12_0Ebx,
FeatureWord::FeatSgx12_0Ebx as u32,
FeatureWordInfoEntry {
r#type: FeatureWordInfoType::CpuidFeatureWord,
cpuid: FeatureWordInfoCpuid {
Expand All @@ -647,7 +648,7 @@ pub fn get_feature_word_info_lookup() -> HashMap<FeatureWord, FeatureWordInfoEnt
);

map.insert(
FeatureWord::FeatSgx12_1Eax,
FeatureWord::FeatSgx12_1Eax as u32,
FeatureWordInfoEntry {
r#type: FeatureWordInfoType::CpuidFeatureWord,
cpuid: FeatureWordInfoCpuid {
Expand Down
Loading

0 comments on commit 4b2381b

Please sign in to comment.