~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

TOMOYO Linux Cross Reference
Linux/lib/test_bitmap.c

Version: ~ [ linux-5.12-rc1 ] ~ [ linux-5.11.2 ] ~ [ linux-5.10.19 ] ~ [ linux-5.9.16 ] ~ [ linux-5.8.18 ] ~ [ linux-5.7.19 ] ~ [ linux-5.6.19 ] ~ [ linux-5.5.19 ] ~ [ linux-5.4.101 ] ~ [ linux-5.3.18 ] ~ [ linux-5.2.21 ] ~ [ linux-5.1.21 ] ~ [ linux-5.0.21 ] ~ [ linux-4.20.17 ] ~ [ linux-4.19.177 ] ~ [ linux-4.18.20 ] ~ [ linux-4.17.19 ] ~ [ linux-4.16.18 ] ~ [ linux-4.15.18 ] ~ [ linux-4.14.222 ] ~ [ linux-4.13.16 ] ~ [ linux-4.12.14 ] ~ [ linux-4.11.12 ] ~ [ linux-4.10.17 ] ~ [ linux-4.9.258 ] ~ [ linux-4.8.17 ] ~ [ linux-4.7.10 ] ~ [ linux-4.6.7 ] ~ [ linux-4.5.7 ] ~ [ linux-4.4.258 ] ~ [ linux-4.3.6 ] ~ [ linux-4.2.8 ] ~ [ linux-4.1.52 ] ~ [ linux-4.0.9 ] ~ [ linux-3.18.140 ] ~ [ linux-3.16.85 ] ~ [ linux-3.14.79 ] ~ [ linux-3.12.74 ] ~ [ linux-3.10.108 ] ~ [ linux-2.6.32.71 ] ~ [ linux-2.6.0 ] ~ [ linux-2.4.37.11 ] ~ [ unix-v6-master ] ~ [ ccs-tools-1.8.5 ] ~ [ policy-sample ] ~
Architecture: ~ [ i386 ] ~ [ alpha ] ~ [ m68k ] ~ [ mips ] ~ [ ppc ] ~ [ sparc ] ~ [ sparc64 ] ~

  1 // SPDX-License-Identifier: GPL-2.0-only
  2 /*
  3  * Test cases for bitmap API.
  4  */
  5 
  6 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
  7 
  8 #include <linux/bitmap.h>
  9 #include <linux/init.h>
 10 #include <linux/kernel.h>
 11 #include <linux/module.h>
 12 #include <linux/printk.h>
 13 #include <linux/slab.h>
 14 #include <linux/string.h>
 15 #include <linux/uaccess.h>
 16 
 17 #include "../tools/testing/selftests/kselftest_module.h"
 18 
 19 static unsigned total_tests __initdata;
 20 static unsigned failed_tests __initdata;
 21 
 22 static char pbl_buffer[PAGE_SIZE] __initdata;
 23 
 24 static const unsigned long exp1[] __initconst = {
 25         BITMAP_FROM_U64(1),
 26         BITMAP_FROM_U64(2),
 27         BITMAP_FROM_U64(0x0000ffff),
 28         BITMAP_FROM_U64(0xffff0000),
 29         BITMAP_FROM_U64(0x55555555),
 30         BITMAP_FROM_U64(0xaaaaaaaa),
 31         BITMAP_FROM_U64(0x11111111),
 32         BITMAP_FROM_U64(0x22222222),
 33         BITMAP_FROM_U64(0xffffffff),
 34         BITMAP_FROM_U64(0xfffffffe),
 35         BITMAP_FROM_U64(0x3333333311111111ULL),
 36         BITMAP_FROM_U64(0xffffffff77777777ULL),
 37         BITMAP_FROM_U64(0),
 38 };
 39 
 40 static const unsigned long exp2[] __initconst = {
 41         BITMAP_FROM_U64(0x3333333311111111ULL),
 42         BITMAP_FROM_U64(0xffffffff77777777ULL),
 43 };
 44 
 45 /* Fibonacci sequence */
 46 static const unsigned long exp2_to_exp3_mask[] __initconst = {
 47         BITMAP_FROM_U64(0x008000020020212eULL),
 48 };
 49 /* exp3_0_1 = (exp2[0] & ~exp2_to_exp3_mask) | (exp2[1] & exp2_to_exp3_mask) */
 50 static const unsigned long exp3_0_1[] __initconst = {
 51         BITMAP_FROM_U64(0x33b3333311313137ULL),
 52 };
 53 /* exp3_1_0 = (exp2[1] & ~exp2_to_exp3_mask) | (exp2[0] & exp2_to_exp3_mask) */
 54 static const unsigned long exp3_1_0[] __initconst = {
 55         BITMAP_FROM_U64(0xff7fffff77575751ULL),
 56 };
 57 
 58 static bool __init
 59 __check_eq_uint(const char *srcfile, unsigned int line,
 60                 const unsigned int exp_uint, unsigned int x)
 61 {
 62         if (exp_uint != x) {
 63                 pr_err("[%s:%u] expected %u, got %u\n",
 64                         srcfile, line, exp_uint, x);
 65                 return false;
 66         }
 67         return true;
 68 }
 69 
 70 
 71 static bool __init
 72 __check_eq_bitmap(const char *srcfile, unsigned int line,
 73                   const unsigned long *exp_bmap, const unsigned long *bmap,
 74                   unsigned int nbits)
 75 {
 76         if (!bitmap_equal(exp_bmap, bmap, nbits)) {
 77                 pr_warn("[%s:%u] bitmaps contents differ: expected \"%*pbl\", got \"%*pbl\"\n",
 78                         srcfile, line,
 79                         nbits, exp_bmap, nbits, bmap);
 80                 return false;
 81         }
 82         return true;
 83 }
 84 
 85 static bool __init
 86 __check_eq_pbl(const char *srcfile, unsigned int line,
 87                const char *expected_pbl,
 88                const unsigned long *bitmap, unsigned int nbits)
 89 {
 90         snprintf(pbl_buffer, sizeof(pbl_buffer), "%*pbl", nbits, bitmap);
 91         if (strcmp(expected_pbl, pbl_buffer)) {
 92                 pr_warn("[%s:%u] expected \"%s\", got \"%s\"\n",
 93                         srcfile, line,
 94                         expected_pbl, pbl_buffer);
 95                 return false;
 96         }
 97         return true;
 98 }
 99 
