#include /* * Verification test for div64_u64. */ #ifndef abs64 #define abs64(x) ({ \ s64 __x = (x); \ (__x < 0) ? -__x : __x; \ }) #endif int div64_u64_test(void) { u64 uu, vu, qu, ru; int n, i, j, errors = 0; const u64 tabu[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 1000, 2003, 32765, 32766, 32767, 32768, 32769, 32760, 65533, 65534, 65535, 65536, 65537, 65538, 0x7ffffffeULL, 0x7fffffffULL, 0x80000000ULL, 0x80000001ULL, 0x7000000000000000ULL, 0x7000000080000000ULL, 0x7000000080000001ULL, 0x7fffffffffffffffULL, 0x7fffffff8fffffffULL, 0x7fffffff8ffffff1ULL, 0x7fffffff00000000ULL, 0x7fffffff80000000ULL, 0x7fffffff00000001ULL, 0x8000000000000000ULL, 0x8000000080000000ULL, 0x8000000080000001ULL, 0xc000000000000000ULL, 0xc000000080000000ULL, 0xc000000080000001ULL, 0xfffffffffffffffdULL, 0xfffffffffffffffeULL, 0xffffffffffffffffULL, }; printk("%s", "Testing unsigned 64-bit division.\n"); n = sizeof(tabu) / sizeof(tabu[0]); for (i = 0; i < n; i++) { for (j = 1; j < n; j++) { uu = tabu[i]; vu = tabu[j]; qu = div64_u64(uu, vu); ru = uu - qu * vu; if (qu > uu || ru >= vu) { printk("%016llx/%016llx != %016llx " "rem %016llx\n", uu, vu, qu, ru); errors++; } } } if (errors) { printk("Failed %d/%d tests\n", errors, n * (n - 1)); } else { printk("Passed all %d tests\n", n * (n - 1)); } return 0; } void div64_u64_exit(void) { } module_init(div64_u64_test); module_exit(div64_u64_exit);