Newer
Older
minerva / Kernel / Arch / riscv64 / ProcessorInfo.cpp
@minerva minerva on 13 Jul 1 KB Initial commit
/*
 * Copyright (c) 2025, Sönke Holz <sholz8530@gmail.com>
 *
 * SPDX-License-Identifier: BSD-2-Clause
 */

#include <AK/StringBuilder.h>
#include <Kernel/Arch/Processor.h>
#include <Kernel/Arch/riscv64/CPUID.h>
#include <Kernel/Arch/riscv64/ProcessorInfo.h>
#include <Kernel/Arch/riscv64/SBI.h>

namespace Kernel {

ProcessorInfo::ProcessorInfo()
{
    if (!SBI::is_legacy()) {
        m_mvendorid = MUST(SBI::Base::get_mvendorid());
        m_marchid = MUST(SBI::Base::get_marchid());
        m_mimpid = MUST(SBI::Base::get_mimpid());
    }
}

void ProcessorInfo::build_isa_string(Processor const& processor)
{
    StringBuilder builder;

    MUST(builder.try_append("RV64"sv));

    bool first_multi_letter_extension = true;
    for (auto extension = CPUFeature::Type(1u); extension != CPUFeature::__End; extension <<= 1u) {
        if (processor.has_feature(extension)) {
            auto extension_name = cpu_feature_to_name(extension);
            if (extension_name.length() > 1) {
                if (first_multi_letter_extension)
                    first_multi_letter_extension = false;
                else
                    MUST(builder.try_append('_'));
            }
            MUST(builder.try_append(extension_name));
        }
    }

    m_isa_string = KString::must_create(builder.string_view());
}

}