On 1/25/23 4:57 PM, Ammar Faizi wrote:
On Wed, Jan 25, 2023 at 12:39:26AM -0800, H. Peter Anvin wrote:
/* Set IP and CX to match so that SYSRET can happen. */ ctx->uc_mcontext.gregs[REG_RIP] = rip; ctx->uc_mcontext.gregs[REG_RCX] = rip;
It would be interesting to have the syscall handler try both with and without this (so it would end up doing both IRET and SYSCALL on legacy.) Perhaps SIGUSR1 versus SIGUSR2...
Just to clarify this more so I am sure I understand it correctly.
Did you mean to have the same signal handler without modifiying 'REG_RCX' but still change 'REG_RIP'?
IOW, we want to only *remove*:
ctx->uc_mcontext.gregs[REG_RCX] = rip;
and *keep*:
ctx->uc_mcontext.gregs[REG_RIP] = rip;
for the SIGUSR2 handler. Thus, inside the entry64 we will jump to the iret path because %rcx != %r11 upon rt_sigreturn()?
s/%rcx != %r11/%rcx != %rip/