The patch adding check_ist_exit() neglected to consider reset_stack_and_jump() leaving C and entering one of the Xen exit paths. The value in %r12 is stale, and depending on compiler decisions may not be 0.
This shows up in Gitlab CI for the Clang build: https://gitlab.com/xen-project/people/andyhhp/xen/-/jobs/5112783827 and in OSSTest for GCC 8: http://logs.test-lab.xenproject.org/osstest/logs/183045/test-amd64-amd64-xl-qemuu-debianhvm-amd64/serial-pinot0.log The justification for ensuring ist_exit is accurate in the exit paths still stands, so zero %r12 in reset_stack_and_jump() to indicate a non-IST exit. Signed-off-by: Andrew Cooper <[email protected]> --- CC: Jan Beulich <[email protected]> CC: Roger Pau Monné <[email protected]> CC: Wei Liu <[email protected]> --- xen/arch/x86/include/asm/current.h | 1 + 1 file changed, 1 insertion(+) diff --git a/xen/arch/x86/include/asm/current.h b/xen/arch/x86/include/asm/current.h index da5e152a10cc..2ce43e275784 100644 --- a/xen/arch/x86/include/asm/current.h +++ b/xen/arch/x86/include/asm/current.h @@ -178,6 +178,7 @@ unsigned long get_stack_dump_bottom (unsigned long sp); SHADOW_STACK_WORK \ "mov %[stk], %%rsp;" \ CHECK_FOR_LIVEPATCH_WORK \ + "xor %%r12d, %%r12d;" /* non-IST exit */ \ instr "[fun]" \ : [val] "=&r" (tmp), \ [ssp] "=&r" (tmp) \ base-commit: ea36ac0de27c2a7c847a2a52c3e0f97a45864d81 -- 2.30.2
