Quoting Janosch Frank (2022-07-22 10:30:46) > On 7/22/22 09:20, Nico Boehr wrote: > > Under PV, SIGP ecall requires some special handling by the hypervisor > > when the receiving CPU is in enabled wait. Hence, we should have > > coverage for the various SIGP call orders when the receiving CPU is in > > enabled wait. > > When the SIGP interpretation facility is in use a SIGP external call to > a waiting CPU will result in an exit of the calling cpu. For non-pv > guests it's a code 56 (partial execution) exit otherwise its a code 108 > (secure instruction notification) exit. Those exits are handled > differently from a normal SIGP instruction intercept that happens > without interpretation and hence need to be tested. Changed. > > > > The ecall test currently fails under PV due to a KVM bug under > > investigation. > > That shouldn't be true anymore Yeah, it's not yet in mainline, but is soon gonna be. I will remove this. > > > > Signed-off-by: Nico Boehr <nrb@xxxxxxxxxxxxx> > > --- > > s390x/smp.c | 75 +++++++++++++++++++++++++++++++++++++++++++++++++++++ > > 1 file changed, 75 insertions(+) > > > > diff --git a/s390x/smp.c b/s390x/smp.c > > index 683b0e618a48..eed7aa3564de 100644 > > --- a/s390x/smp.c > > +++ b/s390x/smp.c > > @@ -347,6 +347,80 @@ static void test_calls(void) > > } > > } > > > > +static void call_in_wait_ext_int_fixup(struct stack_frame_int *stack) > > +{ > > + /* leave wait after returning */ > > Clear wait bit so we don't immediately wait again after the fixup Changed. > > > + lowcore.ext_old_psw.mask &= ~PSW_MASK_WAIT; > > + > > + stack->crs[0] &= ~current_sigp_call_case->cr0_bit; > > You need a mask but have a bit, no? > > ~BIT(current_sigp_call_case->cr0_bit) Oopsie, thanks, good find. This reminds me the ctl_clear_bit() I added in call_in_wait_received() is completely useless, since I handle it here. So, I will remove it there as well. [...] > > +static void test_calls_in_wait(void) > > +{ > > + int i; > > + struct psw psw; > > + > > + report_prefix_push("psw wait"); > > + for (i = 0; i < ARRAY_SIZE(cases_sigp_call); i++) { > > + current_sigp_call_case = &cases_sigp_call[i]; > > + > > + report_prefix_push(current_sigp_call_case->name); > > + if (!current_sigp_call_case->supports_pv && uv_os_is_guest()) { > > + report_skip("Not supported under PV"); > > + report_prefix_pop(); > > + continue; > > + } > > + > /* Let the secondary CPU setup the external mask and the external > interrupt cleanup function */ Changed.