r4800 - in glibc-package/trunk/debian: . patches/kfreebsd
Author: aurel32
Date: 2011-07-19 11:17:16 +0000 (Tue, 19 Jul 2011)
New Revision: 4800
Modified:
glibc-package/trunk/debian/changelog
glibc-package/trunk/debian/patches/kfreebsd/local-sysdeps.diff
Log:
* kfreebsd/local-sysdeps.diff, update to revision 3616 (from glibc-bsd),
fixing LD_PRELOAD with a kfreebsd-9 kernel (closes: #630695) and
tst-atime when build in a noatime filesystem (closes: #634152).
Modified: glibc-package/trunk/debian/changelog
===================================================================
--- glibc-package/trunk/debian/changelog 2011-07-19 10:57:43 UTC (rev 4799)
+++ glibc-package/trunk/debian/changelog 2011-07-19 11:17:16 UTC (rev 4800)
@@ -6,6 +6,9 @@
results. Closes: #632863.
* Add patches/localedata/locale-os_RU.diff from upstream to add Ossetian
locale. Closes: #634508.
+ * kfreebsd/local-sysdeps.diff, update to revision 3616 (from glibc-bsd),
+ fixing LD_PRELOAD with a kfreebsd-9 kernel (closes: #630695) and
+ tst-atime when build in a noatime filesystem (closes: #634152).
-- Aurelien Jarno <aurel32@debian.org> Sun, 10 Jul 2011 22:01:11 +0200
Modified: glibc-package/trunk/debian/patches/kfreebsd/local-sysdeps.diff
===================================================================
--- glibc-package/trunk/debian/patches/kfreebsd/local-sysdeps.diff 2011-07-19 10:57:43 UTC (rev 4799)
+++ glibc-package/trunk/debian/patches/kfreebsd/local-sysdeps.diff 2011-07-19 11:17:16 UTC (rev 4800)
@@ -3181,6 +3181,46 @@
+#define _DIRENT_HAVE_D_NAMLEN 1
+#define _DIRENT_HAVE_D_TYPE 1
--- /dev/null
++++ b/ports/sysdeps/unix/bsd/bsd4.4/kfreebsd/bits/elf.h
+@@ -0,0 +1,37 @@
++/* This file defines standard ELF types, structures, and macros.
++ Copyright (C) 1995-2003,2004,2005,2006,2007,2008,2009,2010
++ Free Software Foundation, Inc.
++ This file is part of the GNU C Library.
++
++ The GNU C Library is free software; you can redistribute it and/or
++ modify it under the terms of the GNU Lesser General Public
++ License as published by the Free Software Foundation; either
++ version 2.1 of the License, or (at your option) any later version.
++
++ The GNU C Library is distributed in the hope that it will be useful,
++ but WITHOUT ANY WARRANTY; without even the implied warranty of
++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
++ Lesser General Public License for more details.
++
++ You should have received a copy of the GNU Lesser General Public
++ License along with the GNU C Library; if not, write to the Free
++ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
++ 02111-1307 USA. */
++
++#ifndef _BITS_ELF_H
++#define _BITS_ELF_H
++
++__BEGIN_DECLS
++
++#define AT_EXECPATH 15 /* Path to the executable. */
++#define AT_CANARY 16 /* Canary for SSP. */
++#define AT_CANARYLEN 17 /* Length of the canary. */
++#define AT_OSRELDATE 18 /* OSRELDATE. */
++#define AT_NCPUS 19 /* Number of CPUs. */
++#define AT_PAGESIZES 20 /* Pagesizes. */
++#define AT_PAGESIZESLEN 21 /* Number of pagesizes. */
++#define AT_STACKPROT 23 /* Initial stack protection. */
++
++__END_DECLS
++
++#endif /* elf.h */
+--- /dev/null
+++ b/ports/sysdeps/unix/bsd/bsd4.4/kfreebsd/bits/errno.h
@@ -0,0 +1,183 @@
+/*-
@@ -6268,7 +6308,7 @@
+#endif /* _BITS_STATFS_H */
--- /dev/null
+++ b/ports/sysdeps/unix/bsd/bsd4.4/kfreebsd/bits/statvfs.h
-@@ -0,0 +1,95 @@
+@@ -0,0 +1,97 @@
+/* Definition of `struct statvfs', information about a filesystem.
+ Copyright (C) 1998, 2000-2002 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
@@ -6360,8 +6400,10 @@
+# define ST_NODEV ST_NODEV
+ ST_NOEXEC = 8, /* Disallow program execution. */
+# define ST_NOEXEC ST_NOEXEC
-+ ST_SYNCHRONOUS = 16 /* Writes are synced at once. */
++ ST_SYNCHRONOUS = 16, /* Writes are synced at once. */
+# define ST_SYNCHRONOUS ST_SYNCHRONOUS
++ ST_NOATIME = 1024, /* Do not update access times. */
++# define ST_NOATIME ST_NOATIME
+#endif /* Use GNU. */
+};
--- /dev/null
@@ -7345,7 +7387,7 @@
+#include <sysdeps/unix/clock_settime.c>
--- /dev/null
+++ b/ports/sysdeps/unix/bsd/bsd4.4/kfreebsd/clone.c
-@@ -0,0 +1,108 @@
+@@ -0,0 +1,144 @@
+/* Create a thread.
+ Copyright (C) 2002 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
@@ -7374,6 +7416,29 @@
+#include <stddef.h>
+#undef __clone
+
++
++#include <sys/sysctl.h>
++
++static inline int
++__kernel_osreldate(void)
++{
++ static int osreldate;
++
++ int mib[2];
++ size_t size;
++ char *temp;
++
++ if (osreldate == 0)
++ {
++ mib[0] = CTL_KERN;
++ mib[1] = KERN_OSRELDATE;
++ size = sizeof osreldate;
++ if (__sysctl(mib, 2, &osreldate, &size, NULL, 0) == -1)
++ return (-1);
++ }
++ return (osreldate);
++}
++
+/* __start_thread (flags, child_stack, fn, arg)
+ is roughly equivalent to
+
@@ -7411,7 +7476,20 @@
+ }
+
+ if ((flags & CSIGNAL) != SIGCHLD)
++ {
++ if (__kernel_osreldate() >= 802509) /* XXX have to be updated after upstream merge */
++ /* we slightly cheat here, */
++ /* the 9.x snapshot prior to r223966 does not support it too */
+ {
++ if ((flags & CSIGNAL) & ~RFTSIGMASK)
++ {
++ __set_errno (EINVAL);
++ return -1;
++ }
++ rfork_flags |= (RFTSIGZMB | RFTSIGFLAGS(flags & CSIGNAL));
++ }
++ else
++ {
+ if ((flags & CSIGNAL) & ~RFTHPNMASK)
+ {
+ __set_errno (EINVAL);
@@ -7422,7 +7500,7 @@
+ else
+ rfork_flags |= (RFLINUXTHPN | ((flags & CSIGNAL) << RFTHPNSHIFT));
+ }
-+
++ }
+ if (flags & CLONE_VM)
+ rfork_flags |= RFMEM;
+
@@ -8523,10 +8601,58 @@
+}
+
--- /dev/null
++++ b/ports/sysdeps/unix/bsd/bsd4.4/kfreebsd/dl-support.c
+@@ -0,0 +1,44 @@
++/* Dynamic linker system dependencies for GNU/kFreeBSD.
++ Copyright (C) 2011 Free Software Foundation, Inc.
++ This file is part of the GNU C Library.
++
++ The GNU C Library is free software; you can redistribute it and/or
++ modify it under the terms of the GNU Lesser General Public
++ License as published by the Free Software Foundation; either
++ version 2.1 of the License, or (at your option) any later version.
++
++ The GNU C Library is distributed in the hope that it will be useful,
++ but WITHOUT ANY WARRANTY; without even the implied warranty of
++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
++ Lesser General Public License for more details.
++
++ You should have received a copy of the GNU Lesser General Public
++ License along with the GNU C Library; if not, write to the Free
++ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
++ 02111-1307 USA. */
++
++#define _dl_aux_init _dl_aux_init_ignored_code
++#include <elf/dl-support.c>
++#include <bits/elf.h>
++#undef _dl_aux_init
++
++#ifdef HAVE_AUX_VECTOR
++void
++internal_function
++_dl_aux_init (ElfW(auxv_t) *av)
++{
++ for (; av->a_type != AT_NULL; ++av)
++ switch (av->a_type)
++ {
++ case AT_PAGESZ:
++ GLRO(dl_pagesize) = av->a_un.a_val;
++ break;
++ case AT_PHDR:
++ GL(dl_phdr) = (void *) av->a_un.a_val;
++ break;
++ case AT_PHNUM:
++ GL(dl_phnum) = av->a_un.a_val;
++ break;
++ }
++}
++#endif
+--- /dev/null
+++ b/ports/sysdeps/unix/bsd/bsd4.4/kfreebsd/dl-sysdep.c
-@@ -0,0 +1,56 @@
+@@ -0,0 +1,248 @@
+/* Dynamic linker system dependencies for GNU/kFreeBSD.
-+ Copyright (C) 2008 Free Software Foundation, Inc.
++ Copyright (C) 1995-1998,2000-2008,2009,2010,2011
++ Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ The GNU C Library is free software; you can redistribute it and/or
@@ -8555,9 +8681,200 @@
+#include <kernel-features.h>
+
+#ifdef SHARED
++# define _dl_sysdep_start _dl_sysdep_start_ignored_code
++# define _dl_show_auxv _dl_show_auxv_ignored_code
+# include <elf/dl-sysdep.c>
++# include <bits/elf.h>
++# undef _dl_sysdep_start
++# undef _dl_show_auxv
++
++ElfW(Addr)
++_dl_sysdep_start (void **start_argptr,
++ void (*dl_main) (const ElfW(Phdr) *phdr, ElfW(Word) phnum,
++ ElfW(Addr) *user_entry, ElfW(auxv_t) *auxv))
++{
++ const ElfW(Phdr) *phdr = NULL;
++ ElfW(Word) phnum = 0;
++ ElfW(Addr) user_entry;
++ ElfW(auxv_t) *av;
++ uid_t uid = 0;
++ gid_t gid = 0;
++#ifdef NEED_DL_SYSINFO
++ uintptr_t new_sysinfo = 0;
+#endif
+
++ __libc_stack_end = DL_STACK_END (start_argptr);
++ DL_FIND_ARG_COMPONENTS (start_argptr, _dl_argc, INTUSE(_dl_argv), _environ,
++ _dl_auxv);
++
++ user_entry = (ElfW(Addr)) ENTRY_POINT;
++ GLRO(dl_platform) = NULL; /* Default to nothing known about the platform. */
++
++ for (av = _dl_auxv; av->a_type != AT_NULL; av++)
++ switch (av->a_type)
++ {
++ case AT_PHDR:
++ phdr = (void *) av->a_un.a_val;
++ break;
++ case AT_PHNUM:
++ phnum = av->a_un.a_val;
++ break;
++ case AT_PAGESZ:
++ GLRO(dl_pagesize) = av->a_un.a_val;
++ break;
++ case AT_ENTRY:
++ user_entry = av->a_un.a_val;
++ break;
++#ifdef NEED_DL_BASE_ADDR
++ case AT_BASE:
++ _dl_base_addr = av->a_un.a_val;
++ break;
++#endif
++ }
++
++ {
++ /* Fill in the values we have not gotten from the kernel through the
++ auxiliary vector. */
++# undef SEE
++# define SEE(UID, var, uid) \
++ var ^= __get##uid ()
++ SEE (UID, uid, uid);
++ SEE (EUID, uid, euid);
++ SEE (GID, gid, gid);
++ SEE (EGID, gid, egid);
++
++ /* If one of the two pairs of IDs does not match this is a setuid
++ or setgid run. */
++ INTUSE(__libc_enable_secure) = uid | gid;
++ }
++
++#ifndef HAVE_AUX_PAGESIZE
++ if (GLRO(dl_pagesize) == 0)
++ GLRO(dl_pagesize) = __getpagesize ();
++#endif
++
++#if defined NEED_DL_SYSINFO
++ /* Only set the sysinfo value if we also have the vsyscall DSO. */
++ if (GLRO(dl_sysinfo_dso) != 0 && new_sysinfo)
++ GLRO(dl_sysinfo) = new_sysinfo;
++#endif
++
++#ifdef DL_SYSDEP_INIT
++ DL_SYSDEP_INIT;
++#endif
++
++#ifdef DL_PLATFORM_INIT
++ DL_PLATFORM_INIT;
++#endif
++
++ /* Determine the length of the platform name. */
++ if (GLRO(dl_platform) != NULL)
++ GLRO(dl_platformlen) = strlen (GLRO(dl_platform));
++
++ if (__sbrk (0) == _end)
++ /* The dynamic linker was run as a program, and so the initial break
++ starts just after our bss, at &_end. The malloc in dl-minimal.c
++ will consume the rest of this page, so tell the kernel to move the
++ break up that far. When the user program examines its break, it
++ will see this new value and not clobber our data. */
++ __sbrk (GLRO(dl_pagesize)
++ - ((_end - (char *) 0) & (GLRO(dl_pagesize) - 1)));
++
++ /* If this is a SUID program we make sure that FDs 0, 1, and 2 are
++ allocated. If necessary we are doing it ourself. If it is not
++ possible we stop the program. */
++ if (__builtin_expect (INTUSE(__libc_enable_secure), 0))
++ __libc_check_standard_fds ();
++
++ (*dl_main) (phdr, phnum, &user_entry, _dl_auxv);
++ return user_entry;
++}
++
++void
++internal_function
++_dl_show_auxv (void)
++{
++ char buf[64];
++ ElfW(auxv_t) *av;
++
++ /* Terminate string. */
++ buf[63] = '\0';
++
++ /* The following code assumes that the AT_* values are encoded
++ starting from 0 with AT_NULL, 1 for AT_IGNORE, and all other values
++ close by (otherwise the array will be too large). In case we have
++ to support a platform where these requirements are not fulfilled
++ some alternative implementation has to be used. */
++ for (av = _dl_auxv; av->a_type != AT_NULL; ++av)
++ {
++ static const struct
++ {
++ const char label[17];
++ enum { unknown = 0, dec, hex, str, ignore } form : 8;
++ } auxvars[] =
++ {
++ [AT_EXECFD - 2] = { "EXECFD: ", dec },
++ [AT_PHDR - 2] = { "PHDR: 0x", hex },
++ [AT_PHENT - 2] = { "PHENT: ", dec },
++ [AT_PHNUM - 2] = { "PHNUM: ", dec },
++ [AT_PAGESZ - 2] = { "PAGESZ: ", dec },
++ [AT_BASE - 2] = { "BASE: 0x", hex },
++ [AT_FLAGS - 2] = { "FLAGS: 0x", hex },
++ [AT_ENTRY - 2] = { "ENTRY: 0x", hex },
++#ifndef __powerpc__
++ /* For some odd reason these are not in sys/powerpc/include/elf.h. */
++ [AT_NOTELF - 2] = { "NOTELF: ", hex },
++ [AT_UID - 2] = { "UID: ", dec },
++ [AT_EUID - 2] = { "EUID: ", dec },
++ [AT_GID - 2] = { "GID: ", dec },
++ [AT_EGID - 2] = { "EGID: ", dec },
++#endif
++ [AT_EXECPATH - 2] = { "EXECPATH ", str },
++ [AT_CANARY - 2] = { "CANARY: 0x", hex },
++ [AT_CANARYLEN - 2] = { "CANARYLEN: ", dec },
++ [AT_OSRELDATE - 2] = { "OSRELDATE: ", dec },
++ [AT_NCPUS - 2] = { "NCPUS: ", dec },
++ [AT_PAGESIZES - 2] = { "PAGESIZES: 0x", hex },
++ [AT_PAGESIZESLEN - 2] = { "PAGESIZESLEN: ", dec },
++ [AT_STACKPROT - 2] = { "STACKPROT: 0x", hex },
++ };
++ unsigned int idx = (unsigned int) (av->a_type - 2);
++
++ if ((unsigned int) av->a_type < 2u || auxvars[idx].form == ignore)
++ continue;
++
++ assert (AT_NULL == 0);
++ assert (AT_IGNORE == 1);
++
++ if (idx < sizeof (auxvars) / sizeof (auxvars[0])
++ && auxvars[idx].form != unknown)
++ {
++ const char *val = (char *) av->a_un.a_val;
++
++ if (__builtin_expect (auxvars[idx].form, dec) == dec)
++ val = _itoa ((unsigned long int) av->a_un.a_val,
++ buf + sizeof buf - 1, 10, 0);
++ else if (__builtin_expect (auxvars[idx].form, hex) == hex)
++ val = _itoa ((unsigned long int) av->a_un.a_val,
++ buf + sizeof buf - 1, 16, 0);
++
++ _dl_printf ("AT_%s%s\n", auxvars[idx].label, val);
++
++ continue;
++ }
++
++ /* Unknown value: print a generic line. */
++ char buf2[17];
++ buf2[sizeof (buf2) - 1] = '\0';
++ const char *val2 = _itoa ((unsigned long int) av->a_un.a_val,
++ buf2 + sizeof buf2 - 1, 16, 0);
++ const char *val = _itoa ((unsigned long int) av->a_type,
++ buf + sizeof buf - 1, 16, 0);
++ _dl_printf ("AT_??? (0x%s): 0x%s\n", val, val2);
++ }
++}
++#endif
++
+int
+attribute_hidden
+_dl_discover_osversion (void)
@@ -11091,7 +11408,7 @@
+}
--- /dev/null
+++ b/ports/sysdeps/unix/bsd/bsd4.4/kfreebsd/getosreldate.c
-@@ -0,0 +1,54 @@
+@@ -0,0 +1,58 @@
+/*
+ * Copyright (c) 1989, 1993
+ * The Regents of the University of California. All rights reserved.
@@ -11128,22 +11445,26 @@
+int
+__getosreldate(void)
+{
-+ int mib[2];
-+ size_t size;
-+ int value;
-+ char *temp;
++ static int osreldate;
+
++ int mib[2];
++ size_t size;
++ char *temp;
++
++ if (osreldate == 0)
++ {
+ if ((temp = getenv("OSVERSION"))) {
-+ value = atoi(temp);
-+ return (value);
++ osreldate = atoi(temp);
++ return (osreldate);
+ }
+
+ mib[0] = CTL_KERN;
+ mib[1] = KERN_OSRELDATE;
-+ size = sizeof value;
-+ if (sysctl(mib, 2, &value, &size, NULL, 0) == -1)
++ size = sizeof osreldate;
++ if (__sysctl(mib, 2, &osreldate, &size, NULL, 0) == -1)
+ return (-1);
-+ return (value);
++ }
++ return (osreldate);
+}
+weak_alias (__getosreldate, getosreldate)
--- /dev/null
@@ -20179,6 +20500,48 @@
+
+#endif /* !_PATHS_H_ */
--- /dev/null
++++ b/ports/sysdeps/unix/bsd/bsd4.4/kfreebsd/powerpc/bits/elf.h
+@@ -0,0 +1,39 @@
++/* This file defines standard ELF types, structures, and macros.
++ Copyright (C) 2011 Free Software Foundation, Inc.
++ This file is part of the GNU C Library.
++
++ The GNU C Library is free software; you can redistribute it and/or
++ modify it under the terms of the GNU Lesser General Public
++ License as published by the Free Software Foundation; either
++ version 2.1 of the License, or (at your option) any later version.
++
++ The GNU C Library is distributed in the hope that it will be useful,
++ but WITHOUT ANY WARRANTY; without even the implied warranty of
++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
++ Lesser General Public License for more details.
++
++ You should have received a copy of the GNU Lesser General Public
++ License along with the GNU C Library; if not, write to the Free
++ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
++ 02111-1307 USA. */
++
++#ifndef _BITS_ELF_H
++#define _BITS_ELF_H
++
++__BEGIN_DECLS
++
++#define AT_DCACHEBSIZE 10 /* Data cache block size for the processor. */
++#define AT_ICACHEBSIZE 11 /* Instruction cache block size for the uP. */
++#define AT_UCACHEBSIZE 12 /* Cache block size, or `0' if cache not unified. */
++#define AT_EXECPATH 13 /* Path to the executable. */
++#define AT_CANARY 14 /* Canary for SSP */
++#define AT_CANARYLEN 15 /* Length of the canary. */
++#define AT_OSRELDATE 16 /* OSRELDATE. */
++#define AT_NCPUS 17 /* Number of CPUs. */
++#define AT_PAGESIZES 18 /* Pagesizes. */
++#define AT_PAGESIZESLEN 19 /* Number of pagesizes. */
++#define AT_STACKPROT 21 /* Initial stack protection. */
++
++__END_DECLS
++
++#endif /* elf.h */
+--- /dev/null
+++ b/ports/sysdeps/unix/bsd/bsd4.4/kfreebsd/pread.c
@@ -0,0 +1,69 @@
+/* Copyright (C) 2002 Free Software Foundation, Inc.
@@ -22353,7 +22716,7 @@
+}
--- /dev/null
+++ b/ports/sysdeps/unix/bsd/bsd4.4/kfreebsd/statfsconv.c
-@@ -0,0 +1,203 @@
+@@ -0,0 +1,205 @@
+/* Convert between different 'struct statfs' and 'struct statvfs' formats.
+ Copyright (C) 2002 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
@@ -22520,7 +22883,8 @@
+ | (pk->f_flags & MNT_NOSUID ? ST_NOSUID : 0)
+ | (pk->f_flags & MNT_NODEV ? ST_NODEV : 0)
+ | (pk->f_flags & MNT_NOEXEC ? ST_NOEXEC : 0)
-+ | (pk->f_flags & MNT_SYNCHRONOUS ? ST_SYNCHRONOUS : 0);
++ | (pk->f_flags & MNT_SYNCHRONOUS ? ST_SYNCHRONOUS : 0)
++ | (pk->f_flags & MNT_NOATIME ? ST_NOATIME : 0);
+ p32->f_namemax = pk->f_namemax;
+
+ memset (p32->f_spare, '\0', sizeof (p32->f_spare));
@@ -22552,7 +22916,8 @@
+ | (pk->f_flags & MNT_NOSUID ? ST_NOSUID : 0)
+ | (pk->f_flags & MNT_NODEV ? ST_NODEV : 0)
+ | (pk->f_flags & MNT_NOEXEC ? ST_NOEXEC : 0)
-+ | (pk->f_flags & MNT_SYNCHRONOUS ? ST_SYNCHRONOUS : 0);
++ | (pk->f_flags & MNT_SYNCHRONOUS ? ST_SYNCHRONOUS : 0)
++ | (pk->f_flags & MNT_NOATIME ? ST_NOATIME : 0);
+ p64->f_namemax = pk->f_namemax;
+
+ memset (p64->f_spare, '\0', sizeof (p64->f_spare));
@@ -23689,7 +24054,7 @@
+#endif
--- /dev/null
+++ b/ports/sysdeps/unix/bsd/bsd4.4/kfreebsd/sys/rfork.h
-@@ -0,0 +1,91 @@
+@@ -0,0 +1,98 @@
+/* Copyright (C) 2002 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
@@ -23763,6 +24128,13 @@
+#define RFTHREAD (1<<13) /* enable kernel thread support */
+#define RFSIGSHARE (1<<14) /* share signal handlers */
+#define RFLINUXTHPN (1<<16) /* do linux clone exit parent notification */
++#define RFSTOPPED (1<<17) /* leave child in a stopped state */
++#define RFHIGHPID (1<<18) /* use a pid higher than 10 (idleproc) */
++#define RFTSIGZMB (1<<19) /* select signal for exit parent notification */
++#define RFTSIGSHIFT 20 /* selected signal number is in bits 20-27 */
++#define RFTSIGMASK 0xFF
++#define RFTSIGNUM(flags) (((flags) >> RFTSIGSHIFT) & RFTSIGMASK)
++#define RFTSIGFLAGS(signum) ((signum) << RFTSIGSHIFT)
+#define RFPPWAIT (1<<31) /* parent sleeps until child exits (vfork) */
+
+#define RFTHPNSHIFT 24 /* reserve bits 24-30 */
Reply to: