On 5/18/20 7:53 PM, Richard Henderson wrote:
> + if (master_header.magic != RISU_MAGIC ||
> + master_header.risu_op != op ||
> + master_header.size != extra_size) {
> + res = RES_MISMATCH_HEAD;
> + goto fail_header;
> }
Hmm. This isn't ideal.
Consider e.g. an insn being tested that should pass, so master steps past the
insn to the UDF and sends OP_COMPARE. But there's a bug in the emulator being
tested so the apprentice gets SIGILL on the insn and so op == OP_SIGILL.
So risu_op != op, but we only report the header difference.
Perhaps that's good enough to understand the this particular problem, without
the clutter of printing the rest of the reginfo frame -- at least if
report_mismatch_header is improved to print risu_op names instead of numbers.
Consider if master and apprentice are run with different --test-sve=<vq>
values. That will produce a mismatch in size.
Which could be a serious problem, if master_header.size > sizeof(master_ri) --
we can't even receive the data. In that case, what I'm doing here printing the
size mismatch is all that's possible.
But suppose master_header.size <= sizeof(master_ri), so we can receive the
data. So long as master_header.size == reginfo_size(&master_ri), then at least
the data is self-consistent, and we *can* print out the difference in
report_mismatch_reg(). Which in this case is going to be the difference in the
two ri->sve_vl values. That difference is likely to be easiest to understand
for the end user.
I should probably split out this receive logic from
recv_and_compare_register_info so that it can be reused by dump.
r~