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:
@@ -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;
|
||||||
|
|||||||
@@ -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,
|
||||||
|
|||||||
Reference in New Issue
Block a user