mirror of
https://github.com/LadybirdBrowser/ladybird.git
synced 2024-12-28 13:43:45 +03:00
Kernel: Detect Aarch64 physical address bit width with CPU ID registers
This commit is contained in:
parent
66c65f6e2c
commit
401fc6afae
Notes:
sideshowbarker
2024-07-19 16:58:25 +09:00
Author: https://github.com/konradekk Commit: https://github.com/SerenityOS/serenity/commit/401fc6afae4 Pull-request: https://github.com/SerenityOS/serenity/pull/16781 Reviewed-by: https://github.com/ADKaster ✅ Reviewed-by: https://github.com/gmta
@ -1478,4 +1478,30 @@ NonnullOwnPtr<KString> build_cpu_feature_names(CPUFeature::Type const& features)
|
||||
return KString::must_create(builder.string_view());
|
||||
}
|
||||
|
||||
u8 detect_physical_address_bit_width()
|
||||
{
|
||||
auto memory_model_feature_register_0 = Aarch64::ID_AA64MMFR0_EL1::read();
|
||||
|
||||
switch (memory_model_feature_register_0.PARange) {
|
||||
case 0b0000:
|
||||
return 32; // 4GB
|
||||
case 0b0001:
|
||||
return 36; // 64GB
|
||||
case 0b0010:
|
||||
return 40; // 1TB
|
||||
case 0b0011:
|
||||
return 42; // 4TB
|
||||
case 0b0100:
|
||||
return 44; // 16TB
|
||||
case 0b0101:
|
||||
return 48; // 256TB
|
||||
case 0b0110:
|
||||
return 52; // 4PB (applies for FEAT_LPA or FEAT_LPA2)
|
||||
case 0b0111:
|
||||
return 56; // 64PB (applies for FEAT_D128)
|
||||
default:
|
||||
VERIFY_NOT_REACHED();
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -277,4 +277,6 @@ StringView cpu_feature_to_name(CPUFeature::Type const&);
|
||||
StringView cpu_feature_to_description(CPUFeature::Type const&);
|
||||
NonnullOwnPtr<KString> build_cpu_feature_names(CPUFeature::Type const&);
|
||||
|
||||
u8 detect_physical_address_bit_width();
|
||||
|
||||
}
|
||||
|
@ -33,6 +33,7 @@ void Processor::install(u32 cpu)
|
||||
VERIFY(g_current_processor == nullptr);
|
||||
m_cpu = cpu;
|
||||
m_features = detect_cpu_features();
|
||||
m_physical_address_bit_width = detect_physical_address_bit_width();
|
||||
|
||||
initialize_exceptions(cpu);
|
||||
|
||||
@ -42,6 +43,7 @@ void Processor::install(u32 cpu)
|
||||
void Processor::initialize()
|
||||
{
|
||||
dmesgln("CPU[{}]: Supports {}", m_cpu, build_cpu_feature_names(m_features));
|
||||
dmesgln("CPU[{}]: Physical address bit width: {}", m_cpu, m_physical_address_bit_width);
|
||||
}
|
||||
|
||||
[[noreturn]] void Processor::halt()
|
||||
|
@ -84,8 +84,7 @@ public:
|
||||
|
||||
ALWAYS_INLINE u8 physical_address_bit_width() const
|
||||
{
|
||||
TODO_AARCH64();
|
||||
return 0;
|
||||
return m_physical_address_bit_width;
|
||||
}
|
||||
|
||||
ALWAYS_INLINE u8 virtual_address_bit_width() const
|
||||
@ -286,6 +285,7 @@ private:
|
||||
|
||||
u32 m_cpu;
|
||||
CPUFeature::Type m_features;
|
||||
u8 m_physical_address_bit_width;
|
||||
|
||||
Thread* m_current_thread;
|
||||
Thread* m_idle_thread;
|
||||
|
Loading…
Reference in New Issue
Block a user