diff --git a/Kernel/Arch/aarch64/MainIdRegister.cpp b/Kernel/Arch/aarch64/MainIdRegister.cpp new file mode 100644 index 0000000000..0ffec21116 --- /dev/null +++ b/Kernel/Arch/aarch64/MainIdRegister.cpp @@ -0,0 +1,19 @@ +/* + * Copyright (c) 2021, Nico Weber + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#include + +namespace Kernel { + +MainIdRegister::MainIdRegister() +{ + unsigned int mrs; + asm volatile("mrs %x0, MIDR_EL1" + : "=r"(mrs)); + m_value = mrs; +} + +} diff --git a/Kernel/Arch/aarch64/MainIdRegister.h b/Kernel/Arch/aarch64/MainIdRegister.h new file mode 100644 index 0000000000..1b53c269d0 --- /dev/null +++ b/Kernel/Arch/aarch64/MainIdRegister.h @@ -0,0 +1,36 @@ +/* + * Copyright (c) 2021, Nico Weber + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#pragma once + +namespace Kernel { + +class MainIdRegister { +public: + MainIdRegister(); + + enum Implementer { + ArmLimited = 0x41, + }; + unsigned implementer() const { return (m_value >> 24) & 0xFF; } + unsigned variant() const { return (m_value >> 20) & 0xF; } + unsigned architecture() const { return (m_value >> 16) & 0xF; } + + enum PartNum { + RaspberryPi1 = 0xB76, + RaspberryPi2 = 0xC07, + RaspberryPi3 = 0xD03, + RaspberryPi4 = 0xD08, + }; + unsigned part_num() const { return (m_value >> 4) & 0xFFF; } + + unsigned revision() const { return m_value & 0xF; } + +private: + unsigned int m_value; +}; + +} diff --git a/Kernel/CMakeLists.txt b/Kernel/CMakeLists.txt index 036c84f7d6..5a0c8d896a 100644 --- a/Kernel/CMakeLists.txt +++ b/Kernel/CMakeLists.txt @@ -460,6 +460,7 @@ elseif("${SERENITY_ARCH}" STREQUAL "aarch64") Arch/aarch64/InterruptManagement.cpp Arch/aarch64/Interrupts.cpp Arch/aarch64/kprintf.cpp + Arch/aarch64/MainIdRegister.cpp Arch/aarch64/PageDirectory.cpp Arch/aarch64/Panic.cpp Arch/aarch64/Processor.cpp