Kernel/riscv64: Add AK::Formatter for sstatus CSR

This commit is contained in:
Sönke Holz 2024-01-14 18:02:05 +01:00 committed by Andrew Kaster
parent d061da4cf5
commit 6d8378735b

View file

@ -7,6 +7,7 @@
#pragma once
#include <AK/BitCast.h>
#include <AK/Format.h>
#include <AK/Types.h>
#include <AK/Platform.h>
@ -243,3 +244,99 @@ enum class SCAUSE : u64 {
};
}
template<>
struct AK::Formatter<Kernel::RISCV64::CSR::SSTATUS> : AK::Formatter<FormatString> {
ErrorOr<void> 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<u64>(value), 16, true, false, true, false, FormatBuilder::Align::Right, 16));
TRY(builder.put_literal(")"sv));
return {};
}
};