xref: /openbmc/linux/fs/exfat/nls.c (revision 512b74d1)
1370e812bSNamjae Jeon // SPDX-License-Identifier: GPL-2.0-or-later
2370e812bSNamjae Jeon /*
3370e812bSNamjae Jeon  * Copyright (C) 2012-2013 Samsung Electronics Co., Ltd.
4370e812bSNamjae Jeon  */
5370e812bSNamjae Jeon 
6370e812bSNamjae Jeon #include <linux/string.h>
7370e812bSNamjae Jeon #include <linux/slab.h>
8370e812bSNamjae Jeon #include <linux/buffer_head.h>
9370e812bSNamjae Jeon #include <asm/unaligned.h>
10370e812bSNamjae Jeon 
11370e812bSNamjae Jeon #include "exfat_raw.h"
12370e812bSNamjae Jeon #include "exfat_fs.h"
13370e812bSNamjae Jeon 
149e456aeaSNamjae Jeon /* Upcase table macro */
15370e812bSNamjae Jeon #define EXFAT_NUM_UPCASE	(2918)
16370e812bSNamjae Jeon #define UTBL_COUNT		(0x10000)
17370e812bSNamjae Jeon 
18370e812bSNamjae Jeon /*
19370e812bSNamjae Jeon  * Upcase table in compressed format (7.2.5.1 Recommended Up-case Table
20370e812bSNamjae Jeon  * in exfat specification, See:
21370e812bSNamjae Jeon  * https://docs.microsoft.com/en-us/windows/win32/fileio/exfat-specification).
22370e812bSNamjae Jeon  */
23370e812bSNamjae Jeon static const unsigned short uni_def_upcase[EXFAT_NUM_UPCASE] = {
24370e812bSNamjae Jeon 	0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007,
25370e812bSNamjae Jeon 	0x0008, 0x0009, 0x000a, 0x000b, 0x000c, 0x000d, 0x000e, 0x000f,
26370e812bSNamjae Jeon 	0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017,
27370e812bSNamjae Jeon 	0x0018, 0x0019, 0x001a, 0x001b, 0x001c, 0x001d, 0x001e, 0x001f,
28370e812bSNamjae Jeon 	0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027,
29370e812bSNamjae Jeon 	0x0028, 0x0029, 0x002a, 0x002b, 0x002c, 0x002d, 0x002e, 0x002f,
30370e812bSNamjae Jeon 	0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037,
31370e812bSNamjae Jeon 	0x0038, 0x0039, 0x003a, 0x003b, 0x003c, 0x003d, 0x003e, 0x003f,
32370e812bSNamjae Jeon 	0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047,
33370e812bSNamjae Jeon 	0x0048, 0x0049, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f,
34370e812bSNamjae Jeon 	0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057,
35370e812bSNamjae Jeon 	0x0058, 0x0059, 0x005a, 0x005b, 0x005c, 0x005d, 0x005e, 0x005f,
36370e812bSNamjae Jeon 	0x0060, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047,
37370e812bSNamjae Jeon 	0x0048, 0x0049, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f,
38370e812bSNamjae Jeon 	0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057,
39370e812bSNamjae Jeon 	0x0058, 0x0059, 0x005a, 0x007b, 0x007c, 0x007d, 0x007e, 0x007f,
40370e812bSNamjae Jeon 	0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087,
41370e812bSNamjae Jeon 	0x0088, 0x0089, 0x008a, 0x008b, 0x008c, 0x008d, 0x008e, 0x008f,
42370e812bSNamjae Jeon 	0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097,
43370e812bSNamjae Jeon 	0x0098, 0x0099, 0x009a, 0x009b, 0x009c, 0x009d, 0x009e, 0x009f,
44370e812bSNamjae Jeon 	0x00a0, 0x00a1, 0x00a2, 0x00a3, 0x00a4, 0x00a5, 0x00a6, 0x00a7,
45370e812bSNamjae Jeon 	0x00a8, 0x00a9, 0x00aa, 0x00ab, 0x00ac, 0x00ad, 0x00ae, 0x00af,
46370e812bSNamjae Jeon 	0x00b0, 0x00b1, 0x00b2, 0x00b3, 0x00b4, 0x00b5, 0x00b6, 0x00b7,
47370e812bSNamjae Jeon 	0x00b8, 0x00b9, 0x00ba, 0x00bb, 0x00bc, 0x00bd, 0x00be, 0x00bf,
48370e812bSNamjae Jeon 	0x00c0, 0x00c1, 0x00c2, 0x00c3, 0x00c4, 0x00c5, 0x00c6, 0x00c7,
49370e812bSNamjae Jeon 	0x00c8, 0x00c9, 0x00ca, 0x00cb, 0x00cc, 0x00cd, 0x00ce, 0x00cf,
50370e812bSNamjae Jeon 	0x00d0, 0x00d1, 0x00d2, 0x00d3, 0x00d4, 0x00d5, 0x00d6, 0x00d7,
51370e812bSNamjae Jeon 	0x00d8, 0x00d9, 0x00da, 0x00db, 0x00dc, 0x00dd, 0x00de, 0x00df,
52370e812bSNamjae Jeon 	0x00c0, 0x00c1, 0x00c2, 0x00c3, 0x00c4, 0x00c5, 0x00c6, 0x00c7,
53370e812bSNamjae Jeon 	0x00c8, 0x00c9, 0x00ca, 0x00cb, 0x00cc, 0x00cd, 0x00ce, 0x00cf,
54370e812bSNamjae Jeon 	0x00d0, 0x00d1, 0x00d2, 0x00d3, 0x00d4, 0x00d5, 0x00d6, 0x00f7,
55370e812bSNamjae Jeon 	0x00d8, 0x00d9, 0x00da, 0x00db, 0x00dc, 0x00dd, 0x00de, 0x0178,
56370e812bSNamjae Jeon 	0x0100, 0x0100, 0x0102, 0x0102, 0x0104, 0x0104, 0x0106, 0x0106,
57370e812bSNamjae Jeon 	0x0108, 0x0108, 0x010a, 0x010a, 0x010c, 0x010c, 0x010e, 0x010e,
58370e812bSNamjae Jeon 	0x0110, 0x0110, 0x0112, 0x0112, 0x0114, 0x0114, 0x0116, 0x0116,
59370e812bSNamjae Jeon 	0x0118, 0x0118, 0x011a, 0x011a, 0x011c, 0x011c, 0x011e, 0x011e,
60370e812bSNamjae Jeon 	0x0120, 0x0120, 0x0122, 0x0122, 0x0124, 0x0124, 0x0126, 0x0126,
61370e812bSNamjae Jeon 	0x0128, 0x0128, 0x012a, 0x012a, 0x012c, 0x012c, 0x012e, 0x012e,
62370e812bSNamjae Jeon 	0x0130, 0x0131, 0x0132, 0x0132, 0x0134, 0x0134, 0x0136, 0x0136,
63370e812bSNamjae Jeon 	0x0138, 0x0139, 0x0139, 0x013b, 0x013b, 0x013d, 0x013d, 0x013f,
64370e812bSNamjae Jeon 	0x013f, 0x0141, 0x0141, 0x0143, 0x0143, 0x0145, 0x0145, 0x0147,
65370e812bSNamjae Jeon 	0x0147, 0x0149, 0x014a, 0x014a, 0x014c, 0x014c, 0x014e, 0x014e,
66370e812bSNamjae Jeon 	0x0150, 0x0150, 0x0152, 0x0152, 0x0154, 0x0154, 0x0156, 0x0156,
67370e812bSNamjae Jeon 	0x0158, 0x0158, 0x015a, 0x015a, 0x015c, 0x015c, 0x015e, 0x015e,
68370e812bSNamjae Jeon 	0x0160, 0x0160, 0x0162, 0x0162, 0x0164, 0x0164, 0x0166, 0x0166,
69370e812bSNamjae Jeon 	0x0168, 0x0168, 0x016a, 0x016a, 0x016c, 0x016c, 0x016e, 0x016e,
70370e812bSNamjae Jeon 	0x0170, 0x0170, 0x0172, 0x0172, 0x0174, 0x0174, 0x0176, 0x0176,
71370e812bSNamjae Jeon 	0x0178, 0x0179, 0x0179, 0x017b, 0x017b, 0x017d, 0x017d, 0x017f,
72370e812bSNamjae Jeon 	0x0243, 0x0181, 0x0182, 0x0182, 0x0184, 0x0184, 0x0186, 0x0187,
73370e812bSNamjae Jeon 	0x0187, 0x0189, 0x018a, 0x018b, 0x018b, 0x018d, 0x018e, 0x018f,
74370e812bSNamjae Jeon 	0x0190, 0x0191, 0x0191, 0x0193, 0x0194, 0x01f6, 0x0196, 0x0197,
75370e812bSNamjae Jeon 	0x0198, 0x0198, 0x023d, 0x019b, 0x019c, 0x019d, 0x0220, 0x019f,
76370e812bSNamjae Jeon 	0x01a0, 0x01a0, 0x01a2, 0x01a2, 0x01a4, 0x01a4, 0x01a6, 0x01a7,
77370e812bSNamjae Jeon 	0x01a7, 0x01a9, 0x01aa, 0x01ab, 0x01ac, 0x01ac, 0x01ae, 0x01af,
78370e812bSNamjae Jeon 	0x01af, 0x01b1, 0x01b2, 0x01b3, 0x01b3, 0x01b5, 0x01b5, 0x01b7,
79370e812bSNamjae Jeon 	0x01b8, 0x01b8, 0x01ba, 0x01bb, 0x01bc, 0x01bc, 0x01be, 0x01f7,
80370e812bSNamjae Jeon 	0x01c0, 0x01c1, 0x01c2, 0x01c3, 0x01c4, 0x01c5, 0x01c4, 0x01c7,
81370e812bSNamjae Jeon 	0x01c8, 0x01c7, 0x01ca, 0x01cb, 0x01ca, 0x01cd, 0x01cd, 0x01cf,
82370e812bSNamjae Jeon 	0x01cf, 0x01d1, 0x01d1, 0x01d3, 0x01d3, 0x01d5, 0x01d5, 0x01d7,
83370e812bSNamjae Jeon 	0x01d7, 0x01d9, 0x01d9, 0x01db, 0x01db, 0x018e, 0x01de, 0x01de,
84370e812bSNamjae Jeon 	0x01e0, 0x01e0, 0x01e2, 0x01e2, 0x01e4, 0x01e4, 0x01e6, 0x01e6,
85370e812bSNamjae Jeon 	0x01e8, 0x01e8, 0x01ea, 0x01ea, 0x01ec, 0x01ec, 0x01ee, 0x01ee,
86370e812bSNamjae Jeon 	0x01f0, 0x01f1, 0x01f2, 0x01f1, 0x01f4, 0x01f4, 0x01f6, 0x01f7,
87370e812bSNamjae Jeon 	0x01f8, 0x01f8, 0x01fa, 0x01fa, 0x01fc, 0x01fc, 0x01fe, 0x01fe,
88370e812bSNamjae Jeon 	0x0200, 0x0200, 0x0202, 0x0202, 0x0204, 0x0204, 0x0206, 0x0206,
89370e812bSNamjae Jeon 	0x0208, 0x0208, 0x020a, 0x020a, 0x020c, 0x020c, 0x020e, 0x020e,
90370e812bSNamjae Jeon 	0x0210, 0x0210, 0x0212, 0x0212, 0x0214, 0x0214, 0x0216, 0x0216,
91370e812bSNamjae Jeon 	0x0218, 0x0218, 0x021a, 0x021a, 0x021c, 0x021c, 0x021e, 0x021e,
92370e812bSNamjae Jeon 	0x0220, 0x0221, 0x0222, 0x0222, 0x0224, 0x0224, 0x0226, 0x0226,
93370e812bSNamjae Jeon 	0x0228, 0x0228, 0x022a, 0x022a, 0x022c, 0x022c, 0x022e, 0x022e,
94370e812bSNamjae Jeon 	0x0230, 0x0230, 0x0232, 0x0232, 0x0234, 0x0235, 0x0236, 0x0237,
95370e812bSNamjae Jeon 	0x0238, 0x0239, 0x2c65, 0x023b, 0x023b, 0x023d, 0x2c66, 0x023f,
96370e812bSNamjae Jeon 	0x0240, 0x0241, 0x0241, 0x0243, 0x0244, 0x0245, 0x0246, 0x0246,
97370e812bSNamjae Jeon 	0x0248, 0x0248, 0x024a, 0x024a, 0x024c, 0x024c, 0x024e, 0x024e,
98370e812bSNamjae Jeon 	0x0250, 0x0251, 0x0252, 0x0181, 0x0186, 0x0255, 0x0189, 0x018a,
99370e812bSNamjae Jeon 	0x0258, 0x018f, 0x025a, 0x0190, 0x025c, 0x025d, 0x025e, 0x025f,
100370e812bSNamjae Jeon 	0x0193, 0x0261, 0x0262, 0x0194, 0x0264, 0x0265, 0x0266, 0x0267,
101370e812bSNamjae Jeon 	0x0197, 0x0196, 0x026a, 0x2c62, 0x026c, 0x026d, 0x026e, 0x019c,
102370e812bSNamjae Jeon 	0x0270, 0x0271, 0x019d, 0x0273, 0x0274, 0x019f, 0x0276, 0x0277,
103370e812bSNamjae Jeon 	0x0278, 0x0279, 0x027a, 0x027b, 0x027c, 0x2c64, 0x027e, 0x027f,
104370e812bSNamjae Jeon 	0x01a6, 0x0281, 0x0282, 0x01a9, 0x0284, 0x0285, 0x0286, 0x0287,
105370e812bSNamjae Jeon 	0x01ae, 0x0244, 0x01b1, 0x01b2, 0x0245, 0x028d, 0x028e, 0x028f,
106370e812bSNamjae Jeon 	0x0290, 0x0291, 0x01b7, 0x0293, 0x0294, 0x0295, 0x0296, 0x0297,
107370e812bSNamjae Jeon 	0x0298, 0x0299, 0x029a, 0x029b, 0x029c, 0x029d, 0x029e, 0x029f,
108370e812bSNamjae Jeon 	0x02a0, 0x02a1, 0x02a2, 0x02a3, 0x02a4, 0x02a5, 0x02a6, 0x02a7,
109370e812bSNamjae Jeon 	0x02a8, 0x02a9, 0x02aa, 0x02ab, 0x02ac, 0x02ad, 0x02ae, 0x02af,
110370e812bSNamjae Jeon 	0x02b0, 0x02b1, 0x02b2, 0x02b3, 0x02b4, 0x02b5, 0x02b6, 0x02b7,
111370e812bSNamjae Jeon 	0x02b8, 0x02b9, 0x02ba, 0x02bb, 0x02bc, 0x02bd, 0x02be, 0x02bf,
112370e812bSNamjae Jeon 	0x02c0, 0x02c1, 0x02c2, 0x02c3, 0x02c4, 0x02c5, 0x02c6, 0x02c7,
113370e812bSNamjae Jeon 	0x02c8, 0x02c9, 0x02ca, 0x02cb, 0x02cc, 0x02cd, 0x02ce, 0x02cf,
114370e812bSNamjae Jeon 	0x02d0, 0x02d1, 0x02d2, 0x02d3, 0x02d4, 0x02d5, 0x02d6, 0x02d7,
115370e812bSNamjae Jeon 	0x02d8, 0x02d9, 0x02da, 0x02db, 0x02dc, 0x02dd, 0x02de, 0x02df,
116370e812bSNamjae Jeon 	0x02e0, 0x02e1, 0x02e2, 0x02e3, 0x02e4, 0x02e5, 0x02e6, 0x02e7,
117370e812bSNamjae Jeon 	0x02e8, 0x02e9, 0x02ea, 0x02eb, 0x02ec, 0x02ed, 0x02ee, 0x02ef,
118370e812bSNamjae Jeon 	0x02f0, 0x02f1, 0x02f2, 0x02f3, 0x02f4, 0x02f5, 0x02f6, 0x02f7,
119370e812bSNamjae Jeon 	0x02f8, 0x02f9, 0x02fa, 0x02fb, 0x02fc, 0x02fd, 0x02fe, 0x02ff,
120370e812bSNamjae Jeon 	0x0300, 0x0301, 0x0302, 0x0303, 0x0304, 0x0305, 0x0306, 0x0307,
121370e812bSNamjae Jeon 	0x0308, 0x0309, 0x030a, 0x030b, 0x030c, 0x030d, 0x030e, 0x030f,
122370e812bSNamjae Jeon 	0x0310, 0x0311, 0x0312, 0x0313, 0x0314, 0x0315, 0x0316, 0x0317,
123370e812bSNamjae Jeon 	0x0318, 0x0319, 0x031a, 0x031b, 0x031c, 0x031d, 0x031e, 0x031f,
124370e812bSNamjae Jeon 	0x0320, 0x0321, 0x0322, 0x0323, 0x0324, 0x0325, 0x0326, 0x0327,
125370e812bSNamjae Jeon 	0x0328, 0x0329, 0x032a, 0x032b, 0x032c, 0x032d, 0x032e, 0x032f,
126370e812bSNamjae Jeon 	0x0330, 0x0331, 0x0332, 0x0333, 0x0334, 0x0335, 0x0336, 0x0337,
127370e812bSNamjae Jeon 	0x0338, 0x0339, 0x033a, 0x033b, 0x033c, 0x033d, 0x033e, 0x033f,
128370e812bSNamjae Jeon 	0x0340, 0x0341, 0x0342, 0x0343, 0x0344, 0x0345, 0x0346, 0x0347,
129370e812bSNamjae Jeon 	0x0348, 0x0349, 0x034a, 0x034b, 0x034c, 0x034d, 0x034e, 0x034f,
130370e812bSNamjae Jeon 	0x0350, 0x0351, 0x0352, 0x0353, 0x0354, 0x0355, 0x0356, 0x0357,
131370e812bSNamjae Jeon 	0x0358, 0x0359, 0x035a, 0x035b, 0x035c, 0x035d, 0x035e, 0x035f,
132370e812bSNamjae Jeon 	0x0360, 0x0361, 0x0362, 0x0363, 0x0364, 0x0365, 0x0366, 0x0367,
133370e812bSNamjae Jeon 	0x0368, 0x0369, 0x036a, 0x036b, 0x036c, 0x036d, 0x036e, 0x036f,
134370e812bSNamjae Jeon 	0x0370, 0x0371, 0x0372, 0x0373, 0x0374, 0x0375, 0x0376, 0x0377,
135370e812bSNamjae Jeon 	0x0378, 0x0379, 0x037a, 0x03fd, 0x03fe, 0x03ff, 0x037e, 0x037f,
136370e812bSNamjae Jeon 	0x0380, 0x0381, 0x0382, 0x0383, 0x0384, 0x0385, 0x0386, 0x0387,
137370e812bSNamjae Jeon 	0x0388, 0x0389, 0x038a, 0x038b, 0x038c, 0x038d, 0x038e, 0x038f,
138370e812bSNamjae Jeon 	0x0390, 0x0391, 0x0392, 0x0393, 0x0394, 0x0395, 0x0396, 0x0397,
139370e812bSNamjae Jeon 	0x0398, 0x0399, 0x039a, 0x039b, 0x039c, 0x039d, 0x039e, 0x039f,
140370e812bSNamjae Jeon 	0x03a0, 0x03a1, 0x03a2, 0x03a3, 0x03a4, 0x03a5, 0x03a6, 0x03a7,
141370e812bSNamjae Jeon 	0x03a8, 0x03a9, 0x03aa, 0x03ab, 0x0386, 0x0388, 0x0389, 0x038a,
142370e812bSNamjae Jeon 	0x03b0, 0x0391, 0x0392, 0x0393, 0x0394, 0x0395, 0x0396, 0x0397,
143370e812bSNamjae Jeon 	0x0398, 0x0399, 0x039a, 0x039b, 0x039c, 0x039d, 0x039e, 0x039f,
144370e812bSNamjae Jeon 	0x03a0, 0x03a1, 0x03a3, 0x03a3, 0x03a4, 0x03a5, 0x03a6, 0x03a7,
145370e812bSNamjae Jeon 	0x03a8, 0x03a9, 0x03aa, 0x03ab, 0x038c, 0x038e, 0x038f, 0x03cf,
146370e812bSNamjae Jeon 	0x03d0, 0x03d1, 0x03d2, 0x03d3, 0x03d4, 0x03d5, 0x03d6, 0x03d7,
147370e812bSNamjae Jeon 	0x03d8, 0x03d8, 0x03da, 0x03da, 0x03dc, 0x03dc, 0x03de, 0x03de,
148370e812bSNamjae Jeon 	0x03e0, 0x03e0, 0x03e2, 0x03e2, 0x03e4, 0x03e4, 0x03e6, 0x03e6,
149370e812bSNamjae Jeon 	0x03e8, 0x03e8, 0x03ea, 0x03ea, 0x03ec, 0x03ec, 0x03ee, 0x03ee,
150370e812bSNamjae Jeon 	0x03f0, 0x03f1, 0x03f9, 0x03f3, 0x03f4, 0x03f5, 0x03f6, 0x03f7,
151370e812bSNamjae Jeon 	0x03f7, 0x03f9, 0x03fa, 0x03fa, 0x03fc, 0x03fd, 0x03fe, 0x03ff,
152370e812bSNamjae Jeon 	0x0400, 0x0401, 0x0402, 0x0403, 0x0404, 0x0405, 0x0406, 0x0407,
153370e812bSNamjae Jeon 	0x0408, 0x0409, 0x040a, 0x040b, 0x040c, 0x040d, 0x040e, 0x040f,
154370e812bSNamjae Jeon 	0x0410, 0x0411, 0x0412, 0x0413, 0x0414, 0x0415, 0x0416, 0x0417,
155370e812bSNamjae Jeon 	0x0418, 0x0419, 0x041a, 0x041b, 0x041c, 0x041d, 0x041e, 0x041f,
156370e812bSNamjae Jeon 	0x0420, 0x0421, 0x0422, 0x0423, 0x0424, 0x0425, 0x0426, 0x0427,
157370e812bSNamjae Jeon 	0x0428, 0x0429, 0x042a, 0x042b, 0x042c, 0x042d, 0x042e, 0x042f,
158370e812bSNamjae Jeon 	0x0410, 0x0411, 0x0412, 0x0413, 0x0414, 0x0415, 0x0416, 0x0417,
159370e812bSNamjae Jeon 	0x0418, 0x0419, 0x041a, 0x041b, 0x041c, 0x041d, 0x041e, 0x041f,
160370e812bSNamjae Jeon 	0x0420, 0x0421, 0x0422, 0x0423, 0x0424, 0x0425, 0x0426, 0x0427,
161370e812bSNamjae Jeon 	0x0428, 0x0429, 0x042a, 0x042b, 0x042c, 0x042d, 0x042e, 0x042f,
162370e812bSNamjae Jeon 	0x0400, 0x0401, 0x0402, 0x0403, 0x0404, 0x0405, 0x0406, 0x0407,
163370e812bSNamjae Jeon 	0x0408, 0x0409, 0x040a, 0x040b, 0x040c, 0x040d, 0x040e, 0x040f,
164370e812bSNamjae Jeon 	0x0460, 0x0460, 0x0462, 0x0462, 0x0464, 0x0464, 0x0466, 0x0466,
165370e812bSNamjae Jeon 	0x0468, 0x0468, 0x046a, 0x046a, 0x046c, 0x046c, 0x046e, 0x046e,
166370e812bSNamjae Jeon 	0x0470, 0x0470, 0x0472, 0x0472, 0x0474, 0x0474, 0x0476, 0x0476,
167370e812bSNamjae Jeon 	0x0478, 0x0478, 0x047a, 0x047a, 0x047c, 0x047c, 0x047e, 0x047e,
168370e812bSNamjae Jeon 	0x0480, 0x0480, 0x0482, 0x0483, 0x0484, 0x0485, 0x0486, 0x0487,
169370e812bSNamjae Jeon 	0x0488, 0x0489, 0x048a, 0x048a, 0x048c, 0x048c, 0x048e, 0x048e,
170370e812bSNamjae Jeon 	0x0490, 0x0490, 0x0492, 0x0492, 0x0494, 0x0494, 0x0496, 0x0496,
171370e812bSNamjae Jeon 	0x0498, 0x0498, 0x049a, 0x049a, 0x049c, 0x049c, 0x049e, 0x049e,
172370e812bSNamjae Jeon 	0x04a0, 0x04a0, 0x04a2, 0x04a2, 0x04a4, 0x04a4, 0x04a6, 0x04a6,
173370e812bSNamjae Jeon 	0x04a8, 0x04a8, 0x04aa, 0x04aa, 0x04ac, 0x04ac, 0x04ae, 0x04ae,
174370e812bSNamjae Jeon 	0x04b0, 0x04b0, 0x04b2, 0x04b2, 0x04b4, 0x04b4, 0x04b6, 0x04b6,
175370e812bSNamjae Jeon 	0x04b8, 0x04b8, 0x04ba, 0x04ba, 0x04bc, 0x04bc, 0x04be, 0x04be,
176370e812bSNamjae Jeon 	0x04c0, 0x04c1, 0x04c1, 0x04c3, 0x04c3, 0x04c5, 0x04c5, 0x04c7,
177370e812bSNamjae Jeon 	0x04c7, 0x04c9, 0x04c9, 0x04cb, 0x04cb, 0x04cd, 0x04cd, 0x04c0,
178370e812bSNamjae Jeon 	0x04d0, 0x04d0, 0x04d2, 0x04d2, 0x04d4, 0x04d4, 0x04d6, 0x04d6,
179370e812bSNamjae Jeon 	0x04d8, 0x04d8, 0x04da, 0x04da, 0x04dc, 0x04dc, 0x04de, 0x04de,
180370e812bSNamjae Jeon 	0x04e0, 0x04e0, 0x04e2, 0x04e2, 0x04e4, 0x04e4, 0x04e6, 0x04e6,
181370e812bSNamjae Jeon 	0x04e8, 0x04e8, 0x04ea, 0x04ea, 0x04ec, 0x04ec, 0x04ee, 0x04ee,
182370e812bSNamjae Jeon 	0x04f0, 0x04f0, 0x04f2, 0x04f2, 0x04f4, 0x04f4, 0x04f6, 0x04f6,
183370e812bSNamjae Jeon 	0x04f8, 0x04f8, 0x04fa, 0x04fa, 0x04fc, 0x04fc, 0x04fe, 0x04fe,
184370e812bSNamjae Jeon 	0x0500, 0x0500, 0x0502, 0x0502, 0x0504, 0x0504, 0x0506, 0x0506,
185370e812bSNamjae Jeon 	0x0508, 0x0508, 0x050a, 0x050a, 0x050c, 0x050c, 0x050e, 0x050e,
186370e812bSNamjae Jeon 	0x0510, 0x0510, 0x0512, 0x0512, 0x0514, 0x0515, 0x0516, 0x0517,
187370e812bSNamjae Jeon 	0x0518, 0x0519, 0x051a, 0x051b, 0x051c, 0x051d, 0x051e, 0x051f,
188370e812bSNamjae Jeon 	0x0520, 0x0521, 0x0522, 0x0523, 0x0524, 0x0525, 0x0526, 0x0527,
189370e812bSNamjae Jeon 	0x0528, 0x0529, 0x052a, 0x052b, 0x052c, 0x052d, 0x052e, 0x052f,
190370e812bSNamjae Jeon 	0x0530, 0x0531, 0x0532, 0x0533, 0x0534, 0x0535, 0x0536, 0x0537,
191370e812bSNamjae Jeon 	0x0538, 0x0539, 0x053a, 0x053b, 0x053c, 0x053d, 0x053e, 0x053f,
192370e812bSNamjae Jeon 	0x0540, 0x0541, 0x0542, 0x0543, 0x0544, 0x0545, 0x0546, 0x0547,
193370e812bSNamjae Jeon 	0x0548, 0x0549, 0x054a, 0x054b, 0x054c, 0x054d, 0x054e, 0x054f,
194370e812bSNamjae Jeon 	0x0550, 0x0551, 0x0552, 0x0553, 0x0554, 0x0555, 0x0556, 0x0557,
195370e812bSNamjae Jeon 	0x0558, 0x0559, 0x055a, 0x055b, 0x055c, 0x055d, 0x055e, 0x055f,
196370e812bSNamjae Jeon 	0x0560, 0x0531, 0x0532, 0x0533, 0x0534, 0x0535, 0x0536, 0x0537,
197370e812bSNamjae Jeon 	0x0538, 0x0539, 0x053a, 0x053b, 0x053c, 0x053d, 0x053e, 0x053f,
198370e812bSNamjae Jeon 	0x0540, 0x0541, 0x0542, 0x0543, 0x0544, 0x0545, 0x0546, 0x0547,
199370e812bSNamjae Jeon 	0x0548, 0x0549, 0x054a, 0x054b, 0x054c, 0x054d, 0x054e, 0x054f,
200370e812bSNamjae Jeon 	0x0550, 0x0551, 0x0552, 0x0553, 0x0554, 0x0555, 0x0556, 0xffff,
201370e812bSNamjae Jeon 	0x17f6, 0x2c63, 0x1d7e, 0x1d7f, 0x1d80, 0x1d81, 0x1d82, 0x1d83,
202370e812bSNamjae Jeon 	0x1d84, 0x1d85, 0x1d86, 0x1d87, 0x1d88, 0x1d89, 0x1d8a, 0x1d8b,
203370e812bSNamjae Jeon 	0x1d8c, 0x1d8d, 0x1d8e, 0x1d8f, 0x1d90, 0x1d91, 0x1d92, 0x1d93,
204370e812bSNamjae Jeon 	0x1d94, 0x1d95, 0x1d96, 0x1d97, 0x1d98, 0x1d99, 0x1d9a, 0x1d9b,
205370e812bSNamjae Jeon 	0x1d9c, 0x1d9d, 0x1d9e, 0x1d9f, 0x1da0, 0x1da1, 0x1da2, 0x1da3,
206370e812bSNamjae Jeon 	0x1da4, 0x1da5, 0x1da6, 0x1da7, 0x1da8, 0x1da9, 0x1daa, 0x1dab,
207370e812bSNamjae Jeon 	0x1dac, 0x1dad, 0x1dae, 0x1daf, 0x1db0, 0x1db1, 0x1db2, 0x1db3,
208370e812bSNamjae Jeon 	0x1db4, 0x1db5, 0x1db6, 0x1db7, 0x1db8, 0x1db9, 0x1dba, 0x1dbb,
209370e812bSNamjae Jeon 	0x1dbc, 0x1dbd, 0x1dbe, 0x1dbf, 0x1dc0, 0x1dc1, 0x1dc2, 0x1dc3,
210370e812bSNamjae Jeon 	0x1dc4, 0x1dc5, 0x1dc6, 0x1dc7, 0x1dc8, 0x1dc9, 0x1dca, 0x1dcb,
211370e812bSNamjae Jeon 	0x1dcc, 0x1dcd, 0x1dce, 0x1dcf, 0x1dd0, 0x1dd1, 0x1dd2, 0x1dd3,
212370e812bSNamjae Jeon 	0x1dd4, 0x1dd5, 0x1dd6, 0x1dd7, 0x1dd8, 0x1dd9, 0x1dda, 0x1ddb,
213370e812bSNamjae Jeon 	0x1ddc, 0x1ddd, 0x1dde, 0x1ddf, 0x1de0, 0x1de1, 0x1de2, 0x1de3,
214370e812bSNamjae Jeon 	0x1de4, 0x1de5, 0x1de6, 0x1de7, 0x1de8, 0x1de9, 0x1dea, 0x1deb,
215370e812bSNamjae Jeon 	0x1dec, 0x1ded, 0x1dee, 0x1def, 0x1df0, 0x1df1, 0x1df2, 0x1df3,
216370e812bSNamjae Jeon 	0x1df4, 0x1df5, 0x1df6, 0x1df7, 0x1df8, 0x1df9, 0x1dfa, 0x1dfb,
217370e812bSNamjae Jeon 	0x1dfc, 0x1dfd, 0x1dfe, 0x1dff, 0x1e00, 0x1e00, 0x1e02, 0x1e02,
218370e812bSNamjae Jeon 	0x1e04, 0x1e04, 0x1e06, 0x1e06, 0x1e08, 0x1e08, 0x1e0a, 0x1e0a,
219370e812bSNamjae Jeon 	0x1e0c, 0x1e0c, 0x1e0e, 0x1e0e, 0x1e10, 0x1e10, 0x1e12, 0x1e12,
220370e812bSNamjae Jeon 	0x1e14, 0x1e14, 0x1e16, 0x1e16, 0x1e18, 0x1e18, 0x1e1a, 0x1e1a,
221370e812bSNamjae Jeon 	0x1e1c, 0x1e1c, 0x1e1e, 0x1e1e, 0x1e20, 0x1e20, 0x1e22, 0x1e22,
222370e812bSNamjae Jeon 	0x1e24, 0x1e24, 0x1e26, 0x1e26, 0x1e28, 0x1e28, 0x1e2a, 0x1e2a,
223370e812bSNamjae Jeon 	0x1e2c, 0x1e2c, 0x1e2e, 0x1e2e, 0x1e30, 0x1e30, 0x1e32, 0x1e32,
224370e812bSNamjae Jeon 	0x1e34, 0x1e34, 0x1e36, 0x1e36, 0x1e38, 0x1e38, 0x1e3a, 0x1e3a,
225370e812bSNamjae Jeon 	0x1e3c, 0x1e3c, 0x1e3e, 0x1e3e, 0x1e40, 0x1e40, 0x1e42, 0x1e42,
226370e812bSNamjae Jeon 	0x1e44, 0x1e44, 0x1e46, 0x1e46, 0x1e48, 0x1e48, 0x1e4a, 0x1e4a,
227370e812bSNamjae Jeon 	0x1e4c, 0x1e4c, 0x1e4e, 0x1e4e, 0x1e50, 0x1e50, 0x1e52, 0x1e52,
228370e812bSNamjae Jeon 	0x1e54, 0x1e54, 0x1e56, 0x1e56, 0x1e58, 0x1e58, 0x1e5a, 0x1e5a,
229370e812bSNamjae Jeon 	0x1e5c, 0x1e5c, 0x1e5e, 0x1e5e, 0x1e60, 0x1e60, 0x1e62, 0x1e62,
230370e812bSNamjae Jeon 	0x1e64, 0x1e64, 0x1e66, 0x1e66, 0x1e68, 0x1e68, 0x1e6a, 0x1e6a,
231370e812bSNamjae Jeon 	0x1e6c, 0x1e6c, 0x1e6e, 0x1e6e, 0x1e70, 0x1e70, 0x1e72, 0x1e72,
232370e812bSNamjae Jeon 	0x1e74, 0x1e74, 0x1e76, 0x1e76, 0x1e78, 0x1e78, 0x1e7a, 0x1e7a,
233370e812bSNamjae Jeon 	0x1e7c, 0x1e7c, 0x1e7e, 0x1e7e, 0x1e80, 0x1e80, 0x1e82, 0x1e82,
234370e812bSNamjae Jeon 	0x1e84, 0x1e84, 0x1e86, 0x1e86, 0x1e88, 0x1e88, 0x1e8a, 0x1e8a,
235370e812bSNamjae Jeon 	0x1e8c, 0x1e8c, 0x1e8e, 0x1e8e, 0x1e90, 0x1e90, 0x1e92, 0x1e92,
236370e812bSNamjae Jeon 	0x1e94, 0x1e94, 0x1e96, 0x1e97, 0x1e98, 0x1e99, 0x1e9a, 0x1e9b,
237370e812bSNamjae Jeon 	0x1e9c, 0x1e9d, 0x1e9e, 0x1e9f, 0x1ea0, 0x1ea0, 0x1ea2, 0x1ea2,
238370e812bSNamjae Jeon 	0x1ea4, 0x1ea4, 0x1ea6, 0x1ea6, 0x1ea8, 0x1ea8, 0x1eaa, 0x1eaa,
239370e812bSNamjae Jeon 	0x1eac, 0x1eac, 0x1eae, 0x1eae, 0x1eb0, 0x1eb0, 0x1eb2, 0x1eb2,
240370e812bSNamjae Jeon 	0x1eb4, 0x1eb4, 0x1eb6, 0x1eb6, 0x1eb8, 0x1eb8, 0x1eba, 0x1eba,
241370e812bSNamjae Jeon 	0x1ebc, 0x1ebc, 0x1ebe, 0x1ebe, 0x1ec0, 0x1ec0, 0x1ec2, 0x1ec2,
242370e812bSNamjae Jeon 	0x1ec4, 0x1ec4, 0x1ec6, 0x1ec6, 0x1ec8, 0x1ec8, 0x1eca, 0x1eca,
243370e812bSNamjae Jeon 	0x1ecc, 0x1ecc, 0x1ece, 0x1ece, 0x1ed0, 0x1ed0, 0x1ed2, 0x1ed2,
244370e812bSNamjae Jeon 	0x1ed4, 0x1ed4, 0x1ed6, 0x1ed6, 0x1ed8, 0x1ed8, 0x1eda, 0x1eda,
245370e812bSNamjae Jeon 	0x1edc, 0x1edc, 0x1ede, 0x1ede, 0x1ee0, 0x1ee0, 0x1ee2, 0x1ee2,
246370e812bSNamjae Jeon 	0x1ee4, 0x1ee4, 0x1ee6, 0x1ee6, 0x1ee8, 0x1ee8, 0x1eea, 0x1eea,
247370e812bSNamjae Jeon 	0x1eec, 0x1eec, 0x1eee, 0x1eee, 0x1ef0, 0x1ef0, 0x1ef2, 0x1ef2,
248370e812bSNamjae Jeon 	0x1ef4, 0x1ef4, 0x1ef6, 0x1ef6, 0x1ef8, 0x1ef8, 0x1efa, 0x1efb,
249370e812bSNamjae Jeon 	0x1efc, 0x1efd, 0x1efe, 0x1eff, 0x1f08, 0x1f09, 0x1f0a, 0x1f0b,
250370e812bSNamjae Jeon 	0x1f0c, 0x1f0d, 0x1f0e, 0x1f0f, 0x1f08, 0x1f09, 0x1f0a, 0x1f0b,
251370e812bSNamjae Jeon 	0x1f0c, 0x1f0d, 0x1f0e, 0x1f0f, 0x1f18, 0x1f19, 0x1f1a, 0x1f1b,
252370e812bSNamjae Jeon 	0x1f1c, 0x1f1d, 0x1f16, 0x1f17, 0x1f18, 0x1f19, 0x1f1a, 0x1f1b,
253370e812bSNamjae Jeon 	0x1f1c, 0x1f1d, 0x1f1e, 0x1f1f, 0x1f28, 0x1f29, 0x1f2a, 0x1f2b,
254370e812bSNamjae Jeon 	0x1f2c, 0x1f2d, 0x1f2e, 0x1f2f, 0x1f28, 0x1f29, 0x1f2a, 0x1f2b,
255370e812bSNamjae Jeon 	0x1f2c, 0x1f2d, 0x1f2e, 0x1f2f, 0x1f38, 0x1f39, 0x1f3a, 0x1f3b,
256370e812bSNamjae Jeon 	0x1f3c, 0x1f3d, 0x1f3e, 0x1f3f, 0x1f38, 0x1f39, 0x1f3a, 0x1f3b,
257370e812bSNamjae Jeon 	0x1f3c, 0x1f3d, 0x1f3e, 0x1f3f, 0x1f48, 0x1f49, 0x1f4a, 0x1f4b,
258370e812bSNamjae Jeon 	0x1f4c, 0x1f4d, 0x1f46, 0x1f47, 0x1f48, 0x1f49, 0x1f4a, 0x1f4b,
259370e812bSNamjae Jeon 	0x1f4c, 0x1f4d, 0x1f4e, 0x1f4f, 0x1f50, 0x1f59, 0x1f52, 0x1f5b,
260370e812bSNamjae Jeon 	0x1f54, 0x1f5d, 0x1f56, 0x1f5f, 0x1f58, 0x1f59, 0x1f5a, 0x1f5b,
261370e812bSNamjae Jeon 	0x1f5c, 0x1f5d, 0x1f5e, 0x1f5f, 0x1f68, 0x1f69, 0x1f6a, 0x1f6b,
262370e812bSNamjae Jeon 	0x1f6c, 0x1f6d, 0x1f6e, 0x1f6f, 0x1f68, 0x1f69, 0x1f6a, 0x1f6b,
263370e812bSNamjae Jeon 	0x1f6c, 0x1f6d, 0x1f6e, 0x1f6f, 0x1fba, 0x1fbb, 0x1fc8, 0x1fc9,
264370e812bSNamjae Jeon 	0x1fca, 0x1fcb, 0x1fda, 0x1fdb, 0x1ff8, 0x1ff9, 0x1fea, 0x1feb,
265370e812bSNamjae Jeon 	0x1ffa, 0x1ffb, 0x1f7e, 0x1f7f, 0x1f88, 0x1f89, 0x1f8a, 0x1f8b,
266370e812bSNamjae Jeon 	0x1f8c, 0x1f8d, 0x1f8e, 0x1f8f, 0x1f88, 0x1f89, 0x1f8a, 0x1f8b,
267370e812bSNamjae Jeon 	0x1f8c, 0x1f8d, 0x1f8e, 0x1f8f, 0x1f98, 0x1f99, 0x1f9a, 0x1f9b,
268370e812bSNamjae Jeon 	0x1f9c, 0x1f9d, 0x1f9e, 0x1f9f, 0x1f98, 0x1f99, 0x1f9a, 0x1f9b,
269370e812bSNamjae Jeon 	0x1f9c, 0x1f9d, 0x1f9e, 0x1f9f, 0x1fa8, 0x1fa9, 0x1faa, 0x1fab,
270370e812bSNamjae Jeon 	0x1fac, 0x1fad, 0x1fae, 0x1faf, 0x1fa8, 0x1fa9, 0x1faa, 0x1fab,
271370e812bSNamjae Jeon 	0x1fac, 0x1fad, 0x1fae, 0x1faf, 0x1fb8, 0x1fb9, 0x1fb2, 0x1fbc,
272370e812bSNamjae Jeon 	0x1fb4, 0x1fb5, 0x1fb6, 0x1fb7, 0x1fb8, 0x1fb9, 0x1fba, 0x1fbb,
273370e812bSNamjae Jeon 	0x1fbc, 0x1fbd, 0x1fbe, 0x1fbf, 0x1fc0, 0x1fc1, 0x1fc2, 0x1fc3,
274370e812bSNamjae Jeon 	0x1fc4, 0x1fc5, 0x1fc6, 0x1fc7, 0x1fc8, 0x1fc9, 0x1fca, 0x1fcb,
275370e812bSNamjae Jeon 	0x1fc3, 0x1fcd, 0x1fce, 0x1fcf, 0x1fd8, 0x1fd9, 0x1fd2, 0x1fd3,
276370e812bSNamjae Jeon 	0x1fd4, 0x1fd5, 0x1fd6, 0x1fd7, 0x1fd8, 0x1fd9, 0x1fda, 0x1fdb,
277370e812bSNamjae Jeon 	0x1fdc, 0x1fdd, 0x1fde, 0x1fdf, 0x1fe8, 0x1fe9, 0x1fe2, 0x1fe3,
278370e812bSNamjae Jeon 	0x1fe4, 0x1fec, 0x1fe6, 0x1fe7, 0x1fe8, 0x1fe9, 0x1fea, 0x1feb,
279370e812bSNamjae Jeon 	0x1fec, 0x1fed, 0x1fee, 0x1fef, 0x1ff0, 0x1ff1, 0x1ff2, 0x1ff3,
280370e812bSNamjae Jeon 	0x1ff4, 0x1ff5, 0x1ff6, 0x1ff7, 0x1ff8, 0x1ff9, 0x1ffa, 0x1ffb,
281370e812bSNamjae Jeon 	0x1ff3, 0x1ffd, 0x1ffe, 0x1fff, 0x2000, 0x2001, 0x2002, 0x2003,
282370e812bSNamjae Jeon 	0x2004, 0x2005, 0x2006, 0x2007, 0x2008, 0x2009, 0x200a, 0x200b,
283370e812bSNamjae Jeon 	0x200c, 0x200d, 0x200e, 0x200f, 0x2010, 0x2011, 0x2012, 0x2013,
284370e812bSNamjae Jeon 	0x2014, 0x2015, 0x2016, 0x2017, 0x2018, 0x2019, 0x201a, 0x201b,
285370e812bSNamjae Jeon 	0x201c, 0x201d, 0x201e, 0x201f, 0x2020, 0x2021, 0x2022, 0x2023,
286370e812bSNamjae Jeon 	0x2024, 0x2025, 0x2026, 0x2027, 0x2028, 0x2029, 0x202a, 0x202b,
287370e812bSNamjae Jeon 	0x202c, 0x202d, 0x202e, 0x202f, 0x2030, 0x2031, 0x2032, 0x2033,
288370e812bSNamjae Jeon 	0x2034, 0x2035, 0x2036, 0x2037, 0x2038, 0x2039, 0x203a, 0x203b,
289370e812bSNamjae Jeon 	0x203c, 0x203d, 0x203e, 0x203f, 0x2040, 0x2041, 0x2042, 0x2043,
290370e812bSNamjae Jeon 	0x2044, 0x2045, 0x2046, 0x2047, 0x2048, 0x2049, 0x204a, 0x204b,
291370e812bSNamjae Jeon 	0x204c, 0x204d, 0x204e, 0x204f, 0x2050, 0x2051, 0x2052, 0x2053,
292370e812bSNamjae Jeon 	0x2054, 0x2055, 0x2056, 0x2057, 0x2058, 0x2059, 0x205a, 0x205b,
293370e812bSNamjae Jeon 	0x205c, 0x205d, 0x205e, 0x205f, 0x2060, 0x2061, 0x2062, 0x2063,
294370e812bSNamjae Jeon 	0x2064, 0x2065, 0x2066, 0x2067, 0x2068, 0x2069, 0x206a, 0x206b,
295370e812bSNamjae Jeon 	0x206c, 0x206d, 0x206e, 0x206f, 0x2070, 0x2071, 0x2072, 0x2073,
296370e812bSNamjae Jeon 	0x2074, 0x2075, 0x2076, 0x2077, 0x2078, 0x2079, 0x207a, 0x207b,
297370e812bSNamjae Jeon 	0x207c, 0x207d, 0x207e, 0x207f, 0x2080, 0x2081, 0x2082, 0x2083,
298370e812bSNamjae Jeon 	0x2084, 0x2085, 0x2086, 0x2087, 0x2088, 0x2089, 0x208a, 0x208b,
299370e812bSNamjae Jeon 	0x208c, 0x208d, 0x208e, 0x208f, 0x2090, 0x2091, 0x2092, 0x2093,
300370e812bSNamjae Jeon 	0x2094, 0x2095, 0x2096, 0x2097, 0x2098, 0x2099, 0x209a, 0x209b,
301370e812bSNamjae Jeon 	0x209c, 0x209d, 0x209e, 0x209f, 0x20a0, 0x20a1, 0x20a2, 0x20a3,
302370e812bSNamjae Jeon 	0x20a4, 0x20a5, 0x20a6, 0x20a7, 0x20a8, 0x20a9, 0x20aa, 0x20ab,
303370e812bSNamjae Jeon 	0x20ac, 0x20ad, 0x20ae, 0x20af, 0x20b0, 0x20b1, 0x20b2, 0x20b3,
304370e812bSNamjae Jeon 	0x20b4, 0x20b5, 0x20b6, 0x20b7, 0x20b8, 0x20b9, 0x20ba, 0x20bb,
305370e812bSNamjae Jeon 	0x20bc, 0x20bd, 0x20be, 0x20bf, 0x20c0, 0x20c1, 0x20c2, 0x20c3,
306370e812bSNamjae Jeon 	0x20c4, 0x20c5, 0x20c6, 0x20c7, 0x20c8, 0x20c9, 0x20ca, 0x20cb,
307370e812bSNamjae Jeon 	0x20cc, 0x20cd, 0x20ce, 0x20cf, 0x20d0, 0x20d1, 0x20d2, 0x20d3,
308370e812bSNamjae Jeon 	0x20d4, 0x20d5, 0x20d6, 0x20d7, 0x20d8, 0x20d9, 0x20da, 0x20db,
309370e812bSNamjae Jeon 	0x20dc, 0x20dd, 0x20de, 0x20df, 0x20e0, 0x20e1, 0x20e2, 0x20e3,
310370e812bSNamjae Jeon 	0x20e4, 0x20e5, 0x20e6, 0x20e7, 0x20e8, 0x20e9, 0x20ea, 0x20eb,
311370e812bSNamjae Jeon 	0x20ec, 0x20ed, 0x20ee, 0x20ef, 0x20f0, 0x20f1, 0x20f2, 0x20f3,
312370e812bSNamjae Jeon 	0x20f4, 0x20f5, 0x20f6, 0x20f7, 0x20f8, 0x20f9, 0x20fa, 0x20fb,
313370e812bSNamjae Jeon 	0x20fc, 0x20fd, 0x20fe, 0x20ff, 0x2100, 0x2101, 0x2102, 0x2103,
314370e812bSNamjae Jeon 	0x2104, 0x2105, 0x2106, 0x2107, 0x2108, 0x2109, 0x210a, 0x210b,
315370e812bSNamjae Jeon 	0x210c, 0x210d, 0x210e, 0x210f, 0x2110, 0x2111, 0x2112, 0x2113,
316370e812bSNamjae Jeon 	0x2114, 0x2115, 0x2116, 0x2117, 0x2118, 0x2119, 0x211a, 0x211b,
317370e812bSNamjae Jeon 	0x211c, 0x211d, 0x211e, 0x211f, 0x2120, 0x2121, 0x2122, 0x2123,
318370e812bSNamjae Jeon 	0x2124, 0x2125, 0x2126, 0x2127, 0x2128, 0x2129, 0x212a, 0x212b,
319370e812bSNamjae Jeon 	0x212c, 0x212d, 0x212e, 0x212f, 0x2130, 0x2131, 0x2132, 0x2133,
320370e812bSNamjae Jeon 	0x2134, 0x2135, 0x2136, 0x2137, 0x2138, 0x2139, 0x213a, 0x213b,
321370e812bSNamjae Jeon 	0x213c, 0x213d, 0x213e, 0x213f, 0x2140, 0x2141, 0x2142, 0x2143,
322370e812bSNamjae Jeon 	0x2144, 0x2145, 0x2146, 0x2147, 0x2148, 0x2149, 0x214a, 0x214b,
323370e812bSNamjae Jeon 	0x214c, 0x214d, 0x2132, 0x214f, 0x2150, 0x2151, 0x2152, 0x2153,
324370e812bSNamjae Jeon 	0x2154, 0x2155, 0x2156, 0x2157, 0x2158, 0x2159, 0x215a, 0x215b,
325370e812bSNamjae Jeon 	0x215c, 0x215d, 0x215e, 0x215f, 0x2160, 0x2161, 0x2162, 0x2163,
326370e812bSNamjae Jeon 	0x2164, 0x2165, 0x2166, 0x2167, 0x2168, 0x2169, 0x216a, 0x216b,
327370e812bSNamjae Jeon 	0x216c, 0x216d, 0x216e, 0x216f, 0x2160, 0x2161, 0x2162, 0x2163,
328370e812bSNamjae Jeon 	0x2164, 0x2165, 0x2166, 0x2167, 0x2168, 0x2169, 0x216a, 0x216b,
329370e812bSNamjae Jeon 	0x216c, 0x216d, 0x216e, 0x216f, 0x2180, 0x2181, 0x2182, 0x2183,
330370e812bSNamjae Jeon 	0x2183, 0xffff, 0x034b, 0x24b6, 0x24b7, 0x24b8, 0x24b9, 0x24ba,
331370e812bSNamjae Jeon 	0x24bb, 0x24bc, 0x24bd, 0x24be, 0x24bf, 0x24c0, 0x24c1, 0x24c2,
332370e812bSNamjae Jeon 	0x24c3, 0x24c4, 0x24c5, 0x24c6, 0x24c7, 0x24c8, 0x24c9, 0x24ca,
333370e812bSNamjae Jeon 	0x24cb, 0x24cc, 0x24cd, 0x24ce, 0x24cf, 0xffff, 0x0746, 0x2c00,
334370e812bSNamjae Jeon 	0x2c01, 0x2c02, 0x2c03, 0x2c04, 0x2c05, 0x2c06, 0x2c07, 0x2c08,
335370e812bSNamjae Jeon 	0x2c09, 0x2c0a, 0x2c0b, 0x2c0c, 0x2c0d, 0x2c0e, 0x2c0f, 0x2c10,
336370e812bSNamjae Jeon 	0x2c11, 0x2c12, 0x2c13, 0x2c14, 0x2c15, 0x2c16, 0x2c17, 0x2c18,
337370e812bSNamjae Jeon 	0x2c19, 0x2c1a, 0x2c1b, 0x2c1c, 0x2c1d, 0x2c1e, 0x2c1f, 0x2c20,
338370e812bSNamjae Jeon 	0x2c21, 0x2c22, 0x2c23, 0x2c24, 0x2c25, 0x2c26, 0x2c27, 0x2c28,
339370e812bSNamjae Jeon 	0x2c29, 0x2c2a, 0x2c2b, 0x2c2c, 0x2c2d, 0x2c2e, 0x2c5f, 0x2c60,
340370e812bSNamjae Jeon 	0x2c60, 0x2c62, 0x2c63, 0x2c64, 0x2c65, 0x2c66, 0x2c67, 0x2c67,
341370e812bSNamjae Jeon 	0x2c69, 0x2c69, 0x2c6b, 0x2c6b, 0x2c6d, 0x2c6e, 0x2c6f, 0x2c70,
342370e812bSNamjae Jeon 	0x2c71, 0x2c72, 0x2c73, 0x2c74, 0x2c75, 0x2c75, 0x2c77, 0x2c78,
343370e812bSNamjae Jeon 	0x2c79, 0x2c7a, 0x2c7b, 0x2c7c, 0x2c7d, 0x2c7e, 0x2c7f, 0x2c80,
344370e812bSNamjae Jeon 	0x2c80, 0x2c82, 0x2c82, 0x2c84, 0x2c84, 0x2c86, 0x2c86, 0x2c88,
345370e812bSNamjae Jeon 	0x2c88, 0x2c8a, 0x2c8a, 0x2c8c, 0x2c8c, 0x2c8e, 0x2c8e, 0x2c90,
346370e812bSNamjae Jeon 	0x2c90, 0x2c92, 0x2c92, 0x2c94, 0x2c94, 0x2c96, 0x2c96, 0x2c98,
347370e812bSNamjae Jeon 	0x2c98, 0x2c9a, 0x2c9a, 0x2c9c, 0x2c9c, 0x2c9e, 0x2c9e, 0x2ca0,
348370e812bSNamjae Jeon 	0x2ca0, 0x2ca2, 0x2ca2, 0x2ca4, 0x2ca4, 0x2ca6, 0x2ca6, 0x2ca8,
349370e812bSNamjae Jeon 	0x2ca8, 0x2caa, 0x2caa, 0x2cac, 0x2cac, 0x2cae, 0x2cae, 0x2cb0,
350370e812bSNamjae Jeon 	0x2cb0, 0x2cb2, 0x2cb2, 0x2cb4, 0x2cb4, 0x2cb6, 0x2cb6, 0x2cb8,
351370e812bSNamjae Jeon 	0x2cb8, 0x2cba, 0x2cba, 0x2cbc, 0x2cbc, 0x2cbe, 0x2cbe, 0x2cc0,
352370e812bSNamjae Jeon 	0x2cc0, 0x2cc2, 0x2cc2, 0x2cc4, 0x2cc4, 0x2cc6, 0x2cc6, 0x2cc8,
353370e812bSNamjae Jeon 	0x2cc8, 0x2cca, 0x2cca, 0x2ccc, 0x2ccc, 0x2cce, 0x2cce, 0x2cd0,
354370e812bSNamjae Jeon 	0x2cd0, 0x2cd2, 0x2cd2, 0x2cd4, 0x2cd4, 0x2cd6, 0x2cd6, 0x2cd8,
355370e812bSNamjae Jeon 	0x2cd8, 0x2cda, 0x2cda, 0x2cdc, 0x2cdc, 0x2cde, 0x2cde, 0x2ce0,
356370e812bSNamjae Jeon 	0x2ce0, 0x2ce2, 0x2ce2, 0x2ce4, 0x2ce5, 0x2ce6, 0x2ce7, 0x2ce8,
357370e812bSNamjae Jeon 	0x2ce9, 0x2cea, 0x2ceb, 0x2cec, 0x2ced, 0x2cee, 0x2cef, 0x2cf0,
358370e812bSNamjae Jeon 	0x2cf1, 0x2cf2, 0x2cf3, 0x2cf4, 0x2cf5, 0x2cf6, 0x2cf7, 0x2cf8,
359370e812bSNamjae Jeon 	0x2cf9, 0x2cfa, 0x2cfb, 0x2cfc, 0x2cfd, 0x2cfe, 0x2cff, 0x10a0,
360370e812bSNamjae Jeon 	0x10a1, 0x10a2, 0x10a3, 0x10a4, 0x10a5, 0x10a6, 0x10a7, 0x10a8,
361370e812bSNamjae Jeon 	0x10a9, 0x10aa, 0x10ab, 0x10ac, 0x10ad, 0x10ae, 0x10af, 0x10b0,
362370e812bSNamjae Jeon 	0x10b1, 0x10b2, 0x10b3, 0x10b4, 0x10b5, 0x10b6, 0x10b7, 0x10b8,
363370e812bSNamjae Jeon 	0x10b9, 0x10ba, 0x10bb, 0x10bc, 0x10bd, 0x10be, 0x10bf, 0x10c0,
364370e812bSNamjae Jeon 	0x10c1, 0x10c2, 0x10c3, 0x10c4, 0x10c5, 0xffff, 0xd21b, 0xff21,
365370e812bSNamjae Jeon 	0xff22, 0xff23, 0xff24, 0xff25, 0xff26, 0xff27, 0xff28, 0xff29,
366370e812bSNamjae Jeon 	0xff2a, 0xff2b, 0xff2c, 0xff2d, 0xff2e, 0xff2f, 0xff30, 0xff31,
367370e812bSNamjae Jeon 	0xff32, 0xff33, 0xff34, 0xff35, 0xff36, 0xff37, 0xff38, 0xff39,
368370e812bSNamjae Jeon 	0xff3a, 0xff5b, 0xff5c, 0xff5d, 0xff5e, 0xff5f, 0xff60, 0xff61,
369370e812bSNamjae Jeon 	0xff62, 0xff63, 0xff64, 0xff65, 0xff66, 0xff67, 0xff68, 0xff69,
370370e812bSNamjae Jeon 	0xff6a, 0xff6b, 0xff6c, 0xff6d, 0xff6e, 0xff6f, 0xff70, 0xff71,
371370e812bSNamjae Jeon 	0xff72, 0xff73, 0xff74, 0xff75, 0xff76, 0xff77, 0xff78, 0xff79,
372370e812bSNamjae Jeon 	0xff7a, 0xff7b, 0xff7c, 0xff7d, 0xff7e, 0xff7f, 0xff80, 0xff81,
373370e812bSNamjae Jeon 	0xff82, 0xff83, 0xff84, 0xff85, 0xff86, 0xff87, 0xff88, 0xff89,
374370e812bSNamjae Jeon 	0xff8a, 0xff8b, 0xff8c, 0xff8d, 0xff8e, 0xff8f, 0xff90, 0xff91,
375370e812bSNamjae Jeon 	0xff92, 0xff93, 0xff94, 0xff95, 0xff96, 0xff97, 0xff98, 0xff99,
376370e812bSNamjae Jeon 	0xff9a, 0xff9b, 0xff9c, 0xff9d, 0xff9e, 0xff9f, 0xffa0, 0xffa1,
377370e812bSNamjae Jeon 	0xffa2, 0xffa3, 0xffa4, 0xffa5, 0xffa6, 0xffa7, 0xffa8, 0xffa9,
378370e812bSNamjae Jeon 	0xffaa, 0xffab, 0xffac, 0xffad, 0xffae, 0xffaf, 0xffb0, 0xffb1,
379370e812bSNamjae Jeon 	0xffb2, 0xffb3, 0xffb4, 0xffb5, 0xffb6, 0xffb7, 0xffb8, 0xffb9,
380370e812bSNamjae Jeon 	0xffba, 0xffbb, 0xffbc, 0xffbd, 0xffbe, 0xffbf, 0xffc0, 0xffc1,
381370e812bSNamjae Jeon 	0xffc2, 0xffc3, 0xffc4, 0xffc5, 0xffc6, 0xffc7, 0xffc8, 0xffc9,
382370e812bSNamjae Jeon 	0xffca, 0xffcb, 0xffcc, 0xffcd, 0xffce, 0xffcf, 0xffd0, 0xffd1,
383370e812bSNamjae Jeon 	0xffd2, 0xffd3, 0xffd4, 0xffd5, 0xffd6, 0xffd7, 0xffd8, 0xffd9,
384370e812bSNamjae Jeon 	0xffda, 0xffdb, 0xffdc, 0xffdd, 0xffde, 0xffdf, 0xffe0, 0xffe1,
385370e812bSNamjae Jeon 	0xffe2, 0xffe3, 0xffe4, 0xffe5, 0xffe6, 0xffe7, 0xffe8, 0xffe9,
386370e812bSNamjae Jeon 	0xffea, 0xffeb, 0xffec, 0xffed, 0xffee, 0xffef, 0xfff0, 0xfff1,
387370e812bSNamjae Jeon 	0xfff2, 0xfff3, 0xfff4, 0xfff5, 0xfff6, 0xfff7, 0xfff8, 0xfff9,
388370e812bSNamjae Jeon 	0xfffa, 0xfffb, 0xfffc, 0xfffd, 0xfffe, 0xffff,
389370e812bSNamjae Jeon };
390370e812bSNamjae Jeon 
391370e812bSNamjae Jeon /*
392370e812bSNamjae Jeon  * Allow full-width illegal characters :
393370e812bSNamjae Jeon  * "MS windows 7" supports full-width-invalid-name-characters.
394370e812bSNamjae Jeon  * So we should check half-width-invalid-name-characters(ASCII) only
395370e812bSNamjae Jeon  * for compatibility.
396370e812bSNamjae Jeon  *
397370e812bSNamjae Jeon  * " * / : < > ? \ |
398370e812bSNamjae Jeon  */
399370e812bSNamjae Jeon static unsigned short bad_uni_chars[] = {
400370e812bSNamjae Jeon 	0x0022,         0x002A, 0x002F, 0x003A,
401370e812bSNamjae Jeon 	0x003C, 0x003E, 0x003F, 0x005C, 0x007C,
402370e812bSNamjae Jeon 	0
403370e812bSNamjae Jeon };
404370e812bSNamjae Jeon 
exfat_convert_char_to_ucs2(struct nls_table * nls,const unsigned char * ch,int ch_len,unsigned short * ucs2,int * lossy)405370e812bSNamjae Jeon static int exfat_convert_char_to_ucs2(struct nls_table *nls,
406370e812bSNamjae Jeon 		const unsigned char *ch, int ch_len, unsigned short *ucs2,
407370e812bSNamjae Jeon 		int *lossy)
408370e812bSNamjae Jeon {
409370e812bSNamjae Jeon 	int len;
410370e812bSNamjae Jeon 
411370e812bSNamjae Jeon 	*ucs2 = 0x0;
412370e812bSNamjae Jeon 
413370e812bSNamjae Jeon 	if (ch[0] < 0x80) {
414370e812bSNamjae Jeon 		*ucs2 = ch[0];
415370e812bSNamjae Jeon 		return 1;
416370e812bSNamjae Jeon 	}
417370e812bSNamjae Jeon 
418370e812bSNamjae Jeon 	len = nls->char2uni(ch, ch_len, ucs2);
419370e812bSNamjae Jeon 	if (len < 0) {
420370e812bSNamjae Jeon 		/* conversion failed */
421370e812bSNamjae Jeon 		if (lossy != NULL)
422370e812bSNamjae Jeon 			*lossy |= NLS_NAME_LOSSY;
423370e812bSNamjae Jeon 		*ucs2 = '_';
424370e812bSNamjae Jeon 		return 1;
425370e812bSNamjae Jeon 	}
426370e812bSNamjae Jeon 	return len;
427370e812bSNamjae Jeon }
428370e812bSNamjae Jeon 
exfat_convert_ucs2_to_char(struct nls_table * nls,unsigned short ucs2,unsigned char * ch,int * lossy)429370e812bSNamjae Jeon static int exfat_convert_ucs2_to_char(struct nls_table *nls,
430370e812bSNamjae Jeon 		unsigned short ucs2, unsigned char *ch, int *lossy)
431370e812bSNamjae Jeon {
432370e812bSNamjae Jeon 	int len;
433370e812bSNamjae Jeon 
434370e812bSNamjae Jeon 	ch[0] = 0x0;
435370e812bSNamjae Jeon 
436370e812bSNamjae Jeon 	if (ucs2 < 0x0080) {
437370e812bSNamjae Jeon 		ch[0] = ucs2;
438370e812bSNamjae Jeon 		return 1;
439370e812bSNamjae Jeon 	}
440370e812bSNamjae Jeon 
441370e812bSNamjae Jeon 	len = nls->uni2char(ucs2, ch, MAX_CHARSET_SIZE);
442370e812bSNamjae Jeon 	if (len < 0) {
443370e812bSNamjae Jeon 		/* conversion failed */
444370e812bSNamjae Jeon 		if (lossy != NULL)
445370e812bSNamjae Jeon 			*lossy |= NLS_NAME_LOSSY;
446370e812bSNamjae Jeon 		ch[0] = '_';
447370e812bSNamjae Jeon 		return 1;
448370e812bSNamjae Jeon 	}
449370e812bSNamjae Jeon 	return len;
450370e812bSNamjae Jeon }
451370e812bSNamjae Jeon 
exfat_toupper(struct super_block * sb,unsigned short a)452370e812bSNamjae Jeon unsigned short exfat_toupper(struct super_block *sb, unsigned short a)
453370e812bSNamjae Jeon {
454370e812bSNamjae Jeon 	struct exfat_sb_info *sbi = EXFAT_SB(sb);
455370e812bSNamjae Jeon 
456370e812bSNamjae Jeon 	return sbi->vol_utbl[a] ? sbi->vol_utbl[a] : a;
457370e812bSNamjae Jeon }
458370e812bSNamjae Jeon 
exfat_wstrchr(unsigned short * str,unsigned short wchar)459370e812bSNamjae Jeon static unsigned short *exfat_wstrchr(unsigned short *str, unsigned short wchar)
460370e812bSNamjae Jeon {
461370e812bSNamjae Jeon 	while (*str) {
462370e812bSNamjae Jeon 		if (*(str++) == wchar)
463370e812bSNamjae Jeon 			return str;
464370e812bSNamjae Jeon 	}
465370e812bSNamjae Jeon 	return NULL;
466370e812bSNamjae Jeon }
467370e812bSNamjae Jeon 
exfat_uniname_ncmp(struct super_block * sb,unsigned short * a,unsigned short * b,unsigned int len)468370e812bSNamjae Jeon int exfat_uniname_ncmp(struct super_block *sb, unsigned short *a,
469370e812bSNamjae Jeon 		unsigned short *b, unsigned int len)
470370e812bSNamjae Jeon {
471370e812bSNamjae Jeon 	int i;
472370e812bSNamjae Jeon 
473370e812bSNamjae Jeon 	for (i = 0; i < len; i++, a++, b++)
474370e812bSNamjae Jeon 		if (exfat_toupper(sb, *a) != exfat_toupper(sb, *b))
475370e812bSNamjae Jeon 			return 1;
476370e812bSNamjae Jeon 	return 0;
477370e812bSNamjae Jeon }
478370e812bSNamjae Jeon 
exfat_utf16_to_utf8(struct super_block * sb,struct exfat_uni_name * p_uniname,unsigned char * p_cstring,int buflen)479370e812bSNamjae Jeon static int exfat_utf16_to_utf8(struct super_block *sb,
480370e812bSNamjae Jeon 		struct exfat_uni_name *p_uniname, unsigned char *p_cstring,
481370e812bSNamjae Jeon 		int buflen)
482370e812bSNamjae Jeon {
483370e812bSNamjae Jeon 	int len;
484370e812bSNamjae Jeon 	const unsigned short *uniname = p_uniname->name;
485370e812bSNamjae Jeon 
486370e812bSNamjae Jeon 	/* always len >= 0 */
487370e812bSNamjae Jeon 	len = utf16s_to_utf8s(uniname, MAX_NAME_LENGTH, UTF16_HOST_ENDIAN,
488370e812bSNamjae Jeon 		p_cstring, buflen);
489370e812bSNamjae Jeon 	p_cstring[len] = '\0';
490370e812bSNamjae Jeon 	return len;
491370e812bSNamjae Jeon }
492370e812bSNamjae Jeon 
exfat_utf8_to_utf16(struct super_block * sb,const unsigned char * p_cstring,const int len,struct exfat_uni_name * p_uniname,int * p_lossy)493370e812bSNamjae Jeon static int exfat_utf8_to_utf16(struct super_block *sb,
494370e812bSNamjae Jeon 		const unsigned char *p_cstring, const int len,
495370e812bSNamjae Jeon 		struct exfat_uni_name *p_uniname, int *p_lossy)
496370e812bSNamjae Jeon {
497370e812bSNamjae Jeon 	int i, unilen, lossy = NLS_NAME_NO_LOSSY;
498db415f7aSIlya Ponetayev 	__le16 upname[MAX_NAME_LENGTH + 1];
499370e812bSNamjae Jeon 	unsigned short *uniname = p_uniname->name;
500370e812bSNamjae Jeon 
501370e812bSNamjae Jeon 	WARN_ON(!len);
502370e812bSNamjae Jeon 
503370e812bSNamjae Jeon 	unilen = utf8s_to_utf16s(p_cstring, len, UTF16_HOST_ENDIAN,
504370e812bSNamjae Jeon 			(wchar_t *)uniname, MAX_NAME_LENGTH + 2);
505370e812bSNamjae Jeon 	if (unilen < 0) {
506d1727d55SJoe Perches 		exfat_err(sb, "failed to %s (err : %d) nls len : %d",
507370e812bSNamjae Jeon 			  __func__, unilen, len);
508370e812bSNamjae Jeon 		return unilen;
509370e812bSNamjae Jeon 	}
510370e812bSNamjae Jeon 
511370e812bSNamjae Jeon 	if (unilen > MAX_NAME_LENGTH) {
51264fca6e6STakashi Iwai 		exfat_debug(sb, "failed to %s (estr:ENAMETOOLONG) nls len : %d, unilen : %d > %d",
513370e812bSNamjae Jeon 			  __func__, len, unilen, MAX_NAME_LENGTH);
514370e812bSNamjae Jeon 		return -ENAMETOOLONG;
515370e812bSNamjae Jeon 	}
516370e812bSNamjae Jeon 
517370e812bSNamjae Jeon 	for (i = 0; i < unilen; i++) {
518370e812bSNamjae Jeon 		if (*uniname < 0x0020 ||
519370e812bSNamjae Jeon 		    exfat_wstrchr(bad_uni_chars, *uniname))
520370e812bSNamjae Jeon 			lossy |= NLS_NAME_LOSSY;
521370e812bSNamjae Jeon 
522db415f7aSIlya Ponetayev 		upname[i] = cpu_to_le16(exfat_toupper(sb, *uniname));
523370e812bSNamjae Jeon 		uniname++;
524370e812bSNamjae Jeon 	}
525370e812bSNamjae Jeon 
526370e812bSNamjae Jeon 	*uniname = '\0';
527370e812bSNamjae Jeon 	p_uniname->name_len = unilen;
5285875bf28STetsuhiro Kohada 	p_uniname->name_hash = exfat_calc_chksum16(upname, unilen << 1, 0,
529370e812bSNamjae Jeon 			CS_DEFAULT);
530370e812bSNamjae Jeon 
531370e812bSNamjae Jeon 	if (p_lossy)
532370e812bSNamjae Jeon 		*p_lossy = lossy;
533370e812bSNamjae Jeon 	return unilen;
534370e812bSNamjae Jeon }
535370e812bSNamjae Jeon 
536370e812bSNamjae Jeon #define SURROGATE_MASK	0xfffff800
537370e812bSNamjae Jeon #define SURROGATE_PAIR	0x0000d800
538370e812bSNamjae Jeon #define SURROGATE_LOW	0x00000400
539370e812bSNamjae Jeon 
__exfat_utf16_to_nls(struct super_block * sb,struct exfat_uni_name * p_uniname,unsigned char * p_cstring,int buflen)540370e812bSNamjae Jeon static int __exfat_utf16_to_nls(struct super_block *sb,
541370e812bSNamjae Jeon 		struct exfat_uni_name *p_uniname, unsigned char *p_cstring,
542370e812bSNamjae Jeon 		int buflen)
543370e812bSNamjae Jeon {
544370e812bSNamjae Jeon 	int i, j, len, out_len = 0;
545370e812bSNamjae Jeon 	unsigned char buf[MAX_CHARSET_SIZE];
546370e812bSNamjae Jeon 	const unsigned short *uniname = p_uniname->name;
547370e812bSNamjae Jeon 	struct nls_table *nls = EXFAT_SB(sb)->nls_io;
548370e812bSNamjae Jeon 
549370e812bSNamjae Jeon 	i = 0;
550370e812bSNamjae Jeon 	while (i < MAX_NAME_LENGTH && out_len < (buflen - 1)) {
551370e812bSNamjae Jeon 		if (*uniname == '\0')
552370e812bSNamjae Jeon 			break;
553370e812bSNamjae Jeon 		if ((*uniname & SURROGATE_MASK) != SURROGATE_PAIR) {
554370e812bSNamjae Jeon 			len = exfat_convert_ucs2_to_char(nls, *uniname, buf,
555370e812bSNamjae Jeon 				NULL);
556370e812bSNamjae Jeon 		} else {
557370e812bSNamjae Jeon 			/* Process UTF-16 surrogate pair as one character */
558370e812bSNamjae Jeon 			if (!(*uniname & SURROGATE_LOW) &&
559370e812bSNamjae Jeon 			    i+1 < MAX_NAME_LENGTH &&
560370e812bSNamjae Jeon 			    (*(uniname+1) & SURROGATE_MASK) == SURROGATE_PAIR &&
561370e812bSNamjae Jeon 			    (*(uniname+1) & SURROGATE_LOW)) {
562370e812bSNamjae Jeon 				uniname++;
563370e812bSNamjae Jeon 				i++;
564370e812bSNamjae Jeon 			}
565370e812bSNamjae Jeon 
566370e812bSNamjae Jeon 			/*
567370e812bSNamjae Jeon 			 * UTF-16 surrogate pair encodes code points above
568370e812bSNamjae Jeon 			 * U+FFFF. Code points above U+FFFF are not supported
569370e812bSNamjae Jeon 			 * by kernel NLS framework therefore use replacement
570370e812bSNamjae Jeon 			 * character
571370e812bSNamjae Jeon 			 */
572370e812bSNamjae Jeon 			len = 1;
573370e812bSNamjae Jeon 			buf[0] = '_';
574370e812bSNamjae Jeon 		}
575370e812bSNamjae Jeon 
576370e812bSNamjae Jeon 		if (out_len + len >= buflen)
577370e812bSNamjae Jeon 			len = buflen - 1 - out_len;
578370e812bSNamjae Jeon 		out_len += len;
579370e812bSNamjae Jeon 
580370e812bSNamjae Jeon 		if (len > 1) {
581370e812bSNamjae Jeon 			for (j = 0; j < len; j++)
582370e812bSNamjae Jeon 				*p_cstring++ = buf[j];
583370e812bSNamjae Jeon 		} else { /* len == 1 */
584370e812bSNamjae Jeon 			*p_cstring++ = *buf;
585370e812bSNamjae Jeon 		}
586370e812bSNamjae Jeon 
587370e812bSNamjae Jeon 		uniname++;
588370e812bSNamjae Jeon 		i++;
589370e812bSNamjae Jeon 	}
590370e812bSNamjae Jeon 
591370e812bSNamjae Jeon 	*p_cstring = '\0';
592370e812bSNamjae Jeon 	return out_len;
593370e812bSNamjae Jeon }
594370e812bSNamjae Jeon 
exfat_nls_to_ucs2(struct super_block * sb,const unsigned char * p_cstring,const int len,struct exfat_uni_name * p_uniname,int * p_lossy)595370e812bSNamjae Jeon static int exfat_nls_to_ucs2(struct super_block *sb,
596370e812bSNamjae Jeon 		const unsigned char *p_cstring, const int len,
597370e812bSNamjae Jeon 		struct exfat_uni_name *p_uniname, int *p_lossy)
598370e812bSNamjae Jeon {
599370e812bSNamjae Jeon 	int i = 0, unilen = 0, lossy = NLS_NAME_NO_LOSSY;
600db415f7aSIlya Ponetayev 	__le16 upname[MAX_NAME_LENGTH + 1];
601370e812bSNamjae Jeon 	unsigned short *uniname = p_uniname->name;
602370e812bSNamjae Jeon 	struct nls_table *nls = EXFAT_SB(sb)->nls_io;
603370e812bSNamjae Jeon 
604370e812bSNamjae Jeon 	WARN_ON(!len);
605370e812bSNamjae Jeon 
606370e812bSNamjae Jeon 	while (unilen < MAX_NAME_LENGTH && i < len) {
607370e812bSNamjae Jeon 		i += exfat_convert_char_to_ucs2(nls, p_cstring + i, len - i,
608370e812bSNamjae Jeon 				uniname, &lossy);
609370e812bSNamjae Jeon 
610370e812bSNamjae Jeon 		if (*uniname < 0x0020 ||
611370e812bSNamjae Jeon 		    exfat_wstrchr(bad_uni_chars, *uniname))
612370e812bSNamjae Jeon 			lossy |= NLS_NAME_LOSSY;
613370e812bSNamjae Jeon 
614db415f7aSIlya Ponetayev 		upname[unilen] = cpu_to_le16(exfat_toupper(sb, *uniname));
615370e812bSNamjae Jeon 		uniname++;
616370e812bSNamjae Jeon 		unilen++;
617370e812bSNamjae Jeon 	}
618370e812bSNamjae Jeon 
619370e812bSNamjae Jeon 	if (p_cstring[i] != '\0')
620370e812bSNamjae Jeon 		lossy |= NLS_NAME_OVERLEN;
621370e812bSNamjae Jeon 
622370e812bSNamjae Jeon 	*uniname = '\0';
623370e812bSNamjae Jeon 	p_uniname->name_len = unilen;
6245875bf28STetsuhiro Kohada 	p_uniname->name_hash = exfat_calc_chksum16(upname, unilen << 1, 0,
625370e812bSNamjae Jeon 			CS_DEFAULT);
626370e812bSNamjae Jeon 
627370e812bSNamjae Jeon 	if (p_lossy)
628370e812bSNamjae Jeon 		*p_lossy = lossy;
629370e812bSNamjae Jeon 	return unilen;
630370e812bSNamjae Jeon }
631370e812bSNamjae Jeon 
exfat_utf16_to_nls(struct super_block * sb,struct exfat_uni_name * uniname,unsigned char * p_cstring,int buflen)632370e812bSNamjae Jeon int exfat_utf16_to_nls(struct super_block *sb, struct exfat_uni_name *uniname,
633370e812bSNamjae Jeon 		unsigned char *p_cstring, int buflen)
634370e812bSNamjae Jeon {
635370e812bSNamjae Jeon 	if (EXFAT_SB(sb)->options.utf8)
636370e812bSNamjae Jeon 		return exfat_utf16_to_utf8(sb, uniname, p_cstring,
637370e812bSNamjae Jeon 				buflen);
638370e812bSNamjae Jeon 	return __exfat_utf16_to_nls(sb, uniname, p_cstring, buflen);
639370e812bSNamjae Jeon }
640370e812bSNamjae Jeon 
exfat_nls_to_utf16(struct super_block * sb,const unsigned char * p_cstring,const int len,struct exfat_uni_name * uniname,int * p_lossy)641370e812bSNamjae Jeon int exfat_nls_to_utf16(struct super_block *sb, const unsigned char *p_cstring,
642370e812bSNamjae Jeon 		const int len, struct exfat_uni_name *uniname, int *p_lossy)
643370e812bSNamjae Jeon {
644370e812bSNamjae Jeon 	if (EXFAT_SB(sb)->options.utf8)
645370e812bSNamjae Jeon 		return exfat_utf8_to_utf16(sb, p_cstring, len,
646370e812bSNamjae Jeon 				uniname, p_lossy);
647370e812bSNamjae Jeon 	return exfat_nls_to_ucs2(sb, p_cstring, len, uniname, p_lossy);
648370e812bSNamjae Jeon }
649370e812bSNamjae Jeon 
exfat_load_upcase_table(struct super_block * sb,sector_t sector,unsigned long long num_sectors,unsigned int utbl_checksum)650370e812bSNamjae Jeon static int exfat_load_upcase_table(struct super_block *sb,
651370e812bSNamjae Jeon 		sector_t sector, unsigned long long num_sectors,
652370e812bSNamjae Jeon 		unsigned int utbl_checksum)
653370e812bSNamjae Jeon {
654370e812bSNamjae Jeon 	struct exfat_sb_info *sbi = EXFAT_SB(sb);
655370e812bSNamjae Jeon 	unsigned int sect_size = sb->s_blocksize;
6565875bf28STetsuhiro Kohada 	unsigned int i, index = 0;
6575875bf28STetsuhiro Kohada 	u32 chksum = 0;
658370e812bSNamjae Jeon 	int ret;
659370e812bSNamjae Jeon 	unsigned char skip = false;
660370e812bSNamjae Jeon 	unsigned short *upcase_table;
661370e812bSNamjae Jeon 
6629eb78c25SArtem Labazov 	upcase_table = kvcalloc(UTBL_COUNT, sizeof(unsigned short), GFP_KERNEL);
663370e812bSNamjae Jeon 	if (!upcase_table)
664370e812bSNamjae Jeon 		return -ENOMEM;
665370e812bSNamjae Jeon 
666370e812bSNamjae Jeon 	sbi->vol_utbl = upcase_table;
667370e812bSNamjae Jeon 	num_sectors += sector;
668370e812bSNamjae Jeon 
669370e812bSNamjae Jeon 	while (sector < num_sectors) {
670370e812bSNamjae Jeon 		struct buffer_head *bh;
671370e812bSNamjae Jeon 
672370e812bSNamjae Jeon 		bh = sb_bread(sb, sector);
673370e812bSNamjae Jeon 		if (!bh) {
674*512b74d1STakashi Iwai 			exfat_err(sb, "failed to read sector(0x%llx)",
675370e812bSNamjae Jeon 				  (unsigned long long)sector);
676370e812bSNamjae Jeon 			ret = -EIO;
677370e812bSNamjae Jeon 			goto free_table;
678370e812bSNamjae Jeon 		}
679370e812bSNamjae Jeon 		sector++;
680370e812bSNamjae Jeon 		for (i = 0; i < sect_size && index <= 0xFFFF; i += 2) {
681370e812bSNamjae Jeon 			unsigned short uni = get_unaligned_le16(bh->b_data + i);
682370e812bSNamjae Jeon 
683370e812bSNamjae Jeon 			if (skip) {
684370e812bSNamjae Jeon 				index += uni;
685370e812bSNamjae Jeon 				skip = false;
686370e812bSNamjae Jeon 			} else if (uni == index) {
687370e812bSNamjae Jeon 				index++;
688370e812bSNamjae Jeon 			} else if (uni == 0xFFFF) {
689370e812bSNamjae Jeon 				skip = true;
690370e812bSNamjae Jeon 			} else { /* uni != index , uni != 0xFFFF */
691370e812bSNamjae Jeon 				upcase_table[index] = uni;
692370e812bSNamjae Jeon 				index++;
693370e812bSNamjae Jeon 			}
694370e812bSNamjae Jeon 		}
6955875bf28STetsuhiro Kohada 		chksum = exfat_calc_chksum32(bh->b_data, i, chksum, CS_DEFAULT);
696fc961522SDan Carpenter 		brelse(bh);
697370e812bSNamjae Jeon 	}
698370e812bSNamjae Jeon 
6995875bf28STetsuhiro Kohada 	if (index >= 0xFFFF && utbl_checksum == chksum)
700370e812bSNamjae Jeon 		return 0;
701370e812bSNamjae Jeon 
702d1727d55SJoe Perches 	exfat_err(sb, "failed to load upcase table (idx : 0x%08x, chksum : 0x%08x, utbl_chksum : 0x%08x)",
7035875bf28STetsuhiro Kohada 		  index, chksum, utbl_checksum);
704370e812bSNamjae Jeon 	ret = -EINVAL;
705370e812bSNamjae Jeon free_table:
706370e812bSNamjae Jeon 	exfat_free_upcase_table(sbi);
707370e812bSNamjae Jeon 	return ret;
708370e812bSNamjae Jeon }
709370e812bSNamjae Jeon 
exfat_load_default_upcase_table(struct super_block * sb)710370e812bSNamjae Jeon static int exfat_load_default_upcase_table(struct super_block *sb)
711370e812bSNamjae Jeon {
712370e812bSNamjae Jeon 	int i, ret = -EIO;
713370e812bSNamjae Jeon 	struct exfat_sb_info *sbi = EXFAT_SB(sb);
714370e812bSNamjae Jeon 	unsigned char skip = false;
715370e812bSNamjae Jeon 	unsigned short uni = 0, *upcase_table;
716370e812bSNamjae Jeon 	unsigned int index = 0;
717370e812bSNamjae Jeon 
7189eb78c25SArtem Labazov 	upcase_table = kvcalloc(UTBL_COUNT, sizeof(unsigned short), GFP_KERNEL);
719370e812bSNamjae Jeon 	if (!upcase_table)
720370e812bSNamjae Jeon 		return -ENOMEM;
721370e812bSNamjae Jeon 
722370e812bSNamjae Jeon 	sbi->vol_utbl = upcase_table;
723370e812bSNamjae Jeon 
724370e812bSNamjae Jeon 	for (i = 0; index <= 0xFFFF && i < EXFAT_NUM_UPCASE; i++) {
725370e812bSNamjae Jeon 		uni = uni_def_upcase[i];
726370e812bSNamjae Jeon 		if (skip) {
727370e812bSNamjae Jeon 			index += uni;
728370e812bSNamjae Jeon 			skip = false;
729370e812bSNamjae Jeon 		} else if (uni == index) {
730370e812bSNamjae Jeon 			index++;
731370e812bSNamjae Jeon 		} else if (uni == 0xFFFF) {
732370e812bSNamjae Jeon 			skip = true;
733370e812bSNamjae Jeon 		} else {
734370e812bSNamjae Jeon 			upcase_table[index] = uni;
735370e812bSNamjae Jeon 			index++;
736370e812bSNamjae Jeon 		}
737370e812bSNamjae Jeon 	}
738370e812bSNamjae Jeon 
739370e812bSNamjae Jeon 	if (index >= 0xFFFF)
740370e812bSNamjae Jeon 		return 0;
741370e812bSNamjae Jeon 
742370e812bSNamjae Jeon 	/* FATAL error: default upcase table has error */
743370e812bSNamjae Jeon 	exfat_free_upcase_table(sbi);
744370e812bSNamjae Jeon 	return ret;
745370e812bSNamjae Jeon }
746370e812bSNamjae Jeon 
exfat_create_upcase_table(struct super_block * sb)747370e812bSNamjae Jeon int exfat_create_upcase_table(struct super_block *sb)
748370e812bSNamjae Jeon {
749370e812bSNamjae Jeon 	int i, ret;
750370e812bSNamjae Jeon 	unsigned int tbl_clu, type;
751370e812bSNamjae Jeon 	sector_t sector;
752370e812bSNamjae Jeon 	unsigned long long tbl_size, num_sectors;
753370e812bSNamjae Jeon 	unsigned char blksize_bits = sb->s_blocksize_bits;
754370e812bSNamjae Jeon 	struct exfat_chain clu;
755370e812bSNamjae Jeon 	struct exfat_dentry *ep;
756370e812bSNamjae Jeon 	struct exfat_sb_info *sbi = EXFAT_SB(sb);
757370e812bSNamjae Jeon 	struct buffer_head *bh;
758370e812bSNamjae Jeon 
759370e812bSNamjae Jeon 	clu.dir = sbi->root_dir;
760370e812bSNamjae Jeon 	clu.flags = ALLOC_FAT_CHAIN;
761370e812bSNamjae Jeon 
762370e812bSNamjae Jeon 	while (clu.dir != EXFAT_EOF_CLUSTER) {
763370e812bSNamjae Jeon 		for (i = 0; i < sbi->dentries_per_clu; i++) {
764c71510b3SYuezhang.Mo 			ep = exfat_get_dentry(sb, &clu, i, &bh);
765370e812bSNamjae Jeon 			if (!ep)
766370e812bSNamjae Jeon 				return -EIO;
767370e812bSNamjae Jeon 
768370e812bSNamjae Jeon 			type = exfat_get_entry_type(ep);
769370e812bSNamjae Jeon 			if (type == TYPE_UNUSED) {
770370e812bSNamjae Jeon 				brelse(bh);
771370e812bSNamjae Jeon 				break;
772370e812bSNamjae Jeon 			}
773370e812bSNamjae Jeon 
774370e812bSNamjae Jeon 			if (type != TYPE_UPCASE) {
775370e812bSNamjae Jeon 				brelse(bh);
776370e812bSNamjae Jeon 				continue;
777370e812bSNamjae Jeon 			}
778370e812bSNamjae Jeon 
779370e812bSNamjae Jeon 			tbl_clu  = le32_to_cpu(ep->dentry.upcase.start_clu);
780370e812bSNamjae Jeon 			tbl_size = le64_to_cpu(ep->dentry.upcase.size);
781370e812bSNamjae Jeon 
782370e812bSNamjae Jeon 			sector = exfat_cluster_to_sector(sbi, tbl_clu);
783370e812bSNamjae Jeon 			num_sectors = ((tbl_size - 1) >> blksize_bits) + 1;
784370e812bSNamjae Jeon 			ret = exfat_load_upcase_table(sb, sector, num_sectors,
785370e812bSNamjae Jeon 				le32_to_cpu(ep->dentry.upcase.checksum));
786370e812bSNamjae Jeon 
787370e812bSNamjae Jeon 			brelse(bh);
788370e812bSNamjae Jeon 			if (ret && ret != -EIO)
789370e812bSNamjae Jeon 				goto load_default;
790370e812bSNamjae Jeon 
791370e812bSNamjae Jeon 			/* load successfully */
792370e812bSNamjae Jeon 			return ret;
793370e812bSNamjae Jeon 		}
794370e812bSNamjae Jeon 
795370e812bSNamjae Jeon 		if (exfat_get_next_cluster(sb, &(clu.dir)))
796370e812bSNamjae Jeon 			return -EIO;
797370e812bSNamjae Jeon 	}
798370e812bSNamjae Jeon 
799370e812bSNamjae Jeon load_default:
800370e812bSNamjae Jeon 	/* load default upcase table */
801370e812bSNamjae Jeon 	return exfat_load_default_upcase_table(sb);
802370e812bSNamjae Jeon }
803370e812bSNamjae Jeon 
exfat_free_upcase_table(struct exfat_sb_info * sbi)804370e812bSNamjae Jeon void exfat_free_upcase_table(struct exfat_sb_info *sbi)
805370e812bSNamjae Jeon {
8069eb78c25SArtem Labazov 	kvfree(sbi->vol_utbl);
807370e812bSNamjae Jeon }
808