1
0
mirror of https://github.com/RPCS3/rpcs3.git synced 2024-11-25 20:22:30 +01:00

rsx: Fix exceptions

This commit is contained in:
Eladash 2022-12-16 19:10:23 +02:00 committed by Megamouse
parent f54da22f6f
commit 8980fc5524
6 changed files with 135 additions and 60 deletions

View File

@ -100,23 +100,17 @@ extern thread_local std::string(*g_tls_log_prefix)();
std::string dump_useful_thread_info() std::string dump_useful_thread_info()
{ {
thread_local volatile bool guard = false;
std::string result; std::string result;
// In case the dumping function was the cause for the exception/access violation
// Avoid recursion
if (std::exchange(guard, true))
{
return result;
}
if (auto cpu = get_current_cpu_thread()) if (auto cpu = get_current_cpu_thread())
{
// Wrap it to disable some internal exceptions when printing (not thrown on main thread)
Emu.BlockingCallFromMainThread([&]()
{ {
cpu->dump_all(result); cpu->dump_all(result);
});
} }
guard = false;
return result; return result;
} }

View File

@ -48,11 +48,11 @@ namespace gl
case rsx::blend_equation::add: return GL_FUNC_ADD; case rsx::blend_equation::add: return GL_FUNC_ADD;
case rsx::blend_equation::min: return GL_MIN; case rsx::blend_equation::min: return GL_MIN;
case rsx::blend_equation::max: return GL_MAX; case rsx::blend_equation::max: return GL_MAX;
case rsx::blend_equation::substract: return GL_FUNC_SUBTRACT; case rsx::blend_equation::subtract: return GL_FUNC_SUBTRACT;
case rsx::blend_equation::reverse_substract_signed: case rsx::blend_equation::reverse_subtract_signed:
rsx_log.trace("blend equation reverse_subtract_signed used. Emulating using FUNC_REVERSE_SUBTRACT"); rsx_log.trace("blend equation reverse_subtract_signed used. Emulating using FUNC_REVERSE_SUBTRACT");
[[fallthrough]]; [[fallthrough]];
case rsx::blend_equation::reverse_substract: return GL_FUNC_REVERSE_SUBTRACT; case rsx::blend_equation::reverse_subtract: return GL_FUNC_REVERSE_SUBTRACT;
case rsx::blend_equation::reverse_add_signed: case rsx::blend_equation::reverse_add_signed:
default: default:
rsx_log.error("Blend equation 0x%X is unimplemented!", static_cast<u32>(op)); rsx_log.error("Blend equation 0x%X is unimplemented!", static_cast<u32>(op));

View File

@ -158,11 +158,11 @@ namespace vk
[[fallthrough]]; [[fallthrough]];
case rsx::blend_equation::add: case rsx::blend_equation::add:
return VK_BLEND_OP_ADD; return VK_BLEND_OP_ADD;
case rsx::blend_equation::substract: return VK_BLEND_OP_SUBTRACT; case rsx::blend_equation::subtract: return VK_BLEND_OP_SUBTRACT;
case rsx::blend_equation::reverse_substract_signed: case rsx::blend_equation::reverse_subtract_signed:
rsx_log.trace("blend equation reverse_subtract_signed used. Emulating using FUNC_REVERSE_SUBTRACT"); rsx_log.trace("blend equation reverse_subtract_signed used. Emulating using FUNC_REVERSE_SUBTRACT");
[[fallthrough]]; [[fallthrough]];
case rsx::blend_equation::reverse_substract: return VK_BLEND_OP_REVERSE_SUBTRACT; case rsx::blend_equation::reverse_subtract: return VK_BLEND_OP_REVERSE_SUBTRACT;
case rsx::blend_equation::min: return VK_BLEND_OP_MIN; case rsx::blend_equation::min: return VK_BLEND_OP_MIN;
case rsx::blend_equation::max: return VK_BLEND_OP_MAX; case rsx::blend_equation::max: return VK_BLEND_OP_MAX;
default: default:

View File

