Hello,

Sergey Bugaev, le dim. 05 mars 2023 23:12:42 +0300, a ecrit:
> On Wed, Mar 1, 2023 at 9:44 AM Luca Dariz <l...@orpolo.org> wrote:
> > Il 28/02/23 15:14, Sergey Bugaev ha scritto:
> > > - nothing else is clobbered, in particular not rflags (or is the
> > > "reserved" half of rflags clobbered?) and not the registers that
> > > contain args
> >
> > if we follow the usual calling conventions, the registers containing
> > args are clobbered. In fact, in the code I set them to 0 before sysret,
> > to avoid the risk of them containing sensitive information from the
> > syscall execution.
> 
> Hmm, but if I do thread_get_state () while the thread is blocked
> inside a syscall, I will see the original (pre-syscall) values of the
> registers, right? This is important for inspecting the RPC being done,
> see SYSCALL_EXAMINE and MSG_EXAMINE in glibc.

Indeed, we would want to see the values.

> It would be easier if the registers were preserved after the syscall
> too, but if that's not the case we should be able to work around that
> in userspace. Specifically, trampoline.c wants to modify the (on-stack
> for i386) values of 'option' and 'timeout' of a mach_msg call that
> another thread is making, so that once INTR_MSG_TRAP returns,
> _hurd_intr_rpc_mach_msg () will see the modified values. We could
> maybe do the same on x86_64 by just modifying the corresponding
> registers, but then we need to differentiate the registers having been
> modified and now holding the new value, and having been just clobbered
> by the real syscall.

Indeed, it would be simpler for userland to just preserve the values.

I.e. save them and restore them into i386_saved_state, like the
callee-saved registers.

Samuel

Reply via email to