dolphin/Source/Core/Common/Debug/Threads.h

68 lines
1.7 KiB
C++

// Copyright 2020 Dolphin Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
#pragma once
#include <array>
#include <memory>
#include <optional>
#include <string>
#include <vector>
#include "Common/CommonTypes.h"
namespace Core
{
class CPUThreadGuard;
}
namespace Common::Debug
{
struct PartialContext
{
std::optional<std::array<u32, 32>> gpr;
std::optional<u32> cr;
std::optional<u32> lr;
std::optional<u32> ctr;
std::optional<u32> xer;
std::optional<std::array<double, 32>> fpr;
std::optional<u64> fpscr;
std::optional<u32> srr0;
std::optional<u32> srr1;
std::optional<u16> dummy;
std::optional<u16> state;
std::optional<std::array<u32, 8>> gqr;
std::optional<std::array<double, 32>> psf;
};
class ThreadView
{
public:
virtual ~ThreadView() = default;
enum class API
{
OSThread, // Nintendo SDK thread
LWPThread, // devkitPro libogc thread
};
virtual PartialContext GetContext(const Core::CPUThreadGuard& guard) const = 0;
virtual u32 GetAddress() const = 0;
virtual u16 GetState() const = 0;
virtual bool IsSuspended() const = 0;
virtual bool IsDetached() const = 0;
virtual s32 GetBasePriority() const = 0;
virtual s32 GetEffectivePriority() const = 0;
virtual u32 GetStackStart() const = 0;
virtual u32 GetStackEnd() const = 0;
virtual std::size_t GetStackSize() const = 0;
virtual s32 GetErrno() const = 0;
// Implementation specific, used to store arbitrary data
virtual std::string GetSpecific(const Core::CPUThreadGuard& guard) const = 0;
virtual bool IsValid(const Core::CPUThreadGuard& guard) const = 0;
};
using Threads = std::vector<std::unique_ptr<ThreadView>>;
} // namespace Common::Debug