Messages in this thread |  | | Date | Sun, 22 Jan 2023 15:54:56 +0700 | From | Ammar Faizi <> | Subject | Re: RE: the x86 sysret_rip test fails on the Intel FRED architecture |
| |
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
|  |