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

#pragma once

#include <AK/Types.h>

// https://github.com/riscv-non-isa/riscv-c-api-doc/blob/main/src/c-api.adoc#extension-bitmask

struct RISCVFeatureBits {
    unsigned length;
    unsigned long long features[];
};

struct RISCVCPUModel {
    unsigned mvendorid;
    unsigned long long marchid;
    unsigned long long mimpid;
};

// 1st argument: extension name (used as our kernel CPUFeature flag name)
// 2nd and 3rd argument: groupid and bit position from https://github.com/riscv-non-isa/riscv-c-api-doc/blob/main/src/c-api.adoc#extension-bitmask-definitions
#define ENUMERATE_RISCV_EXTENSION_BITMASK_BITS(E) \
    E(A, 0, 0)                                    \
    E(C, 0, 2)                                    \
    E(D, 0, 3)                                    \
    E(F, 0, 5)                                    \
    E(I, 0, 8)                                    \
    E(M, 0, 12)                                   \
    E(V, 0, 21)                                   \
    E(Zacas, 0, 26)                               \
    E(Zba, 0, 27)                                 \
    E(Zbb, 0, 28)                                 \
    E(Zbc, 0, 29)                                 \
    E(Zbkb, 0, 30)                                \
    E(Zbkc, 0, 31)                                \
    E(Zbkx, 0, 32)                                \
    E(Zbs, 0, 33)                                 \
    E(Zfa, 0, 34)                                 \
    E(Zfh, 0, 35)                                 \
    E(Zfhmin, 0, 36)                              \
    E(Zicboz, 0, 37)                              \
    E(Zicond, 0, 38)                              \
    E(Zihintntl, 0, 39)                           \
    E(Zihintpause, 0, 40)                         \
    E(Zknd, 0, 41)                                \
    E(Zkne, 0, 42)                                \
    E(Zknh, 0, 43)                                \
    E(Zksed, 0, 44)                               \
    E(Zksh, 0, 45)                                \
    E(Zkt, 0, 46)                                 \
    E(Ztso, 0, 47)                                \
    E(Zvbb, 0, 48)                                \
    E(Zvbc, 0, 49)                                \
    E(Zvfh, 0, 50)                                \
    E(Zvfhmin, 0, 51)                             \
    E(Zvkb, 0, 52)                                \
    E(Zvkg, 0, 53)                                \
    E(Zvkned, 0, 54)                              \
    E(Zvknha, 0, 55)                              \
    E(Zvknhb, 0, 56)                              \
    E(Zvksed, 0, 57)                              \
    E(Zvksh, 0, 58)                               \
    E(Zvkt, 0, 59)                                \
    E(Zve32x, 0, 60)                              \
    E(Zve32f, 0, 61)                              \
    E(Zve64x, 0, 62)                              \
    E(Zve64f, 0, 63)                              \
    E(Zve64d, 1, 0)                               \
    E(Zimop, 1, 1)                                \
    E(Zca, 1, 2)                                  \
    E(Zcb, 1, 3)                                  \
    E(Zcd, 1, 4)                                  \
    E(Zcf, 1, 5)                                  \
    E(Zcmop, 1, 6)                                \
    E(Zawrs, 1, 7)

// Update this variable when a new groupid is used.
static constexpr size_t EXTENSION_BITMASK_GROUP_COUNT = 2;