Use patches for existing toolchain files (XCC)
[akaros.git] / tools / compilers / gcc-glibc / glibc-2.19-existing.patch
1 diff -ruB --unidirectional-new-file ../glibc-2.19/abi-tags ../glibc-2.19-akaros/abi-tags
2 --- glibc-2.19/abi-tags 2014-02-07 04:04:38.000000000 -0500
3 +++ glibc-2.19-akaros/abi-tags  2015-12-17 14:58:45.065386401 -0500
4 @@ -28,5 +28,7 @@
5  
6  .*-.*-syllable.*       5       2.0.0   # just an arbitrary value
7  
8 +.*-.*-akaros.*         6       1.0.0   # just an arbitrary value
9 +
10  # There is no catch-all default here because every supported OS that uses
11  # ELF must have its own unique ABI tag.
12 diff -ruB --unidirectional-new-file ../glibc-2.19/configure ../glibc-2.19-akaros/configure
13 --- glibc-2.19/configure        2014-02-07 04:04:38.000000000 -0500
14 +++ glibc-2.19-akaros/configure 2015-12-17 14:58:45.065386401 -0500
15 @@ -4121,6 +4121,16 @@
16    tail="$2"
17  done
18  
19 +# For akaros, we don't have a base OS, which messes things up. Change this for
20 +# the purpose of sysdeps detection.
21 +test "x$base_os" != x || case "$os" in
22 +akaros*)
23 +  base=/akaros
24 +  vendor=
25 +  ostry=
26 +  ;;
27 +esac
28 +
29  # For sparc/sparc32, try sparc/sparc32 and then sparc.
30  mach=
31  tail=$machine${submachine:+/$submachine}
32 diff -ruB --unidirectional-new-file ../glibc-2.19/configure.ac ../glibc-2.19-akaros/configure.ac
33 --- glibc-2.19/configure.ac     2014-02-07 04:04:38.000000000 -0500
34 +++ glibc-2.19-akaros/configure.ac      2015-12-17 14:58:45.065386401 -0500
35 @@ -722,6 +722,16 @@
36    tail="$2"
37  done
38  
39 +# For akaros, we don't have a base OS, which messes things up. Change this for
40 +# the purpose of sysdeps detection.
41 +test "x$base_os" != x || case "$os" in
42 +akaros*)
43 +  base=/akaros
44 +  vendor=
45 +  ostry=
46 +  ;;
47 +esac
48 +
49  # For sparc/sparc32, try sparc/sparc32 and then sparc.
50  mach=
51  tail=$machine${submachine:+/$submachine}
52 diff -ruB --unidirectional-new-file ../glibc-2.19/elf/Makefile ../glibc-2.19-akaros/elf/Makefile
53 --- glibc-2.19/elf/Makefile     2014-02-07 04:04:38.000000000 -0500
54 +++ glibc-2.19-akaros/elf/Makefile      2015-12-17 14:58:45.065386401 -0500
55 @@ -24,7 +24,7 @@
56  headers                = elf.h bits/elfclass.h link.h bits/link.h
57  routines       = $(dl-routines) dl-support dl-iteratephdr \
58                   dl-addr enbl-secure dl-profstub \
59 -                 dl-origin dl-libc dl-sym dl-tsd dl-sysdep
60 +                 dl-origin dl-libc dl-sym dl-tsd #dl-sysdep
61  
62  # The core dynamic linking functions are in libc for the static and
63  # profiled libraries.
64 diff -ruB --unidirectional-new-file ../glibc-2.19/include/alloca.h ../glibc-2.19-akaros/include/alloca.h
65 --- glibc-2.19/include/alloca.h 2014-02-07 04:04:38.000000000 -0500
66 +++ glibc-2.19-akaros/include/alloca.h  2016-10-05 17:05:34.571879935 -0400
67 @@ -1,5 +1,7 @@
68  #ifndef _ALLOCA_H
69  
70 +/* AKAROS: Modified the alloca cutoff */
71 +
72  #include <stdlib/alloca.h>
73  #include <stackinfo.h>
74  
75 @@ -16,7 +18,10 @@
76  extern int __libc_alloca_cutoff (size_t size) __attribute__ ((const));
77  libc_hidden_proto (__libc_alloca_cutoff)
78  
79 -#define __MAX_ALLOCA_CUTOFF    65536
80 +/* AKAROS: Limit to a small amount, so 2LSs and vcore context can have small
81 + * stacks.  Glibc typically uses 1/4 of the stack.  Assuming our users have at
82 + * least 4K stacks, we can use 1k, but let's be paranoid and use 512 for now. */
83 +#define __MAX_ALLOCA_CUTOFF    512
84  
85  #include <allocalim.h>
86  
87 diff -ruB --unidirectional-new-file ../glibc-2.19/include/errno.h ../glibc-2.19-akaros/include/errno.h
88 --- glibc-2.19/include/errno.h  2014-02-07 04:04:38.000000000 -0500
89 +++ glibc-2.19-akaros/include/errno.h   2015-12-17 14:58:45.065386401 -0500
90 @@ -1,3 +1,5 @@
91 +/* Modified for Akaros, removed the redefinition of errno */
92 +
93  #ifndef _ERRNO_H
94  
95  #include <stdlib/errno.h>
96 @@ -21,13 +23,16 @@
97  
98  #  include <tls.h>
99  
100 -#  undef  errno
101 -#  ifndef NOT_IN_libc
102 -#   define errno __libc_errno
103 -#  else
104 -#   define errno errno         /* For #ifndef errno tests.  */
105 -#  endif
106 +/* AKAROS doesn't want the redef of errno */
107 +#  ifndef __akaros__
108 +#    undef  errno
109 +#    ifndef NOT_IN_libc
110 +#     define errno __libc_errno
111 +#    else
112 +#     define errno errno               /* For #ifndef errno tests.  */
113 +#    endif
114  extern __thread int errno attribute_tls_model_ie;
115 +#  endif
116  
117  # endif        /* !NOT_IN_libc || IN_LIB */
118  
119 diff -ruB --unidirectional-new-file ../glibc-2.19/include/libc-symbols.h ../glibc-2.19-akaros/include/libc-symbols.h
120 --- glibc-2.19/include/libc-symbols.h   2014-02-07 04:04:38.000000000 -0500
121 +++ glibc-2.19-akaros/include/libc-symbols.h    2016-02-16 11:25:16.761066328 -0500
122 @@ -1,3 +1,5 @@
123 +/* Modified for Akaros, removed the static_link_warning() */
124 +
125  /* Support macros for making weak and strong aliases for symbols,
126     and for using symbol sets and linker warnings with GNU ld.
127     Copyright (C) 1995-2014 Free Software Foundation, Inc.
128 @@ -231,6 +233,14 @@
129    link_warning (name, #name " is not implemented and will always fail")
130  
131  /* Warning for linking functions calling dlopen into static binaries.  */
132 +
133 +/* AKAROS doesn't want the annoying warning, breaks -Werror. */
134 +#ifdef __akaros__
135 +
136 +#define static_link_warning(name)
137 +
138 +#else
139 +
140  #ifdef SHARED
141  #define static_link_warning(name)
142  #else
143 @@ -241,6 +251,8 @@
144  for linking")
145  #endif
146  
147 +#endif /* __akaros__ */
148 +
149  /* Declare SYMBOL to be TYPE (`function' or `object') of SIZE bytes
150     alias to ORIGINAL, when the assembler supports such declarations
151     (such as in ELF).
152 diff -ruB --unidirectional-new-file ../glibc-2.19/Makeconfig ../glibc-2.19-akaros/Makeconfig
153 --- glibc-2.19/Makeconfig       2014-02-07 04:04:38.000000000 -0500
154 +++ glibc-2.19-akaros/Makeconfig        2015-12-17 14:58:45.065386401 -0500
155 @@ -493,13 +493,17 @@
156  LDFLAGS-rdynamic = -rdynamic
157  LDFLAGS-Bsymbolic = -Bsymbolic
158  
159 -# Choose the default search path for the dynamic linker based on
160 -# where we will install libraries.
161 -ifneq ($(libdir),$(slibdir))
162 -default-rpath = $(slibdir):$(libdir)
163 -else
164 -default-rpath = $(libdir)
165 -endif
166 +# For akaros we want the default-rpath to be the path on our resulting
167 +# machine, not the path of the lib directory in our cross compiler
168 +default-rpath = "/lib"
169 +
170 +## Choose the default search path for the dynamic linker based on
171 +## where we will install libraries.
172 +#ifneq ($(libdir),$(slibdir))
173 +#default-rpath = $(slibdir):$(libdir)
174 +#else
175 +#default-rpath = $(libdir)
176 +#endif
177  
178  ifndef link-extra-libs
179  link-extra-libs = $(LDLIBS-$(@F))
180 @@ -1028,10 +1032,12 @@
181  # These are the subdirectories containing the library source.  The order
182  # is more or less arbitrary.  The sorting step will take care of the
183  # dependencies.
184 +#
185 +# AKAROS_PORT removed gshadow.  relies on NSS, has no man interface
186  all-subdirs = csu assert ctype locale intl catgets math setjmp signal      \
187               stdlib stdio-common libio malloc string wcsmbs time dirent    \
188               grp pwd posix io termios resource misc socket sysvipc gmon    \
189 -             gnulib iconv iconvdata wctype manual shadow gshadow po argp   \
190 +             gnulib iconv iconvdata wctype manual shadow po argp   \
191               crypt localedata timezone rt conform debug                    \
192               $(add-on-subdirs) dlfcn elf
193  
194 diff -ruB --unidirectional-new-file ../glibc-2.19/nptl/shlib-versions ../glibc-2.19-akaros/nptl/shlib-versions
195 --- glibc-2.19/nptl/shlib-versions      2014-02-07 04:04:38.000000000 -0500
196 +++ glibc-2.19-akaros/nptl/shlib-versions       2015-12-17 14:58:45.065386401 -0500
197 @@ -3,4 +3,6 @@
198  s390x-.*-linux.*       libpthread=0            GLIBC_2.2
199  powerpc64-.*-linux.*   libpthread=0            GLIBC_2.3
200  powerpc.*le-.*-linux.* libpthread=0            GLIBC_2.17
201 +#x86_64-.*-akaros.*      libpthread=0        GLIBC_2.2.5
202  .*-.*-linux.*          libpthread=0
203 +.*-.*-akaros.*         libpthread=0
204 diff -ruB --unidirectional-new-file ../glibc-2.19/rt/Makefile ../glibc-2.19-akaros/rt/Makefile
205 --- glibc-2.19/rt/Makefile      2014-02-07 04:04:38.000000000 -0500
206 +++ glibc-2.19-akaros/rt/Makefile       2015-12-17 14:58:45.065386401 -0500
207 @@ -53,7 +53,7 @@
208          tst-cputimer1 tst-cputimer2 tst-cputimer3 \
209          tst-clock2
210  
211 -extra-libs := librt
212 +extra-libs := #librt
213  extra-libs-others := $(extra-libs)
214  
215  include ../Rules
216 diff -ruB --unidirectional-new-file ../glibc-2.19/scripts/config.sub ../glibc-2.19-akaros/scripts/config.sub
217 --- glibc-2.19/scripts/config.sub       2014-02-07 04:04:38.000000000 -0500
218 +++ glibc-2.19-akaros/scripts/config.sub        2015-12-17 14:58:45.065386401 -0500
219 @@ -117,7 +117,7 @@
220  case $maybe_os in
221    nto-qnx* | linux-gnu* | linux-android* | linux-dietlibc | linux-newlib* | \
222    linux-musl* | linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | \
223 -  knetbsd*-gnu* | netbsd*-gnu* | \
224 +  knetbsd*-gnu* | netbsd*-gnu* | akaros*-gnu* | \
225    kopensolaris*-gnu* | \
226    storm-chaos* | os2-emx* | rtmk-nova*)
227      os=-$maybe_os
228 @@ -1356,7 +1356,7 @@
229               | -hpux* | -unos* | -osf* | -luna* | -dgux* | -auroraux* | -solaris* \
230               | -sym* | -kopensolaris* | -plan9* \
231               | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \
232 -             | -aos* | -aros* \
233 +             | -aos* | -aros* | -akaros* \
234               | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \
235               | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \
236               | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \
237 diff -ruB --unidirectional-new-file ../glibc-2.19/shlib-versions ../glibc-2.19-akaros/shlib-versions
238 --- glibc-2.19/shlib-versions   2014-02-07 04:04:38.000000000 -0500
239 +++ glibc-2.19-akaros/shlib-versions    2015-12-17 14:58:45.065386401 -0500
240 @@ -24,6 +24,7 @@
241  s390x-.*-linux.*        DEFAULT                        GLIBC_2.2
242  powerpc64-.*-linux.*   DEFAULT                 GLIBC_2.3
243  powerpc.*le-.*-linux.* DEFAULT                 GLIBC_2.17
244 +x86_64-.*-akaros.*      DEFAULT                        GLIBC_2.2.5
245  .*-.*-gnu-gnu.*                DEFAULT                 GLIBC_2.2.6
246  
247  # Configuration                ABI                     Identifier for ABI data files
248 @@ -44,6 +45,7 @@
249  sh.*-.*-linux.*                libc=6                  GLIBC_2.2
250  sparc64.*-.*-linux.*   libc=6                  GLIBC_2.2
251  .*-.*-linux.*          libc=6
252 +.*-.*-akaros.*         libc=6
253  
254  # libmachuser.so.1 corresponds to mach/*.defs as of Utah's UK22 release.
255  .*-.*-gnu-gnu.*                libmachuser=1
256 diff -ruB --unidirectional-new-file ../glibc-2.19/stdio-common/vfprintf.c ../glibc-2.19-akaros/stdio-common/vfprintf.c
257 --- glibc-2.19/stdio-common/vfprintf.c  2014-02-07 04:04:38.000000000 -0500
258 +++ glibc-2.19-akaros/stdio-common/vfprintf.c   2017-02-10 09:46:12.976092517 -0500
259 @@ -29,6 +29,11 @@
260  #include <_itoa.h>
261  #include <locale/localeinfo.h>
262  #include <stdio.h>
263 +#include <ros/common.h>
264 +#include <sys/mman.h>
265 +
266 +/* Modified for AKAROS, uses mmap in place of large stack allocations */
267 +static char *failmsg = "vfprintf mmap failed!";
268  
269  /* This code is shared between the standard stdio implementation found
270     in GNU C library and the libio implementation originally found in
271 @@ -246,6 +251,8 @@
272    CHAR_T work_buffer[1000];
273    CHAR_T *workstart = NULL;
274    CHAR_T *workend;
275 +  /* AKAROS: this might get mmaped */
276 +  void *specs_buf = NULL;
277  
278    /* We have to save the original argument pointer.  */
279    va_list ap_save;
280 @@ -1678,7 +1685,18 @@
281      size_t nspecs = 0;
282      /* A more or less arbitrary start value.  */
283      size_t nspecs_size = 32 * sizeof (struct printf_spec);
284 -    struct printf_spec *specs = alloca (nspecs_size);
285 +
286 +       /* AKAROS: specs_buf declared above and conditionally freed below */
287 +    //struct printf_spec *specs = alloca (nspecs_size);
288 +    struct printf_spec *specs;
289 +
290 +    specs_buf = mmap(0, ROUNDUP(nspecs_size, PGSIZE), PROT_WRITE | PROT_READ,
291 +                     MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
292 +    if (specs_buf == MAP_FAILED) {
293 +      write(2, failmsg, sizeof(failmsg));
294 +      exit(-1);
295 +    }
296 +       specs = (struct printf_spec*)specs_buf;
297  
298      /* The number of arguments the format string requests.  This will
299         determine the size of the array needed to store the argument
300 @@ -2049,6 +2067,8 @@
301      free (args_malloced);
302    if (__glibc_unlikely (workstart != NULL))
303      free (workstart);
304 +  if (__glibc_unlikely (specs_buf != NULL))
305 +    munmap(specs_buf, ROUNDUP(32 * sizeof (struct printf_spec), PGSIZE));
306    /* Unlock the stream.  */
307    _IO_funlockfile (s);
308    _IO_cleanup_region_end (0);
309 @@ -2276,7 +2296,17 @@
310  buffered_vfprintf (_IO_FILE *s, const CHAR_T *format,
311                    _IO_va_list args)
312  {
313 -  CHAR_T buf[_IO_BUFSIZ];
314 +  /* AKAROS: mmap the buf.  */
315 +  //CHAR_T buf[_IO_BUFSIZ];
316 +  CHAR_T *buf;
317 +
318 +  buf = mmap(0, ROUNDUP(_IO_BUFSIZ, PGSIZE), PROT_WRITE | PROT_READ,
319 +             MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
320 +  if (buf == MAP_FAILED) {
321 +    write(2, failmsg, sizeof(failmsg));
322 +    exit(-1);
323 +  }
324 +
325    struct helper_file helper;
326    _IO_FILE *hp = (_IO_FILE *) &helper._f;
327    int result, to_flush;
328 @@ -2338,6 +2368,7 @@
329    _IO_funlockfile (s);
330    __libc_cleanup_region_end (0);
331  
332 +  munmap(buf, ROUNDUP(_IO_BUFSIZ, PGSIZE)); /* AKAROS */
333    return result;
334  }
335  
336 diff -ruB --unidirectional-new-file ../glibc-2.19/sunrpc/netname.c ../glibc-2.19-akaros/sunrpc/netname.c
337 --- glibc-2.19/sunrpc/netname.c 2014-02-07 04:04:38.000000000 -0500
338 +++ glibc-2.19-akaros/sunrpc/netname.c  2015-12-17 14:58:45.065386401 -0500
339 @@ -16,13 +16,13 @@
340     License along with the GNU C Library; if not, see
341     <http://www.gnu.org/licenses/>.  */
342  
343 +/* AKAROS_PORT: removed references to nss; stubbed the funcs that used it. */
344 +
345  #include <stdio.h>
346  #include <unistd.h>
347  #include <string.h>
348  #include <rpc/rpc.h>
349  
350 -#include "nsswitch.h"
351 -
352  #define        OPSYS_LEN 4
353  #define        MAXIPRINT (11)          /* max length of printed integer */
354  static const char OPSYS[] = "unix";
355 @@ -139,56 +139,18 @@
356  /* Type of the lookup function for netname2user.  */
357  typedef int (*netname2user_function) (const char netname[MAXNETNAMELEN + 1],
358                                       uid_t *, gid_t *, int *, gid_t *);
359 -/* The lookup function for the first entry of this service.  */
360 -extern int __nss_publickey_lookup (service_user ** nip, const char *name,
361 -                                  void **fctp) internal_function;
362 -
363  int
364  netname2user (const char netname[MAXNETNAMELEN + 1], uid_t * uidp, gid_t * gidp,
365               int *gidlenp, gid_t * gidlist)
366  {
367 -  static service_user *startp;
368 -  static netname2user_function start_fct;
369 -  service_user *nip;
370 -  union
371 -  {
372 -    netname2user_function f;
373 -    void *ptr;
374 -  } fct;
375 -  enum nss_status status = NSS_STATUS_UNAVAIL;
376 -  int no_more;
377 -
378 -  if (startp == NULL)
379 -    {
380 -      no_more = __nss_publickey_lookup (&nip, "netname2user", &fct.ptr);
381 -      if (no_more)
382 -       startp = (service_user *) - 1;
383 -      else
384 -       {
385 -         startp = nip;
386 -         start_fct = fct.f;
387 -       }
388 -    }
389 -  else
390 -    {
391 -      fct.f = start_fct;
392 -      no_more = (nip = startp) == (service_user *) - 1;
393 -    }
394 -
395 -  while (!no_more)
396 -    {
397 -      status = (*fct.f) (netname, uidp, gidp, gidlenp, gidlist);
398 -
399 -      no_more = __nss_next2 (&nip, "netname2user", NULL, &fct.ptr, status, 0);
400 -    }
401 -
402 -  return status == NSS_STATUS_SUCCESS;
403 +  return FALSE;
404  }
405  #ifdef EXPORT_RPC_SYMBOLS
406  libc_hidden_def (netname2user)
407  #else
408  libc_hidden_nolink_sunrpc (netname2user, GLIBC_2_1)
409  #endif
410 +stub_warning(netname2user)
411  
412  int
413  netname2host (const char netname[MAXNETNAMELEN + 1], char *hostname,
414 diff -ruB --unidirectional-new-file ../glibc-2.19/sysdeps/i386/configure ../glibc-2.19-akaros/sysdeps/i386/configure
415 --- glibc-2.19/sysdeps/i386/configure   2014-02-07 04:04:38.000000000 -0500
416 +++ glibc-2.19-akaros/sysdeps/i386/configure    2015-12-17 14:58:45.077386468 -0500
417 @@ -82,13 +82,13 @@
418  $as_echo "$libc_compiler_builtin_inlined" >&6; }
419  
420  
421 -ac_fn_c_check_header_compile "$LINENO" "cpuid.h" "ac_cv_header_cpuid_h" "/* No default includes.  */
422 -"
423 -if test "x$ac_cv_header_cpuid_h" = xyes; then :
424 -
425 -else
426 -  as_fn_error $? "gcc must provide the <cpuid.h> header" "$LINENO" 5
427 -fi
428 +#ac_fn_c_check_header_compile "$LINENO" "cpuid.h" "ac_cv_header_cpuid_h" "/* No default includes.  */
429 +#"
430 +#if test "x$ac_cv_header_cpuid_h" = xyes; then :
431 +#
432 +#else
433 +#  as_fn_error $? "gcc must provide the <cpuid.h> header" "$LINENO" 5
434 +#fi
435  
436  
437  
438 diff -ruB --unidirectional-new-file ../glibc-2.19/sysdeps/i386/configure.ac ../glibc-2.19-akaros/sysdeps/i386/configure.ac
439 --- glibc-2.19/sysdeps/i386/configure.ac        2014-02-07 04:04:38.000000000 -0500
440 +++ glibc-2.19-akaros/sysdeps/i386/configure.ac 2015-12-17 14:58:45.077386468 -0500
441 @@ -30,9 +30,9 @@
442  *** Please use host i786, i686, i586, or i486.
443  *** For example: /source/glibc/configure CFLAGS='-O2 -march=i686' ...])])
444  
445 -AC_CHECK_HEADER([cpuid.h], ,
446 -  [AC_MSG_ERROR([gcc must provide the <cpuid.h> header])],
447 -  [/* No default includes.  */])
448 +#AC_CHECK_HEADER([cpuid.h], ,
449 +#  [AC_MSG_ERROR([gcc must provide the <cpuid.h> header])],
450 +#  [/* No default includes.  */])
451  
452  dnl Check if -msse4 works.
453  AC_CACHE_CHECK(for SSE4 support, libc_cv_cc_sse4, [dnl
454 diff -ruB --unidirectional-new-file ../glibc-2.19/sysdeps/i386/tlsdesc.sym ../glibc-2.19-akaros/sysdeps/i386/tlsdesc.sym
455 --- glibc-2.19/sysdeps/i386/tlsdesc.sym 2014-02-07 04:04:38.000000000 -0500
456 +++ glibc-2.19-akaros/sysdeps/i386/tlsdesc.sym  2015-12-17 14:58:45.077386468 -0500
457 @@ -8,7 +8,7 @@
458  
459  -- Abuse tls.h macros to derive offsets relative to the thread register.
460  
461 -DTV_OFFSET                     offsetof(struct pthread, header.dtv)
462 +DTV_OFFSET                     offsetof(struct rthread, header.dtv)
463  
464  TLSDESC_ARG                    offsetof(struct tlsdesc, arg)
465  
466 diff -ruB --unidirectional-new-file ../glibc-2.19/sysdeps/x86_64/tlsdesc.sym ../glibc-2.19-akaros/sysdeps/x86_64/tlsdesc.sym
467 --- glibc-2.19/sysdeps/x86_64/tlsdesc.sym       2014-02-07 04:04:38.000000000 -0500
468 +++ glibc-2.19-akaros/sysdeps/x86_64/tlsdesc.sym        2015-12-17 14:58:45.077386468 -0500
469 @@ -8,7 +8,7 @@
470  
471  -- Abuse tls.h macros to derive offsets relative to the thread register.
472  
473 -DTV_OFFSET                     offsetof(struct pthread, header.dtv)
474 +DTV_OFFSET                     offsetof(struct rthread, header.dtv)
475  
476  TLSDESC_ARG                    offsetof(struct tlsdesc, arg)
477