(root)/
gcc-13.2.0/
gcc/
testsuite/
gcc.dg/
analyzer/
sock-1.c
       1  typedef unsigned int __u32;
       2  __extension__ typedef __signed__ long long __s64;
       3  __extension__ typedef unsigned long long __u64;
       4  typedef __u32 u32;
       5  typedef __s64 s64;
       6  typedef __u64 u64;
       7  typedef long long __kernel_time64_t;
       8  typedef _Bool bool;
       9  typedef __s64 time64_t;
      10  struct __kernel_timespec {
      11   __kernel_time64_t tv_sec;
      12   long long tv_nsec;
      13  };
      14  struct timespec64 {
      15   time64_t tv_sec;
      16   long tv_nsec;
      17  };
      18  
      19  extern struct timespec64 ns_to_timespec64(const s64 nsec);
      20  int put_timespec64(const struct timespec64 *ts,
      21    struct __kernel_timespec *uts);
      22  
      23  /* [...snip...] */
      24  
      25  extern int put_old_timespec32(const struct timespec64 *, void *);
      26  
      27  /* [...snip...] */
      28  
      29  /* [...snip...] */
      30  
      31  typedef s64 ktime_t;
      32  
      33  /* [...snip...] */
      34  
      35  extern void ktime_get_real_ts64(struct timespec64 *tv);
      36  
      37  /* [...snip...] */
      38  
      39  enum tk_offsets {
      40   TK_OFFS_REAL,
      41   TK_OFFS_BOOT,
      42   TK_OFFS_TAI,
      43   TK_OFFS_MAX,
      44  };
      45  
      46  extern ktime_t ktime_get(void);
      47  extern ktime_t ktime_get_with_offset(enum tk_offsets offs);
      48  extern ktime_t ktime_get_coarse_with_offset(enum tk_offsets offs);
      49  extern ktime_t ktime_mono_to_any(ktime_t tmono, enum tk_offsets offs);
      50  extern ktime_t ktime_get_raw(void);
      51  extern u32 ktime_get_resolution_ns(void);
      52  
      53  
      54  static ktime_t ktime_get_real(void)
      55  {
      56   return ktime_get_with_offset(TK_OFFS_REAL);
      57  }
      58  
      59  /* [...snip...] */
      60  
      61  struct socket {
      62   /* [...snip...] */
      63   struct sock *sk;
      64   /* [...snip...] */
      65  };
      66  
      67  /* [...snip...] */
      68  
      69  struct sock {
      70   /* [...snip...] */
      71   ktime_t sk_stamp;
      72   /* [...snip...] */
      73  };
      74  
      75  /* [...snip...] */
      76  
      77  static ktime_t sock_read_timestamp(struct sock *sk)
      78  {
      79    return *(const volatile typeof(sk->sk_stamp) *)&(sk->sk_stamp);
      80  }
      81  
      82  static void sock_write_timestamp(struct sock *sk, ktime_t kt)
      83  {
      84    *(volatile typeof(sk->sk_stamp) *)&(sk->sk_stamp) = kt;
      85  }
      86  
      87  /* [...snip...] */
      88  
      89  int sock_gettstamp(struct socket *sock, void *userstamp,
      90       bool timeval, bool time32)
      91  {
      92   struct sock *sk = sock->sk;
      93   struct timespec64 ts;
      94  
      95   /* [...snip...] */
      96   ts = ns_to_timespec64((sock_read_timestamp(sk)));
      97   if (ts.tv_sec == -1)
      98    return -2;
      99   if (ts.tv_sec == 0) {
     100    ktime_t kt = ktime_get_real();
     101    sock_write_timestamp(sk, kt);
     102    ts = ns_to_timespec64((kt));
     103   }
     104  
     105   if (timeval)
     106    ts.tv_nsec /= 1000;
     107  
     108  
     109   if (time32)
     110    return put_old_timespec32(&ts, userstamp);
     111   return put_timespec64(&ts, userstamp);
     112  }