@ -1,8 +1,32 @@
#include "gcm_enums.h" #include "gcm_enums.h"
#include "Utilities/StrFmt.h" #include "Utilities/StrFmt.h"
#include "Utilities/Thread.h"
using namespace rsx; using namespace rsx;
struct convertible_to_invalid
{
convertible_to_invalid() noexcept = default;
template <typename T> requires (std::is_enum_v<T>)
constexpr operator T() const
{
return T::invalid;
}
};
template <usz Size, typename... Args>
convertible_to_invalid throw_exception_if_emulating(const char(&fmt)[Size], Args&&... args)
{
if (thread_ctrl::get_current())
{
fmt::throw_exception(fmt, std::forward<Args>(args)...);
}
return {};
}
vertex_base_type rsx::to_vertex_base_type(u8 in) vertex_base_type rsx::to_vertex_base_type(u8 in)
{ {
switch (in) switch (in)
@ -16,7 +40,7 @@ vertex_base_type rsx::to_vertex_base_type(u8 in)
case 6: return vertex_base_type::cmp; case 6: return vertex_base_type::cmp;
case 7: return vertex_base_type::ub256; case 7: return vertex_base_type::ub256;
} }
fmt::throw_exception("Unknown vertex base type %d", in); return throw_exception_if_emulating("Unknown vertex base type %d", in);
} }
primitive_type rsx::to_primitive_type(u8 in) primitive_type rsx::to_primitive_type(u8 in)
@ -52,7 +76,7 @@ window_origin rsx::to_window_origin(u8 in)
case CELL_GCM_WINDOW_ORIGIN_TOP: return window_origin::top; case CELL_GCM_WINDOW_ORIGIN_TOP: return window_origin::top;
case CELL_GCM_WINDOW_ORIGIN_BOTTOM: return window_origin::bottom; case CELL_GCM_WINDOW_ORIGIN_BOTTOM: return window_origin::bottom;
} }
fmt::throw_exception("Unknown window origin modifier 0x%x", in); return throw_exception_if_emulating("Unknown window origin modifier 0x%x", in);
} }
window_pixel_center rsx::to_window_pixel_center(u8 in) window_pixel_center rsx::to_window_pixel_center(u8 in)
@ -62,7 +86,7 @@ window_pixel_center rsx::to_window_pixel_center(u8 in)
case CELL_GCM_WINDOW_PIXEL_CENTER_HALF: return window_pixel_center::half; case CELL_GCM_WINDOW_PIXEL_CENTER_HALF: return window_pixel_center::half;
case CELL_GCM_WINDOW_PIXEL_CENTER_INTEGER: return window_pixel_center::integer; case CELL_GCM_WINDOW_PIXEL_CENTER_INTEGER: return window_pixel_center::integer;
} }
fmt::throw_exception("Unknown window pixel center 0x%x", in); return throw_exception_if_emulating("Unknown window pixel center 0x%x", in);
} }
comparison_function rsx::to_comparison_function(u16 in) comparison_function rsx::to_comparison_function(u16 in)
@ -101,7 +125,7 @@ comparison_function rsx::to_comparison_function(u16 in)
case CELL_GCM_ALWAYS: case CELL_GCM_ALWAYS:
return comparison_function::always; return comparison_function::always;
} }
fmt::throw_exception("Unknown comparison function 0x%x", in); return throw_exception_if_emulating("Unknown comparison function 0x%x", in);
} }
fog_mode rsx::to_fog_mode(u32 in) fog_mode rsx::to_fog_mode(u32 in)
@ -115,7 +139,7 @@ fog_mode rsx::to_fog_mode(u32 in)
case CELL_GCM_FOG_MODE_EXP2_ABS: return fog_mode::exponential2_abs; case CELL_GCM_FOG_MODE_EXP2_ABS: return fog_mode::exponential2_abs;
case CELL_GCM_FOG_MODE_LINEAR_ABS: return fog_mode::linear_abs; case CELL_GCM_FOG_MODE_LINEAR_ABS: return fog_mode::linear_abs;
} }
fmt::throw_exception("Unknown fog mode 0x%x", in); return throw_exception_if_emulating("Unknown fog mode 0x%x", in);
} }
texture_dimension rsx::to_texture_dimension(u8 in) texture_dimension rsx::to_texture_dimension(u8 in)
@ -126,7 +150,7 @@ texture_dimension rsx::to_texture_dimension(u8 in)
case 2: return texture_dimension::dimension2d; case 2: return texture_dimension::dimension2d;
case 3: return texture_dimension::dimension3d; case 3: return texture_dimension::dimension3d;
} }
fmt::throw_exception("Unknown texture dimension %d", in); return throw_exception_if_emulating("Unknown texture dimension %d", in);
} }
template <> template <>
@ -228,6 +252,7 @@ void fmt_class_string<comparison_function>::format(std::string& out, u64 arg)
case comparison_function::not_equal: return "Not_equal"; case comparison_function::not_equal: return "Not_equal";
case comparison_function::greater_or_equal: return "Greater_equal"; case comparison_function::greater_or_equal: return "Greater_equal";
case comparison_function::always: return "Always"; case comparison_function::always: return "Always";
case comparison_function::invalid: return "Invalid";
} }
return unknown; return unknown;
@ -249,6 +274,7 @@ void fmt_class_string<stencil_op>::format(std::string& out, u64 arg)
case stencil_op::incr_wrap: return "Incr_wrap"; case stencil_op::incr_wrap: return "Incr_wrap";
case stencil_op::decr_wrap: return "Decr_wrap"; case stencil_op::decr_wrap: return "Decr_wrap";
case stencil_op::invert: return "Invert"; case stencil_op::invert: return "Invert";
case stencil_op::invalid: return "Invalid";
} }
return unknown; return unknown;
@ -268,6 +294,7 @@ void fmt_class_string<fog_mode>::format(std::string& out, u64 arg)
case fog_mode::exponential_abs: return "exponential(abs)"; case fog_mode::exponential_abs: return "exponential(abs)";
case fog_mode::linear: return "linear"; case fog_mode::linear: return "linear";
case fog_mode::linear_abs: return "linear(abs)"; case fog_mode::linear_abs: return "linear(abs)";
case fog_mode::invalid: return "Invalid";
} }
return unknown; return unknown;
@ -297,6 +324,7 @@ void fmt_class_string<logic_op>::format(std::string& out, u64 arg)
case logic_op::logic_copy_inverted: return "Copy_inverted"; case logic_op::logic_copy_inverted: return "Copy_inverted";
case logic_op::logic_or_inverted: return "Or_inverted"; case logic_op::logic_or_inverted: return "Or_inverted";
case logic_op::logic_nand: return "Nand"; case logic_op::logic_nand: return "Nand";
case logic_op::invalid: return "Invalid";
} }
return unknown; return unknown;
@ -312,6 +340,7 @@ void fmt_class_string<front_face>::format(std::string& out, u64 arg)
{ {
case front_face::ccw: return "counter clock wise"; case front_face::ccw: return "counter clock wise";
case front_face::cw: return "clock wise"; case front_face::cw: return "clock wise";
case front_face::invalid: return "Invalid";
} }
return unknown; return unknown;
@ -328,6 +357,7 @@ void fmt_class_string<cull_face>::format(std::string& out, u64 arg)
case cull_face::back: return "back"; case cull_face::back: return "back";
case cull_face::front: return "front"; case cull_face::front: return "front";
case cull_face::front_and_back: return "front and back"; case cull_face::front_and_back: return "front and back";
case cull_face::invalid: return "Invalid";
} }
return unknown; return unknown;
@ -347,6 +377,7 @@ void fmt_class_string<surface_target>::format(std::string& out, u64 arg)
case surface_target::surfaces_a_b: return "surfaces A and B"; case surface_target::surfaces_a_b: return "surfaces A and B";
case surface_target::surfaces_a_b_c: return "surfaces A, B and C"; case surface_target::surfaces_a_b_c: return "surfaces A, B and C";
case surface_target::surfaces_a_b_c_d: return "surfaces A,B, C and D"; case surface_target::surfaces_a_b_c_d: return "surfaces A,B, C and D";
case surface_target::invalid: return "Invalid";
} }
return unknown; return unknown;
@ -390,6 +421,7 @@ void fmt_class_string<blit_engine::transfer_operation>::format(std::string& out,
case blit_engine::transfer_operation::srccopy: return "srccopy"; case blit_engine::transfer_operation::srccopy: return "srccopy";
case blit_engine::transfer_operation::srccopy_and: return "srccopy_and"; case blit_engine::transfer_operation::srccopy_and: return "srccopy_and";
case blit_engine::transfer_operation::srccopy_premult: return "srccopy_premult"; case blit_engine::transfer_operation::srccopy_premult: return "srccopy_premult";
case blit_engine::transfer_operation::invalid: return "Invalid";
default: return unknown; default: return unknown;
} }
}); });
@ -415,6 +447,7 @@ void fmt_class_string<blit_engine::transfer_source_format>::format(std::string&
case blit_engine::transfer_source_format::x8r8g8b8: return "x8r8g8b8"; case blit_engine::transfer_source_format::x8r8g8b8: return "x8r8g8b8";
case blit_engine::transfer_source_format::y8: return "y8"; case blit_engine::transfer_source_format::y8: return "y8";
case blit_engine::transfer_source_format::yb8cr8ya8cb8: return "yb8cr8ya8cb8"; case blit_engine::transfer_source_format::yb8cr8ya8cb8: return "yb8cr8ya8cb8";
case blit_engine::transfer_source_format::invalid: return "Invalid";
default: return unknown; default: return unknown;
} }
}); });
@ -429,6 +462,7 @@ void fmt_class_string<blit_engine::context_surface>::format(std::string& out, u6
{ {
case blit_engine::context_surface::surface2d: return "surface 2d"; case blit_engine::context_surface::surface2d: return "surface 2d";
case blit_engine::context_surface::swizzle2d: return "swizzle 2d"; case blit_engine::context_surface::swizzle2d: return "swizzle 2d";
case blit_engine::context_surface::invalid: return "Invalid";
} }
return unknown; return unknown;
@ -445,6 +479,7 @@ void fmt_class_string<blit_engine::transfer_destination_format>::format(std::str
case blit_engine::transfer_destination_format::a8r8g8b8: return "a8r8g8b8"; case blit_engine::transfer_destination_format::a8r8g8b8: return "a8r8g8b8";
case blit_engine::transfer_destination_format::r5g6b5: return "r5g6b5"; case blit_engine::transfer_destination_format::r5g6b5: return "r5g6b5";
case blit_engine::transfer_destination_format::y32: return "y32"; case blit_engine::transfer_destination_format::y32: return "y32";
case blit_engine::transfer_destination_format::invalid: return "Invalid";
default: return unknown; default: return unknown;
} }
}); });
@ -459,6 +494,7 @@ void fmt_class_string<index_array_type>::format(std::string& out, u64 arg)
{ {
case index_array_type::u16: return "u16"; case index_array_type::u16: return "u16";
case index_array_type::u32: return "u32"; case index_array_type::u32: return "u32";
case index_array_type::invalid: return "Invalid";
} }
return unknown; return unknown;
@ -475,6 +511,7 @@ void fmt_class_string<polygon_mode>::format(std::string& out, u64 arg)
case polygon_mode::fill: return "fill"; case polygon_mode::fill: return "fill";
case polygon_mode::line: return "line"; case polygon_mode::line: return "line";
case polygon_mode::point: return "point"; case polygon_mode::point: return "point";
case polygon_mode::invalid: return "Invalid";
} }
return unknown; return unknown;
@ -502,6 +539,7 @@ void fmt_class_string<surface_color_format>::format(std::string& out, u64 arg)
case surface_color_format::x8b8g8r8_z8b8g8r8: return "X8B8G8R8_Z8B8G8R8"; case surface_color_format::x8b8g8r8_z8b8g8r8: return "X8B8G8R8_Z8B8G8R8";
case surface_color_format::x8b8g8r8_o8b8g8r8: return "X8B8G8R8_O8B8G8R8"; case surface_color_format::x8b8g8r8_o8b8g8r8: return "X8B8G8R8_O8B8G8R8";
case surface_color_format::a8b8g8r8: return "A8B8G8R8"; case surface_color_format::a8b8g8r8: return "A8B8G8R8";
case surface_color_format::invalid: return "Invalid";
} }
return unknown; return unknown;
@ -519,6 +557,7 @@ void fmt_class_string<surface_antialiasing>::format(std::string& out, u64 arg)
case surface_antialiasing::diagonal_centered_2_samples: return "2 samples diagonal centered"; case surface_antialiasing::diagonal_centered_2_samples: return "2 samples diagonal centered";
case surface_antialiasing::square_centered_4_samples: return "4 samples square centered"; case surface_antialiasing::square_centered_4_samples: return "4 samples square centered";
case surface_antialiasing::square_rotated_4_samples: return "4 samples diagonal rotated"; case surface_antialiasing::square_rotated_4_samples: return "4 samples diagonal rotated";
case surface_antialiasing::invalid: return "Invalid";
} }
return unknown; return unknown;
@ -533,13 +572,14 @@ void fmt_class_string<blend_equation>::format(std::string& out, u64 arg)
switch (value) switch (value)
{ {
case blend_equation::add: return "Add"; case blend_equation::add: return "Add";
case blend_equation::substract: return "Substract"; case blend_equation::subtract: return "Subtract";
case blend_equation::reverse_substract: return "Reverse_substract"; case blend_equation::reverse_subtract: return "Reverse_subtract";
case blend_equation::min: return "Min"; case blend_equation::min: return "Min";
case blend_equation::max: return "Max"; case blend_equation::max: return "Max";
case blend_equation::add_signed: return "Add_signed"; case blend_equation::add_signed: return "Add_signed";
case blend_equation::reverse_add_signed: return "Reverse_add_signed"; case blend_equation::reverse_add_signed: return "Reverse_add_signed";
case blend_equation::reverse_substract_signed: return "Reverse_substract_signed"; case blend_equation::reverse_subtract_signed: return "Reverse_subtract_signed";
case blend_equation::invalid: return "Invalid";
} }
return unknown; return unknown;
@ -568,6 +608,7 @@ void fmt_class_string<blend_factor>::format(std::string& out, u64 arg)
case blend_factor::one_minus_constant_color: return "(1 - const.rgb)"; case blend_factor::one_minus_constant_color: return "(1 - const.rgb)";
case blend_factor::constant_alpha: return "const.a"; case blend_factor::constant_alpha: return "const.a";
case blend_factor::one_minus_constant_alpha: return "(1 - const.a)"; case blend_factor::one_minus_constant_alpha: return "(1 - const.a)";
case blend_factor::invalid: return "Invalid";
} }
return unknown; return unknown;
@ -583,6 +624,7 @@ void fmt_class_string<window_origin>::format(std::string& out, u64 arg)
{ {
case window_origin::bottom: return "bottom"; case window_origin::bottom: return "bottom";
case window_origin::top: return "top"; case window_origin::top: return "top";
case window_origin::invalid: return "Invalid";
} }
return unknown; return unknown;
@ -598,6 +640,7 @@ void fmt_class_string<window_pixel_center>::format(std::string& out, u64 arg)
{ {
case window_pixel_center::half: return "half"; case window_pixel_center::half: return "half";
case window_pixel_center::integer: return "integer"; case window_pixel_center::integer: return "integer";
case window_pixel_center::invalid: return "Invalid";
} }
return unknown; return unknown;
@ -614,6 +657,7 @@ void fmt_class_string<user_clip_plane_op>::format(std::string& out, u64 arg)
case user_clip_plane_op::disable: return "disabled"; case user_clip_plane_op::disable: return "disabled";
case user_clip_plane_op::greater_or_equal: return "greater or equal"; case user_clip_plane_op::greater_or_equal: return "greater or equal";
case user_clip_plane_op::less_than: return "less than"; case user_clip_plane_op::less_than: return "less than";
case user_clip_plane_op::invalid: return "Invalid";
} }
return unknown; return unknown;
@ -630,6 +674,7 @@ void fmt_class_string<blit_engine::context_dma>::format(std::string& out, u64 ar
case blit_engine::context_dma::report_location_main: return "report location main"; case blit_engine::context_dma::report_location_main: return "report location main";
case blit_engine::context_dma::to_memory_get_report: return "to memory get report"; case blit_engine::context_dma::to_memory_get_report: return "to memory get report";
case blit_engine::context_dma::memory_host_buffer: return "memory host buffer"; case blit_engine::context_dma::memory_host_buffer: return "memory host buffer";
case blit_engine::context_dma::invalid: return "Invalid";
} }
return unknown; return unknown;
@ -645,6 +690,7 @@ void fmt_class_string<blit_engine::transfer_origin>::format(std::string& out, u6
{ {
case blit_engine::transfer_origin::center: return "center"; case blit_engine::transfer_origin::center: return "center";
case blit_engine::transfer_origin::corner: return "corner"; case blit_engine::transfer_origin::corner: return "corner";
case blit_engine::transfer_origin::invalid: return "Invalid";
} }
return unknown; return unknown;
@ -660,6 +706,7 @@ void fmt_class_string<shading_mode>::format(std::string& out, u64 arg)
{ {
case shading_mode::flat: return "flat"; case shading_mode::flat: return "flat";
case shading_mode::smooth: return "smooth"; case shading_mode::smooth: return "smooth";
case shading_mode::invalid: return "Invalid";
} }
return unknown; return unknown;
@ -675,6 +722,7 @@ void fmt_class_string<surface_depth_format>::format(std::string& out, u64 arg)
{ {
case surface_depth_format::z16: return "Z16"; case surface_depth_format::z16: return "Z16";
case surface_depth_format::z24s8: return "Z24S8"; case surface_depth_format::z24s8: return "Z24S8";
case surface_depth_format::invalid: return "Invalid";
} }
return unknown; return unknown;
@ -691,6 +739,7 @@ void fmt_class_string<blit_engine::transfer_interpolator>::format(std::string& o
{ {
case blit_engine::transfer_interpolator::foh: return "foh"; case blit_engine::transfer_interpolator::foh: return "foh";
case blit_engine::transfer_interpolator::zoh: return "zoh"; case blit_engine::transfer_interpolator::zoh: return "zoh";
case blit_engine::transfer_interpolator::invalid: return "Invalid";
} }
return unknown; return unknown;
@ -708,6 +757,7 @@ void fmt_class_string<texture_dimension>::format(std::string& out, u64 arg)
case texture_dimension::dimension1d: return "1D"; case texture_dimension::dimension1d: return "1D";
case texture_dimension::dimension2d: return "2D"; case texture_dimension::dimension2d: return "2D";
case texture_dimension::dimension3d: return "3D"; case texture_dimension::dimension3d: return "3D";
case texture_dimension::invalid: return "Invalid";
} }
return unknown; return unknown;
@ -729,6 +779,7 @@ void fmt_class_string<texture_max_anisotropy>::format(std::string& out, u64 arg)
case texture_max_anisotropy::x10: return "10"; case texture_max_anisotropy::x10: return "10";
case texture_max_anisotropy::x12: return "12"; case texture_max_anisotropy::x12: return "12";
case texture_max_anisotropy::x16: return "16"; case texture_max_anisotropy::x16: return "16";
case texture_max_anisotropy::invalid: return "Invalid";
} }
return unknown; return unknown;
@ -823,7 +874,7 @@ texture_wrap_mode rsx::to_texture_wrap_mode(u8 in)
case CELL_GCM_TEXTURE_MIRROR_ONCE_BORDER: return texture_wrap_mode::mirror_once_border; case CELL_GCM_TEXTURE_MIRROR_ONCE_BORDER: return texture_wrap_mode::mirror_once_border;
case CELL_GCM_TEXTURE_MIRROR_ONCE_CLAMP: return texture_wrap_mode::mirror_once_clamp; case CELL_GCM_TEXTURE_MIRROR_ONCE_CLAMP: return texture_wrap_mode::mirror_once_clamp;
} }
fmt::throw_exception("Unknown wrap mode 0x%x", in); return throw_exception_if_emulating("Unknown wrap mode 0x%x", in);
} }
texture_max_anisotropy rsx::to_texture_max_anisotropy(u8 in) texture_max_anisotropy rsx::to_texture_max_anisotropy(u8 in)
@ -839,7 +890,7 @@ texture_max_anisotropy rsx::to_texture_max_anisotropy(u8 in)
case CELL_GCM_TEXTURE_MAX_ANISO_12: return texture_max_anisotropy::x12; case CELL_GCM_TEXTURE_MAX_ANISO_12: return texture_max_anisotropy::x12;
case CELL_GCM_TEXTURE_MAX_ANISO_16: return texture_max_anisotropy::x16; case CELL_GCM_TEXTURE_MAX_ANISO_16: return texture_max_anisotropy::x16;
} }
fmt::throw_exception("Unknown anisotropy max mode 0x%x", in); return throw_exception_if_emulating("Unknown anisotropy max mode 0x%x", in);
} }
texture_minify_filter rsx::to_texture_minify_filter(u8 in) texture_minify_filter rsx::to_texture_minify_filter(u8 in)
@ -854,7 +905,7 @@ texture_minify_filter rsx::to_texture_minify_filter(u8 in)
case CELL_GCM_TEXTURE_LINEAR_LINEAR: return texture_minify_filter::linear_linear; case CELL_GCM_TEXTURE_LINEAR_LINEAR: return texture_minify_filter::linear_linear;
case CELL_GCM_TEXTURE_CONVOLUTION_MIN: return texture_minify_filter::linear_linear; case CELL_GCM_TEXTURE_CONVOLUTION_MIN: return texture_minify_filter::linear_linear;
} }
fmt::throw_exception("Unknown minify filter 0x%x", in); return throw_exception_if_emulating("Unknown minify filter 0x%x", in);
} }
@ -866,7 +917,7 @@ texture_magnify_filter rsx::to_texture_magnify_filter(u8 in)
case CELL_GCM_TEXTURE_LINEAR: return texture_magnify_filter::linear; case CELL_GCM_TEXTURE_LINEAR: return texture_magnify_filter::linear;
case CELL_GCM_TEXTURE_CONVOLUTION_MAG: return texture_magnify_filter::convolution_mag; case CELL_GCM_TEXTURE_CONVOLUTION_MAG: return texture_magnify_filter::convolution_mag;
} }
fmt::throw_exception("Unknown magnify filter 0x%x", in); return throw_exception_if_emulating("Unknown magnify filter 0x%x", in);
} }
surface_target rsx::to_surface_target(u8 in) surface_target rsx::to_surface_target(u8 in)
@ -880,7 +931,7 @@ surface_target rsx::to_surface_target(u8 in)
case CELL_GCM_SURFACE_TARGET_MRT2: return surface_target::surfaces_a_b_c; case CELL_GCM_SURFACE_TARGET_MRT2: return surface_target::surfaces_a_b_c;
case CELL_GCM_SURFACE_TARGET_MRT3: return surface_target::surfaces_a_b_c_d; case CELL_GCM_SURFACE_TARGET_MRT3: return surface_target::surfaces_a_b_c_d;
} }
fmt::throw_exception("Unknown surface target 0x%x", in); return throw_exception_if_emulating("Unknown surface target 0x%x", in);
} }
surface_depth_format rsx::to_surface_depth_format(u8 in) surface_depth_format rsx::to_surface_depth_format(u8 in)
@ -890,7 +941,7 @@ surface_depth_format rsx::to_surface_depth_format(u8 in)
case CELL_GCM_SURFACE_Z16: return surface_depth_format::z16; case CELL_GCM_SURFACE_Z16: return surface_depth_format::z16;
case CELL_GCM_SURFACE_Z24S8: return surface_depth_format::z24s8; case CELL_GCM_SURFACE_Z24S8: return surface_depth_format::z24s8;
} }
fmt::throw_exception("Unknown surface depth format 0x%x", in); return throw_exception_if_emulating("Unknown surface depth format 0x%x", in);
} }
surface_antialiasing rsx::to_surface_antialiasing(u8 in) surface_antialiasing rsx::to_surface_antialiasing(u8 in)
@ -902,7 +953,7 @@ surface_antialiasing rsx::to_surface_antialiasing(u8 in)
case CELL_GCM_SURFACE_SQUARE_CENTERED_4: return surface_antialiasing::square_centered_4_samples; case CELL_GCM_SURFACE_SQUARE_CENTERED_4: return surface_antialiasing::square_centered_4_samples;
case CELL_GCM_SURFACE_SQUARE_ROTATED_4: return surface_antialiasing::square_rotated_4_samples; case CELL_GCM_SURFACE_SQUARE_ROTATED_4: return surface_antialiasing::square_rotated_4_samples;
} }
fmt::throw_exception("Unknown surface antialiasing format 0x%x", in); return throw_exception_if_emulating("Unknown surface antialiasing format 0x%x", in);
} }
surface_color_format rsx::to_surface_color_format(u8 in) surface_color_format rsx::to_surface_color_format(u8 in)
@ -924,7 +975,7 @@ surface_color_format rsx::to_surface_color_format(u8 in)
case CELL_GCM_SURFACE_X8B8G8R8_O8B8G8R8: return surface_color_format::x8b8g8r8_o8b8g8r8; case CELL_GCM_SURFACE_X8B8G8R8_O8B8G8R8: return surface_color_format::x8b8g8r8_o8b8g8r8;
case CELL_GCM_SURFACE_A8B8G8R8: return surface_color_format::a8b8g8r8; case CELL_GCM_SURFACE_A8B8G8R8: return surface_color_format::a8b8g8r8;
} }
fmt::throw_exception("Unknown surface color format 0x%x", in); return throw_exception_if_emulating("Unknown surface color format 0x%x", in);
} }
stencil_op rsx::to_stencil_op(u16 in) stencil_op rsx::to_stencil_op(u16 in)
@ -940,7 +991,7 @@ stencil_op rsx::to_stencil_op(u16 in)
case CELL_GCM_DECR_WRAP: return stencil_op::decr_wrap; case CELL_GCM_DECR_WRAP: return stencil_op::decr_wrap;
case CELL_GCM_ZERO: return stencil_op::zero; case CELL_GCM_ZERO: return stencil_op::zero;
} }
fmt::throw_exception("Unknown stencil op 0x%x", in); return throw_exception_if_emulating("Unknown stencil op 0x%x", in);
} }
blend_equation rsx::to_blend_equation(u16 in) blend_equation rsx::to_blend_equation(u16 in)
@ -950,13 +1001,13 @@ blend_equation rsx::to_blend_equation(u16 in)
case CELL_GCM_FUNC_ADD: return blend_equation::add; case CELL_GCM_FUNC_ADD: return blend_equation::add;
case CELL_GCM_MIN: return blend_equation::min; case CELL_GCM_MIN: return blend_equation::min;
case CELL_GCM_MAX: return blend_equation::max; case CELL_GCM_MAX: return blend_equation::max;
case CELL_GCM_FUNC_SUBTRACT: return blend_equation::substract; case CELL_GCM_FUNC_SUBTRACT: return blend_equation::subtract;
case CELL_GCM_FUNC_REVERSE_SUBTRACT: return blend_equation::reverse_substract; case CELL_GCM_FUNC_REVERSE_SUBTRACT: return blend_equation::reverse_subtract;
case CELL_GCM_FUNC_REVERSE_SUBTRACT_SIGNED: return blend_equation::reverse_substract_signed; case CELL_GCM_FUNC_REVERSE_SUBTRACT_SIGNED: return blend_equation::reverse_subtract_signed;
case CELL_GCM_FUNC_ADD_SIGNED: return blend_equation::add_signed; case CELL_GCM_FUNC_ADD_SIGNED: return blend_equation::add_signed;
case CELL_GCM_FUNC_REVERSE_ADD_SIGNED: return blend_equation::reverse_add_signed; case CELL_GCM_FUNC_REVERSE_ADD_SIGNED: return blend_equation::reverse_add_signed;
} }
fmt::throw_exception("Unknown blend eq 0x%x", in); return throw_exception_if_emulating("Unknown blend eq 0x%x", in);
} }
blend_factor rsx::to_blend_factor(u16 in) blend_factor rsx::to_blend_factor(u16 in)
@ -979,7 +1030,7 @@ blend_factor rsx::to_blend_factor(u16 in)
case CELL_GCM_CONSTANT_ALPHA: return blend_factor::constant_alpha; case CELL_GCM_CONSTANT_ALPHA: return blend_factor::constant_alpha;
case CELL_GCM_ONE_MINUS_CONSTANT_ALPHA: return blend_factor::one_minus_constant_alpha; case CELL_GCM_ONE_MINUS_CONSTANT_ALPHA: return blend_factor::one_minus_constant_alpha;
} }
fmt::throw_exception("Unknown blend factor 0x%x", in); return throw_exception_if_emulating("Unknown blend factor 0x%x", in);
} }
enum enum
@ -1022,7 +1073,7 @@ logic_op rsx::to_logic_op(u16 in)
case CELL_GCM_NAND: return logic_op::logic_nand; case CELL_GCM_NAND: return logic_op::logic_nand;
case CELL_GCM_SET: return logic_op::logic_set; case CELL_GCM_SET: return logic_op::logic_set;
} }
fmt::throw_exception("Unknown logic op 0x%x", in); return throw_exception_if_emulating("Unknown logic op 0x%x", in);
} }
front_face rsx::to_front_face(u16 in) front_face rsx::to_front_face(u16 in)
@ -1033,7 +1084,7 @@ front_face rsx::to_front_face(u16 in)
case CELL_GCM_CW: return front_face::cw; case CELL_GCM_CW: return front_face::cw;
case CELL_GCM_CCW: return front_face::ccw; case CELL_GCM_CCW: return front_face::ccw;
} }
fmt::throw_exception("Unknown front face 0x%x", in); return throw_exception_if_emulating("Unknown front face 0x%x", in);
} }
enum enum
@ -1052,7 +1103,7 @@ blit_engine::transfer_origin blit_engine::to_transfer_origin(u8 in)
case CELL_GCM_TRANSFER_ORIGIN_CENTER: return blit_engine::transfer_origin::center; case CELL_GCM_TRANSFER_ORIGIN_CENTER: return blit_engine::transfer_origin::center;
case CELL_GCM_TRANSFER_ORIGIN_CORNER: return blit_engine::transfer_origin::corner; case CELL_GCM_TRANSFER_ORIGIN_CORNER: return blit_engine::transfer_origin::corner;
} }
fmt::throw_exception("Unknown transfer origin 0x%x", in); return throw_exception_if_emulating("Unknown transfer origin 0x%x", in);
} }
blit_engine::transfer_interpolator blit_engine::to_transfer_interpolator(u8 in) blit_engine::transfer_interpolator blit_engine::to_transfer_interpolator(u8 in)
@ -1062,7 +1113,7 @@ blit_engine::transfer_interpolator blit_engine::to_transfer_interpolator(u8 in)
case CELL_GCM_TRANSFER_INTERPOLATOR_ZOH: return blit_engine::transfer_interpolator::zoh; case CELL_GCM_TRANSFER_INTERPOLATOR_ZOH: return blit_engine::transfer_interpolator::zoh;
case CELL_GCM_TRANSFER_INTERPOLATOR_FOH: return blit_engine::transfer_interpolator::foh; case CELL_GCM_TRANSFER_INTERPOLATOR_FOH: return blit_engine::transfer_interpolator::foh;
} }
fmt::throw_exception("Unknown transfer interpolator 0x%x", in); return throw_exception_if_emulating("Unknown transfer interpolator 0x%x", in);
} }
enum enum
@ -1159,7 +1210,7 @@ blit_engine::context_surface blit_engine::to_context_surface(u32 in)
case CELL_GCM_CONTEXT_SURFACE2D: return blit_engine::context_surface::surface2d; case CELL_GCM_CONTEXT_SURFACE2D: return blit_engine::context_surface::surface2d;
case CELL_GCM_CONTEXT_SWIZZLE2D: return blit_engine::context_surface::swizzle2d; case CELL_GCM_CONTEXT_SWIZZLE2D: return blit_engine::context_surface::swizzle2d;
} }
fmt::throw_exception("Unknown context surface 0x%x", in); return throw_exception_if_emulating("Unknown context surface 0x%x", in);
} }
blit_engine::context_dma blit_engine::to_context_dma(u32 in) blit_engine::context_dma blit_engine::to_context_dma(u32 in)
@ -1170,7 +1221,7 @@ blit_engine::context_dma blit_engine::to_context_dma(u32 in)
case CELL_GCM_CONTEXT_DMA_REPORT_LOCATION_MAIN: return blit_engine::context_dma::report_location_main; case CELL_GCM_CONTEXT_DMA_REPORT_LOCATION_MAIN: return blit_engine::context_dma::report_location_main;
case CELL_GCM_CONTEXT_DMA_MEMORY_HOST_BUFFER: return blit_engine::context_dma::memory_host_buffer; case CELL_GCM_CONTEXT_DMA_MEMORY_HOST_BUFFER: return blit_engine::context_dma::memory_host_buffer;
} }
fmt::throw_exception("Unknown context dma 0x%x", in); return throw_exception_if_emulating("Unknown context dma 0x%x", in);
} }
enum enum
@ -1188,7 +1239,7 @@ user_clip_plane_op rsx::to_user_clip_plane_op(u8 in)
case CELL_GCM_USER_CLIP_PLANE_ENABLE_LT: return user_clip_plane_op::less_than; case CELL_GCM_USER_CLIP_PLANE_ENABLE_LT: return user_clip_plane_op::less_than;
case CELL_GCM_USER_CLIP_PLANE_ENABLE_GE: return user_clip_plane_op::greater_or_equal; case CELL_GCM_USER_CLIP_PLANE_ENABLE_GE: return user_clip_plane_op::greater_or_equal;
} }
fmt::throw_exception("Unknown user clip plane 0x%x", in); return throw_exception_if_emulating("Unknown user clip plane 0x%x", in);
} }
enum enum
@ -1204,7 +1255,7 @@ shading_mode rsx::to_shading_mode(u32 in)
case CELL_GCM_FLAT: return shading_mode::flat; case CELL_GCM_FLAT: return shading_mode::flat;
case CELL_GCM_SMOOTH: return shading_mode::smooth; case CELL_GCM_SMOOTH: return shading_mode::smooth;
} }
fmt::throw_exception("Unknown shading mode 0x%x", in); return throw_exception_if_emulating("Unknown shading mode 0x%x", in);
} }
enum enum
@ -1222,5 +1273,5 @@ polygon_mode rsx::to_polygon_mode(u32 in)
case CELL_GCM_POLYGON_MODE_LINE: return polygon_mode::line; case CELL_GCM_POLYGON_MODE_LINE: return polygon_mode::line;
case CELL_GCM_POLYGON_MODE_FILL: return polygon_mode::fill; case CELL_GCM_POLYGON_MODE_FILL: return polygon_mode::fill;
} }
fmt::throw_exception("Unknown polygon mode 0x%x", in); return throw_exception_if_emulating("Unknown polygon mode 0x%x", in);
} }

