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
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())
{
//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)
{
const u32 offs = cmd & 0xfffffffc;
const u32 offs = cmd & RSX_METHOD_NEW_JUMP_OFFSET_MASK;
if (offs == fifo_ctrl->get_pos())
{
//Jump to self. Often preceded by NOP
@ -511,7 +511,7 @@ namespace rsx
return;
}
const u32 offs = cmd & 0xfffffffc;
const u32 offs = cmd & RSX_METHOD_CALL_OFFSET_MASK;
m_return_addr = fifo_ctrl->get_pos() + 4;
fifo_ctrl->set_get(offs);
return;

View file

@ -1047,13 +1047,13 @@ enum Method
RSX_METHOD_NON_INCREMENT_COUNT_SHIFT = 18,
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_OFFSET_MASK = 0xfffffffc,
RSX_METHOD_CALL_CMD_MASK = 0x00000003,
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_RETURN_CMD = 0x00020000,