Kernel/riscv64: Add AK::Formatter for sstatus CSR
This commit is contained in:
parent
d061da4cf5
commit
6d8378735b
Notes:
sideshowbarker
2024-07-17 02:57:43 +09:00
Author: https://github.com/spholz Commit: https://github.com/SerenityOS/serenity/commit/6d8378735b Pull-request: https://github.com/SerenityOS/serenity/pull/22845 Reviewed-by: https://github.com/ADKaster ✅ Reviewed-by: https://github.com/kleinesfilmroellchen ✅
1 changed files with 97 additions and 0 deletions
|
@ -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 {};
|
||||
}
|
||||
};
|
||||
|
|
Loading…
Add table
Reference in a new issue