mirror of
https://github.com/RPCSX/rpcsx.git
synced 2025-12-06 07:12:14 +01:00
148 lines
5.7 KiB
C++
148 lines
5.7 KiB
C++
#pragma once
|
|
|
|
#include "util/types.hpp"
|
|
#include "Utilities/StrFmt.h"
|
|
|
|
// Error code type (return type), implements error reporting.
|
|
class error_code
|
|
{
|
|
s32 value;
|
|
|
|
public:
|
|
error_code() = default;
|
|
|
|
// Implementation must be provided independently
|
|
static s32 error_report(s32 result, const char* fmt, const fmt_type_info* sup, const u64* args);
|
|
|
|
// Common constructor
|
|
template<typename ET>
|
|
error_code(const ET& value)
|
|
: value(error_report(static_cast<s32>(value), " : %s", fmt::type_info_v<ET>, fmt_args_t<ET>{fmt_unveil<ET>::get(value)}))
|
|
{
|
|
}
|
|
|
|
// Error constructor (2 args)
|
|
template<typename ET, typename T>
|
|
error_code(const ET& value, const T& arg)
|
|
: value(error_report(static_cast<s32>(value), " : %s, %s", fmt::type_info_v<ET, T>, fmt_args_t<ET, T>{fmt_unveil<ET>::get(value), fmt_unveil<T>::get(arg)}))
|
|
{
|
|
}
|
|
|
|
// Formatting constructor (error, format string, variadic list)
|
|
template <typename ET, typename... Args> requires (sizeof...(Args) > 0)
|
|
error_code(const ET& value, const const_str& fmt, const Args&... args)
|
|
: value(error_report(static_cast<s32>(value), fmt, fmt::type_info_v<Args...>, fmt_args_t<Args...>{fmt_unveil<Args>::get(args)...}))
|
|
{
|
|
}
|
|
|
|
operator s32() const
|
|
{
|
|
return value;
|
|
}
|
|
|
|
ENABLE_BITWISE_SERIALIZATION;
|
|
};
|
|
|
|
enum CellNotAnError : s32
|
|
{
|
|
CELL_OK = 0,
|
|
CELL_CANCEL = 1,
|
|
};
|
|
|
|
// Constructor specialization that doesn't trigger reporting
|
|
template <>
|
|
constexpr FORCE_INLINE error_code::error_code(const CellNotAnError& value)
|
|
: value(value)
|
|
{
|
|
}
|
|
|
|
// Helper function for error_code
|
|
template <typename T>
|
|
constexpr FORCE_INLINE CellNotAnError not_an_error(const T& value)
|
|
{
|
|
return static_cast<CellNotAnError>(static_cast<s32>(value));
|
|
}
|
|
|
|
template <typename T, typename>
|
|
struct ppu_gpr_cast_impl;
|
|
|
|
template <>
|
|
struct ppu_gpr_cast_impl<error_code, void>
|
|
{
|
|
static inline u64 to(const error_code& code)
|
|
{
|
|
return code;
|
|
}
|
|
|
|
static inline error_code from(const u64 reg)
|
|
{
|
|
return not_an_error(reg);
|
|
}
|
|
};
|
|
|
|
enum CellError : u32
|
|
{
|
|
CELL_EAGAIN = 0x80010001, // The resource is temporarily unavailable
|
|
CELL_EINVAL = 0x80010002, // An invalid argument value is specified
|
|
CELL_ENOSYS = 0x80010003, // The feature is not yet implemented
|
|
CELL_ENOMEM = 0x80010004, // Memory allocation failure
|
|
CELL_ESRCH = 0x80010005, // The resource with the specified identifier does not exist
|
|
CELL_ENOENT = 0x80010006, // The file does not exist
|
|
CELL_ENOEXEC = 0x80010007, // The file is in unrecognized format
|
|
CELL_EDEADLK = 0x80010008, // Resource deadlock is avoided
|
|
CELL_EPERM = 0x80010009, // The operation is not permitted
|
|
CELL_EBUSY = 0x8001000A, // The device or resource is busy
|
|
CELL_ETIMEDOUT = 0x8001000B, // The operation is timed out
|
|
CELL_EABORT = 0x8001000C, // The operation is aborted
|
|
CELL_EFAULT = 0x8001000D, // Invalid memory access
|
|
CELL_ENOCHILD = 0x8001000E, // Process has no child(s)
|
|
CELL_ESTAT = 0x8001000F, // State of the target thread is invalid
|
|
CELL_EALIGN = 0x80010010, // Alignment is invalid.
|
|
CELL_EKRESOURCE = 0x80010011, // Shortage of the kernel resources
|
|
CELL_EISDIR = 0x80010012, // The file is a directory
|
|
CELL_ECANCELED = 0x80010013, // Operation canceled
|
|
CELL_EEXIST = 0x80010014, // Entry already exists
|
|
CELL_EISCONN = 0x80010015, // Port is already connected
|
|
CELL_ENOTCONN = 0x80010016, // Port is not connected
|
|
CELL_EAUTHFAIL = 0x80010017, // Program authentication fail
|
|
CELL_ENOTMSELF = 0x80010018, // The file is not a MSELF
|
|
CELL_ESYSVER = 0x80010019, // System version error
|
|
CELL_EAUTHFATAL = 0x8001001A, // Fatal system error
|
|
CELL_EDOM = 0x8001001B, // Math domain violation
|
|
CELL_ERANGE = 0x8001001C, // Math range violation
|
|
CELL_EILSEQ = 0x8001001D, // Illegal multi-byte sequence in input
|
|
CELL_EFPOS = 0x8001001E, // File position error
|
|
CELL_EINTR = 0x8001001F, // Syscall was interrupted
|
|
CELL_EFBIG = 0x80010020, // File too large
|
|
CELL_EMLINK = 0x80010021, // Too many links
|
|
CELL_ENFILE = 0x80010022, // File table overflow
|
|
CELL_ENOSPC = 0x80010023, // No space left on device
|
|
CELL_ENOTTY = 0x80010024, // Not a TTY
|
|
CELL_EPIPE = 0x80010025, // Broken pipe
|
|
CELL_EROFS = 0x80010026, // Read-only filesystem (write fail)
|
|
CELL_ESPIPE = 0x80010027, // Illegal seek (e.g. seek on pipe)
|
|
CELL_E2BIG = 0x80010028, // Arg list too long
|
|
CELL_EACCES = 0x80010029, // Access violation
|
|
CELL_EBADF = 0x8001002A, // Invalid file descriptor
|
|
CELL_EIO = 0x8001002B, // Filesystem mounting failed (actually IO error...EIO)
|
|
CELL_EMFILE = 0x8001002C, // Too many files open
|
|
CELL_ENODEV = 0x8001002D, // No device
|
|
CELL_ENOTDIR = 0x8001002E, // Not a directory
|
|
CELL_ENXIO = 0x8001002F, // No such device or IO
|
|
CELL_EXDEV = 0x80010030, // Cross-device link error
|
|
CELL_EBADMSG = 0x80010031, // Bad Message
|
|
CELL_EINPROGRESS = 0x80010032, // In progress
|
|
CELL_EMSGSIZE = 0x80010033, // Message size error
|
|
CELL_ENAMETOOLONG = 0x80010034, // Name too long
|
|
CELL_ENOLCK = 0x80010035, // No lock
|
|
CELL_ENOTEMPTY = 0x80010036, // Not empty
|
|
CELL_ENOTSUP = 0x80010037, // Not supported
|
|
CELL_EFSSPECIFIC = 0x80010038, // File-system specific error
|
|
CELL_EOVERFLOW = 0x80010039, // Overflow occured
|
|
CELL_ENOTMOUNTED = 0x8001003A, // Filesystem not mounted
|
|
CELL_ENOTSDATA = 0x8001003B, // Not SData
|
|
CELL_ESDKVER = 0x8001003C, // Incorrect version in sys_load_param
|
|
CELL_ENOLICDISC = 0x8001003D, // Pointer is null. Similar than 0x8001003E but with some PARAM.SFO parameter (TITLE_ID?) embedded.
|
|
CELL_ENOLICENT = 0x8001003E, // Pointer is null
|
|
};
|