11176bdada62cabc6ec4b0308a930e83b679d5d36John Reck#ifdef HAVE_CONFIG_H
21176bdada62cabc6ec4b0308a930e83b679d5d36John Reck#include <config.h>
31176bdada62cabc6ec4b0308a930e83b679d5d36John Reck#endif
41176bdada62cabc6ec4b0308a930e83b679d5d36John Reck
51176bdada62cabc6ec4b0308a930e83b679d5d36John Reck#include <assert.h>
61176bdada62cabc6ec4b0308a930e83b679d5d36John Reck#include "pixman-private.h" /* For 'inline' definition */
71176bdada62cabc6ec4b0308a930e83b679d5d36John Reck#include "utils-prng.h"
81176bdada62cabc6ec4b0308a930e83b679d5d36John Reck
91176bdada62cabc6ec4b0308a930e83b679d5d36John Reck#define ARRAY_LENGTH(A) ((int) (sizeof (A) / sizeof ((A) [0])))
101176bdada62cabc6ec4b0308a930e83b679d5d36John Reck
111176bdada62cabc6ec4b0308a930e83b679d5d36John Reck/* A primitive pseudorandom number generator,
121176bdada62cabc6ec4b0308a930e83b679d5d36John Reck * taken from POSIX.1-2001 example
131176bdada62cabc6ec4b0308a930e83b679d5d36John Reck */
141176bdada62cabc6ec4b0308a930e83b679d5d36John Reck
151176bdada62cabc6ec4b0308a930e83b679d5d36John Reckextern prng_t prng_state_data;
161176bdada62cabc6ec4b0308a930e83b679d5d36John Reckextern prng_t *prng_state;
171176bdada62cabc6ec4b0308a930e83b679d5d36John Reck#ifdef USE_OPENMP
181176bdada62cabc6ec4b0308a930e83b679d5d36John Reck#pragma omp threadprivate(prng_state_data)
191176bdada62cabc6ec4b0308a930e83b679d5d36John Reck#pragma omp threadprivate(prng_state)
201176bdada62cabc6ec4b0308a930e83b679d5d36John Reck#endif
211176bdada62cabc6ec4b0308a930e83b679d5d36John Reck
221176bdada62cabc6ec4b0308a930e83b679d5d36John Reckstatic inline uint32_t
231176bdada62cabc6ec4b0308a930e83b679d5d36John Reckprng_rand (void)
241176bdada62cabc6ec4b0308a930e83b679d5d36John Reck{
251176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    return prng_rand_r (prng_state);
261176bdada62cabc6ec4b0308a930e83b679d5d36John Reck}
271176bdada62cabc6ec4b0308a930e83b679d5d36John Reck
281176bdada62cabc6ec4b0308a930e83b679d5d36John Reckstatic inline void
291176bdada62cabc6ec4b0308a930e83b679d5d36John Reckprng_srand (uint32_t seed)
301176bdada62cabc6ec4b0308a930e83b679d5d36John Reck{
311176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    if (!prng_state)
321176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    {
331176bdada62cabc6ec4b0308a930e83b679d5d36John Reck        /* Without setting a seed, PRNG does not work properly (is just
341176bdada62cabc6ec4b0308a930e83b679d5d36John Reck         * returning zeros). So we only initialize the pointer here to
351176bdada62cabc6ec4b0308a930e83b679d5d36John Reck         * make sure that 'prng_srand' is always called before any
361176bdada62cabc6ec4b0308a930e83b679d5d36John Reck         * other 'prng_*' function. The wrongdoers violating this order
371176bdada62cabc6ec4b0308a930e83b679d5d36John Reck         * will get a segfault. */
381176bdada62cabc6ec4b0308a930e83b679d5d36John Reck        prng_state = &prng_state_data;
391176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    }
401176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    prng_srand_r (prng_state, seed);
411176bdada62cabc6ec4b0308a930e83b679d5d36John Reck}
421176bdada62cabc6ec4b0308a930e83b679d5d36John Reck
431176bdada62cabc6ec4b0308a930e83b679d5d36John Reckstatic inline uint32_t
441176bdada62cabc6ec4b0308a930e83b679d5d36John Reckprng_rand_n (int max)
451176bdada62cabc6ec4b0308a930e83b679d5d36John Reck{
461176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    return prng_rand () % max;
471176bdada62cabc6ec4b0308a930e83b679d5d36John Reck}
481176bdada62cabc6ec4b0308a930e83b679d5d36John Reck
491176bdada62cabc6ec4b0308a930e83b679d5d36John Reckstatic inline void
501176bdada62cabc6ec4b0308a930e83b679d5d36John Reckprng_randmemset (void *buffer, size_t size, prng_randmemset_flags_t flags)
511176bdada62cabc6ec4b0308a930e83b679d5d36John Reck{
521176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    prng_randmemset_r (prng_state, buffer, size, flags);
531176bdada62cabc6ec4b0308a930e83b679d5d36John Reck}
541176bdada62cabc6ec4b0308a930e83b679d5d36John Reck
551176bdada62cabc6ec4b0308a930e83b679d5d36John Reck/* CRC 32 computation
561176bdada62cabc6ec4b0308a930e83b679d5d36John Reck */
571176bdada62cabc6ec4b0308a930e83b679d5d36John Reckuint32_t
581176bdada62cabc6ec4b0308a930e83b679d5d36John Reckcompute_crc32 (uint32_t    in_crc32,
591176bdada62cabc6ec4b0308a930e83b679d5d36John Reck	       const void *buf,
601176bdada62cabc6ec4b0308a930e83b679d5d36John Reck	       size_t      buf_len);
611176bdada62cabc6ec4b0308a930e83b679d5d36John Reck
621176bdada62cabc6ec4b0308a930e83b679d5d36John Reckuint32_t
631176bdada62cabc6ec4b0308a930e83b679d5d36John Reckcompute_crc32_for_image (uint32_t        in_crc32,
641176bdada62cabc6ec4b0308a930e83b679d5d36John Reck			 pixman_image_t *image);
651176bdada62cabc6ec4b0308a930e83b679d5d36John Reck
661176bdada62cabc6ec4b0308a930e83b679d5d36John Reck/* Returns TRUE if running on a little endian system
671176bdada62cabc6ec4b0308a930e83b679d5d36John Reck */
681176bdada62cabc6ec4b0308a930e83b679d5d36John Reckstatic force_inline pixman_bool_t
691176bdada62cabc6ec4b0308a930e83b679d5d36John Reckis_little_endian (void)
701176bdada62cabc6ec4b0308a930e83b679d5d36John Reck{
711176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    unsigned long endian_check_var = 1;
721176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    return *(unsigned char *)&endian_check_var == 1;
731176bdada62cabc6ec4b0308a930e83b679d5d36John Reck}
741176bdada62cabc6ec4b0308a930e83b679d5d36John Reck
751176bdada62cabc6ec4b0308a930e83b679d5d36John Reck/* perform endian conversion of pixel data
761176bdada62cabc6ec4b0308a930e83b679d5d36John Reck */
771176bdada62cabc6ec4b0308a930e83b679d5d36John Reckvoid
781176bdada62cabc6ec4b0308a930e83b679d5d36John Reckimage_endian_swap (pixman_image_t *img);
791176bdada62cabc6ec4b0308a930e83b679d5d36John Reck
801176bdada62cabc6ec4b0308a930e83b679d5d36John Reck/* Allocate memory that is bounded by protected pages,
811176bdada62cabc6ec4b0308a930e83b679d5d36John Reck * so that out-of-bounds access will cause segfaults
821176bdada62cabc6ec4b0308a930e83b679d5d36John Reck */
831176bdada62cabc6ec4b0308a930e83b679d5d36John Reckvoid *
841176bdada62cabc6ec4b0308a930e83b679d5d36John Reckfence_malloc (int64_t len);
851176bdada62cabc6ec4b0308a930e83b679d5d36John Reck
861176bdada62cabc6ec4b0308a930e83b679d5d36John Reckvoid
871176bdada62cabc6ec4b0308a930e83b679d5d36John Reckfence_free (void *data);
881176bdada62cabc6ec4b0308a930e83b679d5d36John Reck
891176bdada62cabc6ec4b0308a930e83b679d5d36John Reck/* Generate n_bytes random bytes in fence_malloced memory */
901176bdada62cabc6ec4b0308a930e83b679d5d36John Reckuint8_t *
911176bdada62cabc6ec4b0308a930e83b679d5d36John Reckmake_random_bytes (int n_bytes);
921176bdada62cabc6ec4b0308a930e83b679d5d36John Reck
931176bdada62cabc6ec4b0308a930e83b679d5d36John Reck/* Return current time in seconds */
941176bdada62cabc6ec4b0308a930e83b679d5d36John Reckdouble
951176bdada62cabc6ec4b0308a930e83b679d5d36John Reckgettime (void);
961176bdada62cabc6ec4b0308a930e83b679d5d36John Reck
971176bdada62cabc6ec4b0308a930e83b679d5d36John Reckuint32_t
981176bdada62cabc6ec4b0308a930e83b679d5d36John Reckget_random_seed (void);
991176bdada62cabc6ec4b0308a930e83b679d5d36John Reck
1001176bdada62cabc6ec4b0308a930e83b679d5d36John Reck/* main body of the fuzzer test */
1011176bdada62cabc6ec4b0308a930e83b679d5d36John Reckint
1021176bdada62cabc6ec4b0308a930e83b679d5d36John Reckfuzzer_test_main (const char *test_name,
1031176bdada62cabc6ec4b0308a930e83b679d5d36John Reck		  int         default_number_of_iterations,
1041176bdada62cabc6ec4b0308a930e83b679d5d36John Reck		  uint32_t    expected_checksum,
1051176bdada62cabc6ec4b0308a930e83b679d5d36John Reck		  uint32_t    (*test_function)(int testnum, int verbose),
1061176bdada62cabc6ec4b0308a930e83b679d5d36John Reck		  int         argc,
1071176bdada62cabc6ec4b0308a930e83b679d5d36John Reck		  const char *argv[]);
1081176bdada62cabc6ec4b0308a930e83b679d5d36John Reck
1091176bdada62cabc6ec4b0308a930e83b679d5d36John Reckvoid
1101176bdada62cabc6ec4b0308a930e83b679d5d36John Reckfail_after (int seconds, const char *msg);
1111176bdada62cabc6ec4b0308a930e83b679d5d36John Reck
1121176bdada62cabc6ec4b0308a930e83b679d5d36John Reck/* If possible, enable traps for floating point exceptions */
1131176bdada62cabc6ec4b0308a930e83b679d5d36John Reckvoid enable_divbyzero_exceptions(void);
1141176bdada62cabc6ec4b0308a930e83b679d5d36John Reck
1151176bdada62cabc6ec4b0308a930e83b679d5d36John Reck/* Converts a8r8g8b8 pixels to pixels that
1161176bdada62cabc6ec4b0308a930e83b679d5d36John Reck *  - are not premultiplied,
1171176bdada62cabc6ec4b0308a930e83b679d5d36John Reck *  - are stored in this order in memory: R, G, B, A, regardless of
1181176bdada62cabc6ec4b0308a930e83b679d5d36John Reck *    the endianness of the computer.
1191176bdada62cabc6ec4b0308a930e83b679d5d36John Reck * It is allowed for @src and @dst to point to the same memory buffer.
1201176bdada62cabc6ec4b0308a930e83b679d5d36John Reck */
1211176bdada62cabc6ec4b0308a930e83b679d5d36John Reckvoid
1221176bdada62cabc6ec4b0308a930e83b679d5d36John Recka8r8g8b8_to_rgba_np (uint32_t *dst, uint32_t *src, int n_pixels);
1231176bdada62cabc6ec4b0308a930e83b679d5d36John Reck
1241176bdada62cabc6ec4b0308a930e83b679d5d36John Reckpixman_bool_t
1251176bdada62cabc6ec4b0308a930e83b679d5d36John Reckwrite_png (pixman_image_t *image, const char *filename);
1261176bdada62cabc6ec4b0308a930e83b679d5d36John Reck
1271176bdada62cabc6ec4b0308a930e83b679d5d36John Reckvoid
1281176bdada62cabc6ec4b0308a930e83b679d5d36John Reckdraw_checkerboard (pixman_image_t *image,
1291176bdada62cabc6ec4b0308a930e83b679d5d36John Reck		   int check_size,
1301176bdada62cabc6ec4b0308a930e83b679d5d36John Reck		   uint32_t color1, uint32_t color2);
1311176bdada62cabc6ec4b0308a930e83b679d5d36John Reck
1321176bdada62cabc6ec4b0308a930e83b679d5d36John Reck/* A pair of macros which can help to detect corruption of
1331176bdada62cabc6ec4b0308a930e83b679d5d36John Reck * floating point registers after a function call. This may
1341176bdada62cabc6ec4b0308a930e83b679d5d36John Reck * happen if _mm_empty() call is forgotten in MMX/SSE2 fast
1351176bdada62cabc6ec4b0308a930e83b679d5d36John Reck * path code, or ARM NEON assembly optimized function forgets
1361176bdada62cabc6ec4b0308a930e83b679d5d36John Reck * to save/restore d8-d15 registers before use.
1371176bdada62cabc6ec4b0308a930e83b679d5d36John Reck */
1381176bdada62cabc6ec4b0308a930e83b679d5d36John Reck
1391176bdada62cabc6ec4b0308a930e83b679d5d36John Reck#define FLOAT_REGS_CORRUPTION_DETECTOR_START()                 \
1401176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    static volatile double frcd_volatile_constant1 = 123451;   \
1411176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    static volatile double frcd_volatile_constant2 = 123452;   \
1421176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    static volatile double frcd_volatile_constant3 = 123453;   \
1431176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    static volatile double frcd_volatile_constant4 = 123454;   \
1441176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    static volatile double frcd_volatile_constant5 = 123455;   \
1451176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    static volatile double frcd_volatile_constant6 = 123456;   \
1461176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    static volatile double frcd_volatile_constant7 = 123457;   \
1471176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    static volatile double frcd_volatile_constant8 = 123458;   \
1481176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    double frcd_canary_variable1 = frcd_volatile_constant1;    \
1491176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    double frcd_canary_variable2 = frcd_volatile_constant2;    \
1501176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    double frcd_canary_variable3 = frcd_volatile_constant3;    \
1511176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    double frcd_canary_variable4 = frcd_volatile_constant4;    \
1521176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    double frcd_canary_variable5 = frcd_volatile_constant5;    \
1531176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    double frcd_canary_variable6 = frcd_volatile_constant6;    \
1541176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    double frcd_canary_variable7 = frcd_volatile_constant7;    \
1551176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    double frcd_canary_variable8 = frcd_volatile_constant8;
1561176bdada62cabc6ec4b0308a930e83b679d5d36John Reck
1571176bdada62cabc6ec4b0308a930e83b679d5d36John Reck#define FLOAT_REGS_CORRUPTION_DETECTOR_FINISH()                \
1581176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    assert (frcd_canary_variable1 == frcd_volatile_constant1); \
1591176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    assert (frcd_canary_variable2 == frcd_volatile_constant2); \
1601176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    assert (frcd_canary_variable3 == frcd_volatile_constant3); \
1611176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    assert (frcd_canary_variable4 == frcd_volatile_constant4); \
1621176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    assert (frcd_canary_variable5 == frcd_volatile_constant5); \
1631176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    assert (frcd_canary_variable6 == frcd_volatile_constant6); \
1641176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    assert (frcd_canary_variable7 == frcd_volatile_constant7); \
1651176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    assert (frcd_canary_variable8 == frcd_volatile_constant8);
1661176bdada62cabc6ec4b0308a930e83b679d5d36John Reck
1671176bdada62cabc6ec4b0308a930e83b679d5d36John Reck/* Try to get an aligned memory chunk */
1681176bdada62cabc6ec4b0308a930e83b679d5d36John Reckvoid *
1691176bdada62cabc6ec4b0308a930e83b679d5d36John Reckaligned_malloc (size_t align, size_t size);
1701176bdada62cabc6ec4b0308a930e83b679d5d36John Reck
1711176bdada62cabc6ec4b0308a930e83b679d5d36John Reckdouble
1721176bdada62cabc6ec4b0308a930e83b679d5d36John Reckconvert_srgb_to_linear (double component);
1731176bdada62cabc6ec4b0308a930e83b679d5d36John Reck
1741176bdada62cabc6ec4b0308a930e83b679d5d36John Reckdouble
1751176bdada62cabc6ec4b0308a930e83b679d5d36John Reckconvert_linear_to_srgb (double component);
1761176bdada62cabc6ec4b0308a930e83b679d5d36John Reck
1771176bdada62cabc6ec4b0308a930e83b679d5d36John Reckvoid
1781176bdada62cabc6ec4b0308a930e83b679d5d36John Reckinitialize_palette (pixman_indexed_t *palette, uint32_t depth, int is_rgb);
1791176bdada62cabc6ec4b0308a930e83b679d5d36John Reck
1801176bdada62cabc6ec4b0308a930e83b679d5d36John Reckconst char *
1811176bdada62cabc6ec4b0308a930e83b679d5d36John Reckoperator_name (pixman_op_t op);
1821176bdada62cabc6ec4b0308a930e83b679d5d36John Reck
1831176bdada62cabc6ec4b0308a930e83b679d5d36John Reckconst char *
1841176bdada62cabc6ec4b0308a930e83b679d5d36John Reckformat_name (pixman_format_code_t format);
1851176bdada62cabc6ec4b0308a930e83b679d5d36John Reck
1861176bdada62cabc6ec4b0308a930e83b679d5d36John Recktypedef struct
1871176bdada62cabc6ec4b0308a930e83b679d5d36John Reck{
1881176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    double r, g, b, a;
1891176bdada62cabc6ec4b0308a930e83b679d5d36John Reck} color_t;
1901176bdada62cabc6ec4b0308a930e83b679d5d36John Reck
1911176bdada62cabc6ec4b0308a930e83b679d5d36John Reckvoid
1921176bdada62cabc6ec4b0308a930e83b679d5d36John Reckdo_composite (pixman_op_t op,
1931176bdada62cabc6ec4b0308a930e83b679d5d36John Reck	      const color_t *src,
1941176bdada62cabc6ec4b0308a930e83b679d5d36John Reck	      const color_t *mask,
1951176bdada62cabc6ec4b0308a930e83b679d5d36John Reck	      const color_t *dst,
1961176bdada62cabc6ec4b0308a930e83b679d5d36John Reck	      color_t *result,
1971176bdada62cabc6ec4b0308a930e83b679d5d36John Reck	      pixman_bool_t component_alpha);
1981176bdada62cabc6ec4b0308a930e83b679d5d36John Reck
1991176bdada62cabc6ec4b0308a930e83b679d5d36John Reckvoid
2001176bdada62cabc6ec4b0308a930e83b679d5d36John Reckround_color (pixman_format_code_t format, color_t *color);
2011176bdada62cabc6ec4b0308a930e83b679d5d36John Reck
2021176bdada62cabc6ec4b0308a930e83b679d5d36John Recktypedef struct
2031176bdada62cabc6ec4b0308a930e83b679d5d36John Reck{
2041176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    pixman_format_code_t format;
2051176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    uint32_t am, rm, gm, bm;
2061176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    uint32_t as, rs, gs, bs;
2071176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    uint32_t aw, rw, gw, bw;
2081176bdada62cabc6ec4b0308a930e83b679d5d36John Reck} pixel_checker_t;
2091176bdada62cabc6ec4b0308a930e83b679d5d36John Reck
2101176bdada62cabc6ec4b0308a930e83b679d5d36John Reckvoid
2111176bdada62cabc6ec4b0308a930e83b679d5d36John Reckpixel_checker_init (pixel_checker_t *checker, pixman_format_code_t format);
2121176bdada62cabc6ec4b0308a930e83b679d5d36John Reck
2131176bdada62cabc6ec4b0308a930e83b679d5d36John Reckvoid
2141176bdada62cabc6ec4b0308a930e83b679d5d36John Reckpixel_checker_split_pixel (const pixel_checker_t *checker, uint32_t pixel,
2151176bdada62cabc6ec4b0308a930e83b679d5d36John Reck			   int *a, int *r, int *g, int *b);
2161176bdada62cabc6ec4b0308a930e83b679d5d36John Reck
2171176bdada62cabc6ec4b0308a930e83b679d5d36John Reckvoid
2181176bdada62cabc6ec4b0308a930e83b679d5d36John Reckpixel_checker_get_max (const pixel_checker_t *checker, color_t *color,
2191176bdada62cabc6ec4b0308a930e83b679d5d36John Reck		       int *a, int *r, int *g, int *b);
2201176bdada62cabc6ec4b0308a930e83b679d5d36John Reck
2211176bdada62cabc6ec4b0308a930e83b679d5d36John Reckvoid
2221176bdada62cabc6ec4b0308a930e83b679d5d36John Reckpixel_checker_get_min (const pixel_checker_t *checker, color_t *color,
2231176bdada62cabc6ec4b0308a930e83b679d5d36John Reck		       int *a, int *r, int *g, int *b);
2241176bdada62cabc6ec4b0308a930e83b679d5d36John Reck
2251176bdada62cabc6ec4b0308a930e83b679d5d36John Reckpixman_bool_t
2261176bdada62cabc6ec4b0308a930e83b679d5d36John Reckpixel_checker_check (const pixel_checker_t *checker,
2271176bdada62cabc6ec4b0308a930e83b679d5d36John Reck		     uint32_t pixel, color_t *color);
2281176bdada62cabc6ec4b0308a930e83b679d5d36John Reck
2291176bdada62cabc6ec4b0308a930e83b679d5d36John Reckvoid
2301176bdada62cabc6ec4b0308a930e83b679d5d36John Reckpixel_checker_convert_pixel_to_color (const pixel_checker_t *checker,
2311176bdada62cabc6ec4b0308a930e83b679d5d36John Reck                                      uint32_t pixel, color_t *color);
2321176bdada62cabc6ec4b0308a930e83b679d5d36John Reck
2331176bdada62cabc6ec4b0308a930e83b679d5d36John Reckvoid
2341176bdada62cabc6ec4b0308a930e83b679d5d36John Reckpixel_checker_get_masks (const pixel_checker_t *checker,
2351176bdada62cabc6ec4b0308a930e83b679d5d36John Reck                         uint32_t              *am,
2361176bdada62cabc6ec4b0308a930e83b679d5d36John Reck                         uint32_t              *rm,
2371176bdada62cabc6ec4b0308a930e83b679d5d36John Reck                         uint32_t              *gm,
2381176bdada62cabc6ec4b0308a930e83b679d5d36John Reck                         uint32_t              *bm);
239