View File

@ -13,6 +13,7 @@ namespace rsx
s32k, ///< signed 16bits int s32k, ///< signed 16bits int
cmp, ///< compressed aka X11G11Z10 and always 1. W. cmp, ///< compressed aka X11G11Z10 and always 1. W.
ub256, ///< unsigned byte interpreted as between 0 and 255. ub256, ///< unsigned byte interpreted as between 0 and 255.
invalid,
}; };
vertex_base_type to_vertex_base_type(u8 in); vertex_base_type to_vertex_base_type(u8 in);
@ -21,6 +22,7 @@ namespace rsx
{ {
u32 = 0, // CELL_GCM_DRAW_INDEX_ARRAY_TYPE_32 u32 = 0, // CELL_GCM_DRAW_INDEX_ARRAY_TYPE_32
u16 = 1, // CELL_GCM_DRAW_INDEX_ARRAY_TYPE_16 u16 = 1, // CELL_GCM_DRAW_INDEX_ARRAY_TYPE_16
invalid,
}; };
enum class primitive_type : u8 enum class primitive_type : u8
@ -48,6 +50,7 @@ namespace rsx
surfaces_a_b, surfaces_a_b,
surfaces_a_b_c, surfaces_a_b_c,
surfaces_a_b_c_d, surfaces_a_b_c_d,
invalid,
}; };
surface_target to_surface_target(u8 in); surface_target to_surface_target(u8 in);
@ -56,6 +59,7 @@ namespace rsx
{ {
z16, // typeless 16 bits depth z16, // typeless 16 bits depth
z24s8, // typeless 24 bits depth + 8 bits stencil z24s8, // typeless 24 bits depth + 8 bits stencil
invalid,
}; };
enum class surface_depth_format2 : u8 enum class surface_depth_format2 : u8
@ -64,6 +68,7 @@ namespace rsx
z24s8_uint, // unsigned 24 bits depth + 8 bits stencil z24s8_uint, // unsigned 24 bits depth + 8 bits stencil
z16_float, // floating point 16 bits depth z16_float, // floating point 16 bits depth
z24s8_float, // floating point 24 bits depth + 8 bits stencil z24s8_float, // floating point 24 bits depth + 8 bits stencil
invalid,
}; };
surface_depth_format to_surface_depth_format(u8 in); surface_depth_format to_surface_depth_format(u8 in);
@ -94,6 +99,7 @@ namespace rsx
diagonal_centered_2_samples, diagonal_centered_2_samples,
square_centered_4_samples, square_centered_4_samples,
square_rotated_4_samples, square_rotated_4_samples,
invalid,
}; };
surface_antialiasing to_surface_antialiasing(u8 in); surface_antialiasing to_surface_antialiasing(u8 in);
@ -114,6 +120,7 @@ namespace rsx
x8b8g8r8_z8b8g8r8, x8b8g8r8_z8b8g8r8,
x8b8g8r8_o8b8g8r8, x8b8g8r8_o8b8g8r8,
a8b8g8r8, a8b8g8r8,
invalid,
}; };
surface_color_format to_surface_color_format(u8 in); surface_color_format to_surface_color_format(u8 in);
@ -121,7 +128,8 @@ namespace rsx
enum class window_origin : u8 enum class window_origin : u8
{ {
top, top,
bottom bottom,
invalid,
}; };
window_origin to_window_origin(u8 in); window_origin to_window_origin(u8 in);
@ -129,7 +137,8 @@ namespace rsx
enum class window_pixel_center : u8 enum class window_pixel_center : u8
{ {
half, half,
integer integer,
invalid,
}; };
window_pixel_center to_window_pixel_center(u8 in); window_pixel_center to_window_pixel_center(u8 in);
@ -143,7 +152,8 @@ namespace rsx
greater, greater,
not_equal, not_equal,
greater_or_equal, greater_or_equal,
always always,
invalid,
}; };
comparison_function to_comparison_function(u16 in); comparison_function to_comparison_function(u16 in);
@ -155,7 +165,8 @@ namespace rsx
exponential2, exponential2,
exponential_abs, exponential_abs,
exponential2_abs, exponential2_abs,
linear_abs linear_abs,
invalid,
}; };
fog_mode to_fog_mode(u32 in); fog_mode to_fog_mode(u32 in);
@ -169,6 +180,7 @@ namespace rsx
texture_dimension_2d = 1, texture_dimension_2d = 1,
texture_dimension_cubemap = 2, texture_dimension_cubemap = 2,
texture_dimension_3d = 3, texture_dimension_3d = 3,
invalid,
}; };
enum class texture_dimension : u8 enum class texture_dimension : u8
@ -176,6 +188,7 @@ namespace rsx
dimension1d, dimension1d,
dimension2d, dimension2d,
dimension3d, dimension3d,
invalid,
}; };
texture_dimension to_texture_dimension(u8 in); texture_dimension to_texture_dimension(u8 in);
@ -190,6 +203,7 @@ namespace rsx
mirror_once_clamp_to_edge, mirror_once_clamp_to_edge,
mirror_once_border, mirror_once_border,
mirror_once_clamp, mirror_once_clamp,
invalid,
}; };
texture_wrap_mode to_texture_wrap_mode(u8 in); texture_wrap_mode to_texture_wrap_mode(u8 in);
@ -204,6 +218,7 @@ namespace rsx
x10, x10,
x12, x12,
x16, x16,
invalid,
}; };
texture_max_anisotropy to_texture_max_anisotropy(u8 in); texture_max_anisotropy to_texture_max_anisotropy(u8 in);
@ -217,6 +232,7 @@ namespace rsx
nearest_linear, ///< no filtering, linear mix between closest mipmap levels nearest_linear, ///< no filtering, linear mix between closest mipmap levels
linear_linear, ///< linear filtering, linear mix between closest mipmap levels linear_linear, ///< linear filtering, linear mix between closest mipmap levels
convolution_min, ///< Unknown mode but looks close to linear_linear convolution_min, ///< Unknown mode but looks close to linear_linear
invalid,
}; };
texture_minify_filter to_texture_minify_filter(u8 in); texture_minify_filter to_texture_minify_filter(u8 in);
@ -226,6 +242,7 @@ namespace rsx
nearest, ///< no filtering nearest, ///< no filtering
linear, ///< linear filtering linear, ///< linear filtering
convolution_mag, ///< Unknown mode but looks close to linear convolution_mag, ///< Unknown mode but looks close to linear
invalid,
}; };
texture_magnify_filter to_texture_magnify_filter(u8 in); texture_magnify_filter to_texture_magnify_filter(u8 in);
@ -240,6 +257,7 @@ namespace rsx
invert, invert,
incr_wrap, incr_wrap,
decr_wrap, decr_wrap,
invalid,
}; };
stencil_op to_stencil_op(u16 in); stencil_op to_stencil_op(u16 in);
@ -249,11 +267,12 @@ namespace rsx
add, add,
min, min,
max, max,
substract, subtract,
reverse_substract, reverse_subtract,
reverse_substract_signed, reverse_subtract_signed,
add_signed, add_signed,
reverse_add_signed, reverse_add_signed,
invalid,
}; };
blend_equation to_blend_equation(u16 in); blend_equation to_blend_equation(u16 in);
@ -275,6 +294,7 @@ namespace rsx
one_minus_constant_color, one_minus_constant_color,
constant_alpha, constant_alpha,
one_minus_constant_alpha, one_minus_constant_alpha,
invalid,
}; };
blend_factor to_blend_factor(u16 in); blend_factor to_blend_factor(u16 in);
@ -297,6 +317,7 @@ namespace rsx
logic_or_inverted, logic_or_inverted,
logic_nand, logic_nand,
logic_set, logic_set,
invalid,
}; };
logic_op to_logic_op(u16 in); logic_op to_logic_op(u16 in);
@ -304,7 +325,8 @@ namespace rsx
enum class front_face : u8 enum class front_face : u8
{ {
cw, /// clockwise cw, /// clockwise
ccw /// counter clockwise ccw, /// counter clockwise
invalid,
}; };
front_face to_front_face(u16 in); front_face to_front_face(u16 in);
@ -314,6 +336,7 @@ namespace rsx
front = 0x0404, // CELL_GCM_FRONT front = 0x0404, // CELL_GCM_FRONT
back = 0x0405, // CELL_GCM_BACK back = 0x0405, // CELL_GCM_BACK
front_and_back = 0x0408, // CELL_GCM_FRONT_AND_BACK front_and_back = 0x0408, // CELL_GCM_FRONT_AND_BACK
invalid,
}; };
enum class user_clip_plane_op : u8 enum class user_clip_plane_op : u8
@ -321,6 +344,7 @@ namespace rsx
disable, disable,
less_than, less_than,
greater_or_equal, greater_or_equal,
invalid,
}; };
user_clip_plane_op to_user_clip_plane_op(u8 in); user_clip_plane_op to_user_clip_plane_op(u8 in);
@ -329,6 +353,7 @@ namespace rsx
{ {
smooth, smooth,
flat, flat,
invalid,
}; };
shading_mode to_shading_mode(u32 in); shading_mode to_shading_mode(u32 in);
@ -338,6 +363,7 @@ namespace rsx
point, point,
line, line,
fill, fill,
invalid,
}; };
polygon_mode to_polygon_mode(u32 in); polygon_mode to_polygon_mode(u32 in);
@ -348,6 +374,7 @@ namespace rsx
{ {
center, center,
corner, corner,
invalid,
}; };
transfer_origin to_transfer_origin(u8 in); transfer_origin to_transfer_origin(u8 in);
@ -356,6 +383,7 @@ namespace rsx
{ {
zoh, zoh,
foh, foh,
invalid,
}; };
transfer_interpolator to_transfer_interpolator(u8 in); transfer_interpolator to_transfer_interpolator(u8 in);
@ -398,7 +426,7 @@ namespace rsx
r5g6b5, r5g6b5,
a8r8g8b8, a8r8g8b8,
y32, y32,
invalid invalid,
}; };
transfer_destination_format to_transfer_destination_format(u8 in); transfer_destination_format to_transfer_destination_format(u8 in);
@ -407,6 +435,7 @@ namespace rsx
{ {
surface2d, surface2d,
swizzle2d, swizzle2d,
invalid,
}; };
context_surface to_context_surface(u32 in); context_surface to_context_surface(u32 in);
@ -416,6 +445,7 @@ namespace rsx
to_memory_get_report, to_memory_get_report,
report_location_main, report_location_main,
memory_host_buffer, memory_host_buffer,
invalid,
}; };
context_dma to_context_dma(u32 in); context_dma to_context_dma(u32 in);

