rsx fifo: Fix call cmd offset mask

highest 3 bits are masked according to tests, also filter certainly invalid jumps with offset higher than max
This commit is contained in:
eladash 2018-12-14 15:37:05 +02:00 committed by kd-11
parent c2aa10cccd
commit 098d634328
2 changed files with 5 additions and 5 deletions

View file

@ -465,7 +465,7 @@ namespace rsx
// Check for flow control // Check for flow control
if ((cmd & RSX_METHOD_OLD_JUMP_CMD_MASK) == RSX_METHOD_OLD_JUMP_CMD) if ((cmd & RSX_METHOD_OLD_JUMP_CMD_MASK) == RSX_METHOD_OLD_JUMP_CMD)
{ {
const u32 offs = cmd & 0x1ffffffc; const u32 offs = cmd & RSX_METHOD_OLD_JUMP_OFFSET_MASK;
if (offs == fifo_ctrl->get_pos()) if (offs == fifo_ctrl->get_pos())
{ {
//Jump to self. Often preceded by NOP //Jump to self. Often preceded by NOP
@ -484,7 +484,7 @@ namespace rsx
} }
if ((cmd & RSX_METHOD_NEW_JUMP_CMD_MASK) == RSX_METHOD_NEW_JUMP_CMD) if ((cmd & RSX_METHOD_NEW_JUMP_CMD_MASK) == RSX_METHOD_NEW_JUMP_CMD)
{ {
const u32 offs = cmd & 0xfffffffc; const u32 offs = cmd & RSX_METHOD_NEW_JUMP_OFFSET_MASK;
if (offs == fifo_ctrl->get_pos()) if (offs == fifo_ctrl->get_pos())
{ {
//Jump to self. Often preceded by NOP //Jump to self. Often preceded by NOP
@ -511,7 +511,7 @@ namespace rsx
return; return;
} }
const u32 offs = cmd & 0xfffffffc; const u32 offs = cmd & RSX_METHOD_CALL_OFFSET_MASK;
m_return_addr = fifo_ctrl->get_pos() + 4; m_return_addr = fifo_ctrl->get_pos() + 4;
fifo_ctrl->set_get(offs); fifo_ctrl->set_get(offs);
return; return;

View file

@ -1047,13 +1047,13 @@ enum Method
RSX_METHOD_NON_INCREMENT_COUNT_SHIFT = 18, RSX_METHOD_NON_INCREMENT_COUNT_SHIFT = 18,
RSX_METHOD_NON_INCREMENT_METHOD_MASK = 0x0000fffc, RSX_METHOD_NON_INCREMENT_METHOD_MASK = 0x0000fffc,
RSX_METHOD_NEW_JUMP_CMD_MASK = 0x00000003, RSX_METHOD_NEW_JUMP_CMD_MASK = 0xe0000003,
RSX_METHOD_NEW_JUMP_CMD = 0x00000001, RSX_METHOD_NEW_JUMP_CMD = 0x00000001,
RSX_METHOD_NEW_JUMP_OFFSET_MASK = 0xfffffffc, RSX_METHOD_NEW_JUMP_OFFSET_MASK = 0xfffffffc,
RSX_METHOD_CALL_CMD_MASK = 0x00000003, RSX_METHOD_CALL_CMD_MASK = 0x00000003,
RSX_METHOD_CALL_CMD = 0x00000002, RSX_METHOD_CALL_CMD = 0x00000002,
RSX_METHOD_CALL_OFFSET_MASK = 0xfffffffc, RSX_METHOD_CALL_OFFSET_MASK = 0x1ffffffc,
RSX_METHOD_NON_METHOD_CMD_MASK = 0xa0030003, RSX_METHOD_NON_METHOD_CMD_MASK = 0xa0030003,
RSX_METHOD_RETURN_CMD = 0x00020000, RSX_METHOD_RETURN_CMD = 0x00020000,