Reduced further:

--8<------
struct hurd_sigstate;

typedef struct
{
  void *tcb;
  union dtv *dtv;
  unsigned int self_do_no_use;
  int __glibc_padding1;
  int multiple_threads;
  int gscope_flag;
  unsigned long sysinfo;
  unsigned long stack_guard;
  unsigned long pointer_guard;
  long __glibc_padding2[2];
  int private_futex;
  int __glibc_padding3;

  void *__private_tm[4];

  void *__private_ss;

  unsigned long long int ssp_base;



  unsigned int reply_port;
  struct hurd_sigstate *_hurd_sigstate;


  struct rtld_catch *rtld_catch;
} tcbhead_t;

void
__sigreturn2 (struct hurd_sigstate *ss, unsigned long *usp,
              unsigned int sc_reply_port)
{
  (* (unsigned int __seg_fs *) __builtin_offsetof (tcbhead_t,
reply_port) = sc_reply_port);

#ifdef ADD_NOP
  asm ("nop");
#endif


  asm volatile ("movq %0, %%rsp\n"
                "retq $128" :
                : "rm" (usp));

  __builtin_unreachable ();
}
-------->8---

Reproducible on x86_64-linux-gnu gcc just as well:

$ gcc anew.c -c -O2
$ objdump -d anew.o
anew.o:     file format elf64-x86-64
Disassembly of section .text:
0000000000000000 <__sigreturn2>:
   0: 48 89 f4              mov    %rsi,%rsp
   3: c2 80 00              ret    $0x80

$ gcc anew.c -c -O2 -D ADD_NOP
$ objdump -d anew.o
anew.o:     file format elf64-x86-64
Disassembly of section .text:
0000000000000000 <__sigreturn2>:
   0: 64 89 14 25 80 00 00 mov    %edx,%fs:0x80
   7: 00
   8: 90                    nop
   9: 48 89 f4              mov    %rsi,%rsp
   c: c2 80 00              ret    $0x80

Sergey

Reply via email to