diff --git a/src/boot/hardware.cpp b/src/boot/hardware.cpp index f20a06d..89f3cc3 100644 --- a/src/boot/hardware.cpp +++ b/src/boot/hardware.cpp @@ -83,6 +83,7 @@ check_cpu_supported() bool supported = true; #define CPU_FEATURE_OPT(...) +#define CPU_FEATURE_WRN(...) #define CPU_FEATURE_REQ(name, ...) \ if (!features[cpu::feature::name]) { \ status::fail(L"CPU required feature " L ## #name, uefi::status::unsupported); \ diff --git a/src/kernel/cpu.cpp b/src/kernel/cpu.cpp index d3879eb..e46be42 100644 --- a/src/kernel/cpu.cpp +++ b/src/kernel/cpu.cpp @@ -54,6 +54,10 @@ cpu_validate(cpu_data *c) #define CPU_FEATURE_OPT(name, ...) \ log::verbose(logs::boot, " Flag %11s: %s", #name, features[cpu::feature::name] ? "yes" : "no"); +#define CPU_FEATURE_WRN(name, feat_leaf, feat_sub, regname, bit) \ + log::verbose(logs::boot, " Flag %11s: %s", #name, features[cpu::feature::name] ? "yes" : "no"); \ + if (!features[cpu::feature::name]) log::warn(logs::boot, "Missing cpu feature %s but continuing", #name); + #define CPU_FEATURE_REQ(name, feat_leaf, feat_sub, regname, bit) \ log::verbose(logs::boot, " Flag %11s: %s", #name, features[cpu::feature::name] ? "yes" : "no"); \ kassert(features[cpu::feature::name], "Missing required CPU feature " #name ); diff --git a/src/libraries/cpu/cpu/cpu_id.h b/src/libraries/cpu/cpu/cpu_id.h index 5cfd71c..9181b61 100644 --- a/src/libraries/cpu/cpu/cpu_id.h +++ b/src/libraries/cpu/cpu/cpu_id.h @@ -10,7 +10,9 @@ namespace cpu { enum class feature { #define CPU_FEATURE_REQ(name, ...) name, #define CPU_FEATURE_OPT(name, ...) name, +#define CPU_FEATURE_WRN(name, ...) name, #include "cpu/features.inc" +#undef CPU_FEATURE_WRN #undef CPU_FEATURE_OPT #undef CPU_FEATURE_REQ max diff --git a/src/libraries/cpu/cpu/features.inc b/src/libraries/cpu/cpu/features.inc index dc6b542..98a422a 100644 --- a/src/libraries/cpu/cpu/features.inc +++ b/src/libraries/cpu/cpu/features.inc @@ -33,6 +33,6 @@ CPU_FEATURE_OPT(rdtscp, 0x80000001, 0, edx, 27) CPU_FEATURE_REQ(syscall, 0x80000001, 0, edx, 11) CPU_FEATURE_REQ(pdpe1gb, 0x80000001, 0, edx, 26) -CPU_FEATURE_OPT(invtsc, 0x80000007, 0, edx, 8) +CPU_FEATURE_WRN(invtsc, 0x80000007, 0, edx, 8) // vim: et diff --git a/src/libraries/cpu/cpu_id.cpp b/src/libraries/cpu/cpu_id.cpp index a4d765a..1b22533 100644 --- a/src/libraries/cpu/cpu_id.cpp +++ b/src/libraries/cpu/cpu_id.cpp @@ -49,12 +49,16 @@ cpu_id::features() const if (r.regname & (1ull << bit)) \ feats.set(feature::name); +#define CPU_FEATURE_WRN(name, feat_leaf, feat_sub, regname, bit) \ + CPU_FEATURE_OPT(name, feat_leaf, feat_sub, regname, bit); + #define CPU_FEATURE_REQ(name, feat_leaf, feat_sub, regname, bit) \ CPU_FEATURE_OPT(name, feat_leaf, feat_sub, regname, bit); #include "cpu/features.inc" #undef CPU_FEATURE_OPT #undef CPU_FEATURE_REQ +#undef CPU_FEATURE_WRN return feats; }