diff --git a/Kernel/Arch/riscv64/CSR.h b/Kernel/Arch/riscv64/CSR.h index 672880754c..062852b02a 100644 --- a/Kernel/Arch/riscv64/CSR.h +++ b/Kernel/Arch/riscv64/CSR.h @@ -7,6 +7,7 @@ #pragma once #include +#include #include #include @@ -243,3 +244,99 @@ enum class SCAUSE : u64 { }; } + +template<> +struct AK::Formatter : AK::Formatter { + ErrorOr format(FormatBuilder& builder, Kernel::RISCV64::CSR::SSTATUS value) + { + if (value.SD) + TRY(builder.put_literal("SD "sv)); + + switch (value.UXL) { + case Kernel::RISCV64::CSR::SSTATUS::XLEN::Bits32: + TRY(builder.put_literal("UXL=32 "sv)); + break; + case Kernel::RISCV64::CSR::SSTATUS::XLEN::Bits64: + TRY(builder.put_literal("UXL=64 "sv)); + break; + case Kernel::RISCV64::CSR::SSTATUS::XLEN::Bits128: + TRY(builder.put_literal("UXL=128 "sv)); + break; + } + + if (value.MXR) + TRY(builder.put_literal("MXR "sv)); + + if (value.SUM) + TRY(builder.put_literal("SUM "sv)); + + switch (value.XS) { + case Kernel::RISCV64::CSR::SSTATUS::UserModeExtensionsStatus::AllOff: + TRY(builder.put_literal("XS=AllOff "sv)); + break; + case Kernel::RISCV64::CSR::SSTATUS::UserModeExtensionsStatus::NoneDirtyOrClean_SomeOn: + TRY(builder.put_literal("XS=NoneDirtyOrClean_SomeOn "sv)); + break; + case Kernel::RISCV64::CSR::SSTATUS::UserModeExtensionsStatus::NoneDirty_SomeOn: + TRY(builder.put_literal("XS=NoneDirty_SomeOn "sv)); + break; + case Kernel::RISCV64::CSR::SSTATUS::UserModeExtensionsStatus::SomeDirty: + TRY(builder.put_literal("XS=SomeDirty "sv)); + break; + } + + switch (value.FS) { + case Kernel::RISCV64::CSR::SSTATUS::FloatingPointStatus::Off: + TRY(builder.put_literal("FS=Off "sv)); + break; + case Kernel::RISCV64::CSR::SSTATUS::FloatingPointStatus::Initial: + TRY(builder.put_literal("FS=Initial "sv)); + break; + case Kernel::RISCV64::CSR::SSTATUS::FloatingPointStatus::Clean: + TRY(builder.put_literal("FS=Clean "sv)); + break; + case Kernel::RISCV64::CSR::SSTATUS::FloatingPointStatus::Dirty: + TRY(builder.put_literal("FS=Dirty "sv)); + break; + } + + switch (value.VS) { + case Kernel::RISCV64::CSR::SSTATUS::VectorStatus::Off: + TRY(builder.put_literal("VS=Off "sv)); + break; + case Kernel::RISCV64::CSR::SSTATUS::VectorStatus::Initial: + TRY(builder.put_literal("VS=Initial "sv)); + break; + case Kernel::RISCV64::CSR::SSTATUS::VectorStatus::Clean: + TRY(builder.put_literal("VS=Clean "sv)); + break; + case Kernel::RISCV64::CSR::SSTATUS::VectorStatus::Dirty: + TRY(builder.put_literal("VS=Dirty "sv)); + break; + } + + switch (value.SPP) { + case Kernel::RISCV64::CSR::SSTATUS::PrivilegeMode::User: + TRY(builder.put_literal("SPP=User "sv)); + break; + case Kernel::RISCV64::CSR::SSTATUS::PrivilegeMode::Supervisor: + TRY(builder.put_literal("SPP=Supervisor "sv)); + break; + } + + if (value.UBE) + TRY(builder.put_literal("UBE "sv)); + + if (value.SPIE) + TRY(builder.put_literal("SPIE "sv)); + + if (value.SIE) + TRY(builder.put_literal("SIE "sv)); + + TRY(builder.put_literal("("sv)); + TRY(builder.put_u64(bit_cast(value), 16, true, false, true, false, FormatBuilder::Align::Right, 16)); + TRY(builder.put_literal(")"sv)); + + return {}; + } +};