86131c71b1
Hitting an uretprobe in a s390x TCG guest causes a SIGSEGV. What happens is: * uretprobe maps a userspace page containing an invalid instruction. * uretprobe replaces the target function's return address with the address of that page. * When tb_gen_code() is called on that page, tb->size ends up being 0 (because the page starts with the invalid instruction), which causes virt_page2 to point to the previous page. * The previous page is not mapped, so this causes a spurious translation exception. tb->size must never be 0: even if there is an illegal instruction, the instruction bytes that have been looked at must count towards tb->size. So adjust s390x's translate_one() to act this way for both illegal instructions and instructions that are known to generate exceptions. Signed-off-by: Ilya Leoshkevich <iii@linux.ibm.com> Reviewed-by: David Hildenbrand <david@redhat.com> Message-Id: <20210416154939.32404-2-iii@linux.ibm.com> Signed-off-by: Cornelia Huck <cohuck@redhat.com> |
||
---|---|---|
.. | ||
arch_dump.c | ||
cc_helper.c | ||
cpu_features_def.h | ||
cpu_features_def.h.inc | ||
cpu_features.c | ||
cpu_features.h | ||
cpu_models.c | ||
cpu_models.h | ||
cpu-param.h | ||
cpu-qom.h | ||
cpu.c | ||
cpu.h | ||
crypto_helper.c | ||
diag.c | ||
excp_helper.c | ||
fpu_helper.c | ||
gdbstub.c | ||
gen-features.c | ||
helper.c | ||
helper.h | ||
insn-data.def | ||
insn-format.def | ||
int_helper.c | ||
internal.h | ||
interrupt.c | ||
ioinst.c | ||
kvm_s390x.h | ||
kvm-stub.c | ||
kvm.c | ||
machine.c | ||
mem_helper.c | ||
meson.build | ||
misc_helper.c | ||
mmu_helper.c | ||
s390-tod.h | ||
sigp.c | ||
tcg_s390x.h | ||
tcg-stub.c | ||
trace-events | ||
trace.h | ||
translate_vx.c.inc | ||
translate.c | ||
vec_fpu_helper.c | ||
vec_helper.c | ||
vec_int_helper.c | ||
vec_string_helper.c | ||
vec.h |