100 static bool __init
101 __check_eq_u32_array(const char *srcfile, unsigned int line,
102                      const u32 *exp_arr, unsigned int exp_len,
103                      const u32 *arr, unsigned int len) __used;
104 static bool __init
105 __check_eq_u32_array(const char *srcfile, unsigned int line,
106                      const u32 *exp_arr, unsigned int exp_len,
107                      const u32 *arr, unsigned int len)
108 {
109         if (exp_len != len) {
110                 pr_warn("[%s:%u] array length differ: expected %u, got %u\n",
111                         srcfile, line,
112                         exp_len, len);
113                 return false;
114         }
115 
116         if (memcmp(exp_arr, arr, len*sizeof(*arr))) {
117                 pr_warn("[%s:%u] array contents differ\n", srcfile, line);
118                 print_hex_dump(KERN_WARNING, "  exp:  ", DUMP_PREFIX_OFFSET,
119                                32, 4, exp_arr, exp_len*sizeof(*exp_arr), false);
120                 print_hex_dump(KERN_WARNING, "  got:  ", DUMP_PREFIX_OFFSET,
121                                32, 4, arr, len*sizeof(*arr), false);
122                 return false;
123         }
124 
125         return true;
126 }
127 
128 static bool __init __check_eq_clump8(const char *srcfile, unsigned int line,
129                                     const unsigned int offset,
130                                     const unsigned int size,
131                                     const unsigned char *const clump_exp,
132                                     const unsigned long *const clump)
133 {
134         unsigned long exp;
135 
136         if (offset >= size) {
137                 pr_warn("[%s:%u] bit offset for clump out-of-bounds: expected less than %u, got %u\n",
138                         srcfile, line, size, offset);
139                 return false;
140         }
141 
142         exp = clump_exp[offset / 8];
143         if (!exp) {
144                 pr_warn("[%s:%u] bit offset for zero clump: expected nonzero clump, got bit offset %u with clump value 0",
145                         srcfile, line, offset);
146                 return false;
147         }
148 
149         if (*clump != exp) {
150                 pr_warn("[%s:%u] expected clump value of 0x%lX, got clump value of 0x%lX",
151                         srcfile, line, exp, *clump);
152                 return false;
153         }
154 
155         return true;
156 }
157 
158 #define __expect_eq(suffix, ...)                                        \
159         ({                                                              \
160                 int result = 0;                                         \
161                 total_tests++;                                          \
162                 if (!__check_eq_ ## suffix(__FILE__, __LINE__,          \
163                                            ##__VA_ARGS__)) {            \
164                         failed_tests++;                                 \
165                         result = 1;                                     \
166                 }                                                       \
167                 result;                                                 \
168         })
169 
170 #define expect_eq_uint(...)             __expect_eq(uint, ##__VA_ARGS__)
171 #define expect_eq_bitmap(...)           __expect_eq(bitmap, ##__VA_ARGS__)
172 #define expect_eq_pbl(...)              __expect_eq(pbl, ##__VA_ARGS__)
173 #define expect_eq_u32_array(...)        __expect_eq(u32_array, ##__VA_ARGS__)
174 #define expect_eq_clump8(...)           __expect_eq(clump8, ##__VA_ARGS__)
175 
176 static void __init test_zero_clear(void)
177 {
178         DECLARE_BITMAP(bmap, 1024);
179 
180         /* Known way to set all bits */
181         memset(bmap, 0xff, 128);
182 
183         expect_eq_pbl("0-22", bmap, 23);
184         expect_eq_pbl("0-1023", bmap, 1024);
185 
186         /* single-word bitmaps */
187         bitmap_clear(bmap, 0, 9);
188         expect_eq_pbl("9-1023", bmap, 1024);
189 
190         bitmap_zero(bmap, 35);
191         expect_eq_pbl("64-1023", bmap, 1024);
192 
193         /* cross boundaries operations */
194         bitmap_clear(bmap, 79, 19);
195         expect_eq_pbl("64-78,98-1023", bmap, 1024);
196 
197         bitmap_zero(bmap, 115);
198         expect_eq_pbl("128-1023", bmap, 1024);
199 
200         /* Zeroing entire area */
201         bitmap_zero(bmap, 1024);
202         expect_eq_pbl("", bmap, 1024);
203 }
204 
205 static void __init test_fill_set(void)
206 {
207         DECLARE_BITMAP(bmap, 1024);
208 
209         /* Known way to clear all bits */
210         memset(bmap, 0x00, 128);
211 
212         expect_eq_pbl("", bmap, 23);
213         expect_eq_pbl("", bmap, 1024);
214 
215         /* single-word bitmaps */
216         bitmap_set(bmap, 0, 9);
217         expect_eq_pbl("0-8", bmap, 1024);
218 
219         bitmap_fill(bmap, 35);
220         expect_eq_pbl("0-63", bmap, 1024);
221 
222         /* cross boundaries operations */
223         bitmap_set(bmap, 79, 19);
224         expect_eq_pbl("0-63,79-97", bmap, 1024);
225 
226         bitmap_fill(bmap, 115);
227         expect_eq_pbl("0-127", bmap, 1024);
228 
229         /* Zeroing entire area */
230         bitmap_fill(bmap, 1024);
231         expect_eq_pbl("0-1023", bmap, 1024);
232 }
233 
234 static void __init test_copy(void)
235 {
236         DECLARE_BITMAP(bmap1, 1024);
237         DECLARE_BITMAP(bmap2, 1024);
238 
239         bitmap_zero(bmap1, 1024);
240         bitmap_zero(bmap2, 1024);
241 
242         /* single-word bitmaps */
243         bitmap_set(bmap1, 0, 19);
244         bitmap_copy(bmap2, bmap1, 23);
245         expect_eq_pbl("0-18", bmap2, 1024);
246 
247         bitmap_set(bmap2, 0, 23);
248         bitmap_copy(bmap2, bmap1, 23);
249         expect_eq_pbl("0-18", bmap2, 1024);
250 
251         /* multi-word bitmaps */
252         bitmap_set(bmap1, 0, 109);
253         bitmap_copy(bmap2, bmap1, 1024);
254         expect_eq_pbl("0-108", bmap2, 1024);
255 
256         bitmap_fill(bmap2, 1024);
257         bitmap_copy(bmap2, bmap1, 1024);
258         expect_eq_pbl("0-108", bmap2, 1024);
259 
260         /* the following tests assume a 32- or 64-bit arch (even 128b
261          * if we care)
262          */
263 
264         bitmap_fill(bmap2, 1024);
265         bitmap_copy(bmap2, bmap1, 109);  /* ... but 0-padded til word length */
266         expect_eq_pbl("0-108,128-1023", bmap2, 1024);
267 
268         bitmap_fill(bmap2, 1024);
269         bitmap_copy(bmap2, bmap1, 97);  /* ... but aligned on word length */
270         expect_eq_pbl("0-108,128-1023", bmap2, 1024);
271 }
272 
273 #define EXP2_IN_BITS    (sizeof(exp2) * 8)
274 
275 static void __init test_replace(void)
276 {
277         unsigned int nbits = 64;
278         unsigned int nlongs = DIV_ROUND_UP(nbits, BITS_PER_LONG);
279         DECLARE_BITMAP(bmap, 1024);
280 
281         bitmap_zero(bmap, 1024);
282         bitmap_replace(bmap, &exp2[0 * nlongs], &exp2[1 * nlongs], exp2_to_exp3_mask, nbits);
283         expect_eq_bitmap(bmap, exp3_0_1, nbits);
284 
285         bitmap_zero(bmap, 1024);
286         bitmap_replace(bmap, &exp2[1 * nlongs], &exp2[0 * nlongs], exp2_to_exp3_mask, nbits);
287         expect_eq_bitmap(bmap, exp3_1_0, nbits);
288 
289         bitmap_fill(bmap, 1024);
290         bitmap_replace(bmap, &exp2[0 * nlongs], &exp2[1 * nlongs], exp2_to_exp3_mask, nbits);
291         expect_eq_bitmap(bmap, exp3_0_1, nbits);
292 
293         bitmap_fill(bmap, 1024);
294         bitmap_replace(bmap, &exp2[1 * nlongs], &exp2[0 * nlongs], exp2_to_exp3_mask, nbits);
295         expect_eq_bitmap(bmap, exp3_1_0, nbits);
296 }
297 
298 #define PARSE_TIME 0x1
299 
300 struct test_bitmap_parselist{
301         const int errno;
302         const char *in;
303         const unsigned long *expected;
304         const int nbits;
305         const int flags;
306 };
307 
308 static const struct test_bitmap_parselist parselist_tests[] __initconst = {
309 #define step (sizeof(u64) / sizeof(unsigned long))
310 
311         {0, "",                        &exp1[0], 8, 0},
312         {0, "1",                        &exp1[1 * step], 8, 0},
313         {0, "0-15",                     &exp1[2 * step], 32, 0},
314         {0, "16-31",                    &exp1[3 * step], 32, 0},
315         {0, "0-31:1/2",                 &exp1[4 * step], 32, 0},
316         {0, "1-31:1/2",                 &exp1[5 * step], 32, 0},
317         {0, "0-31:1/4",                 &exp1[6 * step], 32, 0},
318         {0, "1-31:1/4",                 &exp1[7 * step], 32, 0},
319         {0, "0-31:4/4",                 &exp1[8 * step], 32, 0},
320         {0, "1-31:4/4",                 &exp1[9 * step], 32, 0},
321         {0, "0-31:1/4,32-63:2/4",       &exp1[10 * step], 64, 0},
322         {0, "0-31:3/4,32-63:4/4",       &exp1[11 * step], 64, 0},
323         {0, "  ,,  0-31:3/4  ,, 32-63:4/4  ,,  ",       &exp1[11 * step], 64, 0},
324 
325         {0, "0-31:1/4,32-63:2/4,64-95:3/4,96-127:4/4",  exp2, 128, 0},
326 
327         {0, "0-2047:128/256", NULL, 2048, PARSE_TIME},
328 
329         {0, "",                         &exp1[12 * step], 8, 0},
330         {0, "\n",                       &exp1[12 * step], 8, 0},
331         {0, ",,  ,,  , ,  ,",           &exp1[12 * step], 8, 0},
332         {0, " ,  ,,  , ,   ",           &exp1[12 * step], 8, 0},
333         {0, " ,  ,,  , ,   \n",         &exp1[12 * step], 8, 0},
334 
335         {-EINVAL, "-1", NULL, 8, 0},
336         {-EINVAL, "-0", NULL, 8, 0},
337         {-EINVAL, "10-1", NULL, 8, 0},
338         {-EINVAL, "0-31:", NULL, 8, 0},
339         {-EINVAL, "0-31:0", NULL, 8, 0},
340         {-EINVAL, "0-31:0/", NULL, 8, 0},
341         {-EINVAL, "0-31:0/0", NULL, 8, 0},
342         {-EINVAL, "0-31:1/0", NULL, 8, 0},
343         {-EINVAL, "0-31:10/1", NULL, 8, 0},
344         {-EOVERFLOW, "0-98765432123456789:10/1", NULL, 8, 0},
345 
346         {-EINVAL, "a-31", NULL, 8, 0},
347         {-EINVAL, "0-a1", NULL, 8, 0},
348         {-EINVAL, "a-31:10/1", NULL, 8, 0},
349         {-EINVAL, "0-31:a/1", NULL, 8, 0},
350         {-EINVAL, "0-\n", NULL, 8, 0},
351 
352 #undef step
353 };
354 
355 static void __init __test_bitmap_parselist(int is_user)
356 {
357         int i;
358         int err;
359         ktime_t time;
360         DECLARE_BITMAP(bmap, 2048);
361         char *mode = is_user ? "_user"  : "";
362 
363         for (i = 0; i < ARRAY_SIZE(parselist_tests); i++) {
364 #define ptest parselist_tests[i]
365 
366                 if (is_user) {
367                         mm_segment_t orig_fs = get_fs();
368                         size_t len = strlen(ptest.in);
369 
370                         set_fs(KERNEL_DS);
371                         time = ktime_get();
372                         err = bitmap_parselist_user((__force const char __user *)ptest.in, len,
373                                                     bmap, ptest.nbits);
374                         time = ktime_get() - time;
375                         set_fs(orig_fs);
376                 } else {
377                         time = ktime_get();
378                         err = bitmap_parselist(ptest.in, bmap, ptest.nbits);
379                         time = ktime_get() - time;
380                 }
381 
382                 if (err != ptest.errno) {
383                         pr_err("parselist%s: %d: input is %s, errno is %d, expected %d\n",
384                                         mode, i, ptest.in, err, ptest.errno);
385                         continue;
386                 }
387 
388                 if (!err && ptest.expected
389                          && !__bitmap_equal(bmap, ptest.expected, ptest.nbits)) {
390                         pr_err("parselist%s: %d: input is %s, result is 0x%lx, expected 0x%lx\n",
391                                         mode, i, ptest.in, bmap[0],
392                                         *ptest.expected);
393                         continue;
394                 }
395 
396                 if (ptest.flags & PARSE_TIME)
397                         pr_err("parselist%s: %d: input is '%s' OK, Time: %llu\n",
398                                         mode, i, ptest.in, time);
399 
400 #undef ptest
401         }
402 }
403 
404 static void __init test_bitmap_parselist(void)
405 {
406         __test_bitmap_parselist(0);
407 }
408 
409 static void __init test_bitmap_parselist_user(void)
410 {
411         __test_bitmap_parselist(1);
412 }
413 
414 #define EXP1_IN_BITS    (sizeof(exp1) * 8)
415 
416 static void __init test_bitmap_arr32(void)
417 {
418         unsigned int nbits, next_bit;
419         u32 arr[EXP1_IN_BITS / 32];
420         DECLARE_BITMAP(bmap2, EXP1_IN_BITS);
421 
422         memset(arr, 0xa5, sizeof(arr));
423 
424         for (nbits = 0; nbits < EXP1_IN_BITS; ++nbits) {
425                 bitmap_to_arr32(arr, exp1, nbits);
426                 bitmap_from_arr32(bmap2, arr, nbits);
427                 expect_eq_bitmap(bmap2, exp1, nbits);
428 
429                 next_bit = find_next_bit(bmap2,
430                                 round_up(nbits, BITS_PER_LONG), nbits);
431                 if (next_bit < round_up(nbits, BITS_PER_LONG))
432                         pr_err("bitmap_copy_arr32(nbits == %d:"
433                                 " tail is not safely cleared: %d\n",
434                                 nbits, next_bit);
435 
436                 if (nbits < EXP1_IN_BITS - 32)
437                         expect_eq_uint(arr[DIV_ROUND_UP(nbits, 32)],
438                                                                 0xa5a5a5a5);
439         }
440 }
441 
442 static void noinline __init test_mem_optimisations(void)
443 {
444         DECLARE_BITMAP(bmap1, 1024);
445         DECLARE_BITMAP(bmap2, 1024);
446         unsigned int start, nbits;
447 
448         for (start = 0; start < 1024; start += 8) {
449                 for (nbits = 0; nbits < 1024 - start; nbits += 8) {
450                         memset(bmap1, 0x5a, sizeof(bmap1));
451                         memset(bmap2, 0x5a, sizeof(bmap2));
452 
453                         bitmap_set(bmap1, start, nbits);
454                         __bitmap_set(bmap2, start, nbits);
455                         if (!bitmap_equal(bmap1, bmap2, 1024)) {
456                                 printk("set not equal %d %d\n", start, nbits);
457                                 failed_tests++;
458                         }
459                         if (!__bitmap_equal(bmap1, bmap2, 1024)) {
460                                 printk("set not __equal %d %d\n", start, nbits);
461                                 failed_tests++;
462                         }
463 
464                         bitmap_clear(bmap1, start, nbits);
465                         __bitmap_clear(bmap2, start, nbits);
466                         if (!bitmap_equal(bmap1, bmap2, 1024)) {
467                                 printk("clear not equal %d %d\n", start, nbits);
468                                 failed_tests++;
469                         }
470                         if (!__bitmap_equal(bmap1, bmap2, 1024)) {
471                                 printk("clear not __equal %d %d\n", start,
472                                                                         nbits);
473                                 failed_tests++;
474                         }
475                 }
476         }
477 }
478 
479 static const unsigned char clump_exp[] __initconst = {
480         0x01,   /* 1 bit set */
481         0x02,   /* non-edge 1 bit set */
482         0x00,   /* zero bits set */
483         0x38,   /* 3 bits set across 4-bit boundary */
484         0x38,   /* Repeated clump */
485         0x0F,   /* 4 bits set */
486         0xFF,   /* all bits set */
487         0x05,   /* non-adjacent 2 bits set */
488 };
489 
490 static void __init test_for_each_set_clump8(void)
491 {
492 #define CLUMP_EXP_NUMBITS 64
493         DECLARE_BITMAP(bits, CLUMP_EXP_NUMBITS);
494         unsigned int start;
495         unsigned long clump;
496 
497         /* set bitmap to test case */
498         bitmap_zero(bits, CLUMP_EXP_NUMBITS);
499         bitmap_set(bits, 0, 1);         /* 0x01 */
500         bitmap_set(bits, 9, 1);         /* 0x02 */
501         bitmap_set(bits, 27, 3);        /* 0x28 */
502         bitmap_set(bits, 35, 3);        /* 0x28 */
503         bitmap_set(bits, 40, 4);        /* 0x0F */
504         bitmap_set(bits, 48, 8);        /* 0xFF */
505         bitmap_set(bits, 56, 1);        /* 0x05 - part 1 */
506         bitmap_set(bits, 58, 1);        /* 0x05 - part 2 */
507 
508         for_each_set_clump8(start, clump, bits, CLUMP_EXP_NUMBITS)
509                 expect_eq_clump8(start, CLUMP_EXP_NUMBITS, clump_exp, &clump);
510 }
511 
512 static void __init selftest(void)
513 {
514         test_zero_clear();
515         test_fill_set();
516         test_copy();
517         test_replace();
518         test_bitmap_arr32();
519         test_bitmap_parselist();
520         test_bitmap_parselist_user();
521         test_mem_optimisations();
522         test_for_each_set_clump8();
523 }
524 
525 KSTM_MODULE_LOADERS(test_bitmap);
526 MODULE_AUTHOR("david decotigny <david.decotigny@googlers.com>");
527 MODULE_LICENSE("GPL");
528 

~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

kernel.org | git.kernel.org | LWN.net | Project Home | Wiki (Japanese) | Wiki (English) | SVN repository | Mail admin

Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.

osdn.jp