View File

@ -32,7 +32,7 @@ pup_object::pup_object(fs::file&& file) : m_file(std::move(file))
return; return;
} }
// Check if file size is the expected size, use substraction to avoid overflows // Check if file size is the expected size, use subtraction to avoid overflows
if (file_size < m_header.header_length || file_size - m_header.header_length < m_header.data_length) if (file_size < m_header.header_length || file_size - m_header.header_length < m_header.data_length)
{ {
m_formatted_error = fmt::format("Firmware size mismatch, expected: 0x%x + 0x%x, actual: 0x%x", m_header.header_length, m_header.data_length, file_size); m_formatted_error = fmt::format("Firmware size mismatch, expected: 0x%x + 0x%x, actual: 0x%x", m_header.header_length, m_header.data_length, file_size);
@ -89,7 +89,7 @@ pup_error pup_object::validate_hashes()
for (const PUPFileEntry& file : m_file_tbl) for (const PUPFileEntry& file : m_file_tbl)
{ {
// Sanity check for offset and length, use substraction to avoid overflows // Sanity check for offset and length, use subtraction to avoid overflows
if (size < file.data_offset || size - file.data_offset < file.data_length) if (size < file.data_offset || size - file.data_offset < file.data_length)
{ {
m_formatted_error = fmt::format("File database entry is invalid. (offset=0x%x, length=0x%x, PUP.size=0x%x)", file.data_offset, file.data_length, size); m_formatted_error = fmt::format("File database entry is invalid. (offset=0x%x, length=0x%x, PUP.size=0x%x)", file.data_offset, file.data_length, size);