Re: RE: the x86 sysret_rip test fails on the Intel FRED architecture

From: Ammar Faizi
Date: Sun Jan 22 2023 - 03:55:08 EST


On 1/22/23 3:22 PM, Li, Xin3 wrote:
The problem is where/how to set %r11 = %rflags in the test code.

The check happens in the USER1 signal handler, and we could set %r11
just before calling raise(SIGUSR1). However, the C library implementation
of raise() modifies %r11, thus we can't preserve %r11 until the SYSCALL
instruction. And the test still fails.

From "man 3 raise":

"""
The raise() function sends a signal to the calling process or thread.
In a single-threaded program it is equivalent to

kill(getpid(), sig);
"""

Implementing kill syscall with %r11 modified before entering the kernel
may look like this?

static void __raise(int sig)
{
__asm__ volatile (
"pushf\n\t"
"popq %%r11\n\t"
"syscall"
:
: "D"(getpid()), /* %rdi */
"S"(sig), /* %rsi */
"a"(__NR_kill) /* %rax */
: "rcx", "r11", "memory"
);
}

--
Ammar Faizi