From 3815190d52f8ae453c2458335394eb5b18ab9bf5 Mon Sep 17 00:00:00 2001 From: marha Date: Tue, 14 Sep 2010 13:17:20 +0000 Subject: xserver libX11 pixman git update 14/9/2010 --- pixman/test/blitters-test.c | 3 ++- pixman/test/scaling-test.c | 3 +++ pixman/test/utils.h | 36 ++++++++++++++++++++++++++++++++++++ 3 files changed, 41 insertions(+), 1 deletion(-) (limited to 'pixman/test') diff --git a/pixman/test/blitters-test.c b/pixman/test/blitters-test.c index 1340e081a..a61817d96 100644 --- a/pixman/test/blitters-test.c +++ b/pixman/test/blitters-test.c @@ -267,6 +267,7 @@ test_composite (int testnum, int verbose) uint32_t *dstbuf, *srcbuf, *maskbuf; uint32_t crc32; int max_width, max_height, max_extra_stride; + FLOAT_REGS_CORRUPTION_DETECTOR_START (); max_width = max_height = 24 + testnum / 10000; max_extra_stride = 4 + testnum / 1000000; @@ -410,7 +411,7 @@ test_composite (int testnum, int verbose) free_random_image (0, mask_img, -1); } - + FLOAT_REGS_CORRUPTION_DETECTOR_FINISH (); return crc32; } diff --git a/pixman/test/scaling-test.c b/pixman/test/scaling-test.c index 54236faa3..872805338 100644 --- a/pixman/test/scaling-test.c +++ b/pixman/test/scaling-test.c @@ -46,6 +46,7 @@ test_composite (int testnum, uint32_t * srcbuf; uint32_t * dstbuf; uint32_t crc32; + FLOAT_REGS_CORRUPTION_DETECTOR_START (); lcg_srand (testnum); @@ -234,6 +235,8 @@ test_composite (int testnum, crc32 = compute_crc32 (0, dstbuf, dst_stride * dst_height); free (srcbuf); free (dstbuf); + + FLOAT_REGS_CORRUPTION_DETECTOR_FINISH (); return crc32; } diff --git a/pixman/test/utils.h b/pixman/test/utils.h index a5b3c91c4..ab71452a4 100644 --- a/pixman/test/utils.h +++ b/pixman/test/utils.h @@ -1,5 +1,6 @@ #include #include +#include #include "pixman-private.h" /* For 'inline' definition */ /* A primitive pseudorandom number generator, @@ -65,3 +66,38 @@ fuzzer_test_main (const char *test_name, void fail_after (int seconds, const char *msg); + +/* A pair of macros which can help to detect corruption of + * floating point registers after a function call. This may + * happen if _mm_empty() call is forgotten in MMX/SSE2 fast + * path code, or ARM NEON assembly optimized function forgets + * to save/restore d8-d15 registers before use. + */ + +#define FLOAT_REGS_CORRUPTION_DETECTOR_START() \ + static volatile double frcd_volatile_constant1 = 123451; \ + static volatile double frcd_volatile_constant2 = 123452; \ + static volatile double frcd_volatile_constant3 = 123453; \ + static volatile double frcd_volatile_constant4 = 123454; \ + static volatile double frcd_volatile_constant5 = 123455; \ + static volatile double frcd_volatile_constant6 = 123456; \ + static volatile double frcd_volatile_constant7 = 123457; \ + static volatile double frcd_volatile_constant8 = 123458; \ + double frcd_canary_variable1 = frcd_volatile_constant1; \ + double frcd_canary_variable2 = frcd_volatile_constant2; \ + double frcd_canary_variable3 = frcd_volatile_constant3; \ + double frcd_canary_variable4 = frcd_volatile_constant4; \ + double frcd_canary_variable5 = frcd_volatile_constant5; \ + double frcd_canary_variable6 = frcd_volatile_constant6; \ + double frcd_canary_variable7 = frcd_volatile_constant7; \ + double frcd_canary_variable8 = frcd_volatile_constant8; + +#define FLOAT_REGS_CORRUPTION_DETECTOR_FINISH() \ + assert (frcd_canary_variable1 == frcd_volatile_constant1); \ + assert (frcd_canary_variable2 == frcd_volatile_constant2); \ + assert (frcd_canary_variable3 == frcd_volatile_constant3); \ + assert (frcd_canary_variable4 == frcd_volatile_constant4); \ + assert (frcd_canary_variable5 == frcd_volatile_constant5); \ + assert (frcd_canary_variable6 == frcd_volatile_constant6); \ + assert (frcd_canary_variable7 == frcd_volatile_constant7); \ + assert (frcd_canary_variable8 == frcd_volatile_constant8); -- cgit v1.2.3