diff options
108 files changed, 10620 insertions, 699 deletions
@@ -113,3 +113,5 @@ Uwe Kleine-König <Uwe.Kleine-Koenig@digi.com> | |||
113 | Valdis Kletnieks <Valdis.Kletnieks@vt.edu> | 113 | Valdis Kletnieks <Valdis.Kletnieks@vt.edu> |
114 | Takashi YOSHII <takashi.yoshii.zj@renesas.com> | 114 | Takashi YOSHII <takashi.yoshii.zj@renesas.com> |
115 | Yusuke Goda <goda.yusuke@renesas.com> | 115 | Yusuke Goda <goda.yusuke@renesas.com> |
116 | Gustavo Padovan <gustavo@las.ic.unicamp.br> | ||
117 | Gustavo Padovan <padovan@profusion.mobi> | ||
diff --git a/Documentation/CodingStyle b/Documentation/CodingStyle index c58b236bbe04..cb9258b8fd35 100644 --- a/Documentation/CodingStyle +++ b/Documentation/CodingStyle | |||
@@ -671,8 +671,9 @@ ones already enabled by DEBUG. | |||
671 | Chapter 14: Allocating memory | 671 | Chapter 14: Allocating memory |
672 | 672 | ||
673 | The kernel provides the following general purpose memory allocators: | 673 | The kernel provides the following general purpose memory allocators: |
674 | kmalloc(), kzalloc(), kcalloc(), vmalloc(), and vzalloc(). Please refer to | 674 | kmalloc(), kzalloc(), kmalloc_array(), kcalloc(), vmalloc(), and |
675 | the API documentation for further information about them. | 675 | vzalloc(). Please refer to the API documentation for further information |
676 | about them. | ||
676 | 677 | ||
677 | The preferred form for passing a size of a struct is the following: | 678 | The preferred form for passing a size of a struct is the following: |
678 | 679 | ||
@@ -686,6 +687,17 @@ Casting the return value which is a void pointer is redundant. The conversion | |||
686 | from void pointer to any other pointer type is guaranteed by the C programming | 687 | from void pointer to any other pointer type is guaranteed by the C programming |
687 | language. | 688 | language. |
688 | 689 | ||
690 | The preferred form for allocating an array is the following: | ||
691 | |||
692 | p = kmalloc_array(n, sizeof(...), ...); | ||
693 | |||
694 | The preferred form for allocating a zeroed array is the following: | ||
695 | |||
696 | p = kcalloc(n, sizeof(...), ...); | ||
697 | |||
698 | Both forms check for overflow on the allocation size n * sizeof(...), | ||
699 | and return NULL if that occurred. | ||
700 | |||
689 | 701 | ||
690 | Chapter 15: The inline disease | 702 | Chapter 15: The inline disease |
691 | 703 | ||
diff --git a/Documentation/filesystems/proc.txt b/Documentation/filesystems/proc.txt index 912af6ce5626..fb0a6aeb936c 100644 --- a/Documentation/filesystems/proc.txt +++ b/Documentation/filesystems/proc.txt | |||
@@ -40,6 +40,7 @@ Table of Contents | |||
40 | 3.4 /proc/<pid>/coredump_filter - Core dump filtering settings | 40 | 3.4 /proc/<pid>/coredump_filter - Core dump filtering settings |
41 | 3.5 /proc/<pid>/mountinfo - Information about mounts | 41 | 3.5 /proc/<pid>/mountinfo - Information about mounts |
42 | 3.6 /proc/<pid>/comm & /proc/<pid>/task/<tid>/comm | 42 | 3.6 /proc/<pid>/comm & /proc/<pid>/task/<tid>/comm |
43 | 3.7 /proc/<pid>/task/<tid>/children - Information about task children | ||
43 | 44 | ||
44 | 4 Configuring procfs | 45 | 4 Configuring procfs |
45 | 4.1 Mount options | 46 | 4.1 Mount options |
@@ -310,6 +311,11 @@ Table 1-4: Contents of the stat files (as of 2.6.30-rc7) | |||
310 | start_data address above which program data+bss is placed | 311 | start_data address above which program data+bss is placed |
311 | end_data address below which program data+bss is placed | 312 | end_data address below which program data+bss is placed |
312 | start_brk address above which program heap can be expanded with brk() | 313 | start_brk address above which program heap can be expanded with brk() |
314 | arg_start address above which program command line is placed | ||
315 | arg_end address below which program command line is placed | ||
316 | env_start address above which program environment is placed | ||
317 | env_end address below which program environment is placed | ||
318 | exit_code the thread's exit_code in the form reported by the waitpid system call | ||
313 | .............................................................................. | 319 | .............................................................................. |
314 | 320 | ||
315 | The /proc/PID/maps file containing the currently mapped memory regions and | 321 | The /proc/PID/maps file containing the currently mapped memory regions and |
@@ -1578,6 +1584,23 @@ then the kernel's TASK_COMM_LEN (currently 16 chars) will result in a truncated | |||
1578 | comm value. | 1584 | comm value. |
1579 | 1585 | ||
1580 | 1586 | ||
1587 | 3.7 /proc/<pid>/task/<tid>/children - Information about task children | ||
1588 | ------------------------------------------------------------------------- | ||
1589 | This file provides a fast way to retrieve first level children pids | ||
1590 | of a task pointed by <pid>/<tid> pair. The format is a space separated | ||
1591 | stream of pids. | ||
1592 | |||
1593 | Note the "first level" here -- if a child has own children they will | ||
1594 | not be listed here, one needs to read /proc/<children-pid>/task/<tid>/children | ||
1595 | to obtain the descendants. | ||
1596 | |||
1597 | Since this interface is intended to be fast and cheap it doesn't | ||
1598 | guarantee to provide precise results and some children might be | ||
1599 | skipped, especially if they've exited right after we printed their | ||
1600 | pids, so one need to either stop or freeze processes being inspected | ||
1601 | if precise results are needed. | ||
1602 | |||
1603 | |||
1581 | ------------------------------------------------------------------------------ | 1604 | ------------------------------------------------------------------------------ |
1582 | Configuring procfs | 1605 | Configuring procfs |
1583 | ------------------------------------------------------------------------------ | 1606 | ------------------------------------------------------------------------------ |
diff --git a/Documentation/sysctl/fs.txt b/Documentation/sysctl/fs.txt index 88fd7f5c8dcd..13d6166d7a27 100644 --- a/Documentation/sysctl/fs.txt +++ b/Documentation/sysctl/fs.txt | |||
@@ -225,6 +225,13 @@ a queue must be less or equal then msg_max. | |||
225 | maximum message size value (it is every message queue's attribute set during | 225 | maximum message size value (it is every message queue's attribute set during |
226 | its creation). | 226 | its creation). |
227 | 227 | ||
228 | /proc/sys/fs/mqueue/msg_default is a read/write file for setting/getting the | ||
229 | default number of messages in a queue value if attr parameter of mq_open(2) is | ||
230 | NULL. If it exceed msg_max, the default value is initialized msg_max. | ||
231 | |||
232 | /proc/sys/fs/mqueue/msgsize_default is a read/write file for setting/getting | ||
233 | the default message size value if attr parameter of mq_open(2) is NULL. If it | ||
234 | exceed msgsize_max, the default value is initialized msgsize_max. | ||
228 | 235 | ||
229 | 4. /proc/sys/fs/epoll - Configuration options for the epoll interface | 236 | 4. /proc/sys/fs/epoll - Configuration options for the epoll interface |
230 | -------------------------------------------------------- | 237 | -------------------------------------------------------- |
diff --git a/Documentation/vm/pagemap.txt b/Documentation/vm/pagemap.txt index 4600cbe3d6be..7587493c67f1 100644 --- a/Documentation/vm/pagemap.txt +++ b/Documentation/vm/pagemap.txt | |||
@@ -16,7 +16,7 @@ There are three components to pagemap: | |||
16 | * Bits 0-4 swap type if swapped | 16 | * Bits 0-4 swap type if swapped |
17 | * Bits 5-54 swap offset if swapped | 17 | * Bits 5-54 swap offset if swapped |
18 | * Bits 55-60 page shift (page size = 1<<page shift) | 18 | * Bits 55-60 page shift (page size = 1<<page shift) |
19 | * Bit 61 reserved for future use | 19 | * Bit 61 page is file-page or shared-anon |
20 | * Bit 62 page swapped | 20 | * Bit 62 page swapped |
21 | * Bit 63 page present | 21 | * Bit 63 page present |
22 | 22 | ||
diff --git a/arch/arm/kernel/smp.c b/arch/arm/kernel/smp.c index b735521a4a54..2c7217d971db 100644 --- a/arch/arm/kernel/smp.c +++ b/arch/arm/kernel/smp.c | |||
@@ -109,7 +109,6 @@ static void percpu_timer_stop(void); | |||
109 | int __cpu_disable(void) | 109 | int __cpu_disable(void) |
110 | { | 110 | { |
111 | unsigned int cpu = smp_processor_id(); | 111 | unsigned int cpu = smp_processor_id(); |
112 | struct task_struct *p; | ||
113 | int ret; | 112 | int ret; |
114 | 113 | ||
115 | ret = platform_cpu_disable(cpu); | 114 | ret = platform_cpu_disable(cpu); |
@@ -139,12 +138,7 @@ int __cpu_disable(void) | |||
139 | flush_cache_all(); | 138 | flush_cache_all(); |
140 | local_flush_tlb_all(); | 139 | local_flush_tlb_all(); |
141 | 140 | ||
142 | read_lock(&tasklist_lock); | 141 | clear_tasks_mm_cpumask(cpu); |
143 | for_each_process(p) { | ||
144 | if (p->mm) | ||
145 | cpumask_clear_cpu(cpu, mm_cpumask(p->mm)); | ||
146 | } | ||
147 | read_unlock(&tasklist_lock); | ||
148 | 142 | ||
149 | return 0; | 143 | return 0; |
150 | } | 144 | } |
diff --git a/arch/blackfin/kernel/trace.c b/arch/blackfin/kernel/trace.c index 44bbf2f564cb..f7f7a18abca9 100644 --- a/arch/blackfin/kernel/trace.c +++ b/arch/blackfin/kernel/trace.c | |||
@@ -10,6 +10,8 @@ | |||
10 | #include <linux/hardirq.h> | 10 | #include <linux/hardirq.h> |
11 | #include <linux/thread_info.h> | 11 | #include <linux/thread_info.h> |
12 | #include <linux/mm.h> | 12 | #include <linux/mm.h> |
13 | #include <linux/oom.h> | ||
14 | #include <linux/sched.h> | ||
13 | #include <linux/uaccess.h> | 15 | #include <linux/uaccess.h> |
14 | #include <linux/module.h> | 16 | #include <linux/module.h> |
15 | #include <linux/kallsyms.h> | 17 | #include <linux/kallsyms.h> |
@@ -27,8 +29,7 @@ void decode_address(char *buf, unsigned long address) | |||
27 | { | 29 | { |
28 | struct task_struct *p; | 30 | struct task_struct *p; |
29 | struct mm_struct *mm; | 31 | struct mm_struct *mm; |
30 | unsigned long flags, offset; | 32 | unsigned long offset; |
31 | unsigned char in_atomic = (bfin_read_IPEND() & 0x10) || in_atomic(); | ||
32 | struct rb_node *n; | 33 | struct rb_node *n; |
33 | 34 | ||
34 | #ifdef CONFIG_KALLSYMS | 35 | #ifdef CONFIG_KALLSYMS |
@@ -112,17 +113,17 @@ void decode_address(char *buf, unsigned long address) | |||
112 | * mappings of all our processes and see if we can't be a whee | 113 | * mappings of all our processes and see if we can't be a whee |
113 | * bit more specific | 114 | * bit more specific |
114 | */ | 115 | */ |
115 | write_lock_irqsave(&tasklist_lock, flags); | 116 | read_lock(&tasklist_lock); |
116 | for_each_process(p) { | 117 | for_each_process(p) { |
117 | mm = (in_atomic ? p->mm : get_task_mm(p)); | 118 | struct task_struct *t; |
118 | if (!mm) | ||
119 | continue; | ||
120 | 119 | ||
121 | if (!down_read_trylock(&mm->mmap_sem)) { | 120 | t = find_lock_task_mm(p); |
122 | if (!in_atomic) | 121 | if (!t) |
123 | mmput(mm); | ||
124 | continue; | 122 | continue; |
125 | } | 123 | |
124 | mm = t->mm; | ||
125 | if (!down_read_trylock(&mm->mmap_sem)) | ||
126 | goto __continue; | ||
126 | 127 | ||
127 | for (n = rb_first(&mm->mm_rb); n; n = rb_next(n)) { | 128 | for (n = rb_first(&mm->mm_rb); n; n = rb_next(n)) { |
128 | struct vm_area_struct *vma; | 129 | struct vm_area_struct *vma; |
@@ -131,7 +132,7 @@ void decode_address(char *buf, unsigned long address) | |||
131 | 132 | ||
132 | if (address >= vma->vm_start && address < vma->vm_end) { | 133 | if (address >= vma->vm_start && address < vma->vm_end) { |
133 | char _tmpbuf[256]; | 134 | char _tmpbuf[256]; |
134 | char *name = p->comm; | 135 | char *name = t->comm; |
135 | struct file *file = vma->vm_file; | 136 | struct file *file = vma->vm_file; |
136 | 137 | ||
137 | if (file) { | 138 | if (file) { |
@@ -164,8 +165,7 @@ void decode_address(char *buf, unsigned long address) | |||
164 | name, vma->vm_start, vma->vm_end); | 165 | name, vma->vm_start, vma->vm_end); |
165 | 166 | ||
166 | up_read(&mm->mmap_sem); | 167 | up_read(&mm->mmap_sem); |
167 | if (!in_atomic) | 168 | task_unlock(t); |
168 | mmput(mm); | ||
169 | 169 | ||
170 | if (buf[0] == '\0') | 170 | if (buf[0] == '\0') |
171 | sprintf(buf, "[ %s ] dynamic memory", name); | 171 | sprintf(buf, "[ %s ] dynamic memory", name); |
@@ -175,8 +175,8 @@ void decode_address(char *buf, unsigned long address) | |||
175 | } | 175 | } |
176 | 176 | ||
177 | up_read(&mm->mmap_sem); | 177 | up_read(&mm->mmap_sem); |
178 | if (!in_atomic) | 178 | __continue: |
179 | mmput(mm); | 179 | task_unlock(t); |
180 | } | 180 | } |
181 | 181 | ||
182 | /* | 182 | /* |
@@ -186,7 +186,7 @@ void decode_address(char *buf, unsigned long address) | |||
186 | sprintf(buf, "/* kernel dynamic memory */"); | 186 | sprintf(buf, "/* kernel dynamic memory */"); |
187 | 187 | ||
188 | done: | 188 | done: |
189 | write_unlock_irqrestore(&tasklist_lock, flags); | 189 | read_unlock(&tasklist_lock); |
190 | } | 190 | } |
191 | 191 | ||
192 | #define EXPAND_LEN ((1 << CONFIG_DEBUG_BFIN_HWTRACE_EXPAND_LEN) * 256 - 1) | 192 | #define EXPAND_LEN ((1 << CONFIG_DEBUG_BFIN_HWTRACE_EXPAND_LEN) * 256 - 1) |
diff --git a/arch/powerpc/mm/mmu_context_nohash.c b/arch/powerpc/mm/mmu_context_nohash.c index 5b63bd3da4a9..e779642c25e5 100644 --- a/arch/powerpc/mm/mmu_context_nohash.c +++ b/arch/powerpc/mm/mmu_context_nohash.c | |||
@@ -333,9 +333,7 @@ static int __cpuinit mmu_context_cpu_notify(struct notifier_block *self, | |||
333 | unsigned long action, void *hcpu) | 333 | unsigned long action, void *hcpu) |
334 | { | 334 | { |
335 | unsigned int cpu = (unsigned int)(long)hcpu; | 335 | unsigned int cpu = (unsigned int)(long)hcpu; |
336 | #ifdef CONFIG_HOTPLUG_CPU | 336 | |
337 | struct task_struct *p; | ||
338 | #endif | ||
339 | /* We don't touch CPU 0 map, it's allocated at aboot and kept | 337 | /* We don't touch CPU 0 map, it's allocated at aboot and kept |
340 | * around forever | 338 | * around forever |
341 | */ | 339 | */ |
@@ -358,12 +356,7 @@ static int __cpuinit mmu_context_cpu_notify(struct notifier_block *self, | |||
358 | stale_map[cpu] = NULL; | 356 | stale_map[cpu] = NULL; |
359 | 357 | ||
360 | /* We also clear the cpu_vm_mask bits of CPUs going away */ | 358 | /* We also clear the cpu_vm_mask bits of CPUs going away */ |
361 | read_lock(&tasklist_lock); | 359 | clear_tasks_mm_cpumask(cpu); |
362 | for_each_process(p) { | ||
363 | if (p->mm) | ||
364 | cpumask_clear_cpu(cpu, mm_cpumask(p->mm)); | ||
365 | } | ||
366 | read_unlock(&tasklist_lock); | ||
367 | break; | 360 | break; |
368 | #endif /* CONFIG_HOTPLUG_CPU */ | 361 | #endif /* CONFIG_HOTPLUG_CPU */ |
369 | } | 362 | } |
diff --git a/arch/sh/kernel/smp.c b/arch/sh/kernel/smp.c index b86e9ca79455..2062aa88af41 100644 --- a/arch/sh/kernel/smp.c +++ b/arch/sh/kernel/smp.c | |||
@@ -123,7 +123,6 @@ void native_play_dead(void) | |||
123 | int __cpu_disable(void) | 123 | int __cpu_disable(void) |
124 | { | 124 | { |
125 | unsigned int cpu = smp_processor_id(); | 125 | unsigned int cpu = smp_processor_id(); |
126 | struct task_struct *p; | ||
127 | int ret; | 126 | int ret; |
128 | 127 | ||
129 | ret = mp_ops->cpu_disable(cpu); | 128 | ret = mp_ops->cpu_disable(cpu); |
@@ -153,11 +152,7 @@ int __cpu_disable(void) | |||
153 | flush_cache_all(); | 152 | flush_cache_all(); |
154 | local_flush_tlb_all(); | 153 | local_flush_tlb_all(); |
155 | 154 | ||
156 | read_lock(&tasklist_lock); | 155 | clear_tasks_mm_cpumask(cpu); |
157 | for_each_process(p) | ||
158 | if (p->mm) | ||
159 | cpumask_clear_cpu(cpu, mm_cpumask(p->mm)); | ||
160 | read_unlock(&tasklist_lock); | ||
161 | 156 | ||
162 | return 0; | 157 | return 0; |
163 | } | 158 | } |
diff --git a/arch/um/kernel/reboot.c b/arch/um/kernel/reboot.c index 4d93dff6b371..3d15243ce692 100644 --- a/arch/um/kernel/reboot.c +++ b/arch/um/kernel/reboot.c | |||
@@ -4,7 +4,9 @@ | |||
4 | */ | 4 | */ |
5 | 5 | ||
6 | #include "linux/sched.h" | 6 | #include "linux/sched.h" |
7 | #include "linux/spinlock.h" | ||
7 | #include "linux/slab.h" | 8 | #include "linux/slab.h" |
9 | #include "linux/oom.h" | ||
8 | #include "kern_util.h" | 10 | #include "kern_util.h" |
9 | #include "os.h" | 11 | #include "os.h" |
10 | #include "skas.h" | 12 | #include "skas.h" |
@@ -22,13 +24,18 @@ static void kill_off_processes(void) | |||
22 | struct task_struct *p; | 24 | struct task_struct *p; |
23 | int pid; | 25 | int pid; |
24 | 26 | ||
27 | read_lock(&tasklist_lock); | ||
25 | for_each_process(p) { | 28 | for_each_process(p) { |
26 | if (p->mm == NULL) | 29 | struct task_struct *t; |
27 | continue; | ||
28 | 30 | ||
29 | pid = p->mm->context.id.u.pid; | 31 | t = find_lock_task_mm(p); |
32 | if (!t) | ||
33 | continue; | ||
34 | pid = t->mm->context.id.u.pid; | ||
35 | task_unlock(t); | ||
30 | os_kill_ptraced_process(pid, 1); | 36 | os_kill_ptraced_process(pid, 1); |
31 | } | 37 | } |
38 | read_unlock(&tasklist_lock); | ||
32 | } | 39 | } |
33 | } | 40 | } |
34 | 41 | ||
diff --git a/arch/um/kernel/trap.c b/arch/um/kernel/trap.c index dafc94715950..3be60765c0e2 100644 --- a/arch/um/kernel/trap.c +++ b/arch/um/kernel/trap.c | |||
@@ -30,6 +30,8 @@ int handle_page_fault(unsigned long address, unsigned long ip, | |||
30 | pmd_t *pmd; | 30 | pmd_t *pmd; |
31 | pte_t *pte; | 31 | pte_t *pte; |
32 | int err = -EFAULT; | 32 | int err = -EFAULT; |
33 | unsigned int flags = FAULT_FLAG_ALLOW_RETRY | FAULT_FLAG_KILLABLE | | ||
34 | (is_write ? FAULT_FLAG_WRITE : 0); | ||
33 | 35 | ||
34 | *code_out = SEGV_MAPERR; | 36 | *code_out = SEGV_MAPERR; |
35 | 37 | ||
@@ -40,6 +42,7 @@ int handle_page_fault(unsigned long address, unsigned long ip, | |||
40 | if (in_atomic()) | 42 | if (in_atomic()) |
41 | goto out_nosemaphore; | 43 | goto out_nosemaphore; |
42 | 44 | ||
45 | retry: | ||
43 | down_read(&mm->mmap_sem); | 46 | down_read(&mm->mmap_sem); |
44 | vma = find_vma(mm, address); | 47 | vma = find_vma(mm, address); |
45 | if (!vma) | 48 | if (!vma) |
@@ -65,7 +68,11 @@ good_area: | |||
65 | do { | 68 | do { |
66 | int fault; | 69 | int fault; |
67 | 70 | ||
68 | fault = handle_mm_fault(mm, vma, address, is_write ? FAULT_FLAG_WRITE : 0); | 71 | fault = handle_mm_fault(mm, vma, address, flags); |
72 | |||
73 | if ((fault & VM_FAULT_RETRY) && fatal_signal_pending(current)) | ||
74 | goto out_nosemaphore; | ||
75 | |||
69 | if (unlikely(fault & VM_FAULT_ERROR)) { | 76 | if (unlikely(fault & VM_FAULT_ERROR)) { |
70 | if (fault & VM_FAULT_OOM) { | 77 | if (fault & VM_FAULT_OOM) { |
71 | goto out_of_memory; | 78 | goto out_of_memory; |
@@ -75,10 +82,17 @@ good_area: | |||
75 | } | 82 | } |
76 | BUG(); | 83 | BUG(); |
77 | } | 84 | } |
78 | if (fault & VM_FAULT_MAJOR) | 85 | if (flags & FAULT_FLAG_ALLOW_RETRY) { |
79 | current->maj_flt++; | 86 | if (fault & VM_FAULT_MAJOR) |
80 | else | 87 | current->maj_flt++; |
81 | current->min_flt++; | 88 | else |
89 | current->min_flt++; | ||
90 | if (fault & VM_FAULT_RETRY) { | ||
91 | flags &= ~FAULT_FLAG_ALLOW_RETRY; | ||
92 | |||
93 | goto retry; | ||
94 | } | ||
95 | } | ||
82 | 96 | ||
83 | pgd = pgd_offset(mm, address); | 97 | pgd = pgd_offset(mm, address); |
84 | pud = pud_offset(pgd, address); | 98 | pud = pud_offset(pgd, address); |
diff --git a/arch/x86/syscalls/syscall_32.tbl b/arch/x86/syscalls/syscall_32.tbl index 29f9f0554f7d..7a35a6e71d44 100644 --- a/arch/x86/syscalls/syscall_32.tbl +++ b/arch/x86/syscalls/syscall_32.tbl | |||
@@ -355,3 +355,4 @@ | |||
355 | 346 i386 setns sys_setns | 355 | 346 i386 setns sys_setns |
356 | 347 i386 process_vm_readv sys_process_vm_readv compat_sys_process_vm_readv | 356 | 347 i386 process_vm_readv sys_process_vm_readv compat_sys_process_vm_readv |
357 | 348 i386 process_vm_writev sys_process_vm_writev compat_sys_process_vm_writev | 357 | 348 i386 process_vm_writev sys_process_vm_writev compat_sys_process_vm_writev |
358 | 349 i386 kcmp sys_kcmp | ||
diff --git a/arch/x86/syscalls/syscall_64.tbl b/arch/x86/syscalls/syscall_64.tbl index dd29a9ea27c5..51171aeff0dc 100644 --- a/arch/x86/syscalls/syscall_64.tbl +++ b/arch/x86/syscalls/syscall_64.tbl | |||
@@ -318,6 +318,8 @@ | |||
318 | 309 common getcpu sys_getcpu | 318 | 309 common getcpu sys_getcpu |
319 | 310 64 process_vm_readv sys_process_vm_readv | 319 | 310 64 process_vm_readv sys_process_vm_readv |
320 | 311 64 process_vm_writev sys_process_vm_writev | 320 | 311 64 process_vm_writev sys_process_vm_writev |
321 | 312 64 kcmp sys_kcmp | ||
322 | |||
321 | # | 323 | # |
322 | # x32-specific system call numbers start at 512 to avoid cache impact | 324 | # x32-specific system call numbers start at 512 to avoid cache impact |
323 | # for native 64-bit operation. | 325 | # for native 64-bit operation. |
diff --git a/drivers/message/fusion/mptbase.c b/drivers/message/fusion/mptbase.c index 444143e5f28c..d99db5623acf 100644 --- a/drivers/message/fusion/mptbase.c +++ b/drivers/message/fusion/mptbase.c | |||
@@ -1653,7 +1653,6 @@ mpt_mapresources(MPT_ADAPTER *ioc) | |||
1653 | unsigned long port; | 1653 | unsigned long port; |
1654 | u32 msize; | 1654 | u32 msize; |
1655 | u32 psize; | 1655 | u32 psize; |
1656 | u8 revision; | ||
1657 | int r = -ENODEV; | 1656 | int r = -ENODEV; |
1658 | struct pci_dev *pdev; | 1657 | struct pci_dev *pdev; |
1659 | 1658 | ||
@@ -1670,8 +1669,6 @@ mpt_mapresources(MPT_ADAPTER *ioc) | |||
1670 | return r; | 1669 | return r; |
1671 | } | 1670 | } |
1672 | 1671 | ||
1673 | pci_read_config_byte(pdev, PCI_CLASS_REVISION, &revision); | ||
1674 | |||
1675 | if (sizeof(dma_addr_t) > 4) { | 1672 | if (sizeof(dma_addr_t) > 4) { |
1676 | const uint64_t required_mask = dma_get_required_mask | 1673 | const uint64_t required_mask = dma_get_required_mask |
1677 | (&pdev->dev); | 1674 | (&pdev->dev); |
@@ -1779,7 +1776,6 @@ mpt_attach(struct pci_dev *pdev, const struct pci_device_id *id) | |||
1779 | MPT_ADAPTER *ioc; | 1776 | MPT_ADAPTER *ioc; |
1780 | u8 cb_idx; | 1777 | u8 cb_idx; |
1781 | int r = -ENODEV; | 1778 | int r = -ENODEV; |
1782 | u8 revision; | ||
1783 | u8 pcixcmd; | 1779 | u8 pcixcmd; |
1784 | static int mpt_ids = 0; | 1780 | static int mpt_ids = 0; |
1785 | #ifdef CONFIG_PROC_FS | 1781 | #ifdef CONFIG_PROC_FS |
@@ -1887,8 +1883,8 @@ mpt_attach(struct pci_dev *pdev, const struct pci_device_id *id) | |||
1887 | dinitprintk(ioc, printk(MYIOC_s_INFO_FMT "facts @ %p, pfacts[0] @ %p\n", | 1883 | dinitprintk(ioc, printk(MYIOC_s_INFO_FMT "facts @ %p, pfacts[0] @ %p\n", |
1888 | ioc->name, &ioc->facts, &ioc->pfacts[0])); | 1884 | ioc->name, &ioc->facts, &ioc->pfacts[0])); |
1889 | 1885 | ||
1890 | pci_read_config_byte(pdev, PCI_CLASS_REVISION, &revision); | 1886 | mpt_get_product_name(pdev->vendor, pdev->device, pdev->revision, |
1891 | mpt_get_product_name(pdev->vendor, pdev->device, revision, ioc->prod_name); | 1887 | ioc->prod_name); |
1892 | 1888 | ||
1893 | switch (pdev->device) | 1889 | switch (pdev->device) |
1894 | { | 1890 | { |
@@ -1903,7 +1899,7 @@ mpt_attach(struct pci_dev *pdev, const struct pci_device_id *id) | |||
1903 | break; | 1899 | break; |
1904 | 1900 | ||
1905 | case MPI_MANUFACTPAGE_DEVICEID_FC929X: | 1901 | case MPI_MANUFACTPAGE_DEVICEID_FC929X: |
1906 | if (revision < XL_929) { | 1902 | if (pdev->revision < XL_929) { |
1907 | /* 929X Chip Fix. Set Split transactions level | 1903 | /* 929X Chip Fix. Set Split transactions level |
1908 | * for PCIX. Set MOST bits to zero. | 1904 | * for PCIX. Set MOST bits to zero. |
1909 | */ | 1905 | */ |
@@ -1934,7 +1930,7 @@ mpt_attach(struct pci_dev *pdev, const struct pci_device_id *id) | |||
1934 | /* 1030 Chip Fix. Disable Split transactions | 1930 | /* 1030 Chip Fix. Disable Split transactions |
1935 | * for PCIX. Set MOST bits to zero if Rev < C0( = 8). | 1931 | * for PCIX. Set MOST bits to zero if Rev < C0( = 8). |
1936 | */ | 1932 | */ |
1937 | if (revision < C0_1030) { | 1933 | if (pdev->revision < C0_1030) { |
1938 | pci_read_config_byte(pdev, 0x6a, &pcixcmd); | 1934 | pci_read_config_byte(pdev, 0x6a, &pcixcmd); |
1939 | pcixcmd &= 0x8F; | 1935 | pcixcmd &= 0x8F; |
1940 | pci_write_config_byte(pdev, 0x6a, pcixcmd); | 1936 | pci_write_config_byte(pdev, 0x6a, pcixcmd); |
diff --git a/drivers/message/fusion/mptctl.c b/drivers/message/fusion/mptctl.c index 6e6e16aab9da..b383b6961e59 100644 --- a/drivers/message/fusion/mptctl.c +++ b/drivers/message/fusion/mptctl.c | |||
@@ -1250,7 +1250,6 @@ mptctl_getiocinfo (unsigned long arg, unsigned int data_size) | |||
1250 | int iocnum; | 1250 | int iocnum; |
1251 | unsigned int port; | 1251 | unsigned int port; |
1252 | int cim_rev; | 1252 | int cim_rev; |
1253 | u8 revision; | ||
1254 | struct scsi_device *sdev; | 1253 | struct scsi_device *sdev; |
1255 | VirtDevice *vdevice; | 1254 | VirtDevice *vdevice; |
1256 | 1255 | ||
@@ -1324,8 +1323,7 @@ mptctl_getiocinfo (unsigned long arg, unsigned int data_size) | |||
1324 | pdev = (struct pci_dev *) ioc->pcidev; | 1323 | pdev = (struct pci_dev *) ioc->pcidev; |
1325 | 1324 | ||
1326 | karg->pciId = pdev->device; | 1325 | karg->pciId = pdev->device; |
1327 | pci_read_config_byte(pdev, PCI_CLASS_REVISION, &revision); | 1326 | karg->hwRev = pdev->revision; |
1328 | karg->hwRev = revision; | ||
1329 | karg->subSystemDevice = pdev->subsystem_device; | 1327 | karg->subSystemDevice = pdev->subsystem_device; |
1330 | karg->subSystemVendor = pdev->subsystem_vendor; | 1328 | karg->subSystemVendor = pdev->subsystem_vendor; |
1331 | 1329 | ||
diff --git a/drivers/rapidio/Kconfig b/drivers/rapidio/Kconfig index bc8719238793..6194d35ebb97 100644 --- a/drivers/rapidio/Kconfig +++ b/drivers/rapidio/Kconfig | |||
@@ -22,6 +22,20 @@ config RAPIDIO_ENABLE_RX_TX_PORTS | |||
22 | ports for Input/Output direction to allow other traffic | 22 | ports for Input/Output direction to allow other traffic |
23 | than Maintenance transfers. | 23 | than Maintenance transfers. |
24 | 24 | ||
25 | config RAPIDIO_DMA_ENGINE | ||
26 | bool "DMA Engine support for RapidIO" | ||
27 | depends on RAPIDIO | ||
28 | select DMADEVICES | ||
29 | select DMA_ENGINE | ||
30 | help | ||
31 | Say Y here if you want to use DMA Engine frameork for RapidIO data | ||
32 | transfers to/from target RIO devices. RapidIO uses NREAD and | ||
33 | NWRITE (NWRITE_R, SWRITE) requests to transfer data between local | ||
34 | memory and memory on remote target device. You need a DMA controller | ||
35 | capable to perform data transfers to/from RapidIO. | ||
36 | |||
37 | If you are unsure about this, say Y here. | ||
38 | |||
25 | config RAPIDIO_DEBUG | 39 | config RAPIDIO_DEBUG |
26 | bool "RapidIO subsystem debug messages" | 40 | bool "RapidIO subsystem debug messages" |
27 | depends on RAPIDIO | 41 | depends on RAPIDIO |
diff --git a/drivers/rapidio/devices/Makefile b/drivers/rapidio/devices/Makefile index 3b7b4e2dff7c..7b62860f34f8 100644 --- a/drivers/rapidio/devices/Makefile +++ b/drivers/rapidio/devices/Makefile | |||
@@ -3,3 +3,6 @@ | |||
3 | # | 3 | # |
4 | 4 | ||
5 | obj-$(CONFIG_RAPIDIO_TSI721) += tsi721.o | 5 | obj-$(CONFIG_RAPIDIO_TSI721) += tsi721.o |
6 | ifeq ($(CONFIG_RAPIDIO_DMA_ENGINE),y) | ||
7 | obj-$(CONFIG_RAPIDIO_TSI721) += tsi721_dma.o | ||
8 | endif | ||
diff --git a/drivers/rapidio/devices/tsi721.c b/drivers/rapidio/devices/tsi721.c index 30d2072f480b..722246cf20ab 100644 --- a/drivers/rapidio/devices/tsi721.c +++ b/drivers/rapidio/devices/tsi721.c | |||
@@ -108,6 +108,7 @@ static int tsi721_maint_dma(struct tsi721_device *priv, u32 sys_size, | |||
108 | u16 destid, u8 hopcount, u32 offset, int len, | 108 | u16 destid, u8 hopcount, u32 offset, int len, |
109 | u32 *data, int do_wr) | 109 | u32 *data, int do_wr) |
110 | { | 110 | { |
111 | void __iomem *regs = priv->regs + TSI721_DMAC_BASE(priv->mdma.ch_id); | ||
111 | struct tsi721_dma_desc *bd_ptr; | 112 | struct tsi721_dma_desc *bd_ptr; |
112 | u32 rd_count, swr_ptr, ch_stat; | 113 | u32 rd_count, swr_ptr, ch_stat; |
113 | int i, err = 0; | 114 | int i, err = 0; |
@@ -116,10 +117,9 @@ static int tsi721_maint_dma(struct tsi721_device *priv, u32 sys_size, | |||
116 | if (offset > (RIO_MAINT_SPACE_SZ - len) || (len != sizeof(u32))) | 117 | if (offset > (RIO_MAINT_SPACE_SZ - len) || (len != sizeof(u32))) |
117 | return -EINVAL; | 118 | return -EINVAL; |
118 | 119 | ||
119 | bd_ptr = priv->bdma[TSI721_DMACH_MAINT].bd_base; | 120 | bd_ptr = priv->mdma.bd_base; |
120 | 121 | ||
121 | rd_count = ioread32( | 122 | rd_count = ioread32(regs + TSI721_DMAC_DRDCNT); |
122 | priv->regs + TSI721_DMAC_DRDCNT(TSI721_DMACH_MAINT)); | ||
123 | 123 | ||
124 | /* Initialize DMA descriptor */ | 124 | /* Initialize DMA descriptor */ |
125 | bd_ptr[0].type_id = cpu_to_le32((DTYPE2 << 29) | (op << 19) | destid); | 125 | bd_ptr[0].type_id = cpu_to_le32((DTYPE2 << 29) | (op << 19) | destid); |
@@ -134,19 +134,18 @@ static int tsi721_maint_dma(struct tsi721_device *priv, u32 sys_size, | |||
134 | mb(); | 134 | mb(); |
135 | 135 | ||
136 | /* Start DMA operation */ | 136 | /* Start DMA operation */ |
137 | iowrite32(rd_count + 2, | 137 | iowrite32(rd_count + 2, regs + TSI721_DMAC_DWRCNT); |
138 | priv->regs + TSI721_DMAC_DWRCNT(TSI721_DMACH_MAINT)); | 138 | ioread32(regs + TSI721_DMAC_DWRCNT); |
139 | ioread32(priv->regs + TSI721_DMAC_DWRCNT(TSI721_DMACH_MAINT)); | ||
140 | i = 0; | 139 | i = 0; |
141 | 140 | ||
142 | /* Wait until DMA transfer is finished */ | 141 | /* Wait until DMA transfer is finished */ |
143 | while ((ch_stat = ioread32(priv->regs + | 142 | while ((ch_stat = ioread32(regs + TSI721_DMAC_STS)) |
144 | TSI721_DMAC_STS(TSI721_DMACH_MAINT))) & TSI721_DMAC_STS_RUN) { | 143 | & TSI721_DMAC_STS_RUN) { |
145 | udelay(1); | 144 | udelay(1); |
146 | if (++i >= 5000000) { | 145 | if (++i >= 5000000) { |
147 | dev_dbg(&priv->pdev->dev, | 146 | dev_dbg(&priv->pdev->dev, |
148 | "%s : DMA[%d] read timeout ch_status=%x\n", | 147 | "%s : DMA[%d] read timeout ch_status=%x\n", |
149 | __func__, TSI721_DMACH_MAINT, ch_stat); | 148 | __func__, priv->mdma.ch_id, ch_stat); |
150 | if (!do_wr) | 149 | if (!do_wr) |
151 | *data = 0xffffffff; | 150 | *data = 0xffffffff; |
152 | err = -EIO; | 151 | err = -EIO; |
@@ -162,13 +161,10 @@ static int tsi721_maint_dma(struct tsi721_device *priv, u32 sys_size, | |||
162 | __func__, ch_stat); | 161 | __func__, ch_stat); |
163 | dev_dbg(&priv->pdev->dev, "OP=%d : destid=%x hc=%x off=%x\n", | 162 | dev_dbg(&priv->pdev->dev, "OP=%d : destid=%x hc=%x off=%x\n", |
164 | do_wr ? MAINT_WR : MAINT_RD, destid, hopcount, offset); | 163 | do_wr ? MAINT_WR : MAINT_RD, destid, hopcount, offset); |
165 | iowrite32(TSI721_DMAC_INT_ALL, | 164 | iowrite32(TSI721_DMAC_INT_ALL, regs + TSI721_DMAC_INT); |
166 | priv->regs + TSI721_DMAC_INT(TSI721_DMACH_MAINT)); | 165 | iowrite32(TSI721_DMAC_CTL_INIT, regs + TSI721_DMAC_CTL); |
167 | iowrite32(TSI721_DMAC_CTL_INIT, | ||
168 | priv->regs + TSI721_DMAC_CTL(TSI721_DMACH_MAINT)); | ||
169 | udelay(10); | 166 | udelay(10); |
170 | iowrite32(0, priv->regs + | 167 | iowrite32(0, regs + TSI721_DMAC_DWRCNT); |
171 | TSI721_DMAC_DWRCNT(TSI721_DMACH_MAINT)); | ||
172 | udelay(1); | 168 | udelay(1); |
173 | if (!do_wr) | 169 | if (!do_wr) |
174 | *data = 0xffffffff; | 170 | *data = 0xffffffff; |
@@ -184,8 +180,8 @@ static int tsi721_maint_dma(struct tsi721_device *priv, u32 sys_size, | |||
184 | * NOTE: Skipping check and clear FIFO entries because we are waiting | 180 | * NOTE: Skipping check and clear FIFO entries because we are waiting |
185 | * for transfer to be completed. | 181 | * for transfer to be completed. |
186 | */ | 182 | */ |
187 | swr_ptr = ioread32(priv->regs + TSI721_DMAC_DSWP(TSI721_DMACH_MAINT)); | 183 | swr_ptr = ioread32(regs + TSI721_DMAC_DSWP); |
188 | iowrite32(swr_ptr, priv->regs + TSI721_DMAC_DSRP(TSI721_DMACH_MAINT)); | 184 | iowrite32(swr_ptr, regs + TSI721_DMAC_DSRP); |
189 | err_out: | 185 | err_out: |
190 | 186 | ||
191 | return err; | 187 | return err; |
@@ -541,6 +537,22 @@ static irqreturn_t tsi721_irqhandler(int irq, void *ptr) | |||
541 | tsi721_pw_handler(mport); | 537 | tsi721_pw_handler(mport); |
542 | } | 538 | } |
543 | 539 | ||
540 | #ifdef CONFIG_RAPIDIO_DMA_ENGINE | ||
541 | if (dev_int & TSI721_DEV_INT_BDMA_CH) { | ||
542 | int ch; | ||
543 | |||
544 | if (dev_ch_int & TSI721_INT_BDMA_CHAN_M) { | ||
545 | dev_dbg(&priv->pdev->dev, | ||
546 | "IRQ from DMA channel 0x%08x\n", dev_ch_int); | ||
547 | |||
548 | for (ch = 0; ch < TSI721_DMA_MAXCH; ch++) { | ||
549 | if (!(dev_ch_int & TSI721_INT_BDMA_CHAN(ch))) | ||
550 | continue; | ||
551 | tsi721_bdma_handler(&priv->bdma[ch]); | ||
552 | } | ||
553 | } | ||
554 | } | ||
555 | #endif | ||
544 | return IRQ_HANDLED; | 556 | return IRQ_HANDLED; |
545 | } | 557 | } |
546 | 558 | ||
@@ -553,18 +565,26 @@ static void tsi721_interrupts_init(struct tsi721_device *priv) | |||
553 | priv->regs + TSI721_SR_CHINT(IDB_QUEUE)); | 565 | priv->regs + TSI721_SR_CHINT(IDB_QUEUE)); |
554 | iowrite32(TSI721_SR_CHINT_IDBQRCV, | 566 | iowrite32(TSI721_SR_CHINT_IDBQRCV, |
555 | priv->regs + TSI721_SR_CHINTE(IDB_QUEUE)); | 567 | priv->regs + TSI721_SR_CHINTE(IDB_QUEUE)); |
556 | iowrite32(TSI721_INT_SR2PC_CHAN(IDB_QUEUE), | ||
557 | priv->regs + TSI721_DEV_CHAN_INTE); | ||
558 | 568 | ||
559 | /* Enable SRIO MAC interrupts */ | 569 | /* Enable SRIO MAC interrupts */ |
560 | iowrite32(TSI721_RIO_EM_DEV_INT_EN_INT, | 570 | iowrite32(TSI721_RIO_EM_DEV_INT_EN_INT, |
561 | priv->regs + TSI721_RIO_EM_DEV_INT_EN); | 571 | priv->regs + TSI721_RIO_EM_DEV_INT_EN); |
562 | 572 | ||
573 | /* Enable interrupts from channels in use */ | ||
574 | #ifdef CONFIG_RAPIDIO_DMA_ENGINE | ||
575 | intr = TSI721_INT_SR2PC_CHAN(IDB_QUEUE) | | ||
576 | (TSI721_INT_BDMA_CHAN_M & | ||
577 | ~TSI721_INT_BDMA_CHAN(TSI721_DMACH_MAINT)); | ||
578 | #else | ||
579 | intr = TSI721_INT_SR2PC_CHAN(IDB_QUEUE); | ||
580 | #endif | ||
581 | iowrite32(intr, priv->regs + TSI721_DEV_CHAN_INTE); | ||
582 | |||
563 | if (priv->flags & TSI721_USING_MSIX) | 583 | if (priv->flags & TSI721_USING_MSIX) |
564 | intr = TSI721_DEV_INT_SRIO; | 584 | intr = TSI721_DEV_INT_SRIO; |
565 | else | 585 | else |
566 | intr = TSI721_DEV_INT_SR2PC_CH | TSI721_DEV_INT_SRIO | | 586 | intr = TSI721_DEV_INT_SR2PC_CH | TSI721_DEV_INT_SRIO | |
567 | TSI721_DEV_INT_SMSG_CH; | 587 | TSI721_DEV_INT_SMSG_CH | TSI721_DEV_INT_BDMA_CH; |
568 | 588 | ||
569 | iowrite32(intr, priv->regs + TSI721_DEV_INTE); | 589 | iowrite32(intr, priv->regs + TSI721_DEV_INTE); |
570 | ioread32(priv->regs + TSI721_DEV_INTE); | 590 | ioread32(priv->regs + TSI721_DEV_INTE); |
@@ -715,12 +735,29 @@ static int tsi721_enable_msix(struct tsi721_device *priv) | |||
715 | TSI721_MSIX_OMSG_INT(i); | 735 | TSI721_MSIX_OMSG_INT(i); |
716 | } | 736 | } |
717 | 737 | ||
738 | #ifdef CONFIG_RAPIDIO_DMA_ENGINE | ||
739 | /* | ||
740 | * Initialize MSI-X entries for Block DMA Engine: | ||
741 | * this driver supports XXX DMA channels | ||
742 | * (one is reserved for SRIO maintenance transactions) | ||
743 | */ | ||
744 | for (i = 0; i < TSI721_DMA_CHNUM; i++) { | ||
745 | entries[TSI721_VECT_DMA0_DONE + i].entry = | ||
746 | TSI721_MSIX_DMACH_DONE(i); | ||
747 | entries[TSI721_VECT_DMA0_INT + i].entry = | ||
748 | TSI721_MSIX_DMACH_INT(i); | ||
749 | } | ||
750 | #endif /* CONFIG_RAPIDIO_DMA_ENGINE */ | ||
751 | |||
718 | err = pci_enable_msix(priv->pdev, entries, ARRAY_SIZE(entries)); | 752 | err = pci_enable_msix(priv->pdev, entries, ARRAY_SIZE(entries)); |
719 | if (err) { | 753 | if (err) { |
720 | if (err > 0) | 754 | if (err > 0) |
721 | dev_info(&priv->pdev->dev, | 755 | dev_info(&priv->pdev->dev, |
722 | "Only %d MSI-X vectors available, " | 756 | "Only %d MSI-X vectors available, " |
723 | "not using MSI-X\n", err); | 757 | "not using MSI-X\n", err); |
758 | else | ||
759 | dev_err(&priv->pdev->dev, | ||
760 | "Failed to enable MSI-X (err=%d)\n", err); | ||
724 | return err; | 761 | return err; |
725 | } | 762 | } |
726 | 763 | ||
@@ -760,6 +797,22 @@ static int tsi721_enable_msix(struct tsi721_device *priv) | |||
760 | i, pci_name(priv->pdev)); | 797 | i, pci_name(priv->pdev)); |
761 | } | 798 | } |
762 | 799 | ||
800 | #ifdef CONFIG_RAPIDIO_DMA_ENGINE | ||
801 | for (i = 0; i < TSI721_DMA_CHNUM; i++) { | ||
802 | priv->msix[TSI721_VECT_DMA0_DONE + i].vector = | ||
803 | entries[TSI721_VECT_DMA0_DONE + i].vector; | ||
804 | snprintf(priv->msix[TSI721_VECT_DMA0_DONE + i].irq_name, | ||
805 | IRQ_DEVICE_NAME_MAX, DRV_NAME "-dmad%d@pci:%s", | ||
806 | i, pci_name(priv->pdev)); | ||
807 | |||
808 | priv->msix[TSI721_VECT_DMA0_INT + i].vector = | ||
809 | entries[TSI721_VECT_DMA0_INT + i].vector; | ||
810 | snprintf(priv->msix[TSI721_VECT_DMA0_INT + i].irq_name, | ||
811 | IRQ_DEVICE_NAME_MAX, DRV_NAME "-dmai%d@pci:%s", | ||
812 | i, pci_name(priv->pdev)); | ||
813 | } | ||
814 | #endif /* CONFIG_RAPIDIO_DMA_ENGINE */ | ||
815 | |||
763 | return 0; | 816 | return 0; |
764 | } | 817 | } |
765 | #endif /* CONFIG_PCI_MSI */ | 818 | #endif /* CONFIG_PCI_MSI */ |
@@ -888,20 +941,34 @@ static void tsi721_doorbell_free(struct tsi721_device *priv) | |||
888 | priv->idb_base = NULL; | 941 | priv->idb_base = NULL; |
889 | } | 942 | } |
890 | 943 | ||
891 | static int tsi721_bdma_ch_init(struct tsi721_device *priv, int chnum) | 944 | /** |
945 | * tsi721_bdma_maint_init - Initialize maintenance request BDMA channel. | ||
946 | * @priv: pointer to tsi721 private data | ||
947 | * | ||
948 | * Initialize BDMA channel allocated for RapidIO maintenance read/write | ||
949 | * request generation | ||
950 | * Returns %0 on success or %-ENOMEM on failure. | ||
951 | */ | ||
952 | static int tsi721_bdma_maint_init(struct tsi721_device *priv) | ||
892 | { | 953 | { |
893 | struct tsi721_dma_desc *bd_ptr; | 954 | struct tsi721_dma_desc *bd_ptr; |
894 | u64 *sts_ptr; | 955 | u64 *sts_ptr; |
895 | dma_addr_t bd_phys, sts_phys; | 956 | dma_addr_t bd_phys, sts_phys; |
896 | int sts_size; | 957 | int sts_size; |
897 | int bd_num = priv->bdma[chnum].bd_num; | 958 | int bd_num = 2; |
959 | void __iomem *regs; | ||
898 | 960 | ||
899 | dev_dbg(&priv->pdev->dev, "Init Block DMA Engine, CH%d\n", chnum); | 961 | dev_dbg(&priv->pdev->dev, |
962 | "Init Block DMA Engine for Maintenance requests, CH%d\n", | ||
963 | TSI721_DMACH_MAINT); | ||
900 | 964 | ||
901 | /* | 965 | /* |
902 | * Initialize DMA channel for maintenance requests | 966 | * Initialize DMA channel for maintenance requests |
903 | */ | 967 | */ |
904 | 968 | ||
969 | priv->mdma.ch_id = TSI721_DMACH_MAINT; | ||
970 | regs = priv->regs + TSI721_DMAC_BASE(TSI721_DMACH_MAINT); | ||
971 | |||
905 | /* Allocate space for DMA descriptors */ | 972 | /* Allocate space for DMA descriptors */ |
906 | bd_ptr = dma_zalloc_coherent(&priv->pdev->dev, | 973 | bd_ptr = dma_zalloc_coherent(&priv->pdev->dev, |
907 | bd_num * sizeof(struct tsi721_dma_desc), | 974 | bd_num * sizeof(struct tsi721_dma_desc), |
@@ -909,8 +976,9 @@ static int tsi721_bdma_ch_init(struct tsi721_device *priv, int chnum) | |||
909 | if (!bd_ptr) | 976 | if (!bd_ptr) |
910 | return -ENOMEM; | 977 | return -ENOMEM; |
911 | 978 | ||
912 | priv->bdma[chnum].bd_phys = bd_phys; | 979 | priv->mdma.bd_num = bd_num; |
913 | priv->bdma[chnum].bd_base = bd_ptr; | 980 | priv->mdma.bd_phys = bd_phys; |
981 | priv->mdma.bd_base = bd_ptr; | ||
914 | 982 | ||
915 | dev_dbg(&priv->pdev->dev, "DMA descriptors @ %p (phys = %llx)\n", | 983 | dev_dbg(&priv->pdev->dev, "DMA descriptors @ %p (phys = %llx)\n", |
916 | bd_ptr, (unsigned long long)bd_phys); | 984 | bd_ptr, (unsigned long long)bd_phys); |
@@ -927,13 +995,13 @@ static int tsi721_bdma_ch_init(struct tsi721_device *priv, int chnum) | |||
927 | dma_free_coherent(&priv->pdev->dev, | 995 | dma_free_coherent(&priv->pdev->dev, |
928 | bd_num * sizeof(struct tsi721_dma_desc), | 996 | bd_num * sizeof(struct tsi721_dma_desc), |
929 | bd_ptr, bd_phys); | 997 | bd_ptr, bd_phys); |
930 | priv->bdma[chnum].bd_base = NULL; | 998 | priv->mdma.bd_base = NULL; |
931 | return -ENOMEM; | 999 | return -ENOMEM; |
932 | } | 1000 | } |
933 | 1001 | ||
934 | priv->bdma[chnum].sts_phys = sts_phys; | 1002 | priv->mdma.sts_phys = sts_phys; |
935 | priv->bdma[chnum].sts_base = sts_ptr; | 1003 | priv->mdma.sts_base = sts_ptr; |
936 | priv->bdma[chnum].sts_size = sts_size; | 1004 | priv->mdma.sts_size = sts_size; |
937 | 1005 | ||
938 | dev_dbg(&priv->pdev->dev, | 1006 | dev_dbg(&priv->pdev->dev, |
939 | "desc status FIFO @ %p (phys = %llx) size=0x%x\n", | 1007 | "desc status FIFO @ %p (phys = %llx) size=0x%x\n", |
@@ -946,83 +1014,61 @@ static int tsi721_bdma_ch_init(struct tsi721_device *priv, int chnum) | |||
946 | bd_ptr[bd_num - 1].next_hi = cpu_to_le32((u64)bd_phys >> 32); | 1014 | bd_ptr[bd_num - 1].next_hi = cpu_to_le32((u64)bd_phys >> 32); |
947 | 1015 | ||
948 | /* Setup DMA descriptor pointers */ | 1016 | /* Setup DMA descriptor pointers */ |
949 | iowrite32(((u64)bd_phys >> 32), | 1017 | iowrite32(((u64)bd_phys >> 32), regs + TSI721_DMAC_DPTRH); |
950 | priv->regs + TSI721_DMAC_DPTRH(chnum)); | ||
951 | iowrite32(((u64)bd_phys & TSI721_DMAC_DPTRL_MASK), | 1018 | iowrite32(((u64)bd_phys & TSI721_DMAC_DPTRL_MASK), |
952 | priv->regs + TSI721_DMAC_DPTRL(chnum)); | 1019 | regs + TSI721_DMAC_DPTRL); |
953 | 1020 | ||
954 | /* Setup descriptor status FIFO */ | 1021 | /* Setup descriptor status FIFO */ |
955 | iowrite32(((u64)sts_phys >> 32), | 1022 | iowrite32(((u64)sts_phys >> 32), regs + TSI721_DMAC_DSBH); |
956 | priv->regs + TSI721_DMAC_DSBH(chnum)); | ||
957 | iowrite32(((u64)sts_phys & TSI721_DMAC_DSBL_MASK), | 1023 | iowrite32(((u64)sts_phys & TSI721_DMAC_DSBL_MASK), |
958 | priv->regs + TSI721_DMAC_DSBL(chnum)); | 1024 | regs + TSI721_DMAC_DSBL); |
959 | iowrite32(TSI721_DMAC_DSSZ_SIZE(sts_size), | 1025 | iowrite32(TSI721_DMAC_DSSZ_SIZE(sts_size), |
960 | priv->regs + TSI721_DMAC_DSSZ(chnum)); | 1026 | regs + TSI721_DMAC_DSSZ); |
961 | 1027 | ||
962 | /* Clear interrupt bits */ | 1028 | /* Clear interrupt bits */ |
963 | iowrite32(TSI721_DMAC_INT_ALL, | 1029 | iowrite32(TSI721_DMAC_INT_ALL, regs + TSI721_DMAC_INT); |
964 | priv->regs + TSI721_DMAC_INT(chnum)); | ||
965 | 1030 | ||
966 | ioread32(priv->regs + TSI721_DMAC_INT(chnum)); | 1031 | ioread32(regs + TSI721_DMAC_INT); |
967 | 1032 | ||
968 | /* Toggle DMA channel initialization */ | 1033 | /* Toggle DMA channel initialization */ |
969 | iowrite32(TSI721_DMAC_CTL_INIT, priv->regs + TSI721_DMAC_CTL(chnum)); | 1034 | iowrite32(TSI721_DMAC_CTL_INIT, regs + TSI721_DMAC_CTL); |
970 | ioread32(priv->regs + TSI721_DMAC_CTL(chnum)); | 1035 | ioread32(regs + TSI721_DMAC_CTL); |
971 | udelay(10); | 1036 | udelay(10); |
972 | 1037 | ||
973 | return 0; | 1038 | return 0; |
974 | } | 1039 | } |
975 | 1040 | ||
976 | static int tsi721_bdma_ch_free(struct tsi721_device *priv, int chnum) | 1041 | static int tsi721_bdma_maint_free(struct tsi721_device *priv) |
977 | { | 1042 | { |
978 | u32 ch_stat; | 1043 | u32 ch_stat; |
1044 | struct tsi721_bdma_maint *mdma = &priv->mdma; | ||
1045 | void __iomem *regs = priv->regs + TSI721_DMAC_BASE(mdma->ch_id); | ||
979 | 1046 | ||
980 | if (priv->bdma[chnum].bd_base == NULL) | 1047 | if (mdma->bd_base == NULL) |
981 | return 0; | 1048 | return 0; |
982 | 1049 | ||
983 | /* Check if DMA channel still running */ | 1050 | /* Check if DMA channel still running */ |
984 | ch_stat = ioread32(priv->regs + TSI721_DMAC_STS(chnum)); | 1051 | ch_stat = ioread32(regs + TSI721_DMAC_STS); |
985 | if (ch_stat & TSI721_DMAC_STS_RUN) | 1052 | if (ch_stat & TSI721_DMAC_STS_RUN) |
986 | return -EFAULT; | 1053 | return -EFAULT; |
987 | 1054 | ||
988 | /* Put DMA channel into init state */ | 1055 | /* Put DMA channel into init state */ |
989 | iowrite32(TSI721_DMAC_CTL_INIT, | 1056 | iowrite32(TSI721_DMAC_CTL_INIT, regs + TSI721_DMAC_CTL); |
990 | priv->regs + TSI721_DMAC_CTL(chnum)); | ||
991 | 1057 | ||
992 | /* Free space allocated for DMA descriptors */ | 1058 | /* Free space allocated for DMA descriptors */ |
993 | dma_free_coherent(&priv->pdev->dev, | 1059 | dma_free_coherent(&priv->pdev->dev, |
994 | priv->bdma[chnum].bd_num * sizeof(struct tsi721_dma_desc), | 1060 | mdma->bd_num * sizeof(struct tsi721_dma_desc), |
995 | priv->bdma[chnum].bd_base, priv->bdma[chnum].bd_phys); | 1061 | mdma->bd_base, mdma->bd_phys); |
996 | priv->bdma[chnum].bd_base = NULL; | 1062 | mdma->bd_base = NULL; |
997 | 1063 | ||
998 | /* Free space allocated for status FIFO */ | 1064 | /* Free space allocated for status FIFO */ |
999 | dma_free_coherent(&priv->pdev->dev, | 1065 | dma_free_coherent(&priv->pdev->dev, |
1000 | priv->bdma[chnum].sts_size * sizeof(struct tsi721_dma_sts), | 1066 | mdma->sts_size * sizeof(struct tsi721_dma_sts), |
1001 | priv->bdma[chnum].sts_base, priv->bdma[chnum].sts_phys); | 1067 | mdma->sts_base, mdma->sts_phys); |
1002 | priv->bdma[chnum].sts_base = NULL; | 1068 | mdma->sts_base = NULL; |
1003 | return 0; | ||
1004 | } | ||
1005 | |||
1006 | static int tsi721_bdma_init(struct tsi721_device *priv) | ||
1007 | { | ||
1008 | /* Initialize BDMA channel allocated for RapidIO maintenance read/write | ||
1009 | * request generation | ||
1010 | */ | ||
1011 | priv->bdma[TSI721_DMACH_MAINT].bd_num = 2; | ||
1012 | if (tsi721_bdma_ch_init(priv, TSI721_DMACH_MAINT)) { | ||
1013 | dev_err(&priv->pdev->dev, "Unable to initialize maintenance DMA" | ||
1014 | " channel %d, aborting\n", TSI721_DMACH_MAINT); | ||
1015 | return -ENOMEM; | ||
1016 | } | ||
1017 | |||
1018 | return 0; | 1069 | return 0; |
1019 | } | 1070 | } |
1020 | 1071 | ||
1021 | static void tsi721_bdma_free(struct tsi721_device *priv) | ||
1022 | { | ||
1023 | tsi721_bdma_ch_free(priv, TSI721_DMACH_MAINT); | ||
1024 | } | ||
1025 | |||
1026 | /* Enable Inbound Messaging Interrupts */ | 1072 | /* Enable Inbound Messaging Interrupts */ |
1027 | static void | 1073 | static void |
1028 | tsi721_imsg_interrupt_enable(struct tsi721_device *priv, int ch, | 1074 | tsi721_imsg_interrupt_enable(struct tsi721_device *priv, int ch, |
@@ -2035,7 +2081,8 @@ static void tsi721_disable_ints(struct tsi721_device *priv) | |||
2035 | 2081 | ||
2036 | /* Disable all BDMA Channel interrupts */ | 2082 | /* Disable all BDMA Channel interrupts */ |
2037 | for (ch = 0; ch < TSI721_DMA_MAXCH; ch++) | 2083 | for (ch = 0; ch < TSI721_DMA_MAXCH; ch++) |
2038 | iowrite32(0, priv->regs + TSI721_DMAC_INTE(ch)); | 2084 | iowrite32(0, |
2085 | priv->regs + TSI721_DMAC_BASE(ch) + TSI721_DMAC_INTE); | ||
2039 | 2086 | ||
2040 | /* Disable all general BDMA interrupts */ | 2087 | /* Disable all general BDMA interrupts */ |
2041 | iowrite32(0, priv->regs + TSI721_BDMA_INTE); | 2088 | iowrite32(0, priv->regs + TSI721_BDMA_INTE); |
@@ -2104,6 +2151,7 @@ static int __devinit tsi721_setup_mport(struct tsi721_device *priv) | |||
2104 | mport->phy_type = RIO_PHY_SERIAL; | 2151 | mport->phy_type = RIO_PHY_SERIAL; |
2105 | mport->priv = (void *)priv; | 2152 | mport->priv = (void *)priv; |
2106 | mport->phys_efptr = 0x100; | 2153 | mport->phys_efptr = 0x100; |
2154 | priv->mport = mport; | ||
2107 | 2155 | ||
2108 | INIT_LIST_HEAD(&mport->dbells); | 2156 | INIT_LIST_HEAD(&mport->dbells); |
2109 | 2157 | ||
@@ -2129,17 +2177,21 @@ static int __devinit tsi721_setup_mport(struct tsi721_device *priv) | |||
2129 | if (!err) { | 2177 | if (!err) { |
2130 | tsi721_interrupts_init(priv); | 2178 | tsi721_interrupts_init(priv); |
2131 | ops->pwenable = tsi721_pw_enable; | 2179 | ops->pwenable = tsi721_pw_enable; |
2132 | } else | 2180 | } else { |
2133 | dev_err(&pdev->dev, "Unable to get assigned PCI IRQ " | 2181 | dev_err(&pdev->dev, "Unable to get assigned PCI IRQ " |
2134 | "vector %02X err=0x%x\n", pdev->irq, err); | 2182 | "vector %02X err=0x%x\n", pdev->irq, err); |
2183 | goto err_exit; | ||
2184 | } | ||
2135 | 2185 | ||
2186 | #ifdef CONFIG_RAPIDIO_DMA_ENGINE | ||
2187 | tsi721_register_dma(priv); | ||
2188 | #endif | ||
2136 | /* Enable SRIO link */ | 2189 | /* Enable SRIO link */ |
2137 | iowrite32(ioread32(priv->regs + TSI721_DEVCTL) | | 2190 | iowrite32(ioread32(priv->regs + TSI721_DEVCTL) | |
2138 | TSI721_DEVCTL_SRBOOT_CMPL, | 2191 | TSI721_DEVCTL_SRBOOT_CMPL, |
2139 | priv->regs + TSI721_DEVCTL); | 2192 | priv->regs + TSI721_DEVCTL); |
2140 | 2193 | ||
2141 | rio_register_mport(mport); | 2194 | rio_register_mport(mport); |
2142 | priv->mport = mport; | ||
2143 | 2195 | ||
2144 | if (mport->host_deviceid >= 0) | 2196 | if (mport->host_deviceid >= 0) |
2145 | iowrite32(RIO_PORT_GEN_HOST | RIO_PORT_GEN_MASTER | | 2197 | iowrite32(RIO_PORT_GEN_HOST | RIO_PORT_GEN_MASTER | |
@@ -2149,6 +2201,11 @@ static int __devinit tsi721_setup_mport(struct tsi721_device *priv) | |||
2149 | iowrite32(0, priv->regs + (0x100 + RIO_PORT_GEN_CTL_CSR)); | 2201 | iowrite32(0, priv->regs + (0x100 + RIO_PORT_GEN_CTL_CSR)); |
2150 | 2202 | ||
2151 | return 0; | 2203 | return 0; |
2204 | |||
2205 | err_exit: | ||
2206 | kfree(mport); | ||
2207 | kfree(ops); | ||
2208 | return err; | ||
2152 | } | 2209 | } |
2153 | 2210 | ||
2154 | static int __devinit tsi721_probe(struct pci_dev *pdev, | 2211 | static int __devinit tsi721_probe(struct pci_dev *pdev, |
@@ -2294,7 +2351,7 @@ static int __devinit tsi721_probe(struct pci_dev *pdev, | |||
2294 | tsi721_init_pc2sr_mapping(priv); | 2351 | tsi721_init_pc2sr_mapping(priv); |
2295 | tsi721_init_sr2pc_mapping(priv); | 2352 | tsi721_init_sr2pc_mapping(priv); |
2296 | 2353 | ||
2297 | if (tsi721_bdma_init(priv)) { | 2354 | if (tsi721_bdma_maint_init(priv)) { |
2298 | dev_err(&pdev->dev, "BDMA initialization failed, aborting\n"); | 2355 | dev_err(&pdev->dev, "BDMA initialization failed, aborting\n"); |
2299 | err = -ENOMEM; | 2356 | err = -ENOMEM; |
2300 | goto err_unmap_bars; | 2357 | goto err_unmap_bars; |
@@ -2319,7 +2376,7 @@ static int __devinit tsi721_probe(struct pci_dev *pdev, | |||
2319 | err_free_consistent: | 2376 | err_free_consistent: |
2320 | tsi721_doorbell_free(priv); | 2377 | tsi721_doorbell_free(priv); |
2321 | err_free_bdma: | 2378 | err_free_bdma: |
2322 | tsi721_bdma_free(priv); | 2379 | tsi721_bdma_maint_free(priv); |
2323 | err_unmap_bars: | 2380 | err_unmap_bars: |
2324 | if (priv->regs) | 2381 | if (priv->regs) |
2325 | iounmap(priv->regs); | 2382 | iounmap(priv->regs); |
diff --git a/drivers/rapidio/devices/tsi721.h b/drivers/rapidio/devices/tsi721.h index 1c226b31af13..59de9d7be346 100644 --- a/drivers/rapidio/devices/tsi721.h +++ b/drivers/rapidio/devices/tsi721.h | |||
@@ -167,6 +167,8 @@ | |||
167 | #define TSI721_DEV_INTE 0x29840 | 167 | #define TSI721_DEV_INTE 0x29840 |
168 | #define TSI721_DEV_INT 0x29844 | 168 | #define TSI721_DEV_INT 0x29844 |
169 | #define TSI721_DEV_INTSET 0x29848 | 169 | #define TSI721_DEV_INTSET 0x29848 |
170 | #define TSI721_DEV_INT_BDMA_CH 0x00002000 | ||
171 | #define TSI721_DEV_INT_BDMA_NCH 0x00001000 | ||
170 | #define TSI721_DEV_INT_SMSG_CH 0x00000800 | 172 | #define TSI721_DEV_INT_SMSG_CH 0x00000800 |
171 | #define TSI721_DEV_INT_SMSG_NCH 0x00000400 | 173 | #define TSI721_DEV_INT_SMSG_NCH 0x00000400 |
172 | #define TSI721_DEV_INT_SR2PC_CH 0x00000200 | 174 | #define TSI721_DEV_INT_SR2PC_CH 0x00000200 |
@@ -181,6 +183,8 @@ | |||
181 | #define TSI721_INT_IMSG_CHAN(x) (1 << (16 + (x))) | 183 | #define TSI721_INT_IMSG_CHAN(x) (1 << (16 + (x))) |
182 | #define TSI721_INT_OMSG_CHAN_M 0x0000ff00 | 184 | #define TSI721_INT_OMSG_CHAN_M 0x0000ff00 |
183 | #define TSI721_INT_OMSG_CHAN(x) (1 << (8 + (x))) | 185 | #define TSI721_INT_OMSG_CHAN(x) (1 << (8 + (x))) |
186 | #define TSI721_INT_BDMA_CHAN_M 0x000000ff | ||
187 | #define TSI721_INT_BDMA_CHAN(x) (1 << (x)) | ||
184 | 188 | ||
185 | /* | 189 | /* |
186 | * PC2SR block registers | 190 | * PC2SR block registers |
@@ -235,14 +239,16 @@ | |||
235 | * x = 0..7 | 239 | * x = 0..7 |
236 | */ | 240 | */ |
237 | 241 | ||
238 | #define TSI721_DMAC_DWRCNT(x) (0x51000 + (x) * 0x1000) | 242 | #define TSI721_DMAC_BASE(x) (0x51000 + (x) * 0x1000) |
239 | #define TSI721_DMAC_DRDCNT(x) (0x51004 + (x) * 0x1000) | ||
240 | 243 | ||
241 | #define TSI721_DMAC_CTL(x) (0x51008 + (x) * 0x1000) | 244 | #define TSI721_DMAC_DWRCNT 0x000 |
245 | #define TSI721_DMAC_DRDCNT 0x004 | ||
246 | |||
247 | #define TSI721_DMAC_CTL 0x008 | ||
242 | #define TSI721_DMAC_CTL_SUSP 0x00000002 | 248 | #define TSI721_DMAC_CTL_SUSP 0x00000002 |
243 | #define TSI721_DMAC_CTL_INIT 0x00000001 | 249 | #define TSI721_DMAC_CTL_INIT 0x00000001 |
244 | 250 | ||
245 | #define TSI721_DMAC_INT(x) (0x5100c + (x) * 0x1000) | 251 | #define TSI721_DMAC_INT 0x00c |
246 | #define TSI721_DMAC_INT_STFULL 0x00000010 | 252 | #define TSI721_DMAC_INT_STFULL 0x00000010 |
247 | #define TSI721_DMAC_INT_DONE 0x00000008 | 253 | #define TSI721_DMAC_INT_DONE 0x00000008 |
248 | #define TSI721_DMAC_INT_SUSP 0x00000004 | 254 | #define TSI721_DMAC_INT_SUSP 0x00000004 |
@@ -250,34 +256,33 @@ | |||
250 | #define TSI721_DMAC_INT_IOFDONE 0x00000001 | 256 | #define TSI721_DMAC_INT_IOFDONE 0x00000001 |
251 | #define TSI721_DMAC_INT_ALL 0x0000001f | 257 | #define TSI721_DMAC_INT_ALL 0x0000001f |
252 | 258 | ||
253 | #define TSI721_DMAC_INTSET(x) (0x51010 + (x) * 0x1000) | 259 | #define TSI721_DMAC_INTSET 0x010 |
254 | 260 | ||
255 | #define TSI721_DMAC_STS(x) (0x51014 + (x) * 0x1000) | 261 | #define TSI721_DMAC_STS 0x014 |
256 | #define TSI721_DMAC_STS_ABORT 0x00400000 | 262 | #define TSI721_DMAC_STS_ABORT 0x00400000 |
257 | #define TSI721_DMAC_STS_RUN 0x00200000 | 263 | #define TSI721_DMAC_STS_RUN 0x00200000 |
258 | #define TSI721_DMAC_STS_CS 0x001f0000 | 264 | #define TSI721_DMAC_STS_CS 0x001f0000 |
259 | 265 | ||
260 | #define TSI721_DMAC_INTE(x) (0x51018 + (x) * 0x1000) | 266 | #define TSI721_DMAC_INTE 0x018 |
261 | 267 | ||
262 | #define TSI721_DMAC_DPTRL(x) (0x51024 + (x) * 0x1000) | 268 | #define TSI721_DMAC_DPTRL 0x024 |
263 | #define TSI721_DMAC_DPTRL_MASK 0xffffffe0 | 269 | #define TSI721_DMAC_DPTRL_MASK 0xffffffe0 |
264 | 270 | ||
265 | #define TSI721_DMAC_DPTRH(x) (0x51028 + (x) * 0x1000) | 271 | #define TSI721_DMAC_DPTRH 0x028 |
266 | 272 | ||
267 | #define TSI721_DMAC_DSBL(x) (0x5102c + (x) * 0x1000) | 273 | #define TSI721_DMAC_DSBL 0x02c |
268 | #define TSI721_DMAC_DSBL_MASK 0xffffffc0 | 274 | #define TSI721_DMAC_DSBL_MASK 0xffffffc0 |
269 | 275 | ||
270 | #define TSI721_DMAC_DSBH(x) (0x51030 + (x) * 0x1000) | 276 | #define TSI721_DMAC_DSBH 0x030 |
271 | 277 | ||
272 | #define TSI721_DMAC_DSSZ(x) (0x51034 + (x) * 0x1000) | 278 | #define TSI721_DMAC_DSSZ 0x034 |
273 | #define TSI721_DMAC_DSSZ_SIZE_M 0x0000000f | 279 | #define TSI721_DMAC_DSSZ_SIZE_M 0x0000000f |
274 | #define TSI721_DMAC_DSSZ_SIZE(size) (__fls(size) - 4) | 280 | #define TSI721_DMAC_DSSZ_SIZE(size) (__fls(size) - 4) |
275 | 281 | ||
276 | 282 | #define TSI721_DMAC_DSRP 0x038 | |
277 | #define TSI721_DMAC_DSRP(x) (0x51038 + (x) * 0x1000) | ||
278 | #define TSI721_DMAC_DSRP_MASK 0x0007ffff | 283 | #define TSI721_DMAC_DSRP_MASK 0x0007ffff |
279 | 284 | ||
280 | #define TSI721_DMAC_DSWP(x) (0x5103c + (x) * 0x1000) | 285 | #define TSI721_DMAC_DSWP 0x03c |
281 | #define TSI721_DMAC_DSWP_MASK 0x0007ffff | 286 | #define TSI721_DMAC_DSWP_MASK 0x0007ffff |
282 | 287 | ||
283 | #define TSI721_BDMA_INTE 0x5f000 | 288 | #define TSI721_BDMA_INTE 0x5f000 |
@@ -612,6 +617,8 @@ enum dma_rtype { | |||
612 | #define TSI721_DMACH_MAINT 0 /* DMA channel for maint requests */ | 617 | #define TSI721_DMACH_MAINT 0 /* DMA channel for maint requests */ |
613 | #define TSI721_DMACH_MAINT_NBD 32 /* Number of BDs for maint requests */ | 618 | #define TSI721_DMACH_MAINT_NBD 32 /* Number of BDs for maint requests */ |
614 | 619 | ||
620 | #define TSI721_DMACH_DMA 1 /* DMA channel for data transfers */ | ||
621 | |||
615 | #define MSG_DMA_ENTRY_INX_TO_SIZE(x) ((0x10 << (x)) & 0xFFFF0) | 622 | #define MSG_DMA_ENTRY_INX_TO_SIZE(x) ((0x10 << (x)) & 0xFFFF0) |
616 | 623 | ||
617 | enum tsi721_smsg_int_flag { | 624 | enum tsi721_smsg_int_flag { |
@@ -626,7 +633,48 @@ enum tsi721_smsg_int_flag { | |||
626 | 633 | ||
627 | /* Structures */ | 634 | /* Structures */ |
628 | 635 | ||
636 | #ifdef CONFIG_RAPIDIO_DMA_ENGINE | ||
637 | |||
638 | struct tsi721_tx_desc { | ||
639 | struct dma_async_tx_descriptor txd; | ||
640 | struct tsi721_dma_desc *hw_desc; | ||
641 | u16 destid; | ||
642 | /* low 64-bits of 66-bit RIO address */ | ||
643 | u64 rio_addr; | ||
644 | /* upper 2-bits of 66-bit RIO address */ | ||
645 | u8 rio_addr_u; | ||
646 | bool interrupt; | ||
647 | struct list_head desc_node; | ||
648 | struct list_head tx_list; | ||
649 | }; | ||
650 | |||
629 | struct tsi721_bdma_chan { | 651 | struct tsi721_bdma_chan { |
652 | int id; | ||
653 | void __iomem *regs; | ||
654 | int bd_num; /* number of buffer descriptors */ | ||
655 | void *bd_base; /* start of DMA descriptors */ | ||
656 | dma_addr_t bd_phys; | ||
657 | void *sts_base; /* start of DMA BD status FIFO */ | ||
658 | dma_addr_t sts_phys; | ||
659 | int sts_size; | ||
660 | u32 sts_rdptr; | ||
661 | u32 wr_count; | ||
662 | u32 wr_count_next; | ||
663 | |||
664 | struct dma_chan dchan; | ||
665 | struct tsi721_tx_desc *tx_desc; | ||
666 | spinlock_t lock; | ||
667 | struct list_head active_list; | ||
668 | struct list_head queue; | ||
669 | struct list_head free_list; | ||
670 | dma_cookie_t completed_cookie; | ||
671 | struct tasklet_struct tasklet; | ||
672 | }; | ||
673 | |||
674 | #endif /* CONFIG_RAPIDIO_DMA_ENGINE */ | ||
675 | |||
676 | struct tsi721_bdma_maint { | ||
677 | int ch_id; /* BDMA channel number */ | ||
630 | int bd_num; /* number of buffer descriptors */ | 678 | int bd_num; /* number of buffer descriptors */ |
631 | void *bd_base; /* start of DMA descriptors */ | 679 | void *bd_base; /* start of DMA descriptors */ |
632 | dma_addr_t bd_phys; | 680 | dma_addr_t bd_phys; |
@@ -721,6 +769,24 @@ enum tsi721_msix_vect { | |||
721 | TSI721_VECT_IMB1_INT, | 769 | TSI721_VECT_IMB1_INT, |
722 | TSI721_VECT_IMB2_INT, | 770 | TSI721_VECT_IMB2_INT, |
723 | TSI721_VECT_IMB3_INT, | 771 | TSI721_VECT_IMB3_INT, |
772 | #ifdef CONFIG_RAPIDIO_DMA_ENGINE | ||
773 | TSI721_VECT_DMA0_DONE, | ||
774 | TSI721_VECT_DMA1_DONE, | ||
775 | TSI721_VECT_DMA2_DONE, | ||
776 | TSI721_VECT_DMA3_DONE, | ||
777 | TSI721_VECT_DMA4_DONE, | ||
778 | TSI721_VECT_DMA5_DONE, | ||
779 | TSI721_VECT_DMA6_DONE, | ||
780 | TSI721_VECT_DMA7_DONE, | ||
781 | TSI721_VECT_DMA0_INT, | ||
782 | TSI721_VECT_DMA1_INT, | ||
783 | TSI721_VECT_DMA2_INT, | ||
784 | TSI721_VECT_DMA3_INT, | ||
785 | TSI721_VECT_DMA4_INT, | ||
786 | TSI721_VECT_DMA5_INT, | ||
787 | TSI721_VECT_DMA6_INT, | ||
788 | TSI721_VECT_DMA7_INT, | ||
789 | #endif /* CONFIG_RAPIDIO_DMA_ENGINE */ | ||
724 | TSI721_VECT_MAX | 790 | TSI721_VECT_MAX |
725 | }; | 791 | }; |
726 | 792 | ||
@@ -754,7 +820,11 @@ struct tsi721_device { | |||
754 | u32 pw_discard_count; | 820 | u32 pw_discard_count; |
755 | 821 | ||
756 | /* BDMA Engine */ | 822 | /* BDMA Engine */ |
823 | struct tsi721_bdma_maint mdma; /* Maintenance rd/wr request channel */ | ||
824 | |||
825 | #ifdef CONFIG_RAPIDIO_DMA_ENGINE | ||
757 | struct tsi721_bdma_chan bdma[TSI721_DMA_CHNUM]; | 826 | struct tsi721_bdma_chan bdma[TSI721_DMA_CHNUM]; |
827 | #endif | ||
758 | 828 | ||
759 | /* Inbound Messaging */ | 829 | /* Inbound Messaging */ |
760 | int imsg_init[TSI721_IMSG_CHNUM]; | 830 | int imsg_init[TSI721_IMSG_CHNUM]; |
@@ -765,4 +835,9 @@ struct tsi721_device { | |||
765 | struct tsi721_omsg_ring omsg_ring[TSI721_OMSG_CHNUM]; | 835 | struct tsi721_omsg_ring omsg_ring[TSI721_OMSG_CHNUM]; |
766 | }; | 836 | }; |
767 | 837 | ||
838 | #ifdef CONFIG_RAPIDIO_DMA_ENGINE | ||
839 | extern void tsi721_bdma_handler(struct tsi721_bdma_chan *bdma_chan); | ||
840 | extern int __devinit tsi721_register_dma(struct tsi721_device *priv); | ||
841 | #endif | ||
842 | |||
768 | #endif | 843 | #endif |
diff --git a/drivers/rapidio/devices/tsi721_dma.c b/drivers/rapidio/devices/tsi721_dma.c new file mode 100644 index 000000000000..92e06a5c62ec --- /dev/null +++ b/drivers/rapidio/devices/tsi721_dma.c | |||
@@ -0,0 +1,823 @@ | |||
1 | /* | ||
2 | * DMA Engine support for Tsi721 PCIExpress-to-SRIO bridge | ||
3 | * | ||
4 | * Copyright 2011 Integrated Device Technology, Inc. | ||
5 | * Alexandre Bounine <alexandre.bounine@idt.com> | ||
6 | * | ||
7 | * This program is free software; you can redistribute it and/or modify it | ||
8 | * under the terms of the GNU General Public License as published by the Free | ||
9 | * Software Foundation; either version 2 of the License, or (at your option) | ||
10 | * any later version. | ||
11 | * | ||
12 | * This program is distributed in the hope that it will be useful, but WITHOUT | ||
13 | * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | ||
14 | * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for | ||
15 | * more details. | ||
16 | * | ||
17 | * You should have received a copy of the GNU General Public License along with | ||
18 | * this program; if not, write to the Free Software Foundation, Inc., 59 | ||
19 | * Temple Place - Suite 330, Boston, MA 02111-1307, USA. | ||
20 | */ | ||
21 | |||
22 | #include <linux/io.h> | ||
23 | #include <linux/errno.h> | ||
24 | #include <linux/init.h> | ||
25 | #include <linux/ioport.h> | ||
26 | #include <linux/kernel.h> | ||
27 | #include <linux/module.h> | ||
28 | #include <linux/pci.h> | ||
29 | #include <linux/rio.h> | ||
30 | #include <linux/rio_drv.h> | ||
31 | #include <linux/dma-mapping.h> | ||
32 | #include <linux/interrupt.h> | ||
33 | #include <linux/kfifo.h> | ||
34 | #include <linux/delay.h> | ||
35 | |||
36 | #include "tsi721.h" | ||
37 | |||
38 | static inline struct tsi721_bdma_chan *to_tsi721_chan(struct dma_chan *chan) | ||
39 | { | ||
40 | return container_of(chan, struct tsi721_bdma_chan, dchan); | ||
41 | } | ||
42 | |||
43 | static inline struct tsi721_device *to_tsi721(struct dma_device *ddev) | ||
44 | { | ||
45 | return container_of(ddev, struct rio_mport, dma)->priv; | ||
46 | } | ||
47 | |||
48 | static inline | ||
49 | struct tsi721_tx_desc *to_tsi721_desc(struct dma_async_tx_descriptor *txd) | ||
50 | { | ||
51 | return container_of(txd, struct tsi721_tx_desc, txd); | ||
52 | } | ||
53 | |||
54 | static inline | ||
55 | struct tsi721_tx_desc *tsi721_dma_first_active( | ||
56 | struct tsi721_bdma_chan *bdma_chan) | ||
57 | { | ||
58 | return list_first_entry(&bdma_chan->active_list, | ||
59 | struct tsi721_tx_desc, desc_node); | ||
60 | } | ||
61 | |||
62 | static int tsi721_bdma_ch_init(struct tsi721_bdma_chan *bdma_chan) | ||
63 | { | ||
64 | struct tsi721_dma_desc *bd_ptr; | ||
65 | struct device *dev = bdma_chan->dchan.device->dev; | ||
66 | u64 *sts_ptr; | ||
67 | dma_addr_t bd_phys; | ||
68 | dma_addr_t sts_phys; | ||
69 | int sts_size; | ||
70 | int bd_num = bdma_chan->bd_num; | ||
71 | |||
72 | dev_dbg(dev, "Init Block DMA Engine, CH%d\n", bdma_chan->id); | ||
73 | |||
74 | /* Allocate space for DMA descriptors */ | ||
75 | bd_ptr = dma_zalloc_coherent(dev, | ||
76 | bd_num * sizeof(struct tsi721_dma_desc), | ||
77 | &bd_phys, GFP_KERNEL); | ||
78 | if (!bd_ptr) | ||
79 | return -ENOMEM; | ||
80 | |||
81 | bdma_chan->bd_phys = bd_phys; | ||
82 | bdma_chan->bd_base = bd_ptr; | ||
83 | |||
84 | dev_dbg(dev, "DMA descriptors @ %p (phys = %llx)\n", | ||
85 | bd_ptr, (unsigned long long)bd_phys); | ||
86 | |||
87 | /* Allocate space for descriptor status FIFO */ | ||
88 | sts_size = (bd_num >= TSI721_DMA_MINSTSSZ) ? | ||
89 | bd_num : TSI721_DMA_MINSTSSZ; | ||
90 | sts_size = roundup_pow_of_two(sts_size); | ||
91 | sts_ptr = dma_zalloc_coherent(dev, | ||
92 | sts_size * sizeof(struct tsi721_dma_sts), | ||
93 | &sts_phys, GFP_KERNEL); | ||
94 | if (!sts_ptr) { | ||
95 | /* Free space allocated for DMA descriptors */ | ||
96 | dma_free_coherent(dev, | ||
97 | bd_num * sizeof(struct tsi721_dma_desc), | ||
98 | bd_ptr, bd_phys); | ||
99 | bdma_chan->bd_base = NULL; | ||
100 | return -ENOMEM; | ||
101 | } | ||
102 | |||
103 | bdma_chan->sts_phys = sts_phys; | ||
104 | bdma_chan->sts_base = sts_ptr; | ||
105 | bdma_chan->sts_size = sts_size; | ||
106 | |||
107 | dev_dbg(dev, | ||
108 | "desc status FIFO @ %p (phys = %llx) size=0x%x\n", | ||
109 | sts_ptr, (unsigned long long)sts_phys, sts_size); | ||
110 | |||
111 | /* Initialize DMA descriptors ring */ | ||
112 | bd_ptr[bd_num - 1].type_id = cpu_to_le32(DTYPE3 << 29); | ||
113 | bd_ptr[bd_num - 1].next_lo = cpu_to_le32((u64)bd_phys & | ||
114 | TSI721_DMAC_DPTRL_MASK); | ||
115 | bd_ptr[bd_num - 1].next_hi = cpu_to_le32((u64)bd_phys >> 32); | ||
116 | |||
117 | /* Setup DMA descriptor pointers */ | ||
118 | iowrite32(((u64)bd_phys >> 32), | ||
119 | bdma_chan->regs + TSI721_DMAC_DPTRH); | ||
120 | iowrite32(((u64)bd_phys & TSI721_DMAC_DPTRL_MASK), | ||
121 | bdma_chan->regs + TSI721_DMAC_DPTRL); | ||
122 | |||
123 | /* Setup descriptor status FIFO */ | ||
124 | iowrite32(((u64)sts_phys >> 32), | ||
125 | bdma_chan->regs + TSI721_DMAC_DSBH); | ||
126 | iowrite32(((u64)sts_phys & TSI721_DMAC_DSBL_MASK), | ||
127 | bdma_chan->regs + TSI721_DMAC_DSBL); | ||
128 | iowrite32(TSI721_DMAC_DSSZ_SIZE(sts_size), | ||
129 | bdma_chan->regs + TSI721_DMAC_DSSZ); | ||
130 | |||
131 | /* Clear interrupt bits */ | ||
132 | iowrite32(TSI721_DMAC_INT_ALL, | ||
133 | bdma_chan->regs + TSI721_DMAC_INT); | ||
134 | |||
135 | ioread32(bdma_chan->regs + TSI721_DMAC_INT); | ||
136 | |||
137 | /* Toggle DMA channel initialization */ | ||
138 | iowrite32(TSI721_DMAC_CTL_INIT, bdma_chan->regs + TSI721_DMAC_CTL); | ||
139 | ioread32(bdma_chan->regs + TSI721_DMAC_CTL); | ||
140 | bdma_chan->wr_count = bdma_chan->wr_count_next = 0; | ||
141 | bdma_chan->sts_rdptr = 0; | ||
142 | udelay(10); | ||
143 | |||
144 | return 0; | ||
145 | } | ||
146 | |||
147 | static int tsi721_bdma_ch_free(struct tsi721_bdma_chan *bdma_chan) | ||
148 | { | ||
149 | u32 ch_stat; | ||
150 | |||
151 | if (bdma_chan->bd_base == NULL) | ||
152 | return 0; | ||
153 | |||
154 | /* Check if DMA channel still running */ | ||
155 | ch_stat = ioread32(bdma_chan->regs + TSI721_DMAC_STS); | ||
156 | if (ch_stat & TSI721_DMAC_STS_RUN) | ||
157 | return -EFAULT; | ||
158 | |||
159 | /* Put DMA channel into init state */ | ||
160 | iowrite32(TSI721_DMAC_CTL_INIT, bdma_chan->regs + TSI721_DMAC_CTL); | ||
161 | |||
162 | /* Free space allocated for DMA descriptors */ | ||
163 | dma_free_coherent(bdma_chan->dchan.device->dev, | ||
164 | bdma_chan->bd_num * sizeof(struct tsi721_dma_desc), | ||
165 | bdma_chan->bd_base, bdma_chan->bd_phys); | ||
166 | bdma_chan->bd_base = NULL; | ||
167 | |||
168 | /* Free space allocated for status FIFO */ | ||
169 | dma_free_coherent(bdma_chan->dchan.device->dev, | ||
170 | bdma_chan->sts_size * sizeof(struct tsi721_dma_sts), | ||
171 | bdma_chan->sts_base, bdma_chan->sts_phys); | ||
172 | bdma_chan->sts_base = NULL; | ||
173 | return 0; | ||
174 | } | ||
175 | |||
176 | static void | ||
177 | tsi721_bdma_interrupt_enable(struct tsi721_bdma_chan *bdma_chan, int enable) | ||
178 | { | ||
179 | if (enable) { | ||
180 | /* Clear pending BDMA channel interrupts */ | ||
181 | iowrite32(TSI721_DMAC_INT_ALL, | ||
182 | bdma_chan->regs + TSI721_DMAC_INT); | ||
183 | ioread32(bdma_chan->regs + TSI721_DMAC_INT); | ||
184 | /* Enable BDMA channel interrupts */ | ||
185 | iowrite32(TSI721_DMAC_INT_ALL, | ||
186 | bdma_chan->regs + TSI721_DMAC_INTE); | ||
187 | } else { | ||
188 | /* Disable BDMA channel interrupts */ | ||
189 | iowrite32(0, bdma_chan->regs + TSI721_DMAC_INTE); | ||
190 | /* Clear pending BDMA channel interrupts */ | ||
191 | iowrite32(TSI721_DMAC_INT_ALL, | ||
192 | bdma_chan->regs + TSI721_DMAC_INT); | ||
193 | } | ||
194 | |||
195 | } | ||
196 | |||
197 | static bool tsi721_dma_is_idle(struct tsi721_bdma_chan *bdma_chan) | ||
198 | { | ||
199 | u32 sts; | ||
200 | |||
201 | sts = ioread32(bdma_chan->regs + TSI721_DMAC_STS); | ||
202 | return ((sts & TSI721_DMAC_STS_RUN) == 0); | ||
203 | } | ||
204 | |||
205 | void tsi721_bdma_handler(struct tsi721_bdma_chan *bdma_chan) | ||
206 | { | ||
207 | /* Disable BDMA channel interrupts */ | ||
208 | iowrite32(0, bdma_chan->regs + TSI721_DMAC_INTE); | ||
209 | |||
210 | tasklet_schedule(&bdma_chan->tasklet); | ||
211 | } | ||
212 | |||
213 | #ifdef CONFIG_PCI_MSI | ||
214 | /** | ||
215 | * tsi721_omsg_msix - MSI-X interrupt handler for BDMA channels | ||
216 | * @irq: Linux interrupt number | ||
217 | * @ptr: Pointer to interrupt-specific data (BDMA channel structure) | ||
218 | * | ||
219 | * Handles BDMA channel interrupts signaled using MSI-X. | ||
220 | */ | ||
221 | static irqreturn_t tsi721_bdma_msix(int irq, void *ptr) | ||
222 | { | ||
223 | struct tsi721_bdma_chan *bdma_chan = ptr; | ||
224 | |||
225 | tsi721_bdma_handler(bdma_chan); | ||
226 | return IRQ_HANDLED; | ||
227 | } | ||
228 | #endif /* CONFIG_PCI_MSI */ | ||
229 | |||
230 | /* Must be called with the spinlock held */ | ||
231 | static void tsi721_start_dma(struct tsi721_bdma_chan *bdma_chan) | ||
232 | { | ||
233 | if (!tsi721_dma_is_idle(bdma_chan)) { | ||
234 | dev_err(bdma_chan->dchan.device->dev, | ||
235 | "BUG: Attempt to start non-idle channel\n"); | ||
236 | return; | ||
237 | } | ||
238 | |||
239 | if (bdma_chan->wr_count == bdma_chan->wr_count_next) { | ||
240 | dev_err(bdma_chan->dchan.device->dev, | ||
241 | "BUG: Attempt to start DMA with no BDs ready\n"); | ||
242 | return; | ||
243 | } | ||
244 | |||
245 | dev_dbg(bdma_chan->dchan.device->dev, | ||
246 | "tx_chan: %p, chan: %d, regs: %p\n", | ||
247 | bdma_chan, bdma_chan->dchan.chan_id, bdma_chan->regs); | ||
248 | |||
249 | iowrite32(bdma_chan->wr_count_next, | ||
250 | bdma_chan->regs + TSI721_DMAC_DWRCNT); | ||
251 | ioread32(bdma_chan->regs + TSI721_DMAC_DWRCNT); | ||
252 | |||
253 | bdma_chan->wr_count = bdma_chan->wr_count_next; | ||
254 | } | ||
255 | |||
256 | static void tsi721_desc_put(struct tsi721_bdma_chan *bdma_chan, | ||
257 | struct tsi721_tx_desc *desc) | ||
258 | { | ||
259 | dev_dbg(bdma_chan->dchan.device->dev, | ||
260 | "Put desc: %p into free list\n", desc); | ||
261 | |||
262 | if (desc) { | ||
263 | spin_lock_bh(&bdma_chan->lock); | ||
264 | list_splice_init(&desc->tx_list, &bdma_chan->free_list); | ||
265 | list_add(&desc->desc_node, &bdma_chan->free_list); | ||
266 | bdma_chan->wr_count_next = bdma_chan->wr_count; | ||
267 | spin_unlock_bh(&bdma_chan->lock); | ||
268 | } | ||
269 | } | ||
270 | |||
271 | static | ||
272 | struct tsi721_tx_desc *tsi721_desc_get(struct tsi721_bdma_chan *bdma_chan) | ||
273 | { | ||
274 | struct tsi721_tx_desc *tx_desc, *_tx_desc; | ||
275 | struct tsi721_tx_desc *ret = NULL; | ||
276 | int i; | ||
277 | |||
278 | spin_lock_bh(&bdma_chan->lock); | ||
279 | list_for_each_entry_safe(tx_desc, _tx_desc, | ||
280 | &bdma_chan->free_list, desc_node) { | ||
281 | if (async_tx_test_ack(&tx_desc->txd)) { | ||
282 | list_del(&tx_desc->desc_node); | ||
283 | ret = tx_desc; | ||
284 | break; | ||
285 | } | ||
286 | dev_dbg(bdma_chan->dchan.device->dev, | ||
287 | "desc %p not ACKed\n", tx_desc); | ||
288 | } | ||
289 | |||
290 | i = bdma_chan->wr_count_next % bdma_chan->bd_num; | ||
291 | if (i == bdma_chan->bd_num - 1) { | ||
292 | i = 0; | ||
293 | bdma_chan->wr_count_next++; /* skip link descriptor */ | ||
294 | } | ||
295 | |||
296 | bdma_chan->wr_count_next++; | ||
297 | tx_desc->txd.phys = bdma_chan->bd_phys + | ||
298 | i * sizeof(struct tsi721_dma_desc); | ||
299 | tx_desc->hw_desc = &((struct tsi721_dma_desc *)bdma_chan->bd_base)[i]; | ||
300 | |||
301 | spin_unlock_bh(&bdma_chan->lock); | ||
302 | |||
303 | return ret; | ||
304 | } | ||
305 | |||
306 | static int | ||
307 | tsi721_fill_desc(struct tsi721_bdma_chan *bdma_chan, | ||
308 | struct tsi721_tx_desc *desc, struct scatterlist *sg, | ||
309 | enum dma_rtype rtype, u32 sys_size) | ||
310 | { | ||
311 | struct tsi721_dma_desc *bd_ptr = desc->hw_desc; | ||
312 | u64 rio_addr; | ||
313 | |||
314 | if (sg_dma_len(sg) > TSI721_DMAD_BCOUNT1 + 1) { | ||
315 | dev_err(bdma_chan->dchan.device->dev, | ||
316 | "SG element is too large\n"); | ||
317 | return -EINVAL; | ||
318 | } | ||
319 | |||
320 | dev_dbg(bdma_chan->dchan.device->dev, | ||
321 | "desc: 0x%llx, addr: 0x%llx len: 0x%x\n", | ||
322 | (u64)desc->txd.phys, (unsigned long long)sg_dma_address(sg), | ||
323 | sg_dma_len(sg)); | ||
324 | |||
325 | dev_dbg(bdma_chan->dchan.device->dev, | ||
326 | "bd_ptr = %p did=%d raddr=0x%llx\n", | ||
327 | bd_ptr, desc->destid, desc->rio_addr); | ||
328 | |||
329 | /* Initialize DMA descriptor */ | ||
330 | bd_ptr->type_id = cpu_to_le32((DTYPE1 << 29) | | ||
331 | (rtype << 19) | desc->destid); | ||
332 | if (desc->interrupt) | ||
333 | bd_ptr->type_id |= cpu_to_le32(TSI721_DMAD_IOF); | ||
334 | bd_ptr->bcount = cpu_to_le32(((desc->rio_addr & 0x3) << 30) | | ||
335 | (sys_size << 26) | sg_dma_len(sg)); | ||
336 | rio_addr = (desc->rio_addr >> 2) | | ||
337 | ((u64)(desc->rio_addr_u & 0x3) << 62); | ||
338 | bd_ptr->raddr_lo = cpu_to_le32(rio_addr & 0xffffffff); | ||
339 | bd_ptr->raddr_hi = cpu_to_le32(rio_addr >> 32); | ||
340 | bd_ptr->t1.bufptr_lo = cpu_to_le32( | ||
341 | (u64)sg_dma_address(sg) & 0xffffffff); | ||
342 | bd_ptr->t1.bufptr_hi = cpu_to_le32((u64)sg_dma_address(sg) >> 32); | ||
343 | bd_ptr->t1.s_dist = 0; | ||
344 | bd_ptr->t1.s_size = 0; | ||
345 | |||
346 | return 0; | ||
347 | } | ||
348 | |||
349 | static void tsi721_dma_chain_complete(struct tsi721_bdma_chan *bdma_chan, | ||
350 | struct tsi721_tx_desc *desc) | ||
351 | { | ||
352 | struct dma_async_tx_descriptor *txd = &desc->txd; | ||
353 | dma_async_tx_callback callback = txd->callback; | ||
354 | void *param = txd->callback_param; | ||
355 | |||
356 | list_splice_init(&desc->tx_list, &bdma_chan->free_list); | ||
357 | list_move(&desc->desc_node, &bdma_chan->free_list); | ||
358 | bdma_chan->completed_cookie = txd->cookie; | ||
359 | |||
360 | if (callback) | ||
361 | callback(param); | ||
362 | } | ||
363 | |||
364 | static void tsi721_dma_complete_all(struct tsi721_bdma_chan *bdma_chan) | ||
365 | { | ||
366 | struct tsi721_tx_desc *desc, *_d; | ||
367 | LIST_HEAD(list); | ||
368 | |||
369 | BUG_ON(!tsi721_dma_is_idle(bdma_chan)); | ||
370 | |||
371 | if (!list_empty(&bdma_chan->queue)) | ||
372 | tsi721_start_dma(bdma_chan); | ||
373 | |||
374 | list_splice_init(&bdma_chan->active_list, &list); | ||
375 | list_splice_init(&bdma_chan->queue, &bdma_chan->active_list); | ||
376 | |||
377 | list_for_each_entry_safe(desc, _d, &list, desc_node) | ||
378 | tsi721_dma_chain_complete(bdma_chan, desc); | ||
379 | } | ||
380 | |||
381 | static void tsi721_clr_stat(struct tsi721_bdma_chan *bdma_chan) | ||
382 | { | ||
383 | u32 srd_ptr; | ||
384 | u64 *sts_ptr; | ||
385 | int i, j; | ||
386 | |||
387 | /* Check and clear descriptor status FIFO entries */ | ||
388 | srd_ptr = bdma_chan->sts_rdptr; | ||
389 | sts_ptr = bdma_chan->sts_base; | ||
390 | j = srd_ptr * 8; | ||
391 | while (sts_ptr[j]) { | ||
392 | for (i = 0; i < 8 && sts_ptr[j]; i++, j++) | ||
393 | sts_ptr[j] = 0; | ||
394 | |||
395 | ++srd_ptr; | ||
396 | srd_ptr %= bdma_chan->sts_size; | ||
397 | j = srd_ptr * 8; | ||
398 | } | ||
399 | |||
400 | iowrite32(srd_ptr, bdma_chan->regs + TSI721_DMAC_DSRP); | ||
401 | bdma_chan->sts_rdptr = srd_ptr; | ||
402 | } | ||
403 | |||
404 | static void tsi721_advance_work(struct tsi721_bdma_chan *bdma_chan) | ||
405 | { | ||
406 | if (list_empty(&bdma_chan->active_list) || | ||
407 | list_is_singular(&bdma_chan->active_list)) { | ||
408 | dev_dbg(bdma_chan->dchan.device->dev, | ||
409 | "%s: Active_list empty\n", __func__); | ||
410 | tsi721_dma_complete_all(bdma_chan); | ||
411 | } else { | ||
412 | dev_dbg(bdma_chan->dchan.device->dev, | ||
413 | "%s: Active_list NOT empty\n", __func__); | ||
414 | tsi721_dma_chain_complete(bdma_chan, | ||
415 | tsi721_dma_first_active(bdma_chan)); | ||
416 | tsi721_start_dma(bdma_chan); | ||
417 | } | ||
418 | } | ||
419 | |||
420 | static void tsi721_dma_tasklet(unsigned long data) | ||
421 | { | ||
422 | struct tsi721_bdma_chan *bdma_chan = (struct tsi721_bdma_chan *)data; | ||
423 | u32 dmac_int, dmac_sts; | ||
424 | |||
425 | dmac_int = ioread32(bdma_chan->regs + TSI721_DMAC_INT); | ||
426 | dev_dbg(bdma_chan->dchan.device->dev, "%s: DMAC%d_INT = 0x%x\n", | ||
427 | __func__, bdma_chan->id, dmac_int); | ||
428 | /* Clear channel interrupts */ | ||
429 | iowrite32(dmac_int, bdma_chan->regs + TSI721_DMAC_INT); | ||
430 | |||
431 | if (dmac_int & TSI721_DMAC_INT_ERR) { | ||
432 | dmac_sts = ioread32(bdma_chan->regs + TSI721_DMAC_STS); | ||
433 | dev_err(bdma_chan->dchan.device->dev, | ||
434 | "%s: DMA ERROR - DMAC%d_STS = 0x%x\n", | ||
435 | __func__, bdma_chan->id, dmac_sts); | ||
436 | } | ||
437 | |||
438 | if (dmac_int & TSI721_DMAC_INT_STFULL) { | ||
439 | dev_err(bdma_chan->dchan.device->dev, | ||
440 | "%s: DMAC%d descriptor status FIFO is full\n", | ||
441 | __func__, bdma_chan->id); | ||
442 | } | ||
443 | |||
444 | if (dmac_int & (TSI721_DMAC_INT_DONE | TSI721_DMAC_INT_IOFDONE)) { | ||
445 | tsi721_clr_stat(bdma_chan); | ||
446 | spin_lock(&bdma_chan->lock); | ||
447 | tsi721_advance_work(bdma_chan); | ||
448 | spin_unlock(&bdma_chan->lock); | ||
449 | } | ||
450 | |||
451 | /* Re-Enable BDMA channel interrupts */ | ||
452 | iowrite32(TSI721_DMAC_INT_ALL, bdma_chan->regs + TSI721_DMAC_INTE); | ||
453 | } | ||
454 | |||
455 | static dma_cookie_t tsi721_tx_submit(struct dma_async_tx_descriptor *txd) | ||
456 | { | ||
457 | struct tsi721_tx_desc *desc = to_tsi721_desc(txd); | ||
458 | struct tsi721_bdma_chan *bdma_chan = to_tsi721_chan(txd->chan); | ||
459 | dma_cookie_t cookie; | ||
460 | |||
461 | spin_lock_bh(&bdma_chan->lock); | ||
462 | |||
463 | cookie = txd->chan->cookie; | ||
464 | if (++cookie < 0) | ||
465 | cookie = 1; | ||
466 | txd->chan->cookie = cookie; | ||
467 | txd->cookie = cookie; | ||
468 | |||
469 | if (list_empty(&bdma_chan->active_list)) { | ||
470 | list_add_tail(&desc->desc_node, &bdma_chan->active_list); | ||
471 | tsi721_start_dma(bdma_chan); | ||
472 | } else { | ||
473 | list_add_tail(&desc->desc_node, &bdma_chan->queue); | ||
474 | } | ||
475 | |||
476 | spin_unlock_bh(&bdma_chan->lock); | ||
477 | return cookie; | ||
478 | } | ||
479 | |||
480 | static int tsi721_alloc_chan_resources(struct dma_chan *dchan) | ||
481 | { | ||
482 | struct tsi721_bdma_chan *bdma_chan = to_tsi721_chan(dchan); | ||
483 | #ifdef CONFIG_PCI_MSI | ||
484 | struct tsi721_device *priv = to_tsi721(dchan->device); | ||
485 | #endif | ||
486 | struct tsi721_tx_desc *desc = NULL; | ||
487 | LIST_HEAD(tmp_list); | ||
488 | int i; | ||
489 | int rc; | ||
490 | |||
491 | if (bdma_chan->bd_base) | ||
492 | return bdma_chan->bd_num - 1; | ||
493 | |||
494 | /* Initialize BDMA channel */ | ||
495 | if (tsi721_bdma_ch_init(bdma_chan)) { | ||
496 | dev_err(dchan->device->dev, "Unable to initialize data DMA" | ||
497 | " channel %d, aborting\n", bdma_chan->id); | ||
498 | return -ENOMEM; | ||
499 | } | ||
500 | |||
501 | /* Alocate matching number of logical descriptors */ | ||
502 | desc = kcalloc((bdma_chan->bd_num - 1), sizeof(struct tsi721_tx_desc), | ||
503 | GFP_KERNEL); | ||
504 | if (!desc) { | ||
505 | dev_err(dchan->device->dev, | ||
506 | "Failed to allocate logical descriptors\n"); | ||
507 | rc = -ENOMEM; | ||
508 | goto err_out; | ||
509 | } | ||
510 | |||
511 | bdma_chan->tx_desc = desc; | ||
512 | |||
513 | for (i = 0; i < bdma_chan->bd_num - 1; i++) { | ||
514 | dma_async_tx_descriptor_init(&desc[i].txd, dchan); | ||
515 | desc[i].txd.tx_submit = tsi721_tx_submit; | ||
516 | desc[i].txd.flags = DMA_CTRL_ACK; | ||
517 | INIT_LIST_HEAD(&desc[i].tx_list); | ||
518 | list_add_tail(&desc[i].desc_node, &tmp_list); | ||
519 | } | ||
520 | |||
521 | spin_lock_bh(&bdma_chan->lock); | ||
522 | list_splice(&tmp_list, &bdma_chan->free_list); | ||
523 | bdma_chan->completed_cookie = dchan->cookie = 1; | ||
524 | spin_unlock_bh(&bdma_chan->lock); | ||
525 | |||
526 | #ifdef CONFIG_PCI_MSI | ||
527 | if (priv->flags & TSI721_USING_MSIX) { | ||
528 | /* Request interrupt service if we are in MSI-X mode */ | ||
529 | rc = request_irq( | ||
530 | priv->msix[TSI721_VECT_DMA0_DONE + | ||
531 | bdma_chan->id].vector, | ||
532 | tsi721_bdma_msix, 0, | ||
533 | priv->msix[TSI721_VECT_DMA0_DONE + | ||
534 | bdma_chan->id].irq_name, | ||
535 | (void *)bdma_chan); | ||
536 | |||
537 | if (rc) { | ||
538 | dev_dbg(dchan->device->dev, | ||
539 | "Unable to allocate MSI-X interrupt for " | ||
540 | "BDMA%d-DONE\n", bdma_chan->id); | ||
541 | goto err_out; | ||
542 | } | ||
543 | |||
544 | rc = request_irq(priv->msix[TSI721_VECT_DMA0_INT + | ||
545 | bdma_chan->id].vector, | ||
546 | tsi721_bdma_msix, 0, | ||
547 | priv->msix[TSI721_VECT_DMA0_INT + | ||
548 | bdma_chan->id].irq_name, | ||
549 | (void *)bdma_chan); | ||
550 | |||
551 | if (rc) { | ||
552 | dev_dbg(dchan->device->dev, | ||
553 | "Unable to allocate MSI-X interrupt for " | ||
554 | "BDMA%d-INT\n", bdma_chan->id); | ||
555 | free_irq( | ||
556 | priv->msix[TSI721_VECT_DMA0_DONE + | ||
557 | bdma_chan->id].vector, | ||
558 | (void *)bdma_chan); | ||
559 | rc = -EIO; | ||
560 | goto err_out; | ||
561 | } | ||
562 | } | ||
563 | #endif /* CONFIG_PCI_MSI */ | ||
564 | |||
565 | tasklet_enable(&bdma_chan->tasklet); | ||
566 | tsi721_bdma_interrupt_enable(bdma_chan, 1); | ||
567 | |||
568 | return bdma_chan->bd_num - 1; | ||
569 | |||
570 | err_out: | ||
571 | kfree(desc); | ||
572 | tsi721_bdma_ch_free(bdma_chan); | ||
573 | return rc; | ||
574 | } | ||
575 | |||
576 | static void tsi721_free_chan_resources(struct dma_chan *dchan) | ||
577 | { | ||
578 | struct tsi721_bdma_chan *bdma_chan = to_tsi721_chan(dchan); | ||
579 | #ifdef CONFIG_PCI_MSI | ||
580 | struct tsi721_device *priv = to_tsi721(dchan->device); | ||
581 | #endif | ||
582 | LIST_HEAD(list); | ||
583 | |||
584 | dev_dbg(dchan->device->dev, "%s: Entry\n", __func__); | ||
585 | |||
586 | if (bdma_chan->bd_base == NULL) | ||
587 | return; | ||
588 | |||
589 | BUG_ON(!list_empty(&bdma_chan->active_list)); | ||
590 | BUG_ON(!list_empty(&bdma_chan->queue)); | ||
591 | |||
592 | tasklet_disable(&bdma_chan->tasklet); | ||
593 | |||
594 | spin_lock_bh(&bdma_chan->lock); | ||
595 | list_splice_init(&bdma_chan->free_list, &list); | ||
596 | spin_unlock_bh(&bdma_chan->lock); | ||
597 | |||
598 | tsi721_bdma_interrupt_enable(bdma_chan, 0); | ||
599 | |||
600 | #ifdef CONFIG_PCI_MSI | ||
601 | if (priv->flags & TSI721_USING_MSIX) { | ||
602 | free_irq(priv->msix[TSI721_VECT_DMA0_DONE + | ||
603 | bdma_chan->id].vector, (void *)bdma_chan); | ||
604 | free_irq(priv->msix[TSI721_VECT_DMA0_INT + | ||
605 | bdma_chan->id].vector, (void *)bdma_chan); | ||
606 | } | ||
607 | #endif /* CONFIG_PCI_MSI */ | ||
608 | |||
609 | tsi721_bdma_ch_free(bdma_chan); | ||
610 | kfree(bdma_chan->tx_desc); | ||
611 | } | ||
612 | |||
613 | static | ||
614 | enum dma_status tsi721_tx_status(struct dma_chan *dchan, dma_cookie_t cookie, | ||
615 | struct dma_tx_state *txstate) | ||
616 | { | ||
617 | struct tsi721_bdma_chan *bdma_chan = to_tsi721_chan(dchan); | ||
618 | dma_cookie_t last_used; | ||
619 | dma_cookie_t last_completed; | ||
620 | int ret; | ||
621 | |||
622 | spin_lock_bh(&bdma_chan->lock); | ||
623 | last_completed = bdma_chan->completed_cookie; | ||
624 | last_used = dchan->cookie; | ||
625 | spin_unlock_bh(&bdma_chan->lock); | ||
626 | |||
627 | ret = dma_async_is_complete(cookie, last_completed, last_used); | ||
628 | |||
629 | dma_set_tx_state(txstate, last_completed, last_used, 0); | ||
630 | |||
631 | dev_dbg(dchan->device->dev, | ||
632 | "%s: exit, ret: %d, last_completed: %d, last_used: %d\n", | ||
633 | __func__, ret, last_completed, last_used); | ||
634 | |||
635 | return ret; | ||
636 | } | ||
637 | |||
638 | static void tsi721_issue_pending(struct dma_chan *dchan) | ||
639 | { | ||
640 | struct tsi721_bdma_chan *bdma_chan = to_tsi721_chan(dchan); | ||
641 | |||
642 | dev_dbg(dchan->device->dev, "%s: Entry\n", __func__); | ||
643 | |||
644 | if (tsi721_dma_is_idle(bdma_chan)) { | ||
645 | spin_lock_bh(&bdma_chan->lock); | ||
646 | tsi721_advance_work(bdma_chan); | ||
647 | spin_unlock_bh(&bdma_chan->lock); | ||
648 | } else | ||
649 | dev_dbg(dchan->device->dev, | ||
650 | "%s: DMA channel still busy\n", __func__); | ||
651 | } | ||
652 | |||
653 | static | ||
654 | struct dma_async_tx_descriptor *tsi721_prep_rio_sg(struct dma_chan *dchan, | ||
655 | struct scatterlist *sgl, unsigned int sg_len, | ||
656 | enum dma_transfer_direction dir, unsigned long flags, | ||
657 | void *tinfo) | ||
658 | { | ||
659 | struct tsi721_bdma_chan *bdma_chan = to_tsi721_chan(dchan); | ||
660 | struct tsi721_tx_desc *desc = NULL; | ||
661 | struct tsi721_tx_desc *first = NULL; | ||
662 | struct scatterlist *sg; | ||
663 | struct rio_dma_ext *rext = tinfo; | ||
664 | u64 rio_addr = rext->rio_addr; /* limited to 64-bit rio_addr for now */ | ||
665 | unsigned int i; | ||
666 | u32 sys_size = dma_to_mport(dchan->device)->sys_size; | ||
667 | enum dma_rtype rtype; | ||
668 | |||
669 | if (!sgl || !sg_len) { | ||
670 | dev_err(dchan->device->dev, "%s: No SG list\n", __func__); | ||
671 | return NULL; | ||
672 | } | ||
673 | |||
674 | if (dir == DMA_DEV_TO_MEM) | ||
675 | rtype = NREAD; | ||
676 | else if (dir == DMA_MEM_TO_DEV) { | ||
677 | switch (rext->wr_type) { | ||
678 | case RDW_ALL_NWRITE: | ||
679 | rtype = ALL_NWRITE; | ||
680 | break; | ||
681 | case RDW_ALL_NWRITE_R: | ||
682 | rtype = ALL_NWRITE_R; | ||
683 | break; | ||
684 | case RDW_LAST_NWRITE_R: | ||
685 | default: | ||
686 | rtype = LAST_NWRITE_R; | ||
687 | break; | ||
688 | } | ||
689 | } else { | ||
690 | dev_err(dchan->device->dev, | ||
691 | "%s: Unsupported DMA direction option\n", __func__); | ||
692 | return NULL; | ||
693 | } | ||
694 | |||
695 | for_each_sg(sgl, sg, sg_len, i) { | ||
696 | int err; | ||
697 | |||
698 | dev_dbg(dchan->device->dev, "%s: sg #%d\n", __func__, i); | ||
699 | desc = tsi721_desc_get(bdma_chan); | ||
700 | if (!desc) { | ||
701 | dev_err(dchan->device->dev, | ||
702 | "Not enough descriptors available\n"); | ||
703 | goto err_desc_get; | ||
704 | } | ||
705 | |||
706 | if (sg_is_last(sg)) | ||
707 | desc->interrupt = (flags & DMA_PREP_INTERRUPT) != 0; | ||
708 | else | ||
709 | desc->interrupt = false; | ||
710 | |||
711 | desc->destid = rext->destid; | ||
712 | desc->rio_addr = rio_addr; | ||
713 | desc->rio_addr_u = 0; | ||
714 | |||
715 | err = tsi721_fill_desc(bdma_chan, desc, sg, rtype, sys_size); | ||
716 | if (err) { | ||
717 | dev_err(dchan->device->dev, | ||
718 | "Failed to build desc: %d\n", err); | ||
719 | goto err_desc_get; | ||
720 | } | ||
721 | |||
722 | rio_addr += sg_dma_len(sg); | ||
723 | |||
724 | if (!first) | ||
725 | first = desc; | ||
726 | else | ||
727 | list_add_tail(&desc->desc_node, &first->tx_list); | ||
728 | } | ||
729 | |||
730 | first->txd.cookie = -EBUSY; | ||
731 | desc->txd.flags = flags; | ||
732 | |||
733 | return &first->txd; | ||
734 | |||
735 | err_desc_get: | ||
736 | tsi721_desc_put(bdma_chan, first); | ||
737 | return NULL; | ||
738 | } | ||
739 | |||
740 | static int tsi721_device_control(struct dma_chan *dchan, enum dma_ctrl_cmd cmd, | ||
741 | unsigned long arg) | ||
742 | { | ||
743 | struct tsi721_bdma_chan *bdma_chan = to_tsi721_chan(dchan); | ||
744 | struct tsi721_tx_desc *desc, *_d; | ||
745 | LIST_HEAD(list); | ||
746 | |||
747 | dev_dbg(dchan->device->dev, "%s: Entry\n", __func__); | ||
748 | |||
749 | if (cmd != DMA_TERMINATE_ALL) | ||
750 | return -ENXIO; | ||
751 | |||
752 | spin_lock_bh(&bdma_chan->lock); | ||
753 | |||
754 | /* make sure to stop the transfer */ | ||
755 | iowrite32(TSI721_DMAC_CTL_SUSP, bdma_chan->regs + TSI721_DMAC_CTL); | ||
756 | |||
757 | list_splice_init(&bdma_chan->active_list, &list); | ||
758 | list_splice_init(&bdma_chan->queue, &list); | ||
759 | |||
760 | list_for_each_entry_safe(desc, _d, &list, desc_node) | ||
761 | tsi721_dma_chain_complete(bdma_chan, desc); | ||
762 | |||
763 | spin_unlock_bh(&bdma_chan->lock); | ||
764 | |||
765 | return 0; | ||
766 | } | ||
767 | |||
768 | int __devinit tsi721_register_dma(struct tsi721_device *priv) | ||
769 | { | ||
770 | int i; | ||
771 | int nr_channels = TSI721_DMA_MAXCH; | ||
772 | int err; | ||
773 | struct rio_mport *mport = priv->mport; | ||
774 | |||
775 | mport->dma.dev = &priv->pdev->dev; | ||
776 | mport->dma.chancnt = nr_channels; | ||
777 | |||
778 | INIT_LIST_HEAD(&mport->dma.channels); | ||
779 | |||
780 | for (i = 0; i < nr_channels; i++) { | ||
781 | struct tsi721_bdma_chan *bdma_chan = &priv->bdma[i]; | ||
782 | |||
783 | if (i == TSI721_DMACH_MAINT) | ||
784 | continue; | ||
785 | |||
786 | bdma_chan->bd_num = 64; | ||
787 | bdma_chan->regs = priv->regs + TSI721_DMAC_BASE(i); | ||
788 | |||
789 | bdma_chan->dchan.device = &mport->dma; | ||
790 | bdma_chan->dchan.cookie = 1; | ||
791 | bdma_chan->dchan.chan_id = i; | ||
792 | bdma_chan->id = i; | ||
793 | |||
794 | spin_lock_init(&bdma_chan->lock); | ||
795 | |||
796 | INIT_LIST_HEAD(&bdma_chan->active_list); | ||
797 | INIT_LIST_HEAD(&bdma_chan->queue); | ||
798 | INIT_LIST_HEAD(&bdma_chan->free_list); | ||
799 | |||
800 | tasklet_init(&bdma_chan->tasklet, tsi721_dma_tasklet, | ||
801 | (unsigned long)bdma_chan); | ||
802 | tasklet_disable(&bdma_chan->tasklet); | ||
803 | list_add_tail(&bdma_chan->dchan.device_node, | ||
804 | &mport->dma.channels); | ||
805 | } | ||
806 | |||
807 | dma_cap_zero(mport->dma.cap_mask); | ||
808 | dma_cap_set(DMA_PRIVATE, mport->dma.cap_mask); | ||
809 | dma_cap_set(DMA_SLAVE, mport->dma.cap_mask); | ||
810 | |||
811 | mport->dma.device_alloc_chan_resources = tsi721_alloc_chan_resources; | ||
812 | mport->dma.device_free_chan_resources = tsi721_free_chan_resources; | ||
813 | mport->dma.device_tx_status = tsi721_tx_status; | ||
814 | mport->dma.device_issue_pending = tsi721_issue_pending; | ||
815 | mport->dma.device_prep_slave_sg = tsi721_prep_rio_sg; | ||
816 | mport->dma.device_control = tsi721_device_control; | ||
817 | |||
818 | err = dma_async_device_register(&mport->dma); | ||
819 | if (err) | ||
820 | dev_err(&priv->pdev->dev, "Failed to register DMA device\n"); | ||
821 | |||
822 | return err; | ||
823 | } | ||
diff --git a/drivers/rapidio/rio.c b/drivers/rapidio/rio.c index 86c9a091a2ff..c40665a4fa33 100644 --- a/drivers/rapidio/rio.c +++ b/drivers/rapidio/rio.c | |||
@@ -1121,6 +1121,87 @@ int rio_std_route_clr_table(struct rio_mport *mport, u16 destid, u8 hopcount, | |||
1121 | return 0; | 1121 | return 0; |
1122 | } | 1122 | } |
1123 | 1123 | ||
1124 | #ifdef CONFIG_RAPIDIO_DMA_ENGINE | ||
1125 | |||
1126 | static bool rio_chan_filter(struct dma_chan *chan, void *arg) | ||
1127 | { | ||
1128 | struct rio_dev *rdev = arg; | ||
1129 | |||
1130 | /* Check that DMA device belongs to the right MPORT */ | ||
1131 | return (rdev->net->hport == | ||
1132 | container_of(chan->device, struct rio_mport, dma)); | ||
1133 | } | ||
1134 | |||
1135 | /** | ||
1136 | * rio_request_dma - request RapidIO capable DMA channel that supports | ||
1137 | * specified target RapidIO device. | ||
1138 | * @rdev: RIO device control structure | ||
1139 | * | ||
1140 | * Returns pointer to allocated DMA channel or NULL if failed. | ||
1141 | */ | ||
1142 | struct dma_chan *rio_request_dma(struct rio_dev *rdev) | ||
1143 | { | ||
1144 | dma_cap_mask_t mask; | ||
1145 | struct dma_chan *dchan; | ||
1146 | |||
1147 | dma_cap_zero(mask); | ||
1148 | dma_cap_set(DMA_SLAVE, mask); | ||
1149 | dchan = dma_request_channel(mask, rio_chan_filter, rdev); | ||
1150 | |||
1151 | return dchan; | ||
1152 | } | ||
1153 | EXPORT_SYMBOL_GPL(rio_request_dma); | ||
1154 | |||
1155 | /** | ||
1156 | * rio_release_dma - release specified DMA channel | ||
1157 | * @dchan: DMA channel to release | ||
1158 | */ | ||
1159 | void rio_release_dma(struct dma_chan *dchan) | ||
1160 | { | ||
1161 | dma_release_channel(dchan); | ||
1162 | } | ||
1163 | EXPORT_SYMBOL_GPL(rio_release_dma); | ||
1164 | |||
1165 | /** | ||
1166 | * rio_dma_prep_slave_sg - RapidIO specific wrapper | ||
1167 | * for device_prep_slave_sg callback defined by DMAENGINE. | ||
1168 | * @rdev: RIO device control structure | ||
1169 | * @dchan: DMA channel to configure | ||
1170 | * @data: RIO specific data descriptor | ||
1171 | * @direction: DMA data transfer direction (TO or FROM the device) | ||
1172 | * @flags: dmaengine defined flags | ||
1173 | * | ||
1174 | * Initializes RapidIO capable DMA channel for the specified data transfer. | ||
1175 | * Uses DMA channel private extension to pass information related to remote | ||
1176 | * target RIO device. | ||
1177 | * Returns pointer to DMA transaction descriptor or NULL if failed. | ||
1178 | */ | ||
1179 | struct dma_async_tx_descriptor *rio_dma_prep_slave_sg(struct rio_dev *rdev, | ||
1180 | struct dma_chan *dchan, struct rio_dma_data *data, | ||
1181 | enum dma_transfer_direction direction, unsigned long flags) | ||
1182 | { | ||
1183 | struct dma_async_tx_descriptor *txd = NULL; | ||
1184 | struct rio_dma_ext rio_ext; | ||
1185 | |||
1186 | if (dchan->device->device_prep_slave_sg == NULL) { | ||
1187 | pr_err("%s: prep_rio_sg == NULL\n", __func__); | ||
1188 | return NULL; | ||
1189 | } | ||
1190 | |||
1191 | rio_ext.destid = rdev->destid; | ||
1192 | rio_ext.rio_addr_u = data->rio_addr_u; | ||
1193 | rio_ext.rio_addr = data->rio_addr; | ||
1194 | rio_ext.wr_type = data->wr_type; | ||
1195 | |||
1196 | txd = dmaengine_prep_rio_sg(dchan, data->sg, data->sg_len, | ||
1197 | direction, flags, &rio_ext); | ||
1198 | |||
1199 | return txd; | ||
1200 | } | ||
1201 | EXPORT_SYMBOL_GPL(rio_dma_prep_slave_sg); | ||
1202 | |||
1203 | #endif /* CONFIG_RAPIDIO_DMA_ENGINE */ | ||
1204 | |||
1124 | static void rio_fixup_device(struct rio_dev *dev) | 1205 | static void rio_fixup_device(struct rio_dev *dev) |
1125 | { | 1206 | { |
1126 | } | 1207 | } |
@@ -1446,13 +1446,13 @@ static ssize_t aio_setup_vectored_rw(int type, struct kiocb *kiocb, bool compat) | |||
1446 | ret = compat_rw_copy_check_uvector(type, | 1446 | ret = compat_rw_copy_check_uvector(type, |
1447 | (struct compat_iovec __user *)kiocb->ki_buf, | 1447 | (struct compat_iovec __user *)kiocb->ki_buf, |
1448 | kiocb->ki_nbytes, 1, &kiocb->ki_inline_vec, | 1448 | kiocb->ki_nbytes, 1, &kiocb->ki_inline_vec, |
1449 | &kiocb->ki_iovec, 1); | 1449 | &kiocb->ki_iovec); |
1450 | else | 1450 | else |
1451 | #endif | 1451 | #endif |
1452 | ret = rw_copy_check_uvector(type, | 1452 | ret = rw_copy_check_uvector(type, |
1453 | (struct iovec __user *)kiocb->ki_buf, | 1453 | (struct iovec __user *)kiocb->ki_buf, |
1454 | kiocb->ki_nbytes, 1, &kiocb->ki_inline_vec, | 1454 | kiocb->ki_nbytes, 1, &kiocb->ki_inline_vec, |
1455 | &kiocb->ki_iovec, 1); | 1455 | &kiocb->ki_iovec); |
1456 | if (ret < 0) | 1456 | if (ret < 0) |
1457 | goto out; | 1457 | goto out; |
1458 | 1458 | ||
diff --git a/fs/ceph/snap.c b/fs/ceph/snap.c index f04c0961f993..e5206fc76562 100644 --- a/fs/ceph/snap.c +++ b/fs/ceph/snap.c | |||
@@ -331,7 +331,7 @@ static int build_snap_context(struct ceph_snap_realm *realm) | |||
331 | 331 | ||
332 | /* alloc new snap context */ | 332 | /* alloc new snap context */ |
333 | err = -ENOMEM; | 333 | err = -ENOMEM; |
334 | if (num > (ULONG_MAX - sizeof(*snapc)) / sizeof(u64)) | 334 | if (num > (SIZE_MAX - sizeof(*snapc)) / sizeof(u64)) |
335 | goto fail; | 335 | goto fail; |
336 | snapc = kzalloc(sizeof(*snapc) + num*sizeof(u64), GFP_NOFS); | 336 | snapc = kzalloc(sizeof(*snapc) + num*sizeof(u64), GFP_NOFS); |
337 | if (!snapc) | 337 | if (!snapc) |
diff --git a/fs/compat.c b/fs/compat.c index 0781e619a62a..6556a9ce8a28 100644 --- a/fs/compat.c +++ b/fs/compat.c | |||
@@ -532,7 +532,7 @@ out: | |||
532 | ssize_t compat_rw_copy_check_uvector(int type, | 532 | ssize_t compat_rw_copy_check_uvector(int type, |
533 | const struct compat_iovec __user *uvector, unsigned long nr_segs, | 533 | const struct compat_iovec __user *uvector, unsigned long nr_segs, |
534 | unsigned long fast_segs, struct iovec *fast_pointer, | 534 | unsigned long fast_segs, struct iovec *fast_pointer, |
535 | struct iovec **ret_pointer, int check_access) | 535 | struct iovec **ret_pointer) |
536 | { | 536 | { |
537 | compat_ssize_t tot_len; | 537 | compat_ssize_t tot_len; |
538 | struct iovec *iov = *ret_pointer = fast_pointer; | 538 | struct iovec *iov = *ret_pointer = fast_pointer; |
@@ -579,7 +579,7 @@ ssize_t compat_rw_copy_check_uvector(int type, | |||
579 | } | 579 | } |
580 | if (len < 0) /* size_t not fitting in compat_ssize_t .. */ | 580 | if (len < 0) /* size_t not fitting in compat_ssize_t .. */ |
581 | goto out; | 581 | goto out; |
582 | if (check_access && | 582 | if (type >= 0 && |
583 | !access_ok(vrfy_dir(type), compat_ptr(buf), len)) { | 583 | !access_ok(vrfy_dir(type), compat_ptr(buf), len)) { |
584 | ret = -EFAULT; | 584 | ret = -EFAULT; |
585 | goto out; | 585 | goto out; |
@@ -1094,7 +1094,7 @@ static ssize_t compat_do_readv_writev(int type, struct file *file, | |||
1094 | goto out; | 1094 | goto out; |
1095 | 1095 | ||
1096 | tot_len = compat_rw_copy_check_uvector(type, uvector, nr_segs, | 1096 | tot_len = compat_rw_copy_check_uvector(type, uvector, nr_segs, |
1097 | UIO_FASTIOV, iovstack, &iov, 1); | 1097 | UIO_FASTIOV, iovstack, &iov); |
1098 | if (tot_len == 0) { | 1098 | if (tot_len == 0) { |
1099 | ret = 0; | 1099 | ret = 0; |
1100 | goto out; | 1100 | goto out; |
diff --git a/fs/eventfd.c b/fs/eventfd.c index dba15fecf23e..d81b9f654086 100644 --- a/fs/eventfd.c +++ b/fs/eventfd.c | |||
@@ -46,20 +46,16 @@ struct eventfd_ctx { | |||
46 | * value, and we signal this as overflow condition by returining a POLLERR | 46 | * value, and we signal this as overflow condition by returining a POLLERR |
47 | * to poll(2). | 47 | * to poll(2). |
48 | * | 48 | * |
49 | * Returns @n in case of success, a non-negative number lower than @n in case | 49 | * Returns the amount by which the counter was incrememnted. This will be less |
50 | * of overflow, or the following error codes: | 50 | * than @n if the counter has overflowed. |
51 | * | ||
52 | * -EINVAL : The value of @n is negative. | ||
53 | */ | 51 | */ |
54 | int eventfd_signal(struct eventfd_ctx *ctx, int n) | 52 | __u64 eventfd_signal(struct eventfd_ctx *ctx, __u64 n) |
55 | { | 53 | { |
56 | unsigned long flags; | 54 | unsigned long flags; |
57 | 55 | ||
58 | if (n < 0) | ||
59 | return -EINVAL; | ||
60 | spin_lock_irqsave(&ctx->wqh.lock, flags); | 56 | spin_lock_irqsave(&ctx->wqh.lock, flags); |
61 | if (ULLONG_MAX - ctx->count < n) | 57 | if (ULLONG_MAX - ctx->count < n) |
62 | n = (int) (ULLONG_MAX - ctx->count); | 58 | n = ULLONG_MAX - ctx->count; |
63 | ctx->count += n; | 59 | ctx->count += n; |
64 | if (waitqueue_active(&ctx->wqh)) | 60 | if (waitqueue_active(&ctx->wqh)) |
65 | wake_up_locked_poll(&ctx->wqh, POLLIN); | 61 | wake_up_locked_poll(&ctx->wqh, POLLIN); |
diff --git a/fs/fat/dir.c b/fs/fat/dir.c index aca191bd5f8f..6eaa28c98ad1 100644 --- a/fs/fat/dir.c +++ b/fs/fat/dir.c | |||
@@ -98,8 +98,8 @@ next: | |||
98 | 98 | ||
99 | *bh = sb_bread(sb, phys); | 99 | *bh = sb_bread(sb, phys); |
100 | if (*bh == NULL) { | 100 | if (*bh == NULL) { |
101 | fat_msg(sb, KERN_ERR, "Directory bread(block %llu) failed", | 101 | fat_msg_ratelimit(sb, KERN_ERR, |
102 | (llu)phys); | 102 | "Directory bread(block %llu) failed", (llu)phys); |
103 | /* skip this block */ | 103 | /* skip this block */ |
104 | *pos = (iblock + 1) << sb->s_blocksize_bits; | 104 | *pos = (iblock + 1) << sb->s_blocksize_bits; |
105 | goto next; | 105 | goto next; |
diff --git a/fs/fat/fat.h b/fs/fat/fat.h index 66994f316e18..fc35c5c69136 100644 --- a/fs/fat/fat.h +++ b/fs/fat/fat.h | |||
@@ -82,6 +82,7 @@ struct msdos_sb_info { | |||
82 | int fatent_shift; | 82 | int fatent_shift; |
83 | struct fatent_operations *fatent_ops; | 83 | struct fatent_operations *fatent_ops; |
84 | struct inode *fat_inode; | 84 | struct inode *fat_inode; |
85 | struct inode *fsinfo_inode; | ||
85 | 86 | ||
86 | struct ratelimit_state ratelimit; | 87 | struct ratelimit_state ratelimit; |
87 | 88 | ||
@@ -334,6 +335,11 @@ void __fat_fs_error(struct super_block *sb, int report, const char *fmt, ...); | |||
334 | __fat_fs_error(sb, __ratelimit(&MSDOS_SB(sb)->ratelimit), fmt , ## args) | 335 | __fat_fs_error(sb, __ratelimit(&MSDOS_SB(sb)->ratelimit), fmt , ## args) |
335 | __printf(3, 4) __cold | 336 | __printf(3, 4) __cold |
336 | void fat_msg(struct super_block *sb, const char *level, const char *fmt, ...); | 337 | void fat_msg(struct super_block *sb, const char *level, const char *fmt, ...); |
338 | #define fat_msg_ratelimit(sb, level, fmt, args...) \ | ||
339 | do { \ | ||
340 | if (__ratelimit(&MSDOS_SB(sb)->ratelimit)) \ | ||
341 | fat_msg(sb, level, fmt, ## args); \ | ||
342 | } while (0) | ||
337 | extern int fat_clusters_flush(struct super_block *sb); | 343 | extern int fat_clusters_flush(struct super_block *sb); |
338 | extern int fat_chain_add(struct inode *inode, int new_dclus, int nr_cluster); | 344 | extern int fat_chain_add(struct inode *inode, int new_dclus, int nr_cluster); |
339 | extern void fat_time_fat2unix(struct msdos_sb_info *sbi, struct timespec *ts, | 345 | extern void fat_time_fat2unix(struct msdos_sb_info *sbi, struct timespec *ts, |
diff --git a/fs/fat/fatent.c b/fs/fat/fatent.c index 2e81ac0df7e2..31f08ab62c56 100644 --- a/fs/fat/fatent.c +++ b/fs/fat/fatent.c | |||
@@ -308,6 +308,16 @@ void fat_ent_access_init(struct super_block *sb) | |||
308 | } | 308 | } |
309 | } | 309 | } |
310 | 310 | ||
311 | static void mark_fsinfo_dirty(struct super_block *sb) | ||
312 | { | ||
313 | struct msdos_sb_info *sbi = MSDOS_SB(sb); | ||
314 | |||
315 | if (sb->s_flags & MS_RDONLY || sbi->fat_bits != 32) | ||
316 | return; | ||
317 | |||
318 | __mark_inode_dirty(sbi->fsinfo_inode, I_DIRTY_SYNC); | ||
319 | } | ||
320 | |||
311 | static inline int fat_ent_update_ptr(struct super_block *sb, | 321 | static inline int fat_ent_update_ptr(struct super_block *sb, |
312 | struct fat_entry *fatent, | 322 | struct fat_entry *fatent, |
313 | int offset, sector_t blocknr) | 323 | int offset, sector_t blocknr) |
@@ -498,7 +508,6 @@ int fat_alloc_clusters(struct inode *inode, int *cluster, int nr_cluster) | |||
498 | sbi->prev_free = entry; | 508 | sbi->prev_free = entry; |
499 | if (sbi->free_clusters != -1) | 509 | if (sbi->free_clusters != -1) |
500 | sbi->free_clusters--; | 510 | sbi->free_clusters--; |
501 | sb->s_dirt = 1; | ||
502 | 511 | ||
503 | cluster[idx_clus] = entry; | 512 | cluster[idx_clus] = entry; |
504 | idx_clus++; | 513 | idx_clus++; |
@@ -520,11 +529,11 @@ int fat_alloc_clusters(struct inode *inode, int *cluster, int nr_cluster) | |||
520 | /* Couldn't allocate the free entries */ | 529 | /* Couldn't allocate the free entries */ |
521 | sbi->free_clusters = 0; | 530 | sbi->free_clusters = 0; |
522 | sbi->free_clus_valid = 1; | 531 | sbi->free_clus_valid = 1; |
523 | sb->s_dirt = 1; | ||
524 | err = -ENOSPC; | 532 | err = -ENOSPC; |
525 | 533 | ||
526 | out: | 534 | out: |
527 | unlock_fat(sbi); | 535 | unlock_fat(sbi); |
536 | mark_fsinfo_dirty(sb); | ||
528 | fatent_brelse(&fatent); | 537 | fatent_brelse(&fatent); |
529 | if (!err) { | 538 | if (!err) { |
530 | if (inode_needs_sync(inode)) | 539 | if (inode_needs_sync(inode)) |
@@ -549,7 +558,7 @@ int fat_free_clusters(struct inode *inode, int cluster) | |||
549 | struct fat_entry fatent; | 558 | struct fat_entry fatent; |
550 | struct buffer_head *bhs[MAX_BUF_PER_PAGE]; | 559 | struct buffer_head *bhs[MAX_BUF_PER_PAGE]; |
551 | int i, err, nr_bhs; | 560 | int i, err, nr_bhs; |
552 | int first_cl = cluster; | 561 | int first_cl = cluster, dirty_fsinfo = 0; |
553 | 562 | ||
554 | nr_bhs = 0; | 563 | nr_bhs = 0; |
555 | fatent_init(&fatent); | 564 | fatent_init(&fatent); |
@@ -587,7 +596,7 @@ int fat_free_clusters(struct inode *inode, int cluster) | |||
587 | ops->ent_put(&fatent, FAT_ENT_FREE); | 596 | ops->ent_put(&fatent, FAT_ENT_FREE); |
588 | if (sbi->free_clusters != -1) { | 597 | if (sbi->free_clusters != -1) { |
589 | sbi->free_clusters++; | 598 | sbi->free_clusters++; |
590 | sb->s_dirt = 1; | 599 | dirty_fsinfo = 1; |
591 | } | 600 | } |
592 | 601 | ||
593 | if (nr_bhs + fatent.nr_bhs > MAX_BUF_PER_PAGE) { | 602 | if (nr_bhs + fatent.nr_bhs > MAX_BUF_PER_PAGE) { |
@@ -617,6 +626,8 @@ error: | |||
617 | for (i = 0; i < nr_bhs; i++) | 626 | for (i = 0; i < nr_bhs; i++) |
618 | brelse(bhs[i]); | 627 | brelse(bhs[i]); |
619 | unlock_fat(sbi); | 628 | unlock_fat(sbi); |
629 | if (dirty_fsinfo) | ||
630 | mark_fsinfo_dirty(sb); | ||
620 | 631 | ||
621 | return err; | 632 | return err; |
622 | } | 633 | } |
@@ -677,7 +688,7 @@ int fat_count_free_clusters(struct super_block *sb) | |||
677 | } | 688 | } |
678 | sbi->free_clusters = free; | 689 | sbi->free_clusters = free; |
679 | sbi->free_clus_valid = 1; | 690 | sbi->free_clus_valid = 1; |
680 | sb->s_dirt = 1; | 691 | mark_fsinfo_dirty(sb); |
681 | fatent_brelse(&fatent); | 692 | fatent_brelse(&fatent); |
682 | out: | 693 | out: |
683 | unlock_fat(sbi); | 694 | unlock_fat(sbi); |
diff --git a/fs/fat/inode.c b/fs/fat/inode.c index b3d290c1b513..c2973ea5df9a 100644 --- a/fs/fat/inode.c +++ b/fs/fat/inode.c | |||
@@ -459,37 +459,11 @@ static void fat_evict_inode(struct inode *inode) | |||
459 | fat_detach(inode); | 459 | fat_detach(inode); |
460 | } | 460 | } |
461 | 461 | ||
462 | static void fat_write_super(struct super_block *sb) | ||
463 | { | ||
464 | lock_super(sb); | ||
465 | sb->s_dirt = 0; | ||
466 | |||
467 | if (!(sb->s_flags & MS_RDONLY)) | ||
468 | fat_clusters_flush(sb); | ||
469 | unlock_super(sb); | ||
470 | } | ||
471 | |||
472 | static int fat_sync_fs(struct super_block *sb, int wait) | ||
473 | { | ||
474 | int err = 0; | ||
475 | |||
476 | if (sb->s_dirt) { | ||
477 | lock_super(sb); | ||
478 | sb->s_dirt = 0; | ||
479 | err = fat_clusters_flush(sb); | ||
480 | unlock_super(sb); | ||
481 | } | ||
482 | |||
483 | return err; | ||
484 | } | ||
485 | |||
486 | static void fat_put_super(struct super_block *sb) | 462 | static void fat_put_super(struct super_block *sb) |
487 | { | 463 | { |
488 | struct msdos_sb_info *sbi = MSDOS_SB(sb); | 464 | struct msdos_sb_info *sbi = MSDOS_SB(sb); |
489 | 465 | ||
490 | if (sb->s_dirt) | 466 | iput(sbi->fsinfo_inode); |
491 | fat_write_super(sb); | ||
492 | |||
493 | iput(sbi->fat_inode); | 467 | iput(sbi->fat_inode); |
494 | 468 | ||
495 | unload_nls(sbi->nls_disk); | 469 | unload_nls(sbi->nls_disk); |
@@ -661,7 +635,18 @@ retry: | |||
661 | 635 | ||
662 | static int fat_write_inode(struct inode *inode, struct writeback_control *wbc) | 636 | static int fat_write_inode(struct inode *inode, struct writeback_control *wbc) |
663 | { | 637 | { |
664 | return __fat_write_inode(inode, wbc->sync_mode == WB_SYNC_ALL); | 638 | int err; |
639 | |||
640 | if (inode->i_ino == MSDOS_FSINFO_INO) { | ||
641 | struct super_block *sb = inode->i_sb; | ||
642 | |||
643 | lock_super(sb); | ||
644 | err = fat_clusters_flush(sb); | ||
645 | unlock_super(sb); | ||
646 | } else | ||
647 | err = __fat_write_inode(inode, wbc->sync_mode == WB_SYNC_ALL); | ||
648 | |||
649 | return err; | ||
665 | } | 650 | } |
666 | 651 | ||
667 | int fat_sync_inode(struct inode *inode) | 652 | int fat_sync_inode(struct inode *inode) |
@@ -678,8 +663,6 @@ static const struct super_operations fat_sops = { | |||
678 | .write_inode = fat_write_inode, | 663 | .write_inode = fat_write_inode, |
679 | .evict_inode = fat_evict_inode, | 664 | .evict_inode = fat_evict_inode, |
680 | .put_super = fat_put_super, | 665 | .put_super = fat_put_super, |
681 | .write_super = fat_write_super, | ||
682 | .sync_fs = fat_sync_fs, | ||
683 | .statfs = fat_statfs, | 666 | .statfs = fat_statfs, |
684 | .remount_fs = fat_remount, | 667 | .remount_fs = fat_remount, |
685 | 668 | ||
@@ -1244,6 +1227,7 @@ int fat_fill_super(struct super_block *sb, void *data, int silent, int isvfat, | |||
1244 | void (*setup)(struct super_block *)) | 1227 | void (*setup)(struct super_block *)) |
1245 | { | 1228 | { |
1246 | struct inode *root_inode = NULL, *fat_inode = NULL; | 1229 | struct inode *root_inode = NULL, *fat_inode = NULL; |
1230 | struct inode *fsinfo_inode = NULL; | ||
1247 | struct buffer_head *bh; | 1231 | struct buffer_head *bh; |
1248 | struct fat_boot_sector *b; | 1232 | struct fat_boot_sector *b; |
1249 | struct msdos_sb_info *sbi; | 1233 | struct msdos_sb_info *sbi; |
@@ -1490,6 +1474,14 @@ int fat_fill_super(struct super_block *sb, void *data, int silent, int isvfat, | |||
1490 | goto out_fail; | 1474 | goto out_fail; |
1491 | MSDOS_I(fat_inode)->i_pos = 0; | 1475 | MSDOS_I(fat_inode)->i_pos = 0; |
1492 | sbi->fat_inode = fat_inode; | 1476 | sbi->fat_inode = fat_inode; |
1477 | |||
1478 | fsinfo_inode = new_inode(sb); | ||
1479 | if (!fsinfo_inode) | ||
1480 | goto out_fail; | ||
1481 | fsinfo_inode->i_ino = MSDOS_FSINFO_INO; | ||
1482 | sbi->fsinfo_inode = fsinfo_inode; | ||
1483 | insert_inode_hash(fsinfo_inode); | ||
1484 | |||
1493 | root_inode = new_inode(sb); | 1485 | root_inode = new_inode(sb); |
1494 | if (!root_inode) | 1486 | if (!root_inode) |
1495 | goto out_fail; | 1487 | goto out_fail; |
@@ -1516,6 +1508,8 @@ out_invalid: | |||
1516 | fat_msg(sb, KERN_INFO, "Can't find a valid FAT filesystem"); | 1508 | fat_msg(sb, KERN_INFO, "Can't find a valid FAT filesystem"); |
1517 | 1509 | ||
1518 | out_fail: | 1510 | out_fail: |
1511 | if (fsinfo_inode) | ||
1512 | iput(fsinfo_inode); | ||
1519 | if (fat_inode) | 1513 | if (fat_inode) |
1520 | iput(fat_inode); | 1514 | iput(fat_inode); |
1521 | unload_nls(sbi->nls_io); | 1515 | unload_nls(sbi->nls_io); |
diff --git a/fs/hpfs/buffer.c b/fs/hpfs/buffer.c index 9ecde27d1e29..f49d1498aa2e 100644 --- a/fs/hpfs/buffer.c +++ b/fs/hpfs/buffer.c | |||
@@ -156,7 +156,6 @@ void hpfs_brelse4(struct quad_buffer_head *qbh) | |||
156 | 156 | ||
157 | void hpfs_mark_4buffers_dirty(struct quad_buffer_head *qbh) | 157 | void hpfs_mark_4buffers_dirty(struct quad_buffer_head *qbh) |
158 | { | 158 | { |
159 | PRINTK(("hpfs_mark_4buffers_dirty\n")); | ||
160 | memcpy(qbh->bh[0]->b_data, qbh->data, 512); | 159 | memcpy(qbh->bh[0]->b_data, qbh->data, 512); |
161 | memcpy(qbh->bh[1]->b_data, qbh->data + 512, 512); | 160 | memcpy(qbh->bh[1]->b_data, qbh->data + 512, 512); |
162 | memcpy(qbh->bh[2]->b_data, qbh->data + 2 * 512, 512); | 161 | memcpy(qbh->bh[2]->b_data, qbh->data + 2 * 512, 512); |
diff --git a/fs/hpfs/hpfs_fn.h b/fs/hpfs/hpfs_fn.h index de946170ebb1..6d2d5008fa43 100644 --- a/fs/hpfs/hpfs_fn.h +++ b/fs/hpfs/hpfs_fn.h | |||
@@ -35,13 +35,6 @@ | |||
35 | 35 | ||
36 | #define CHKCOND(x,y) if (!(x)) printk y | 36 | #define CHKCOND(x,y) if (!(x)) printk y |
37 | 37 | ||
38 | #ifdef DBG | ||
39 | #define PRINTK(x) printk x | ||
40 | #else | ||
41 | #undef PRINTK | ||
42 | #define PRINTK(x) | ||
43 | #endif | ||
44 | |||
45 | struct hpfs_inode_info { | 38 | struct hpfs_inode_info { |
46 | loff_t mmu_private; | 39 | loff_t mmu_private; |
47 | ino_t i_parent_dir; /* (directories) gives fnode of parent dir */ | 40 | ino_t i_parent_dir; /* (directories) gives fnode of parent dir */ |
diff --git a/fs/nilfs2/file.c b/fs/nilfs2/file.c index 26601529dc17..62cebc8e1a1f 100644 --- a/fs/nilfs2/file.c +++ b/fs/nilfs2/file.c | |||
@@ -37,6 +37,7 @@ int nilfs_sync_file(struct file *file, loff_t start, loff_t end, int datasync) | |||
37 | * This function should be implemented when the writeback function | 37 | * This function should be implemented when the writeback function |
38 | * will be implemented. | 38 | * will be implemented. |
39 | */ | 39 | */ |
40 | struct the_nilfs *nilfs; | ||
40 | struct inode *inode = file->f_mapping->host; | 41 | struct inode *inode = file->f_mapping->host; |
41 | int err; | 42 | int err; |
42 | 43 | ||
@@ -45,18 +46,21 @@ int nilfs_sync_file(struct file *file, loff_t start, loff_t end, int datasync) | |||
45 | return err; | 46 | return err; |
46 | mutex_lock(&inode->i_mutex); | 47 | mutex_lock(&inode->i_mutex); |
47 | 48 | ||
48 | if (!nilfs_inode_dirty(inode)) { | 49 | if (nilfs_inode_dirty(inode)) { |
49 | mutex_unlock(&inode->i_mutex); | 50 | if (datasync) |
50 | return 0; | 51 | err = nilfs_construct_dsync_segment(inode->i_sb, inode, |
52 | 0, LLONG_MAX); | ||
53 | else | ||
54 | err = nilfs_construct_segment(inode->i_sb); | ||
51 | } | 55 | } |
52 | |||
53 | if (datasync) | ||
54 | err = nilfs_construct_dsync_segment(inode->i_sb, inode, 0, | ||
55 | LLONG_MAX); | ||
56 | else | ||
57 | err = nilfs_construct_segment(inode->i_sb); | ||
58 | |||
59 | mutex_unlock(&inode->i_mutex); | 56 | mutex_unlock(&inode->i_mutex); |
57 | |||
58 | nilfs = inode->i_sb->s_fs_info; | ||
59 | if (!err && nilfs_test_opt(nilfs, BARRIER)) { | ||
60 | err = blkdev_issue_flush(inode->i_sb->s_bdev, GFP_KERNEL, NULL); | ||
61 | if (err != -EIO) | ||
62 | err = 0; | ||
63 | } | ||
60 | return err; | 64 | return err; |
61 | } | 65 | } |
62 | 66 | ||
diff --git a/fs/nilfs2/ioctl.c b/fs/nilfs2/ioctl.c index 2a70fce70c65..06658caa18bd 100644 --- a/fs/nilfs2/ioctl.c +++ b/fs/nilfs2/ioctl.c | |||
@@ -692,8 +692,14 @@ static int nilfs_ioctl_sync(struct inode *inode, struct file *filp, | |||
692 | if (ret < 0) | 692 | if (ret < 0) |
693 | return ret; | 693 | return ret; |
694 | 694 | ||
695 | nilfs = inode->i_sb->s_fs_info; | ||
696 | if (nilfs_test_opt(nilfs, BARRIER)) { | ||
697 | ret = blkdev_issue_flush(inode->i_sb->s_bdev, GFP_KERNEL, NULL); | ||
698 | if (ret == -EIO) | ||
699 | return ret; | ||
700 | } | ||
701 | |||
695 | if (argp != NULL) { | 702 | if (argp != NULL) { |
696 | nilfs = inode->i_sb->s_fs_info; | ||
697 | down_read(&nilfs->ns_segctor_sem); | 703 | down_read(&nilfs->ns_segctor_sem); |
698 | cno = nilfs->ns_cno - 1; | 704 | cno = nilfs->ns_cno - 1; |
699 | up_read(&nilfs->ns_segctor_sem); | 705 | up_read(&nilfs->ns_segctor_sem); |
diff --git a/fs/nls/Kconfig b/fs/nls/Kconfig index a39edc41becc..b5eac98fd7bd 100644 --- a/fs/nls/Kconfig +++ b/fs/nls/Kconfig | |||
@@ -30,7 +30,7 @@ config NLS_DEFAULT | |||
30 | cp949, cp950, cp1251, cp1255, euc-jp, euc-kr, gb2312, iso8859-1, | 30 | cp949, cp950, cp1251, cp1255, euc-jp, euc-kr, gb2312, iso8859-1, |
31 | iso8859-2, iso8859-3, iso8859-4, iso8859-5, iso8859-6, iso8859-7, | 31 | iso8859-2, iso8859-3, iso8859-4, iso8859-5, iso8859-6, iso8859-7, |
32 | iso8859-8, iso8859-9, iso8859-13, iso8859-14, iso8859-15, | 32 | iso8859-8, iso8859-9, iso8859-13, iso8859-14, iso8859-15, |
33 | koi8-r, koi8-ru, koi8-u, sjis, tis-620, utf8. | 33 | koi8-r, koi8-ru, koi8-u, sjis, tis-620, macroman, utf8. |
34 | If you specify a wrong value, it will use the built-in NLS; | 34 | If you specify a wrong value, it will use the built-in NLS; |
35 | compatible with iso8859-1. | 35 | compatible with iso8859-1. |
36 | 36 | ||
@@ -452,6 +452,161 @@ config NLS_KOI8_U | |||
452 | input/output character sets. Say Y here for the preferred Ukrainian | 452 | input/output character sets. Say Y here for the preferred Ukrainian |
453 | (koi8-u) and Belarusian (koi8-ru) character sets. | 453 | (koi8-u) and Belarusian (koi8-ru) character sets. |
454 | 454 | ||
455 | config NLS_CODEPAGE_MACROMAN | ||
456 | tristate "Codepage macroman" | ||
457 | ---help--- | ||
458 | The Apple HFS file system family can deal with filenames in | ||
459 | native language character sets. These character sets are stored in | ||
460 | so-called MAC codepages. You need to include the appropriate | ||
461 | codepage if you want to be able to read/write these filenames on | ||
462 | Mac partitions correctly. This does apply to the filenames | ||
463 | only, not to the file contents. You can include several codepages; | ||
464 | say Y here if you want to include the Mac codepage that is used for | ||
465 | much of Europe -- United Kingdom, Germany, Spain, Italy, and [add | ||
466 | more countries here]. | ||
467 | |||
468 | If unsure, say Y. | ||
469 | |||
470 | config NLS_CODEPAGE_MACCELTIC | ||
471 | tristate "Codepage macceltic" | ||
472 | ---help--- | ||
473 | The Apple HFS file system family can deal with filenames in | ||
474 | native language character sets. These character sets are stored in | ||
475 | so-called MAC codepages. You need to include the appropriate | ||
476 | codepage if you want to be able to read/write these filenames on | ||
477 | Mac partitions correctly. This does apply to the filenames | ||
478 | only, not to the file contents. You can include several codepages; | ||
479 | say Y here if you want to include the Mac codepage that is used for | ||
480 | Celtic. | ||
481 | |||
482 | If unsure, say Y. | ||
483 | |||
484 | config NLS_CODEPAGE_MACCENTEURO | ||
485 | tristate "Codepage maccenteuro" | ||
486 | ---help--- | ||
487 | The Apple HFS file system family can deal with filenames in | ||
488 | native language character sets. These character sets are stored in | ||
489 | so-called MAC codepages. You need to include the appropriate | ||
490 | codepage if you want to be able to read/write these filenames on | ||
491 | Mac partitions correctly. This does apply to the filenames | ||
492 | only, not to the file contents. You can include several codepages; | ||
493 | say Y here if you want to include the Mac codepage that is used for | ||
494 | Central Europe. | ||
495 | |||
496 | If unsure, say Y. | ||
497 | |||
498 | config NLS_CODEPAGE_MACCROATIAN | ||
499 | tristate "Codepage maccroatian" | ||
500 | ---help--- | ||
501 | The Apple HFS file system family can deal with filenames in | ||
502 | native language character sets. These character sets are stored in | ||
503 | so-called MAC codepages. You need to include the appropriate | ||
504 | codepage if you want to be able to read/write these filenames on | ||
505 | Mac partitions correctly. This does apply to the filenames | ||
506 | only, not to the file contents. You can include several codepages; | ||
507 | say Y here if you want to include the Mac codepage that is used for | ||
508 | Croatian. | ||
509 | |||
510 | If unsure, say Y. | ||
511 | |||
512 | config NLS_CODEPAGE_MACCYRILLIC | ||
513 | tristate "Codepage maccyrillic" | ||
514 | ---help--- | ||
515 | The Apple HFS file system family can deal with filenames in | ||
516 | native language character sets. These character sets are stored in | ||
517 | so-called MAC codepages. You need to include the appropriate | ||
518 | codepage if you want to be able to read/write these filenames on | ||
519 | Mac partitions correctly. This does apply to the filenames | ||
520 | only, not to the file contents. You can include several codepages; | ||
521 | say Y here if you want to include the Mac codepage that is used for | ||
522 | Cyrillic. | ||
523 | |||
524 | If unsure, say Y. | ||
525 | |||
526 | config NLS_CODEPAGE_MACGAELIC | ||
527 | tristate "Codepage macgaelic" | ||
528 | ---help--- | ||
529 | The Apple HFS file system family can deal with filenames in | ||
530 | native language character sets. These character sets are stored in | ||
531 | so-called MAC codepages. You need to include the appropriate | ||
532 | codepage if you want to be able to read/write these filenames on | ||
533 | Mac partitions correctly. This does apply to the filenames | ||
534 | only, not to the file contents. You can include several codepages; | ||
535 | say Y here if you want to include the Mac codepage that is used for | ||
536 | Gaelic. | ||
537 | |||
538 | If unsure, say Y. | ||
539 | |||
540 | config NLS_CODEPAGE_MACGREEK | ||
541 | tristate "Codepage macgreek" | ||
542 | ---help--- | ||
543 | The Apple HFS file system family can deal with filenames in | ||
544 | native language character sets. These character sets are stored in | ||
545 | so-called MAC codepages. You need to include the appropriate | ||
546 | codepage if you want to be able to read/write these filenames on | ||
547 | Mac partitions correctly. This does apply to the filenames | ||
548 | only, not to the file contents. You can include several codepages; | ||
549 | say Y here if you want to include the Mac codepage that is used for | ||
550 | Greek. | ||
551 | |||
552 | If unsure, say Y. | ||
553 | |||
554 | config NLS_CODEPAGE_MACICELAND | ||
555 | tristate "Codepage maciceland" | ||
556 | ---help--- | ||
557 | The Apple HFS file system family can deal with filenames in | ||
558 | native language character sets. These character sets are stored in | ||
559 | so-called MAC codepages. You need to include the appropriate | ||
560 | codepage if you want to be able to read/write these filenames on | ||
561 | Mac partitions correctly. This does apply to the filenames | ||
562 | only, not to the file contents. You can include several codepages; | ||
563 | say Y here if you want to include the Mac codepage that is used for | ||
564 | Iceland. | ||
565 | |||
566 | If unsure, say Y. | ||
567 | |||
568 | config NLS_CODEPAGE_MACINUIT | ||
569 | tristate "Codepage macinuit" | ||
570 | ---help--- | ||
571 | The Apple HFS file system family can deal with filenames in | ||
572 | native language character sets. These character sets are stored in | ||
573 | so-called MAC codepages. You need to include the appropriate | ||
574 | codepage if you want to be able to read/write these filenames on | ||
575 | Mac partitions correctly. This does apply to the filenames | ||
576 | only, not to the file contents. You can include several codepages; | ||
577 | say Y here if you want to include the Mac codepage that is used for | ||
578 | Inuit. | ||
579 | |||
580 | If unsure, say Y. | ||
581 | |||
582 | config NLS_CODEPAGE_MACROMANIAN | ||
583 | tristate "Codepage macromanian" | ||
584 | ---help--- | ||
585 | The Apple HFS file system family can deal with filenames in | ||
586 | native language character sets. These character sets are stored in | ||
587 | so-called MAC codepages. You need to include the appropriate | ||
588 | codepage if you want to be able to read/write these filenames on | ||
589 | Mac partitions correctly. This does apply to the filenames | ||
590 | only, not to the file contents. You can include several codepages; | ||
591 | say Y here if you want to include the Mac codepage that is used for | ||
592 | Romanian. | ||
593 | |||
594 | If unsure, say Y. | ||
595 | |||
596 | config NLS_CODEPAGE_MACTURKISH | ||
597 | tristate "Codepage macturkish" | ||
598 | ---help--- | ||
599 | The Apple HFS file system family can deal with filenames in | ||
600 | native language character sets. These character sets are stored in | ||
601 | so-called MAC codepages. You need to include the appropriate | ||
602 | codepage if you want to be able to read/write these filenames on | ||
603 | Mac partitions correctly. This does apply to the filenames | ||
604 | only, not to the file contents. You can include several codepages; | ||
605 | say Y here if you want to include the Mac codepage that is used for | ||
606 | Turkish. | ||
607 | |||
608 | If unsure, say Y. | ||
609 | |||
455 | config NLS_UTF8 | 610 | config NLS_UTF8 |
456 | tristate "NLS UTF-8" | 611 | tristate "NLS UTF-8" |
457 | help | 612 | help |
diff --git a/fs/nls/Makefile b/fs/nls/Makefile index f499dd7c3905..b6b0550a7c80 100644 --- a/fs/nls/Makefile +++ b/fs/nls/Makefile | |||
@@ -2,6 +2,18 @@ | |||
2 | # Makefile for native language support | 2 | # Makefile for native language support |
3 | # | 3 | # |
4 | 4 | ||
5 | CONFIG_NLS_MACCELTIC=m | ||
6 | CONFIG_NLS_MACCENTEURO=m | ||
7 | CONFIG_NLS_MACCROATIAN=m | ||
8 | CONFIG_NLS_MACCYRILLIC=m | ||
9 | CONFIG_NLS_MACGAELIC=m | ||
10 | CONFIG_NLS_MACGREEK=m | ||
11 | CONFIG_NLS_MACICELAND=m | ||
12 | CONFIG_NLS_MACINUIT=m | ||
13 | CONFIG_NLS_MACROMANIAN=m | ||
14 | CONFIG_NLS_MACROMAN=m | ||
15 | CONFIG_NLS_MACTURKISH=m | ||
16 | |||
5 | obj-$(CONFIG_NLS) += nls_base.o | 17 | obj-$(CONFIG_NLS) += nls_base.o |
6 | 18 | ||
7 | obj-$(CONFIG_NLS_CODEPAGE_437) += nls_cp437.o | 19 | obj-$(CONFIG_NLS_CODEPAGE_437) += nls_cp437.o |
@@ -42,3 +54,14 @@ obj-$(CONFIG_NLS_ISO8859_15) += nls_iso8859-15.o | |||
42 | obj-$(CONFIG_NLS_KOI8_R) += nls_koi8-r.o | 54 | obj-$(CONFIG_NLS_KOI8_R) += nls_koi8-r.o |
43 | obj-$(CONFIG_NLS_KOI8_U) += nls_koi8-u.o nls_koi8-ru.o | 55 | obj-$(CONFIG_NLS_KOI8_U) += nls_koi8-u.o nls_koi8-ru.o |
44 | obj-$(CONFIG_NLS_UTF8) += nls_utf8.o | 56 | obj-$(CONFIG_NLS_UTF8) += nls_utf8.o |
57 | obj-$(CONFIG_NLS_MACCELTIC) += nls_macceltic.o | ||
58 | obj-$(CONFIG_NLS_MACCENTEURO) += nls_maccenteuro.o | ||
59 | obj-$(CONFIG_NLS_MACCROATIAN) += nls_maccroatian.o | ||
60 | obj-$(CONFIG_NLS_MACCYRILLIC) += nls_maccyrillic.o | ||
61 | obj-$(CONFIG_NLS_MACGAELIC) += nls_macgaelic.o | ||
62 | obj-$(CONFIG_NLS_MACGREEK) += nls_macgreek.o | ||
63 | obj-$(CONFIG_NLS_MACICELAND) += nls_maciceland.o | ||
64 | obj-$(CONFIG_NLS_MACINUIT) += nls_macinuit.o | ||
65 | obj-$(CONFIG_NLS_MACROMANIAN) += nls_macromanian.o | ||
66 | obj-$(CONFIG_NLS_MACROMAN) += nls_macroman.o | ||
67 | obj-$(CONFIG_NLS_MACTURKISH) += nls_macturkish.o | ||
diff --git a/fs/nls/nls_macceltic.c b/fs/nls/nls_macceltic.c new file mode 100644 index 000000000000..95ac5b41ad1c --- /dev/null +++ b/fs/nls/nls_macceltic.c | |||
@@ -0,0 +1,602 @@ | |||
1 | /* | ||
2 | * linux/fs/nls/nls_macceltic.c | ||
3 | * | ||
4 | * Charset macceltic translation tables. | ||
5 | * Generated automatically from the Unicode and charset | ||
6 | * tables from the Unicode Organization (www.unicode.org). | ||
7 | * The Unicode to charset table has only exact mappings. | ||
8 | */ | ||
9 | |||
10 | /* | ||
11 | * COPYRIGHT AND PERMISSION NOTICE | ||
12 | * | ||
13 | * Copyright 1991-2012 Unicode, Inc. All rights reserved. Distributed under | ||
14 | * the Terms of Use in http://www.unicode.org/copyright.html. | ||
15 | * | ||
16 | * Permission is hereby granted, free of charge, to any person obtaining a | ||
17 | * copy of the Unicode data files and any associated documentation (the "Data | ||
18 | * Files") or Unicode software and any associated documentation (the | ||
19 | * "Software") to deal in the Data Files or Software without restriction, | ||
20 | * including without limitation the rights to use, copy, modify, merge, | ||
21 | * publish, distribute, and/or sell copies of the Data Files or Software, and | ||
22 | * to permit persons to whom the Data Files or Software are furnished to do | ||
23 | * so, provided that (a) the above copyright notice(s) and this permission | ||
24 | * notice appear with all copies of the Data Files or Software, (b) both the | ||
25 | * above copyright notice(s) and this permission notice appear in associated | ||
26 | * documentation, and (c) there is clear notice in each modified Data File or | ||
27 | * in the Software as well as in the documentation associated with the Data | ||
28 | * File(s) or Software that the data or software has been modified. | ||
29 | * | ||
30 | * THE DATA FILES AND SOFTWARE ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY | ||
31 | * KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF | ||
32 | * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF | ||
33 | * THIRD PARTY RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS | ||
34 | * INCLUDED IN THIS NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT | ||
35 | * OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF | ||
36 | * USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR | ||
37 | * OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR | ||
38 | * PERFORMANCE OF THE DATA FILES OR SOFTWARE. | ||
39 | * | ||
40 | * Except as contained in this notice, the name of a copyright holder shall | ||
41 | * not be used in advertising or otherwise to promote the sale, use or other | ||
42 | * dealings in these Data Files or Software without prior written | ||
43 | * authorization of the copyright holder. | ||
44 | */ | ||
45 | |||
46 | #include <linux/module.h> | ||
47 | #include <linux/kernel.h> | ||
48 | #include <linux/string.h> | ||
49 | #include <linux/nls.h> | ||
50 | #include <linux/errno.h> | ||
51 | |||
52 | static const wchar_t charset2uni[256] = { | ||
53 | /* 0x00 */ | ||
54 | 0x0000, 0x0001, 0x0002, 0x0003, | ||
55 | 0x0004, 0x0005, 0x0006, 0x0007, | ||
56 | 0x0008, 0x0009, 0x000a, 0x000b, | ||
57 | 0x000c, 0x000d, 0x000e, 0x000f, | ||
58 | /* 0x10 */ | ||
59 | 0x0010, 0x0011, 0x0012, 0x0013, | ||
60 | 0x0014, 0x0015, 0x0016, 0x0017, | ||
61 | 0x0018, 0x0019, 0x001a, 0x001b, | ||
62 | 0x001c, 0x001d, 0x001e, 0x001f, | ||
63 | /* 0x20 */ | ||
64 | 0x0020, 0x0021, 0x0022, 0x0023, | ||
65 | 0x0024, 0x0025, 0x0026, 0x0027, | ||
66 | 0x0028, 0x0029, 0x002a, 0x002b, | ||
67 | 0x002c, 0x002d, 0x002e, 0x002f, | ||
68 | /* 0x30 */ | ||
69 | 0x0030, 0x0031, 0x0032, 0x0033, | ||
70 | 0x0034, 0x0035, 0x0036, 0x0037, | ||
71 | 0x0038, 0x0039, 0x003a, 0x003b, | ||
72 | 0x003c, 0x003d, 0x003e, 0x003f, | ||
73 | /* 0x40 */ | ||
74 | 0x0040, 0x0041, 0x0042, 0x0043, | ||
75 | 0x0044, 0x0045, 0x0046, 0x0047, | ||
76 | 0x0048, 0x0049, 0x004a, 0x004b, | ||
77 | 0x004c, 0x004d, 0x004e, 0x004f, | ||
78 | /* 0x50 */ | ||
79 | 0x0050, 0x0051, 0x0052, 0x0053, | ||
80 | 0x0054, 0x0055, 0x0056, 0x0057, | ||
81 | 0x0058, 0x0059, 0x005a, 0x005b, | ||
82 | 0x005c, 0x005d, 0x005e, 0x005f, | ||
83 | /* 0x60 */ | ||
84 | 0x0060, 0x0061, 0x0062, 0x0063, | ||
85 | 0x0064, 0x0065, 0x0066, 0x0067, | ||
86 | 0x0068, 0x0069, 0x006a, 0x006b, | ||
87 | 0x006c, 0x006d, 0x006e, 0x006f, | ||
88 | /* 0x70 */ | ||
89 | 0x0070, 0x0071, 0x0072, 0x0073, | ||
90 | 0x0074, 0x0075, 0x0076, 0x0077, | ||
91 | 0x0078, 0x0079, 0x007a, 0x007b, | ||
92 | 0x007c, 0x007d, 0x007e, 0x007f, | ||
93 | /* 0x80 */ | ||
94 | 0x00c4, 0x00c5, 0x00c7, 0x00c9, | ||
95 | 0x00d1, 0x00d6, 0x00dc, 0x00e1, | ||
96 | 0x00e0, 0x00e2, 0x00e4, 0x00e3, | ||
97 | 0x00e5, 0x00e7, 0x00e9, 0x00e8, | ||
98 | /* 0x90 */ | ||
99 | 0x00ea, 0x00eb, 0x00ed, 0x00ec, | ||
100 | 0x00ee, 0x00ef, 0x00f1, 0x00f3, | ||
101 | 0x00f2, 0x00f4, 0x00f6, 0x00f5, | ||
102 | 0x00fa, 0x00f9, 0x00fb, 0x00fc, | ||
103 | /* 0xa0 */ | ||
104 | 0x2020, 0x00b0, 0x00a2, 0x00a3, | ||
105 | 0x00a7, 0x2022, 0x00b6, 0x00df, | ||
106 | 0x00ae, 0x00a9, 0x2122, 0x00b4, | ||
107 | 0x00a8, 0x2260, 0x00c6, 0x00d8, | ||
108 | /* 0xb0 */ | ||
109 | 0x221e, 0x00b1, 0x2264, 0x2265, | ||
110 | 0x00a5, 0x00b5, 0x2202, 0x2211, | ||
111 | 0x220f, 0x03c0, 0x222b, 0x00aa, | ||
112 | 0x00ba, 0x03a9, 0x00e6, 0x00f8, | ||
113 | /* 0xc0 */ | ||
114 | 0x00bf, 0x00a1, 0x00ac, 0x221a, | ||
115 | 0x0192, 0x2248, 0x2206, 0x00ab, | ||
116 | 0x00bb, 0x2026, 0x00a0, 0x00c0, | ||
117 | 0x00c3, 0x00d5, 0x0152, 0x0153, | ||
118 | /* 0xd0 */ | ||
119 | 0x2013, 0x2014, 0x201c, 0x201d, | ||
120 | 0x2018, 0x2019, 0x00f7, 0x25ca, | ||
121 | 0x00ff, 0x0178, 0x2044, 0x20ac, | ||
122 | 0x2039, 0x203a, 0x0176, 0x0177, | ||
123 | /* 0xe0 */ | ||
124 | 0x2021, 0x00b7, 0x1ef2, 0x1ef3, | ||
125 | 0x2030, 0x00c2, 0x00ca, 0x00c1, | ||
126 | 0x00cb, 0x00c8, 0x00cd, 0x00ce, | ||
127 | 0x00cf, 0x00cc, 0x00d3, 0x00d4, | ||
128 | /* 0xf0 */ | ||
129 | 0x2663, 0x00d2, 0x00da, 0x00db, | ||
130 | 0x00d9, 0x0131, 0x00dd, 0x00fd, | ||
131 | 0x0174, 0x0175, 0x1e84, 0x1e85, | ||
132 | 0x1e80, 0x1e81, 0x1e82, 0x1e83, | ||
133 | }; | ||
134 | |||
135 | static const unsigned char page00[256] = { | ||
136 | 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, /* 0x00-0x07 */ | ||
137 | 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, /* 0x08-0x0f */ | ||
138 | 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, /* 0x10-0x17 */ | ||
139 | 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, /* 0x18-0x1f */ | ||
140 | 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, /* 0x20-0x27 */ | ||
141 | 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, /* 0x28-0x2f */ | ||
142 | 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, /* 0x30-0x37 */ | ||
143 | 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, /* 0x38-0x3f */ | ||
144 | 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, /* 0x40-0x47 */ | ||
145 | 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, /* 0x48-0x4f */ | ||
146 | 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, /* 0x50-0x57 */ | ||
147 | 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f, /* 0x58-0x5f */ | ||
148 | 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, /* 0x60-0x67 */ | ||
149 | 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, /* 0x68-0x6f */ | ||
150 | 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, /* 0x70-0x77 */ | ||
151 | 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f, /* 0x78-0x7f */ | ||
152 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x80-0x87 */ | ||
153 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x88-0x8f */ | ||
154 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x90-0x97 */ | ||
155 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x98-0x9f */ | ||
156 | 0xca, 0xc1, 0xa2, 0xa3, 0x00, 0xb4, 0x00, 0xa4, /* 0xa0-0xa7 */ | ||
157 | 0xac, 0xa9, 0xbb, 0xc7, 0xc2, 0x00, 0xa8, 0x00, /* 0xa8-0xaf */ | ||
158 | 0xa1, 0xb1, 0x00, 0x00, 0xab, 0xb5, 0xa6, 0xe1, /* 0xb0-0xb7 */ | ||
159 | 0x00, 0x00, 0xbc, 0xc8, 0x00, 0x00, 0x00, 0xc0, /* 0xb8-0xbf */ | ||
160 | 0xcb, 0xe7, 0xe5, 0xcc, 0x80, 0x81, 0xae, 0x82, /* 0xc0-0xc7 */ | ||
161 | 0xe9, 0x83, 0xe6, 0xe8, 0xed, 0xea, 0xeb, 0xec, /* 0xc8-0xcf */ | ||
162 | 0x00, 0x84, 0xf1, 0xee, 0xef, 0xcd, 0x85, 0x00, /* 0xd0-0xd7 */ | ||
163 | 0xaf, 0xf4, 0xf2, 0xf3, 0x86, 0xf6, 0x00, 0xa7, /* 0xd8-0xdf */ | ||
164 | 0x88, 0x87, 0x89, 0x8b, 0x8a, 0x8c, 0xbe, 0x8d, /* 0xe0-0xe7 */ | ||
165 | 0x8f, 0x8e, 0x90, 0x91, 0x93, 0x92, 0x94, 0x95, /* 0xe8-0xef */ | ||
166 | 0x00, 0x96, 0x98, 0x97, 0x99, 0x9b, 0x9a, 0xd6, /* 0xf0-0xf7 */ | ||
167 | 0xbf, 0x9d, 0x9c, 0x9e, 0x9f, 0xf7, 0x00, 0xd8, /* 0xf8-0xff */ | ||
168 | }; | ||
169 | |||
170 | static const unsigned char page01[256] = { | ||
171 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x00-0x07 */ | ||
172 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x08-0x0f */ | ||
173 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10-0x17 */ | ||
174 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x18-0x1f */ | ||
175 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x20-0x27 */ | ||
176 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x28-0x2f */ | ||
177 | 0x00, 0xf5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x30-0x37 */ | ||
178 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x38-0x3f */ | ||
179 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x40-0x47 */ | ||
180 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x48-0x4f */ | ||
181 | 0x00, 0x00, 0xce, 0xcf, 0x00, 0x00, 0x00, 0x00, /* 0x50-0x57 */ | ||
182 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x58-0x5f */ | ||
183 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x60-0x67 */ | ||
184 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x68-0x6f */ | ||
185 | 0x00, 0x00, 0x00, 0x00, 0xf8, 0xf9, 0xde, 0xdf, /* 0x70-0x77 */ | ||
186 | 0xd9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x78-0x7f */ | ||
187 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x80-0x87 */ | ||
188 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x88-0x8f */ | ||
189 | 0x00, 0x00, 0xc4, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x90-0x97 */ | ||
190 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x98-0x9f */ | ||
191 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa0-0xa7 */ | ||
192 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa8-0xaf */ | ||
193 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xb0-0xb7 */ | ||
194 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xb8-0xbf */ | ||
195 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc0-0xc7 */ | ||
196 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc8-0xcf */ | ||
197 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd0-0xd7 */ | ||
198 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd8-0xdf */ | ||
199 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe0-0xe7 */ | ||
200 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe8-0xef */ | ||
201 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xf0-0xf7 */ | ||
202 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xf8-0xff */ | ||
203 | }; | ||
204 | |||
205 | static const unsigned char page03[256] = { | ||
206 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x00-0x07 */ | ||
207 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x08-0x0f */ | ||
208 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10-0x17 */ | ||
209 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x18-0x1f */ | ||
210 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x20-0x27 */ | ||
211 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x28-0x2f */ | ||
212 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x30-0x37 */ | ||
213 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x38-0x3f */ | ||
214 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x40-0x47 */ | ||
215 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x48-0x4f */ | ||
216 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x50-0x57 */ | ||
217 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x58-0x5f */ | ||
218 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x60-0x67 */ | ||
219 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x68-0x6f */ | ||
220 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */ | ||
221 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x78-0x7f */ | ||
222 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x80-0x87 */ | ||
223 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x88-0x8f */ | ||
224 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x90-0x97 */ | ||
225 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x98-0x9f */ | ||
226 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa0-0xa7 */ | ||
227 | 0x00, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa8-0xaf */ | ||
228 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xb0-0xb7 */ | ||
229 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xb8-0xbf */ | ||
230 | 0xb9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc0-0xc7 */ | ||
231 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc8-0xcf */ | ||
232 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd0-0xd7 */ | ||
233 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd8-0xdf */ | ||
234 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe0-0xe7 */ | ||
235 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe8-0xef */ | ||
236 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xf0-0xf7 */ | ||
237 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xf8-0xff */ | ||
238 | }; | ||
239 | |||
240 | static const unsigned char page1e[256] = { | ||
241 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x00-0x07 */ | ||
242 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x08-0x0f */ | ||
243 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10-0x17 */ | ||
244 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x18-0x1f */ | ||
245 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x20-0x27 */ | ||
246 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x28-0x2f */ | ||
247 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x30-0x37 */ | ||
248 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x38-0x3f */ | ||
249 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x40-0x47 */ | ||
250 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x48-0x4f */ | ||
251 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x50-0x57 */ | ||
252 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x58-0x5f */ | ||
253 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x60-0x67 */ | ||
254 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x68-0x6f */ | ||
255 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */ | ||
256 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x78-0x7f */ | ||
257 | 0xfc, 0xfd, 0xfe, 0xff, 0xfa, 0xfb, 0x00, 0x00, /* 0x80-0x87 */ | ||
258 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x88-0x8f */ | ||
259 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x90-0x97 */ | ||
260 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x98-0x9f */ | ||
261 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa0-0xa7 */ | ||
262 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa8-0xaf */ | ||
263 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xb0-0xb7 */ | ||
264 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xb8-0xbf */ | ||
265 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc0-0xc7 */ | ||
266 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc8-0xcf */ | ||
267 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd0-0xd7 */ | ||
268 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd8-0xdf */ | ||
269 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe0-0xe7 */ | ||
270 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe8-0xef */ | ||
271 | 0x00, 0x00, 0xe2, 0xe3, 0x00, 0x00, 0x00, 0x00, /* 0xf0-0xf7 */ | ||
272 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xf8-0xff */ | ||
273 | }; | ||
274 | |||
275 | static const unsigned char page20[256] = { | ||
276 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x00-0x07 */ | ||
277 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x08-0x0f */ | ||
278 | 0x00, 0x00, 0x00, 0xd0, 0xd1, 0x00, 0x00, 0x00, /* 0x10-0x17 */ | ||
279 | 0xd4, 0xd5, 0x00, 0x00, 0xd2, 0xd3, 0x00, 0x00, /* 0x18-0x1f */ | ||
280 | 0xa0, 0xe0, 0xa5, 0x00, 0x00, 0x00, 0xc9, 0x00, /* 0x20-0x27 */ | ||
281 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x28-0x2f */ | ||
282 | 0xe4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x30-0x37 */ | ||
283 | 0x00, 0xdc, 0xdd, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x38-0x3f */ | ||
284 | 0x00, 0x00, 0x00, 0x00, 0xda, 0x00, 0x00, 0x00, /* 0x40-0x47 */ | ||
285 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x48-0x4f */ | ||
286 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x50-0x57 */ | ||
287 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x58-0x5f */ | ||
288 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x60-0x67 */ | ||
289 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x68-0x6f */ | ||
290 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */ | ||
291 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x78-0x7f */ | ||
292 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x80-0x87 */ | ||
293 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x88-0x8f */ | ||
294 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x90-0x97 */ | ||
295 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x98-0x9f */ | ||
296 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa0-0xa7 */ | ||
297 | 0x00, 0x00, 0x00, 0x00, 0xdb, 0x00, 0x00, 0x00, /* 0xa8-0xaf */ | ||
298 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xb0-0xb7 */ | ||
299 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xb8-0xbf */ | ||
300 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc0-0xc7 */ | ||
301 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc8-0xcf */ | ||
302 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd0-0xd7 */ | ||
303 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd8-0xdf */ | ||
304 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe0-0xe7 */ | ||
305 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe8-0xef */ | ||
306 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xf0-0xf7 */ | ||
307 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xf8-0xff */ | ||
308 | }; | ||
309 | |||
310 | static const unsigned char page21[256] = { | ||
311 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x00-0x07 */ | ||
312 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x08-0x0f */ | ||
313 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10-0x17 */ | ||
314 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x18-0x1f */ | ||
315 | 0x00, 0x00, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x20-0x27 */ | ||
316 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x28-0x2f */ | ||
317 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x30-0x37 */ | ||
318 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x38-0x3f */ | ||
319 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x40-0x47 */ | ||
320 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x48-0x4f */ | ||
321 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x50-0x57 */ | ||
322 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x58-0x5f */ | ||
323 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x60-0x67 */ | ||
324 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x68-0x6f */ | ||
325 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */ | ||
326 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x78-0x7f */ | ||
327 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x80-0x87 */ | ||
328 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x88-0x8f */ | ||
329 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x90-0x97 */ | ||
330 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x98-0x9f */ | ||
331 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa0-0xa7 */ | ||
332 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa8-0xaf */ | ||
333 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xb0-0xb7 */ | ||
334 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xb8-0xbf */ | ||
335 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc0-0xc7 */ | ||
336 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc8-0xcf */ | ||
337 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd0-0xd7 */ | ||
338 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd8-0xdf */ | ||
339 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe0-0xe7 */ | ||
340 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe8-0xef */ | ||
341 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xf0-0xf7 */ | ||
342 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xf8-0xff */ | ||
343 | }; | ||
344 | |||
345 | static const unsigned char page22[256] = { | ||
346 | 0x00, 0x00, 0xb6, 0x00, 0x00, 0x00, 0xc6, 0x00, /* 0x00-0x07 */ | ||
347 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb8, /* 0x08-0x0f */ | ||
348 | 0x00, 0xb7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10-0x17 */ | ||
349 | 0x00, 0x00, 0xc3, 0x00, 0x00, 0x00, 0xb0, 0x00, /* 0x18-0x1f */ | ||
350 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x20-0x27 */ | ||
351 | 0x00, 0x00, 0x00, 0xba, 0x00, 0x00, 0x00, 0x00, /* 0x28-0x2f */ | ||
352 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x30-0x37 */ | ||
353 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x38-0x3f */ | ||
354 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x40-0x47 */ | ||
355 | 0xc5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x48-0x4f */ | ||
356 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x50-0x57 */ | ||
357 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x58-0x5f */ | ||
358 | 0xad, 0x00, 0x00, 0x00, 0xb2, 0xb3, 0x00, 0x00, /* 0x60-0x67 */ | ||
359 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x68-0x6f */ | ||
360 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */ | ||
361 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x78-0x7f */ | ||
362 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x80-0x87 */ | ||
363 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x88-0x8f */ | ||
364 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x90-0x97 */ | ||
365 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x98-0x9f */ | ||
366 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa0-0xa7 */ | ||
367 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa8-0xaf */ | ||
368 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xb0-0xb7 */ | ||
369 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xb8-0xbf */ | ||
370 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc0-0xc7 */ | ||
371 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc8-0xcf */ | ||
372 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd0-0xd7 */ | ||
373 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd8-0xdf */ | ||
374 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe0-0xe7 */ | ||
375 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe8-0xef */ | ||
376 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xf0-0xf7 */ | ||
377 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xf8-0xff */ | ||
378 | }; | ||
379 | |||
380 | static const unsigned char page25[256] = { | ||
381 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x00-0x07 */ | ||
382 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x08-0x0f */ | ||
383 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10-0x17 */ | ||
384 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x18-0x1f */ | ||
385 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x20-0x27 */ | ||
386 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x28-0x2f */ | ||
387 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x30-0x37 */ | ||
388 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x38-0x3f */ | ||
389 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x40-0x47 */ | ||
390 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x48-0x4f */ | ||
391 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x50-0x57 */ | ||
392 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x58-0x5f */ | ||
393 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x60-0x67 */ | ||
394 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x68-0x6f */ | ||
395 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */ | ||
396 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x78-0x7f */ | ||
397 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x80-0x87 */ | ||
398 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x88-0x8f */ | ||
399 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x90-0x97 */ | ||
400 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x98-0x9f */ | ||
401 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa0-0xa7 */ | ||
402 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa8-0xaf */ | ||
403 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xb0-0xb7 */ | ||
404 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xb8-0xbf */ | ||
405 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc0-0xc7 */ | ||
406 | 0x00, 0x00, 0xd7, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc8-0xcf */ | ||
407 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd0-0xd7 */ | ||
408 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd8-0xdf */ | ||
409 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe0-0xe7 */ | ||
410 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe8-0xef */ | ||
411 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xf0-0xf7 */ | ||
412 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xf8-0xff */ | ||
413 | }; | ||
414 | |||
415 | static const unsigned char page26[256] = { | ||
416 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x00-0x07 */ | ||
417 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x08-0x0f */ | ||
418 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10-0x17 */ | ||
419 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x18-0x1f */ | ||
420 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x20-0x27 */ | ||
421 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x28-0x2f */ | ||
422 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x30-0x37 */ | ||
423 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x38-0x3f */ | ||
424 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x40-0x47 */ | ||
425 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x48-0x4f */ | ||
426 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x50-0x57 */ | ||
427 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x58-0x5f */ | ||
428 | 0x00, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x00, /* 0x60-0x67 */ | ||
429 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x68-0x6f */ | ||
430 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */ | ||
431 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x78-0x7f */ | ||
432 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x80-0x87 */ | ||
433 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x88-0x8f */ | ||
434 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x90-0x97 */ | ||
435 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x98-0x9f */ | ||
436 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa0-0xa7 */ | ||
437 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa8-0xaf */ | ||
438 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xb0-0xb7 */ | ||
439 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xb8-0xbf */ | ||
440 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc0-0xc7 */ | ||
441 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc8-0xcf */ | ||
442 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd0-0xd7 */ | ||
443 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd8-0xdf */ | ||
444 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe0-0xe7 */ | ||
445 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe8-0xef */ | ||
446 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xf0-0xf7 */ | ||
447 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xf8-0xff */ | ||
448 | }; | ||
449 | |||
450 | static const unsigned char *const page_uni2charset[256] = { | ||
451 | page00, page01, NULL, page03, NULL, NULL, NULL, NULL, | ||
452 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
453 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
454 | NULL, NULL, NULL, NULL, NULL, NULL, page1e, NULL, | ||
455 | page20, page21, page22, NULL, NULL, page25, page26, NULL, | ||
456 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
457 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
458 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
459 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
460 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
461 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
462 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
463 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
464 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
465 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
466 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
467 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
468 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
469 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
470 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
471 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
472 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
473 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
474 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
475 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
476 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
477 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
478 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
479 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
480 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
481 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
482 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
483 | }; | ||
484 | |||
485 | static const unsigned char charset2lower[256] = { | ||
486 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x00-0x07 */ | ||
487 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x08-0x0f */ | ||
488 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x10-0x17 */ | ||
489 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x18-0x1f */ | ||
490 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x20-0x27 */ | ||
491 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x28-0x2f */ | ||
492 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x30-0x37 */ | ||
493 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x38-0x3f */ | ||
494 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x40-0x47 */ | ||
495 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x48-0x4f */ | ||
496 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x50-0x57 */ | ||
497 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x58-0x5f */ | ||
498 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x60-0x67 */ | ||
499 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x68-0x6f */ | ||
500 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x70-0x77 */ | ||
501 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x78-0x7f */ | ||
502 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x80-0x87 */ | ||
503 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x88-0x8f */ | ||
504 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x90-0x97 */ | ||
505 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x98-0x9f */ | ||
506 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0xa0-0xa7 */ | ||
507 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0xa8-0xaf */ | ||
508 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0xb0-0xb7 */ | ||
509 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0xb8-0xbf */ | ||
510 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0xc0-0xc7 */ | ||
511 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0xc8-0xcf */ | ||
512 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0xd0-0xd7 */ | ||
513 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0xd8-0xdf */ | ||
514 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0xe0-0xe7 */ | ||
515 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0xe8-0xef */ | ||
516 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0xf0-0xf7 */ | ||
517 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0xf8-0xff */ | ||
518 | }; | ||
519 | |||
520 | static const unsigned char charset2upper[256] = { | ||
521 | 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, /* 0x00-0x07 */ | ||
522 | 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, /* 0x08-0x0f */ | ||
523 | 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, /* 0x10-0x17 */ | ||
524 | 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, /* 0x18-0x1f */ | ||
525 | 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, /* 0x20-0x27 */ | ||
526 | 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, /* 0x28-0x2f */ | ||
527 | 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, /* 0x30-0x37 */ | ||
528 | 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, /* 0x38-0x3f */ | ||
529 | 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, /* 0x40-0x47 */ | ||
530 | 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, /* 0x48-0x4f */ | ||
531 | 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, /* 0x50-0x57 */ | ||
532 | 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, /* 0x58-0x5f */ | ||
533 | 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, /* 0x60-0x67 */ | ||
534 | 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, /* 0x68-0x6f */ | ||
535 | 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, /* 0x70-0x77 */ | ||
536 | 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, /* 0x78-0x7f */ | ||
537 | 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, /* 0x80-0x87 */ | ||
538 | 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, /* 0x88-0x8f */ | ||
539 | 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, /* 0x90-0x97 */ | ||
540 | 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, /* 0x98-0x9f */ | ||
541 | 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, /* 0xa0-0xa7 */ | ||
542 | 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, /* 0xa8-0xaf */ | ||
543 | 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, /* 0xb0-0xb7 */ | ||
544 | 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, /* 0xb8-0xbf */ | ||
545 | 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, /* 0xc0-0xc7 */ | ||
546 | 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, /* 0xc8-0xcf */ | ||
547 | 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, /* 0xd0-0xd7 */ | ||
548 | 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, /* 0xd8-0xdf */ | ||
549 | 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, /* 0xe0-0xe7 */ | ||
550 | 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, /* 0xe8-0xef */ | ||
551 | 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, /* 0xf0-0xf7 */ | ||
552 | 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, /* 0xf8-0xff */ | ||
553 | }; | ||
554 | |||
555 | static int uni2char(wchar_t uni, unsigned char *out, int boundlen) | ||
556 | { | ||
557 | const unsigned char *uni2charset; | ||
558 | unsigned char cl = uni & 0x00ff; | ||
559 | unsigned char ch = (uni & 0xff00) >> 8; | ||
560 | |||
561 | if (boundlen <= 0) | ||
562 | return -ENAMETOOLONG; | ||
563 | |||
564 | uni2charset = page_uni2charset[ch]; | ||
565 | if (uni2charset && uni2charset[cl]) | ||
566 | out[0] = uni2charset[cl]; | ||
567 | else | ||
568 | return -EINVAL; | ||
569 | return 1; | ||
570 | } | ||
571 | |||
572 | static int char2uni(const unsigned char *rawstring, int boundlen, wchar_t *uni) | ||
573 | { | ||
574 | *uni = charset2uni[*rawstring]; | ||
575 | if (*uni == 0x0000) | ||
576 | return -EINVAL; | ||
577 | return 1; | ||
578 | } | ||
579 | |||
580 | static struct nls_table table = { | ||
581 | .charset = "macceltic", | ||
582 | .uni2char = uni2char, | ||
583 | .char2uni = char2uni, | ||
584 | .charset2lower = charset2lower, | ||
585 | .charset2upper = charset2upper, | ||
586 | .owner = THIS_MODULE, | ||
587 | }; | ||
588 | |||
589 | static int __init init_nls_macceltic(void) | ||
590 | { | ||
591 | return register_nls(&table); | ||
592 | } | ||
593 | |||
594 | static void __exit exit_nls_macceltic(void) | ||
595 | { | ||
596 | unregister_nls(&table); | ||
597 | } | ||
598 | |||
599 | module_init(init_nls_macceltic) | ||
600 | module_exit(exit_nls_macceltic) | ||
601 | |||
602 | MODULE_LICENSE("Dual BSD/GPL"); | ||
diff --git a/fs/nls/nls_maccenteuro.c b/fs/nls/nls_maccenteuro.c new file mode 100644 index 000000000000..ce0d57ef39f6 --- /dev/null +++ b/fs/nls/nls_maccenteuro.c | |||
@@ -0,0 +1,532 @@ | |||
1 | /* | ||
2 | * linux/fs/nls/nls_maccenteuro.c | ||
3 | * | ||
4 | * Charset maccenteuro translation tables. | ||
5 | * Generated automatically from the Unicode and charset | ||
6 | * tables from the Unicode Organization (www.unicode.org). | ||
7 | * The Unicode to charset table has only exact mappings. | ||
8 | */ | ||
9 | |||
10 | /* | ||
11 | * COPYRIGHT AND PERMISSION NOTICE | ||
12 | * | ||
13 | * Copyright 1991-2012 Unicode, Inc. All rights reserved. Distributed under | ||
14 | * the Terms of Use in http://www.unicode.org/copyright.html. | ||
15 | * | ||
16 | * Permission is hereby granted, free of charge, to any person obtaining a | ||
17 | * copy of the Unicode data files and any associated documentation (the "Data | ||
18 | * Files") or Unicode software and any associated documentation (the | ||
19 | * "Software") to deal in the Data Files or Software without restriction, | ||
20 | * including without limitation the rights to use, copy, modify, merge, | ||
21 | * publish, distribute, and/or sell copies of the Data Files or Software, and | ||
22 | * to permit persons to whom the Data Files or Software are furnished to do | ||
23 | * so, provided that (a) the above copyright notice(s) and this permission | ||
24 | * notice appear with all copies of the Data Files or Software, (b) both the | ||
25 | * above copyright notice(s) and this permission notice appear in associated | ||
26 | * documentation, and (c) there is clear notice in each modified Data File or | ||
27 | * in the Software as well as in the documentation associated with the Data | ||
28 | * File(s) or Software that the data or software has been modified. | ||
29 | * | ||
30 | * THE DATA FILES AND SOFTWARE ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY | ||
31 | * KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF | ||
32 | * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF | ||
33 | * THIRD PARTY RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS | ||
34 | * INCLUDED IN THIS NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT | ||
35 | * OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF | ||
36 | * USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR | ||
37 | * OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR | ||
38 | * PERFORMANCE OF THE DATA FILES OR SOFTWARE. | ||
39 | * | ||
40 | * Except as contained in this notice, the name of a copyright holder shall | ||
41 | * not be used in advertising or otherwise to promote the sale, use or other | ||
42 | * dealings in these Data Files or Software without prior written | ||
43 | * authorization of the copyright holder. | ||
44 | */ | ||
45 | |||
46 | #include <linux/module.h> | ||
47 | #include <linux/kernel.h> | ||
48 | #include <linux/string.h> | ||
49 | #include <linux/nls.h> | ||
50 | #include <linux/errno.h> | ||
51 | |||
52 | static const wchar_t charset2uni[256] = { | ||
53 | /* 0x00 */ | ||
54 | 0x0000, 0x0001, 0x0002, 0x0003, | ||
55 | 0x0004, 0x0005, 0x0006, 0x0007, | ||
56 | 0x0008, 0x0009, 0x000a, 0x000b, | ||
57 | 0x000c, 0x000d, 0x000e, 0x000f, | ||
58 | /* 0x10 */ | ||
59 | 0x0010, 0x0011, 0x0012, 0x0013, | ||
60 | 0x0014, 0x0015, 0x0016, 0x0017, | ||
61 | 0x0018, 0x0019, 0x001a, 0x001b, | ||
62 | 0x001c, 0x001d, 0x001e, 0x001f, | ||
63 | /* 0x20 */ | ||
64 | 0x0020, 0x0021, 0x0022, 0x0023, | ||
65 | 0x0024, 0x0025, 0x0026, 0x0027, | ||
66 | 0x0028, 0x0029, 0x002a, 0x002b, | ||
67 | 0x002c, 0x002d, 0x002e, 0x002f, | ||
68 | /* 0x30 */ | ||
69 | 0x0030, 0x0031, 0x0032, 0x0033, | ||
70 | 0x0034, 0x0035, 0x0036, 0x0037, | ||
71 | 0x0038, 0x0039, 0x003a, 0x003b, | ||
72 | 0x003c, 0x003d, 0x003e, 0x003f, | ||
73 | /* 0x40 */ | ||
74 | 0x0040, 0x0041, 0x0042, 0x0043, | ||
75 | 0x0044, 0x0045, 0x0046, 0x0047, | ||
76 | 0x0048, 0x0049, 0x004a, 0x004b, | ||
77 | 0x004c, 0x004d, 0x004e, 0x004f, | ||
78 | /* 0x50 */ | ||
79 | 0x0050, 0x0051, 0x0052, 0x0053, | ||
80 | 0x0054, 0x0055, 0x0056, 0x0057, | ||
81 | 0x0058, 0x0059, 0x005a, 0x005b, | ||
82 | 0x005c, 0x005d, 0x005e, 0x005f, | ||
83 | /* 0x60 */ | ||
84 | 0x0060, 0x0061, 0x0062, 0x0063, | ||
85 | 0x0064, 0x0065, 0x0066, 0x0067, | ||
86 | 0x0068, 0x0069, 0x006a, 0x006b, | ||
87 | 0x006c, 0x006d, 0x006e, 0x006f, | ||
88 | /* 0x70 */ | ||
89 | 0x0070, 0x0071, 0x0072, 0x0073, | ||
90 | 0x0074, 0x0075, 0x0076, 0x0077, | ||
91 | 0x0078, 0x0079, 0x007a, 0x007b, | ||
92 | 0x007c, 0x007d, 0x007e, 0x007f, | ||
93 | /* 0x80 */ | ||
94 | 0x00c4, 0x0100, 0x0101, 0x00c9, | ||
95 | 0x0104, 0x00d6, 0x00dc, 0x00e1, | ||
96 | 0x0105, 0x010c, 0x00e4, 0x010d, | ||
97 | 0x0106, 0x0107, 0x00e9, 0x0179, | ||
98 | /* 0x90 */ | ||
99 | 0x017a, 0x010e, 0x00ed, 0x010f, | ||
100 | 0x0112, 0x0113, 0x0116, 0x00f3, | ||
101 | 0x0117, 0x00f4, 0x00f6, 0x00f5, | ||
102 | 0x00fa, 0x011a, 0x011b, 0x00fc, | ||
103 | /* 0xa0 */ | ||
104 | 0x2020, 0x00b0, 0x0118, 0x00a3, | ||
105 | 0x00a7, 0x2022, 0x00b6, 0x00df, | ||
106 | 0x00ae, 0x00a9, 0x2122, 0x0119, | ||
107 | 0x00a8, 0x2260, 0x0123, 0x012e, | ||
108 | /* 0xb0 */ | ||
109 | 0x012f, 0x012a, 0x2264, 0x2265, | ||
110 | 0x012b, 0x0136, 0x2202, 0x2211, | ||
111 | 0x0142, 0x013b, 0x013c, 0x013d, | ||
112 | 0x013e, 0x0139, 0x013a, 0x0145, | ||
113 | /* 0xc0 */ | ||
114 | 0x0146, 0x0143, 0x00ac, 0x221a, | ||
115 | 0x0144, 0x0147, 0x2206, 0x00ab, | ||
116 | 0x00bb, 0x2026, 0x00a0, 0x0148, | ||
117 | 0x0150, 0x00d5, 0x0151, 0x014c, | ||
118 | /* 0xd0 */ | ||
119 | 0x2013, 0x2014, 0x201c, 0x201d, | ||
120 | 0x2018, 0x2019, 0x00f7, 0x25ca, | ||
121 | 0x014d, 0x0154, 0x0155, 0x0158, | ||
122 | 0x2039, 0x203a, 0x0159, 0x0156, | ||
123 | /* 0xe0 */ | ||
124 | 0x0157, 0x0160, 0x201a, 0x201e, | ||
125 | 0x0161, 0x015a, 0x015b, 0x00c1, | ||
126 | 0x0164, 0x0165, 0x00cd, 0x017d, | ||
127 | 0x017e, 0x016a, 0x00d3, 0x00d4, | ||
128 | /* 0xf0 */ | ||
129 | 0x016b, 0x016e, 0x00da, 0x016f, | ||
130 | 0x0170, 0x0171, 0x0172, 0x0173, | ||
131 | 0x00dd, 0x00fd, 0x0137, 0x017b, | ||
132 | 0x0141, 0x017c, 0x0122, 0x02c7, | ||
133 | }; | ||
134 | |||
135 | static const unsigned char page00[256] = { | ||
136 | 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, /* 0x00-0x07 */ | ||
137 | 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, /* 0x08-0x0f */ | ||
138 | 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, /* 0x10-0x17 */ | ||
139 | 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, /* 0x18-0x1f */ | ||
140 | 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, /* 0x20-0x27 */ | ||
141 | 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, /* 0x28-0x2f */ | ||
142 | 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, /* 0x30-0x37 */ | ||
143 | 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, /* 0x38-0x3f */ | ||
144 | 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, /* 0x40-0x47 */ | ||
145 | 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, /* 0x48-0x4f */ | ||
146 | 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, /* 0x50-0x57 */ | ||
147 | 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f, /* 0x58-0x5f */ | ||
148 | 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, /* 0x60-0x67 */ | ||
149 | 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, /* 0x68-0x6f */ | ||
150 | 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, /* 0x70-0x77 */ | ||
151 | 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f, /* 0x78-0x7f */ | ||
152 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x80-0x87 */ | ||
153 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x88-0x8f */ | ||
154 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x90-0x97 */ | ||
155 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x98-0x9f */ | ||
156 | 0xca, 0x00, 0x00, 0xa3, 0x00, 0x00, 0x00, 0xa4, /* 0xa0-0xa7 */ | ||
157 | 0xac, 0xa9, 0x00, 0xc7, 0xc2, 0x00, 0xa8, 0x00, /* 0xa8-0xaf */ | ||
158 | 0xa1, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa6, 0x00, /* 0xb0-0xb7 */ | ||
159 | 0x00, 0x00, 0x00, 0xc8, 0x00, 0x00, 0x00, 0x00, /* 0xb8-0xbf */ | ||
160 | 0x00, 0xe7, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, /* 0xc0-0xc7 */ | ||
161 | 0x00, 0x83, 0x00, 0x00, 0x00, 0xea, 0x00, 0x00, /* 0xc8-0xcf */ | ||
162 | 0x00, 0x00, 0x00, 0xee, 0xef, 0xcd, 0x85, 0x00, /* 0xd0-0xd7 */ | ||
163 | 0x00, 0x00, 0xf2, 0x00, 0x86, 0xf8, 0x00, 0xa7, /* 0xd8-0xdf */ | ||
164 | 0x00, 0x87, 0x00, 0x00, 0x8a, 0x00, 0x00, 0x00, /* 0xe0-0xe7 */ | ||
165 | 0x00, 0x8e, 0x00, 0x00, 0x00, 0x92, 0x00, 0x00, /* 0xe8-0xef */ | ||
166 | 0x00, 0x00, 0x00, 0x97, 0x99, 0x9b, 0x9a, 0xd6, /* 0xf0-0xf7 */ | ||
167 | 0x00, 0x00, 0x9c, 0x00, 0x9f, 0xf9, 0x00, 0x00, /* 0xf8-0xff */ | ||
168 | }; | ||
169 | |||
170 | static const unsigned char page01[256] = { | ||
171 | 0x81, 0x82, 0x00, 0x00, 0x84, 0x88, 0x8c, 0x8d, /* 0x00-0x07 */ | ||
172 | 0x00, 0x00, 0x00, 0x00, 0x89, 0x8b, 0x91, 0x93, /* 0x08-0x0f */ | ||
173 | 0x00, 0x00, 0x94, 0x95, 0x00, 0x00, 0x96, 0x98, /* 0x10-0x17 */ | ||
174 | 0xa2, 0xab, 0x9d, 0x9e, 0x00, 0x00, 0x00, 0x00, /* 0x18-0x1f */ | ||
175 | 0x00, 0x00, 0xfe, 0xae, 0x00, 0x00, 0x00, 0x00, /* 0x20-0x27 */ | ||
176 | 0x00, 0x00, 0xb1, 0xb4, 0x00, 0x00, 0xaf, 0xb0, /* 0x28-0x2f */ | ||
177 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb5, 0xfa, /* 0x30-0x37 */ | ||
178 | 0x00, 0xbd, 0xbe, 0xb9, 0xba, 0xbb, 0xbc, 0x00, /* 0x38-0x3f */ | ||
179 | 0x00, 0xfc, 0xb8, 0xc1, 0xc4, 0xbf, 0xc0, 0xc5, /* 0x40-0x47 */ | ||
180 | 0xcb, 0x00, 0x00, 0x00, 0xcf, 0xd8, 0x00, 0x00, /* 0x48-0x4f */ | ||
181 | 0xcc, 0xce, 0x00, 0x00, 0xd9, 0xda, 0xdf, 0xe0, /* 0x50-0x57 */ | ||
182 | 0xdb, 0xde, 0xe5, 0xe6, 0x00, 0x00, 0x00, 0x00, /* 0x58-0x5f */ | ||
183 | 0xe1, 0xe4, 0x00, 0x00, 0xe8, 0xe9, 0x00, 0x00, /* 0x60-0x67 */ | ||
184 | 0x00, 0x00, 0xed, 0xf0, 0x00, 0x00, 0xf1, 0xf3, /* 0x68-0x6f */ | ||
185 | 0xf4, 0xf5, 0xf6, 0xf7, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */ | ||
186 | 0x00, 0x8f, 0x90, 0xfb, 0xfd, 0xeb, 0xec, 0x00, /* 0x78-0x7f */ | ||
187 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x80-0x87 */ | ||
188 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x88-0x8f */ | ||
189 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x90-0x97 */ | ||
190 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x98-0x9f */ | ||
191 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa0-0xa7 */ | ||
192 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa8-0xaf */ | ||
193 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xb0-0xb7 */ | ||
194 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xb8-0xbf */ | ||
195 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc0-0xc7 */ | ||
196 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc8-0xcf */ | ||
197 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd0-0xd7 */ | ||
198 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd8-0xdf */ | ||
199 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe0-0xe7 */ | ||
200 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe8-0xef */ | ||
201 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xf0-0xf7 */ | ||
202 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xf8-0xff */ | ||
203 | }; | ||
204 | |||
205 | static const unsigned char page02[256] = { | ||
206 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x00-0x07 */ | ||
207 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x08-0x0f */ | ||
208 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10-0x17 */ | ||
209 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x18-0x1f */ | ||
210 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x20-0x27 */ | ||
211 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x28-0x2f */ | ||
212 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x30-0x37 */ | ||
213 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x38-0x3f */ | ||
214 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x40-0x47 */ | ||
215 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x48-0x4f */ | ||
216 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x50-0x57 */ | ||
217 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x58-0x5f */ | ||
218 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x60-0x67 */ | ||
219 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x68-0x6f */ | ||
220 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */ | ||
221 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x78-0x7f */ | ||
222 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x80-0x87 */ | ||
223 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x88-0x8f */ | ||
224 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x90-0x97 */ | ||
225 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x98-0x9f */ | ||
226 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa0-0xa7 */ | ||
227 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa8-0xaf */ | ||
228 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xb0-0xb7 */ | ||
229 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xb8-0xbf */ | ||
230 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, /* 0xc0-0xc7 */ | ||
231 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc8-0xcf */ | ||
232 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd0-0xd7 */ | ||
233 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd8-0xdf */ | ||
234 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe0-0xe7 */ | ||
235 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe8-0xef */ | ||
236 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xf0-0xf7 */ | ||
237 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xf8-0xff */ | ||
238 | }; | ||
239 | |||
240 | static const unsigned char page20[256] = { | ||
241 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x00-0x07 */ | ||
242 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x08-0x0f */ | ||
243 | 0x00, 0x00, 0x00, 0xd0, 0xd1, 0x00, 0x00, 0x00, /* 0x10-0x17 */ | ||
244 | 0xd4, 0xd5, 0xe2, 0x00, 0xd2, 0xd3, 0xe3, 0x00, /* 0x18-0x1f */ | ||
245 | 0xa0, 0x00, 0xa5, 0x00, 0x00, 0x00, 0xc9, 0x00, /* 0x20-0x27 */ | ||
246 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x28-0x2f */ | ||
247 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x30-0x37 */ | ||
248 | 0x00, 0xdc, 0xdd, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x38-0x3f */ | ||
249 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x40-0x47 */ | ||
250 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x48-0x4f */ | ||
251 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x50-0x57 */ | ||
252 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x58-0x5f */ | ||
253 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x60-0x67 */ | ||
254 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x68-0x6f */ | ||
255 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */ | ||
256 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x78-0x7f */ | ||
257 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x80-0x87 */ | ||
258 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x88-0x8f */ | ||
259 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x90-0x97 */ | ||
260 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x98-0x9f */ | ||
261 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa0-0xa7 */ | ||
262 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa8-0xaf */ | ||
263 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xb0-0xb7 */ | ||
264 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xb8-0xbf */ | ||
265 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc0-0xc7 */ | ||
266 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc8-0xcf */ | ||
267 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd0-0xd7 */ | ||
268 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd8-0xdf */ | ||
269 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe0-0xe7 */ | ||
270 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe8-0xef */ | ||
271 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xf0-0xf7 */ | ||
272 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xf8-0xff */ | ||
273 | }; | ||
274 | |||
275 | static const unsigned char page21[256] = { | ||
276 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x00-0x07 */ | ||
277 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x08-0x0f */ | ||
278 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10-0x17 */ | ||
279 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x18-0x1f */ | ||
280 | 0x00, 0x00, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x20-0x27 */ | ||
281 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x28-0x2f */ | ||
282 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x30-0x37 */ | ||
283 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x38-0x3f */ | ||
284 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x40-0x47 */ | ||
285 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x48-0x4f */ | ||
286 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x50-0x57 */ | ||
287 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x58-0x5f */ | ||
288 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x60-0x67 */ | ||
289 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x68-0x6f */ | ||
290 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */ | ||
291 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x78-0x7f */ | ||
292 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x80-0x87 */ | ||
293 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x88-0x8f */ | ||
294 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x90-0x97 */ | ||
295 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x98-0x9f */ | ||
296 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa0-0xa7 */ | ||
297 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa8-0xaf */ | ||
298 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xb0-0xb7 */ | ||
299 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xb8-0xbf */ | ||
300 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc0-0xc7 */ | ||
301 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc8-0xcf */ | ||
302 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd0-0xd7 */ | ||
303 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd8-0xdf */ | ||
304 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe0-0xe7 */ | ||
305 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe8-0xef */ | ||
306 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xf0-0xf7 */ | ||
307 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xf8-0xff */ | ||
308 | }; | ||
309 | |||
310 | static const unsigned char page22[256] = { | ||
311 | 0x00, 0x00, 0xb6, 0x00, 0x00, 0x00, 0xc6, 0x00, /* 0x00-0x07 */ | ||
312 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x08-0x0f */ | ||
313 | 0x00, 0xb7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10-0x17 */ | ||
314 | 0x00, 0x00, 0xc3, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x18-0x1f */ | ||
315 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x20-0x27 */ | ||
316 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x28-0x2f */ | ||
317 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x30-0x37 */ | ||
318 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x38-0x3f */ | ||
319 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x40-0x47 */ | ||
320 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x48-0x4f */ | ||
321 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x50-0x57 */ | ||
322 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x58-0x5f */ | ||
323 | 0xad, 0x00, 0x00, 0x00, 0xb2, 0xb3, 0x00, 0x00, /* 0x60-0x67 */ | ||
324 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x68-0x6f */ | ||
325 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */ | ||
326 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x78-0x7f */ | ||
327 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x80-0x87 */ | ||
328 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x88-0x8f */ | ||
329 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x90-0x97 */ | ||
330 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x98-0x9f */ | ||
331 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa0-0xa7 */ | ||
332 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa8-0xaf */ | ||
333 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xb0-0xb7 */ | ||
334 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xb8-0xbf */ | ||
335 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc0-0xc7 */ | ||
336 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc8-0xcf */ | ||
337 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd0-0xd7 */ | ||
338 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd8-0xdf */ | ||
339 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe0-0xe7 */ | ||
340 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe8-0xef */ | ||
341 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xf0-0xf7 */ | ||
342 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xf8-0xff */ | ||
343 | }; | ||
344 | |||
345 | static const unsigned char page25[256] = { | ||
346 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x00-0x07 */ | ||
347 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x08-0x0f */ | ||
348 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10-0x17 */ | ||
349 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x18-0x1f */ | ||
350 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x20-0x27 */ | ||
351 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x28-0x2f */ | ||
352 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x30-0x37 */ | ||
353 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x38-0x3f */ | ||
354 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x40-0x47 */ | ||
355 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x48-0x4f */ | ||
356 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x50-0x57 */ | ||
357 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x58-0x5f */ | ||
358 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x60-0x67 */ | ||
359 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x68-0x6f */ | ||
360 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */ | ||
361 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x78-0x7f */ | ||
362 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x80-0x87 */ | ||
363 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x88-0x8f */ | ||
364 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x90-0x97 */ | ||
365 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x98-0x9f */ | ||
366 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa0-0xa7 */ | ||
367 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa8-0xaf */ | ||
368 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xb0-0xb7 */ | ||
369 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xb8-0xbf */ | ||
370 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc0-0xc7 */ | ||
371 | 0x00, 0x00, 0xd7, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc8-0xcf */ | ||
372 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd0-0xd7 */ | ||
373 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd8-0xdf */ | ||
374 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe0-0xe7 */ | ||
375 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe8-0xef */ | ||
376 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xf0-0xf7 */ | ||
377 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xf8-0xff */ | ||
378 | }; | ||
379 | |||
380 | static const unsigned char *const page_uni2charset[256] = { | ||
381 | page00, page01, page02, NULL, NULL, NULL, NULL, NULL, | ||
382 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
383 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
384 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
385 | page20, page21, page22, NULL, NULL, page25, NULL, NULL, | ||
386 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
387 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
388 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
389 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
390 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
391 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
392 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
393 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
394 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
395 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
396 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
397 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
398 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
399 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
400 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
401 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
402 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
403 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
404 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
405 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
406 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
407 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
408 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
409 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
410 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
411 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
412 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
413 | }; | ||
414 | |||
415 | static const unsigned char charset2lower[256] = { | ||
416 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x00-0x07 */ | ||
417 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x08-0x0f */ | ||
418 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x10-0x17 */ | ||
419 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x18-0x1f */ | ||
420 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x20-0x27 */ | ||
421 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x28-0x2f */ | ||
422 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x30-0x37 */ | ||
423 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x38-0x3f */ | ||
424 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x40-0x47 */ | ||
425 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x48-0x4f */ | ||
426 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x50-0x57 */ | ||
427 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x58-0x5f */ | ||
428 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x60-0x67 */ | ||
429 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x68-0x6f */ | ||
430 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x70-0x77 */ | ||
431 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x78-0x7f */ | ||
432 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x80-0x87 */ | ||
433 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x88-0x8f */ | ||
434 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x90-0x97 */ | ||
435 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x98-0x9f */ | ||
436 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0xa0-0xa7 */ | ||
437 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0xa8-0xaf */ | ||
438 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0xb0-0xb7 */ | ||
439 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0xb8-0xbf */ | ||
440 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0xc0-0xc7 */ | ||
441 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0xc8-0xcf */ | ||
442 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0xd0-0xd7 */ | ||
443 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0xd8-0xdf */ | ||
444 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0xe0-0xe7 */ | ||
445 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0xe8-0xef */ | ||
446 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0xf0-0xf7 */ | ||
447 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0xf8-0xff */ | ||
448 | }; | ||
449 | |||
450 | static const unsigned char charset2upper[256] = { | ||
451 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x00-0x07 */ | ||
452 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x08-0x0f */ | ||
453 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x10-0x17 */ | ||
454 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x18-0x1f */ | ||
455 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x20-0x27 */ | ||
456 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x28-0x2f */ | ||
457 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x30-0x37 */ | ||
458 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x38-0x3f */ | ||
459 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x40-0x47 */ | ||
460 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x48-0x4f */ | ||
461 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x50-0x57 */ | ||
462 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x58-0x5f */ | ||
463 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x60-0x67 */ | ||
464 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x68-0x6f */ | ||
465 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x70-0x77 */ | ||
466 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x78-0x7f */ | ||
467 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x80-0x87 */ | ||
468 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x88-0x8f */ | ||
469 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x90-0x97 */ | ||
470 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x98-0x9f */ | ||
471 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0xa0-0xa7 */ | ||
472 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0xa8-0xaf */ | ||
473 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0xb0-0xb7 */ | ||
474 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0xb8-0xbf */ | ||
475 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0xc0-0xc7 */ | ||
476 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0xc8-0xcf */ | ||
477 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0xd0-0xd7 */ | ||
478 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0xd8-0xdf */ | ||
479 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0xe0-0xe7 */ | ||
480 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0xe8-0xef */ | ||
481 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0xf0-0xf7 */ | ||
482 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0xf8-0xff */ | ||
483 | }; | ||
484 | |||
485 | static int uni2char(wchar_t uni, unsigned char *out, int boundlen) | ||
486 | { | ||
487 | const unsigned char *uni2charset; | ||
488 | unsigned char cl = uni & 0x00ff; | ||
489 | unsigned char ch = (uni & 0xff00) >> 8; | ||
490 | |||
491 | if (boundlen <= 0) | ||
492 | return -ENAMETOOLONG; | ||
493 | |||
494 | uni2charset = page_uni2charset[ch]; | ||
495 | if (uni2charset && uni2charset[cl]) | ||
496 | out[0] = uni2charset[cl]; | ||
497 | else | ||
498 | return -EINVAL; | ||
499 | return 1; | ||
500 | } | ||
501 | |||
502 | static int char2uni(const unsigned char *rawstring, int boundlen, wchar_t *uni) | ||
503 | { | ||
504 | *uni = charset2uni[*rawstring]; | ||
505 | if (*uni == 0x0000) | ||
506 | return -EINVAL; | ||
507 | return 1; | ||
508 | } | ||
509 | |||
510 | static struct nls_table table = { | ||
511 | .charset = "maccenteuro", | ||
512 | .uni2char = uni2char, | ||
513 | .char2uni = char2uni, | ||
514 | .charset2lower = charset2lower, | ||
515 | .charset2upper = charset2upper, | ||
516 | .owner = THIS_MODULE, | ||
517 | }; | ||
518 | |||
519 | static int __init init_nls_maccenteuro(void) | ||
520 | { | ||
521 | return register_nls(&table); | ||
522 | } | ||
523 | |||
524 | static void __exit exit_nls_maccenteuro(void) | ||
525 | { | ||
526 | unregister_nls(&table); | ||
527 | } | ||
528 | |||
529 | module_init(init_nls_maccenteuro) | ||
530 | module_exit(exit_nls_maccenteuro) | ||
531 | |||
532 | MODULE_LICENSE("Dual BSD/GPL"); | ||
diff --git a/fs/nls/nls_maccroatian.c b/fs/nls/nls_maccroatian.c new file mode 100644 index 000000000000..10b01c3eed66 --- /dev/null +++ b/fs/nls/nls_maccroatian.c | |||
@@ -0,0 +1,602 @@ | |||
1 | /* | ||
2 | * linux/fs/nls/nls_maccroatian.c | ||
3 | * | ||
4 | * Charset maccroatian translation tables. | ||
5 | * Generated automatically from the Unicode and charset | ||
6 | * tables from the Unicode Organization (www.unicode.org). | ||
7 | * The Unicode to charset table has only exact mappings. | ||
8 | */ | ||
9 | |||
10 | /* | ||
11 | * COPYRIGHT AND PERMISSION NOTICE | ||
12 | * | ||
13 | * Copyright 1991-2012 Unicode, Inc. All rights reserved. Distributed under | ||
14 | * the Terms of Use in http://www.unicode.org/copyright.html. | ||
15 | * | ||
16 | * Permission is hereby granted, free of charge, to any person obtaining a | ||
17 | * copy of the Unicode data files and any associated documentation (the "Data | ||
18 | * Files") or Unicode software and any associated documentation (the | ||
19 | * "Software") to deal in the Data Files or Software without restriction, | ||
20 | * including without limitation the rights to use, copy, modify, merge, | ||
21 | * publish, distribute, and/or sell copies of the Data Files or Software, and | ||
22 | * to permit persons to whom the Data Files or Software are furnished to do | ||
23 | * so, provided that (a) the above copyright notice(s) and this permission | ||
24 | * notice appear with all copies of the Data Files or Software, (b) both the | ||
25 | * above copyright notice(s) and this permission notice appear in associated | ||
26 | * documentation, and (c) there is clear notice in each modified Data File or | ||
27 | * in the Software as well as in the documentation associated with the Data | ||
28 | * File(s) or Software that the data or software has been modified. | ||
29 | * | ||
30 | * THE DATA FILES AND SOFTWARE ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY | ||
31 | * KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF | ||
32 | * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF | ||
33 | * THIRD PARTY RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS | ||
34 | * INCLUDED IN THIS NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT | ||
35 | * OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF | ||
36 | * USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR | ||
37 | * OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR | ||
38 | * PERFORMANCE OF THE DATA FILES OR SOFTWARE. | ||
39 | * | ||
40 | * Except as contained in this notice, the name of a copyright holder shall | ||
41 | * not be used in advertising or otherwise to promote the sale, use or other | ||
42 | * dealings in these Data Files or Software without prior written | ||
43 | * authorization of the copyright holder. | ||
44 | */ | ||
45 | |||
46 | #include <linux/module.h> | ||
47 | #include <linux/kernel.h> | ||
48 | #include <linux/string.h> | ||
49 | #include <linux/nls.h> | ||
50 | #include <linux/errno.h> | ||
51 | |||
52 | static const wchar_t charset2uni[256] = { | ||
53 | /* 0x00 */ | ||
54 | 0x0000, 0x0001, 0x0002, 0x0003, | ||
55 | 0x0004, 0x0005, 0x0006, 0x0007, | ||
56 | 0x0008, 0x0009, 0x000a, 0x000b, | ||
57 | 0x000c, 0x000d, 0x000e, 0x000f, | ||
58 | /* 0x10 */ | ||
59 | 0x0010, 0x0011, 0x0012, 0x0013, | ||
60 | 0x0014, 0x0015, 0x0016, 0x0017, | ||
61 | 0x0018, 0x0019, 0x001a, 0x001b, | ||
62 | 0x001c, 0x001d, 0x001e, 0x001f, | ||
63 | /* 0x20 */ | ||
64 | 0x0020, 0x0021, 0x0022, 0x0023, | ||
65 | 0x0024, 0x0025, 0x0026, 0x0027, | ||
66 | 0x0028, 0x0029, 0x002a, 0x002b, | ||
67 | 0x002c, 0x002d, 0x002e, 0x002f, | ||
68 | /* 0x30 */ | ||
69 | 0x0030, 0x0031, 0x0032, 0x0033, | ||
70 | 0x0034, 0x0035, 0x0036, 0x0037, | ||
71 | 0x0038, 0x0039, 0x003a, 0x003b, | ||
72 | 0x003c, 0x003d, 0x003e, 0x003f, | ||
73 | /* 0x40 */ | ||
74 | 0x0040, 0x0041, 0x0042, 0x0043, | ||
75 | 0x0044, 0x0045, 0x0046, 0x0047, | ||
76 | 0x0048, 0x0049, 0x004a, 0x004b, | ||
77 | 0x004c, 0x004d, 0x004e, 0x004f, | ||
78 | /* 0x50 */ | ||
79 | 0x0050, 0x0051, 0x0052, 0x0053, | ||
80 | 0x0054, 0x0055, 0x0056, 0x0057, | ||
81 | 0x0058, 0x0059, 0x005a, 0x005b, | ||
82 | 0x005c, 0x005d, 0x005e, 0x005f, | ||
83 | /* 0x60 */ | ||
84 | 0x0060, 0x0061, 0x0062, 0x0063, | ||
85 | 0x0064, 0x0065, 0x0066, 0x0067, | ||
86 | 0x0068, 0x0069, 0x006a, 0x006b, | ||
87 | 0x006c, 0x006d, 0x006e, 0x006f, | ||
88 | /* 0x70 */ | ||
89 | 0x0070, 0x0071, 0x0072, 0x0073, | ||
90 | 0x0074, 0x0075, 0x0076, 0x0077, | ||
91 | 0x0078, 0x0079, 0x007a, 0x007b, | ||
92 | 0x007c, 0x007d, 0x007e, 0x007f, | ||
93 | /* 0x80 */ | ||
94 | 0x00c4, 0x00c5, 0x00c7, 0x00c9, | ||
95 | 0x00d1, 0x00d6, 0x00dc, 0x00e1, | ||
96 | 0x00e0, 0x00e2, 0x00e4, 0x00e3, | ||
97 | 0x00e5, 0x00e7, 0x00e9, 0x00e8, | ||
98 | /* 0x90 */ | ||
99 | 0x00ea, 0x00eb, 0x00ed, 0x00ec, | ||
100 | 0x00ee, 0x00ef, 0x00f1, 0x00f3, | ||
101 | 0x00f2, 0x00f4, 0x00f6, 0x00f5, | ||
102 | 0x00fa, 0x00f9, 0x00fb, 0x00fc, | ||
103 | /* 0xa0 */ | ||
104 | 0x2020, 0x00b0, 0x00a2, 0x00a3, | ||
105 | 0x00a7, 0x2022, 0x00b6, 0x00df, | ||
106 | 0x00ae, 0x0160, 0x2122, 0x00b4, | ||
107 | 0x00a8, 0x2260, 0x017d, 0x00d8, | ||
108 | /* 0xb0 */ | ||
109 | 0x221e, 0x00b1, 0x2264, 0x2265, | ||
110 | 0x2206, 0x00b5, 0x2202, 0x2211, | ||
111 | 0x220f, 0x0161, 0x222b, 0x00aa, | ||
112 | 0x00ba, 0x03a9, 0x017e, 0x00f8, | ||
113 | /* 0xc0 */ | ||
114 | 0x00bf, 0x00a1, 0x00ac, 0x221a, | ||
115 | 0x0192, 0x2248, 0x0106, 0x00ab, | ||
116 | 0x010c, 0x2026, 0x00a0, 0x00c0, | ||
117 | 0x00c3, 0x00d5, 0x0152, 0x0153, | ||
118 | /* 0xd0 */ | ||
119 | 0x0110, 0x2014, 0x201c, 0x201d, | ||
120 | 0x2018, 0x2019, 0x00f7, 0x25ca, | ||
121 | 0xf8ff, 0x00a9, 0x2044, 0x20ac, | ||
122 | 0x2039, 0x203a, 0x00c6, 0x00bb, | ||
123 | /* 0xe0 */ | ||
124 | 0x2013, 0x00b7, 0x201a, 0x201e, | ||
125 | 0x2030, 0x00c2, 0x0107, 0x00c1, | ||
126 | 0x010d, 0x00c8, 0x00cd, 0x00ce, | ||
127 | 0x00cf, 0x00cc, 0x00d3, 0x00d4, | ||
128 | /* 0xf0 */ | ||
129 | 0x0111, 0x00d2, 0x00da, 0x00db, | ||
130 | 0x00d9, 0x0131, 0x02c6, 0x02dc, | ||
131 | 0x00af, 0x03c0, 0x00cb, 0x02da, | ||
132 | 0x00b8, 0x00ca, 0x00e6, 0x02c7, | ||
133 | }; | ||
134 | |||
135 | static const unsigned char page00[256] = { | ||
136 | 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, /* 0x00-0x07 */ | ||
137 | 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, /* 0x08-0x0f */ | ||
138 | 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, /* 0x10-0x17 */ | ||
139 | 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, /* 0x18-0x1f */ | ||
140 | 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, /* 0x20-0x27 */ | ||
141 | 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, /* 0x28-0x2f */ | ||
142 | 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, /* 0x30-0x37 */ | ||
143 | 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, /* 0x38-0x3f */ | ||
144 | 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, /* 0x40-0x47 */ | ||
145 | 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, /* 0x48-0x4f */ | ||
146 | 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, /* 0x50-0x57 */ | ||
147 | 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f, /* 0x58-0x5f */ | ||
148 | 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, /* 0x60-0x67 */ | ||
149 | 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, /* 0x68-0x6f */ | ||
150 | 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, /* 0x70-0x77 */ | ||
151 | 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f, /* 0x78-0x7f */ | ||
152 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x80-0x87 */ | ||
153 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x88-0x8f */ | ||
154 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x90-0x97 */ | ||
155 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x98-0x9f */ | ||
156 | 0xca, 0xc1, 0xa2, 0xa3, 0x00, 0x00, 0x00, 0xa4, /* 0xa0-0xa7 */ | ||
157 | 0xac, 0xd9, 0xbb, 0xc7, 0xc2, 0x00, 0xa8, 0xf8, /* 0xa8-0xaf */ | ||
158 | 0xa1, 0xb1, 0x00, 0x00, 0xab, 0xb5, 0xa6, 0xe1, /* 0xb0-0xb7 */ | ||
159 | 0xfc, 0x00, 0xbc, 0xdf, 0x00, 0x00, 0x00, 0xc0, /* 0xb8-0xbf */ | ||
160 | 0xcb, 0xe7, 0xe5, 0xcc, 0x80, 0x81, 0xde, 0x82, /* 0xc0-0xc7 */ | ||
161 | 0xe9, 0x83, 0xfd, 0xfa, 0xed, 0xea, 0xeb, 0xec, /* 0xc8-0xcf */ | ||
162 | 0x00, 0x84, 0xf1, 0xee, 0xef, 0xcd, 0x85, 0x00, /* 0xd0-0xd7 */ | ||
163 | 0xaf, 0xf4, 0xf2, 0xf3, 0x86, 0x00, 0x00, 0xa7, /* 0xd8-0xdf */ | ||
164 | 0x88, 0x87, 0x89, 0x8b, 0x8a, 0x8c, 0xfe, 0x8d, /* 0xe0-0xe7 */ | ||
165 | 0x8f, 0x8e, 0x90, 0x91, 0x93, 0x92, 0x94, 0x95, /* 0xe8-0xef */ | ||
166 | 0x00, 0x96, 0x98, 0x97, 0x99, 0x9b, 0x9a, 0xd6, /* 0xf0-0xf7 */ | ||
167 | 0xbf, 0x9d, 0x9c, 0x9e, 0x9f, 0x00, 0x00, 0x00, /* 0xf8-0xff */ | ||
168 | }; | ||
169 | |||
170 | static const unsigned char page01[256] = { | ||
171 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc6, 0xe6, /* 0x00-0x07 */ | ||
172 | 0x00, 0x00, 0x00, 0x00, 0xc8, 0xe8, 0x00, 0x00, /* 0x08-0x0f */ | ||
173 | 0xd0, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10-0x17 */ | ||
174 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x18-0x1f */ | ||
175 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x20-0x27 */ | ||
176 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x28-0x2f */ | ||
177 | 0x00, 0xf5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x30-0x37 */ | ||
178 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x38-0x3f */ | ||
179 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x40-0x47 */ | ||
180 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x48-0x4f */ | ||
181 | 0x00, 0x00, 0xce, 0xcf, 0x00, 0x00, 0x00, 0x00, /* 0x50-0x57 */ | ||
182 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x58-0x5f */ | ||
183 | 0xa9, 0xb9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x60-0x67 */ | ||
184 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x68-0x6f */ | ||
185 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */ | ||
186 | 0x00, 0x00, 0x00, 0x00, 0x00, 0xae, 0xbe, 0x00, /* 0x78-0x7f */ | ||
187 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x80-0x87 */ | ||
188 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x88-0x8f */ | ||
189 | 0x00, 0x00, 0xc4, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x90-0x97 */ | ||
190 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x98-0x9f */ | ||
191 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa0-0xa7 */ | ||
192 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa8-0xaf */ | ||
193 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xb0-0xb7 */ | ||
194 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xb8-0xbf */ | ||
195 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc0-0xc7 */ | ||
196 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc8-0xcf */ | ||
197 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd0-0xd7 */ | ||
198 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd8-0xdf */ | ||
199 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe0-0xe7 */ | ||
200 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe8-0xef */ | ||
201 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xf0-0xf7 */ | ||
202 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xf8-0xff */ | ||
203 | }; | ||
204 | |||
205 | static const unsigned char page02[256] = { | ||
206 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x00-0x07 */ | ||
207 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x08-0x0f */ | ||
208 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10-0x17 */ | ||
209 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x18-0x1f */ | ||
210 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x20-0x27 */ | ||
211 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x28-0x2f */ | ||
212 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x30-0x37 */ | ||
213 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x38-0x3f */ | ||
214 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x40-0x47 */ | ||
215 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x48-0x4f */ | ||
216 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x50-0x57 */ | ||
217 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x58-0x5f */ | ||
218 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x60-0x67 */ | ||
219 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x68-0x6f */ | ||
220 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */ | ||
221 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x78-0x7f */ | ||
222 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x80-0x87 */ | ||
223 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x88-0x8f */ | ||
224 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x90-0x97 */ | ||
225 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x98-0x9f */ | ||
226 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa0-0xa7 */ | ||
227 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa8-0xaf */ | ||
228 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xb0-0xb7 */ | ||
229 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xb8-0xbf */ | ||
230 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf6, 0xff, /* 0xc0-0xc7 */ | ||
231 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc8-0xcf */ | ||
232 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd0-0xd7 */ | ||
233 | 0x00, 0x00, 0xfb, 0x00, 0xf7, 0x00, 0x00, 0x00, /* 0xd8-0xdf */ | ||
234 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe0-0xe7 */ | ||
235 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe8-0xef */ | ||
236 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xf0-0xf7 */ | ||
237 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xf8-0xff */ | ||
238 | }; | ||
239 | |||
240 | static const unsigned char page03[256] = { | ||
241 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x00-0x07 */ | ||
242 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x08-0x0f */ | ||
243 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10-0x17 */ | ||
244 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x18-0x1f */ | ||
245 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x20-0x27 */ | ||
246 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x28-0x2f */ | ||
247 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x30-0x37 */ | ||
248 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x38-0x3f */ | ||
249 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x40-0x47 */ | ||
250 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x48-0x4f */ | ||
251 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x50-0x57 */ | ||
252 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x58-0x5f */ | ||
253 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x60-0x67 */ | ||
254 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x68-0x6f */ | ||
255 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */ | ||
256 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x78-0x7f */ | ||
257 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x80-0x87 */ | ||
258 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x88-0x8f */ | ||
259 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x90-0x97 */ | ||
260 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x98-0x9f */ | ||
261 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa0-0xa7 */ | ||
262 | 0x00, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa8-0xaf */ | ||
263 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xb0-0xb7 */ | ||
264 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xb8-0xbf */ | ||
265 | 0xf9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc0-0xc7 */ | ||
266 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc8-0xcf */ | ||
267 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd0-0xd7 */ | ||
268 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd8-0xdf */ | ||
269 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe0-0xe7 */ | ||
270 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe8-0xef */ | ||
271 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xf0-0xf7 */ | ||
272 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xf8-0xff */ | ||
273 | }; | ||
274 | |||
275 | static const unsigned char page20[256] = { | ||
276 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x00-0x07 */ | ||
277 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x08-0x0f */ | ||
278 | 0x00, 0x00, 0x00, 0xe0, 0xd1, 0x00, 0x00, 0x00, /* 0x10-0x17 */ | ||
279 | 0xd4, 0xd5, 0xe2, 0x00, 0xd2, 0xd3, 0xe3, 0x00, /* 0x18-0x1f */ | ||
280 | 0xa0, 0x00, 0xa5, 0x00, 0x00, 0x00, 0xc9, 0x00, /* 0x20-0x27 */ | ||
281 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x28-0x2f */ | ||
282 | 0xe4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x30-0x37 */ | ||
283 | 0x00, 0xdc, 0xdd, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x38-0x3f */ | ||
284 | 0x00, 0x00, 0x00, 0x00, 0xda, 0x00, 0x00, 0x00, /* 0x40-0x47 */ | ||
285 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x48-0x4f */ | ||
286 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x50-0x57 */ | ||
287 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x58-0x5f */ | ||
288 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x60-0x67 */ | ||
289 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x68-0x6f */ | ||
290 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */ | ||
291 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x78-0x7f */ | ||
292 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x80-0x87 */ | ||
293 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x88-0x8f */ | ||
294 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x90-0x97 */ | ||
295 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x98-0x9f */ | ||
296 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa0-0xa7 */ | ||
297 | 0x00, 0x00, 0x00, 0x00, 0xdb, 0x00, 0x00, 0x00, /* 0xa8-0xaf */ | ||
298 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xb0-0xb7 */ | ||
299 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xb8-0xbf */ | ||
300 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc0-0xc7 */ | ||
301 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc8-0xcf */ | ||
302 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd0-0xd7 */ | ||
303 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd8-0xdf */ | ||
304 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe0-0xe7 */ | ||
305 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe8-0xef */ | ||
306 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xf0-0xf7 */ | ||
307 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xf8-0xff */ | ||
308 | }; | ||
309 | |||
310 | static const unsigned char page21[256] = { | ||
311 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x00-0x07 */ | ||
312 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x08-0x0f */ | ||
313 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10-0x17 */ | ||
314 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x18-0x1f */ | ||
315 | 0x00, 0x00, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x20-0x27 */ | ||
316 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x28-0x2f */ | ||
317 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x30-0x37 */ | ||
318 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x38-0x3f */ | ||
319 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x40-0x47 */ | ||
320 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x48-0x4f */ | ||
321 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x50-0x57 */ | ||
322 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x58-0x5f */ | ||
323 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x60-0x67 */ | ||
324 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x68-0x6f */ | ||
325 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */ | ||
326 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x78-0x7f */ | ||
327 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x80-0x87 */ | ||
328 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x88-0x8f */ | ||
329 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x90-0x97 */ | ||
330 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x98-0x9f */ | ||
331 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa0-0xa7 */ | ||
332 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa8-0xaf */ | ||
333 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xb0-0xb7 */ | ||
334 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xb8-0xbf */ | ||
335 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc0-0xc7 */ | ||
336 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc8-0xcf */ | ||
337 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd0-0xd7 */ | ||
338 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd8-0xdf */ | ||
339 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe0-0xe7 */ | ||
340 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe8-0xef */ | ||
341 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xf0-0xf7 */ | ||
342 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xf8-0xff */ | ||
343 | }; | ||
344 | |||
345 | static const unsigned char page22[256] = { | ||
346 | 0x00, 0x00, 0xb6, 0x00, 0x00, 0x00, 0xb4, 0x00, /* 0x00-0x07 */ | ||
347 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb8, /* 0x08-0x0f */ | ||
348 | 0x00, 0xb7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10-0x17 */ | ||
349 | 0x00, 0x00, 0xc3, 0x00, 0x00, 0x00, 0xb0, 0x00, /* 0x18-0x1f */ | ||
350 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x20-0x27 */ | ||
351 | 0x00, 0x00, 0x00, 0xba, 0x00, 0x00, 0x00, 0x00, /* 0x28-0x2f */ | ||
352 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x30-0x37 */ | ||
353 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x38-0x3f */ | ||
354 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x40-0x47 */ | ||
355 | 0xc5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x48-0x4f */ | ||
356 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x50-0x57 */ | ||
357 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x58-0x5f */ | ||
358 | 0xad, 0x00, 0x00, 0x00, 0xb2, 0xb3, 0x00, 0x00, /* 0x60-0x67 */ | ||
359 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x68-0x6f */ | ||
360 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */ | ||
361 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x78-0x7f */ | ||
362 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x80-0x87 */ | ||
363 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x88-0x8f */ | ||
364 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x90-0x97 */ | ||
365 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x98-0x9f */ | ||
366 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa0-0xa7 */ | ||
367 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa8-0xaf */ | ||
368 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xb0-0xb7 */ | ||
369 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xb8-0xbf */ | ||
370 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc0-0xc7 */ | ||
371 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc8-0xcf */ | ||
372 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd0-0xd7 */ | ||
373 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd8-0xdf */ | ||
374 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe0-0xe7 */ | ||
375 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe8-0xef */ | ||
376 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xf0-0xf7 */ | ||
377 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xf8-0xff */ | ||
378 | }; | ||
379 | |||
380 | static const unsigned char page25[256] = { | ||
381 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x00-0x07 */ | ||
382 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x08-0x0f */ | ||
383 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10-0x17 */ | ||
384 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x18-0x1f */ | ||
385 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x20-0x27 */ | ||
386 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x28-0x2f */ | ||
387 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x30-0x37 */ | ||
388 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x38-0x3f */ | ||
389 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x40-0x47 */ | ||
390 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x48-0x4f */ | ||
391 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x50-0x57 */ | ||
392 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x58-0x5f */ | ||
393 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x60-0x67 */ | ||
394 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x68-0x6f */ | ||
395 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */ | ||
396 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x78-0x7f */ | ||
397 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x80-0x87 */ | ||
398 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x88-0x8f */ | ||
399 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x90-0x97 */ | ||
400 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x98-0x9f */ | ||
401 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa0-0xa7 */ | ||
402 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa8-0xaf */ | ||
403 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xb0-0xb7 */ | ||
404 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xb8-0xbf */ | ||
405 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc0-0xc7 */ | ||
406 | 0x00, 0x00, 0xd7, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc8-0xcf */ | ||
407 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd0-0xd7 */ | ||
408 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd8-0xdf */ | ||
409 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe0-0xe7 */ | ||
410 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe8-0xef */ | ||
411 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xf0-0xf7 */ | ||
412 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xf8-0xff */ | ||
413 | }; | ||
414 | |||
415 | static const unsigned char pagef8[256] = { | ||
416 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x00-0x07 */ | ||
417 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x08-0x0f */ | ||
418 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10-0x17 */ | ||
419 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x18-0x1f */ | ||
420 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x20-0x27 */ | ||
421 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x28-0x2f */ | ||
422 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x30-0x37 */ | ||
423 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x38-0x3f */ | ||
424 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x40-0x47 */ | ||
425 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x48-0x4f */ | ||
426 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x50-0x57 */ | ||
427 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x58-0x5f */ | ||
428 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x60-0x67 */ | ||
429 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x68-0x6f */ | ||
430 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */ | ||
431 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x78-0x7f */ | ||
432 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x80-0x87 */ | ||
433 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x88-0x8f */ | ||
434 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x90-0x97 */ | ||
435 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x98-0x9f */ | ||
436 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa0-0xa7 */ | ||
437 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa8-0xaf */ | ||
438 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xb0-0xb7 */ | ||
439 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xb8-0xbf */ | ||
440 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc0-0xc7 */ | ||
441 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc8-0xcf */ | ||
442 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd0-0xd7 */ | ||
443 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd8-0xdf */ | ||
444 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe0-0xe7 */ | ||
445 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe8-0xef */ | ||
446 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xf0-0xf7 */ | ||
447 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd8, /* 0xf8-0xff */ | ||
448 | }; | ||
449 | |||
450 | static const unsigned char *const page_uni2charset[256] = { | ||
451 | page00, page01, page02, page03, NULL, NULL, NULL, NULL, | ||
452 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
453 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
454 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
455 | page20, page21, page22, NULL, NULL, page25, NULL, NULL, | ||
456 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
457 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
458 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
459 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
460 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
461 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
462 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
463 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
464 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
465 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
466 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
467 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
468 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
469 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
470 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
471 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
472 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
473 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
474 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
475 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
476 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
477 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
478 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
479 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
480 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
481 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
482 | pagef8, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
483 | }; | ||
484 | |||
485 | static const unsigned char charset2lower[256] = { | ||
486 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x00-0x07 */ | ||
487 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x08-0x0f */ | ||
488 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x10-0x17 */ | ||
489 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x18-0x1f */ | ||
490 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x20-0x27 */ | ||
491 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x28-0x2f */ | ||
492 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x30-0x37 */ | ||
493 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x38-0x3f */ | ||
494 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x40-0x47 */ | ||
495 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x48-0x4f */ | ||
496 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x50-0x57 */ | ||
497 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x58-0x5f */ | ||
498 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x60-0x67 */ | ||
499 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x68-0x6f */ | ||
500 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x70-0x77 */ | ||
501 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x78-0x7f */ | ||
502 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x80-0x87 */ | ||
503 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x88-0x8f */ | ||
504 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x90-0x97 */ | ||
505 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x98-0x9f */ | ||
506 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0xa0-0xa7 */ | ||
507 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0xa8-0xaf */ | ||
508 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0xb0-0xb7 */ | ||
509 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0xb8-0xbf */ | ||
510 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0xc0-0xc7 */ | ||
511 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0xc8-0xcf */ | ||
512 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0xd0-0xd7 */ | ||
513 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0xd8-0xdf */ | ||
514 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0xe0-0xe7 */ | ||
515 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0xe8-0xef */ | ||
516 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0xf0-0xf7 */ | ||
517 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0xf8-0xff */ | ||
518 | }; | ||
519 | |||
520 | static const unsigned char charset2upper[256] = { | ||
521 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x00-0x07 */ | ||
522 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x08-0x0f */ | ||
523 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x10-0x17 */ | ||
524 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x18-0x1f */ | ||
525 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x20-0x27 */ | ||
526 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x28-0x2f */ | ||
527 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x30-0x37 */ | ||
528 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x38-0x3f */ | ||
529 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x40-0x47 */ | ||
530 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x48-0x4f */ | ||
531 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x50-0x57 */ | ||
532 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x58-0x5f */ | ||
533 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x60-0x67 */ | ||
534 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x68-0x6f */ | ||
535 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x70-0x77 */ | ||
536 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x78-0x7f */ | ||
537 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x80-0x87 */ | ||
538 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x88-0x8f */ | ||
539 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x90-0x97 */ | ||
540 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x98-0x9f */ | ||
541 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0xa0-0xa7 */ | ||
542 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0xa8-0xaf */ | ||
543 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0xb0-0xb7 */ | ||
544 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0xb8-0xbf */ | ||
545 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0xc0-0xc7 */ | ||
546 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0xc8-0xcf */ | ||
547 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0xd0-0xd7 */ | ||
548 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0xd8-0xdf */ | ||
549 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0xe0-0xe7 */ | ||
550 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0xe8-0xef */ | ||
551 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0xf0-0xf7 */ | ||
552 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0xf8-0xff */ | ||
553 | }; | ||
554 | |||
555 | static int uni2char(wchar_t uni, unsigned char *out, int boundlen) | ||
556 | { | ||
557 | const unsigned char *uni2charset; | ||
558 | unsigned char cl = uni & 0x00ff; | ||
559 | unsigned char ch = (uni & 0xff00) >> 8; | ||
560 | |||
561 | if (boundlen <= 0) | ||
562 | return -ENAMETOOLONG; | ||
563 | |||
564 | uni2charset = page_uni2charset[ch]; | ||
565 | if (uni2charset && uni2charset[cl]) | ||
566 | out[0] = uni2charset[cl]; | ||
567 | else | ||
568 | return -EINVAL; | ||
569 | return 1; | ||
570 | } | ||
571 | |||
572 | static int char2uni(const unsigned char *rawstring, int boundlen, wchar_t *uni) | ||
573 | { | ||
574 | *uni = charset2uni[*rawstring]; | ||
575 | if (*uni == 0x0000) | ||
576 | return -EINVAL; | ||
577 | return 1; | ||
578 | } | ||
579 | |||
580 | static struct nls_table table = { | ||
581 | .charset = "maccroatian", | ||
582 | .uni2char = uni2char, | ||
583 | .char2uni = char2uni, | ||
584 | .charset2lower = charset2lower, | ||
585 | .charset2upper = charset2upper, | ||
586 | .owner = THIS_MODULE, | ||
587 | }; | ||
588 | |||
589 | static int __init init_nls_maccroatian(void) | ||
590 | { | ||
591 | return register_nls(&table); | ||
592 | } | ||
593 | |||
594 | static void __exit exit_nls_maccroatian(void) | ||
595 | { | ||
596 | unregister_nls(&table); | ||
597 | } | ||
598 | |||
599 | module_init(init_nls_maccroatian) | ||
600 | module_exit(exit_nls_maccroatian) | ||
601 | |||
602 | MODULE_LICENSE("Dual BSD/GPL"); | ||
diff --git a/fs/nls/nls_maccyrillic.c b/fs/nls/nls_maccyrillic.c new file mode 100644 index 000000000000..318473fbb26c --- /dev/null +++ b/fs/nls/nls_maccyrillic.c | |||
@@ -0,0 +1,497 @@ | |||
1 | /* | ||
2 | * linux/fs/nls/nls_maccyrillic.c | ||
3 | * | ||
4 | * Charset maccyrillic translation tables. | ||
5 | * Generated automatically from the Unicode and charset | ||
6 | * tables from the Unicode Organization (www.unicode.org). | ||
7 | * The Unicode to charset table has only exact mappings. | ||
8 | */ | ||
9 | |||
10 | /* | ||
11 | * COPYRIGHT AND PERMISSION NOTICE | ||
12 | * | ||
13 | * Copyright 1991-2012 Unicode, Inc. All rights reserved. Distributed under | ||
14 | * the Terms of Use in http://www.unicode.org/copyright.html. | ||
15 | * | ||
16 | * Permission is hereby granted, free of charge, to any person obtaining a | ||
17 | * copy of the Unicode data files and any associated documentation (the "Data | ||
18 | * Files") or Unicode software and any associated documentation (the | ||
19 | * "Software") to deal in the Data Files or Software without restriction, | ||
20 | * including without limitation the rights to use, copy, modify, merge, | ||
21 | * publish, distribute, and/or sell copies of the Data Files or Software, and | ||
22 | * to permit persons to whom the Data Files or Software are furnished to do | ||
23 | * so, provided that (a) the above copyright notice(s) and this permission | ||
24 | * notice appear with all copies of the Data Files or Software, (b) both the | ||
25 | * above copyright notice(s) and this permission notice appear in associated | ||
26 | * documentation, and (c) there is clear notice in each modified Data File or | ||
27 | * in the Software as well as in the documentation associated with the Data | ||
28 | * File(s) or Software that the data or software has been modified. | ||
29 | * | ||
30 | * THE DATA FILES AND SOFTWARE ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY | ||
31 | * KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF | ||
32 | * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF | ||
33 | * THIRD PARTY RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS | ||
34 | * INCLUDED IN THIS NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT | ||
35 | * OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF | ||
36 | * USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR | ||
37 | * OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR | ||
38 | * PERFORMANCE OF THE DATA FILES OR SOFTWARE. | ||
39 | * | ||
40 | * Except as contained in this notice, the name of a copyright holder shall | ||
41 | * not be used in advertising or otherwise to promote the sale, use or other | ||
42 | * dealings in these Data Files or Software without prior written | ||
43 | * authorization of the copyright holder. | ||
44 | */ | ||
45 | |||
46 | #include <linux/module.h> | ||
47 | #include <linux/kernel.h> | ||
48 | #include <linux/string.h> | ||
49 | #include <linux/nls.h> | ||
50 | #include <linux/errno.h> | ||
51 | |||
52 | static const wchar_t charset2uni[256] = { | ||
53 | /* 0x00 */ | ||
54 | 0x0000, 0x0001, 0x0002, 0x0003, | ||
55 | 0x0004, 0x0005, 0x0006, 0x0007, | ||
56 | 0x0008, 0x0009, 0x000a, 0x000b, | ||
57 | 0x000c, 0x000d, 0x000e, 0x000f, | ||
58 | /* 0x10 */ | ||
59 | 0x0010, 0x0011, 0x0012, 0x0013, | ||
60 | 0x0014, 0x0015, 0x0016, 0x0017, | ||
61 | 0x0018, 0x0019, 0x001a, 0x001b, | ||
62 | 0x001c, 0x001d, 0x001e, 0x001f, | ||
63 | /* 0x20 */ | ||
64 | 0x0020, 0x0021, 0x0022, 0x0023, | ||
65 | 0x0024, 0x0025, 0x0026, 0x0027, | ||
66 | 0x0028, 0x0029, 0x002a, 0x002b, | ||
67 | 0x002c, 0x002d, 0x002e, 0x002f, | ||
68 | /* 0x30 */ | ||
69 | 0x0030, 0x0031, 0x0032, 0x0033, | ||
70 | 0x0034, 0x0035, 0x0036, 0x0037, | ||
71 | 0x0038, 0x0039, 0x003a, 0x003b, | ||
72 | 0x003c, 0x003d, 0x003e, 0x003f, | ||
73 | /* 0x40 */ | ||
74 | 0x0040, 0x0041, 0x0042, 0x0043, | ||
75 | 0x0044, 0x0045, 0x0046, 0x0047, | ||
76 | 0x0048, 0x0049, 0x004a, 0x004b, | ||
77 | 0x004c, 0x004d, 0x004e, 0x004f, | ||
78 | /* 0x50 */ | ||
79 | 0x0050, 0x0051, 0x0052, 0x0053, | ||
80 | 0x0054, 0x0055, 0x0056, 0x0057, | ||
81 | 0x0058, 0x0059, 0x005a, 0x005b, | ||
82 | 0x005c, 0x005d, 0x005e, 0x005f, | ||
83 | /* 0x60 */ | ||
84 | 0x0060, 0x0061, 0x0062, 0x0063, | ||
85 | 0x0064, 0x0065, 0x0066, 0x0067, | ||
86 | 0x0068, 0x0069, 0x006a, 0x006b, | ||
87 | 0x006c, 0x006d, 0x006e, 0x006f, | ||
88 | /* 0x70 */ | ||
89 | 0x0070, 0x0071, 0x0072, 0x0073, | ||
90 | 0x0074, 0x0075, 0x0076, 0x0077, | ||
91 | 0x0078, 0x0079, 0x007a, 0x007b, | ||
92 | 0x007c, 0x007d, 0x007e, 0x007f, | ||
93 | /* 0x80 */ | ||
94 | 0x0410, 0x0411, 0x0412, 0x0413, | ||
95 | 0x0414, 0x0415, 0x0416, 0x0417, | ||
96 | 0x0418, 0x0419, 0x041a, 0x041b, | ||
97 | 0x041c, 0x041d, 0x041e, 0x041f, | ||
98 | /* 0x90 */ | ||
99 | 0x0420, 0x0421, 0x0422, 0x0423, | ||
100 | 0x0424, 0x0425, 0x0426, 0x0427, | ||
101 | 0x0428, 0x0429, 0x042a, 0x042b, | ||
102 | 0x042c, 0x042d, 0x042e, 0x042f, | ||
103 | /* 0xa0 */ | ||
104 | 0x2020, 0x00b0, 0x0490, 0x00a3, | ||
105 | 0x00a7, 0x2022, 0x00b6, 0x0406, | ||
106 | 0x00ae, 0x00a9, 0x2122, 0x0402, | ||
107 | 0x0452, 0x2260, 0x0403, 0x0453, | ||
108 | /* 0xb0 */ | ||
109 | 0x221e, 0x00b1, 0x2264, 0x2265, | ||
110 | 0x0456, 0x00b5, 0x0491, 0x0408, | ||
111 | 0x0404, 0x0454, 0x0407, 0x0457, | ||
112 | 0x0409, 0x0459, 0x040a, 0x045a, | ||
113 | /* 0xc0 */ | ||
114 | 0x0458, 0x0405, 0x00ac, 0x221a, | ||
115 | 0x0192, 0x2248, 0x2206, 0x00ab, | ||
116 | 0x00bb, 0x2026, 0x00a0, 0x040b, | ||
117 | 0x045b, 0x040c, 0x045c, 0x0455, | ||
118 | /* 0xd0 */ | ||
119 | 0x2013, 0x2014, 0x201c, 0x201d, | ||
120 | 0x2018, 0x2019, 0x00f7, 0x201e, | ||
121 | 0x040e, 0x045e, 0x040f, 0x045f, | ||
122 | 0x2116, 0x0401, 0x0451, 0x044f, | ||
123 | /* 0xe0 */ | ||
124 | 0x0430, 0x0431, 0x0432, 0x0433, | ||
125 | 0x0434, 0x0435, 0x0436, 0x0437, | ||
126 | 0x0438, 0x0439, 0x043a, 0x043b, | ||
127 | 0x043c, 0x043d, 0x043e, 0x043f, | ||
128 | /* 0xf0 */ | ||
129 | 0x0440, 0x0441, 0x0442, 0x0443, | ||
130 | 0x0444, 0x0445, 0x0446, 0x0447, | ||
131 | 0x0448, 0x0449, 0x044a, 0x044b, | ||
132 | 0x044c, 0x044d, 0x044e, 0x20ac, | ||
133 | }; | ||
134 | |||
135 | static const unsigned char page00[256] = { | ||
136 | 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, /* 0x00-0x07 */ | ||
137 | 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, /* 0x08-0x0f */ | ||
138 | 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, /* 0x10-0x17 */ | ||
139 | 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, /* 0x18-0x1f */ | ||
140 | 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, /* 0x20-0x27 */ | ||
141 | 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, /* 0x28-0x2f */ | ||
142 | 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, /* 0x30-0x37 */ | ||
143 | 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, /* 0x38-0x3f */ | ||
144 | 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, /* 0x40-0x47 */ | ||
145 | 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, /* 0x48-0x4f */ | ||
146 | 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, /* 0x50-0x57 */ | ||
147 | 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f, /* 0x58-0x5f */ | ||
148 | 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, /* 0x60-0x67 */ | ||
149 | 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, /* 0x68-0x6f */ | ||
150 | 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, /* 0x70-0x77 */ | ||
151 | 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f, /* 0x78-0x7f */ | ||
152 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x80-0x87 */ | ||
153 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x88-0x8f */ | ||
154 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x90-0x97 */ | ||
155 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x98-0x9f */ | ||
156 | 0xca, 0x00, 0x00, 0xa3, 0x00, 0x00, 0x00, 0xa4, /* 0xa0-0xa7 */ | ||
157 | 0x00, 0xa9, 0x00, 0xc7, 0xc2, 0x00, 0xa8, 0x00, /* 0xa8-0xaf */ | ||
158 | 0xa1, 0xb1, 0x00, 0x00, 0x00, 0xb5, 0xa6, 0x00, /* 0xb0-0xb7 */ | ||
159 | 0x00, 0x00, 0x00, 0xc8, 0x00, 0x00, 0x00, 0x00, /* 0xb8-0xbf */ | ||
160 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc0-0xc7 */ | ||
161 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc8-0xcf */ | ||
162 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd0-0xd7 */ | ||
163 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd8-0xdf */ | ||
164 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe0-0xe7 */ | ||
165 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe8-0xef */ | ||
166 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd6, /* 0xf0-0xf7 */ | ||
167 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xf8-0xff */ | ||
168 | }; | ||
169 | |||
170 | static const unsigned char page01[256] = { | ||
171 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x00-0x07 */ | ||
172 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x08-0x0f */ | ||
173 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10-0x17 */ | ||
174 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x18-0x1f */ | ||
175 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x20-0x27 */ | ||
176 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x28-0x2f */ | ||
177 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x30-0x37 */ | ||
178 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x38-0x3f */ | ||
179 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x40-0x47 */ | ||
180 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x48-0x4f */ | ||
181 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x50-0x57 */ | ||
182 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x58-0x5f */ | ||
183 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x60-0x67 */ | ||
184 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x68-0x6f */ | ||
185 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */ | ||
186 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x78-0x7f */ | ||
187 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x80-0x87 */ | ||
188 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x88-0x8f */ | ||
189 | 0x00, 0x00, 0xc4, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x90-0x97 */ | ||
190 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x98-0x9f */ | ||
191 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa0-0xa7 */ | ||
192 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa8-0xaf */ | ||
193 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xb0-0xb7 */ | ||
194 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xb8-0xbf */ | ||
195 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc0-0xc7 */ | ||
196 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc8-0xcf */ | ||
197 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd0-0xd7 */ | ||
198 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd8-0xdf */ | ||
199 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe0-0xe7 */ | ||
200 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe8-0xef */ | ||
201 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xf0-0xf7 */ | ||
202 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xf8-0xff */ | ||
203 | }; | ||
204 | |||
205 | static const unsigned char page04[256] = { | ||
206 | 0x00, 0xdd, 0xab, 0xae, 0xb8, 0xc1, 0xa7, 0xba, /* 0x00-0x07 */ | ||
207 | 0xb7, 0xbc, 0xbe, 0xcb, 0xcd, 0x00, 0xd8, 0xda, /* 0x08-0x0f */ | ||
208 | 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, /* 0x10-0x17 */ | ||
209 | 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f, /* 0x18-0x1f */ | ||
210 | 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, /* 0x20-0x27 */ | ||
211 | 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f, /* 0x28-0x2f */ | ||
212 | 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, /* 0x30-0x37 */ | ||
213 | 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, /* 0x38-0x3f */ | ||
214 | 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, /* 0x40-0x47 */ | ||
215 | 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xdf, /* 0x48-0x4f */ | ||
216 | 0x00, 0xde, 0xac, 0xaf, 0xb9, 0xcf, 0xb4, 0xbb, /* 0x50-0x57 */ | ||
217 | 0xc0, 0xbd, 0xbf, 0xcc, 0xce, 0x00, 0xd9, 0xdb, /* 0x58-0x5f */ | ||
218 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x60-0x67 */ | ||
219 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x68-0x6f */ | ||
220 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */ | ||
221 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x78-0x7f */ | ||
222 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x80-0x87 */ | ||
223 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x88-0x8f */ | ||
224 | 0xa2, 0xb6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x90-0x97 */ | ||
225 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x98-0x9f */ | ||
226 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa0-0xa7 */ | ||
227 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa8-0xaf */ | ||
228 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xb0-0xb7 */ | ||
229 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xb8-0xbf */ | ||
230 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc0-0xc7 */ | ||
231 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc8-0xcf */ | ||
232 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd0-0xd7 */ | ||
233 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd8-0xdf */ | ||
234 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe0-0xe7 */ | ||
235 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe8-0xef */ | ||
236 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xf0-0xf7 */ | ||
237 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xf8-0xff */ | ||
238 | }; | ||
239 | |||
240 | static const unsigned char page20[256] = { | ||
241 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x00-0x07 */ | ||
242 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x08-0x0f */ | ||
243 | 0x00, 0x00, 0x00, 0xd0, 0xd1, 0x00, 0x00, 0x00, /* 0x10-0x17 */ | ||
244 | 0xd4, 0xd5, 0x00, 0x00, 0xd2, 0xd3, 0xd7, 0x00, /* 0x18-0x1f */ | ||
245 | 0xa0, 0x00, 0xa5, 0x00, 0x00, 0x00, 0xc9, 0x00, /* 0x20-0x27 */ | ||
246 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x28-0x2f */ | ||
247 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x30-0x37 */ | ||
248 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x38-0x3f */ | ||
249 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x40-0x47 */ | ||
250 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x48-0x4f */ | ||
251 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x50-0x57 */ | ||
252 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x58-0x5f */ | ||
253 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x60-0x67 */ | ||
254 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x68-0x6f */ | ||
255 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */ | ||
256 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x78-0x7f */ | ||
257 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x80-0x87 */ | ||
258 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x88-0x8f */ | ||
259 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x90-0x97 */ | ||
260 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x98-0x9f */ | ||
261 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa0-0xa7 */ | ||
262 | 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, /* 0xa8-0xaf */ | ||
263 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xb0-0xb7 */ | ||
264 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xb8-0xbf */ | ||
265 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc0-0xc7 */ | ||
266 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc8-0xcf */ | ||
267 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd0-0xd7 */ | ||
268 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd8-0xdf */ | ||
269 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe0-0xe7 */ | ||
270 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe8-0xef */ | ||
271 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xf0-0xf7 */ | ||
272 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xf8-0xff */ | ||
273 | }; | ||
274 | |||
275 | static const unsigned char page21[256] = { | ||
276 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x00-0x07 */ | ||
277 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x08-0x0f */ | ||
278 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xdc, 0x00, /* 0x10-0x17 */ | ||
279 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x18-0x1f */ | ||
280 | 0x00, 0x00, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x20-0x27 */ | ||
281 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x28-0x2f */ | ||
282 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x30-0x37 */ | ||
283 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x38-0x3f */ | ||
284 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x40-0x47 */ | ||
285 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x48-0x4f */ | ||
286 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x50-0x57 */ | ||
287 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x58-0x5f */ | ||
288 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x60-0x67 */ | ||
289 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x68-0x6f */ | ||
290 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */ | ||
291 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x78-0x7f */ | ||
292 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x80-0x87 */ | ||
293 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x88-0x8f */ | ||
294 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x90-0x97 */ | ||
295 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x98-0x9f */ | ||
296 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa0-0xa7 */ | ||
297 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa8-0xaf */ | ||
298 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xb0-0xb7 */ | ||
299 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xb8-0xbf */ | ||
300 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc0-0xc7 */ | ||
301 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc8-0xcf */ | ||
302 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd0-0xd7 */ | ||
303 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd8-0xdf */ | ||
304 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe0-0xe7 */ | ||
305 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe8-0xef */ | ||
306 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xf0-0xf7 */ | ||
307 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xf8-0xff */ | ||
308 | }; | ||
309 | |||
310 | static const unsigned char page22[256] = { | ||
311 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc6, 0x00, /* 0x00-0x07 */ | ||
312 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x08-0x0f */ | ||
313 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10-0x17 */ | ||
314 | 0x00, 0x00, 0xc3, 0x00, 0x00, 0x00, 0xb0, 0x00, /* 0x18-0x1f */ | ||
315 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x20-0x27 */ | ||
316 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x28-0x2f */ | ||
317 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x30-0x37 */ | ||
318 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x38-0x3f */ | ||
319 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x40-0x47 */ | ||
320 | 0xc5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x48-0x4f */ | ||
321 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x50-0x57 */ | ||
322 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x58-0x5f */ | ||
323 | 0xad, 0x00, 0x00, 0x00, 0xb2, 0xb3, 0x00, 0x00, /* 0x60-0x67 */ | ||
324 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x68-0x6f */ | ||
325 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */ | ||
326 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x78-0x7f */ | ||
327 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x80-0x87 */ | ||
328 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x88-0x8f */ | ||
329 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x90-0x97 */ | ||
330 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x98-0x9f */ | ||
331 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa0-0xa7 */ | ||
332 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa8-0xaf */ | ||
333 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xb0-0xb7 */ | ||
334 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xb8-0xbf */ | ||
335 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc0-0xc7 */ | ||
336 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc8-0xcf */ | ||
337 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd0-0xd7 */ | ||
338 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd8-0xdf */ | ||
339 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe0-0xe7 */ | ||
340 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe8-0xef */ | ||
341 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xf0-0xf7 */ | ||
342 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xf8-0xff */ | ||
343 | }; | ||
344 | |||
345 | static const unsigned char *const page_uni2charset[256] = { | ||
346 | page00, page01, NULL, NULL, page04, NULL, NULL, NULL, | ||
347 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
348 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
349 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
350 | page20, page21, page22, NULL, NULL, NULL, NULL, NULL, | ||
351 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
352 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
353 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
354 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
355 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
356 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
357 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
358 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
359 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
360 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
361 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
362 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
363 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
364 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
365 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
366 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
367 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
368 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
369 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
370 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
371 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
372 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
373 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
374 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
375 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
376 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
377 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
378 | }; | ||
379 | |||
380 | static const unsigned char charset2lower[256] = { | ||
381 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x00-0x07 */ | ||
382 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x08-0x0f */ | ||
383 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x10-0x17 */ | ||
384 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x18-0x1f */ | ||
385 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x20-0x27 */ | ||
386 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x28-0x2f */ | ||
387 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x30-0x37 */ | ||
388 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x38-0x3f */ | ||
389 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x40-0x47 */ | ||
390 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x48-0x4f */ | ||
391 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x50-0x57 */ | ||
392 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x58-0x5f */ | ||
393 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x60-0x67 */ | ||
394 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x68-0x6f */ | ||
395 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x70-0x77 */ | ||
396 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x78-0x7f */ | ||
397 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x80-0x87 */ | ||
398 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x88-0x8f */ | ||
399 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x90-0x97 */ | ||
400 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x98-0x9f */ | ||
401 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0xa0-0xa7 */ | ||
402 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0xa8-0xaf */ | ||
403 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0xb0-0xb7 */ | ||
404 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0xb8-0xbf */ | ||
405 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0xc0-0xc7 */ | ||
406 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0xc8-0xcf */ | ||
407 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0xd0-0xd7 */ | ||
408 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0xd8-0xdf */ | ||
409 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0xe0-0xe7 */ | ||
410 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0xe8-0xef */ | ||
411 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0xf0-0xf7 */ | ||
412 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0xf8-0xff */ | ||
413 | }; | ||
414 | |||
415 | static const unsigned char charset2upper[256] = { | ||
416 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x00-0x07 */ | ||
417 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x08-0x0f */ | ||
418 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x10-0x17 */ | ||
419 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x18-0x1f */ | ||
420 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x20-0x27 */ | ||
421 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x28-0x2f */ | ||
422 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x30-0x37 */ | ||
423 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x38-0x3f */ | ||
424 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x40-0x47 */ | ||
425 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x48-0x4f */ | ||
426 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x50-0x57 */ | ||
427 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x58-0x5f */ | ||
428 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x60-0x67 */ | ||
429 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x68-0x6f */ | ||
430 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x70-0x77 */ | ||
431 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x78-0x7f */ | ||
432 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x80-0x87 */ | ||
433 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x88-0x8f */ | ||
434 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x90-0x97 */ | ||
435 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x98-0x9f */ | ||
436 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0xa0-0xa7 */ | ||
437 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0xa8-0xaf */ | ||
438 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0xb0-0xb7 */ | ||
439 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0xb8-0xbf */ | ||
440 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0xc0-0xc7 */ | ||
441 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0xc8-0xcf */ | ||
442 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0xd0-0xd7 */ | ||
443 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0xd8-0xdf */ | ||
444 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0xe0-0xe7 */ | ||
445 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0xe8-0xef */ | ||
446 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0xf0-0xf7 */ | ||
447 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0xf8-0xff */ | ||
448 | }; | ||
449 | |||
450 | static int uni2char(wchar_t uni, unsigned char *out, int boundlen) | ||
451 | { | ||
452 | const unsigned char *uni2charset; | ||
453 | unsigned char cl = uni & 0x00ff; | ||
454 | unsigned char ch = (uni & 0xff00) >> 8; | ||
455 | |||
456 | if (boundlen <= 0) | ||
457 | return -ENAMETOOLONG; | ||
458 | |||
459 | uni2charset = page_uni2charset[ch]; | ||
460 | if (uni2charset && uni2charset[cl]) | ||
461 | out[0] = uni2charset[cl]; | ||
462 | else | ||
463 | return -EINVAL; | ||
464 | return 1; | ||
465 | } | ||
466 | |||
467 | static int char2uni(const unsigned char *rawstring, int boundlen, wchar_t *uni) | ||
468 | { | ||
469 | *uni = charset2uni[*rawstring]; | ||
470 | if (*uni == 0x0000) | ||
471 | return -EINVAL; | ||
472 | return 1; | ||
473 | } | ||
474 | |||
475 | static struct nls_table table = { | ||
476 | .charset = "maccyrillic", | ||
477 | .uni2char = uni2char, | ||
478 | .char2uni = char2uni, | ||
479 | .charset2lower = charset2lower, | ||
480 | .charset2upper = charset2upper, | ||
481 | .owner = THIS_MODULE, | ||
482 | }; | ||
483 | |||
484 | static int __init init_nls_maccyrillic(void) | ||
485 | { | ||
486 | return register_nls(&table); | ||
487 | } | ||
488 | |||
489 | static void __exit exit_nls_maccyrillic(void) | ||
490 | { | ||
491 | unregister_nls(&table); | ||
492 | } | ||
493 | |||
494 | module_init(init_nls_maccyrillic) | ||
495 | module_exit(exit_nls_maccyrillic) | ||
496 | |||
497 | MODULE_LICENSE("Dual BSD/GPL"); | ||
diff --git a/fs/nls/nls_macgaelic.c b/fs/nls/nls_macgaelic.c new file mode 100644 index 000000000000..615d8e128f14 --- /dev/null +++ b/fs/nls/nls_macgaelic.c | |||
@@ -0,0 +1,567 @@ | |||
1 | /* | ||
2 | * linux/fs/nls/nls_macgaelic.c | ||
3 | * | ||
4 | * Charset macgaelic translation tables. | ||
5 | * Generated automatically from the Unicode and charset | ||
6 | * tables from the Unicode Organization (www.unicode.org). | ||
7 | * The Unicode to charset table has only exact mappings. | ||
8 | */ | ||
9 | |||
10 | /* | ||
11 | * COPYRIGHT AND PERMISSION NOTICE | ||
12 | * | ||
13 | * Copyright 1991-2012 Unicode, Inc. All rights reserved. Distributed under | ||
14 | * the Terms of Use in http://www.unicode.org/copyright.html. | ||
15 | * | ||
16 | * Permission is hereby granted, free of charge, to any person obtaining a | ||
17 | * copy of the Unicode data files and any associated documentation (the "Data | ||
18 | * Files") or Unicode software and any associated documentation (the | ||
19 | * "Software") to deal in the Data Files or Software without restriction, | ||
20 | * including without limitation the rights to use, copy, modify, merge, | ||
21 | * publish, distribute, and/or sell copies of the Data Files or Software, and | ||
22 | * to permit persons to whom the Data Files or Software are furnished to do | ||
23 | * so, provided that (a) the above copyright notice(s) and this permission | ||
24 | * notice appear with all copies of the Data Files or Software, (b) both the | ||
25 | * above copyright notice(s) and this permission notice appear in associated | ||
26 | * documentation, and (c) there is clear notice in each modified Data File or | ||
27 | * in the Software as well as in the documentation associated with the Data | ||
28 | * File(s) or Software that the data or software has been modified. | ||
29 | * | ||
30 | * THE DATA FILES AND SOFTWARE ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY | ||
31 | * KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF | ||
32 | * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF | ||
33 | * THIRD PARTY RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS | ||
34 | * INCLUDED IN THIS NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT | ||
35 | * OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF | ||
36 | * USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR | ||
37 | * OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR | ||
38 | * PERFORMANCE OF THE DATA FILES OR SOFTWARE. | ||
39 | * | ||
40 | * Except as contained in this notice, the name of a copyright holder shall | ||
41 | * not be used in advertising or otherwise to promote the sale, use or other | ||
42 | * dealings in these Data Files or Software without prior written | ||
43 | * authorization of the copyright holder. | ||
44 | */ | ||
45 | |||
46 | #include <linux/module.h> | ||
47 | #include <linux/kernel.h> | ||
48 | #include <linux/string.h> | ||
49 | #include <linux/nls.h> | ||
50 | #include <linux/errno.h> | ||
51 | |||
52 | static const wchar_t charset2uni[256] = { | ||
53 | /* 0x00 */ | ||
54 | 0x0000, 0x0001, 0x0002, 0x0003, | ||
55 | 0x0004, 0x0005, 0x0006, 0x0007, | ||
56 | 0x0008, 0x0009, 0x000a, 0x000b, | ||
57 | 0x000c, 0x000d, 0x000e, 0x000f, | ||
58 | /* 0x10 */ | ||
59 | 0x0010, 0x0011, 0x0012, 0x0013, | ||
60 | 0x0014, 0x0015, 0x0016, 0x0017, | ||
61 | 0x0018, 0x0019, 0x001a, 0x001b, | ||
62 | 0x001c, 0x001d, 0x001e, 0x001f, | ||
63 | /* 0x20 */ | ||
64 | 0x0020, 0x0021, 0x0022, 0x0023, | ||
65 | 0x0024, 0x0025, 0x0026, 0x0027, | ||
66 | 0x0028, 0x0029, 0x002a, 0x002b, | ||
67 | 0x002c, 0x002d, 0x002e, 0x002f, | ||
68 | /* 0x30 */ | ||
69 | 0x0030, 0x0031, 0x0032, 0x0033, | ||
70 | 0x0034, 0x0035, 0x0036, 0x0037, | ||
71 | 0x0038, 0x0039, 0x003a, 0x003b, | ||
72 | 0x003c, 0x003d, 0x003e, 0x003f, | ||
73 | /* 0x40 */ | ||
74 | 0x0040, 0x0041, 0x0042, 0x0043, | ||
75 | 0x0044, 0x0045, 0x0046, 0x0047, | ||
76 | 0x0048, 0x0049, 0x004a, 0x004b, | ||
77 | 0x004c, 0x004d, 0x004e, 0x004f, | ||
78 | /* 0x50 */ | ||
79 | 0x0050, 0x0051, 0x0052, 0x0053, | ||
80 | 0x0054, 0x0055, 0x0056, 0x0057, | ||
81 | 0x0058, 0x0059, 0x005a, 0x005b, | ||
82 | 0x005c, 0x005d, 0x005e, 0x005f, | ||
83 | /* 0x60 */ | ||
84 | 0x0060, 0x0061, 0x0062, 0x0063, | ||
85 | 0x0064, 0x0065, 0x0066, 0x0067, | ||
86 | 0x0068, 0x0069, 0x006a, 0x006b, | ||
87 | 0x006c, 0x006d, 0x006e, 0x006f, | ||
88 | /* 0x70 */ | ||
89 | 0x0070, 0x0071, 0x0072, 0x0073, | ||
90 | 0x0074, 0x0075, 0x0076, 0x0077, | ||
91 | 0x0078, 0x0079, 0x007a, 0x007b, | ||
92 | 0x007c, 0x007d, 0x007e, 0x007f, | ||
93 | /* 0x80 */ | ||
94 | 0x00c4, 0x00c5, 0x00c7, 0x00c9, | ||
95 | 0x00d1, 0x00d6, 0x00dc, 0x00e1, | ||
96 | 0x00e0, 0x00e2, 0x00e4, 0x00e3, | ||
97 | 0x00e5, 0x00e7, 0x00e9, 0x00e8, | ||
98 | /* 0x90 */ | ||
99 | 0x00ea, 0x00eb, 0x00ed, 0x00ec, | ||
100 | 0x00ee, 0x00ef, 0x00f1, 0x00f3, | ||
101 | 0x00f2, 0x00f4, 0x00f6, 0x00f5, | ||
102 | 0x00fa, 0x00f9, 0x00fb, 0x00fc, | ||
103 | /* 0xa0 */ | ||
104 | 0x2020, 0x00b0, 0x00a2, 0x00a3, | ||
105 | 0x00a7, 0x2022, 0x00b6, 0x00df, | ||
106 | 0x00ae, 0x00a9, 0x2122, 0x00b4, | ||
107 | 0x00a8, 0x2260, 0x00c6, 0x00d8, | ||
108 | /* 0xb0 */ | ||
109 | 0x1e02, 0x00b1, 0x2264, 0x2265, | ||
110 | 0x1e03, 0x010a, 0x010b, 0x1e0a, | ||
111 | 0x1e0b, 0x1e1e, 0x1e1f, 0x0120, | ||
112 | 0x0121, 0x1e40, 0x00e6, 0x00f8, | ||
113 | /* 0xc0 */ | ||
114 | 0x1e41, 0x1e56, 0x1e57, 0x027c, | ||
115 | 0x0192, 0x017f, 0x1e60, 0x00ab, | ||
116 | 0x00bb, 0x2026, 0x00a0, 0x00c0, | ||
117 | 0x00c3, 0x00d5, 0x0152, 0x0153, | ||
118 | /* 0xd0 */ | ||
119 | 0x2013, 0x2014, 0x201c, 0x201d, | ||
120 | 0x2018, 0x2019, 0x1e61, 0x1e9b, | ||
121 | 0x00ff, 0x0178, 0x1e6a, 0x20ac, | ||
122 | 0x2039, 0x203a, 0x0176, 0x0177, | ||
123 | /* 0xe0 */ | ||
124 | 0x1e6b, 0x00b7, 0x1ef2, 0x1ef3, | ||
125 | 0x204a, 0x00c2, 0x00ca, 0x00c1, | ||
126 | 0x00cb, 0x00c8, 0x00cd, 0x00ce, | ||
127 | 0x00cf, 0x00cc, 0x00d3, 0x00d4, | ||
128 | /* 0xf0 */ | ||
129 | 0x2663, 0x00d2, 0x00da, 0x00db, | ||
130 | 0x00d9, 0x0131, 0x00dd, 0x00fd, | ||
131 | 0x0174, 0x0175, 0x1e84, 0x1e85, | ||
132 | 0x1e80, 0x1e81, 0x1e82, 0x1e83, | ||
133 | }; | ||
134 | |||
135 | static const unsigned char page00[256] = { | ||
136 | 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, /* 0x00-0x07 */ | ||
137 | 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, /* 0x08-0x0f */ | ||
138 | 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, /* 0x10-0x17 */ | ||
139 | 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, /* 0x18-0x1f */ | ||
140 | 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, /* 0x20-0x27 */ | ||
141 | 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, /* 0x28-0x2f */ | ||
142 | 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, /* 0x30-0x37 */ | ||
143 | 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, /* 0x38-0x3f */ | ||
144 | 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, /* 0x40-0x47 */ | ||
145 | 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, /* 0x48-0x4f */ | ||
146 | 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, /* 0x50-0x57 */ | ||
147 | 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f, /* 0x58-0x5f */ | ||
148 | 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, /* 0x60-0x67 */ | ||
149 | 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, /* 0x68-0x6f */ | ||
150 | 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, /* 0x70-0x77 */ | ||
151 | 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f, /* 0x78-0x7f */ | ||
152 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x80-0x87 */ | ||
153 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x88-0x8f */ | ||
154 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x90-0x97 */ | ||
155 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x98-0x9f */ | ||
156 | 0xca, 0x00, 0xa2, 0xa3, 0x00, 0x00, 0x00, 0xa4, /* 0xa0-0xa7 */ | ||
157 | 0xac, 0xa9, 0x00, 0xc7, 0x00, 0x00, 0xa8, 0x00, /* 0xa8-0xaf */ | ||
158 | 0xa1, 0xb1, 0x00, 0x00, 0xab, 0x00, 0xa6, 0xe1, /* 0xb0-0xb7 */ | ||
159 | 0x00, 0x00, 0x00, 0xc8, 0x00, 0x00, 0x00, 0x00, /* 0xb8-0xbf */ | ||
160 | 0xcb, 0xe7, 0xe5, 0xcc, 0x80, 0x81, 0xae, 0x82, /* 0xc0-0xc7 */ | ||
161 | 0xe9, 0x83, 0xe6, 0xe8, 0xed, 0xea, 0xeb, 0xec, /* 0xc8-0xcf */ | ||
162 | 0x00, 0x84, 0xf1, 0xee, 0xef, 0xcd, 0x85, 0x00, /* 0xd0-0xd7 */ | ||
163 | 0xaf, 0xf4, 0xf2, 0xf3, 0x86, 0xf6, 0x00, 0xa7, /* 0xd8-0xdf */ | ||
164 | 0x88, 0x87, 0x89, 0x8b, 0x8a, 0x8c, 0xbe, 0x8d, /* 0xe0-0xe7 */ | ||
165 | 0x8f, 0x8e, 0x90, 0x91, 0x93, 0x92, 0x94, 0x95, /* 0xe8-0xef */ | ||
166 | 0x00, 0x96, 0x98, 0x97, 0x99, 0x9b, 0x9a, 0x00, /* 0xf0-0xf7 */ | ||
167 | 0xbf, 0x9d, 0x9c, 0x9e, 0x9f, 0xf7, 0x00, 0xd8, /* 0xf8-0xff */ | ||
168 | }; | ||
169 | |||
170 | static const unsigned char page01[256] = { | ||
171 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x00-0x07 */ | ||
172 | 0x00, 0x00, 0xb5, 0xb6, 0x00, 0x00, 0x00, 0x00, /* 0x08-0x0f */ | ||
173 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10-0x17 */ | ||
174 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x18-0x1f */ | ||
175 | 0xbb, 0xbc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x20-0x27 */ | ||
176 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x28-0x2f */ | ||
177 | 0x00, 0xf5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x30-0x37 */ | ||
178 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x38-0x3f */ | ||
179 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x40-0x47 */ | ||
180 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x48-0x4f */ | ||
181 | 0x00, 0x00, 0xce, 0xcf, 0x00, 0x00, 0x00, 0x00, /* 0x50-0x57 */ | ||
182 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x58-0x5f */ | ||
183 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x60-0x67 */ | ||
184 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x68-0x6f */ | ||
185 | 0x00, 0x00, 0x00, 0x00, 0xf8, 0xf9, 0xde, 0xdf, /* 0x70-0x77 */ | ||
186 | 0xd9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc5, /* 0x78-0x7f */ | ||
187 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x80-0x87 */ | ||
188 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x88-0x8f */ | ||
189 | 0x00, 0x00, 0xc4, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x90-0x97 */ | ||
190 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x98-0x9f */ | ||
191 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa0-0xa7 */ | ||
192 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa8-0xaf */ | ||
193 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xb0-0xb7 */ | ||
194 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xb8-0xbf */ | ||
195 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc0-0xc7 */ | ||
196 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc8-0xcf */ | ||
197 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd0-0xd7 */ | ||
198 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd8-0xdf */ | ||
199 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe0-0xe7 */ | ||
200 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe8-0xef */ | ||
201 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xf0-0xf7 */ | ||
202 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xf8-0xff */ | ||
203 | }; | ||
204 | |||
205 | static const unsigned char page02[256] = { | ||
206 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x00-0x07 */ | ||
207 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x08-0x0f */ | ||
208 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10-0x17 */ | ||
209 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x18-0x1f */ | ||
210 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x20-0x27 */ | ||
211 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x28-0x2f */ | ||
212 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x30-0x37 */ | ||
213 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x38-0x3f */ | ||
214 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x40-0x47 */ | ||
215 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x48-0x4f */ | ||
216 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x50-0x57 */ | ||
217 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x58-0x5f */ | ||
218 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x60-0x67 */ | ||
219 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x68-0x6f */ | ||
220 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */ | ||
221 | 0x00, 0x00, 0x00, 0x00, 0xc3, 0x00, 0x00, 0x00, /* 0x78-0x7f */ | ||
222 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x80-0x87 */ | ||
223 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x88-0x8f */ | ||
224 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x90-0x97 */ | ||
225 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x98-0x9f */ | ||
226 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa0-0xa7 */ | ||
227 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa8-0xaf */ | ||
228 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xb0-0xb7 */ | ||
229 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xb8-0xbf */ | ||
230 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc0-0xc7 */ | ||
231 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc8-0xcf */ | ||
232 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd0-0xd7 */ | ||
233 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd8-0xdf */ | ||
234 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe0-0xe7 */ | ||
235 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe8-0xef */ | ||
236 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xf0-0xf7 */ | ||
237 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xf8-0xff */ | ||
238 | }; | ||
239 | |||
240 | static const unsigned char page1e[256] = { | ||
241 | 0x00, 0x00, 0xb0, 0xb4, 0x00, 0x00, 0x00, 0x00, /* 0x00-0x07 */ | ||
242 | 0x00, 0x00, 0xb7, 0xb8, 0x00, 0x00, 0x00, 0x00, /* 0x08-0x0f */ | ||
243 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10-0x17 */ | ||
244 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb9, 0xba, /* 0x18-0x1f */ | ||
245 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x20-0x27 */ | ||
246 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x28-0x2f */ | ||
247 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x30-0x37 */ | ||
248 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x38-0x3f */ | ||
249 | 0xbd, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x40-0x47 */ | ||
250 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x48-0x4f */ | ||
251 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc1, 0xc2, /* 0x50-0x57 */ | ||
252 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x58-0x5f */ | ||
253 | 0xc6, 0xd6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x60-0x67 */ | ||
254 | 0x00, 0x00, 0xda, 0xe0, 0x00, 0x00, 0x00, 0x00, /* 0x68-0x6f */ | ||
255 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */ | ||
256 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x78-0x7f */ | ||
257 | 0xfc, 0xfd, 0xfe, 0xff, 0xfa, 0xfb, 0x00, 0x00, /* 0x80-0x87 */ | ||
258 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x88-0x8f */ | ||
259 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x90-0x97 */ | ||
260 | 0x00, 0x00, 0x00, 0xd7, 0x00, 0x00, 0x00, 0x00, /* 0x98-0x9f */ | ||
261 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa0-0xa7 */ | ||
262 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa8-0xaf */ | ||
263 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xb0-0xb7 */ | ||
264 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xb8-0xbf */ | ||
265 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc0-0xc7 */ | ||
266 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc8-0xcf */ | ||
267 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd0-0xd7 */ | ||
268 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd8-0xdf */ | ||
269 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe0-0xe7 */ | ||
270 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe8-0xef */ | ||
271 | 0x00, 0x00, 0xe2, 0xe3, 0x00, 0x00, 0x00, 0x00, /* 0xf0-0xf7 */ | ||
272 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xf8-0xff */ | ||
273 | }; | ||
274 | |||
275 | static const unsigned char page20[256] = { | ||
276 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x00-0x07 */ | ||
277 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x08-0x0f */ | ||
278 | 0x00, 0x00, 0x00, 0xd0, 0xd1, 0x00, 0x00, 0x00, /* 0x10-0x17 */ | ||
279 | 0xd4, 0xd5, 0x00, 0x00, 0xd2, 0xd3, 0x00, 0x00, /* 0x18-0x1f */ | ||
280 | 0xa0, 0x00, 0xa5, 0x00, 0x00, 0x00, 0xc9, 0x00, /* 0x20-0x27 */ | ||
281 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x28-0x2f */ | ||
282 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x30-0x37 */ | ||
283 | 0x00, 0xdc, 0xdd, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x38-0x3f */ | ||
284 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x40-0x47 */ | ||
285 | 0x00, 0x00, 0xe4, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x48-0x4f */ | ||
286 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x50-0x57 */ | ||
287 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x58-0x5f */ | ||
288 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x60-0x67 */ | ||
289 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x68-0x6f */ | ||
290 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */ | ||
291 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x78-0x7f */ | ||
292 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x80-0x87 */ | ||
293 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x88-0x8f */ | ||
294 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x90-0x97 */ | ||
295 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x98-0x9f */ | ||
296 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa0-0xa7 */ | ||
297 | 0x00, 0x00, 0x00, 0x00, 0xdb, 0x00, 0x00, 0x00, /* 0xa8-0xaf */ | ||
298 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xb0-0xb7 */ | ||
299 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xb8-0xbf */ | ||
300 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc0-0xc7 */ | ||
301 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc8-0xcf */ | ||
302 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd0-0xd7 */ | ||
303 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd8-0xdf */ | ||
304 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe0-0xe7 */ | ||
305 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe8-0xef */ | ||
306 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xf0-0xf7 */ | ||
307 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xf8-0xff */ | ||
308 | }; | ||
309 | |||
310 | static const unsigned char page21[256] = { | ||
311 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x00-0x07 */ | ||
312 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x08-0x0f */ | ||
313 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10-0x17 */ | ||
314 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x18-0x1f */ | ||
315 | 0x00, 0x00, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x20-0x27 */ | ||
316 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x28-0x2f */ | ||
317 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x30-0x37 */ | ||
318 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x38-0x3f */ | ||
319 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x40-0x47 */ | ||
320 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x48-0x4f */ | ||
321 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x50-0x57 */ | ||
322 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x58-0x5f */ | ||
323 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x60-0x67 */ | ||
324 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x68-0x6f */ | ||
325 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */ | ||
326 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x78-0x7f */ | ||
327 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x80-0x87 */ | ||
328 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x88-0x8f */ | ||
329 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x90-0x97 */ | ||
330 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x98-0x9f */ | ||
331 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa0-0xa7 */ | ||
332 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa8-0xaf */ | ||
333 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xb0-0xb7 */ | ||
334 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xb8-0xbf */ | ||
335 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc0-0xc7 */ | ||
336 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc8-0xcf */ | ||
337 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd0-0xd7 */ | ||
338 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd8-0xdf */ | ||
339 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe0-0xe7 */ | ||
340 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe8-0xef */ | ||
341 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xf0-0xf7 */ | ||
342 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xf8-0xff */ | ||
343 | }; | ||
344 | |||
345 | static const unsigned char page22[256] = { | ||
346 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x00-0x07 */ | ||
347 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x08-0x0f */ | ||
348 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10-0x17 */ | ||
349 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x18-0x1f */ | ||
350 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x20-0x27 */ | ||
351 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x28-0x2f */ | ||
352 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x30-0x37 */ | ||
353 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x38-0x3f */ | ||
354 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x40-0x47 */ | ||
355 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x48-0x4f */ | ||
356 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x50-0x57 */ | ||
357 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x58-0x5f */ | ||
358 | 0xad, 0x00, 0x00, 0x00, 0xb2, 0xb3, 0x00, 0x00, /* 0x60-0x67 */ | ||
359 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x68-0x6f */ | ||
360 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */ | ||
361 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x78-0x7f */ | ||
362 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x80-0x87 */ | ||
363 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x88-0x8f */ | ||
364 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x90-0x97 */ | ||
365 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x98-0x9f */ | ||
366 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa0-0xa7 */ | ||
367 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa8-0xaf */ | ||
368 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xb0-0xb7 */ | ||
369 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xb8-0xbf */ | ||
370 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc0-0xc7 */ | ||
371 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc8-0xcf */ | ||
372 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd0-0xd7 */ | ||
373 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd8-0xdf */ | ||
374 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe0-0xe7 */ | ||
375 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe8-0xef */ | ||
376 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xf0-0xf7 */ | ||
377 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xf8-0xff */ | ||
378 | }; | ||
379 | |||
380 | static const unsigned char page26[256] = { | ||
381 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x00-0x07 */ | ||
382 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x08-0x0f */ | ||
383 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10-0x17 */ | ||
384 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x18-0x1f */ | ||
385 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x20-0x27 */ | ||
386 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x28-0x2f */ | ||
387 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x30-0x37 */ | ||
388 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x38-0x3f */ | ||
389 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x40-0x47 */ | ||
390 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x48-0x4f */ | ||
391 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x50-0x57 */ | ||
392 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x58-0x5f */ | ||
393 | 0x00, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x00, /* 0x60-0x67 */ | ||
394 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x68-0x6f */ | ||
395 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */ | ||
396 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x78-0x7f */ | ||
397 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x80-0x87 */ | ||
398 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x88-0x8f */ | ||
399 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x90-0x97 */ | ||
400 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x98-0x9f */ | ||
401 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa0-0xa7 */ | ||
402 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa8-0xaf */ | ||
403 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xb0-0xb7 */ | ||
404 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xb8-0xbf */ | ||
405 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc0-0xc7 */ | ||
406 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc8-0xcf */ | ||
407 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd0-0xd7 */ | ||
408 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd8-0xdf */ | ||
409 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe0-0xe7 */ | ||
410 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe8-0xef */ | ||
411 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xf0-0xf7 */ | ||
412 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xf8-0xff */ | ||
413 | }; | ||
414 | |||
415 | static const unsigned char *const page_uni2charset[256] = { | ||
416 | page00, page01, page02, NULL, NULL, NULL, NULL, NULL, | ||
417 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
418 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
419 | NULL, NULL, NULL, NULL, NULL, NULL, page1e, NULL, | ||
420 | page20, page21, page22, NULL, NULL, NULL, page26, NULL, | ||
421 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
422 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
423 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
424 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
425 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
426 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
427 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
428 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
429 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
430 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
431 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
432 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
433 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
434 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
435 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
436 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
437 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
438 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
439 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
440 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
441 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
442 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
443 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
444 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
445 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
446 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
447 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
448 | }; | ||
449 | |||
450 | static const unsigned char charset2lower[256] = { | ||
451 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x00-0x07 */ | ||
452 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x08-0x0f */ | ||
453 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x10-0x17 */ | ||
454 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x18-0x1f */ | ||
455 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x20-0x27 */ | ||
456 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x28-0x2f */ | ||
457 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x30-0x37 */ | ||
458 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x38-0x3f */ | ||
459 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x40-0x47 */ | ||
460 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x48-0x4f */ | ||
461 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x50-0x57 */ | ||
462 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x58-0x5f */ | ||
463 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x60-0x67 */ | ||
464 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x68-0x6f */ | ||
465 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x70-0x77 */ | ||
466 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x78-0x7f */ | ||
467 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x80-0x87 */ | ||
468 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x88-0x8f */ | ||
469 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x90-0x97 */ | ||
470 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x98-0x9f */ | ||
471 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0xa0-0xa7 */ | ||
472 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0xa8-0xaf */ | ||
473 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0xb0-0xb7 */ | ||
474 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0xb8-0xbf */ | ||
475 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0xc0-0xc7 */ | ||
476 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0xc8-0xcf */ | ||
477 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0xd0-0xd7 */ | ||
478 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0xd8-0xdf */ | ||
479 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0xe0-0xe7 */ | ||
480 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0xe8-0xef */ | ||
481 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0xf0-0xf7 */ | ||
482 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0xf8-0xff */ | ||
483 | }; | ||
484 | |||
485 | static const unsigned char charset2upper[256] = { | ||
486 | 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, /* 0x00-0x07 */ | ||
487 | 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, /* 0x08-0x0f */ | ||
488 | 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, /* 0x10-0x17 */ | ||
489 | 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, /* 0x18-0x1f */ | ||
490 | 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, /* 0x20-0x27 */ | ||
491 | 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, /* 0x28-0x2f */ | ||
492 | 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, /* 0x30-0x37 */ | ||
493 | 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, /* 0x38-0x3f */ | ||
494 | 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, /* 0x40-0x47 */ | ||
495 | 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, /* 0x48-0x4f */ | ||
496 | 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, /* 0x50-0x57 */ | ||
497 | 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, /* 0x58-0x5f */ | ||
498 | 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, /* 0x60-0x67 */ | ||
499 | 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, /* 0x68-0x6f */ | ||
500 | 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, /* 0x70-0x77 */ | ||
501 | 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, /* 0x78-0x7f */ | ||
502 | 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, /* 0x80-0x87 */ | ||
503 | 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, /* 0x88-0x8f */ | ||
504 | 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, /* 0x90-0x97 */ | ||
505 | 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, /* 0x98-0x9f */ | ||
506 | 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, /* 0xa0-0xa7 */ | ||
507 | 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, /* 0xa8-0xaf */ | ||
508 | 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, /* 0xb0-0xb7 */ | ||
509 | 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, /* 0xb8-0xbf */ | ||
510 | 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, /* 0xc0-0xc7 */ | ||
511 | 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, /* 0xc8-0xcf */ | ||
512 | 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, /* 0xd0-0xd7 */ | ||
513 | 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, /* 0xd8-0xdf */ | ||
514 | 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, /* 0xe0-0xe7 */ | ||
515 | 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, /* 0xe8-0xef */ | ||
516 | 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, /* 0xf0-0xf7 */ | ||
517 | 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, /* 0xf8-0xff */ | ||
518 | }; | ||
519 | |||
520 | static int uni2char(wchar_t uni, unsigned char *out, int boundlen) | ||
521 | { | ||
522 | const unsigned char *uni2charset; | ||
523 | unsigned char cl = uni & 0x00ff; | ||
524 | unsigned char ch = (uni & 0xff00) >> 8; | ||
525 | |||
526 | if (boundlen <= 0) | ||
527 | return -ENAMETOOLONG; | ||
528 | |||
529 | uni2charset = page_uni2charset[ch]; | ||
530 | if (uni2charset && uni2charset[cl]) | ||
531 | out[0] = uni2charset[cl]; | ||
532 | else | ||
533 | return -EINVAL; | ||
534 | return 1; | ||
535 | } | ||
536 | |||
537 | static int char2uni(const unsigned char *rawstring, int boundlen, wchar_t *uni) | ||
538 | { | ||
539 | *uni = charset2uni[*rawstring]; | ||
540 | if (*uni == 0x0000) | ||
541 | return -EINVAL; | ||
542 | return 1; | ||
543 | } | ||
544 | |||
545 | static struct nls_table table = { | ||
546 | .charset = "macgaelic", | ||
547 | .uni2char = uni2char, | ||
548 | .char2uni = char2uni, | ||
549 | .charset2lower = charset2lower, | ||
550 | .charset2upper = charset2upper, | ||
551 | .owner = THIS_MODULE, | ||
552 | }; | ||
553 | |||
554 | static int __init init_nls_macgaelic(void) | ||
555 | { | ||
556 | return register_nls(&table); | ||
557 | } | ||
558 | |||
559 | static void __exit exit_nls_macgaelic(void) | ||
560 | { | ||
561 | unregister_nls(&table); | ||
562 | } | ||
563 | |||
564 | module_init(init_nls_macgaelic) | ||
565 | module_exit(exit_nls_macgaelic) | ||
566 | |||
567 | MODULE_LICENSE("Dual BSD/GPL"); | ||
diff --git a/fs/nls/nls_macgreek.c b/fs/nls/nls_macgreek.c new file mode 100644 index 000000000000..79880f30494f --- /dev/null +++ b/fs/nls/nls_macgreek.c | |||
@@ -0,0 +1,497 @@ | |||
1 | /* | ||
2 | * linux/fs/nls/nls_macgreek.c | ||
3 | * | ||
4 | * Charset macgreek translation tables. | ||
5 | * Generated automatically from the Unicode and charset | ||
6 | * tables from the Unicode Organization (www.unicode.org). | ||
7 | * The Unicode to charset table has only exact mappings. | ||
8 | */ | ||
9 | |||
10 | /* | ||
11 | * COPYRIGHT AND PERMISSION NOTICE | ||
12 | * | ||
13 | * Copyright 1991-2012 Unicode, Inc. All rights reserved. Distributed under | ||
14 | * the Terms of Use in http://www.unicode.org/copyright.html. | ||
15 | * | ||
16 | * Permission is hereby granted, free of charge, to any person obtaining a | ||
17 | * copy of the Unicode data files and any associated documentation (the "Data | ||
18 | * Files") or Unicode software and any associated documentation (the | ||
19 | * "Software") to deal in the Data Files or Software without restriction, | ||
20 | * including without limitation the rights to use, copy, modify, merge, | ||
21 | * publish, distribute, and/or sell copies of the Data Files or Software, and | ||
22 | * to permit persons to whom the Data Files or Software are furnished to do | ||
23 | * so, provided that (a) the above copyright notice(s) and this permission | ||
24 | * notice appear with all copies of the Data Files or Software, (b) both the | ||
25 | * above copyright notice(s) and this permission notice appear in associated | ||
26 | * documentation, and (c) there is clear notice in each modified Data File or | ||
27 | * in the Software as well as in the documentation associated with the Data | ||
28 | * File(s) or Software that the data or software has been modified. | ||
29 | * | ||
30 | * THE DATA FILES AND SOFTWARE ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY | ||
31 | * KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF | ||
32 | * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF | ||
33 | * THIRD PARTY RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS | ||
34 | * INCLUDED IN THIS NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT | ||
35 | * OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF | ||
36 | * USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR | ||
37 | * OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR | ||
38 | * PERFORMANCE OF THE DATA FILES OR SOFTWARE. | ||
39 | * | ||
40 | * Except as contained in this notice, the name of a copyright holder shall | ||
41 | * not be used in advertising or otherwise to promote the sale, use or other | ||
42 | * dealings in these Data Files or Software without prior written | ||
43 | * authorization of the copyright holder. | ||
44 | */ | ||
45 | |||
46 | #include <linux/module.h> | ||
47 | #include <linux/kernel.h> | ||
48 | #include <linux/string.h> | ||
49 | #include <linux/nls.h> | ||
50 | #include <linux/errno.h> | ||
51 | |||
52 | static const wchar_t charset2uni[256] = { | ||
53 | /* 0x00 */ | ||
54 | 0x0000, 0x0001, 0x0002, 0x0003, | ||
55 | 0x0004, 0x0005, 0x0006, 0x0007, | ||
56 | 0x0008, 0x0009, 0x000a, 0x000b, | ||
57 | 0x000c, 0x000d, 0x000e, 0x000f, | ||
58 | /* 0x10 */ | ||
59 | 0x0010, 0x0011, 0x0012, 0x0013, | ||
60 | 0x0014, 0x0015, 0x0016, 0x0017, | ||
61 | 0x0018, 0x0019, 0x001a, 0x001b, | ||
62 | 0x001c, 0x001d, 0x001e, 0x001f, | ||
63 | /* 0x20 */ | ||
64 | 0x0020, 0x0021, 0x0022, 0x0023, | ||
65 | 0x0024, 0x0025, 0x0026, 0x0027, | ||
66 | 0x0028, 0x0029, 0x002a, 0x002b, | ||
67 | 0x002c, 0x002d, 0x002e, 0x002f, | ||
68 | /* 0x30 */ | ||
69 | 0x0030, 0x0031, 0x0032, 0x0033, | ||
70 | 0x0034, 0x0035, 0x0036, 0x0037, | ||
71 | 0x0038, 0x0039, 0x003a, 0x003b, | ||
72 | 0x003c, 0x003d, 0x003e, 0x003f, | ||
73 | /* 0x40 */ | ||
74 | 0x0040, 0x0041, 0x0042, 0x0043, | ||
75 | 0x0044, 0x0045, 0x0046, 0x0047, | ||
76 | 0x0048, 0x0049, 0x004a, 0x004b, | ||
77 | 0x004c, 0x004d, 0x004e, 0x004f, | ||
78 | /* 0x50 */ | ||
79 | 0x0050, 0x0051, 0x0052, 0x0053, | ||
80 | 0x0054, 0x0055, 0x0056, 0x0057, | ||
81 | 0x0058, 0x0059, 0x005a, 0x005b, | ||
82 | 0x005c, 0x005d, 0x005e, 0x005f, | ||
83 | /* 0x60 */ | ||
84 | 0x0060, 0x0061, 0x0062, 0x0063, | ||
85 | 0x0064, 0x0065, 0x0066, 0x0067, | ||
86 | 0x0068, 0x0069, 0x006a, 0x006b, | ||
87 | 0x006c, 0x006d, 0x006e, 0x006f, | ||
88 | /* 0x70 */ | ||
89 | 0x0070, 0x0071, 0x0072, 0x0073, | ||
90 | 0x0074, 0x0075, 0x0076, 0x0077, | ||
91 | 0x0078, 0x0079, 0x007a, 0x007b, | ||
92 | 0x007c, 0x007d, 0x007e, 0x007f, | ||
93 | /* 0x80 */ | ||
94 | 0x00c4, 0x00b9, 0x00b2, 0x00c9, | ||
95 | 0x00b3, 0x00d6, 0x00dc, 0x0385, | ||
96 | 0x00e0, 0x00e2, 0x00e4, 0x0384, | ||
97 | 0x00a8, 0x00e7, 0x00e9, 0x00e8, | ||
98 | /* 0x90 */ | ||
99 | 0x00ea, 0x00eb, 0x00a3, 0x2122, | ||
100 | 0x00ee, 0x00ef, 0x2022, 0x00bd, | ||
101 | 0x2030, 0x00f4, 0x00f6, 0x00a6, | ||
102 | 0x20ac, 0x00f9, 0x00fb, 0x00fc, | ||
103 | /* 0xa0 */ | ||
104 | 0x2020, 0x0393, 0x0394, 0x0398, | ||
105 | 0x039b, 0x039e, 0x03a0, 0x00df, | ||
106 | 0x00ae, 0x00a9, 0x03a3, 0x03aa, | ||
107 | 0x00a7, 0x2260, 0x00b0, 0x00b7, | ||
108 | /* 0xb0 */ | ||
109 | 0x0391, 0x00b1, 0x2264, 0x2265, | ||
110 | 0x00a5, 0x0392, 0x0395, 0x0396, | ||
111 | 0x0397, 0x0399, 0x039a, 0x039c, | ||
112 | 0x03a6, 0x03ab, 0x03a8, 0x03a9, | ||
113 | /* 0xc0 */ | ||
114 | 0x03ac, 0x039d, 0x00ac, 0x039f, | ||
115 | 0x03a1, 0x2248, 0x03a4, 0x00ab, | ||
116 | 0x00bb, 0x2026, 0x00a0, 0x03a5, | ||
117 | 0x03a7, 0x0386, 0x0388, 0x0153, | ||
118 | /* 0xd0 */ | ||
119 | 0x2013, 0x2015, 0x201c, 0x201d, | ||
120 | 0x2018, 0x2019, 0x00f7, 0x0389, | ||
121 | 0x038a, 0x038c, 0x038e, 0x03ad, | ||
122 | 0x03ae, 0x03af, 0x03cc, 0x038f, | ||
123 | /* 0xe0 */ | ||
124 | 0x03cd, 0x03b1, 0x03b2, 0x03c8, | ||
125 | 0x03b4, 0x03b5, 0x03c6, 0x03b3, | ||
126 | 0x03b7, 0x03b9, 0x03be, 0x03ba, | ||
127 | 0x03bb, 0x03bc, 0x03bd, 0x03bf, | ||
128 | /* 0xf0 */ | ||
129 | 0x03c0, 0x03ce, 0x03c1, 0x03c3, | ||
130 | 0x03c4, 0x03b8, 0x03c9, 0x03c2, | ||
131 | 0x03c7, 0x03c5, 0x03b6, 0x03ca, | ||
132 | 0x03cb, 0x0390, 0x03b0, 0x00ad, | ||
133 | }; | ||
134 | |||
135 | static const unsigned char page00[256] = { | ||
136 | 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, /* 0x00-0x07 */ | ||
137 | 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, /* 0x08-0x0f */ | ||
138 | 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, /* 0x10-0x17 */ | ||
139 | 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, /* 0x18-0x1f */ | ||
140 | 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, /* 0x20-0x27 */ | ||
141 | 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, /* 0x28-0x2f */ | ||
142 | 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, /* 0x30-0x37 */ | ||
143 | 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, /* 0x38-0x3f */ | ||
144 | 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, /* 0x40-0x47 */ | ||
145 | 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, /* 0x48-0x4f */ | ||
146 | 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, /* 0x50-0x57 */ | ||
147 | 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f, /* 0x58-0x5f */ | ||
148 | 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, /* 0x60-0x67 */ | ||
149 | 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, /* 0x68-0x6f */ | ||
150 | 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, /* 0x70-0x77 */ | ||
151 | 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f, /* 0x78-0x7f */ | ||
152 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x80-0x87 */ | ||
153 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x88-0x8f */ | ||
154 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x90-0x97 */ | ||
155 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x98-0x9f */ | ||
156 | 0xca, 0x00, 0x00, 0x92, 0x00, 0xb4, 0x9b, 0xac, /* 0xa0-0xa7 */ | ||
157 | 0x8c, 0xa9, 0x00, 0xc7, 0xc2, 0xff, 0xa8, 0x00, /* 0xa8-0xaf */ | ||
158 | 0xae, 0xb1, 0x82, 0x84, 0x00, 0x00, 0x00, 0xaf, /* 0xb0-0xb7 */ | ||
159 | 0x00, 0x81, 0x00, 0xc8, 0x00, 0x97, 0x00, 0x00, /* 0xb8-0xbf */ | ||
160 | 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, /* 0xc0-0xc7 */ | ||
161 | 0x00, 0x83, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc8-0xcf */ | ||
162 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x85, 0x00, /* 0xd0-0xd7 */ | ||
163 | 0x00, 0x00, 0x00, 0x00, 0x86, 0x00, 0x00, 0xa7, /* 0xd8-0xdf */ | ||
164 | 0x88, 0x00, 0x89, 0x00, 0x8a, 0x00, 0x00, 0x8d, /* 0xe0-0xe7 */ | ||
165 | 0x8f, 0x8e, 0x90, 0x91, 0x00, 0x00, 0x94, 0x95, /* 0xe8-0xef */ | ||
166 | 0x00, 0x00, 0x00, 0x00, 0x99, 0x00, 0x9a, 0xd6, /* 0xf0-0xf7 */ | ||
167 | 0x00, 0x9d, 0x00, 0x9e, 0x9f, 0x00, 0x00, 0x00, /* 0xf8-0xff */ | ||
168 | }; | ||
169 | |||
170 | static const unsigned char page01[256] = { | ||
171 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x00-0x07 */ | ||
172 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x08-0x0f */ | ||
173 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10-0x17 */ | ||
174 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x18-0x1f */ | ||
175 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x20-0x27 */ | ||
176 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x28-0x2f */ | ||
177 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x30-0x37 */ | ||
178 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x38-0x3f */ | ||
179 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x40-0x47 */ | ||
180 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x48-0x4f */ | ||
181 | 0x00, 0x00, 0x00, 0xcf, 0x00, 0x00, 0x00, 0x00, /* 0x50-0x57 */ | ||
182 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x58-0x5f */ | ||
183 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x60-0x67 */ | ||
184 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x68-0x6f */ | ||
185 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */ | ||
186 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x78-0x7f */ | ||
187 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x80-0x87 */ | ||
188 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x88-0x8f */ | ||
189 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x90-0x97 */ | ||
190 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x98-0x9f */ | ||
191 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa0-0xa7 */ | ||
192 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa8-0xaf */ | ||
193 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xb0-0xb7 */ | ||
194 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xb8-0xbf */ | ||
195 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc0-0xc7 */ | ||
196 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc8-0xcf */ | ||
197 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd0-0xd7 */ | ||
198 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd8-0xdf */ | ||
199 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe0-0xe7 */ | ||
200 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe8-0xef */ | ||
201 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xf0-0xf7 */ | ||
202 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xf8-0xff */ | ||
203 | }; | ||
204 | |||
205 | static const unsigned char page03[256] = { | ||
206 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x00-0x07 */ | ||
207 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x08-0x0f */ | ||
208 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10-0x17 */ | ||
209 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x18-0x1f */ | ||
210 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x20-0x27 */ | ||
211 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x28-0x2f */ | ||
212 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x30-0x37 */ | ||
213 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x38-0x3f */ | ||
214 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x40-0x47 */ | ||
215 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x48-0x4f */ | ||
216 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x50-0x57 */ | ||
217 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x58-0x5f */ | ||
218 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x60-0x67 */ | ||
219 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x68-0x6f */ | ||
220 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */ | ||
221 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x78-0x7f */ | ||
222 | 0x00, 0x00, 0x00, 0x00, 0x8b, 0x87, 0xcd, 0x00, /* 0x80-0x87 */ | ||
223 | 0xce, 0xd7, 0xd8, 0x00, 0xd9, 0x00, 0xda, 0xdf, /* 0x88-0x8f */ | ||
224 | 0xfd, 0xb0, 0xb5, 0xa1, 0xa2, 0xb6, 0xb7, 0xb8, /* 0x90-0x97 */ | ||
225 | 0xa3, 0xb9, 0xba, 0xa4, 0xbb, 0xc1, 0xa5, 0xc3, /* 0x98-0x9f */ | ||
226 | 0xa6, 0xc4, 0x00, 0xaa, 0xc6, 0xcb, 0xbc, 0xcc, /* 0xa0-0xa7 */ | ||
227 | 0xbe, 0xbf, 0xab, 0xbd, 0xc0, 0xdb, 0xdc, 0xdd, /* 0xa8-0xaf */ | ||
228 | 0xfe, 0xe1, 0xe2, 0xe7, 0xe4, 0xe5, 0xfa, 0xe8, /* 0xb0-0xb7 */ | ||
229 | 0xf5, 0xe9, 0xeb, 0xec, 0xed, 0xee, 0xea, 0xef, /* 0xb8-0xbf */ | ||
230 | 0xf0, 0xf2, 0xf7, 0xf3, 0xf4, 0xf9, 0xe6, 0xf8, /* 0xc0-0xc7 */ | ||
231 | 0xe3, 0xf6, 0xfb, 0xfc, 0xde, 0xe0, 0xf1, 0x00, /* 0xc8-0xcf */ | ||
232 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd0-0xd7 */ | ||
233 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd8-0xdf */ | ||
234 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe0-0xe7 */ | ||
235 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe8-0xef */ | ||
236 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xf0-0xf7 */ | ||
237 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xf8-0xff */ | ||
238 | }; | ||
239 | |||
240 | static const unsigned char page20[256] = { | ||
241 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x00-0x07 */ | ||
242 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x08-0x0f */ | ||
243 | 0x00, 0x00, 0x00, 0xd0, 0x00, 0xd1, 0x00, 0x00, /* 0x10-0x17 */ | ||
244 | 0xd4, 0xd5, 0x00, 0x00, 0xd2, 0xd3, 0x00, 0x00, /* 0x18-0x1f */ | ||
245 | 0xa0, 0x00, 0x96, 0x00, 0x00, 0x00, 0xc9, 0x00, /* 0x20-0x27 */ | ||
246 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x28-0x2f */ | ||
247 | 0x98, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x30-0x37 */ | ||
248 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x38-0x3f */ | ||
249 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x40-0x47 */ | ||
250 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x48-0x4f */ | ||
251 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x50-0x57 */ | ||
252 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x58-0x5f */ | ||
253 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x60-0x67 */ | ||
254 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x68-0x6f */ | ||
255 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */ | ||
256 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x78-0x7f */ | ||
257 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x80-0x87 */ | ||
258 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x88-0x8f */ | ||
259 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x90-0x97 */ | ||
260 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x98-0x9f */ | ||
261 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa0-0xa7 */ | ||
262 | 0x00, 0x00, 0x00, 0x00, 0x9c, 0x00, 0x00, 0x00, /* 0xa8-0xaf */ | ||
263 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xb0-0xb7 */ | ||
264 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xb8-0xbf */ | ||
265 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc0-0xc7 */ | ||
266 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc8-0xcf */ | ||
267 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd0-0xd7 */ | ||
268 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd8-0xdf */ | ||
269 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe0-0xe7 */ | ||
270 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe8-0xef */ | ||
271 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xf0-0xf7 */ | ||
272 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xf8-0xff */ | ||
273 | }; | ||
274 | |||
275 | static const unsigned char page21[256] = { | ||
276 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x00-0x07 */ | ||
277 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x08-0x0f */ | ||
278 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10-0x17 */ | ||
279 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x18-0x1f */ | ||
280 | 0x00, 0x00, 0x93, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x20-0x27 */ | ||
281 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x28-0x2f */ | ||
282 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x30-0x37 */ | ||
283 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x38-0x3f */ | ||
284 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x40-0x47 */ | ||
285 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x48-0x4f */ | ||
286 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x50-0x57 */ | ||
287 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x58-0x5f */ | ||
288 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x60-0x67 */ | ||
289 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x68-0x6f */ | ||
290 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */ | ||
291 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x78-0x7f */ | ||
292 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x80-0x87 */ | ||
293 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x88-0x8f */ | ||
294 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x90-0x97 */ | ||
295 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x98-0x9f */ | ||
296 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa0-0xa7 */ | ||
297 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa8-0xaf */ | ||
298 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xb0-0xb7 */ | ||
299 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xb8-0xbf */ | ||
300 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc0-0xc7 */ | ||
301 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc8-0xcf */ | ||
302 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd0-0xd7 */ | ||
303 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd8-0xdf */ | ||
304 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe0-0xe7 */ | ||
305 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe8-0xef */ | ||
306 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xf0-0xf7 */ | ||
307 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xf8-0xff */ | ||
308 | }; | ||
309 | |||
310 | static const unsigned char page22[256] = { | ||
311 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x00-0x07 */ | ||
312 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x08-0x0f */ | ||
313 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10-0x17 */ | ||
314 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x18-0x1f */ | ||
315 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x20-0x27 */ | ||
316 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x28-0x2f */ | ||
317 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x30-0x37 */ | ||
318 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x38-0x3f */ | ||
319 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x40-0x47 */ | ||
320 | 0xc5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x48-0x4f */ | ||
321 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x50-0x57 */ | ||
322 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x58-0x5f */ | ||
323 | 0xad, 0x00, 0x00, 0x00, 0xb2, 0xb3, 0x00, 0x00, /* 0x60-0x67 */ | ||
324 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x68-0x6f */ | ||
325 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */ | ||
326 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x78-0x7f */ | ||
327 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x80-0x87 */ | ||
328 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x88-0x8f */ | ||
329 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x90-0x97 */ | ||
330 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x98-0x9f */ | ||
331 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa0-0xa7 */ | ||
332 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa8-0xaf */ | ||
333 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xb0-0xb7 */ | ||
334 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xb8-0xbf */ | ||
335 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc0-0xc7 */ | ||
336 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc8-0xcf */ | ||
337 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd0-0xd7 */ | ||
338 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd8-0xdf */ | ||
339 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe0-0xe7 */ | ||
340 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe8-0xef */ | ||
341 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xf0-0xf7 */ | ||
342 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xf8-0xff */ | ||
343 | }; | ||
344 | |||
345 | static const unsigned char *const page_uni2charset[256] = { | ||
346 | page00, page01, NULL, page03, NULL, NULL, NULL, NULL, | ||
347 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
348 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
349 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
350 | page20, page21, page22, NULL, NULL, NULL, NULL, NULL, | ||
351 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
352 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
353 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
354 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
355 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
356 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
357 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
358 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
359 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
360 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
361 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
362 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
363 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
364 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
365 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
366 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
367 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
368 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
369 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
370 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
371 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
372 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
373 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
374 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
375 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
376 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
377 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
378 | }; | ||
379 | |||
380 | static const unsigned char charset2lower[256] = { | ||
381 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x00-0x07 */ | ||
382 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x08-0x0f */ | ||
383 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x10-0x17 */ | ||
384 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x18-0x1f */ | ||
385 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x20-0x27 */ | ||
386 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x28-0x2f */ | ||
387 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x30-0x37 */ | ||
388 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x38-0x3f */ | ||
389 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x40-0x47 */ | ||
390 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x48-0x4f */ | ||
391 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x50-0x57 */ | ||
392 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x58-0x5f */ | ||
393 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x60-0x67 */ | ||
394 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x68-0x6f */ | ||
395 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x70-0x77 */ | ||
396 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x78-0x7f */ | ||
397 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x80-0x87 */ | ||
398 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x88-0x8f */ | ||
399 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x90-0x97 */ | ||
400 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x98-0x9f */ | ||
401 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0xa0-0xa7 */ | ||
402 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0xa8-0xaf */ | ||
403 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0xb0-0xb7 */ | ||
404 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0xb8-0xbf */ | ||
405 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0xc0-0xc7 */ | ||
406 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0xc8-0xcf */ | ||
407 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0xd0-0xd7 */ | ||
408 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0xd8-0xdf */ | ||
409 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0xe0-0xe7 */ | ||
410 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0xe8-0xef */ | ||
411 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0xf0-0xf7 */ | ||
412 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0xf8-0xff */ | ||
413 | }; | ||
414 | |||
415 | static const unsigned char charset2upper[256] = { | ||
416 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x00-0x07 */ | ||
417 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x08-0x0f */ | ||
418 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x10-0x17 */ | ||
419 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x18-0x1f */ | ||
420 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x20-0x27 */ | ||
421 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x28-0x2f */ | ||
422 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x30-0x37 */ | ||
423 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x38-0x3f */ | ||
424 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x40-0x47 */ | ||
425 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x48-0x4f */ | ||
426 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x50-0x57 */ | ||
427 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x58-0x5f */ | ||
428 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x60-0x67 */ | ||
429 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x68-0x6f */ | ||
430 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x70-0x77 */ | ||
431 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x78-0x7f */ | ||
432 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x80-0x87 */ | ||
433 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x88-0x8f */ | ||
434 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x90-0x97 */ | ||
435 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x98-0x9f */ | ||
436 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0xa0-0xa7 */ | ||
437 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0xa8-0xaf */ | ||
438 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0xb0-0xb7 */ | ||
439 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0xb8-0xbf */ | ||
440 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0xc0-0xc7 */ | ||
441 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0xc8-0xcf */ | ||
442 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0xd0-0xd7 */ | ||
443 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0xd8-0xdf */ | ||
444 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0xe0-0xe7 */ | ||
445 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0xe8-0xef */ | ||
446 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0xf0-0xf7 */ | ||
447 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0xf8-0xff */ | ||
448 | }; | ||
449 | |||
450 | static int uni2char(wchar_t uni, unsigned char *out, int boundlen) | ||
451 | { | ||
452 | const unsigned char *uni2charset; | ||
453 | unsigned char cl = uni & 0x00ff; | ||
454 | unsigned char ch = (uni & 0xff00) >> 8; | ||
455 | |||
456 | if (boundlen <= 0) | ||
457 | return -ENAMETOOLONG; | ||
458 | |||
459 | uni2charset = page_uni2charset[ch]; | ||
460 | if (uni2charset && uni2charset[cl]) | ||
461 | out[0] = uni2charset[cl]; | ||
462 | else | ||
463 | return -EINVAL; | ||
464 | return 1; | ||
465 | } | ||
466 | |||
467 | static int char2uni(const unsigned char *rawstring, int boundlen, wchar_t *uni) | ||
468 | { | ||
469 | *uni = charset2uni[*rawstring]; | ||
470 | if (*uni == 0x0000) | ||
471 | return -EINVAL; | ||
472 | return 1; | ||
473 | } | ||
474 | |||
475 | static struct nls_table table = { | ||
476 | .charset = "macgreek", | ||
477 | .uni2char = uni2char, | ||
478 | .char2uni = char2uni, | ||
479 | .charset2lower = charset2lower, | ||
480 | .charset2upper = charset2upper, | ||
481 | .owner = THIS_MODULE, | ||
482 | }; | ||
483 | |||
484 | static int __init init_nls_macgreek(void) | ||
485 | { | ||
486 | return register_nls(&table); | ||
487 | } | ||
488 | |||
489 | static void __exit exit_nls_macgreek(void) | ||
490 | { | ||
491 | unregister_nls(&table); | ||
492 | } | ||
493 | |||
494 | module_init(init_nls_macgreek) | ||
495 | module_exit(exit_nls_macgreek) | ||
496 | |||
497 | MODULE_LICENSE("Dual BSD/GPL"); | ||
diff --git a/fs/nls/nls_maciceland.c b/fs/nls/nls_maciceland.c new file mode 100644 index 000000000000..1e688c59b252 --- /dev/null +++ b/fs/nls/nls_maciceland.c | |||
@@ -0,0 +1,602 @@ | |||
1 | /* | ||
2 | * linux/fs/nls/nls_maciceland.c | ||
3 | * | ||
4 | * Charset maciceland translation tables. | ||
5 | * Generated automatically from the Unicode and charset | ||
6 | * tables from the Unicode Organization (www.unicode.org). | ||
7 | * The Unicode to charset table has only exact mappings. | ||
8 | */ | ||
9 | |||
10 | /* | ||
11 | * COPYRIGHT AND PERMISSION NOTICE | ||
12 | * | ||
13 | * Copyright 1991-2012 Unicode, Inc. All rights reserved. Distributed under | ||
14 | * the Terms of Use in http://www.unicode.org/copyright.html. | ||
15 | * | ||
16 | * Permission is hereby granted, free of charge, to any person obtaining a | ||
17 | * copy of the Unicode data files and any associated documentation (the "Data | ||
18 | * Files") or Unicode software and any associated documentation (the | ||
19 | * "Software") to deal in the Data Files or Software without restriction, | ||
20 | * including without limitation the rights to use, copy, modify, merge, | ||
21 | * publish, distribute, and/or sell copies of the Data Files or Software, and | ||
22 | * to permit persons to whom the Data Files or Software are furnished to do | ||
23 | * so, provided that (a) the above copyright notice(s) and this permission | ||
24 | * notice appear with all copies of the Data Files or Software, (b) both the | ||
25 | * above copyright notice(s) and this permission notice appear in associated | ||
26 | * documentation, and (c) there is clear notice in each modified Data File or | ||
27 | * in the Software as well as in the documentation associated with the Data | ||
28 | * File(s) or Software that the data or software has been modified. | ||
29 | * | ||
30 | * THE DATA FILES AND SOFTWARE ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY | ||
31 | * KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF | ||
32 | * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF | ||
33 | * THIRD PARTY RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS | ||
34 | * INCLUDED IN THIS NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT | ||
35 | * OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF | ||
36 | * USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR | ||
37 | * OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR | ||
38 | * PERFORMANCE OF THE DATA FILES OR SOFTWARE. | ||
39 | * | ||
40 | * Except as contained in this notice, the name of a copyright holder shall | ||
41 | * not be used in advertising or otherwise to promote the sale, use or other | ||
42 | * dealings in these Data Files or Software without prior written | ||
43 | * authorization of the copyright holder. | ||
44 | */ | ||
45 | |||
46 | #include <linux/module.h> | ||
47 | #include <linux/kernel.h> | ||
48 | #include <linux/string.h> | ||
49 | #include <linux/nls.h> | ||
50 | #include <linux/errno.h> | ||
51 | |||
52 | static const wchar_t charset2uni[256] = { | ||
53 | /* 0x00 */ | ||
54 | 0x0000, 0x0001, 0x0002, 0x0003, | ||
55 | 0x0004, 0x0005, 0x0006, 0x0007, | ||
56 | 0x0008, 0x0009, 0x000a, 0x000b, | ||
57 | 0x000c, 0x000d, 0x000e, 0x000f, | ||
58 | /* 0x10 */ | ||
59 | 0x0010, 0x0011, 0x0012, 0x0013, | ||
60 | 0x0014, 0x0015, 0x0016, 0x0017, | ||
61 | 0x0018, 0x0019, 0x001a, 0x001b, | ||
62 | 0x001c, 0x001d, 0x001e, 0x001f, | ||
63 | /* 0x20 */ | ||
64 | 0x0020, 0x0021, 0x0022, 0x0023, | ||
65 | 0x0024, 0x0025, 0x0026, 0x0027, | ||
66 | 0x0028, 0x0029, 0x002a, 0x002b, | ||
67 | 0x002c, 0x002d, 0x002e, 0x002f, | ||
68 | /* 0x30 */ | ||
69 | 0x0030, 0x0031, 0x0032, 0x0033, | ||
70 | 0x0034, 0x0035, 0x0036, 0x0037, | ||
71 | 0x0038, 0x0039, 0x003a, 0x003b, | ||
72 | 0x003c, 0x003d, 0x003e, 0x003f, | ||
73 | /* 0x40 */ | ||
74 | 0x0040, 0x0041, 0x0042, 0x0043, | ||
75 | 0x0044, 0x0045, 0x0046, 0x0047, | ||
76 | 0x0048, 0x0049, 0x004a, 0x004b, | ||
77 | 0x004c, 0x004d, 0x004e, 0x004f, | ||
78 | /* 0x50 */ | ||
79 | 0x0050, 0x0051, 0x0052, 0x0053, | ||
80 | 0x0054, 0x0055, 0x0056, 0x0057, | ||
81 | 0x0058, 0x0059, 0x005a, 0x005b, | ||
82 | 0x005c, 0x005d, 0x005e, 0x005f, | ||
83 | /* 0x60 */ | ||
84 | 0x0060, 0x0061, 0x0062, 0x0063, | ||
85 | 0x0064, 0x0065, 0x0066, 0x0067, | ||
86 | 0x0068, 0x0069, 0x006a, 0x006b, | ||
87 | 0x006c, 0x006d, 0x006e, 0x006f, | ||
88 | /* 0x70 */ | ||
89 | 0x0070, 0x0071, 0x0072, 0x0073, | ||
90 | 0x0074, 0x0075, 0x0076, 0x0077, | ||
91 | 0x0078, 0x0079, 0x007a, 0x007b, | ||
92 | 0x007c, 0x007d, 0x007e, 0x007f, | ||
93 | /* 0x80 */ | ||
94 | 0x00c4, 0x00c5, 0x00c7, 0x00c9, | ||
95 | 0x00d1, 0x00d6, 0x00dc, 0x00e1, | ||
96 | 0x00e0, 0x00e2, 0x00e4, 0x00e3, | ||
97 | 0x00e5, 0x00e7, 0x00e9, 0x00e8, | ||
98 | /* 0x90 */ | ||
99 | 0x00ea, 0x00eb, 0x00ed, 0x00ec, | ||
100 | 0x00ee, 0x00ef, 0x00f1, 0x00f3, | ||
101 | 0x00f2, 0x00f4, 0x00f6, 0x00f5, | ||
102 | 0x00fa, 0x00f9, 0x00fb, 0x00fc, | ||
103 | /* 0xa0 */ | ||
104 | 0x00dd, 0x00b0, 0x00a2, 0x00a3, | ||
105 | 0x00a7, 0x2022, 0x00b6, 0x00df, | ||
106 | 0x00ae, 0x00a9, 0x2122, 0x00b4, | ||
107 | 0x00a8, 0x2260, 0x00c6, 0x00d8, | ||
108 | /* 0xb0 */ | ||
109 | 0x221e, 0x00b1, 0x2264, 0x2265, | ||
110 | 0x00a5, 0x00b5, 0x2202, 0x2211, | ||
111 | 0x220f, 0x03c0, 0x222b, 0x00aa, | ||
112 | 0x00ba, 0x03a9, 0x00e6, 0x00f8, | ||
113 | /* 0xc0 */ | ||
114 | 0x00bf, 0x00a1, 0x00ac, 0x221a, | ||
115 | 0x0192, 0x2248, 0x2206, 0x00ab, | ||
116 | 0x00bb, 0x2026, 0x00a0, 0x00c0, | ||
117 | 0x00c3, 0x00d5, 0x0152, 0x0153, | ||
118 | /* 0xd0 */ | ||
119 | 0x2013, 0x2014, 0x201c, 0x201d, | ||
120 | 0x2018, 0x2019, 0x00f7, 0x25ca, | ||
121 | 0x00ff, 0x0178, 0x2044, 0x20ac, | ||
122 | 0x00d0, 0x00f0, 0x00de, 0x00fe, | ||
123 | /* 0xe0 */ | ||
124 | 0x00fd, 0x00b7, 0x201a, 0x201e, | ||
125 | 0x2030, 0x00c2, 0x00ca, 0x00c1, | ||
126 | 0x00cb, 0x00c8, 0x00cd, 0x00ce, | ||
127 | 0x00cf, 0x00cc, 0x00d3, 0x00d4, | ||
128 | /* 0xf0 */ | ||
129 | 0xf8ff, 0x00d2, 0x00da, 0x00db, | ||
130 | 0x00d9, 0x0131, 0x02c6, 0x02dc, | ||
131 | 0x00af, 0x02d8, 0x02d9, 0x02da, | ||
132 | 0x00b8, 0x02dd, 0x02db, 0x02c7, | ||
133 | }; | ||
134 | |||
135 | static const unsigned char page00[256] = { | ||
136 | 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, /* 0x00-0x07 */ | ||
137 | 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, /* 0x08-0x0f */ | ||
138 | 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, /* 0x10-0x17 */ | ||
139 | 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, /* 0x18-0x1f */ | ||
140 | 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, /* 0x20-0x27 */ | ||
141 | 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, /* 0x28-0x2f */ | ||
142 | 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, /* 0x30-0x37 */ | ||
143 | 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, /* 0x38-0x3f */ | ||
144 | 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, /* 0x40-0x47 */ | ||
145 | 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, /* 0x48-0x4f */ | ||
146 | 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, /* 0x50-0x57 */ | ||
147 | 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f, /* 0x58-0x5f */ | ||
148 | 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, /* 0x60-0x67 */ | ||
149 | 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, /* 0x68-0x6f */ | ||
150 | 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, /* 0x70-0x77 */ | ||
151 | 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f, /* 0x78-0x7f */ | ||
152 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x80-0x87 */ | ||
153 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x88-0x8f */ | ||
154 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x90-0x97 */ | ||
155 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x98-0x9f */ | ||
156 | 0xca, 0xc1, 0xa2, 0xa3, 0x00, 0xb4, 0x00, 0xa4, /* 0xa0-0xa7 */ | ||
157 | 0xac, 0xa9, 0xbb, 0xc7, 0xc2, 0x00, 0xa8, 0xf8, /* 0xa8-0xaf */ | ||
158 | 0xa1, 0xb1, 0x00, 0x00, 0xab, 0xb5, 0xa6, 0xe1, /* 0xb0-0xb7 */ | ||
159 | 0xfc, 0x00, 0xbc, 0xc8, 0x00, 0x00, 0x00, 0xc0, /* 0xb8-0xbf */ | ||
160 | 0xcb, 0xe7, 0xe5, 0xcc, 0x80, 0x81, 0xae, 0x82, /* 0xc0-0xc7 */ | ||
161 | 0xe9, 0x83, 0xe6, 0xe8, 0xed, 0xea, 0xeb, 0xec, /* 0xc8-0xcf */ | ||
162 | 0xdc, 0x84, 0xf1, 0xee, 0xef, 0xcd, 0x85, 0x00, /* 0xd0-0xd7 */ | ||
163 | 0xaf, 0xf4, 0xf2, 0xf3, 0x86, 0xa0, 0xde, 0xa7, /* 0xd8-0xdf */ | ||
164 | 0x88, 0x87, 0x89, 0x8b, 0x8a, 0x8c, 0xbe, 0x8d, /* 0xe0-0xe7 */ | ||
165 | 0x8f, 0x8e, 0x90, 0x91, 0x93, 0x92, 0x94, 0x95, /* 0xe8-0xef */ | ||
166 | 0xdd, 0x96, 0x98, 0x97, 0x99, 0x9b, 0x9a, 0xd6, /* 0xf0-0xf7 */ | ||
167 | 0xbf, 0x9d, 0x9c, 0x9e, 0x9f, 0xe0, 0xdf, 0xd8, /* 0xf8-0xff */ | ||
168 | }; | ||
169 | |||
170 | static const unsigned char page01[256] = { | ||
171 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x00-0x07 */ | ||
172 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x08-0x0f */ | ||
173 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10-0x17 */ | ||
174 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x18-0x1f */ | ||
175 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x20-0x27 */ | ||
176 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x28-0x2f */ | ||
177 | 0x00, 0xf5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x30-0x37 */ | ||
178 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x38-0x3f */ | ||
179 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x40-0x47 */ | ||
180 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x48-0x4f */ | ||
181 | 0x00, 0x00, 0xce, 0xcf, 0x00, 0x00, 0x00, 0x00, /* 0x50-0x57 */ | ||
182 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x58-0x5f */ | ||
183 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x60-0x67 */ | ||
184 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x68-0x6f */ | ||
185 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */ | ||
186 | 0xd9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x78-0x7f */ | ||
187 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x80-0x87 */ | ||
188 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x88-0x8f */ | ||
189 | 0x00, 0x00, 0xc4, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x90-0x97 */ | ||
190 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x98-0x9f */ | ||
191 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa0-0xa7 */ | ||
192 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa8-0xaf */ | ||
193 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xb0-0xb7 */ | ||
194 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xb8-0xbf */ | ||
195 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc0-0xc7 */ | ||
196 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc8-0xcf */ | ||
197 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd0-0xd7 */ | ||
198 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd8-0xdf */ | ||
199 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe0-0xe7 */ | ||
200 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe8-0xef */ | ||
201 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xf0-0xf7 */ | ||
202 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xf8-0xff */ | ||
203 | }; | ||
204 | |||
205 | static const unsigned char page02[256] = { | ||
206 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x00-0x07 */ | ||
207 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x08-0x0f */ | ||
208 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10-0x17 */ | ||
209 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x18-0x1f */ | ||
210 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x20-0x27 */ | ||
211 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x28-0x2f */ | ||
212 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x30-0x37 */ | ||
213 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x38-0x3f */ | ||
214 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x40-0x47 */ | ||
215 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x48-0x4f */ | ||
216 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x50-0x57 */ | ||
217 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x58-0x5f */ | ||
218 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x60-0x67 */ | ||
219 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x68-0x6f */ | ||
220 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */ | ||
221 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x78-0x7f */ | ||
222 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x80-0x87 */ | ||
223 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x88-0x8f */ | ||
224 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x90-0x97 */ | ||
225 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x98-0x9f */ | ||
226 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa0-0xa7 */ | ||
227 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa8-0xaf */ | ||
228 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xb0-0xb7 */ | ||
229 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xb8-0xbf */ | ||
230 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf6, 0xff, /* 0xc0-0xc7 */ | ||
231 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc8-0xcf */ | ||
232 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd0-0xd7 */ | ||
233 | 0xf9, 0xfa, 0xfb, 0xfe, 0xf7, 0xfd, 0x00, 0x00, /* 0xd8-0xdf */ | ||
234 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe0-0xe7 */ | ||
235 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe8-0xef */ | ||
236 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xf0-0xf7 */ | ||
237 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xf8-0xff */ | ||
238 | }; | ||
239 | |||
240 | static const unsigned char page03[256] = { | ||
241 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x00-0x07 */ | ||
242 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x08-0x0f */ | ||
243 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10-0x17 */ | ||
244 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x18-0x1f */ | ||
245 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x20-0x27 */ | ||
246 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x28-0x2f */ | ||
247 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x30-0x37 */ | ||
248 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x38-0x3f */ | ||
249 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x40-0x47 */ | ||
250 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x48-0x4f */ | ||
251 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x50-0x57 */ | ||
252 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x58-0x5f */ | ||
253 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x60-0x67 */ | ||
254 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x68-0x6f */ | ||
255 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */ | ||
256 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x78-0x7f */ | ||
257 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x80-0x87 */ | ||
258 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x88-0x8f */ | ||
259 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x90-0x97 */ | ||
260 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x98-0x9f */ | ||
261 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa0-0xa7 */ | ||
262 | 0x00, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa8-0xaf */ | ||
263 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xb0-0xb7 */ | ||
264 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xb8-0xbf */ | ||
265 | 0xb9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc0-0xc7 */ | ||
266 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc8-0xcf */ | ||
267 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd0-0xd7 */ | ||
268 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd8-0xdf */ | ||
269 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe0-0xe7 */ | ||
270 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe8-0xef */ | ||
271 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xf0-0xf7 */ | ||
272 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xf8-0xff */ | ||
273 | }; | ||
274 | |||
275 | static const unsigned char page20[256] = { | ||
276 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x00-0x07 */ | ||
277 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x08-0x0f */ | ||
278 | 0x00, 0x00, 0x00, 0xd0, 0xd1, 0x00, 0x00, 0x00, /* 0x10-0x17 */ | ||
279 | 0xd4, 0xd5, 0xe2, 0x00, 0xd2, 0xd3, 0xe3, 0x00, /* 0x18-0x1f */ | ||
280 | 0x00, 0x00, 0xa5, 0x00, 0x00, 0x00, 0xc9, 0x00, /* 0x20-0x27 */ | ||
281 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x28-0x2f */ | ||
282 | 0xe4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x30-0x37 */ | ||
283 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x38-0x3f */ | ||
284 | 0x00, 0x00, 0x00, 0x00, 0xda, 0x00, 0x00, 0x00, /* 0x40-0x47 */ | ||
285 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x48-0x4f */ | ||
286 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x50-0x57 */ | ||
287 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x58-0x5f */ | ||
288 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x60-0x67 */ | ||
289 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x68-0x6f */ | ||
290 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */ | ||
291 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x78-0x7f */ | ||
292 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x80-0x87 */ | ||
293 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x88-0x8f */ | ||
294 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x90-0x97 */ | ||
295 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x98-0x9f */ | ||
296 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa0-0xa7 */ | ||
297 | 0x00, 0x00, 0x00, 0x00, 0xdb, 0x00, 0x00, 0x00, /* 0xa8-0xaf */ | ||
298 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xb0-0xb7 */ | ||
299 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xb8-0xbf */ | ||
300 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc0-0xc7 */ | ||
301 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc8-0xcf */ | ||
302 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd0-0xd7 */ | ||
303 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd8-0xdf */ | ||
304 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe0-0xe7 */ | ||
305 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe8-0xef */ | ||
306 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xf0-0xf7 */ | ||
307 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xf8-0xff */ | ||
308 | }; | ||
309 | |||
310 | static const unsigned char page21[256] = { | ||
311 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x00-0x07 */ | ||
312 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x08-0x0f */ | ||
313 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10-0x17 */ | ||
314 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x18-0x1f */ | ||
315 | 0x00, 0x00, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x20-0x27 */ | ||
316 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x28-0x2f */ | ||
317 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x30-0x37 */ | ||
318 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x38-0x3f */ | ||
319 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x40-0x47 */ | ||
320 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x48-0x4f */ | ||
321 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x50-0x57 */ | ||
322 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x58-0x5f */ | ||
323 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x60-0x67 */ | ||
324 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x68-0x6f */ | ||
325 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */ | ||
326 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x78-0x7f */ | ||
327 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x80-0x87 */ | ||
328 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x88-0x8f */ | ||
329 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x90-0x97 */ | ||
330 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x98-0x9f */ | ||
331 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa0-0xa7 */ | ||
332 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa8-0xaf */ | ||
333 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xb0-0xb7 */ | ||
334 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xb8-0xbf */ | ||
335 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc0-0xc7 */ | ||
336 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc8-0xcf */ | ||
337 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd0-0xd7 */ | ||
338 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd8-0xdf */ | ||
339 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe0-0xe7 */ | ||
340 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe8-0xef */ | ||
341 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xf0-0xf7 */ | ||
342 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xf8-0xff */ | ||
343 | }; | ||
344 | |||
345 | static const unsigned char page22[256] = { | ||
346 | 0x00, 0x00, 0xb6, 0x00, 0x00, 0x00, 0xc6, 0x00, /* 0x00-0x07 */ | ||
347 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb8, /* 0x08-0x0f */ | ||
348 | 0x00, 0xb7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10-0x17 */ | ||
349 | 0x00, 0x00, 0xc3, 0x00, 0x00, 0x00, 0xb0, 0x00, /* 0x18-0x1f */ | ||
350 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x20-0x27 */ | ||
351 | 0x00, 0x00, 0x00, 0xba, 0x00, 0x00, 0x00, 0x00, /* 0x28-0x2f */ | ||
352 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x30-0x37 */ | ||
353 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x38-0x3f */ | ||
354 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x40-0x47 */ | ||
355 | 0xc5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x48-0x4f */ | ||
356 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x50-0x57 */ | ||
357 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x58-0x5f */ | ||
358 | 0xad, 0x00, 0x00, 0x00, 0xb2, 0xb3, 0x00, 0x00, /* 0x60-0x67 */ | ||
359 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x68-0x6f */ | ||
360 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */ | ||
361 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x78-0x7f */ | ||
362 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x80-0x87 */ | ||
363 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x88-0x8f */ | ||
364 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x90-0x97 */ | ||
365 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x98-0x9f */ | ||
366 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa0-0xa7 */ | ||
367 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa8-0xaf */ | ||
368 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xb0-0xb7 */ | ||
369 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xb8-0xbf */ | ||
370 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc0-0xc7 */ | ||
371 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc8-0xcf */ | ||
372 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd0-0xd7 */ | ||
373 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd8-0xdf */ | ||
374 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe0-0xe7 */ | ||
375 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe8-0xef */ | ||
376 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xf0-0xf7 */ | ||
377 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xf8-0xff */ | ||
378 | }; | ||
379 | |||
380 | static const unsigned char page25[256] = { | ||
381 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x00-0x07 */ | ||
382 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x08-0x0f */ | ||
383 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10-0x17 */ | ||
384 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x18-0x1f */ | ||
385 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x20-0x27 */ | ||
386 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x28-0x2f */ | ||
387 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x30-0x37 */ | ||
388 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x38-0x3f */ | ||
389 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x40-0x47 */ | ||
390 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x48-0x4f */ | ||
391 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x50-0x57 */ | ||
392 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x58-0x5f */ | ||
393 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x60-0x67 */ | ||
394 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x68-0x6f */ | ||
395 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */ | ||
396 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x78-0x7f */ | ||
397 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x80-0x87 */ | ||
398 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x88-0x8f */ | ||
399 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x90-0x97 */ | ||
400 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x98-0x9f */ | ||
401 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa0-0xa7 */ | ||
402 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa8-0xaf */ | ||
403 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xb0-0xb7 */ | ||
404 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xb8-0xbf */ | ||
405 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc0-0xc7 */ | ||
406 | 0x00, 0x00, 0xd7, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc8-0xcf */ | ||
407 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd0-0xd7 */ | ||
408 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd8-0xdf */ | ||
409 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe0-0xe7 */ | ||
410 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe8-0xef */ | ||
411 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xf0-0xf7 */ | ||
412 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xf8-0xff */ | ||
413 | }; | ||
414 | |||
415 | static const unsigned char pagef8[256] = { | ||
416 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x00-0x07 */ | ||
417 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x08-0x0f */ | ||
418 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10-0x17 */ | ||
419 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x18-0x1f */ | ||
420 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x20-0x27 */ | ||
421 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x28-0x2f */ | ||
422 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x30-0x37 */ | ||
423 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x38-0x3f */ | ||
424 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x40-0x47 */ | ||
425 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x48-0x4f */ | ||
426 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x50-0x57 */ | ||
427 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x58-0x5f */ | ||
428 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x60-0x67 */ | ||
429 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x68-0x6f */ | ||
430 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */ | ||
431 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x78-0x7f */ | ||
432 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x80-0x87 */ | ||
433 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x88-0x8f */ | ||
434 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x90-0x97 */ | ||
435 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x98-0x9f */ | ||
436 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa0-0xa7 */ | ||
437 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa8-0xaf */ | ||
438 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xb0-0xb7 */ | ||
439 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xb8-0xbf */ | ||
440 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc0-0xc7 */ | ||
441 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc8-0xcf */ | ||
442 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd0-0xd7 */ | ||
443 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd8-0xdf */ | ||
444 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe0-0xe7 */ | ||
445 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe8-0xef */ | ||
446 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xf0-0xf7 */ | ||
447 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, /* 0xf8-0xff */ | ||
448 | }; | ||
449 | |||
450 | static const unsigned char *const page_uni2charset[256] = { | ||
451 | page00, page01, page02, page03, NULL, NULL, NULL, NULL, | ||
452 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
453 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
454 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
455 | page20, page21, page22, NULL, NULL, page25, NULL, NULL, | ||
456 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
457 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
458 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
459 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
460 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
461 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
462 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
463 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
464 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
465 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
466 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
467 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
468 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
469 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
470 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
471 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
472 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
473 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
474 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
475 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
476 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
477 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
478 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
479 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
480 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
481 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
482 | pagef8, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
483 | }; | ||
484 | |||
485 | static const unsigned char charset2lower[256] = { | ||
486 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x00-0x07 */ | ||
487 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x08-0x0f */ | ||
488 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x10-0x17 */ | ||
489 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x18-0x1f */ | ||
490 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x20-0x27 */ | ||
491 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x28-0x2f */ | ||
492 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x30-0x37 */ | ||
493 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x38-0x3f */ | ||
494 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x40-0x47 */ | ||
495 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x48-0x4f */ | ||
496 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x50-0x57 */ | ||
497 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x58-0x5f */ | ||
498 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x60-0x67 */ | ||
499 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x68-0x6f */ | ||
500 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x70-0x77 */ | ||
501 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x78-0x7f */ | ||
502 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x80-0x87 */ | ||
503 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x88-0x8f */ | ||
504 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x90-0x97 */ | ||
505 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x98-0x9f */ | ||
506 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0xa0-0xa7 */ | ||
507 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0xa8-0xaf */ | ||
508 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0xb0-0xb7 */ | ||
509 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0xb8-0xbf */ | ||
510 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0xc0-0xc7 */ | ||
511 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0xc8-0xcf */ | ||
512 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0xd0-0xd7 */ | ||
513 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0xd8-0xdf */ | ||
514 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0xe0-0xe7 */ | ||
515 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0xe8-0xef */ | ||
516 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0xf0-0xf7 */ | ||
517 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0xf8-0xff */ | ||
518 | }; | ||
519 | |||
520 | static const unsigned char charset2upper[256] = { | ||
521 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x00-0x07 */ | ||
522 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x08-0x0f */ | ||
523 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x10-0x17 */ | ||
524 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x18-0x1f */ | ||
525 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x20-0x27 */ | ||
526 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x28-0x2f */ | ||
527 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x30-0x37 */ | ||
528 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x38-0x3f */ | ||
529 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x40-0x47 */ | ||
530 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x48-0x4f */ | ||
531 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x50-0x57 */ | ||
532 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x58-0x5f */ | ||
533 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x60-0x67 */ | ||
534 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x68-0x6f */ | ||
535 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x70-0x77 */ | ||
536 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x78-0x7f */ | ||
537 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x80-0x87 */ | ||
538 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x88-0x8f */ | ||
539 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x90-0x97 */ | ||
540 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x98-0x9f */ | ||
541 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0xa0-0xa7 */ | ||
542 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0xa8-0xaf */ | ||
543 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0xb0-0xb7 */ | ||
544 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0xb8-0xbf */ | ||
545 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0xc0-0xc7 */ | ||
546 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0xc8-0xcf */ | ||
547 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0xd0-0xd7 */ | ||
548 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0xd8-0xdf */ | ||
549 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0xe0-0xe7 */ | ||
550 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0xe8-0xef */ | ||
551 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0xf0-0xf7 */ | ||
552 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0xf8-0xff */ | ||
553 | }; | ||
554 | |||
555 | static int uni2char(wchar_t uni, unsigned char *out, int boundlen) | ||
556 | { | ||
557 | const unsigned char *uni2charset; | ||
558 | unsigned char cl = uni & 0x00ff; | ||
559 | unsigned char ch = (uni & 0xff00) >> 8; | ||
560 | |||
561 | if (boundlen <= 0) | ||
562 | return -ENAMETOOLONG; | ||
563 | |||
564 | uni2charset = page_uni2charset[ch]; | ||
565 | if (uni2charset && uni2charset[cl]) | ||
566 | out[0] = uni2charset[cl]; | ||
567 | else | ||
568 | return -EINVAL; | ||
569 | return 1; | ||
570 | } | ||
571 | |||
572 | static int char2uni(const unsigned char *rawstring, int boundlen, wchar_t *uni) | ||
573 | { | ||
574 | *uni = charset2uni[*rawstring]; | ||
575 | if (*uni == 0x0000) | ||
576 | return -EINVAL; | ||
577 | return 1; | ||
578 | } | ||
579 | |||
580 | static struct nls_table table = { | ||
581 | .charset = "maciceland", | ||
582 | .uni2char = uni2char, | ||
583 | .char2uni = char2uni, | ||
584 | .charset2lower = charset2lower, | ||
585 | .charset2upper = charset2upper, | ||
586 | .owner = THIS_MODULE, | ||
587 | }; | ||
588 | |||
589 | static int __init init_nls_maciceland(void) | ||
590 | { | ||
591 | return register_nls(&table); | ||
592 | } | ||
593 | |||
594 | static void __exit exit_nls_maciceland(void) | ||
595 | { | ||
596 | unregister_nls(&table); | ||
597 | } | ||
598 | |||
599 | module_init(init_nls_maciceland) | ||
600 | module_exit(exit_nls_maciceland) | ||
601 | |||
602 | MODULE_LICENSE("Dual BSD/GPL"); | ||
diff --git a/fs/nls/nls_macinuit.c b/fs/nls/nls_macinuit.c new file mode 100644 index 000000000000..f333d98941d6 --- /dev/null +++ b/fs/nls/nls_macinuit.c | |||
@@ -0,0 +1,532 @@ | |||
1 | /* | ||
2 | * linux/fs/nls/nls_macinuit.c | ||
3 | * | ||
4 | * Charset macinuit translation tables. | ||
5 | * Generated automatically from the Unicode and charset | ||
6 | * tables from the Unicode Organization (www.unicode.org). | ||
7 | * The Unicode to charset table has only exact mappings. | ||
8 | */ | ||
9 | |||
10 | /* | ||
11 | * COPYRIGHT AND PERMISSION NOTICE | ||
12 | * | ||
13 | * Copyright 1991-2012 Unicode, Inc. All rights reserved. Distributed under | ||
14 | * the Terms of Use in http://www.unicode.org/copyright.html. | ||
15 | * | ||
16 | * Permission is hereby granted, free of charge, to any person obtaining a | ||
17 | * copy of the Unicode data files and any associated documentation (the "Data | ||
18 | * Files") or Unicode software and any associated documentation (the | ||
19 | * "Software") to deal in the Data Files or Software without restriction, | ||
20 | * including without limitation the rights to use, copy, modify, merge, | ||
21 | * publish, distribute, and/or sell copies of the Data Files or Software, and | ||
22 | * to permit persons to whom the Data Files or Software are furnished to do | ||
23 | * so, provided that (a) the above copyright notice(s) and this permission | ||
24 | * notice appear with all copies of the Data Files or Software, (b) both the | ||
25 | * above copyright notice(s) and this permission notice appear in associated | ||
26 | * documentation, and (c) there is clear notice in each modified Data File or | ||
27 | * in the Software as well as in the documentation associated with the Data | ||
28 | * File(s) or Software that the data or software has been modified. | ||
29 | * | ||
30 | * THE DATA FILES AND SOFTWARE ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY | ||
31 | * KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF | ||
32 | * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF | ||
33 | * THIRD PARTY RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS | ||
34 | * INCLUDED IN THIS NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT | ||
35 | * OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF | ||
36 | * USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR | ||
37 | * OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR | ||
38 | * PERFORMANCE OF THE DATA FILES OR SOFTWARE. | ||
39 | * | ||
40 | * Except as contained in this notice, the name of a copyright holder shall | ||
41 | * not be used in advertising or otherwise to promote the sale, use or other | ||
42 | * dealings in these Data Files or Software without prior written | ||
43 | * authorization of the copyright holder. | ||
44 | */ | ||
45 | |||
46 | #include <linux/module.h> | ||
47 | #include <linux/kernel.h> | ||
48 | #include <linux/string.h> | ||
49 | #include <linux/nls.h> | ||
50 | #include <linux/errno.h> | ||
51 | |||
52 | static const wchar_t charset2uni[256] = { | ||
53 | /* 0x00 */ | ||
54 | 0x0000, 0x0001, 0x0002, 0x0003, | ||
55 | 0x0004, 0x0005, 0x0006, 0x0007, | ||
56 | 0x0008, 0x0009, 0x000a, 0x000b, | ||
57 | 0x000c, 0x000d, 0x000e, 0x000f, | ||
58 | /* 0x10 */ | ||
59 | 0x0010, 0x0011, 0x0012, 0x0013, | ||
60 | 0x0014, 0x0015, 0x0016, 0x0017, | ||
61 | 0x0018, 0x0019, 0x001a, 0x001b, | ||
62 | 0x001c, 0x001d, 0x001e, 0x001f, | ||
63 | /* 0x20 */ | ||
64 | 0x0020, 0x0021, 0x0022, 0x0023, | ||
65 | 0x0024, 0x0025, 0x0026, 0x0027, | ||
66 | 0x0028, 0x0029, 0x002a, 0x002b, | ||
67 | 0x002c, 0x002d, 0x002e, 0x002f, | ||
68 | /* 0x30 */ | ||
69 | 0x0030, 0x0031, 0x0032, 0x0033, | ||
70 | 0x0034, 0x0035, 0x0036, 0x0037, | ||
71 | 0x0038, 0x0039, 0x003a, 0x003b, | ||
72 | 0x003c, 0x003d, 0x003e, 0x003f, | ||
73 | /* 0x40 */ | ||
74 | 0x0040, 0x0041, 0x0042, 0x0043, | ||
75 | 0x0044, 0x0045, 0x0046, 0x0047, | ||
76 | 0x0048, 0x0049, 0x004a, 0x004b, | ||
77 | 0x004c, 0x004d, 0x004e, 0x004f, | ||
78 | /* 0x50 */ | ||
79 | 0x0050, 0x0051, 0x0052, 0x0053, | ||
80 | 0x0054, 0x0055, 0x0056, 0x0057, | ||
81 | 0x0058, 0x0059, 0x005a, 0x005b, | ||
82 | 0x005c, 0x005d, 0x005e, 0x005f, | ||
83 | /* 0x60 */ | ||
84 | 0x0060, 0x0061, 0x0062, 0x0063, | ||
85 | 0x0064, 0x0065, 0x0066, 0x0067, | ||
86 | 0x0068, 0x0069, 0x006a, 0x006b, | ||
87 | 0x006c, 0x006d, 0x006e, 0x006f, | ||
88 | /* 0x70 */ | ||
89 | 0x0070, 0x0071, 0x0072, 0x0073, | ||
90 | 0x0074, 0x0075, 0x0076, 0x0077, | ||
91 | 0x0078, 0x0079, 0x007a, 0x007b, | ||
92 | 0x007c, 0x007d, 0x007e, 0x007f, | ||
93 | /* 0x80 */ | ||
94 | 0x1403, 0x1404, 0x1405, 0x1406, | ||
95 | 0x140a, 0x140b, 0x1431, 0x1432, | ||
96 | 0x1433, 0x1434, 0x1438, 0x1439, | ||
97 | 0x1449, 0x144e, 0x144f, 0x1450, | ||
98 | /* 0x90 */ | ||
99 | 0x1451, 0x1455, 0x1456, 0x1466, | ||
100 | 0x146d, 0x146e, 0x146f, 0x1470, | ||
101 | 0x1472, 0x1473, 0x1483, 0x148b, | ||
102 | 0x148c, 0x148d, 0x148e, 0x1490, | ||
103 | /* 0xa0 */ | ||
104 | 0x1491, 0x00b0, 0x14a1, 0x14a5, | ||
105 | 0x14a6, 0x2022, 0x00b6, 0x14a7, | ||
106 | 0x00ae, 0x00a9, 0x2122, 0x14a8, | ||
107 | 0x14aa, 0x14ab, 0x14bb, 0x14c2, | ||
108 | /* 0xb0 */ | ||
109 | 0x14c3, 0x14c4, 0x14c5, 0x14c7, | ||
110 | 0x14c8, 0x14d0, 0x14ef, 0x14f0, | ||
111 | 0x14f1, 0x14f2, 0x14f4, 0x14f5, | ||
112 | 0x1505, 0x14d5, 0x14d6, 0x14d7, | ||
113 | /* 0xc0 */ | ||
114 | 0x14d8, 0x14da, 0x14db, 0x14ea, | ||
115 | 0x1528, 0x1529, 0x152a, 0x152b, | ||
116 | 0x152d, 0x2026, 0x00a0, 0x152e, | ||
117 | 0x153e, 0x1555, 0x1556, 0x1557, | ||
118 | /* 0xd0 */ | ||
119 | 0x2013, 0x2014, 0x201c, 0x201d, | ||
120 | 0x2018, 0x2019, 0x1558, 0x1559, | ||
121 | 0x155a, 0x155d, 0x1546, 0x1547, | ||
122 | 0x1548, 0x1549, 0x154b, 0x154c, | ||
123 | /* 0xe0 */ | ||
124 | 0x1550, 0x157f, 0x1580, 0x1581, | ||
125 | 0x1582, 0x1583, 0x1584, 0x1585, | ||
126 | 0x158f, 0x1590, 0x1591, 0x1592, | ||
127 | 0x1593, 0x1594, 0x1595, 0x1671, | ||
128 | /* 0xf0 */ | ||
129 | 0x1672, 0x1673, 0x1674, 0x1675, | ||
130 | 0x1676, 0x1596, 0x15a0, 0x15a1, | ||
131 | 0x15a2, 0x15a3, 0x15a4, 0x15a5, | ||
132 | 0x15a6, 0x157c, 0x0141, 0x0142, | ||
133 | }; | ||
134 | |||
135 | static const unsigned char page00[256] = { | ||
136 | 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, /* 0x00-0x07 */ | ||
137 | 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, /* 0x08-0x0f */ | ||
138 | 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, /* 0x10-0x17 */ | ||
139 | 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, /* 0x18-0x1f */ | ||
140 | 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, /* 0x20-0x27 */ | ||
141 | 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, /* 0x28-0x2f */ | ||
142 | 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, /* 0x30-0x37 */ | ||
143 | 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, /* 0x38-0x3f */ | ||
144 | 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, /* 0x40-0x47 */ | ||
145 | 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, /* 0x48-0x4f */ | ||
146 | 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, /* 0x50-0x57 */ | ||
147 | 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f, /* 0x58-0x5f */ | ||
148 | 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, /* 0x60-0x67 */ | ||
149 | 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, /* 0x68-0x6f */ | ||
150 | 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, /* 0x70-0x77 */ | ||
151 | 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f, /* 0x78-0x7f */ | ||
152 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x80-0x87 */ | ||
153 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x88-0x8f */ | ||
154 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x90-0x97 */ | ||
155 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x98-0x9f */ | ||
156 | 0xca, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa0-0xa7 */ | ||
157 | 0x00, 0xa9, 0x00, 0x00, 0x00, 0x00, 0xa8, 0x00, /* 0xa8-0xaf */ | ||
158 | 0xa1, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa6, 0x00, /* 0xb0-0xb7 */ | ||
159 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xb8-0xbf */ | ||
160 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc0-0xc7 */ | ||
161 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc8-0xcf */ | ||
162 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd0-0xd7 */ | ||
163 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd8-0xdf */ | ||
164 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe0-0xe7 */ | ||
165 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe8-0xef */ | ||
166 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xf0-0xf7 */ | ||
167 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xf8-0xff */ | ||
168 | }; | ||
169 | |||
170 | static const unsigned char page01[256] = { | ||
171 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x00-0x07 */ | ||
172 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x08-0x0f */ | ||
173 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10-0x17 */ | ||
174 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x18-0x1f */ | ||
175 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x20-0x27 */ | ||
176 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x28-0x2f */ | ||
177 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x30-0x37 */ | ||
178 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x38-0x3f */ | ||
179 | 0x00, 0xfe, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x40-0x47 */ | ||
180 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x48-0x4f */ | ||
181 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x50-0x57 */ | ||
182 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x58-0x5f */ | ||
183 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x60-0x67 */ | ||
184 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x68-0x6f */ | ||
185 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */ | ||
186 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x78-0x7f */ | ||
187 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x80-0x87 */ | ||
188 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x88-0x8f */ | ||
189 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x90-0x97 */ | ||
190 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x98-0x9f */ | ||
191 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa0-0xa7 */ | ||
192 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa8-0xaf */ | ||
193 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xb0-0xb7 */ | ||
194 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xb8-0xbf */ | ||
195 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc0-0xc7 */ | ||
196 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc8-0xcf */ | ||
197 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd0-0xd7 */ | ||
198 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd8-0xdf */ | ||
199 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe0-0xe7 */ | ||
200 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe8-0xef */ | ||
201 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xf0-0xf7 */ | ||
202 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xf8-0xff */ | ||
203 | }; | ||
204 | |||
205 | static const unsigned char page14[256] = { | ||
206 | 0x00, 0x00, 0x00, 0x80, 0x81, 0x82, 0x83, 0x00, /* 0x00-0x07 */ | ||
207 | 0x00, 0x00, 0x84, 0x85, 0x00, 0x00, 0x00, 0x00, /* 0x08-0x0f */ | ||
208 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10-0x17 */ | ||
209 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x18-0x1f */ | ||
210 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x20-0x27 */ | ||
211 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x28-0x2f */ | ||
212 | 0x00, 0x86, 0x87, 0x88, 0x89, 0x00, 0x00, 0x00, /* 0x30-0x37 */ | ||
213 | 0x8a, 0x8b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x38-0x3f */ | ||
214 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x40-0x47 */ | ||
215 | 0x00, 0x8c, 0x00, 0x00, 0x00, 0x00, 0x8d, 0x8e, /* 0x48-0x4f */ | ||
216 | 0x8f, 0x90, 0x00, 0x00, 0x00, 0x91, 0x92, 0x00, /* 0x50-0x57 */ | ||
217 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x58-0x5f */ | ||
218 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x93, 0x00, /* 0x60-0x67 */ | ||
219 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x94, 0x95, 0x96, /* 0x68-0x6f */ | ||
220 | 0x97, 0x00, 0x98, 0x99, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */ | ||
221 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x78-0x7f */ | ||
222 | 0x00, 0x00, 0x00, 0x9a, 0x00, 0x00, 0x00, 0x00, /* 0x80-0x87 */ | ||
223 | 0x00, 0x00, 0x00, 0x9b, 0x9c, 0x9d, 0x9e, 0x00, /* 0x88-0x8f */ | ||
224 | 0x9f, 0xa0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x90-0x97 */ | ||
225 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x98-0x9f */ | ||
226 | 0x00, 0xa2, 0x00, 0x00, 0x00, 0xa3, 0xa4, 0xa7, /* 0xa0-0xa7 */ | ||
227 | 0xab, 0x00, 0xac, 0xad, 0x00, 0x00, 0x00, 0x00, /* 0xa8-0xaf */ | ||
228 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xb0-0xb7 */ | ||
229 | 0x00, 0x00, 0x00, 0xae, 0x00, 0x00, 0x00, 0x00, /* 0xb8-0xbf */ | ||
230 | 0x00, 0x00, 0xaf, 0xb0, 0xb1, 0xb2, 0x00, 0xb3, /* 0xc0-0xc7 */ | ||
231 | 0xb4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc8-0xcf */ | ||
232 | 0xb5, 0x00, 0x00, 0x00, 0x00, 0xbd, 0xbe, 0xbf, /* 0xd0-0xd7 */ | ||
233 | 0xc0, 0x00, 0xc1, 0xc2, 0x00, 0x00, 0x00, 0x00, /* 0xd8-0xdf */ | ||
234 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe0-0xe7 */ | ||
235 | 0x00, 0x00, 0xc3, 0x00, 0x00, 0x00, 0x00, 0xb6, /* 0xe8-0xef */ | ||
236 | 0xb7, 0xb8, 0xb9, 0x00, 0xba, 0xbb, 0x00, 0x00, /* 0xf0-0xf7 */ | ||
237 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xf8-0xff */ | ||
238 | }; | ||
239 | |||
240 | static const unsigned char page15[256] = { | ||
241 | 0x00, 0x00, 0x00, 0x00, 0x00, 0xbc, 0x00, 0x00, /* 0x00-0x07 */ | ||
242 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x08-0x0f */ | ||
243 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10-0x17 */ | ||
244 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x18-0x1f */ | ||
245 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x20-0x27 */ | ||
246 | 0xc4, 0xc5, 0xc6, 0xc7, 0x00, 0xc8, 0xcb, 0x00, /* 0x28-0x2f */ | ||
247 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x30-0x37 */ | ||
248 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xcc, 0x00, /* 0x38-0x3f */ | ||
249 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xda, 0xdb, /* 0x40-0x47 */ | ||
250 | 0xdc, 0xdd, 0x00, 0xde, 0xdf, 0x00, 0x00, 0x00, /* 0x48-0x4f */ | ||
251 | 0xe0, 0x00, 0x00, 0x00, 0x00, 0xcd, 0xce, 0xcf, /* 0x50-0x57 */ | ||
252 | 0xd6, 0xd7, 0xd8, 0x00, 0x00, 0xd9, 0x00, 0x00, /* 0x58-0x5f */ | ||
253 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x60-0x67 */ | ||
254 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x68-0x6f */ | ||
255 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */ | ||
256 | 0x00, 0x00, 0x00, 0x00, 0xfd, 0x00, 0x00, 0xe1, /* 0x78-0x7f */ | ||
257 | 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0x00, 0x00, /* 0x80-0x87 */ | ||
258 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe8, /* 0x88-0x8f */ | ||
259 | 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xf5, 0x00, /* 0x90-0x97 */ | ||
260 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x98-0x9f */ | ||
261 | 0xf6, 0xf7, 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0x00, /* 0xa0-0xa7 */ | ||
262 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa8-0xaf */ | ||
263 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xb0-0xb7 */ | ||
264 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xb8-0xbf */ | ||
265 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc0-0xc7 */ | ||
266 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc8-0xcf */ | ||
267 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd0-0xd7 */ | ||
268 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd8-0xdf */ | ||
269 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe0-0xe7 */ | ||
270 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe8-0xef */ | ||
271 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xf0-0xf7 */ | ||
272 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xf8-0xff */ | ||
273 | }; | ||
274 | |||
275 | static const unsigned char page16[256] = { | ||
276 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x00-0x07 */ | ||
277 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x08-0x0f */ | ||
278 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10-0x17 */ | ||
279 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x18-0x1f */ | ||
280 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x20-0x27 */ | ||
281 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x28-0x2f */ | ||
282 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x30-0x37 */ | ||
283 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x38-0x3f */ | ||
284 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x40-0x47 */ | ||
285 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x48-0x4f */ | ||
286 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x50-0x57 */ | ||
287 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x58-0x5f */ | ||
288 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x60-0x67 */ | ||
289 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x68-0x6f */ | ||
290 | 0x00, 0xef, 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0x00, /* 0x70-0x77 */ | ||
291 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x78-0x7f */ | ||
292 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x80-0x87 */ | ||
293 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x88-0x8f */ | ||
294 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x90-0x97 */ | ||
295 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x98-0x9f */ | ||
296 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa0-0xa7 */ | ||
297 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa8-0xaf */ | ||
298 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xb0-0xb7 */ | ||
299 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xb8-0xbf */ | ||
300 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc0-0xc7 */ | ||
301 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc8-0xcf */ | ||
302 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd0-0xd7 */ | ||
303 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd8-0xdf */ | ||
304 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe0-0xe7 */ | ||
305 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe8-0xef */ | ||
306 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xf0-0xf7 */ | ||
307 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xf8-0xff */ | ||
308 | }; | ||
309 | |||
310 | static const unsigned char page20[256] = { | ||
311 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x00-0x07 */ | ||
312 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x08-0x0f */ | ||
313 | 0x00, 0x00, 0x00, 0xd0, 0xd1, 0x00, 0x00, 0x00, /* 0x10-0x17 */ | ||
314 | 0xd4, 0xd5, 0x00, 0x00, 0xd2, 0xd3, 0x00, 0x00, /* 0x18-0x1f */ | ||
315 | 0x00, 0x00, 0xa5, 0x00, 0x00, 0x00, 0xc9, 0x00, /* 0x20-0x27 */ | ||
316 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x28-0x2f */ | ||
317 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x30-0x37 */ | ||
318 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x38-0x3f */ | ||
319 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x40-0x47 */ | ||
320 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x48-0x4f */ | ||
321 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x50-0x57 */ | ||
322 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x58-0x5f */ | ||
323 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x60-0x67 */ | ||
324 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x68-0x6f */ | ||
325 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */ | ||
326 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x78-0x7f */ | ||
327 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x80-0x87 */ | ||
328 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x88-0x8f */ | ||
329 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x90-0x97 */ | ||
330 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x98-0x9f */ | ||
331 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa0-0xa7 */ | ||
332 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa8-0xaf */ | ||
333 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xb0-0xb7 */ | ||
334 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xb8-0xbf */ | ||
335 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc0-0xc7 */ | ||
336 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc8-0xcf */ | ||
337 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd0-0xd7 */ | ||
338 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd8-0xdf */ | ||
339 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe0-0xe7 */ | ||
340 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe8-0xef */ | ||
341 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xf0-0xf7 */ | ||
342 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xf8-0xff */ | ||
343 | }; | ||
344 | |||
345 | static const unsigned char page21[256] = { | ||
346 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x00-0x07 */ | ||
347 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x08-0x0f */ | ||
348 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10-0x17 */ | ||
349 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x18-0x1f */ | ||
350 | 0x00, 0x00, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x20-0x27 */ | ||
351 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x28-0x2f */ | ||
352 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x30-0x37 */ | ||
353 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x38-0x3f */ | ||
354 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x40-0x47 */ | ||
355 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x48-0x4f */ | ||
356 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x50-0x57 */ | ||
357 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x58-0x5f */ | ||
358 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x60-0x67 */ | ||
359 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x68-0x6f */ | ||
360 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */ | ||
361 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x78-0x7f */ | ||
362 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x80-0x87 */ | ||
363 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x88-0x8f */ | ||
364 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x90-0x97 */ | ||
365 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x98-0x9f */ | ||
366 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa0-0xa7 */ | ||
367 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa8-0xaf */ | ||
368 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xb0-0xb7 */ | ||
369 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xb8-0xbf */ | ||
370 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc0-0xc7 */ | ||
371 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc8-0xcf */ | ||
372 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd0-0xd7 */ | ||
373 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd8-0xdf */ | ||
374 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe0-0xe7 */ | ||
375 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe8-0xef */ | ||
376 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xf0-0xf7 */ | ||
377 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xf8-0xff */ | ||
378 | }; | ||
379 | |||
380 | static const unsigned char *const page_uni2charset[256] = { | ||
381 | page00, page01, NULL, NULL, NULL, NULL, NULL, NULL, | ||
382 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
383 | NULL, NULL, NULL, NULL, page14, page15, page16, NULL, | ||
384 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
385 | page20, page21, NULL, NULL, NULL, NULL, NULL, NULL, | ||
386 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
387 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
388 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
389 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
390 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
391 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
392 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
393 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
394 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
395 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
396 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
397 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
398 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
399 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
400 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
401 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
402 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
403 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
404 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
405 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
406 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
407 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
408 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
409 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
410 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
411 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
412 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
413 | }; | ||
414 | |||
415 | static const unsigned char charset2lower[256] = { | ||
416 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x00-0x07 */ | ||
417 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x08-0x0f */ | ||
418 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x10-0x17 */ | ||
419 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x18-0x1f */ | ||
420 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x20-0x27 */ | ||
421 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x28-0x2f */ | ||
422 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x30-0x37 */ | ||
423 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x38-0x3f */ | ||
424 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x40-0x47 */ | ||
425 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x48-0x4f */ | ||
426 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x50-0x57 */ | ||
427 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x58-0x5f */ | ||
428 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x60-0x67 */ | ||
429 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x68-0x6f */ | ||
430 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x70-0x77 */ | ||
431 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x78-0x7f */ | ||
432 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x80-0x87 */ | ||
433 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x88-0x8f */ | ||
434 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x90-0x97 */ | ||
435 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x98-0x9f */ | ||
436 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0xa0-0xa7 */ | ||
437 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0xa8-0xaf */ | ||
438 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0xb0-0xb7 */ | ||
439 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0xb8-0xbf */ | ||
440 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0xc0-0xc7 */ | ||
441 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0xc8-0xcf */ | ||
442 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0xd0-0xd7 */ | ||
443 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0xd8-0xdf */ | ||
444 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0xe0-0xe7 */ | ||
445 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0xe8-0xef */ | ||
446 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0xf0-0xf7 */ | ||
447 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0xf8-0xff */ | ||
448 | }; | ||
449 | |||
450 | static const unsigned char charset2upper[256] = { | ||
451 | 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, /* 0x00-0x07 */ | ||
452 | 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, /* 0x08-0x0f */ | ||
453 | 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, /* 0x10-0x17 */ | ||
454 | 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, /* 0x18-0x1f */ | ||
455 | 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, /* 0x20-0x27 */ | ||
456 | 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, /* 0x28-0x2f */ | ||
457 | 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, /* 0x30-0x37 */ | ||
458 | 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, /* 0x38-0x3f */ | ||
459 | 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, /* 0x40-0x47 */ | ||
460 | 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, /* 0x48-0x4f */ | ||
461 | 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, /* 0x50-0x57 */ | ||
462 | 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, /* 0x58-0x5f */ | ||
463 | 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, /* 0x60-0x67 */ | ||
464 | 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, /* 0x68-0x6f */ | ||
465 | 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, /* 0x70-0x77 */ | ||
466 | 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, /* 0x78-0x7f */ | ||
467 | 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, /* 0x80-0x87 */ | ||
468 | 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, /* 0x88-0x8f */ | ||
469 | 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, /* 0x90-0x97 */ | ||
470 | 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, /* 0x98-0x9f */ | ||
471 | 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, /* 0xa0-0xa7 */ | ||
472 | 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, /* 0xa8-0xaf */ | ||
473 | 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, /* 0xb0-0xb7 */ | ||
474 | 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, /* 0xb8-0xbf */ | ||
475 | 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, /* 0xc0-0xc7 */ | ||
476 | 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, /* 0xc8-0xcf */ | ||
477 | 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, /* 0xd0-0xd7 */ | ||
478 | 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, /* 0xd8-0xdf */ | ||
479 | 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, /* 0xe0-0xe7 */ | ||
480 | 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, /* 0xe8-0xef */ | ||
481 | 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, /* 0xf0-0xf7 */ | ||
482 | 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, /* 0xf8-0xff */ | ||
483 | }; | ||
484 | |||
485 | static int uni2char(wchar_t uni, unsigned char *out, int boundlen) | ||
486 | { | ||
487 | const unsigned char *uni2charset; | ||
488 | unsigned char cl = uni & 0x00ff; | ||
489 | unsigned char ch = (uni & 0xff00) >> 8; | ||
490 | |||
491 | if (boundlen <= 0) | ||
492 | return -ENAMETOOLONG; | ||
493 | |||
494 | uni2charset = page_uni2charset[ch]; | ||
495 | if (uni2charset && uni2charset[cl]) | ||
496 | out[0] = uni2charset[cl]; | ||
497 | else | ||
498 | return -EINVAL; | ||
499 | return 1; | ||
500 | } | ||
501 | |||
502 | static int char2uni(const unsigned char *rawstring, int boundlen, wchar_t *uni) | ||
503 | { | ||
504 | *uni = charset2uni[*rawstring]; | ||
505 | if (*uni == 0x0000) | ||
506 | return -EINVAL; | ||
507 | return 1; | ||
508 | } | ||
509 | |||
510 | static struct nls_table table = { | ||
511 | .charset = "macinuit", | ||
512 | .uni2char = uni2char, | ||
513 | .char2uni = char2uni, | ||
514 | .charset2lower = charset2lower, | ||
515 | .charset2upper = charset2upper, | ||
516 | .owner = THIS_MODULE, | ||
517 | }; | ||
518 | |||
519 | static int __init init_nls_macinuit(void) | ||
520 | { | ||
521 | return register_nls(&table); | ||
522 | } | ||
523 | |||
524 | static void __exit exit_nls_macinuit(void) | ||
525 | { | ||
526 | unregister_nls(&table); | ||
527 | } | ||
528 | |||
529 | module_init(init_nls_macinuit) | ||
530 | module_exit(exit_nls_macinuit) | ||
531 | |||
532 | MODULE_LICENSE("Dual BSD/GPL"); | ||
diff --git a/fs/nls/nls_macroman.c b/fs/nls/nls_macroman.c new file mode 100644 index 000000000000..6315a857ab68 --- /dev/null +++ b/fs/nls/nls_macroman.c | |||
@@ -0,0 +1,637 @@ | |||
1 | /* | ||
2 | * linux/fs/nls/nls_macroman.c | ||
3 | * | ||
4 | * Charset macroman translation tables. | ||
5 | * Generated automatically from the Unicode and charset | ||
6 | * tables from the Unicode Organization (www.unicode.org). | ||
7 | * The Unicode to charset table has only exact mappings. | ||
8 | */ | ||
9 | |||
10 | /* | ||
11 | * COPYRIGHT AND PERMISSION NOTICE | ||
12 | * | ||
13 | * Copyright 1991-2012 Unicode, Inc. All rights reserved. Distributed under | ||
14 | * the Terms of Use in http://www.unicode.org/copyright.html. | ||
15 | * | ||
16 | * Permission is hereby granted, free of charge, to any person obtaining a | ||
17 | * copy of the Unicode data files and any associated documentation (the "Data | ||
18 | * Files") or Unicode software and any associated documentation (the | ||
19 | * "Software") to deal in the Data Files or Software without restriction, | ||
20 | * including without limitation the rights to use, copy, modify, merge, | ||
21 | * publish, distribute, and/or sell copies of the Data Files or Software, and | ||
22 | * to permit persons to whom the Data Files or Software are furnished to do | ||
23 | * so, provided that (a) the above copyright notice(s) and this permission | ||
24 | * notice appear with all copies of the Data Files or Software, (b) both the | ||
25 | * above copyright notice(s) and this permission notice appear in associated | ||
26 | * documentation, and (c) there is clear notice in each modified Data File or | ||
27 | * in the Software as well as in the documentation associated with the Data | ||
28 | * File(s) or Software that the data or software has been modified. | ||
29 | * | ||
30 | * THE DATA FILES AND SOFTWARE ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY | ||
31 | * KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF | ||
32 | * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF | ||
33 | * THIRD PARTY RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS | ||
34 | * INCLUDED IN THIS NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT | ||
35 | * OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF | ||
36 | * USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR | ||
37 | * OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR | ||
38 | * PERFORMANCE OF THE DATA FILES OR SOFTWARE. | ||
39 | * | ||
40 | * Except as contained in this notice, the name of a copyright holder shall | ||
41 | * not be used in advertising or otherwise to promote the sale, use or other | ||
42 | * dealings in these Data Files or Software without prior written | ||
43 | * authorization of the copyright holder. | ||
44 | */ | ||
45 | |||
46 | #include <linux/module.h> | ||
47 | #include <linux/kernel.h> | ||
48 | #include <linux/string.h> | ||
49 | #include <linux/nls.h> | ||
50 | #include <linux/errno.h> | ||
51 | |||
52 | static const wchar_t charset2uni[256] = { | ||
53 | /* 0x00 */ | ||
54 | 0x0000, 0x0001, 0x0002, 0x0003, | ||
55 | 0x0004, 0x0005, 0x0006, 0x0007, | ||
56 | 0x0008, 0x0009, 0x000a, 0x000b, | ||
57 | 0x000c, 0x000d, 0x000e, 0x000f, | ||
58 | /* 0x10 */ | ||
59 | 0x0010, 0x0011, 0x0012, 0x0013, | ||
60 | 0x0014, 0x0015, 0x0016, 0x0017, | ||
61 | 0x0018, 0x0019, 0x001a, 0x001b, | ||
62 | 0x001c, 0x001d, 0x001e, 0x001f, | ||
63 | /* 0x20 */ | ||
64 | 0x0020, 0x0021, 0x0022, 0x0023, | ||
65 | 0x0024, 0x0025, 0x0026, 0x0027, | ||
66 | 0x0028, 0x0029, 0x002a, 0x002b, | ||
67 | 0x002c, 0x002d, 0x002e, 0x002f, | ||
68 | /* 0x30 */ | ||
69 | 0x0030, 0x0031, 0x0032, 0x0033, | ||
70 | 0x0034, 0x0035, 0x0036, 0x0037, | ||
71 | 0x0038, 0x0039, 0x003a, 0x003b, | ||
72 | 0x003c, 0x003d, 0x003e, 0x003f, | ||
73 | /* 0x40 */ | ||
74 | 0x0040, 0x0041, 0x0042, 0x0043, | ||
75 | 0x0044, 0x0045, 0x0046, 0x0047, | ||
76 | 0x0048, 0x0049, 0x004a, 0x004b, | ||
77 | 0x004c, 0x004d, 0x004e, 0x004f, | ||
78 | /* 0x50 */ | ||
79 | 0x0050, 0x0051, 0x0052, 0x0053, | ||
80 | 0x0054, 0x0055, 0x0056, 0x0057, | ||
81 | 0x0058, 0x0059, 0x005a, 0x005b, | ||
82 | 0x005c, 0x005d, 0x005e, 0x005f, | ||
83 | /* 0x60 */ | ||
84 | 0x0060, 0x0061, 0x0062, 0x0063, | ||
85 | 0x0064, 0x0065, 0x0066, 0x0067, | ||
86 | 0x0068, 0x0069, 0x006a, 0x006b, | ||
87 | 0x006c, 0x006d, 0x006e, 0x006f, | ||
88 | /* 0x70 */ | ||
89 | 0x0070, 0x0071, 0x0072, 0x0073, | ||
90 | 0x0074, 0x0075, 0x0076, 0x0077, | ||
91 | 0x0078, 0x0079, 0x007a, 0x007b, | ||
92 | 0x007c, 0x007d, 0x007e, 0x007f, | ||
93 | /* 0x80 */ | ||
94 | 0x00c4, 0x00c5, 0x00c7, 0x00c9, | ||
95 | 0x00d1, 0x00d6, 0x00dc, 0x00e1, | ||
96 | 0x00e0, 0x00e2, 0x00e4, 0x00e3, | ||
97 | 0x00e5, 0x00e7, 0x00e9, 0x00e8, | ||
98 | /* 0x90 */ | ||
99 | 0x00ea, 0x00eb, 0x00ed, 0x00ec, | ||
100 | 0x00ee, 0x00ef, 0x00f1, 0x00f3, | ||
101 | 0x00f2, 0x00f4, 0x00f6, 0x00f5, | ||
102 | 0x00fa, 0x00f9, 0x00fb, 0x00fc, | ||
103 | /* 0xa0 */ | ||
104 | 0x2020, 0x00b0, 0x00a2, 0x00a3, | ||
105 | 0x00a7, 0x2022, 0x00b6, 0x00df, | ||
106 | 0x00ae, 0x00a9, 0x2122, 0x00b4, | ||
107 | 0x00a8, 0x2260, 0x00c6, 0x00d8, | ||
108 | /* 0xb0 */ | ||
109 | 0x221e, 0x00b1, 0x2264, 0x2265, | ||
110 | 0x00a5, 0x00b5, 0x2202, 0x2211, | ||
111 | 0x220f, 0x03c0, 0x222b, 0x00aa, | ||
112 | 0x00ba, 0x03a9, 0x00e6, 0x00f8, | ||
113 | /* 0xc0 */ | ||
114 | 0x00bf, 0x00a1, 0x00ac, 0x221a, | ||
115 | 0x0192, 0x2248, 0x2206, 0x00ab, | ||
116 | 0x00bb, 0x2026, 0x00a0, 0x00c0, | ||
117 | 0x00c3, 0x00d5, 0x0152, 0x0153, | ||
118 | /* 0xd0 */ | ||
119 | 0x2013, 0x2014, 0x201c, 0x201d, | ||
120 | 0x2018, 0x2019, 0x00f7, 0x25ca, | ||
121 | 0x00ff, 0x0178, 0x2044, 0x20ac, | ||
122 | 0x2039, 0x203a, 0xfb01, 0xfb02, | ||
123 | /* 0xe0 */ | ||
124 | 0x2021, 0x00b7, 0x201a, 0x201e, | ||
125 | 0x2030, 0x00c2, 0x00ca, 0x00c1, | ||
126 | 0x00cb, 0x00c8, 0x00cd, 0x00ce, | ||
127 | 0x00cf, 0x00cc, 0x00d3, 0x00d4, | ||
128 | /* 0xf0 */ | ||
129 | 0xf8ff, 0x00d2, 0x00da, 0x00db, | ||
130 | 0x00d9, 0x0131, 0x02c6, 0x02dc, | ||
131 | 0x00af, 0x02d8, 0x02d9, 0x02da, | ||
132 | 0x00b8, 0x02dd, 0x02db, 0x02c7, | ||
133 | }; | ||
134 | |||
135 | static const unsigned char page00[256] = { | ||
136 | 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, /* 0x00-0x07 */ | ||
137 | 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, /* 0x08-0x0f */ | ||
138 | 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, /* 0x10-0x17 */ | ||
139 | 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, /* 0x18-0x1f */ | ||
140 | 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, /* 0x20-0x27 */ | ||
141 | 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, /* 0x28-0x2f */ | ||
142 | 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, /* 0x30-0x37 */ | ||
143 | 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, /* 0x38-0x3f */ | ||
144 | 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, /* 0x40-0x47 */ | ||
145 | 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, /* 0x48-0x4f */ | ||
146 | 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, /* 0x50-0x57 */ | ||
147 | 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f, /* 0x58-0x5f */ | ||
148 | 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, /* 0x60-0x67 */ | ||
149 | 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, /* 0x68-0x6f */ | ||
150 | 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, /* 0x70-0x77 */ | ||
151 | 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f, /* 0x78-0x7f */ | ||
152 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x80-0x87 */ | ||
153 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x88-0x8f */ | ||
154 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x90-0x97 */ | ||
155 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x98-0x9f */ | ||
156 | 0xca, 0xc1, 0xa2, 0xa3, 0x00, 0xb4, 0x00, 0xa4, /* 0xa0-0xa7 */ | ||
157 | 0xac, 0xa9, 0xbb, 0xc7, 0xc2, 0x00, 0xa8, 0xf8, /* 0xa8-0xaf */ | ||
158 | 0xa1, 0xb1, 0x00, 0x00, 0xab, 0xb5, 0xa6, 0xe1, /* 0xb0-0xb7 */ | ||
159 | 0xfc, 0x00, 0xbc, 0xc8, 0x00, 0x00, 0x00, 0xc0, /* 0xb8-0xbf */ | ||
160 | 0xcb, 0xe7, 0xe5, 0xcc, 0x80, 0x81, 0xae, 0x82, /* 0xc0-0xc7 */ | ||
161 | 0xe9, 0x83, 0xe6, 0xe8, 0xed, 0xea, 0xeb, 0xec, /* 0xc8-0xcf */ | ||
162 | 0x00, 0x84, 0xf1, 0xee, 0xef, 0xcd, 0x85, 0x00, /* 0xd0-0xd7 */ | ||
163 | 0xaf, 0xf4, 0xf2, 0xf3, 0x86, 0x00, 0x00, 0xa7, /* 0xd8-0xdf */ | ||
164 | 0x88, 0x87, 0x89, 0x8b, 0x8a, 0x8c, 0xbe, 0x8d, /* 0xe0-0xe7 */ | ||
165 | 0x8f, 0x8e, 0x90, 0x91, 0x93, 0x92, 0x94, 0x95, /* 0xe8-0xef */ | ||
166 | 0x00, 0x96, 0x98, 0x97, 0x99, 0x9b, 0x9a, 0xd6, /* 0xf0-0xf7 */ | ||
167 | 0xbf, 0x9d, 0x9c, 0x9e, 0x9f, 0x00, 0x00, 0xd8, /* 0xf8-0xff */ | ||
168 | }; | ||
169 | |||
170 | static const unsigned char page01[256] = { | ||
171 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x00-0x07 */ | ||
172 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x08-0x0f */ | ||
173 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10-0x17 */ | ||
174 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x18-0x1f */ | ||
175 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x20-0x27 */ | ||
176 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x28-0x2f */ | ||
177 | 0x00, 0xf5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x30-0x37 */ | ||
178 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x38-0x3f */ | ||
179 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x40-0x47 */ | ||
180 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x48-0x4f */ | ||
181 | 0x00, 0x00, 0xce, 0xcf, 0x00, 0x00, 0x00, 0x00, /* 0x50-0x57 */ | ||
182 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x58-0x5f */ | ||
183 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x60-0x67 */ | ||
184 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x68-0x6f */ | ||
185 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */ | ||
186 | 0xd9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x78-0x7f */ | ||
187 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x80-0x87 */ | ||
188 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x88-0x8f */ | ||
189 | 0x00, 0x00, 0xc4, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x90-0x97 */ | ||
190 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x98-0x9f */ | ||
191 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa0-0xa7 */ | ||
192 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa8-0xaf */ | ||
193 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xb0-0xb7 */ | ||
194 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xb8-0xbf */ | ||
195 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc0-0xc7 */ | ||
196 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc8-0xcf */ | ||
197 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd0-0xd7 */ | ||
198 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd8-0xdf */ | ||
199 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe0-0xe7 */ | ||
200 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe8-0xef */ | ||
201 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xf0-0xf7 */ | ||
202 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xf8-0xff */ | ||
203 | }; | ||
204 | |||
205 | static const unsigned char page02[256] = { | ||
206 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x00-0x07 */ | ||
207 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x08-0x0f */ | ||
208 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10-0x17 */ | ||
209 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x18-0x1f */ | ||
210 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x20-0x27 */ | ||
211 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x28-0x2f */ | ||
212 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x30-0x37 */ | ||
213 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x38-0x3f */ | ||
214 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x40-0x47 */ | ||
215 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x48-0x4f */ | ||
216 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x50-0x57 */ | ||
217 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x58-0x5f */ | ||
218 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x60-0x67 */ | ||
219 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x68-0x6f */ | ||
220 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */ | ||
221 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x78-0x7f */ | ||
222 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x80-0x87 */ | ||
223 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x88-0x8f */ | ||
224 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x90-0x97 */ | ||
225 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x98-0x9f */ | ||
226 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa0-0xa7 */ | ||
227 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa8-0xaf */ | ||
228 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xb0-0xb7 */ | ||
229 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xb8-0xbf */ | ||
230 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf6, 0xff, /* 0xc0-0xc7 */ | ||
231 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc8-0xcf */ | ||
232 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd0-0xd7 */ | ||
233 | 0xf9, 0xfa, 0xfb, 0xfe, 0xf7, 0xfd, 0x00, 0x00, /* 0xd8-0xdf */ | ||
234 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe0-0xe7 */ | ||
235 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe8-0xef */ | ||
236 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xf0-0xf7 */ | ||
237 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xf8-0xff */ | ||
238 | }; | ||
239 | |||
240 | static const unsigned char page03[256] = { | ||
241 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x00-0x07 */ | ||
242 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x08-0x0f */ | ||
243 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10-0x17 */ | ||
244 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x18-0x1f */ | ||
245 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x20-0x27 */ | ||
246 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x28-0x2f */ | ||
247 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x30-0x37 */ | ||
248 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x38-0x3f */ | ||
249 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x40-0x47 */ | ||
250 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x48-0x4f */ | ||
251 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x50-0x57 */ | ||
252 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x58-0x5f */ | ||
253 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x60-0x67 */ | ||
254 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x68-0x6f */ | ||
255 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */ | ||
256 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x78-0x7f */ | ||
257 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x80-0x87 */ | ||
258 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x88-0x8f */ | ||
259 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x90-0x97 */ | ||
260 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x98-0x9f */ | ||
261 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa0-0xa7 */ | ||
262 | 0x00, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa8-0xaf */ | ||
263 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xb0-0xb7 */ | ||
264 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xb8-0xbf */ | ||
265 | 0xb9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc0-0xc7 */ | ||
266 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc8-0xcf */ | ||
267 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd0-0xd7 */ | ||
268 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd8-0xdf */ | ||
269 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe0-0xe7 */ | ||
270 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe8-0xef */ | ||
271 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xf0-0xf7 */ | ||
272 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xf8-0xff */ | ||
273 | }; | ||
274 | |||
275 | static const unsigned char page20[256] = { | ||
276 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x00-0x07 */ | ||
277 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x08-0x0f */ | ||
278 | 0x00, 0x00, 0x00, 0xd0, 0xd1, 0x00, 0x00, 0x00, /* 0x10-0x17 */ | ||
279 | 0xd4, 0xd5, 0xe2, 0x00, 0xd2, 0xd3, 0xe3, 0x00, /* 0x18-0x1f */ | ||
280 | 0xa0, 0xe0, 0xa5, 0x00, 0x00, 0x00, 0xc9, 0x00, /* 0x20-0x27 */ | ||
281 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x28-0x2f */ | ||
282 | 0xe4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x30-0x37 */ | ||
283 | 0x00, 0xdc, 0xdd, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x38-0x3f */ | ||
284 | 0x00, 0x00, 0x00, 0x00, 0xda, 0x00, 0x00, 0x00, /* 0x40-0x47 */ | ||
285 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x48-0x4f */ | ||
286 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x50-0x57 */ | ||
287 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x58-0x5f */ | ||
288 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x60-0x67 */ | ||
289 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x68-0x6f */ | ||
290 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */ | ||
291 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x78-0x7f */ | ||
292 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x80-0x87 */ | ||
293 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x88-0x8f */ | ||
294 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x90-0x97 */ | ||
295 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x98-0x9f */ | ||
296 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa0-0xa7 */ | ||
297 | 0x00, 0x00, 0x00, 0x00, 0xdb, 0x00, 0x00, 0x00, /* 0xa8-0xaf */ | ||
298 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xb0-0xb7 */ | ||
299 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xb8-0xbf */ | ||
300 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc0-0xc7 */ | ||
301 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc8-0xcf */ | ||
302 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd0-0xd7 */ | ||
303 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd8-0xdf */ | ||
304 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe0-0xe7 */ | ||
305 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe8-0xef */ | ||
306 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xf0-0xf7 */ | ||
307 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xf8-0xff */ | ||
308 | }; | ||
309 | |||
310 | static const unsigned char page21[256] = { | ||
311 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x00-0x07 */ | ||
312 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x08-0x0f */ | ||
313 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10-0x17 */ | ||
314 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x18-0x1f */ | ||
315 | 0x00, 0x00, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x20-0x27 */ | ||
316 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x28-0x2f */ | ||
317 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x30-0x37 */ | ||
318 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x38-0x3f */ | ||
319 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x40-0x47 */ | ||
320 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x48-0x4f */ | ||
321 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x50-0x57 */ | ||
322 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x58-0x5f */ | ||
323 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x60-0x67 */ | ||
324 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x68-0x6f */ | ||
325 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */ | ||
326 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x78-0x7f */ | ||
327 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x80-0x87 */ | ||
328 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x88-0x8f */ | ||
329 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x90-0x97 */ | ||
330 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x98-0x9f */ | ||
331 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa0-0xa7 */ | ||
332 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa8-0xaf */ | ||
333 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xb0-0xb7 */ | ||
334 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xb8-0xbf */ | ||
335 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc0-0xc7 */ | ||
336 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc8-0xcf */ | ||
337 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd0-0xd7 */ | ||
338 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd8-0xdf */ | ||
339 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe0-0xe7 */ | ||
340 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe8-0xef */ | ||
341 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xf0-0xf7 */ | ||
342 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xf8-0xff */ | ||
343 | }; | ||
344 | |||
345 | static const unsigned char page22[256] = { | ||
346 | 0x00, 0x00, 0xb6, 0x00, 0x00, 0x00, 0xc6, 0x00, /* 0x00-0x07 */ | ||
347 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb8, /* 0x08-0x0f */ | ||
348 | 0x00, 0xb7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10-0x17 */ | ||
349 | 0x00, 0x00, 0xc3, 0x00, 0x00, 0x00, 0xb0, 0x00, /* 0x18-0x1f */ | ||
350 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x20-0x27 */ | ||
351 | 0x00, 0x00, 0x00, 0xba, 0x00, 0x00, 0x00, 0x00, /* 0x28-0x2f */ | ||
352 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x30-0x37 */ | ||
353 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x38-0x3f */ | ||
354 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x40-0x47 */ | ||
355 | 0xc5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x48-0x4f */ | ||
356 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x50-0x57 */ | ||
357 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x58-0x5f */ | ||
358 | 0xad, 0x00, 0x00, 0x00, 0xb2, 0xb3, 0x00, 0x00, /* 0x60-0x67 */ | ||
359 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x68-0x6f */ | ||
360 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */ | ||
361 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x78-0x7f */ | ||
362 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x80-0x87 */ | ||
363 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x88-0x8f */ | ||
364 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x90-0x97 */ | ||
365 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x98-0x9f */ | ||
366 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa0-0xa7 */ | ||
367 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa8-0xaf */ | ||
368 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xb0-0xb7 */ | ||
369 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xb8-0xbf */ | ||
370 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc0-0xc7 */ | ||
371 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc8-0xcf */ | ||
372 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd0-0xd7 */ | ||
373 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd8-0xdf */ | ||
374 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe0-0xe7 */ | ||
375 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe8-0xef */ | ||
376 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xf0-0xf7 */ | ||
377 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xf8-0xff */ | ||
378 | }; | ||
379 | |||
380 | static const unsigned char page25[256] = { | ||
381 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x00-0x07 */ | ||
382 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x08-0x0f */ | ||
383 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10-0x17 */ | ||
384 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x18-0x1f */ | ||
385 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x20-0x27 */ | ||
386 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x28-0x2f */ | ||
387 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x30-0x37 */ | ||
388 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x38-0x3f */ | ||
389 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x40-0x47 */ | ||
390 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x48-0x4f */ | ||
391 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x50-0x57 */ | ||
392 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x58-0x5f */ | ||
393 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x60-0x67 */ | ||
394 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x68-0x6f */ | ||
395 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */ | ||
396 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x78-0x7f */ | ||
397 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x80-0x87 */ | ||
398 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x88-0x8f */ | ||
399 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x90-0x97 */ | ||
400 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x98-0x9f */ | ||
401 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa0-0xa7 */ | ||
402 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa8-0xaf */ | ||
403 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xb0-0xb7 */ | ||
404 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xb8-0xbf */ | ||
405 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc0-0xc7 */ | ||
406 | 0x00, 0x00, 0xd7, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc8-0xcf */ | ||
407 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd0-0xd7 */ | ||
408 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd8-0xdf */ | ||
409 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe0-0xe7 */ | ||
410 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe8-0xef */ | ||
411 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xf0-0xf7 */ | ||
412 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xf8-0xff */ | ||
413 | }; | ||
414 | |||
415 | static const unsigned char pagef8[256] = { | ||
416 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x00-0x07 */ | ||
417 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x08-0x0f */ | ||
418 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10-0x17 */ | ||
419 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x18-0x1f */ | ||
420 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x20-0x27 */ | ||
421 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x28-0x2f */ | ||
422 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x30-0x37 */ | ||
423 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x38-0x3f */ | ||
424 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x40-0x47 */ | ||
425 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x48-0x4f */ | ||
426 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x50-0x57 */ | ||
427 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x58-0x5f */ | ||
428 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x60-0x67 */ | ||
429 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x68-0x6f */ | ||
430 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */ | ||
431 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x78-0x7f */ | ||
432 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x80-0x87 */ | ||
433 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x88-0x8f */ | ||
434 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x90-0x97 */ | ||
435 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x98-0x9f */ | ||
436 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa0-0xa7 */ | ||
437 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa8-0xaf */ | ||
438 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xb0-0xb7 */ | ||
439 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xb8-0xbf */ | ||
440 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc0-0xc7 */ | ||
441 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc8-0xcf */ | ||
442 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd0-0xd7 */ | ||
443 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd8-0xdf */ | ||
444 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe0-0xe7 */ | ||
445 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe8-0xef */ | ||
446 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xf0-0xf7 */ | ||
447 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, /* 0xf8-0xff */ | ||
448 | }; | ||
449 | |||
450 | static const unsigned char pagefb[256] = { | ||
451 | 0x00, 0xde, 0xdf, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x00-0x07 */ | ||
452 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x08-0x0f */ | ||
453 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10-0x17 */ | ||
454 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x18-0x1f */ | ||
455 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x20-0x27 */ | ||
456 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x28-0x2f */ | ||
457 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x30-0x37 */ | ||
458 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x38-0x3f */ | ||
459 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x40-0x47 */ | ||
460 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x48-0x4f */ | ||
461 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x50-0x57 */ | ||
462 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x58-0x5f */ | ||
463 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x60-0x67 */ | ||
464 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x68-0x6f */ | ||
465 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */ | ||
466 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x78-0x7f */ | ||
467 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x80-0x87 */ | ||
468 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x88-0x8f */ | ||
469 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x90-0x97 */ | ||
470 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x98-0x9f */ | ||
471 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa0-0xa7 */ | ||
472 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa8-0xaf */ | ||
473 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xb0-0xb7 */ | ||
474 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xb8-0xbf */ | ||
475 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc0-0xc7 */ | ||
476 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc8-0xcf */ | ||
477 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd0-0xd7 */ | ||
478 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd8-0xdf */ | ||
479 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe0-0xe7 */ | ||
480 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe8-0xef */ | ||
481 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xf0-0xf7 */ | ||
482 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xf8-0xff */ | ||
483 | }; | ||
484 | |||
485 | static const unsigned char *const page_uni2charset[256] = { | ||
486 | page00, page01, page02, page03, NULL, NULL, NULL, NULL, | ||
487 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
488 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
489 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
490 | page20, page21, page22, NULL, NULL, page25, NULL, NULL, | ||
491 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
492 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
493 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
494 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
495 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
496 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
497 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
498 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
499 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
500 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
501 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
502 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
503 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
504 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
505 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
506 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
507 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
508 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
509 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
510 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
511 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
512 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
513 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
514 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
515 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
516 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
517 | pagef8, NULL, NULL, pagefb, NULL, NULL, NULL, NULL, | ||
518 | }; | ||
519 | |||
520 | static const unsigned char charset2lower[256] = { | ||
521 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x00-0x07 */ | ||
522 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x08-0x0f */ | ||
523 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x10-0x17 */ | ||
524 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x18-0x1f */ | ||
525 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x20-0x27 */ | ||
526 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x28-0x2f */ | ||
527 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x30-0x37 */ | ||
528 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x38-0x3f */ | ||
529 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x40-0x47 */ | ||
530 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x48-0x4f */ | ||
531 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x50-0x57 */ | ||
532 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x58-0x5f */ | ||
533 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x60-0x67 */ | ||
534 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x68-0x6f */ | ||
535 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x70-0x77 */ | ||
536 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x78-0x7f */ | ||
537 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x80-0x87 */ | ||
538 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x88-0x8f */ | ||
539 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x90-0x97 */ | ||
540 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x98-0x9f */ | ||
541 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0xa0-0xa7 */ | ||
542 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0xa8-0xaf */ | ||
543 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0xb0-0xb7 */ | ||
544 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0xb8-0xbf */ | ||
545 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0xc0-0xc7 */ | ||
546 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0xc8-0xcf */ | ||
547 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0xd0-0xd7 */ | ||
548 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0xd8-0xdf */ | ||
549 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0xe0-0xe7 */ | ||
550 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0xe8-0xef */ | ||
551 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0xf0-0xf7 */ | ||
552 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0xf8-0xff */ | ||
553 | }; | ||
554 | |||
555 | static const unsigned char charset2upper[256] = { | ||
556 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x00-0x07 */ | ||
557 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x08-0x0f */ | ||
558 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x10-0x17 */ | ||
559 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x18-0x1f */ | ||
560 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x20-0x27 */ | ||
561 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x28-0x2f */ | ||
562 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x30-0x37 */ | ||
563 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x38-0x3f */ | ||
564 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x40-0x47 */ | ||
565 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x48-0x4f */ | ||
566 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x50-0x57 */ | ||
567 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x58-0x5f */ | ||
568 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x60-0x67 */ | ||
569 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x68-0x6f */ | ||
570 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x70-0x77 */ | ||
571 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x78-0x7f */ | ||
572 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x80-0x87 */ | ||
573 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x88-0x8f */ | ||
574 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x90-0x97 */ | ||
575 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x98-0x9f */ | ||
576 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0xa0-0xa7 */ | ||
577 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0xa8-0xaf */ | ||
578 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0xb0-0xb7 */ | ||
579 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0xb8-0xbf */ | ||
580 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0xc0-0xc7 */ | ||
581 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0xc8-0xcf */ | ||
582 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0xd0-0xd7 */ | ||
583 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0xd8-0xdf */ | ||
584 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0xe0-0xe7 */ | ||
585 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0xe8-0xef */ | ||
586 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0xf0-0xf7 */ | ||
587 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0xf8-0xff */ | ||
588 | }; | ||
589 | |||
590 | static int uni2char(wchar_t uni, unsigned char *out, int boundlen) | ||
591 | { | ||
592 | const unsigned char *uni2charset; | ||
593 | unsigned char cl = uni & 0x00ff; | ||
594 | unsigned char ch = (uni & 0xff00) >> 8; | ||
595 | |||
596 | if (boundlen <= 0) | ||
597 | return -ENAMETOOLONG; | ||
598 | |||
599 | uni2charset = page_uni2charset[ch]; | ||
600 | if (uni2charset && uni2charset[cl]) | ||
601 | out[0] = uni2charset[cl]; | ||
602 | else | ||
603 | return -EINVAL; | ||
604 | return 1; | ||
605 | } | ||
606 | |||
607 | static int char2uni(const unsigned char *rawstring, int boundlen, wchar_t *uni) | ||
608 | { | ||
609 | *uni = charset2uni[*rawstring]; | ||
610 | if (*uni == 0x0000) | ||
611 | return -EINVAL; | ||
612 | return 1; | ||
613 | } | ||
614 | |||
615 | static struct nls_table table = { | ||
616 | .charset = "macroman", | ||
617 | .uni2char = uni2char, | ||
618 | .char2uni = char2uni, | ||
619 | .charset2lower = charset2lower, | ||
620 | .charset2upper = charset2upper, | ||
621 | .owner = THIS_MODULE, | ||
622 | }; | ||
623 | |||
624 | static int __init init_nls_macroman(void) | ||
625 | { | ||
626 | return register_nls(&table); | ||
627 | } | ||
628 | |||
629 | static void __exit exit_nls_macroman(void) | ||
630 | { | ||
631 | unregister_nls(&table); | ||
632 | } | ||
633 | |||
634 | module_init(init_nls_macroman) | ||
635 | module_exit(exit_nls_macroman) | ||
636 | |||
637 | MODULE_LICENSE("Dual BSD/GPL"); | ||
diff --git a/fs/nls/nls_macromanian.c b/fs/nls/nls_macromanian.c new file mode 100644 index 000000000000..b83c07a57d25 --- /dev/null +++ b/fs/nls/nls_macromanian.c | |||
@@ -0,0 +1,602 @@ | |||
1 | /* | ||
2 | * linux/fs/nls/nls_macromanian.c | ||
3 | * | ||
4 | * Charset macromanian translation tables. | ||
5 | * Generated automatically from the Unicode and charset | ||
6 | * tables from the Unicode Organization (www.unicode.org). | ||
7 | * The Unicode to charset table has only exact mappings. | ||
8 | */ | ||
9 | |||
10 | /* | ||
11 | * COPYRIGHT AND PERMISSION NOTICE | ||
12 | * | ||
13 | * Copyright 1991-2012 Unicode, Inc. All rights reserved. Distributed under | ||
14 | * the Terms of Use in http://www.unicode.org/copyright.html. | ||
15 | * | ||
16 | * Permission is hereby granted, free of charge, to any person obtaining a | ||
17 | * copy of the Unicode data files and any associated documentation (the "Data | ||
18 | * Files") or Unicode software and any associated documentation (the | ||
19 | * "Software") to deal in the Data Files or Software without restriction, | ||
20 | * including without limitation the rights to use, copy, modify, merge, | ||
21 | * publish, distribute, and/or sell copies of the Data Files or Software, and | ||
22 | * to permit persons to whom the Data Files or Software are furnished to do | ||
23 | * so, provided that (a) the above copyright notice(s) and this permission | ||
24 | * notice appear with all copies of the Data Files or Software, (b) both the | ||
25 | * above copyright notice(s) and this permission notice appear in associated | ||
26 | * documentation, and (c) there is clear notice in each modified Data File or | ||
27 | * in the Software as well as in the documentation associated with the Data | ||
28 | * File(s) or Software that the data or software has been modified. | ||
29 | * | ||
30 | * THE DATA FILES AND SOFTWARE ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY | ||
31 | * KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF | ||
32 | * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF | ||
33 | * THIRD PARTY RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS | ||
34 | * INCLUDED IN THIS NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT | ||
35 | * OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF | ||
36 | * USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR | ||
37 | * OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR | ||
38 | * PERFORMANCE OF THE DATA FILES OR SOFTWARE. | ||
39 | * | ||
40 | * Except as contained in this notice, the name of a copyright holder shall | ||
41 | * not be used in advertising or otherwise to promote the sale, use or other | ||
42 | * dealings in these Data Files or Software without prior written | ||
43 | * authorization of the copyright holder. | ||
44 | */ | ||
45 | |||
46 | #include <linux/module.h> | ||
47 | #include <linux/kernel.h> | ||
48 | #include <linux/string.h> | ||
49 | #include <linux/nls.h> | ||
50 | #include <linux/errno.h> | ||
51 | |||
52 | static const wchar_t charset2uni[256] = { | ||
53 | /* 0x00 */ | ||
54 | 0x0000, 0x0001, 0x0002, 0x0003, | ||
55 | 0x0004, 0x0005, 0x0006, 0x0007, | ||
56 | 0x0008, 0x0009, 0x000a, 0x000b, | ||
57 | 0x000c, 0x000d, 0x000e, 0x000f, | ||
58 | /* 0x10 */ | ||
59 | 0x0010, 0x0011, 0x0012, 0x0013, | ||
60 | 0x0014, 0x0015, 0x0016, 0x0017, | ||
61 | 0x0018, 0x0019, 0x001a, 0x001b, | ||
62 | 0x001c, 0x001d, 0x001e, 0x001f, | ||
63 | /* 0x20 */ | ||
64 | 0x0020, 0x0021, 0x0022, 0x0023, | ||
65 | 0x0024, 0x0025, 0x0026, 0x0027, | ||
66 | 0x0028, 0x0029, 0x002a, 0x002b, | ||
67 | 0x002c, 0x002d, 0x002e, 0x002f, | ||
68 | /* 0x30 */ | ||
69 | 0x0030, 0x0031, 0x0032, 0x0033, | ||
70 | 0x0034, 0x0035, 0x0036, 0x0037, | ||
71 | 0x0038, 0x0039, 0x003a, 0x003b, | ||
72 | 0x003c, 0x003d, 0x003e, 0x003f, | ||
73 | /* 0x40 */ | ||
74 | 0x0040, 0x0041, 0x0042, 0x0043, | ||
75 | 0x0044, 0x0045, 0x0046, 0x0047, | ||
76 | 0x0048, 0x0049, 0x004a, 0x004b, | ||
77 | 0x004c, 0x004d, 0x004e, 0x004f, | ||
78 | /* 0x50 */ | ||
79 | 0x0050, 0x0051, 0x0052, 0x0053, | ||
80 | 0x0054, 0x0055, 0x0056, 0x0057, | ||
81 | 0x0058, 0x0059, 0x005a, 0x005b, | ||
82 | 0x005c, 0x005d, 0x005e, 0x005f, | ||
83 | /* 0x60 */ | ||
84 | 0x0060, 0x0061, 0x0062, 0x0063, | ||
85 | 0x0064, 0x0065, 0x0066, 0x0067, | ||
86 | 0x0068, 0x0069, 0x006a, 0x006b, | ||
87 | 0x006c, 0x006d, 0x006e, 0x006f, | ||
88 | /* 0x70 */ | ||
89 | 0x0070, 0x0071, 0x0072, 0x0073, | ||
90 | 0x0074, 0x0075, 0x0076, 0x0077, | ||
91 | 0x0078, 0x0079, 0x007a, 0x007b, | ||
92 | 0x007c, 0x007d, 0x007e, 0x007f, | ||
93 | /* 0x80 */ | ||
94 | 0x00c4, 0x00c5, 0x00c7, 0x00c9, | ||
95 | 0x00d1, 0x00d6, 0x00dc, 0x00e1, | ||
96 | 0x00e0, 0x00e2, 0x00e4, 0x00e3, | ||
97 | 0x00e5, 0x00e7, 0x00e9, 0x00e8, | ||
98 | /* 0x90 */ | ||
99 | 0x00ea, 0x00eb, 0x00ed, 0x00ec, | ||
100 | 0x00ee, 0x00ef, 0x00f1, 0x00f3, | ||
101 | 0x00f2, 0x00f4, 0x00f6, 0x00f5, | ||
102 | 0x00fa, 0x00f9, 0x00fb, 0x00fc, | ||
103 | /* 0xa0 */ | ||
104 | 0x2020, 0x00b0, 0x00a2, 0x00a3, | ||
105 | 0x00a7, 0x2022, 0x00b6, 0x00df, | ||
106 | 0x00ae, 0x00a9, 0x2122, 0x00b4, | ||
107 | 0x00a8, 0x2260, 0x0102, 0x0218, | ||
108 | /* 0xb0 */ | ||
109 | 0x221e, 0x00b1, 0x2264, 0x2265, | ||
110 | 0x00a5, 0x00b5, 0x2202, 0x2211, | ||
111 | 0x220f, 0x03c0, 0x222b, 0x00aa, | ||
112 | 0x00ba, 0x03a9, 0x0103, 0x0219, | ||
113 | /* 0xc0 */ | ||
114 | 0x00bf, 0x00a1, 0x00ac, 0x221a, | ||
115 | 0x0192, 0x2248, 0x2206, 0x00ab, | ||
116 | 0x00bb, 0x2026, 0x00a0, 0x00c0, | ||
117 | 0x00c3, 0x00d5, 0x0152, 0x0153, | ||
118 | /* 0xd0 */ | ||
119 | 0x2013, 0x2014, 0x201c, 0x201d, | ||
120 | 0x2018, 0x2019, 0x00f7, 0x25ca, | ||
121 | 0x00ff, 0x0178, 0x2044, 0x20ac, | ||
122 | 0x2039, 0x203a, 0x021a, 0x021b, | ||
123 | /* 0xe0 */ | ||
124 | 0x2021, 0x00b7, 0x201a, 0x201e, | ||
125 | 0x2030, 0x00c2, 0x00ca, 0x00c1, | ||
126 | 0x00cb, 0x00c8, 0x00cd, 0x00ce, | ||
127 | 0x00cf, 0x00cc, 0x00d3, 0x00d4, | ||
128 | /* 0xf0 */ | ||
129 | 0xf8ff, 0x00d2, 0x00da, 0x00db, | ||
130 | 0x00d9, 0x0131, 0x02c6, 0x02dc, | ||
131 | 0x00af, 0x02d8, 0x02d9, 0x02da, | ||
132 | 0x00b8, 0x02dd, 0x02db, 0x02c7, | ||
133 | }; | ||
134 | |||
135 | static const unsigned char page00[256] = { | ||
136 | 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, /* 0x00-0x07 */ | ||
137 | 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, /* 0x08-0x0f */ | ||
138 | 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, /* 0x10-0x17 */ | ||
139 | 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, /* 0x18-0x1f */ | ||
140 | 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, /* 0x20-0x27 */ | ||
141 | 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, /* 0x28-0x2f */ | ||
142 | 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, /* 0x30-0x37 */ | ||
143 | 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, /* 0x38-0x3f */ | ||
144 | 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, /* 0x40-0x47 */ | ||
145 | 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, /* 0x48-0x4f */ | ||
146 | 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, /* 0x50-0x57 */ | ||
147 | 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f, /* 0x58-0x5f */ | ||
148 | 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, /* 0x60-0x67 */ | ||
149 | 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, /* 0x68-0x6f */ | ||
150 | 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, /* 0x70-0x77 */ | ||
151 | 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f, /* 0x78-0x7f */ | ||
152 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x80-0x87 */ | ||
153 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x88-0x8f */ | ||
154 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x90-0x97 */ | ||
155 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x98-0x9f */ | ||
156 | 0xca, 0xc1, 0xa2, 0xa3, 0x00, 0xb4, 0x00, 0xa4, /* 0xa0-0xa7 */ | ||
157 | 0xac, 0xa9, 0xbb, 0xc7, 0xc2, 0x00, 0xa8, 0xf8, /* 0xa8-0xaf */ | ||
158 | 0xa1, 0xb1, 0x00, 0x00, 0xab, 0xb5, 0xa6, 0xe1, /* 0xb0-0xb7 */ | ||
159 | 0xfc, 0x00, 0xbc, 0xc8, 0x00, 0x00, 0x00, 0xc0, /* 0xb8-0xbf */ | ||
160 | 0xcb, 0xe7, 0xe5, 0xcc, 0x80, 0x81, 0x00, 0x82, /* 0xc0-0xc7 */ | ||
161 | 0xe9, 0x83, 0xe6, 0xe8, 0xed, 0xea, 0xeb, 0xec, /* 0xc8-0xcf */ | ||
162 | 0x00, 0x84, 0xf1, 0xee, 0xef, 0xcd, 0x85, 0x00, /* 0xd0-0xd7 */ | ||
163 | 0x00, 0xf4, 0xf2, 0xf3, 0x86, 0x00, 0x00, 0xa7, /* 0xd8-0xdf */ | ||
164 | 0x88, 0x87, 0x89, 0x8b, 0x8a, 0x8c, 0x00, 0x8d, /* 0xe0-0xe7 */ | ||
165 | 0x8f, 0x8e, 0x90, 0x91, 0x93, 0x92, 0x94, 0x95, /* 0xe8-0xef */ | ||
166 | 0x00, 0x96, 0x98, 0x97, 0x99, 0x9b, 0x9a, 0xd6, /* 0xf0-0xf7 */ | ||
167 | 0x00, 0x9d, 0x9c, 0x9e, 0x9f, 0x00, 0x00, 0xd8, /* 0xf8-0xff */ | ||
168 | }; | ||
169 | |||
170 | static const unsigned char page01[256] = { | ||
171 | 0x00, 0x00, 0xae, 0xbe, 0x00, 0x00, 0x00, 0x00, /* 0x00-0x07 */ | ||
172 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x08-0x0f */ | ||
173 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10-0x17 */ | ||
174 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x18-0x1f */ | ||
175 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x20-0x27 */ | ||
176 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x28-0x2f */ | ||
177 | 0x00, 0xf5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x30-0x37 */ | ||
178 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x38-0x3f */ | ||
179 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x40-0x47 */ | ||
180 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x48-0x4f */ | ||
181 | 0x00, 0x00, 0xce, 0xcf, 0x00, 0x00, 0x00, 0x00, /* 0x50-0x57 */ | ||
182 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x58-0x5f */ | ||
183 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x60-0x67 */ | ||
184 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x68-0x6f */ | ||
185 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */ | ||
186 | 0xd9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x78-0x7f */ | ||
187 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x80-0x87 */ | ||
188 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x88-0x8f */ | ||
189 | 0x00, 0x00, 0xc4, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x90-0x97 */ | ||
190 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x98-0x9f */ | ||
191 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa0-0xa7 */ | ||
192 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa8-0xaf */ | ||
193 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xb0-0xb7 */ | ||
194 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xb8-0xbf */ | ||
195 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc0-0xc7 */ | ||
196 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc8-0xcf */ | ||
197 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd0-0xd7 */ | ||
198 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd8-0xdf */ | ||
199 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe0-0xe7 */ | ||
200 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe8-0xef */ | ||
201 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xf0-0xf7 */ | ||
202 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xf8-0xff */ | ||
203 | }; | ||
204 | |||
205 | static const unsigned char page02[256] = { | ||
206 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x00-0x07 */ | ||
207 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x08-0x0f */ | ||
208 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10-0x17 */ | ||
209 | 0xaf, 0xbf, 0xde, 0xdf, 0x00, 0x00, 0x00, 0x00, /* 0x18-0x1f */ | ||
210 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x20-0x27 */ | ||
211 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x28-0x2f */ | ||
212 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x30-0x37 */ | ||
213 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x38-0x3f */ | ||
214 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x40-0x47 */ | ||
215 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x48-0x4f */ | ||
216 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x50-0x57 */ | ||
217 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x58-0x5f */ | ||
218 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x60-0x67 */ | ||
219 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x68-0x6f */ | ||
220 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */ | ||
221 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x78-0x7f */ | ||
222 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x80-0x87 */ | ||
223 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x88-0x8f */ | ||
224 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x90-0x97 */ | ||
225 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x98-0x9f */ | ||
226 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa0-0xa7 */ | ||
227 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa8-0xaf */ | ||
228 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xb0-0xb7 */ | ||
229 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xb8-0xbf */ | ||
230 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf6, 0xff, /* 0xc0-0xc7 */ | ||
231 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc8-0xcf */ | ||
232 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd0-0xd7 */ | ||
233 | 0xf9, 0xfa, 0xfb, 0xfe, 0xf7, 0xfd, 0x00, 0x00, /* 0xd8-0xdf */ | ||
234 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe0-0xe7 */ | ||
235 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe8-0xef */ | ||
236 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xf0-0xf7 */ | ||
237 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xf8-0xff */ | ||
238 | }; | ||
239 | |||
240 | static const unsigned char page03[256] = { | ||
241 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x00-0x07 */ | ||
242 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x08-0x0f */ | ||
243 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10-0x17 */ | ||
244 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x18-0x1f */ | ||
245 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x20-0x27 */ | ||
246 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x28-0x2f */ | ||
247 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x30-0x37 */ | ||
248 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x38-0x3f */ | ||
249 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x40-0x47 */ | ||
250 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x48-0x4f */ | ||
251 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x50-0x57 */ | ||
252 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x58-0x5f */ | ||
253 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x60-0x67 */ | ||
254 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x68-0x6f */ | ||
255 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */ | ||
256 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x78-0x7f */ | ||
257 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x80-0x87 */ | ||
258 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x88-0x8f */ | ||
259 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x90-0x97 */ | ||
260 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x98-0x9f */ | ||
261 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa0-0xa7 */ | ||
262 | 0x00, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa8-0xaf */ | ||
263 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xb0-0xb7 */ | ||
264 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xb8-0xbf */ | ||
265 | 0xb9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc0-0xc7 */ | ||
266 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc8-0xcf */ | ||
267 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd0-0xd7 */ | ||
268 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd8-0xdf */ | ||
269 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe0-0xe7 */ | ||
270 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe8-0xef */ | ||
271 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xf0-0xf7 */ | ||
272 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xf8-0xff */ | ||
273 | }; | ||
274 | |||
275 | static const unsigned char page20[256] = { | ||
276 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x00-0x07 */ | ||
277 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x08-0x0f */ | ||
278 | 0x00, 0x00, 0x00, 0xd0, 0xd1, 0x00, 0x00, 0x00, /* 0x10-0x17 */ | ||
279 | 0xd4, 0xd5, 0xe2, 0x00, 0xd2, 0xd3, 0xe3, 0x00, /* 0x18-0x1f */ | ||
280 | 0xa0, 0xe0, 0xa5, 0x00, 0x00, 0x00, 0xc9, 0x00, /* 0x20-0x27 */ | ||
281 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x28-0x2f */ | ||
282 | 0xe4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x30-0x37 */ | ||
283 | 0x00, 0xdc, 0xdd, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x38-0x3f */ | ||
284 | 0x00, 0x00, 0x00, 0x00, 0xda, 0x00, 0x00, 0x00, /* 0x40-0x47 */ | ||
285 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x48-0x4f */ | ||
286 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x50-0x57 */ | ||
287 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x58-0x5f */ | ||
288 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x60-0x67 */ | ||
289 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x68-0x6f */ | ||
290 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */ | ||
291 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x78-0x7f */ | ||
292 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x80-0x87 */ | ||
293 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x88-0x8f */ | ||
294 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x90-0x97 */ | ||
295 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x98-0x9f */ | ||
296 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa0-0xa7 */ | ||
297 | 0x00, 0x00, 0x00, 0x00, 0xdb, 0x00, 0x00, 0x00, /* 0xa8-0xaf */ | ||
298 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xb0-0xb7 */ | ||
299 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xb8-0xbf */ | ||
300 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc0-0xc7 */ | ||
301 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc8-0xcf */ | ||
302 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd0-0xd7 */ | ||
303 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd8-0xdf */ | ||
304 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe0-0xe7 */ | ||
305 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe8-0xef */ | ||
306 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xf0-0xf7 */ | ||
307 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xf8-0xff */ | ||
308 | }; | ||
309 | |||
310 | static const unsigned char page21[256] = { | ||
311 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x00-0x07 */ | ||
312 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x08-0x0f */ | ||
313 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10-0x17 */ | ||
314 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x18-0x1f */ | ||
315 | 0x00, 0x00, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x20-0x27 */ | ||
316 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x28-0x2f */ | ||
317 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x30-0x37 */ | ||
318 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x38-0x3f */ | ||
319 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x40-0x47 */ | ||
320 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x48-0x4f */ | ||
321 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x50-0x57 */ | ||
322 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x58-0x5f */ | ||
323 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x60-0x67 */ | ||
324 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x68-0x6f */ | ||
325 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */ | ||
326 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x78-0x7f */ | ||
327 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x80-0x87 */ | ||
328 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x88-0x8f */ | ||
329 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x90-0x97 */ | ||
330 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x98-0x9f */ | ||
331 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa0-0xa7 */ | ||
332 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa8-0xaf */ | ||
333 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xb0-0xb7 */ | ||
334 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xb8-0xbf */ | ||
335 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc0-0xc7 */ | ||
336 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc8-0xcf */ | ||
337 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd0-0xd7 */ | ||
338 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd8-0xdf */ | ||
339 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe0-0xe7 */ | ||
340 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe8-0xef */ | ||
341 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xf0-0xf7 */ | ||
342 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xf8-0xff */ | ||
343 | }; | ||
344 | |||
345 | static const unsigned char page22[256] = { | ||
346 | 0x00, 0x00, 0xb6, 0x00, 0x00, 0x00, 0xc6, 0x00, /* 0x00-0x07 */ | ||
347 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb8, /* 0x08-0x0f */ | ||
348 | 0x00, 0xb7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10-0x17 */ | ||
349 | 0x00, 0x00, 0xc3, 0x00, 0x00, 0x00, 0xb0, 0x00, /* 0x18-0x1f */ | ||
350 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x20-0x27 */ | ||
351 | 0x00, 0x00, 0x00, 0xba, 0x00, 0x00, 0x00, 0x00, /* 0x28-0x2f */ | ||
352 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x30-0x37 */ | ||
353 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x38-0x3f */ | ||
354 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x40-0x47 */ | ||
355 | 0xc5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x48-0x4f */ | ||
356 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x50-0x57 */ | ||
357 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x58-0x5f */ | ||
358 | 0xad, 0x00, 0x00, 0x00, 0xb2, 0xb3, 0x00, 0x00, /* 0x60-0x67 */ | ||
359 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x68-0x6f */ | ||
360 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */ | ||
361 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x78-0x7f */ | ||
362 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x80-0x87 */ | ||
363 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x88-0x8f */ | ||
364 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x90-0x97 */ | ||
365 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x98-0x9f */ | ||
366 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa0-0xa7 */ | ||
367 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa8-0xaf */ | ||
368 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xb0-0xb7 */ | ||
369 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xb8-0xbf */ | ||
370 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc0-0xc7 */ | ||
371 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc8-0xcf */ | ||
372 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd0-0xd7 */ | ||
373 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd8-0xdf */ | ||
374 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe0-0xe7 */ | ||
375 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe8-0xef */ | ||
376 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xf0-0xf7 */ | ||
377 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xf8-0xff */ | ||
378 | }; | ||
379 | |||
380 | static const unsigned char page25[256] = { | ||
381 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x00-0x07 */ | ||
382 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x08-0x0f */ | ||
383 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10-0x17 */ | ||
384 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x18-0x1f */ | ||
385 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x20-0x27 */ | ||
386 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x28-0x2f */ | ||
387 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x30-0x37 */ | ||
388 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x38-0x3f */ | ||
389 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x40-0x47 */ | ||
390 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x48-0x4f */ | ||
391 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x50-0x57 */ | ||
392 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x58-0x5f */ | ||
393 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x60-0x67 */ | ||
394 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x68-0x6f */ | ||
395 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */ | ||
396 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x78-0x7f */ | ||
397 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x80-0x87 */ | ||
398 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x88-0x8f */ | ||
399 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x90-0x97 */ | ||
400 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x98-0x9f */ | ||
401 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa0-0xa7 */ | ||
402 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa8-0xaf */ | ||
403 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xb0-0xb7 */ | ||
404 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xb8-0xbf */ | ||
405 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc0-0xc7 */ | ||
406 | 0x00, 0x00, 0xd7, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc8-0xcf */ | ||
407 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd0-0xd7 */ | ||
408 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd8-0xdf */ | ||
409 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe0-0xe7 */ | ||
410 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe8-0xef */ | ||
411 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xf0-0xf7 */ | ||
412 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xf8-0xff */ | ||
413 | }; | ||
414 | |||
415 | static const unsigned char pagef8[256] = { | ||
416 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x00-0x07 */ | ||
417 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x08-0x0f */ | ||
418 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10-0x17 */ | ||
419 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x18-0x1f */ | ||
420 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x20-0x27 */ | ||
421 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x28-0x2f */ | ||
422 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x30-0x37 */ | ||
423 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x38-0x3f */ | ||
424 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x40-0x47 */ | ||
425 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x48-0x4f */ | ||
426 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x50-0x57 */ | ||
427 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x58-0x5f */ | ||
428 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x60-0x67 */ | ||
429 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x68-0x6f */ | ||
430 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */ | ||
431 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x78-0x7f */ | ||
432 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x80-0x87 */ | ||
433 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x88-0x8f */ | ||
434 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x90-0x97 */ | ||
435 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x98-0x9f */ | ||
436 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa0-0xa7 */ | ||
437 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa8-0xaf */ | ||
438 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xb0-0xb7 */ | ||
439 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xb8-0xbf */ | ||
440 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc0-0xc7 */ | ||
441 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc8-0xcf */ | ||
442 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd0-0xd7 */ | ||
443 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd8-0xdf */ | ||
444 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe0-0xe7 */ | ||
445 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe8-0xef */ | ||
446 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xf0-0xf7 */ | ||
447 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, /* 0xf8-0xff */ | ||
448 | }; | ||
449 | |||
450 | static const unsigned char *const page_uni2charset[256] = { | ||
451 | page00, page01, page02, page03, NULL, NULL, NULL, NULL, | ||
452 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
453 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
454 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
455 | page20, page21, page22, NULL, NULL, page25, NULL, NULL, | ||
456 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
457 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
458 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
459 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
460 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
461 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
462 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
463 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
464 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
465 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
466 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
467 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
468 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
469 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
470 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
471 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
472 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
473 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
474 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
475 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
476 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
477 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
478 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
479 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
480 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
481 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
482 | pagef8, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
483 | }; | ||
484 | |||
485 | static const unsigned char charset2lower[256] = { | ||
486 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x00-0x07 */ | ||
487 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x08-0x0f */ | ||
488 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x10-0x17 */ | ||
489 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x18-0x1f */ | ||
490 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x20-0x27 */ | ||
491 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x28-0x2f */ | ||
492 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x30-0x37 */ | ||
493 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x38-0x3f */ | ||
494 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x40-0x47 */ | ||
495 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x48-0x4f */ | ||
496 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x50-0x57 */ | ||
497 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x58-0x5f */ | ||
498 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x60-0x67 */ | ||
499 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x68-0x6f */ | ||
500 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x70-0x77 */ | ||
501 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x78-0x7f */ | ||
502 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x80-0x87 */ | ||
503 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x88-0x8f */ | ||
504 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x90-0x97 */ | ||
505 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x98-0x9f */ | ||
506 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0xa0-0xa7 */ | ||
507 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0xa8-0xaf */ | ||
508 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0xb0-0xb7 */ | ||
509 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0xb8-0xbf */ | ||
510 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0xc0-0xc7 */ | ||
511 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0xc8-0xcf */ | ||
512 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0xd0-0xd7 */ | ||
513 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0xd8-0xdf */ | ||
514 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0xe0-0xe7 */ | ||
515 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0xe8-0xef */ | ||
516 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0xf0-0xf7 */ | ||
517 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0xf8-0xff */ | ||
518 | }; | ||
519 | |||
520 | static const unsigned char charset2upper[256] = { | ||
521 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x00-0x07 */ | ||
522 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x08-0x0f */ | ||
523 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x10-0x17 */ | ||
524 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x18-0x1f */ | ||
525 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x20-0x27 */ | ||
526 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x28-0x2f */ | ||
527 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x30-0x37 */ | ||
528 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x38-0x3f */ | ||
529 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x40-0x47 */ | ||
530 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x48-0x4f */ | ||
531 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x50-0x57 */ | ||
532 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x58-0x5f */ | ||
533 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x60-0x67 */ | ||
534 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x68-0x6f */ | ||
535 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x70-0x77 */ | ||
536 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x78-0x7f */ | ||
537 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x80-0x87 */ | ||
538 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x88-0x8f */ | ||
539 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x90-0x97 */ | ||
540 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x98-0x9f */ | ||
541 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0xa0-0xa7 */ | ||
542 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0xa8-0xaf */ | ||
543 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0xb0-0xb7 */ | ||
544 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0xb8-0xbf */ | ||
545 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0xc0-0xc7 */ | ||
546 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0xc8-0xcf */ | ||
547 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0xd0-0xd7 */ | ||
548 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0xd8-0xdf */ | ||
549 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0xe0-0xe7 */ | ||
550 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0xe8-0xef */ | ||
551 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0xf0-0xf7 */ | ||
552 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0xf8-0xff */ | ||
553 | }; | ||
554 | |||
555 | static int uni2char(wchar_t uni, unsigned char *out, int boundlen) | ||
556 | { | ||
557 | const unsigned char *uni2charset; | ||
558 | unsigned char cl = uni & 0x00ff; | ||
559 | unsigned char ch = (uni & 0xff00) >> 8; | ||
560 | |||
561 | if (boundlen <= 0) | ||
562 | return -ENAMETOOLONG; | ||
563 | |||
564 | uni2charset = page_uni2charset[ch]; | ||
565 | if (uni2charset && uni2charset[cl]) | ||
566 | out[0] = uni2charset[cl]; | ||
567 | else | ||
568 | return -EINVAL; | ||
569 | return 1; | ||
570 | } | ||
571 | |||
572 | static int char2uni(const unsigned char *rawstring, int boundlen, wchar_t *uni) | ||
573 | { | ||
574 | *uni = charset2uni[*rawstring]; | ||
575 | if (*uni == 0x0000) | ||
576 | return -EINVAL; | ||
577 | return 1; | ||
578 | } | ||
579 | |||
580 | static struct nls_table table = { | ||
581 | .charset = "macromanian", | ||
582 | .uni2char = uni2char, | ||
583 | .char2uni = char2uni, | ||
584 | .charset2lower = charset2lower, | ||
585 | .charset2upper = charset2upper, | ||
586 | .owner = THIS_MODULE, | ||
587 | }; | ||
588 | |||
589 | static int __init init_nls_macromanian(void) | ||
590 | { | ||
591 | return register_nls(&table); | ||
592 | } | ||
593 | |||
594 | static void __exit exit_nls_macromanian(void) | ||
595 | { | ||
596 | unregister_nls(&table); | ||
597 | } | ||
598 | |||
599 | module_init(init_nls_macromanian) | ||
600 | module_exit(exit_nls_macromanian) | ||
601 | |||
602 | MODULE_LICENSE("Dual BSD/GPL"); | ||
diff --git a/fs/nls/nls_macturkish.c b/fs/nls/nls_macturkish.c new file mode 100644 index 000000000000..0cc2c6572826 --- /dev/null +++ b/fs/nls/nls_macturkish.c | |||
@@ -0,0 +1,602 @@ | |||
1 | /* | ||
2 | * linux/fs/nls/nls_macturkish.c | ||
3 | * | ||
4 | * Charset macturkish translation tables. | ||
5 | * Generated automatically from the Unicode and charset | ||
6 | * tables from the Unicode Organization (www.unicode.org). | ||
7 | * The Unicode to charset table has only exact mappings. | ||
8 | */ | ||
9 | |||
10 | /* | ||
11 | * COPYRIGHT AND PERMISSION NOTICE | ||
12 | * | ||
13 | * Copyright 1991-2012 Unicode, Inc. All rights reserved. Distributed under | ||
14 | * the Terms of Use in http://www.unicode.org/copyright.html. | ||
15 | * | ||
16 | * Permission is hereby granted, free of charge, to any person obtaining a | ||
17 | * copy of the Unicode data files and any associated documentation (the "Data | ||
18 | * Files") or Unicode software and any associated documentation (the | ||
19 | * "Software") to deal in the Data Files or Software without restriction, | ||
20 | * including without limitation the rights to use, copy, modify, merge, | ||
21 | * publish, distribute, and/or sell copies of the Data Files or Software, and | ||
22 | * to permit persons to whom the Data Files or Software are furnished to do | ||
23 | * so, provided that (a) the above copyright notice(s) and this permission | ||
24 | * notice appear with all copies of the Data Files or Software, (b) both the | ||
25 | * above copyright notice(s) and this permission notice appear in associated | ||
26 | * documentation, and (c) there is clear notice in each modified Data File or | ||
27 | * in the Software as well as in the documentation associated with the Data | ||
28 | * File(s) or Software that the data or software has been modified. | ||
29 | * | ||
30 | * THE DATA FILES AND SOFTWARE ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY | ||
31 | * KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF | ||
32 | * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF | ||
33 | * THIRD PARTY RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS | ||
34 | * INCLUDED IN THIS NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT | ||
35 | * OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF | ||
36 | * USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR | ||
37 | * OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR | ||
38 | * PERFORMANCE OF THE DATA FILES OR SOFTWARE. | ||
39 | * | ||
40 | * Except as contained in this notice, the name of a copyright holder shall | ||
41 | * not be used in advertising or otherwise to promote the sale, use or other | ||
42 | * dealings in these Data Files or Software without prior written | ||
43 | * authorization of the copyright holder. | ||
44 | */ | ||
45 | |||
46 | #include <linux/module.h> | ||
47 | #include <linux/kernel.h> | ||
48 | #include <linux/string.h> | ||
49 | #include <linux/nls.h> | ||
50 | #include <linux/errno.h> | ||
51 | |||
52 | static const wchar_t charset2uni[256] = { | ||
53 | /* 0x00 */ | ||
54 | 0x0000, 0x0001, 0x0002, 0x0003, | ||
55 | 0x0004, 0x0005, 0x0006, 0x0007, | ||
56 | 0x0008, 0x0009, 0x000a, 0x000b, | ||
57 | 0x000c, 0x000d, 0x000e, 0x000f, | ||
58 | /* 0x10 */ | ||
59 | 0x0010, 0x0011, 0x0012, 0x0013, | ||
60 | 0x0014, 0x0015, 0x0016, 0x0017, | ||
61 | 0x0018, 0x0019, 0x001a, 0x001b, | ||
62 | 0x001c, 0x001d, 0x001e, 0x001f, | ||
63 | /* 0x20 */ | ||
64 | 0x0020, 0x0021, 0x0022, 0x0023, | ||
65 | 0x0024, 0x0025, 0x0026, 0x0027, | ||
66 | 0x0028, 0x0029, 0x002a, 0x002b, | ||
67 | 0x002c, 0x002d, 0x002e, 0x002f, | ||
68 | /* 0x30 */ | ||
69 | 0x0030, 0x0031, 0x0032, 0x0033, | ||
70 | 0x0034, 0x0035, 0x0036, 0x0037, | ||
71 | 0x0038, 0x0039, 0x003a, 0x003b, | ||
72 | 0x003c, 0x003d, 0x003e, 0x003f, | ||
73 | /* 0x40 */ | ||
74 | 0x0040, 0x0041, 0x0042, 0x0043, | ||
75 | 0x0044, 0x0045, 0x0046, 0x0047, | ||
76 | 0x0048, 0x0049, 0x004a, 0x004b, | ||
77 | 0x004c, 0x004d, 0x004e, 0x004f, | ||
78 | /* 0x50 */ | ||
79 | 0x0050, 0x0051, 0x0052, 0x0053, | ||
80 | 0x0054, 0x0055, 0x0056, 0x0057, | ||
81 | 0x0058, 0x0059, 0x005a, 0x005b, | ||
82 | 0x005c, 0x005d, 0x005e, 0x005f, | ||
83 | /* 0x60 */ | ||
84 | 0x0060, 0x0061, 0x0062, 0x0063, | ||
85 | 0x0064, 0x0065, 0x0066, 0x0067, | ||
86 | 0x0068, 0x0069, 0x006a, 0x006b, | ||
87 | 0x006c, 0x006d, 0x006e, 0x006f, | ||
88 | /* 0x70 */ | ||
89 | 0x0070, 0x0071, 0x0072, 0x0073, | ||
90 | 0x0074, 0x0075, 0x0076, 0x0077, | ||
91 | 0x0078, 0x0079, 0x007a, 0x007b, | ||
92 | 0x007c, 0x007d, 0x007e, 0x007f, | ||
93 | /* 0x80 */ | ||
94 | 0x00c4, 0x00c5, 0x00c7, 0x00c9, | ||
95 | 0x00d1, 0x00d6, 0x00dc, 0x00e1, | ||
96 | 0x00e0, 0x00e2, 0x00e4, 0x00e3, | ||
97 | 0x00e5, 0x00e7, 0x00e9, 0x00e8, | ||
98 | /* 0x90 */ | ||
99 | 0x00ea, 0x00eb, 0x00ed, 0x00ec, | ||
100 | 0x00ee, 0x00ef, 0x00f1, 0x00f3, | ||
101 | 0x00f2, 0x00f4, 0x00f6, 0x00f5, | ||
102 | 0x00fa, 0x00f9, 0x00fb, 0x00fc, | ||
103 | /* 0xa0 */ | ||
104 | 0x2020, 0x00b0, 0x00a2, 0x00a3, | ||
105 | 0x00a7, 0x2022, 0x00b6, 0x00df, | ||
106 | 0x00ae, 0x00a9, 0x2122, 0x00b4, | ||
107 | 0x00a8, 0x2260, 0x00c6, 0x00d8, | ||
108 | /* 0xb0 */ | ||
109 | 0x221e, 0x00b1, 0x2264, 0x2265, | ||
110 | 0x00a5, 0x00b5, 0x2202, 0x2211, | ||
111 | 0x220f, 0x03c0, 0x222b, 0x00aa, | ||
112 | 0x00ba, 0x03a9, 0x00e6, 0x00f8, | ||
113 | /* 0xc0 */ | ||
114 | 0x00bf, 0x00a1, 0x00ac, 0x221a, | ||
115 | 0x0192, 0x2248, 0x2206, 0x00ab, | ||
116 | 0x00bb, 0x2026, 0x00a0, 0x00c0, | ||
117 | 0x00c3, 0x00d5, 0x0152, 0x0153, | ||
118 | /* 0xd0 */ | ||
119 | 0x2013, 0x2014, 0x201c, 0x201d, | ||
120 | 0x2018, 0x2019, 0x00f7, 0x25ca, | ||
121 | 0x00ff, 0x0178, 0x011e, 0x011f, | ||
122 | 0x0130, 0x0131, 0x015e, 0x015f, | ||
123 | /* 0xe0 */ | ||
124 | 0x2021, 0x00b7, 0x201a, 0x201e, | ||
125 | 0x2030, 0x00c2, 0x00ca, 0x00c1, | ||
126 | 0x00cb, 0x00c8, 0x00cd, 0x00ce, | ||
127 | 0x00cf, 0x00cc, 0x00d3, 0x00d4, | ||
128 | /* 0xf0 */ | ||
129 | 0xf8ff, 0x00d2, 0x00da, 0x00db, | ||
130 | 0x00d9, 0xf8a0, 0x02c6, 0x02dc, | ||
131 | 0x00af, 0x02d8, 0x02d9, 0x02da, | ||
132 | 0x00b8, 0x02dd, 0x02db, 0x02c7, | ||
133 | }; | ||
134 | |||
135 | static const unsigned char page00[256] = { | ||
136 | 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, /* 0x00-0x07 */ | ||
137 | 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, /* 0x08-0x0f */ | ||
138 | 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, /* 0x10-0x17 */ | ||
139 | 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, /* 0x18-0x1f */ | ||
140 | 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, /* 0x20-0x27 */ | ||
141 | 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, /* 0x28-0x2f */ | ||
142 | 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, /* 0x30-0x37 */ | ||
143 | 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, /* 0x38-0x3f */ | ||
144 | 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, /* 0x40-0x47 */ | ||
145 | 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, /* 0x48-0x4f */ | ||
146 | 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, /* 0x50-0x57 */ | ||
147 | 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f, /* 0x58-0x5f */ | ||
148 | 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, /* 0x60-0x67 */ | ||
149 | 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, /* 0x68-0x6f */ | ||
150 | 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, /* 0x70-0x77 */ | ||
151 | 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f, /* 0x78-0x7f */ | ||
152 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x80-0x87 */ | ||
153 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x88-0x8f */ | ||
154 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x90-0x97 */ | ||
155 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x98-0x9f */ | ||
156 | 0xca, 0xc1, 0xa2, 0xa3, 0x00, 0xb4, 0x00, 0xa4, /* 0xa0-0xa7 */ | ||
157 | 0xac, 0xa9, 0xbb, 0xc7, 0xc2, 0x00, 0xa8, 0xf8, /* 0xa8-0xaf */ | ||
158 | 0xa1, 0xb1, 0x00, 0x00, 0xab, 0xb5, 0xa6, 0xe1, /* 0xb0-0xb7 */ | ||
159 | 0xfc, 0x00, 0xbc, 0xc8, 0x00, 0x00, 0x00, 0xc0, /* 0xb8-0xbf */ | ||
160 | 0xcb, 0xe7, 0xe5, 0xcc, 0x80, 0x81, 0xae, 0x82, /* 0xc0-0xc7 */ | ||
161 | 0xe9, 0x83, 0xe6, 0xe8, 0xed, 0xea, 0xeb, 0xec, /* 0xc8-0xcf */ | ||
162 | 0x00, 0x84, 0xf1, 0xee, 0xef, 0xcd, 0x85, 0x00, /* 0xd0-0xd7 */ | ||
163 | 0xaf, 0xf4, 0xf2, 0xf3, 0x86, 0x00, 0x00, 0xa7, /* 0xd8-0xdf */ | ||
164 | 0x88, 0x87, 0x89, 0x8b, 0x8a, 0x8c, 0xbe, 0x8d, /* 0xe0-0xe7 */ | ||
165 | 0x8f, 0x8e, 0x90, 0x91, 0x93, 0x92, 0x94, 0x95, /* 0xe8-0xef */ | ||
166 | 0x00, 0x96, 0x98, 0x97, 0x99, 0x9b, 0x9a, 0xd6, /* 0xf0-0xf7 */ | ||
167 | 0xbf, 0x9d, 0x9c, 0x9e, 0x9f, 0x00, 0x00, 0xd8, /* 0xf8-0xff */ | ||
168 | }; | ||
169 | |||
170 | static const unsigned char page01[256] = { | ||
171 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x00-0x07 */ | ||
172 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x08-0x0f */ | ||
173 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10-0x17 */ | ||
174 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xda, 0xdb, /* 0x18-0x1f */ | ||
175 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x20-0x27 */ | ||
176 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x28-0x2f */ | ||
177 | 0xdc, 0xdd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x30-0x37 */ | ||
178 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x38-0x3f */ | ||
179 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x40-0x47 */ | ||
180 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x48-0x4f */ | ||
181 | 0x00, 0x00, 0xce, 0xcf, 0x00, 0x00, 0x00, 0x00, /* 0x50-0x57 */ | ||
182 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xde, 0xdf, /* 0x58-0x5f */ | ||
183 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x60-0x67 */ | ||
184 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x68-0x6f */ | ||
185 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */ | ||
186 | 0xd9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x78-0x7f */ | ||
187 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x80-0x87 */ | ||
188 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x88-0x8f */ | ||
189 | 0x00, 0x00, 0xc4, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x90-0x97 */ | ||
190 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x98-0x9f */ | ||
191 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa0-0xa7 */ | ||
192 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa8-0xaf */ | ||
193 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xb0-0xb7 */ | ||
194 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xb8-0xbf */ | ||
195 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc0-0xc7 */ | ||
196 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc8-0xcf */ | ||
197 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd0-0xd7 */ | ||
198 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd8-0xdf */ | ||
199 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe0-0xe7 */ | ||
200 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe8-0xef */ | ||
201 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xf0-0xf7 */ | ||
202 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xf8-0xff */ | ||
203 | }; | ||
204 | |||
205 | static const unsigned char page02[256] = { | ||
206 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x00-0x07 */ | ||
207 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x08-0x0f */ | ||
208 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10-0x17 */ | ||
209 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x18-0x1f */ | ||
210 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x20-0x27 */ | ||
211 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x28-0x2f */ | ||
212 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x30-0x37 */ | ||
213 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x38-0x3f */ | ||
214 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x40-0x47 */ | ||
215 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x48-0x4f */ | ||
216 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x50-0x57 */ | ||
217 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x58-0x5f */ | ||
218 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x60-0x67 */ | ||
219 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x68-0x6f */ | ||
220 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */ | ||
221 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x78-0x7f */ | ||
222 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x80-0x87 */ | ||
223 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x88-0x8f */ | ||
224 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x90-0x97 */ | ||
225 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x98-0x9f */ | ||
226 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa0-0xa7 */ | ||
227 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa8-0xaf */ | ||
228 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xb0-0xb7 */ | ||
229 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xb8-0xbf */ | ||
230 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf6, 0xff, /* 0xc0-0xc7 */ | ||
231 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc8-0xcf */ | ||
232 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd0-0xd7 */ | ||
233 | 0xf9, 0xfa, 0xfb, 0xfe, 0xf7, 0xfd, 0x00, 0x00, /* 0xd8-0xdf */ | ||
234 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe0-0xe7 */ | ||
235 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe8-0xef */ | ||
236 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xf0-0xf7 */ | ||
237 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xf8-0xff */ | ||
238 | }; | ||
239 | |||
240 | static const unsigned char page03[256] = { | ||
241 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x00-0x07 */ | ||
242 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x08-0x0f */ | ||
243 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10-0x17 */ | ||
244 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x18-0x1f */ | ||
245 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x20-0x27 */ | ||
246 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x28-0x2f */ | ||
247 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x30-0x37 */ | ||
248 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x38-0x3f */ | ||
249 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x40-0x47 */ | ||
250 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x48-0x4f */ | ||
251 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x50-0x57 */ | ||
252 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x58-0x5f */ | ||
253 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x60-0x67 */ | ||
254 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x68-0x6f */ | ||
255 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */ | ||
256 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x78-0x7f */ | ||
257 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x80-0x87 */ | ||
258 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x88-0x8f */ | ||
259 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x90-0x97 */ | ||
260 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x98-0x9f */ | ||
261 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa0-0xa7 */ | ||
262 | 0x00, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa8-0xaf */ | ||
263 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xb0-0xb7 */ | ||
264 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xb8-0xbf */ | ||
265 | 0xb9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc0-0xc7 */ | ||
266 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc8-0xcf */ | ||
267 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd0-0xd7 */ | ||
268 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd8-0xdf */ | ||
269 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe0-0xe7 */ | ||
270 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe8-0xef */ | ||
271 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xf0-0xf7 */ | ||
272 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xf8-0xff */ | ||
273 | }; | ||
274 | |||
275 | static const unsigned char page20[256] = { | ||
276 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x00-0x07 */ | ||
277 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x08-0x0f */ | ||
278 | 0x00, 0x00, 0x00, 0xd0, 0xd1, 0x00, 0x00, 0x00, /* 0x10-0x17 */ | ||
279 | 0xd4, 0xd5, 0xe2, 0x00, 0xd2, 0xd3, 0xe3, 0x00, /* 0x18-0x1f */ | ||
280 | 0xa0, 0xe0, 0xa5, 0x00, 0x00, 0x00, 0xc9, 0x00, /* 0x20-0x27 */ | ||
281 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x28-0x2f */ | ||
282 | 0xe4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x30-0x37 */ | ||
283 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x38-0x3f */ | ||
284 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x40-0x47 */ | ||
285 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x48-0x4f */ | ||
286 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x50-0x57 */ | ||
287 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x58-0x5f */ | ||
288 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x60-0x67 */ | ||
289 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x68-0x6f */ | ||
290 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */ | ||
291 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x78-0x7f */ | ||
292 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x80-0x87 */ | ||
293 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x88-0x8f */ | ||
294 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x90-0x97 */ | ||
295 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x98-0x9f */ | ||
296 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa0-0xa7 */ | ||
297 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa8-0xaf */ | ||
298 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xb0-0xb7 */ | ||
299 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xb8-0xbf */ | ||
300 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc0-0xc7 */ | ||
301 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc8-0xcf */ | ||
302 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd0-0xd7 */ | ||
303 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd8-0xdf */ | ||
304 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe0-0xe7 */ | ||
305 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe8-0xef */ | ||
306 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xf0-0xf7 */ | ||
307 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xf8-0xff */ | ||
308 | }; | ||
309 | |||
310 | static const unsigned char page21[256] = { | ||
311 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x00-0x07 */ | ||
312 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x08-0x0f */ | ||
313 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10-0x17 */ | ||
314 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x18-0x1f */ | ||
315 | 0x00, 0x00, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x20-0x27 */ | ||
316 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x28-0x2f */ | ||
317 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x30-0x37 */ | ||
318 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x38-0x3f */ | ||
319 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x40-0x47 */ | ||
320 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x48-0x4f */ | ||
321 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x50-0x57 */ | ||
322 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x58-0x5f */ | ||
323 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x60-0x67 */ | ||
324 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x68-0x6f */ | ||
325 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */ | ||
326 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x78-0x7f */ | ||
327 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x80-0x87 */ | ||
328 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x88-0x8f */ | ||
329 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x90-0x97 */ | ||
330 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x98-0x9f */ | ||
331 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa0-0xa7 */ | ||
332 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa8-0xaf */ | ||
333 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xb0-0xb7 */ | ||
334 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xb8-0xbf */ | ||
335 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc0-0xc7 */ | ||
336 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc8-0xcf */ | ||
337 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd0-0xd7 */ | ||
338 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd8-0xdf */ | ||
339 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe0-0xe7 */ | ||
340 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe8-0xef */ | ||
341 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xf0-0xf7 */ | ||
342 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xf8-0xff */ | ||
343 | }; | ||
344 | |||
345 | static const unsigned char page22[256] = { | ||
346 | 0x00, 0x00, 0xb6, 0x00, 0x00, 0x00, 0xc6, 0x00, /* 0x00-0x07 */ | ||
347 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb8, /* 0x08-0x0f */ | ||
348 | 0x00, 0xb7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10-0x17 */ | ||
349 | 0x00, 0x00, 0xc3, 0x00, 0x00, 0x00, 0xb0, 0x00, /* 0x18-0x1f */ | ||
350 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x20-0x27 */ | ||
351 | 0x00, 0x00, 0x00, 0xba, 0x00, 0x00, 0x00, 0x00, /* 0x28-0x2f */ | ||
352 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x30-0x37 */ | ||
353 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x38-0x3f */ | ||
354 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x40-0x47 */ | ||
355 | 0xc5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x48-0x4f */ | ||
356 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x50-0x57 */ | ||
357 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x58-0x5f */ | ||
358 | 0xad, 0x00, 0x00, 0x00, 0xb2, 0xb3, 0x00, 0x00, /* 0x60-0x67 */ | ||
359 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x68-0x6f */ | ||
360 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */ | ||
361 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x78-0x7f */ | ||
362 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x80-0x87 */ | ||
363 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x88-0x8f */ | ||
364 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x90-0x97 */ | ||
365 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x98-0x9f */ | ||
366 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa0-0xa7 */ | ||
367 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa8-0xaf */ | ||
368 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xb0-0xb7 */ | ||
369 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xb8-0xbf */ | ||
370 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc0-0xc7 */ | ||
371 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc8-0xcf */ | ||
372 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd0-0xd7 */ | ||
373 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd8-0xdf */ | ||
374 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe0-0xe7 */ | ||
375 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe8-0xef */ | ||
376 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xf0-0xf7 */ | ||
377 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xf8-0xff */ | ||
378 | }; | ||
379 | |||
380 | static const unsigned char page25[256] = { | ||
381 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x00-0x07 */ | ||
382 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x08-0x0f */ | ||
383 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10-0x17 */ | ||
384 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x18-0x1f */ | ||
385 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x20-0x27 */ | ||
386 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x28-0x2f */ | ||
387 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x30-0x37 */ | ||
388 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x38-0x3f */ | ||
389 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x40-0x47 */ | ||
390 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x48-0x4f */ | ||
391 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x50-0x57 */ | ||
392 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x58-0x5f */ | ||
393 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x60-0x67 */ | ||
394 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x68-0x6f */ | ||
395 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */ | ||
396 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x78-0x7f */ | ||
397 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x80-0x87 */ | ||
398 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x88-0x8f */ | ||
399 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x90-0x97 */ | ||
400 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x98-0x9f */ | ||
401 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa0-0xa7 */ | ||
402 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa8-0xaf */ | ||
403 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xb0-0xb7 */ | ||
404 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xb8-0xbf */ | ||
405 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc0-0xc7 */ | ||
406 | 0x00, 0x00, 0xd7, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc8-0xcf */ | ||
407 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd0-0xd7 */ | ||
408 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd8-0xdf */ | ||
409 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe0-0xe7 */ | ||
410 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe8-0xef */ | ||
411 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xf0-0xf7 */ | ||
412 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xf8-0xff */ | ||
413 | }; | ||
414 | |||
415 | static const unsigned char pagef8[256] = { | ||
416 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x00-0x07 */ | ||
417 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x08-0x0f */ | ||
418 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10-0x17 */ | ||
419 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x18-0x1f */ | ||
420 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x20-0x27 */ | ||
421 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x28-0x2f */ | ||
422 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x30-0x37 */ | ||
423 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x38-0x3f */ | ||
424 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x40-0x47 */ | ||
425 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x48-0x4f */ | ||
426 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x50-0x57 */ | ||
427 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x58-0x5f */ | ||
428 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x60-0x67 */ | ||
429 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x68-0x6f */ | ||
430 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */ | ||
431 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x78-0x7f */ | ||
432 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x80-0x87 */ | ||
433 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x88-0x8f */ | ||
434 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x90-0x97 */ | ||
435 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x98-0x9f */ | ||
436 | 0xf5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa0-0xa7 */ | ||
437 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa8-0xaf */ | ||
438 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xb0-0xb7 */ | ||
439 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xb8-0xbf */ | ||
440 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc0-0xc7 */ | ||
441 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc8-0xcf */ | ||
442 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd0-0xd7 */ | ||
443 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd8-0xdf */ | ||
444 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe0-0xe7 */ | ||
445 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe8-0xef */ | ||
446 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xf0-0xf7 */ | ||
447 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, /* 0xf8-0xff */ | ||
448 | }; | ||
449 | |||
450 | static const unsigned char *const page_uni2charset[256] = { | ||
451 | page00, page01, page02, page03, NULL, NULL, NULL, NULL, | ||
452 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
453 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
454 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
455 | page20, page21, page22, NULL, NULL, page25, NULL, NULL, | ||
456 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
457 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
458 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
459 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
460 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
461 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
462 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
463 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
464 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
465 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
466 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
467 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
468 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
469 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
470 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
471 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
472 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
473 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
474 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
475 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
476 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
477 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
478 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
479 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
480 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
481 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
482 | pagef8, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
483 | }; | ||
484 | |||
485 | static const unsigned char charset2lower[256] = { | ||
486 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x00-0x07 */ | ||
487 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x08-0x0f */ | ||
488 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x10-0x17 */ | ||
489 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x18-0x1f */ | ||
490 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x20-0x27 */ | ||
491 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x28-0x2f */ | ||
492 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x30-0x37 */ | ||
493 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x38-0x3f */ | ||
494 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x40-0x47 */ | ||
495 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x48-0x4f */ | ||
496 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x50-0x57 */ | ||
497 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x58-0x5f */ | ||
498 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x60-0x67 */ | ||
499 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x68-0x6f */ | ||
500 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x70-0x77 */ | ||
501 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x78-0x7f */ | ||
502 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x80-0x87 */ | ||
503 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x88-0x8f */ | ||
504 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x90-0x97 */ | ||
505 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x98-0x9f */ | ||
506 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0xa0-0xa7 */ | ||
507 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0xa8-0xaf */ | ||
508 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0xb0-0xb7 */ | ||
509 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0xb8-0xbf */ | ||
510 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0xc0-0xc7 */ | ||
511 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0xc8-0xcf */ | ||
512 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0xd0-0xd7 */ | ||
513 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0xd8-0xdf */ | ||
514 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0xe0-0xe7 */ | ||
515 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0xe8-0xef */ | ||
516 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0xf0-0xf7 */ | ||
517 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0xf8-0xff */ | ||
518 | }; | ||
519 | |||
520 | static const unsigned char charset2upper[256] = { | ||
521 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x00-0x07 */ | ||
522 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x08-0x0f */ | ||
523 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x10-0x17 */ | ||
524 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x18-0x1f */ | ||
525 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x20-0x27 */ | ||
526 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x28-0x2f */ | ||
527 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x30-0x37 */ | ||
528 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x38-0x3f */ | ||
529 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x40-0x47 */ | ||
530 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x48-0x4f */ | ||
531 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x50-0x57 */ | ||
532 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x58-0x5f */ | ||
533 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x60-0x67 */ | ||
534 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x68-0x6f */ | ||
535 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x70-0x77 */ | ||
536 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x78-0x7f */ | ||
537 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x80-0x87 */ | ||
538 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x88-0x8f */ | ||
539 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x90-0x97 */ | ||
540 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x98-0x9f */ | ||
541 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0xa0-0xa7 */ | ||
542 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0xa8-0xaf */ | ||
543 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0xb0-0xb7 */ | ||
544 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0xb8-0xbf */ | ||
545 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0xc0-0xc7 */ | ||
546 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0xc8-0xcf */ | ||
547 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0xd0-0xd7 */ | ||
548 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0xd8-0xdf */ | ||
549 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0xe0-0xe7 */ | ||
550 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0xe8-0xef */ | ||
551 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0xf0-0xf7 */ | ||
552 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0xf8-0xff */ | ||
553 | }; | ||
554 | |||
555 | static int uni2char(wchar_t uni, unsigned char *out, int boundlen) | ||
556 | { | ||
557 | const unsigned char *uni2charset; | ||
558 | unsigned char cl = uni & 0x00ff; | ||
559 | unsigned char ch = (uni & 0xff00) >> 8; | ||
560 | |||
561 | if (boundlen <= 0) | ||
562 | return -ENAMETOOLONG; | ||
563 | |||
564 | uni2charset = page_uni2charset[ch]; | ||
565 | if (uni2charset && uni2charset[cl]) | ||
566 | out[0] = uni2charset[cl]; | ||
567 | else | ||
568 | return -EINVAL; | ||
569 | return 1; | ||
570 | } | ||
571 | |||
572 | static int char2uni(const unsigned char *rawstring, int boundlen, wchar_t *uni) | ||
573 | { | ||
574 | *uni = charset2uni[*rawstring]; | ||
575 | if (*uni == 0x0000) | ||
576 | return -EINVAL; | ||
577 | return 1; | ||
578 | } | ||
579 | |||
580 | static struct nls_table table = { | ||
581 | .charset = "macturkish", | ||
582 | .uni2char = uni2char, | ||
583 | .char2uni = char2uni, | ||
584 | .charset2lower = charset2lower, | ||
585 | .charset2upper = charset2upper, | ||
586 | .owner = THIS_MODULE, | ||
587 | }; | ||
588 | |||
589 | static int __init init_nls_macturkish(void) | ||
590 | { | ||
591 | return register_nls(&table); | ||
592 | } | ||
593 | |||
594 | static void __exit exit_nls_macturkish(void) | ||
595 | { | ||
596 | unregister_nls(&table); | ||
597 | } | ||
598 | |||
599 | module_init(init_nls_macturkish) | ||
600 | module_exit(exit_nls_macturkish) | ||
601 | |||
602 | MODULE_LICENSE("Dual BSD/GPL"); | ||
@@ -693,7 +693,7 @@ static long pipe_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) | |||
693 | 693 | ||
694 | return put_user(count, (int __user *)arg); | 694 | return put_user(count, (int __user *)arg); |
695 | default: | 695 | default: |
696 | return -EINVAL; | 696 | return -ENOIOCTLCMD; |
697 | } | 697 | } |
698 | } | 698 | } |
699 | 699 | ||
diff --git a/fs/proc/array.c b/fs/proc/array.c index dc4c5a7b9ece..c1c207c36cae 100644 --- a/fs/proc/array.c +++ b/fs/proc/array.c | |||
@@ -370,7 +370,7 @@ static int do_task_stat(struct seq_file *m, struct pid_namespace *ns, | |||
370 | struct pid *pid, struct task_struct *task, int whole) | 370 | struct pid *pid, struct task_struct *task, int whole) |
371 | { | 371 | { |
372 | unsigned long vsize, eip, esp, wchan = ~0UL; | 372 | unsigned long vsize, eip, esp, wchan = ~0UL; |
373 | long priority, nice; | 373 | int priority, nice; |
374 | int tty_pgrp = -1, tty_nr = 0; | 374 | int tty_pgrp = -1, tty_nr = 0; |
375 | sigset_t sigign, sigcatch; | 375 | sigset_t sigign, sigcatch; |
376 | char state; | 376 | char state; |
@@ -492,7 +492,7 @@ static int do_task_stat(struct seq_file *m, struct pid_namespace *ns, | |||
492 | seq_put_decimal_ull(m, ' ', 0); | 492 | seq_put_decimal_ull(m, ' ', 0); |
493 | seq_put_decimal_ull(m, ' ', start_time); | 493 | seq_put_decimal_ull(m, ' ', start_time); |
494 | seq_put_decimal_ull(m, ' ', vsize); | 494 | seq_put_decimal_ull(m, ' ', vsize); |
495 | seq_put_decimal_ll(m, ' ', mm ? get_mm_rss(mm) : 0); | 495 | seq_put_decimal_ull(m, ' ', mm ? get_mm_rss(mm) : 0); |
496 | seq_put_decimal_ull(m, ' ', rsslim); | 496 | seq_put_decimal_ull(m, ' ', rsslim); |
497 | seq_put_decimal_ull(m, ' ', mm ? (permitted ? mm->start_code : 1) : 0); | 497 | seq_put_decimal_ull(m, ' ', mm ? (permitted ? mm->start_code : 1) : 0); |
498 | seq_put_decimal_ull(m, ' ', mm ? (permitted ? mm->end_code : 1) : 0); | 498 | seq_put_decimal_ull(m, ' ', mm ? (permitted ? mm->end_code : 1) : 0); |
@@ -517,9 +517,23 @@ static int do_task_stat(struct seq_file *m, struct pid_namespace *ns, | |||
517 | seq_put_decimal_ull(m, ' ', delayacct_blkio_ticks(task)); | 517 | seq_put_decimal_ull(m, ' ', delayacct_blkio_ticks(task)); |
518 | seq_put_decimal_ull(m, ' ', cputime_to_clock_t(gtime)); | 518 | seq_put_decimal_ull(m, ' ', cputime_to_clock_t(gtime)); |
519 | seq_put_decimal_ll(m, ' ', cputime_to_clock_t(cgtime)); | 519 | seq_put_decimal_ll(m, ' ', cputime_to_clock_t(cgtime)); |
520 | seq_put_decimal_ull(m, ' ', (mm && permitted) ? mm->start_data : 0); | 520 | |
521 | seq_put_decimal_ull(m, ' ', (mm && permitted) ? mm->end_data : 0); | 521 | if (mm && permitted) { |
522 | seq_put_decimal_ull(m, ' ', (mm && permitted) ? mm->start_brk : 0); | 522 | seq_put_decimal_ull(m, ' ', mm->start_data); |
523 | seq_put_decimal_ull(m, ' ', mm->end_data); | ||
524 | seq_put_decimal_ull(m, ' ', mm->start_brk); | ||
525 | seq_put_decimal_ull(m, ' ', mm->arg_start); | ||
526 | seq_put_decimal_ull(m, ' ', mm->arg_end); | ||
527 | seq_put_decimal_ull(m, ' ', mm->env_start); | ||
528 | seq_put_decimal_ull(m, ' ', mm->env_end); | ||
529 | } else | ||
530 | seq_printf(m, " 0 0 0 0 0 0 0"); | ||
531 | |||
532 | if (permitted) | ||
533 | seq_put_decimal_ll(m, ' ', task->exit_code); | ||
534 | else | ||
535 | seq_put_decimal_ll(m, ' ', 0); | ||
536 | |||
523 | seq_putc(m, '\n'); | 537 | seq_putc(m, '\n'); |
524 | if (mm) | 538 | if (mm) |
525 | mmput(mm); | 539 | mmput(mm); |
@@ -565,3 +579,126 @@ int proc_pid_statm(struct seq_file *m, struct pid_namespace *ns, | |||
565 | 579 | ||
566 | return 0; | 580 | return 0; |
567 | } | 581 | } |
582 | |||
583 | #ifdef CONFIG_CHECKPOINT_RESTORE | ||
584 | static struct pid * | ||
585 | get_children_pid(struct inode *inode, struct pid *pid_prev, loff_t pos) | ||
586 | { | ||
587 | struct task_struct *start, *task; | ||
588 | struct pid *pid = NULL; | ||
589 | |||
590 | read_lock(&tasklist_lock); | ||
591 | |||
592 | start = pid_task(proc_pid(inode), PIDTYPE_PID); | ||
593 | if (!start) | ||
594 | goto out; | ||
595 | |||
596 | /* | ||
597 | * Lets try to continue searching first, this gives | ||
598 | * us significant speedup on children-rich processes. | ||
599 | */ | ||
600 | if (pid_prev) { | ||
601 | task = pid_task(pid_prev, PIDTYPE_PID); | ||
602 | if (task && task->real_parent == start && | ||
603 | !(list_empty(&task->sibling))) { | ||
604 | if (list_is_last(&task->sibling, &start->children)) | ||
605 | goto out; | ||
606 | task = list_first_entry(&task->sibling, | ||
607 | struct task_struct, sibling); | ||
608 | pid = get_pid(task_pid(task)); | ||
609 | goto out; | ||
610 | } | ||
611 | } | ||
612 | |||
613 | /* | ||
614 | * Slow search case. | ||
615 | * | ||
616 | * We might miss some children here if children | ||
617 | * are exited while we were not holding the lock, | ||
618 | * but it was never promised to be accurate that | ||
619 | * much. | ||
620 | * | ||
621 | * "Just suppose that the parent sleeps, but N children | ||
622 | * exit after we printed their tids. Now the slow paths | ||
623 | * skips N extra children, we miss N tasks." (c) | ||
624 | * | ||
625 | * So one need to stop or freeze the leader and all | ||
626 | * its children to get a precise result. | ||
627 | */ | ||
628 | list_for_each_entry(task, &start->children, sibling) { | ||
629 | if (pos-- == 0) { | ||
630 | pid = get_pid(task_pid(task)); | ||
631 | break; | ||
632 | } | ||
633 | } | ||
634 | |||
635 | out: | ||
636 | read_unlock(&tasklist_lock); | ||
637 | return pid; | ||
638 | } | ||
639 | |||
640 | static int children_seq_show(struct seq_file *seq, void *v) | ||
641 | { | ||
642 | struct inode *inode = seq->private; | ||
643 | pid_t pid; | ||
644 | |||
645 | pid = pid_nr_ns(v, inode->i_sb->s_fs_info); | ||
646 | return seq_printf(seq, "%d ", pid); | ||
647 | } | ||
648 | |||
649 | static void *children_seq_start(struct seq_file *seq, loff_t *pos) | ||
650 | { | ||
651 | return get_children_pid(seq->private, NULL, *pos); | ||
652 | } | ||
653 | |||
654 | static void *children_seq_next(struct seq_file *seq, void *v, loff_t *pos) | ||
655 | { | ||
656 | struct pid *pid; | ||
657 | |||
658 | pid = get_children_pid(seq->private, v, *pos + 1); | ||
659 | put_pid(v); | ||
660 | |||
661 | ++*pos; | ||
662 | return pid; | ||
663 | } | ||
664 | |||
665 | static void children_seq_stop(struct seq_file *seq, void *v) | ||
666 | { | ||
667 | put_pid(v); | ||
668 | } | ||
669 | |||
670 | static const struct seq_operations children_seq_ops = { | ||
671 | .start = children_seq_start, | ||
672 | .next = children_seq_next, | ||
673 | .stop = children_seq_stop, | ||
674 | .show = children_seq_show, | ||
675 | }; | ||
676 | |||
677 | static int children_seq_open(struct inode *inode, struct file *file) | ||
678 | { | ||
679 | struct seq_file *m; | ||
680 | int ret; | ||
681 | |||
682 | ret = seq_open(file, &children_seq_ops); | ||
683 | if (ret) | ||
684 | return ret; | ||
685 | |||
686 | m = file->private_data; | ||
687 | m->private = inode; | ||
688 | |||
689 | return ret; | ||
690 | } | ||
691 | |||
692 | int children_seq_release(struct inode *inode, struct file *file) | ||
693 | { | ||
694 | seq_release(inode, file); | ||
695 | return 0; | ||
696 | } | ||
697 | |||
698 | const struct file_operations proc_tid_children_operations = { | ||
699 | .open = children_seq_open, | ||
700 | .read = seq_read, | ||
701 | .llseek = seq_lseek, | ||
702 | .release = children_seq_release, | ||
703 | }; | ||
704 | #endif /* CONFIG_CHECKPOINT_RESTORE */ | ||
diff --git a/fs/proc/base.c b/fs/proc/base.c index d7d711876b6a..616f41a7cde6 100644 --- a/fs/proc/base.c +++ b/fs/proc/base.c | |||
@@ -199,11 +199,6 @@ static int proc_root_link(struct dentry *dentry, struct path *path) | |||
199 | return result; | 199 | return result; |
200 | } | 200 | } |
201 | 201 | ||
202 | struct mm_struct *mm_for_maps(struct task_struct *task) | ||
203 | { | ||
204 | return mm_access(task, PTRACE_MODE_READ); | ||
205 | } | ||
206 | |||
207 | static int proc_pid_cmdline(struct task_struct *task, char * buffer) | 202 | static int proc_pid_cmdline(struct task_struct *task, char * buffer) |
208 | { | 203 | { |
209 | int res = 0; | 204 | int res = 0; |
@@ -243,7 +238,7 @@ out: | |||
243 | 238 | ||
244 | static int proc_pid_auxv(struct task_struct *task, char *buffer) | 239 | static int proc_pid_auxv(struct task_struct *task, char *buffer) |
245 | { | 240 | { |
246 | struct mm_struct *mm = mm_for_maps(task); | 241 | struct mm_struct *mm = mm_access(task, PTRACE_MODE_READ); |
247 | int res = PTR_ERR(mm); | 242 | int res = PTR_ERR(mm); |
248 | if (mm && !IS_ERR(mm)) { | 243 | if (mm && !IS_ERR(mm)) { |
249 | unsigned int nwords = 0; | 244 | unsigned int nwords = 0; |
@@ -679,7 +674,7 @@ static const struct file_operations proc_single_file_operations = { | |||
679 | .release = single_release, | 674 | .release = single_release, |
680 | }; | 675 | }; |
681 | 676 | ||
682 | static int mem_open(struct inode* inode, struct file* file) | 677 | static int __mem_open(struct inode *inode, struct file *file, unsigned int mode) |
683 | { | 678 | { |
684 | struct task_struct *task = get_proc_task(file->f_path.dentry->d_inode); | 679 | struct task_struct *task = get_proc_task(file->f_path.dentry->d_inode); |
685 | struct mm_struct *mm; | 680 | struct mm_struct *mm; |
@@ -687,7 +682,7 @@ static int mem_open(struct inode* inode, struct file* file) | |||
687 | if (!task) | 682 | if (!task) |
688 | return -ESRCH; | 683 | return -ESRCH; |
689 | 684 | ||
690 | mm = mm_access(task, PTRACE_MODE_ATTACH); | 685 | mm = mm_access(task, mode); |
691 | put_task_struct(task); | 686 | put_task_struct(task); |
692 | 687 | ||
693 | if (IS_ERR(mm)) | 688 | if (IS_ERR(mm)) |
@@ -707,6 +702,11 @@ static int mem_open(struct inode* inode, struct file* file) | |||
707 | return 0; | 702 | return 0; |
708 | } | 703 | } |
709 | 704 | ||
705 | static int mem_open(struct inode *inode, struct file *file) | ||
706 | { | ||
707 | return __mem_open(inode, file, PTRACE_MODE_ATTACH); | ||
708 | } | ||
709 | |||
710 | static ssize_t mem_rw(struct file *file, char __user *buf, | 710 | static ssize_t mem_rw(struct file *file, char __user *buf, |
711 | size_t count, loff_t *ppos, int write) | 711 | size_t count, loff_t *ppos, int write) |
712 | { | 712 | { |
@@ -803,30 +803,29 @@ static const struct file_operations proc_mem_operations = { | |||
803 | .release = mem_release, | 803 | .release = mem_release, |
804 | }; | 804 | }; |
805 | 805 | ||
806 | static int environ_open(struct inode *inode, struct file *file) | ||
807 | { | ||
808 | return __mem_open(inode, file, PTRACE_MODE_READ); | ||
809 | } | ||
810 | |||
806 | static ssize_t environ_read(struct file *file, char __user *buf, | 811 | static ssize_t environ_read(struct file *file, char __user *buf, |
807 | size_t count, loff_t *ppos) | 812 | size_t count, loff_t *ppos) |
808 | { | 813 | { |
809 | struct task_struct *task = get_proc_task(file->f_dentry->d_inode); | ||
810 | char *page; | 814 | char *page; |
811 | unsigned long src = *ppos; | 815 | unsigned long src = *ppos; |
812 | int ret = -ESRCH; | 816 | int ret = 0; |
813 | struct mm_struct *mm; | 817 | struct mm_struct *mm = file->private_data; |
814 | 818 | ||
815 | if (!task) | 819 | if (!mm) |
816 | goto out_no_task; | 820 | return 0; |
817 | 821 | ||
818 | ret = -ENOMEM; | ||
819 | page = (char *)__get_free_page(GFP_TEMPORARY); | 822 | page = (char *)__get_free_page(GFP_TEMPORARY); |
820 | if (!page) | 823 | if (!page) |
821 | goto out; | 824 | return -ENOMEM; |
822 | |||
823 | |||
824 | mm = mm_for_maps(task); | ||
825 | ret = PTR_ERR(mm); | ||
826 | if (!mm || IS_ERR(mm)) | ||
827 | goto out_free; | ||
828 | 825 | ||
829 | ret = 0; | 826 | ret = 0; |
827 | if (!atomic_inc_not_zero(&mm->mm_users)) | ||
828 | goto free; | ||
830 | while (count > 0) { | 829 | while (count > 0) { |
831 | int this_len, retval, max_len; | 830 | int this_len, retval, max_len; |
832 | 831 | ||
@@ -838,7 +837,7 @@ static ssize_t environ_read(struct file *file, char __user *buf, | |||
838 | max_len = (count > PAGE_SIZE) ? PAGE_SIZE : count; | 837 | max_len = (count > PAGE_SIZE) ? PAGE_SIZE : count; |
839 | this_len = (this_len > max_len) ? max_len : this_len; | 838 | this_len = (this_len > max_len) ? max_len : this_len; |
840 | 839 | ||
841 | retval = access_process_vm(task, (mm->env_start + src), | 840 | retval = access_remote_vm(mm, (mm->env_start + src), |
842 | page, this_len, 0); | 841 | page, this_len, 0); |
843 | 842 | ||
844 | if (retval <= 0) { | 843 | if (retval <= 0) { |
@@ -857,19 +856,18 @@ static ssize_t environ_read(struct file *file, char __user *buf, | |||
857 | count -= retval; | 856 | count -= retval; |
858 | } | 857 | } |
859 | *ppos = src; | 858 | *ppos = src; |
860 | |||
861 | mmput(mm); | 859 | mmput(mm); |
862 | out_free: | 860 | |
861 | free: | ||
863 | free_page((unsigned long) page); | 862 | free_page((unsigned long) page); |
864 | out: | ||
865 | put_task_struct(task); | ||
866 | out_no_task: | ||
867 | return ret; | 863 | return ret; |
868 | } | 864 | } |
869 | 865 | ||
870 | static const struct file_operations proc_environ_operations = { | 866 | static const struct file_operations proc_environ_operations = { |
867 | .open = environ_open, | ||
871 | .read = environ_read, | 868 | .read = environ_read, |
872 | .llseek = generic_file_llseek, | 869 | .llseek = generic_file_llseek, |
870 | .release = mem_release, | ||
873 | }; | 871 | }; |
874 | 872 | ||
875 | static ssize_t oom_adjust_read(struct file *file, char __user *buf, | 873 | static ssize_t oom_adjust_read(struct file *file, char __user *buf, |
@@ -1850,7 +1848,7 @@ static const struct dentry_operations tid_fd_dentry_operations = | |||
1850 | static struct dentry *proc_fd_instantiate(struct inode *dir, | 1848 | static struct dentry *proc_fd_instantiate(struct inode *dir, |
1851 | struct dentry *dentry, struct task_struct *task, const void *ptr) | 1849 | struct dentry *dentry, struct task_struct *task, const void *ptr) |
1852 | { | 1850 | { |
1853 | unsigned fd = *(const unsigned *)ptr; | 1851 | unsigned fd = (unsigned long)ptr; |
1854 | struct inode *inode; | 1852 | struct inode *inode; |
1855 | struct proc_inode *ei; | 1853 | struct proc_inode *ei; |
1856 | struct dentry *error = ERR_PTR(-ENOENT); | 1854 | struct dentry *error = ERR_PTR(-ENOENT); |
@@ -1887,7 +1885,7 @@ static struct dentry *proc_lookupfd_common(struct inode *dir, | |||
1887 | if (fd == ~0U) | 1885 | if (fd == ~0U) |
1888 | goto out; | 1886 | goto out; |
1889 | 1887 | ||
1890 | result = instantiate(dir, dentry, task, &fd); | 1888 | result = instantiate(dir, dentry, task, (void *)(unsigned long)fd); |
1891 | out: | 1889 | out: |
1892 | put_task_struct(task); | 1890 | put_task_struct(task); |
1893 | out_no_task: | 1891 | out_no_task: |
@@ -1930,21 +1928,22 @@ static int proc_readfd_common(struct file * filp, void * dirent, | |||
1930 | fd++, filp->f_pos++) { | 1928 | fd++, filp->f_pos++) { |
1931 | char name[PROC_NUMBUF]; | 1929 | char name[PROC_NUMBUF]; |
1932 | int len; | 1930 | int len; |
1931 | int rv; | ||
1933 | 1932 | ||
1934 | if (!fcheck_files(files, fd)) | 1933 | if (!fcheck_files(files, fd)) |
1935 | continue; | 1934 | continue; |
1936 | rcu_read_unlock(); | 1935 | rcu_read_unlock(); |
1937 | 1936 | ||
1938 | len = snprintf(name, sizeof(name), "%d", fd); | 1937 | len = snprintf(name, sizeof(name), "%d", fd); |
1939 | if (proc_fill_cache(filp, dirent, filldir, | 1938 | rv = proc_fill_cache(filp, dirent, filldir, |
1940 | name, len, instantiate, | 1939 | name, len, instantiate, p, |
1941 | p, &fd) < 0) { | 1940 | (void *)(unsigned long)fd); |
1942 | rcu_read_lock(); | 1941 | if (rv < 0) |
1943 | break; | 1942 | goto out_fd_loop; |
1944 | } | ||
1945 | rcu_read_lock(); | 1943 | rcu_read_lock(); |
1946 | } | 1944 | } |
1947 | rcu_read_unlock(); | 1945 | rcu_read_unlock(); |
1946 | out_fd_loop: | ||
1948 | put_files_struct(files); | 1947 | put_files_struct(files); |
1949 | } | 1948 | } |
1950 | out: | 1949 | out: |
@@ -2024,11 +2023,8 @@ static int map_files_d_revalidate(struct dentry *dentry, struct nameidata *nd) | |||
2024 | if (!task) | 2023 | if (!task) |
2025 | goto out_notask; | 2024 | goto out_notask; |
2026 | 2025 | ||
2027 | if (!ptrace_may_access(task, PTRACE_MODE_READ)) | 2026 | mm = mm_access(task, PTRACE_MODE_READ); |
2028 | goto out; | 2027 | if (IS_ERR_OR_NULL(mm)) |
2029 | |||
2030 | mm = get_task_mm(task); | ||
2031 | if (!mm) | ||
2032 | goto out; | 2028 | goto out; |
2033 | 2029 | ||
2034 | if (!dname_to_vma_addr(dentry, &vm_start, &vm_end)) { | 2030 | if (!dname_to_vma_addr(dentry, &vm_start, &vm_end)) { |
@@ -2357,7 +2353,7 @@ static const struct inode_operations proc_fd_inode_operations = { | |||
2357 | static struct dentry *proc_fdinfo_instantiate(struct inode *dir, | 2353 | static struct dentry *proc_fdinfo_instantiate(struct inode *dir, |
2358 | struct dentry *dentry, struct task_struct *task, const void *ptr) | 2354 | struct dentry *dentry, struct task_struct *task, const void *ptr) |
2359 | { | 2355 | { |
2360 | unsigned fd = *(unsigned *)ptr; | 2356 | unsigned fd = (unsigned long)ptr; |
2361 | struct inode *inode; | 2357 | struct inode *inode; |
2362 | struct proc_inode *ei; | 2358 | struct proc_inode *ei; |
2363 | struct dentry *error = ERR_PTR(-ENOENT); | 2359 | struct dentry *error = ERR_PTR(-ENOENT); |
@@ -3404,6 +3400,9 @@ static const struct pid_entry tid_base_stuff[] = { | |||
3404 | ONE("stat", S_IRUGO, proc_tid_stat), | 3400 | ONE("stat", S_IRUGO, proc_tid_stat), |
3405 | ONE("statm", S_IRUGO, proc_pid_statm), | 3401 | ONE("statm", S_IRUGO, proc_pid_statm), |
3406 | REG("maps", S_IRUGO, proc_tid_maps_operations), | 3402 | REG("maps", S_IRUGO, proc_tid_maps_operations), |
3403 | #ifdef CONFIG_CHECKPOINT_RESTORE | ||
3404 | REG("children", S_IRUGO, proc_tid_children_operations), | ||
3405 | #endif | ||
3407 | #ifdef CONFIG_NUMA | 3406 | #ifdef CONFIG_NUMA |
3408 | REG("numa_maps", S_IRUGO, proc_tid_numa_maps_operations), | 3407 | REG("numa_maps", S_IRUGO, proc_tid_numa_maps_operations), |
3409 | #endif | 3408 | #endif |
diff --git a/fs/proc/internal.h b/fs/proc/internal.h index 5f79bb8b4c60..eca4aca5b6e2 100644 --- a/fs/proc/internal.h +++ b/fs/proc/internal.h | |||
@@ -31,8 +31,6 @@ struct vmalloc_info { | |||
31 | unsigned long largest_chunk; | 31 | unsigned long largest_chunk; |
32 | }; | 32 | }; |
33 | 33 | ||
34 | extern struct mm_struct *mm_for_maps(struct task_struct *); | ||
35 | |||
36 | #ifdef CONFIG_MMU | 34 | #ifdef CONFIG_MMU |
37 | #define VMALLOC_TOTAL (VMALLOC_END - VMALLOC_START) | 35 | #define VMALLOC_TOTAL (VMALLOC_END - VMALLOC_START) |
38 | extern void get_vmalloc_info(struct vmalloc_info *vmi); | 36 | extern void get_vmalloc_info(struct vmalloc_info *vmi); |
@@ -56,6 +54,7 @@ extern int proc_pid_statm(struct seq_file *m, struct pid_namespace *ns, | |||
56 | struct pid *pid, struct task_struct *task); | 54 | struct pid *pid, struct task_struct *task); |
57 | extern loff_t mem_lseek(struct file *file, loff_t offset, int orig); | 55 | extern loff_t mem_lseek(struct file *file, loff_t offset, int orig); |
58 | 56 | ||
57 | extern const struct file_operations proc_tid_children_operations; | ||
59 | extern const struct file_operations proc_pid_maps_operations; | 58 | extern const struct file_operations proc_pid_maps_operations; |
60 | extern const struct file_operations proc_tid_maps_operations; | 59 | extern const struct file_operations proc_tid_maps_operations; |
61 | extern const struct file_operations proc_pid_numa_maps_operations; | 60 | extern const struct file_operations proc_pid_numa_maps_operations; |
diff --git a/fs/proc/task_mmu.c b/fs/proc/task_mmu.c index 7faaf2acc570..4540b8f76f16 100644 --- a/fs/proc/task_mmu.c +++ b/fs/proc/task_mmu.c | |||
@@ -125,7 +125,7 @@ static void *m_start(struct seq_file *m, loff_t *pos) | |||
125 | if (!priv->task) | 125 | if (!priv->task) |
126 | return ERR_PTR(-ESRCH); | 126 | return ERR_PTR(-ESRCH); |
127 | 127 | ||
128 | mm = mm_for_maps(priv->task); | 128 | mm = mm_access(priv->task, PTRACE_MODE_READ); |
129 | if (!mm || IS_ERR(mm)) | 129 | if (!mm || IS_ERR(mm)) |
130 | return mm; | 130 | return mm; |
131 | down_read(&mm->mmap_sem); | 131 | down_read(&mm->mmap_sem); |
@@ -393,6 +393,7 @@ struct mem_size_stats { | |||
393 | unsigned long anonymous; | 393 | unsigned long anonymous; |
394 | unsigned long anonymous_thp; | 394 | unsigned long anonymous_thp; |
395 | unsigned long swap; | 395 | unsigned long swap; |
396 | unsigned long nonlinear; | ||
396 | u64 pss; | 397 | u64 pss; |
397 | }; | 398 | }; |
398 | 399 | ||
@@ -402,24 +403,33 @@ static void smaps_pte_entry(pte_t ptent, unsigned long addr, | |||
402 | { | 403 | { |
403 | struct mem_size_stats *mss = walk->private; | 404 | struct mem_size_stats *mss = walk->private; |
404 | struct vm_area_struct *vma = mss->vma; | 405 | struct vm_area_struct *vma = mss->vma; |
405 | struct page *page; | 406 | pgoff_t pgoff = linear_page_index(vma, addr); |
407 | struct page *page = NULL; | ||
406 | int mapcount; | 408 | int mapcount; |
407 | 409 | ||
408 | if (is_swap_pte(ptent)) { | 410 | if (pte_present(ptent)) { |
409 | mss->swap += ptent_size; | 411 | page = vm_normal_page(vma, addr, ptent); |
410 | return; | 412 | } else if (is_swap_pte(ptent)) { |
413 | swp_entry_t swpent = pte_to_swp_entry(ptent); | ||
414 | |||
415 | if (!non_swap_entry(swpent)) | ||
416 | mss->swap += ptent_size; | ||
417 | else if (is_migration_entry(swpent)) | ||
418 | page = migration_entry_to_page(swpent); | ||
419 | } else if (pte_file(ptent)) { | ||
420 | if (pte_to_pgoff(ptent) != pgoff) | ||
421 | mss->nonlinear += ptent_size; | ||
411 | } | 422 | } |
412 | 423 | ||
413 | if (!pte_present(ptent)) | ||
414 | return; | ||
415 | |||
416 | page = vm_normal_page(vma, addr, ptent); | ||
417 | if (!page) | 424 | if (!page) |
418 | return; | 425 | return; |
419 | 426 | ||
420 | if (PageAnon(page)) | 427 | if (PageAnon(page)) |
421 | mss->anonymous += ptent_size; | 428 | mss->anonymous += ptent_size; |
422 | 429 | ||
430 | if (page->index != pgoff) | ||
431 | mss->nonlinear += ptent_size; | ||
432 | |||
423 | mss->resident += ptent_size; | 433 | mss->resident += ptent_size; |
424 | /* Accumulate the size in pages that have been accessed. */ | 434 | /* Accumulate the size in pages that have been accessed. */ |
425 | if (pte_young(ptent) || PageReferenced(page)) | 435 | if (pte_young(ptent) || PageReferenced(page)) |
@@ -521,6 +531,10 @@ static int show_smap(struct seq_file *m, void *v, int is_pid) | |||
521 | (vma->vm_flags & VM_LOCKED) ? | 531 | (vma->vm_flags & VM_LOCKED) ? |
522 | (unsigned long)(mss.pss >> (10 + PSS_SHIFT)) : 0); | 532 | (unsigned long)(mss.pss >> (10 + PSS_SHIFT)) : 0); |
523 | 533 | ||
534 | if (vma->vm_flags & VM_NONLINEAR) | ||
535 | seq_printf(m, "Nonlinear: %8lu kB\n", | ||
536 | mss.nonlinear >> 10); | ||
537 | |||
524 | if (m->count < m->size) /* vma is copied successfully */ | 538 | if (m->count < m->size) /* vma is copied successfully */ |
525 | m->version = (vma != get_gate_vma(task->mm)) | 539 | m->version = (vma != get_gate_vma(task->mm)) |
526 | ? vma->vm_start : 0; | 540 | ? vma->vm_start : 0; |
@@ -700,6 +714,7 @@ struct pagemapread { | |||
700 | 714 | ||
701 | #define PM_PRESENT PM_STATUS(4LL) | 715 | #define PM_PRESENT PM_STATUS(4LL) |
702 | #define PM_SWAP PM_STATUS(2LL) | 716 | #define PM_SWAP PM_STATUS(2LL) |
717 | #define PM_FILE PM_STATUS(1LL) | ||
703 | #define PM_NOT_PRESENT PM_PSHIFT(PAGE_SHIFT) | 718 | #define PM_NOT_PRESENT PM_PSHIFT(PAGE_SHIFT) |
704 | #define PM_END_OF_BUFFER 1 | 719 | #define PM_END_OF_BUFFER 1 |
705 | 720 | ||
@@ -733,22 +748,33 @@ static int pagemap_pte_hole(unsigned long start, unsigned long end, | |||
733 | return err; | 748 | return err; |
734 | } | 749 | } |
735 | 750 | ||
736 | static u64 swap_pte_to_pagemap_entry(pte_t pte) | 751 | static void pte_to_pagemap_entry(pagemap_entry_t *pme, |
752 | struct vm_area_struct *vma, unsigned long addr, pte_t pte) | ||
737 | { | 753 | { |
738 | swp_entry_t e = pte_to_swp_entry(pte); | 754 | u64 frame, flags; |
739 | return swp_type(e) | (swp_offset(e) << MAX_SWAPFILES_SHIFT); | 755 | struct page *page = NULL; |
740 | } | 756 | |
741 | 757 | if (pte_present(pte)) { | |
742 | static void pte_to_pagemap_entry(pagemap_entry_t *pme, pte_t pte) | 758 | frame = pte_pfn(pte); |
743 | { | 759 | flags = PM_PRESENT; |
744 | if (is_swap_pte(pte)) | 760 | page = vm_normal_page(vma, addr, pte); |
745 | *pme = make_pme(PM_PFRAME(swap_pte_to_pagemap_entry(pte)) | 761 | } else if (is_swap_pte(pte)) { |
746 | | PM_PSHIFT(PAGE_SHIFT) | PM_SWAP); | 762 | swp_entry_t entry = pte_to_swp_entry(pte); |
747 | else if (pte_present(pte)) | 763 | |
748 | *pme = make_pme(PM_PFRAME(pte_pfn(pte)) | 764 | frame = swp_type(entry) | |
749 | | PM_PSHIFT(PAGE_SHIFT) | PM_PRESENT); | 765 | (swp_offset(entry) << MAX_SWAPFILES_SHIFT); |
750 | else | 766 | flags = PM_SWAP; |
767 | if (is_migration_entry(entry)) | ||
768 | page = migration_entry_to_page(entry); | ||
769 | } else { | ||
751 | *pme = make_pme(PM_NOT_PRESENT); | 770 | *pme = make_pme(PM_NOT_PRESENT); |
771 | return; | ||
772 | } | ||
773 | |||
774 | if (page && !PageAnon(page)) | ||
775 | flags |= PM_FILE; | ||
776 | |||
777 | *pme = make_pme(PM_PFRAME(frame) | PM_PSHIFT(PAGE_SHIFT) | flags); | ||
752 | } | 778 | } |
753 | 779 | ||
754 | #ifdef CONFIG_TRANSPARENT_HUGEPAGE | 780 | #ifdef CONFIG_TRANSPARENT_HUGEPAGE |
@@ -815,7 +841,7 @@ static int pagemap_pte_range(pmd_t *pmd, unsigned long addr, unsigned long end, | |||
815 | if (vma && (vma->vm_start <= addr) && | 841 | if (vma && (vma->vm_start <= addr) && |
816 | !is_vm_hugetlb_page(vma)) { | 842 | !is_vm_hugetlb_page(vma)) { |
817 | pte = pte_offset_map(pmd, addr); | 843 | pte = pte_offset_map(pmd, addr); |
818 | pte_to_pagemap_entry(&pme, *pte); | 844 | pte_to_pagemap_entry(&pme, vma, addr, *pte); |
819 | /* unmap before userspace copy */ | 845 | /* unmap before userspace copy */ |
820 | pte_unmap(pte); | 846 | pte_unmap(pte); |
821 | } | 847 | } |
@@ -869,11 +895,11 @@ static int pagemap_hugetlb_range(pte_t *pte, unsigned long hmask, | |||
869 | * For each page in the address space, this file contains one 64-bit entry | 895 | * For each page in the address space, this file contains one 64-bit entry |
870 | * consisting of the following: | 896 | * consisting of the following: |
871 | * | 897 | * |
872 | * Bits 0-55 page frame number (PFN) if present | 898 | * Bits 0-54 page frame number (PFN) if present |
873 | * Bits 0-4 swap type if swapped | 899 | * Bits 0-4 swap type if swapped |
874 | * Bits 5-55 swap offset if swapped | 900 | * Bits 5-54 swap offset if swapped |
875 | * Bits 55-60 page shift (page size = 1<<page shift) | 901 | * Bits 55-60 page shift (page size = 1<<page shift) |
876 | * Bit 61 reserved for future use | 902 | * Bit 61 page is file-page or shared-anon |
877 | * Bit 62 page swapped | 903 | * Bit 62 page swapped |
878 | * Bit 63 page present | 904 | * Bit 63 page present |
879 | * | 905 | * |
@@ -919,7 +945,7 @@ static ssize_t pagemap_read(struct file *file, char __user *buf, | |||
919 | if (!pm.buffer) | 945 | if (!pm.buffer) |
920 | goto out_task; | 946 | goto out_task; |
921 | 947 | ||
922 | mm = mm_for_maps(task); | 948 | mm = mm_access(task, PTRACE_MODE_READ); |
923 | ret = PTR_ERR(mm); | 949 | ret = PTR_ERR(mm); |
924 | if (!mm || IS_ERR(mm)) | 950 | if (!mm || IS_ERR(mm)) |
925 | goto out_free; | 951 | goto out_free; |
diff --git a/fs/proc/task_nommu.c b/fs/proc/task_nommu.c index 74fe164d1b23..1ccfa537f5f5 100644 --- a/fs/proc/task_nommu.c +++ b/fs/proc/task_nommu.c | |||
@@ -223,7 +223,7 @@ static void *m_start(struct seq_file *m, loff_t *pos) | |||
223 | if (!priv->task) | 223 | if (!priv->task) |
224 | return ERR_PTR(-ESRCH); | 224 | return ERR_PTR(-ESRCH); |
225 | 225 | ||
226 | mm = mm_for_maps(priv->task); | 226 | mm = mm_access(priv->task, PTRACE_MODE_READ); |
227 | if (!mm || IS_ERR(mm)) { | 227 | if (!mm || IS_ERR(mm)) { |
228 | put_task_struct(priv->task); | 228 | put_task_struct(priv->task); |
229 | priv->task = NULL; | 229 | priv->task = NULL; |
diff --git a/fs/read_write.c b/fs/read_write.c index ffc99d22e0a3..c20614f86c01 100644 --- a/fs/read_write.c +++ b/fs/read_write.c | |||
@@ -633,8 +633,7 @@ ssize_t do_loop_readv_writev(struct file *filp, struct iovec *iov, | |||
633 | ssize_t rw_copy_check_uvector(int type, const struct iovec __user * uvector, | 633 | ssize_t rw_copy_check_uvector(int type, const struct iovec __user * uvector, |
634 | unsigned long nr_segs, unsigned long fast_segs, | 634 | unsigned long nr_segs, unsigned long fast_segs, |
635 | struct iovec *fast_pointer, | 635 | struct iovec *fast_pointer, |
636 | struct iovec **ret_pointer, | 636 | struct iovec **ret_pointer) |
637 | int check_access) | ||
638 | { | 637 | { |
639 | unsigned long seg; | 638 | unsigned long seg; |
640 | ssize_t ret; | 639 | ssize_t ret; |
@@ -690,7 +689,7 @@ ssize_t rw_copy_check_uvector(int type, const struct iovec __user * uvector, | |||
690 | ret = -EINVAL; | 689 | ret = -EINVAL; |
691 | goto out; | 690 | goto out; |
692 | } | 691 | } |
693 | if (check_access | 692 | if (type >= 0 |
694 | && unlikely(!access_ok(vrfy_dir(type), buf, len))) { | 693 | && unlikely(!access_ok(vrfy_dir(type), buf, len))) { |
695 | ret = -EFAULT; | 694 | ret = -EFAULT; |
696 | goto out; | 695 | goto out; |
@@ -723,7 +722,7 @@ static ssize_t do_readv_writev(int type, struct file *file, | |||
723 | } | 722 | } |
724 | 723 | ||
725 | ret = rw_copy_check_uvector(type, uvector, nr_segs, | 724 | ret = rw_copy_check_uvector(type, uvector, nr_segs, |
726 | ARRAY_SIZE(iovstack), iovstack, &iov, 1); | 725 | ARRAY_SIZE(iovstack), iovstack, &iov); |
727 | if (ret <= 0) | 726 | if (ret <= 0) |
728 | goto out; | 727 | goto out; |
729 | 728 | ||
diff --git a/include/asm-generic/bitsperlong.h b/include/asm-generic/bitsperlong.h index 4ae54e07de83..a7b0914348fd 100644 --- a/include/asm-generic/bitsperlong.h +++ b/include/asm-generic/bitsperlong.h | |||
@@ -28,5 +28,9 @@ | |||
28 | #error Inconsistent word size. Check asm/bitsperlong.h | 28 | #error Inconsistent word size. Check asm/bitsperlong.h |
29 | #endif | 29 | #endif |
30 | 30 | ||
31 | #ifndef BITS_PER_LONG_LONG | ||
32 | #define BITS_PER_LONG_LONG 64 | ||
33 | #endif | ||
34 | |||
31 | #endif /* __KERNEL__ */ | 35 | #endif /* __KERNEL__ */ |
32 | #endif /* __ASM_GENERIC_BITS_PER_LONG */ | 36 | #endif /* __ASM_GENERIC_BITS_PER_LONG */ |
diff --git a/include/drm/drm_mem_util.h b/include/drm/drm_mem_util.h index 6bd325fedc87..19a240446fca 100644 --- a/include/drm/drm_mem_util.h +++ b/include/drm/drm_mem_util.h | |||
@@ -31,7 +31,7 @@ | |||
31 | 31 | ||
32 | static __inline__ void *drm_calloc_large(size_t nmemb, size_t size) | 32 | static __inline__ void *drm_calloc_large(size_t nmemb, size_t size) |
33 | { | 33 | { |
34 | if (size != 0 && nmemb > ULONG_MAX / size) | 34 | if (size != 0 && nmemb > SIZE_MAX / size) |
35 | return NULL; | 35 | return NULL; |
36 | 36 | ||
37 | if (size * nmemb <= PAGE_SIZE) | 37 | if (size * nmemb <= PAGE_SIZE) |
@@ -44,7 +44,7 @@ static __inline__ void *drm_calloc_large(size_t nmemb, size_t size) | |||
44 | /* Modeled after cairo's malloc_ab, it's like calloc but without the zeroing. */ | 44 | /* Modeled after cairo's malloc_ab, it's like calloc but without the zeroing. */ |
45 | static __inline__ void *drm_malloc_ab(size_t nmemb, size_t size) | 45 | static __inline__ void *drm_malloc_ab(size_t nmemb, size_t size) |
46 | { | 46 | { |
47 | if (size != 0 && nmemb > ULONG_MAX / size) | 47 | if (size != 0 && nmemb > SIZE_MAX / size) |
48 | return NULL; | 48 | return NULL; |
49 | 49 | ||
50 | if (size * nmemb <= PAGE_SIZE) | 50 | if (size * nmemb <= PAGE_SIZE) |
diff --git a/include/linux/Kbuild b/include/linux/Kbuild index 7185b8f15ced..8760be30b375 100644 --- a/include/linux/Kbuild +++ b/include/linux/Kbuild | |||
@@ -226,6 +226,7 @@ header-y += kdev_t.h | |||
226 | header-y += kernel.h | 226 | header-y += kernel.h |
227 | header-y += kernelcapi.h | 227 | header-y += kernelcapi.h |
228 | header-y += kernel-page-flags.h | 228 | header-y += kernel-page-flags.h |
229 | header-y += kexec.h | ||
229 | header-y += keyboard.h | 230 | header-y += keyboard.h |
230 | header-y += keyctl.h | 231 | header-y += keyctl.h |
231 | header-y += l2tp.h | 232 | header-y += l2tp.h |
diff --git a/include/linux/compat.h b/include/linux/compat.h index 5d46217f84ad..4e890394ef99 100644 --- a/include/linux/compat.h +++ b/include/linux/compat.h | |||
@@ -577,8 +577,7 @@ extern ssize_t compat_rw_copy_check_uvector(int type, | |||
577 | const struct compat_iovec __user *uvector, | 577 | const struct compat_iovec __user *uvector, |
578 | unsigned long nr_segs, | 578 | unsigned long nr_segs, |
579 | unsigned long fast_segs, struct iovec *fast_pointer, | 579 | unsigned long fast_segs, struct iovec *fast_pointer, |
580 | struct iovec **ret_pointer, | 580 | struct iovec **ret_pointer); |
581 | int check_access); | ||
582 | 581 | ||
583 | extern void __user *compat_alloc_user_space(unsigned long len); | 582 | extern void __user *compat_alloc_user_space(unsigned long len); |
584 | 583 | ||
diff --git a/include/linux/cpu.h b/include/linux/cpu.h index 7230bb59a06f..2e9b9ebbeb78 100644 --- a/include/linux/cpu.h +++ b/include/linux/cpu.h | |||
@@ -177,6 +177,7 @@ extern void put_online_cpus(void); | |||
177 | #define hotcpu_notifier(fn, pri) cpu_notifier(fn, pri) | 177 | #define hotcpu_notifier(fn, pri) cpu_notifier(fn, pri) |
178 | #define register_hotcpu_notifier(nb) register_cpu_notifier(nb) | 178 | #define register_hotcpu_notifier(nb) register_cpu_notifier(nb) |
179 | #define unregister_hotcpu_notifier(nb) unregister_cpu_notifier(nb) | 179 | #define unregister_hotcpu_notifier(nb) unregister_cpu_notifier(nb) |
180 | void clear_tasks_mm_cpumask(int cpu); | ||
180 | int cpu_down(unsigned int cpu); | 181 | int cpu_down(unsigned int cpu); |
181 | 182 | ||
182 | #ifdef CONFIG_ARCH_CPU_PROBE_RELEASE | 183 | #ifdef CONFIG_ARCH_CPU_PROBE_RELEASE |
diff --git a/include/linux/cred.h b/include/linux/cred.h index 917dc5aeb1d4..ebbed2ce6637 100644 --- a/include/linux/cred.h +++ b/include/linux/cred.h | |||
@@ -277,17 +277,13 @@ static inline void put_cred(const struct cred *_cred) | |||
277 | * @task: The task to query | 277 | * @task: The task to query |
278 | * | 278 | * |
279 | * Access the objective credentials of a task. The caller must hold the RCU | 279 | * Access the objective credentials of a task. The caller must hold the RCU |
280 | * readlock or the task must be dead and unable to change its own credentials. | 280 | * readlock. |
281 | * | 281 | * |
282 | * The result of this function should not be passed directly to get_cred(); | 282 | * The result of this function should not be passed directly to get_cred(); |
283 | * rather get_task_cred() should be used instead. | 283 | * rather get_task_cred() should be used instead. |
284 | */ | 284 | */ |
285 | #define __task_cred(task) \ | 285 | #define __task_cred(task) \ |
286 | ({ \ | 286 | rcu_dereference((task)->real_cred) |
287 | const struct task_struct *__t = (task); \ | ||
288 | rcu_dereference_check(__t->real_cred, \ | ||
289 | task_is_dead(__t)); \ | ||
290 | }) | ||
291 | 287 | ||
292 | /** | 288 | /** |
293 | * get_current_cred - Get the current task's subjective credentials | 289 | * get_current_cred - Get the current task's subjective credentials |
diff --git a/include/linux/dmaengine.h b/include/linux/dmaengine.h index d3fec584e8c3..56377df39124 100644 --- a/include/linux/dmaengine.h +++ b/include/linux/dmaengine.h | |||
@@ -635,6 +635,18 @@ static inline struct dma_async_tx_descriptor *dmaengine_prep_slave_sg( | |||
635 | dir, flags, NULL); | 635 | dir, flags, NULL); |
636 | } | 636 | } |
637 | 637 | ||
638 | #ifdef CONFIG_RAPIDIO_DMA_ENGINE | ||
639 | struct rio_dma_ext; | ||
640 | static inline struct dma_async_tx_descriptor *dmaengine_prep_rio_sg( | ||
641 | struct dma_chan *chan, struct scatterlist *sgl, unsigned int sg_len, | ||
642 | enum dma_transfer_direction dir, unsigned long flags, | ||
643 | struct rio_dma_ext *rio_ext) | ||
644 | { | ||
645 | return chan->device->device_prep_slave_sg(chan, sgl, sg_len, | ||
646 | dir, flags, rio_ext); | ||
647 | } | ||
648 | #endif | ||
649 | |||
638 | static inline struct dma_async_tx_descriptor *dmaengine_prep_dma_cyclic( | 650 | static inline struct dma_async_tx_descriptor *dmaengine_prep_dma_cyclic( |
639 | struct dma_chan *chan, dma_addr_t buf_addr, size_t buf_len, | 651 | struct dma_chan *chan, dma_addr_t buf_addr, size_t buf_len, |
640 | size_t period_len, enum dma_transfer_direction dir) | 652 | size_t period_len, enum dma_transfer_direction dir) |
diff --git a/include/linux/eventfd.h b/include/linux/eventfd.h index 91bb4f27238c..3c3ef19a625a 100644 --- a/include/linux/eventfd.h +++ b/include/linux/eventfd.h | |||
@@ -34,7 +34,7 @@ void eventfd_ctx_put(struct eventfd_ctx *ctx); | |||
34 | struct file *eventfd_fget(int fd); | 34 | struct file *eventfd_fget(int fd); |
35 | struct eventfd_ctx *eventfd_ctx_fdget(int fd); | 35 | struct eventfd_ctx *eventfd_ctx_fdget(int fd); |
36 | struct eventfd_ctx *eventfd_ctx_fileget(struct file *file); | 36 | struct eventfd_ctx *eventfd_ctx_fileget(struct file *file); |
37 | int eventfd_signal(struct eventfd_ctx *ctx, int n); | 37 | __u64 eventfd_signal(struct eventfd_ctx *ctx, __u64 n); |
38 | ssize_t eventfd_ctx_read(struct eventfd_ctx *ctx, int no_wait, __u64 *cnt); | 38 | ssize_t eventfd_ctx_read(struct eventfd_ctx *ctx, int no_wait, __u64 *cnt); |
39 | int eventfd_ctx_remove_wait_queue(struct eventfd_ctx *ctx, wait_queue_t *wait, | 39 | int eventfd_ctx_remove_wait_queue(struct eventfd_ctx *ctx, wait_queue_t *wait, |
40 | __u64 *cnt); | 40 | __u64 *cnt); |
diff --git a/include/linux/fs.h b/include/linux/fs.h index 598a5892ff2b..40887afaaca7 100644 --- a/include/linux/fs.h +++ b/include/linux/fs.h | |||
@@ -173,6 +173,15 @@ struct inodes_stat_t { | |||
173 | #define WRITE_FUA (WRITE | REQ_SYNC | REQ_NOIDLE | REQ_FUA) | 173 | #define WRITE_FUA (WRITE | REQ_SYNC | REQ_NOIDLE | REQ_FUA) |
174 | #define WRITE_FLUSH_FUA (WRITE | REQ_SYNC | REQ_NOIDLE | REQ_FLUSH | REQ_FUA) | 174 | #define WRITE_FLUSH_FUA (WRITE | REQ_SYNC | REQ_NOIDLE | REQ_FLUSH | REQ_FUA) |
175 | 175 | ||
176 | |||
177 | /* | ||
178 | * Flag for rw_copy_check_uvector and compat_rw_copy_check_uvector | ||
179 | * that indicates that they should check the contents of the iovec are | ||
180 | * valid, but not check the memory that the iovec elements | ||
181 | * points too. | ||
182 | */ | ||
183 | #define CHECK_IOVEC_ONLY -1 | ||
184 | |||
176 | #define SEL_IN 1 | 185 | #define SEL_IN 1 |
177 | #define SEL_OUT 2 | 186 | #define SEL_OUT 2 |
178 | #define SEL_EX 4 | 187 | #define SEL_EX 4 |
@@ -1690,8 +1699,7 @@ struct seq_file; | |||
1690 | ssize_t rw_copy_check_uvector(int type, const struct iovec __user * uvector, | 1699 | ssize_t rw_copy_check_uvector(int type, const struct iovec __user * uvector, |
1691 | unsigned long nr_segs, unsigned long fast_segs, | 1700 | unsigned long nr_segs, unsigned long fast_segs, |
1692 | struct iovec *fast_pointer, | 1701 | struct iovec *fast_pointer, |
1693 | struct iovec **ret_pointer, | 1702 | struct iovec **ret_pointer); |
1694 | int check_access); | ||
1695 | 1703 | ||
1696 | extern ssize_t vfs_read(struct file *, char __user *, size_t, loff_t *); | 1704 | extern ssize_t vfs_read(struct file *, char __user *, size_t, loff_t *); |
1697 | extern ssize_t vfs_write(struct file *, const char __user *, size_t, loff_t *); | 1705 | extern ssize_t vfs_write(struct file *, const char __user *, size_t, loff_t *); |
diff --git a/include/linux/ipc_namespace.h b/include/linux/ipc_namespace.h index 8a297a5e794c..5499c92a9153 100644 --- a/include/linux/ipc_namespace.h +++ b/include/linux/ipc_namespace.h | |||
@@ -62,6 +62,8 @@ struct ipc_namespace { | |||
62 | unsigned int mq_queues_max; /* initialized to DFLT_QUEUESMAX */ | 62 | unsigned int mq_queues_max; /* initialized to DFLT_QUEUESMAX */ |
63 | unsigned int mq_msg_max; /* initialized to DFLT_MSGMAX */ | 63 | unsigned int mq_msg_max; /* initialized to DFLT_MSGMAX */ |
64 | unsigned int mq_msgsize_max; /* initialized to DFLT_MSGSIZEMAX */ | 64 | unsigned int mq_msgsize_max; /* initialized to DFLT_MSGSIZEMAX */ |
65 | unsigned int mq_msg_default; | ||
66 | unsigned int mq_msgsize_default; | ||
65 | 67 | ||
66 | /* user_ns which owns the ipc ns */ | 68 | /* user_ns which owns the ipc ns */ |
67 | struct user_namespace *user_ns; | 69 | struct user_namespace *user_ns; |
@@ -90,11 +92,41 @@ static inline void shm_destroy_orphaned(struct ipc_namespace *ns) {} | |||
90 | 92 | ||
91 | #ifdef CONFIG_POSIX_MQUEUE | 93 | #ifdef CONFIG_POSIX_MQUEUE |
92 | extern int mq_init_ns(struct ipc_namespace *ns); | 94 | extern int mq_init_ns(struct ipc_namespace *ns); |
93 | /* default values */ | 95 | /* |
94 | #define DFLT_QUEUESMAX 256 /* max number of message queues */ | 96 | * POSIX Message Queue default values: |
95 | #define DFLT_MSGMAX 10 /* max number of messages in each queue */ | 97 | * |
96 | #define HARD_MSGMAX (32768*sizeof(void *)/4) | 98 | * MIN_*: Lowest value an admin can set the maximum unprivileged limit to |
97 | #define DFLT_MSGSIZEMAX 8192 /* max message size */ | 99 | * DFLT_*MAX: Default values for the maximum unprivileged limits |
100 | * DFLT_{MSG,MSGSIZE}: Default values used when the user doesn't supply | ||
101 | * an attribute to the open call and the queue must be created | ||
102 | * HARD_*: Highest value the maximums can be set to. These are enforced | ||
103 | * on CAP_SYS_RESOURCE apps as well making them inviolate (so make them | ||
104 | * suitably high) | ||
105 | * | ||
106 | * POSIX Requirements: | ||
107 | * Per app minimum openable message queues - 8. This does not map well | ||
108 | * to the fact that we limit the number of queues on a per namespace | ||
109 | * basis instead of a per app basis. So, make the default high enough | ||
110 | * that no given app should have a hard time opening 8 queues. | ||
111 | * Minimum maximum for HARD_MSGMAX - 32767. I bumped this to 65536. | ||
112 | * Minimum maximum for HARD_MSGSIZEMAX - POSIX is silent on this. However, | ||
113 | * we have run into a situation where running applications in the wild | ||
114 | * require this to be at least 5MB, and preferably 10MB, so I set the | ||
115 | * value to 16MB in hopes that this user is the worst of the bunch and | ||
116 | * the new maximum will handle anyone else. I may have to revisit this | ||
117 | * in the future. | ||
118 | */ | ||
119 | #define MIN_QUEUESMAX 1 | ||
120 | #define DFLT_QUEUESMAX 256 | ||
121 | #define HARD_QUEUESMAX 1024 | ||
122 | #define MIN_MSGMAX 1 | ||
123 | #define DFLT_MSG 10U | ||
124 | #define DFLT_MSGMAX 10 | ||
125 | #define HARD_MSGMAX 65536 | ||
126 | #define MIN_MSGSIZEMAX 128 | ||
127 | #define DFLT_MSGSIZE 8192U | ||
128 | #define DFLT_MSGSIZEMAX 8192 | ||
129 | #define HARD_MSGSIZEMAX (16*1024*1024) | ||
98 | #else | 130 | #else |
99 | static inline int mq_init_ns(struct ipc_namespace *ns) { return 0; } | 131 | static inline int mq_init_ns(struct ipc_namespace *ns) { return 0; } |
100 | #endif | 132 | #endif |
diff --git a/include/linux/kcmp.h b/include/linux/kcmp.h new file mode 100644 index 000000000000..2dcd1b3aafc8 --- /dev/null +++ b/include/linux/kcmp.h | |||
@@ -0,0 +1,17 @@ | |||
1 | #ifndef _LINUX_KCMP_H | ||
2 | #define _LINUX_KCMP_H | ||
3 | |||
4 | /* Comparison type */ | ||
5 | enum kcmp_type { | ||
6 | KCMP_FILE, | ||
7 | KCMP_VM, | ||
8 | KCMP_FILES, | ||
9 | KCMP_FS, | ||
10 | KCMP_SIGHAND, | ||
11 | KCMP_IO, | ||
12 | KCMP_SYSVSEM, | ||
13 | |||
14 | KCMP_TYPES, | ||
15 | }; | ||
16 | |||
17 | #endif /* _LINUX_KCMP_H */ | ||
diff --git a/include/linux/kernel.h b/include/linux/kernel.h index ec55a3c8ba77..e07f5e0c5df4 100644 --- a/include/linux/kernel.h +++ b/include/linux/kernel.h | |||
@@ -35,6 +35,7 @@ | |||
35 | #define LLONG_MAX ((long long)(~0ULL>>1)) | 35 | #define LLONG_MAX ((long long)(~0ULL>>1)) |
36 | #define LLONG_MIN (-LLONG_MAX - 1) | 36 | #define LLONG_MIN (-LLONG_MAX - 1) |
37 | #define ULLONG_MAX (~0ULL) | 37 | #define ULLONG_MAX (~0ULL) |
38 | #define SIZE_MAX (~(size_t)0) | ||
38 | 39 | ||
39 | #define STACK_MAGIC 0xdeadbeef | 40 | #define STACK_MAGIC 0xdeadbeef |
40 | 41 | ||
diff --git a/include/linux/kexec.h b/include/linux/kexec.h index 0d7d6a1b172f..37c5f7261142 100644 --- a/include/linux/kexec.h +++ b/include/linux/kexec.h | |||
@@ -1,8 +1,58 @@ | |||
1 | #ifndef LINUX_KEXEC_H | 1 | #ifndef LINUX_KEXEC_H |
2 | #define LINUX_KEXEC_H | 2 | #define LINUX_KEXEC_H |
3 | 3 | ||
4 | #ifdef CONFIG_KEXEC | 4 | /* kexec system call - It loads the new kernel to boot into. |
5 | * kexec does not sync, or unmount filesystems so if you need | ||
6 | * that to happen you need to do that yourself. | ||
7 | */ | ||
8 | |||
5 | #include <linux/types.h> | 9 | #include <linux/types.h> |
10 | |||
11 | /* kexec flags for different usage scenarios */ | ||
12 | #define KEXEC_ON_CRASH 0x00000001 | ||
13 | #define KEXEC_PRESERVE_CONTEXT 0x00000002 | ||
14 | #define KEXEC_ARCH_MASK 0xffff0000 | ||
15 | |||
16 | /* These values match the ELF architecture values. | ||
17 | * Unless there is a good reason that should continue to be the case. | ||
18 | */ | ||
19 | #define KEXEC_ARCH_DEFAULT ( 0 << 16) | ||
20 | #define KEXEC_ARCH_386 ( 3 << 16) | ||
21 | #define KEXEC_ARCH_X86_64 (62 << 16) | ||
22 | #define KEXEC_ARCH_PPC (20 << 16) | ||
23 | #define KEXEC_ARCH_PPC64 (21 << 16) | ||
24 | #define KEXEC_ARCH_IA_64 (50 << 16) | ||
25 | #define KEXEC_ARCH_ARM (40 << 16) | ||
26 | #define KEXEC_ARCH_S390 (22 << 16) | ||
27 | #define KEXEC_ARCH_SH (42 << 16) | ||
28 | #define KEXEC_ARCH_MIPS_LE (10 << 16) | ||
29 | #define KEXEC_ARCH_MIPS ( 8 << 16) | ||
30 | |||
31 | /* The artificial cap on the number of segments passed to kexec_load. */ | ||
32 | #define KEXEC_SEGMENT_MAX 16 | ||
33 | |||
34 | #ifndef __KERNEL__ | ||
35 | /* | ||
36 | * This structure is used to hold the arguments that are used when | ||
37 | * loading kernel binaries. | ||
38 | */ | ||
39 | struct kexec_segment { | ||
40 | const void *buf; | ||
41 | size_t bufsz; | ||
42 | const void *mem; | ||
43 | size_t memsz; | ||
44 | }; | ||
45 | |||
46 | /* Load a new kernel image as described by the kexec_segment array | ||
47 | * consisting of passed number of segments at the entry-point address. | ||
48 | * The flags allow different useage types. | ||
49 | */ | ||
50 | extern int kexec_load(void *, size_t, struct kexec_segment *, | ||
51 | unsigned long int); | ||
52 | #endif /* __KERNEL__ */ | ||
53 | |||
54 | #ifdef __KERNEL__ | ||
55 | #ifdef CONFIG_KEXEC | ||
6 | #include <linux/list.h> | 56 | #include <linux/list.h> |
7 | #include <linux/linkage.h> | 57 | #include <linux/linkage.h> |
8 | #include <linux/compat.h> | 58 | #include <linux/compat.h> |
@@ -67,11 +117,10 @@ typedef unsigned long kimage_entry_t; | |||
67 | #define IND_DONE 0x4 | 117 | #define IND_DONE 0x4 |
68 | #define IND_SOURCE 0x8 | 118 | #define IND_SOURCE 0x8 |
69 | 119 | ||
70 | #define KEXEC_SEGMENT_MAX 16 | ||
71 | struct kexec_segment { | 120 | struct kexec_segment { |
72 | void __user *buf; | 121 | void __user *buf; |
73 | size_t bufsz; | 122 | size_t bufsz; |
74 | unsigned long mem; /* User space sees this as a (void *) ... */ | 123 | unsigned long mem; |
75 | size_t memsz; | 124 | size_t memsz; |
76 | }; | 125 | }; |
77 | 126 | ||
@@ -175,25 +224,6 @@ extern struct kimage *kexec_crash_image; | |||
175 | #define kexec_flush_icache_page(page) | 224 | #define kexec_flush_icache_page(page) |
176 | #endif | 225 | #endif |
177 | 226 | ||
178 | #define KEXEC_ON_CRASH 0x00000001 | ||
179 | #define KEXEC_PRESERVE_CONTEXT 0x00000002 | ||
180 | #define KEXEC_ARCH_MASK 0xffff0000 | ||
181 | |||
182 | /* These values match the ELF architecture values. | ||
183 | * Unless there is a good reason that should continue to be the case. | ||
184 | */ | ||
185 | #define KEXEC_ARCH_DEFAULT ( 0 << 16) | ||
186 | #define KEXEC_ARCH_386 ( 3 << 16) | ||
187 | #define KEXEC_ARCH_X86_64 (62 << 16) | ||
188 | #define KEXEC_ARCH_PPC (20 << 16) | ||
189 | #define KEXEC_ARCH_PPC64 (21 << 16) | ||
190 | #define KEXEC_ARCH_IA_64 (50 << 16) | ||
191 | #define KEXEC_ARCH_ARM (40 << 16) | ||
192 | #define KEXEC_ARCH_S390 (22 << 16) | ||
193 | #define KEXEC_ARCH_SH (42 << 16) | ||
194 | #define KEXEC_ARCH_MIPS_LE (10 << 16) | ||
195 | #define KEXEC_ARCH_MIPS ( 8 << 16) | ||
196 | |||
197 | /* List of defined/legal kexec flags */ | 227 | /* List of defined/legal kexec flags */ |
198 | #ifndef CONFIG_KEXEC_JUMP | 228 | #ifndef CONFIG_KEXEC_JUMP |
199 | #define KEXEC_FLAGS KEXEC_ON_CRASH | 229 | #define KEXEC_FLAGS KEXEC_ON_CRASH |
@@ -228,4 +258,5 @@ struct task_struct; | |||
228 | static inline void crash_kexec(struct pt_regs *regs) { } | 258 | static inline void crash_kexec(struct pt_regs *regs) { } |
229 | static inline int kexec_should_crash(struct task_struct *p) { return 0; } | 259 | static inline int kexec_should_crash(struct task_struct *p) { return 0; } |
230 | #endif /* CONFIG_KEXEC */ | 260 | #endif /* CONFIG_KEXEC */ |
261 | #endif /* __KERNEL__ */ | ||
231 | #endif /* LINUX_KEXEC_H */ | 262 | #endif /* LINUX_KEXEC_H */ |
diff --git a/include/linux/kmod.h b/include/linux/kmod.h index dd99c329e161..5398d5807075 100644 --- a/include/linux/kmod.h +++ b/include/linux/kmod.h | |||
@@ -66,40 +66,10 @@ struct subprocess_info { | |||
66 | void *data; | 66 | void *data; |
67 | }; | 67 | }; |
68 | 68 | ||
69 | /* Allocate a subprocess_info structure */ | 69 | extern int |
70 | struct subprocess_info *call_usermodehelper_setup(char *path, char **argv, | ||
71 | char **envp, gfp_t gfp_mask); | ||
72 | |||
73 | /* Set various pieces of state into the subprocess_info structure */ | ||
74 | void call_usermodehelper_setfns(struct subprocess_info *info, | ||
75 | int (*init)(struct subprocess_info *info, struct cred *new), | ||
76 | void (*cleanup)(struct subprocess_info *info), | ||
77 | void *data); | ||
78 | |||
79 | /* Actually execute the sub-process */ | ||
80 | int call_usermodehelper_exec(struct subprocess_info *info, int wait); | ||
81 | |||
82 | /* Free the subprocess_info. This is only needed if you're not going | ||
83 | to call call_usermodehelper_exec */ | ||
84 | void call_usermodehelper_freeinfo(struct subprocess_info *info); | ||
85 | |||
86 | static inline int | ||
87 | call_usermodehelper_fns(char *path, char **argv, char **envp, int wait, | 70 | call_usermodehelper_fns(char *path, char **argv, char **envp, int wait, |
88 | int (*init)(struct subprocess_info *info, struct cred *new), | 71 | int (*init)(struct subprocess_info *info, struct cred *new), |
89 | void (*cleanup)(struct subprocess_info *), void *data) | 72 | void (*cleanup)(struct subprocess_info *), void *data); |
90 | { | ||
91 | struct subprocess_info *info; | ||
92 | gfp_t gfp_mask = (wait == UMH_NO_WAIT) ? GFP_ATOMIC : GFP_KERNEL; | ||
93 | |||
94 | info = call_usermodehelper_setup(path, argv, envp, gfp_mask); | ||
95 | |||
96 | if (info == NULL) | ||
97 | return -ENOMEM; | ||
98 | |||
99 | call_usermodehelper_setfns(info, init, cleanup, data); | ||
100 | |||
101 | return call_usermodehelper_exec(info, wait); | ||
102 | } | ||
103 | 73 | ||
104 | static inline int | 74 | static inline int |
105 | call_usermodehelper(char *path, char **argv, char **envp, int wait) | 75 | call_usermodehelper(char *path, char **argv, char **envp, int wait) |
diff --git a/include/linux/msdos_fs.h b/include/linux/msdos_fs.h index 34066e65fdeb..11cc2ac67e75 100644 --- a/include/linux/msdos_fs.h +++ b/include/linux/msdos_fs.h | |||
@@ -21,8 +21,9 @@ | |||
21 | #define CT_LE_W(v) cpu_to_le16(v) | 21 | #define CT_LE_W(v) cpu_to_le16(v) |
22 | #define CT_LE_L(v) cpu_to_le32(v) | 22 | #define CT_LE_L(v) cpu_to_le32(v) |
23 | 23 | ||
24 | #define MSDOS_ROOT_INO 1 /* The root inode number */ | ||
25 | #define MSDOS_FSINFO_INO 2 /* Used for managing the FSINFO block */ | ||
24 | 26 | ||
25 | #define MSDOS_ROOT_INO 1 /* == MINIX_ROOT_INO */ | ||
26 | #define MSDOS_DIR_BITS 5 /* log2(sizeof(struct msdos_dir_entry)) */ | 27 | #define MSDOS_DIR_BITS 5 /* log2(sizeof(struct msdos_dir_entry)) */ |
27 | 28 | ||
28 | /* directory limit */ | 29 | /* directory limit */ |
diff --git a/include/linux/prctl.h b/include/linux/prctl.h index 78b76e24cc7e..711e0a30aacc 100644 --- a/include/linux/prctl.h +++ b/include/linux/prctl.h | |||
@@ -113,6 +113,12 @@ | |||
113 | # define PR_SET_MM_START_STACK 5 | 113 | # define PR_SET_MM_START_STACK 5 |
114 | # define PR_SET_MM_START_BRK 6 | 114 | # define PR_SET_MM_START_BRK 6 |
115 | # define PR_SET_MM_BRK 7 | 115 | # define PR_SET_MM_BRK 7 |
116 | # define PR_SET_MM_ARG_START 8 | ||
117 | # define PR_SET_MM_ARG_END 9 | ||
118 | # define PR_SET_MM_ENV_START 10 | ||
119 | # define PR_SET_MM_ENV_END 11 | ||
120 | # define PR_SET_MM_AUXV 12 | ||
121 | # define PR_SET_MM_EXE_FILE 13 | ||
116 | 122 | ||
117 | /* | 123 | /* |
118 | * Set specific pid that is allowed to ptrace the current task. | 124 | * Set specific pid that is allowed to ptrace the current task. |
diff --git a/include/linux/rio.h b/include/linux/rio.h index 4d50611112ba..a90ebadd9da0 100644 --- a/include/linux/rio.h +++ b/include/linux/rio.h | |||
@@ -20,6 +20,9 @@ | |||
20 | #include <linux/errno.h> | 20 | #include <linux/errno.h> |
21 | #include <linux/device.h> | 21 | #include <linux/device.h> |
22 | #include <linux/rio_regs.h> | 22 | #include <linux/rio_regs.h> |
23 | #ifdef CONFIG_RAPIDIO_DMA_ENGINE | ||
24 | #include <linux/dmaengine.h> | ||
25 | #endif | ||
23 | 26 | ||
24 | #define RIO_NO_HOPCOUNT -1 | 27 | #define RIO_NO_HOPCOUNT -1 |
25 | #define RIO_INVALID_DESTID 0xffff | 28 | #define RIO_INVALID_DESTID 0xffff |
@@ -254,6 +257,9 @@ struct rio_mport { | |||
254 | u32 phys_efptr; | 257 | u32 phys_efptr; |
255 | unsigned char name[40]; | 258 | unsigned char name[40]; |
256 | void *priv; /* Master port private data */ | 259 | void *priv; /* Master port private data */ |
260 | #ifdef CONFIG_RAPIDIO_DMA_ENGINE | ||
261 | struct dma_device dma; | ||
262 | #endif | ||
257 | }; | 263 | }; |
258 | 264 | ||
259 | /** | 265 | /** |
@@ -395,6 +401,47 @@ union rio_pw_msg { | |||
395 | u32 raw[RIO_PW_MSG_SIZE/sizeof(u32)]; | 401 | u32 raw[RIO_PW_MSG_SIZE/sizeof(u32)]; |
396 | }; | 402 | }; |
397 | 403 | ||
404 | #ifdef CONFIG_RAPIDIO_DMA_ENGINE | ||
405 | |||
406 | /** | ||
407 | * enum rio_write_type - RIO write transaction types used in DMA transfers | ||
408 | * | ||
409 | * Note: RapidIO specification defines write (NWRITE) and | ||
410 | * write-with-response (NWRITE_R) data transfer operations. | ||
411 | * Existing DMA controllers that service RapidIO may use one of these operations | ||
412 | * for entire data transfer or their combination with only the last data packet | ||
413 | * requires response. | ||
414 | */ | ||
415 | enum rio_write_type { | ||
416 | RDW_DEFAULT, /* default method used by DMA driver */ | ||
417 | RDW_ALL_NWRITE, /* all packets use NWRITE */ | ||
418 | RDW_ALL_NWRITE_R, /* all packets use NWRITE_R */ | ||
419 | RDW_LAST_NWRITE_R, /* last packet uses NWRITE_R, others - NWRITE */ | ||
420 | }; | ||
421 | |||
422 | struct rio_dma_ext { | ||
423 | u16 destid; | ||
424 | u64 rio_addr; /* low 64-bits of 66-bit RapidIO address */ | ||
425 | u8 rio_addr_u; /* upper 2-bits of 66-bit RapidIO address */ | ||
426 | enum rio_write_type wr_type; /* preferred RIO write operation type */ | ||
427 | }; | ||
428 | |||
429 | struct rio_dma_data { | ||
430 | /* Local data (as scatterlist) */ | ||
431 | struct scatterlist *sg; /* I/O scatter list */ | ||
432 | unsigned int sg_len; /* size of scatter list */ | ||
433 | /* Remote device address (flat buffer) */ | ||
434 | u64 rio_addr; /* low 64-bits of 66-bit RapidIO address */ | ||
435 | u8 rio_addr_u; /* upper 2-bits of 66-bit RapidIO address */ | ||
436 | enum rio_write_type wr_type; /* preferred RIO write operation type */ | ||
437 | }; | ||
438 | |||
439 | static inline struct rio_mport *dma_to_mport(struct dma_device *ddev) | ||
440 | { | ||
441 | return container_of(ddev, struct rio_mport, dma); | ||
442 | } | ||
443 | #endif /* CONFIG_RAPIDIO_DMA_ENGINE */ | ||
444 | |||
398 | /* Architecture and hardware-specific functions */ | 445 | /* Architecture and hardware-specific functions */ |
399 | extern int rio_register_mport(struct rio_mport *); | 446 | extern int rio_register_mport(struct rio_mport *); |
400 | extern int rio_open_inb_mbox(struct rio_mport *, void *, int, int); | 447 | extern int rio_open_inb_mbox(struct rio_mport *, void *, int, int); |
diff --git a/include/linux/rio_drv.h b/include/linux/rio_drv.h index 7f07470e1ed9..31ad146be316 100644 --- a/include/linux/rio_drv.h +++ b/include/linux/rio_drv.h | |||
@@ -377,6 +377,15 @@ void rio_unregister_driver(struct rio_driver *); | |||
377 | struct rio_dev *rio_dev_get(struct rio_dev *); | 377 | struct rio_dev *rio_dev_get(struct rio_dev *); |
378 | void rio_dev_put(struct rio_dev *); | 378 | void rio_dev_put(struct rio_dev *); |
379 | 379 | ||
380 | #ifdef CONFIG_RAPIDIO_DMA_ENGINE | ||
381 | extern struct dma_chan *rio_request_dma(struct rio_dev *rdev); | ||
382 | extern void rio_release_dma(struct dma_chan *dchan); | ||
383 | extern struct dma_async_tx_descriptor *rio_dma_prep_slave_sg( | ||
384 | struct rio_dev *rdev, struct dma_chan *dchan, | ||
385 | struct rio_dma_data *data, | ||
386 | enum dma_transfer_direction direction, unsigned long flags); | ||
387 | #endif | ||
388 | |||
380 | /** | 389 | /** |
381 | * rio_name - Get the unique RIO device identifier | 390 | * rio_name - Get the unique RIO device identifier |
382 | * @rdev: RIO device | 391 | * @rdev: RIO device |
diff --git a/include/linux/slab.h b/include/linux/slab.h index a595dce6b0c7..67d5d94b783a 100644 --- a/include/linux/slab.h +++ b/include/linux/slab.h | |||
@@ -242,7 +242,7 @@ size_t ksize(const void *); | |||
242 | */ | 242 | */ |
243 | static inline void *kmalloc_array(size_t n, size_t size, gfp_t flags) | 243 | static inline void *kmalloc_array(size_t n, size_t size, gfp_t flags) |
244 | { | 244 | { |
245 | if (size != 0 && n > ULONG_MAX / size) | 245 | if (size != 0 && n > SIZE_MAX / size) |
246 | return NULL; | 246 | return NULL; |
247 | return __kmalloc(n * size, flags); | 247 | return __kmalloc(n * size, flags); |
248 | } | 248 | } |
diff --git a/include/linux/syscalls.h b/include/linux/syscalls.h index 3de3acb84a95..19439c75c5b2 100644 --- a/include/linux/syscalls.h +++ b/include/linux/syscalls.h | |||
@@ -858,4 +858,6 @@ asmlinkage long sys_process_vm_writev(pid_t pid, | |||
858 | unsigned long riovcnt, | 858 | unsigned long riovcnt, |
859 | unsigned long flags); | 859 | unsigned long flags); |
860 | 860 | ||
861 | asmlinkage long sys_kcmp(pid_t pid1, pid_t pid2, int type, | ||
862 | unsigned long idx1, unsigned long idx2); | ||
861 | #endif | 863 | #endif |
diff --git a/init/Kconfig b/init/Kconfig index 1e004d057468..d07dcf9fc8a9 100644 --- a/init/Kconfig +++ b/init/Kconfig | |||
@@ -167,7 +167,7 @@ config KERNEL_BZIP2 | |||
167 | depends on HAVE_KERNEL_BZIP2 | 167 | depends on HAVE_KERNEL_BZIP2 |
168 | help | 168 | help |
169 | Its compression ratio and speed is intermediate. | 169 | Its compression ratio and speed is intermediate. |
170 | Decompression speed is slowest among the three. The kernel | 170 | Decompression speed is slowest among the choices. The kernel |
171 | size is about 10% smaller with bzip2, in comparison to gzip. | 171 | size is about 10% smaller with bzip2, in comparison to gzip. |
172 | Bzip2 uses a large amount of memory. For modern kernels you | 172 | Bzip2 uses a large amount of memory. For modern kernels you |
173 | will need at least 8MB RAM or more for booting. | 173 | will need at least 8MB RAM or more for booting. |
@@ -176,10 +176,9 @@ config KERNEL_LZMA | |||
176 | bool "LZMA" | 176 | bool "LZMA" |
177 | depends on HAVE_KERNEL_LZMA | 177 | depends on HAVE_KERNEL_LZMA |
178 | help | 178 | help |
179 | The most recent compression algorithm. | 179 | This compression algorithm's ratio is best. Decompression speed |
180 | Its ratio is best, decompression speed is between the other | 180 | is between gzip and bzip2. Compression is slowest. |
181 | two. Compression is slowest. The kernel size is about 33% | 181 | The kernel size is about 33% smaller with LZMA in comparison to gzip. |
182 | smaller with LZMA in comparison to gzip. | ||
183 | 182 | ||
184 | config KERNEL_XZ | 183 | config KERNEL_XZ |
185 | bool "XZ" | 184 | bool "XZ" |
@@ -200,7 +199,7 @@ config KERNEL_LZO | |||
200 | bool "LZO" | 199 | bool "LZO" |
201 | depends on HAVE_KERNEL_LZO | 200 | depends on HAVE_KERNEL_LZO |
202 | help | 201 | help |
203 | Its compression ratio is the poorest among the 4. The kernel | 202 | Its compression ratio is the poorest among the choices. The kernel |
204 | size is about 10% bigger than gzip; however its speed | 203 | size is about 10% bigger than gzip; however its speed |
205 | (both compression and decompression) is the fastest. | 204 | (both compression and decompression) is the fastest. |
206 | 205 | ||
diff --git a/init/do_mounts.c b/init/do_mounts.c index 42b0707c3481..d3f0aeed2d39 100644 --- a/init/do_mounts.c +++ b/init/do_mounts.c | |||
@@ -1,3 +1,13 @@ | |||
1 | /* | ||
2 | * Many of the syscalls used in this file expect some of the arguments | ||
3 | * to be __user pointers not __kernel pointers. To limit the sparse | ||
4 | * noise, turn off sparse checking for this file. | ||
5 | */ | ||
6 | #ifdef __CHECKER__ | ||
7 | #undef __CHECKER__ | ||
8 | #warning "Sparse checking disabled for this file" | ||
9 | #endif | ||
10 | |||
1 | #include <linux/module.h> | 11 | #include <linux/module.h> |
2 | #include <linux/sched.h> | 12 | #include <linux/sched.h> |
3 | #include <linux/ctype.h> | 13 | #include <linux/ctype.h> |
@@ -330,7 +340,7 @@ static int __init do_mount_root(char *name, char *fs, int flags, void *data) | |||
330 | if (err) | 340 | if (err) |
331 | return err; | 341 | return err; |
332 | 342 | ||
333 | sys_chdir((const char __user __force *)"/root"); | 343 | sys_chdir("/root"); |
334 | s = current->fs->pwd.dentry->d_sb; | 344 | s = current->fs->pwd.dentry->d_sb; |
335 | ROOT_DEV = s->s_dev; | 345 | ROOT_DEV = s->s_dev; |
336 | printk(KERN_INFO | 346 | printk(KERN_INFO |
@@ -556,5 +566,5 @@ void __init prepare_namespace(void) | |||
556 | out: | 566 | out: |
557 | devtmpfs_mount("dev"); | 567 | devtmpfs_mount("dev"); |
558 | sys_mount(".", "/", NULL, MS_MOVE, NULL); | 568 | sys_mount(".", "/", NULL, MS_MOVE, NULL); |
559 | sys_chroot((const char __user __force *)"."); | 569 | sys_chroot("."); |
560 | } | 570 | } |
diff --git a/init/do_mounts_initrd.c b/init/do_mounts_initrd.c index 9047330c73e9..135959a276be 100644 --- a/init/do_mounts_initrd.c +++ b/init/do_mounts_initrd.c | |||
@@ -1,3 +1,13 @@ | |||
1 | /* | ||
2 | * Many of the syscalls used in this file expect some of the arguments | ||
3 | * to be __user pointers not __kernel pointers. To limit the sparse | ||
4 | * noise, turn off sparse checking for this file. | ||
5 | */ | ||
6 | #ifdef __CHECKER__ | ||
7 | #undef __CHECKER__ | ||
8 | #warning "Sparse checking disabled for this file" | ||
9 | #endif | ||
10 | |||
1 | #include <linux/unistd.h> | 11 | #include <linux/unistd.h> |
2 | #include <linux/kernel.h> | 12 | #include <linux/kernel.h> |
3 | #include <linux/fs.h> | 13 | #include <linux/fs.h> |
diff --git a/init/do_mounts_md.c b/init/do_mounts_md.c index 32c4799b8c91..8cb6db54285b 100644 --- a/init/do_mounts_md.c +++ b/init/do_mounts_md.c | |||
@@ -1,3 +1,13 @@ | |||
1 | /* | ||
2 | * Many of the syscalls used in this file expect some of the arguments | ||
3 | * to be __user pointers not __kernel pointers. To limit the sparse | ||
4 | * noise, turn off sparse checking for this file. | ||
5 | */ | ||
6 | #ifdef __CHECKER__ | ||
7 | #undef __CHECKER__ | ||
8 | #warning "Sparse checking disabled for this file" | ||
9 | #endif | ||
10 | |||
1 | #include <linux/delay.h> | 11 | #include <linux/delay.h> |
2 | #include <linux/raid/md_u.h> | 12 | #include <linux/raid/md_u.h> |
3 | #include <linux/raid/md_p.h> | 13 | #include <linux/raid/md_p.h> |
@@ -283,7 +293,7 @@ static void __init autodetect_raid(void) | |||
283 | 293 | ||
284 | wait_for_device_probe(); | 294 | wait_for_device_probe(); |
285 | 295 | ||
286 | fd = sys_open((const char __user __force *) "/dev/md0", 0, 0); | 296 | fd = sys_open("/dev/md0", 0, 0); |
287 | if (fd >= 0) { | 297 | if (fd >= 0) { |
288 | sys_ioctl(fd, RAID_AUTORUN, raid_autopart); | 298 | sys_ioctl(fd, RAID_AUTORUN, raid_autopart); |
289 | sys_close(fd); | 299 | sys_close(fd); |
diff --git a/init/do_mounts_rd.c b/init/do_mounts_rd.c index 6212586df29a..6be2879cca66 100644 --- a/init/do_mounts_rd.c +++ b/init/do_mounts_rd.c | |||
@@ -1,3 +1,12 @@ | |||
1 | /* | ||
2 | * Many of the syscalls used in this file expect some of the arguments | ||
3 | * to be __user pointers not __kernel pointers. To limit the sparse | ||
4 | * noise, turn off sparse checking for this file. | ||
5 | */ | ||
6 | #ifdef __CHECKER__ | ||
7 | #undef __CHECKER__ | ||
8 | #warning "Sparse checking disabled for this file" | ||
9 | #endif | ||
1 | 10 | ||
2 | #include <linux/kernel.h> | 11 | #include <linux/kernel.h> |
3 | #include <linux/fs.h> | 12 | #include <linux/fs.h> |
@@ -181,7 +190,7 @@ int __init rd_load_image(char *from) | |||
181 | char rotator[4] = { '|' , '/' , '-' , '\\' }; | 190 | char rotator[4] = { '|' , '/' , '-' , '\\' }; |
182 | #endif | 191 | #endif |
183 | 192 | ||
184 | out_fd = sys_open((const char __user __force *) "/dev/ram", O_RDWR, 0); | 193 | out_fd = sys_open("/dev/ram", O_RDWR, 0); |
185 | if (out_fd < 0) | 194 | if (out_fd < 0) |
186 | goto out; | 195 | goto out; |
187 | 196 | ||
@@ -280,7 +289,7 @@ noclose_input: | |||
280 | sys_close(out_fd); | 289 | sys_close(out_fd); |
281 | out: | 290 | out: |
282 | kfree(buf); | 291 | kfree(buf); |
283 | sys_unlink((const char __user __force *) "/dev/ram"); | 292 | sys_unlink("/dev/ram"); |
284 | return res; | 293 | return res; |
285 | } | 294 | } |
286 | 295 | ||
diff --git a/init/initramfs.c b/init/initramfs.c index 8216c303b082..84c6bf111300 100644 --- a/init/initramfs.c +++ b/init/initramfs.c | |||
@@ -1,3 +1,13 @@ | |||
1 | /* | ||
2 | * Many of the syscalls used in this file expect some of the arguments | ||
3 | * to be __user pointers not __kernel pointers. To limit the sparse | ||
4 | * noise, turn off sparse checking for this file. | ||
5 | */ | ||
6 | #ifdef __CHECKER__ | ||
7 | #undef __CHECKER__ | ||
8 | #warning "Sparse checking disabled for this file" | ||
9 | #endif | ||
10 | |||
1 | #include <linux/init.h> | 11 | #include <linux/init.h> |
2 | #include <linux/fs.h> | 12 | #include <linux/fs.h> |
3 | #include <linux/slab.h> | 13 | #include <linux/slab.h> |
@@ -74,7 +84,7 @@ static void __init free_hash(void) | |||
74 | } | 84 | } |
75 | } | 85 | } |
76 | 86 | ||
77 | static long __init do_utime(char __user *filename, time_t mtime) | 87 | static long __init do_utime(char *filename, time_t mtime) |
78 | { | 88 | { |
79 | struct timespec t[2]; | 89 | struct timespec t[2]; |
80 | 90 | ||
@@ -529,7 +539,7 @@ static void __init clean_rootfs(void) | |||
529 | struct linux_dirent64 *dirp; | 539 | struct linux_dirent64 *dirp; |
530 | int num; | 540 | int num; |
531 | 541 | ||
532 | fd = sys_open((const char __user __force *) "/", O_RDONLY, 0); | 542 | fd = sys_open("/", O_RDONLY, 0); |
533 | WARN_ON(fd < 0); | 543 | WARN_ON(fd < 0); |
534 | if (fd < 0) | 544 | if (fd < 0) |
535 | return; | 545 | return; |
@@ -589,7 +599,7 @@ static int __init populate_rootfs(void) | |||
589 | } | 599 | } |
590 | printk(KERN_INFO "rootfs image is not initramfs (%s)" | 600 | printk(KERN_INFO "rootfs image is not initramfs (%s)" |
591 | "; looks like an initrd\n", err); | 601 | "; looks like an initrd\n", err); |
592 | fd = sys_open((const char __user __force *) "/initrd.image", | 602 | fd = sys_open("/initrd.image", |
593 | O_WRONLY|O_CREAT, 0700); | 603 | O_WRONLY|O_CREAT, 0700); |
594 | if (fd >= 0) { | 604 | if (fd >= 0) { |
595 | sys_write(fd, (char *)initrd_start, | 605 | sys_write(fd, (char *)initrd_start, |
diff --git a/ipc/mq_sysctl.c b/ipc/mq_sysctl.c index 0c09366b96f3..383d638340b8 100644 --- a/ipc/mq_sysctl.c +++ b/ipc/mq_sysctl.c | |||
@@ -13,15 +13,6 @@ | |||
13 | #include <linux/ipc_namespace.h> | 13 | #include <linux/ipc_namespace.h> |
14 | #include <linux/sysctl.h> | 14 | #include <linux/sysctl.h> |
15 | 15 | ||
16 | /* | ||
17 | * Define the ranges various user-specified maximum values can | ||
18 | * be set to. | ||
19 | */ | ||
20 | #define MIN_MSGMAX 1 /* min value for msg_max */ | ||
21 | #define MAX_MSGMAX HARD_MSGMAX /* max value for msg_max */ | ||
22 | #define MIN_MSGSIZEMAX 128 /* min value for msgsize_max */ | ||
23 | #define MAX_MSGSIZEMAX (8192*128) /* max value for msgsize_max */ | ||
24 | |||
25 | #ifdef CONFIG_PROC_SYSCTL | 16 | #ifdef CONFIG_PROC_SYSCTL |
26 | static void *get_mq(ctl_table *table) | 17 | static void *get_mq(ctl_table *table) |
27 | { | 18 | { |
@@ -31,16 +22,6 @@ static void *get_mq(ctl_table *table) | |||
31 | return which; | 22 | return which; |
32 | } | 23 | } |
33 | 24 | ||
34 | static int proc_mq_dointvec(ctl_table *table, int write, | ||
35 | void __user *buffer, size_t *lenp, loff_t *ppos) | ||
36 | { | ||
37 | struct ctl_table mq_table; | ||
38 | memcpy(&mq_table, table, sizeof(mq_table)); | ||
39 | mq_table.data = get_mq(table); | ||
40 | |||
41 | return proc_dointvec(&mq_table, write, buffer, lenp, ppos); | ||
42 | } | ||
43 | |||
44 | static int proc_mq_dointvec_minmax(ctl_table *table, int write, | 25 | static int proc_mq_dointvec_minmax(ctl_table *table, int write, |
45 | void __user *buffer, size_t *lenp, loff_t *ppos) | 26 | void __user *buffer, size_t *lenp, loff_t *ppos) |
46 | { | 27 | { |
@@ -52,15 +33,17 @@ static int proc_mq_dointvec_minmax(ctl_table *table, int write, | |||
52 | lenp, ppos); | 33 | lenp, ppos); |
53 | } | 34 | } |
54 | #else | 35 | #else |
55 | #define proc_mq_dointvec NULL | ||
56 | #define proc_mq_dointvec_minmax NULL | 36 | #define proc_mq_dointvec_minmax NULL |
57 | #endif | 37 | #endif |
58 | 38 | ||
39 | static int msg_queues_limit_min = MIN_QUEUESMAX; | ||
40 | static int msg_queues_limit_max = HARD_QUEUESMAX; | ||
41 | |||
59 | static int msg_max_limit_min = MIN_MSGMAX; | 42 | static int msg_max_limit_min = MIN_MSGMAX; |
60 | static int msg_max_limit_max = MAX_MSGMAX; | 43 | static int msg_max_limit_max = HARD_MSGMAX; |
61 | 44 | ||
62 | static int msg_maxsize_limit_min = MIN_MSGSIZEMAX; | 45 | static int msg_maxsize_limit_min = MIN_MSGSIZEMAX; |
63 | static int msg_maxsize_limit_max = MAX_MSGSIZEMAX; | 46 | static int msg_maxsize_limit_max = HARD_MSGSIZEMAX; |
64 | 47 | ||
65 | static ctl_table mq_sysctls[] = { | 48 | static ctl_table mq_sysctls[] = { |
66 | { | 49 | { |
@@ -68,7 +51,9 @@ static ctl_table mq_sysctls[] = { | |||
68 | .data = &init_ipc_ns.mq_queues_max, | 51 | .data = &init_ipc_ns.mq_queues_max, |
69 | .maxlen = sizeof(int), | 52 | .maxlen = sizeof(int), |
70 | .mode = 0644, | 53 | .mode = 0644, |
71 | .proc_handler = proc_mq_dointvec, | 54 | .proc_handler = proc_mq_dointvec_minmax, |
55 | .extra1 = &msg_queues_limit_min, | ||
56 | .extra2 = &msg_queues_limit_max, | ||
72 | }, | 57 | }, |
73 | { | 58 | { |
74 | .procname = "msg_max", | 59 | .procname = "msg_max", |
@@ -88,6 +73,24 @@ static ctl_table mq_sysctls[] = { | |||
88 | .extra1 = &msg_maxsize_limit_min, | 73 | .extra1 = &msg_maxsize_limit_min, |
89 | .extra2 = &msg_maxsize_limit_max, | 74 | .extra2 = &msg_maxsize_limit_max, |
90 | }, | 75 | }, |
76 | { | ||
77 | .procname = "msg_default", | ||
78 | .data = &init_ipc_ns.mq_msg_default, | ||
79 | .maxlen = sizeof(int), | ||
80 | .mode = 0644, | ||
81 | .proc_handler = proc_mq_dointvec_minmax, | ||
82 | .extra1 = &msg_max_limit_min, | ||
83 | .extra2 = &msg_max_limit_max, | ||
84 | }, | ||
85 | { | ||
86 | .procname = "msgsize_default", | ||
87 | .data = &init_ipc_ns.mq_msgsize_default, | ||
88 | .maxlen = sizeof(int), | ||
89 | .mode = 0644, | ||
90 | .proc_handler = proc_mq_dointvec_minmax, | ||
91 | .extra1 = &msg_maxsize_limit_min, | ||
92 | .extra2 = &msg_maxsize_limit_max, | ||
93 | }, | ||
91 | {} | 94 | {} |
92 | }; | 95 | }; |
93 | 96 | ||
diff --git a/ipc/mqueue.c b/ipc/mqueue.c index a2757d4ab773..8ce57691e7b6 100644 --- a/ipc/mqueue.c +++ b/ipc/mqueue.c | |||
@@ -24,6 +24,7 @@ | |||
24 | #include <linux/mqueue.h> | 24 | #include <linux/mqueue.h> |
25 | #include <linux/msg.h> | 25 | #include <linux/msg.h> |
26 | #include <linux/skbuff.h> | 26 | #include <linux/skbuff.h> |
27 | #include <linux/vmalloc.h> | ||
27 | #include <linux/netlink.h> | 28 | #include <linux/netlink.h> |
28 | #include <linux/syscalls.h> | 29 | #include <linux/syscalls.h> |
29 | #include <linux/audit.h> | 30 | #include <linux/audit.h> |
@@ -49,6 +50,12 @@ | |||
49 | #define STATE_PENDING 1 | 50 | #define STATE_PENDING 1 |
50 | #define STATE_READY 2 | 51 | #define STATE_READY 2 |
51 | 52 | ||
53 | struct posix_msg_tree_node { | ||
54 | struct rb_node rb_node; | ||
55 | struct list_head msg_list; | ||
56 | int priority; | ||
57 | }; | ||
58 | |||
52 | struct ext_wait_queue { /* queue of sleeping tasks */ | 59 | struct ext_wait_queue { /* queue of sleeping tasks */ |
53 | struct task_struct *task; | 60 | struct task_struct *task; |
54 | struct list_head list; | 61 | struct list_head list; |
@@ -61,7 +68,8 @@ struct mqueue_inode_info { | |||
61 | struct inode vfs_inode; | 68 | struct inode vfs_inode; |
62 | wait_queue_head_t wait_q; | 69 | wait_queue_head_t wait_q; |
63 | 70 | ||
64 | struct msg_msg **messages; | 71 | struct rb_root msg_tree; |
72 | struct posix_msg_tree_node *node_cache; | ||
65 | struct mq_attr attr; | 73 | struct mq_attr attr; |
66 | 74 | ||
67 | struct sigevent notify; | 75 | struct sigevent notify; |
@@ -109,6 +117,103 @@ static struct ipc_namespace *get_ns_from_inode(struct inode *inode) | |||
109 | return ns; | 117 | return ns; |
110 | } | 118 | } |
111 | 119 | ||
120 | /* Auxiliary functions to manipulate messages' list */ | ||
121 | static int msg_insert(struct msg_msg *msg, struct mqueue_inode_info *info) | ||
122 | { | ||
123 | struct rb_node **p, *parent = NULL; | ||
124 | struct posix_msg_tree_node *leaf; | ||
125 | |||
126 | p = &info->msg_tree.rb_node; | ||
127 | while (*p) { | ||
128 | parent = *p; | ||
129 | leaf = rb_entry(parent, struct posix_msg_tree_node, rb_node); | ||
130 | |||
131 | if (likely(leaf->priority == msg->m_type)) | ||
132 | goto insert_msg; | ||
133 | else if (msg->m_type < leaf->priority) | ||
134 | p = &(*p)->rb_left; | ||
135 | else | ||
136 | p = &(*p)->rb_right; | ||
137 | } | ||
138 | if (info->node_cache) { | ||
139 | leaf = info->node_cache; | ||
140 | info->node_cache = NULL; | ||
141 | } else { | ||
142 | leaf = kmalloc(sizeof(*leaf), GFP_ATOMIC); | ||
143 | if (!leaf) | ||
144 | return -ENOMEM; | ||
145 | rb_init_node(&leaf->rb_node); | ||
146 | INIT_LIST_HEAD(&leaf->msg_list); | ||
147 | info->qsize += sizeof(*leaf); | ||
148 | } | ||
149 | leaf->priority = msg->m_type; | ||
150 | rb_link_node(&leaf->rb_node, parent, p); | ||
151 | rb_insert_color(&leaf->rb_node, &info->msg_tree); | ||
152 | insert_msg: | ||
153 | info->attr.mq_curmsgs++; | ||
154 | info->qsize += msg->m_ts; | ||
155 | list_add_tail(&msg->m_list, &leaf->msg_list); | ||
156 | return 0; | ||
157 | } | ||
158 | |||
159 | static inline struct msg_msg *msg_get(struct mqueue_inode_info *info) | ||
160 | { | ||
161 | struct rb_node **p, *parent = NULL; | ||
162 | struct posix_msg_tree_node *leaf; | ||
163 | struct msg_msg *msg; | ||
164 | |||
165 | try_again: | ||
166 | p = &info->msg_tree.rb_node; | ||
167 | while (*p) { | ||
168 | parent = *p; | ||
169 | /* | ||
170 | * During insert, low priorities go to the left and high to the | ||
171 | * right. On receive, we want the highest priorities first, so | ||
172 | * walk all the way to the right. | ||
173 | */ | ||
174 | p = &(*p)->rb_right; | ||
175 | } | ||
176 | if (!parent) { | ||
177 | if (info->attr.mq_curmsgs) { | ||
178 | pr_warn_once("Inconsistency in POSIX message queue, " | ||
179 | "no tree element, but supposedly messages " | ||
180 | "should exist!\n"); | ||
181 | info->attr.mq_curmsgs = 0; | ||
182 | } | ||
183 | return NULL; | ||
184 | } | ||
185 | leaf = rb_entry(parent, struct posix_msg_tree_node, rb_node); | ||
186 | if (unlikely(list_empty(&leaf->msg_list))) { | ||
187 | pr_warn_once("Inconsistency in POSIX message queue, " | ||
188 | "empty leaf node but we haven't implemented " | ||
189 | "lazy leaf delete!\n"); | ||
190 | rb_erase(&leaf->rb_node, &info->msg_tree); | ||
191 | if (info->node_cache) { | ||
192 | info->qsize -= sizeof(*leaf); | ||
193 | kfree(leaf); | ||
194 | } else { | ||
195 | info->node_cache = leaf; | ||
196 | } | ||
197 | goto try_again; | ||
198 | } else { | ||
199 | msg = list_first_entry(&leaf->msg_list, | ||
200 | struct msg_msg, m_list); | ||
201 | list_del(&msg->m_list); | ||
202 | if (list_empty(&leaf->msg_list)) { | ||
203 | rb_erase(&leaf->rb_node, &info->msg_tree); | ||
204 | if (info->node_cache) { | ||
205 | info->qsize -= sizeof(*leaf); | ||
206 | kfree(leaf); | ||
207 | } else { | ||
208 | info->node_cache = leaf; | ||
209 | } | ||
210 | } | ||
211 | } | ||
212 | info->attr.mq_curmsgs--; | ||
213 | info->qsize -= msg->m_ts; | ||
214 | return msg; | ||
215 | } | ||
216 | |||
112 | static struct inode *mqueue_get_inode(struct super_block *sb, | 217 | static struct inode *mqueue_get_inode(struct super_block *sb, |
113 | struct ipc_namespace *ipc_ns, umode_t mode, | 218 | struct ipc_namespace *ipc_ns, umode_t mode, |
114 | struct mq_attr *attr) | 219 | struct mq_attr *attr) |
@@ -129,7 +234,7 @@ static struct inode *mqueue_get_inode(struct super_block *sb, | |||
129 | 234 | ||
130 | if (S_ISREG(mode)) { | 235 | if (S_ISREG(mode)) { |
131 | struct mqueue_inode_info *info; | 236 | struct mqueue_inode_info *info; |
132 | unsigned long mq_bytes, mq_msg_tblsz; | 237 | unsigned long mq_bytes, mq_treesize; |
133 | 238 | ||
134 | inode->i_fop = &mqueue_file_operations; | 239 | inode->i_fop = &mqueue_file_operations; |
135 | inode->i_size = FILENT_SIZE; | 240 | inode->i_size = FILENT_SIZE; |
@@ -143,20 +248,36 @@ static struct inode *mqueue_get_inode(struct super_block *sb, | |||
143 | info->notify_user_ns = NULL; | 248 | info->notify_user_ns = NULL; |
144 | info->qsize = 0; | 249 | info->qsize = 0; |
145 | info->user = NULL; /* set when all is ok */ | 250 | info->user = NULL; /* set when all is ok */ |
251 | info->msg_tree = RB_ROOT; | ||
252 | info->node_cache = NULL; | ||
146 | memset(&info->attr, 0, sizeof(info->attr)); | 253 | memset(&info->attr, 0, sizeof(info->attr)); |
147 | info->attr.mq_maxmsg = ipc_ns->mq_msg_max; | 254 | info->attr.mq_maxmsg = min(ipc_ns->mq_msg_max, |
148 | info->attr.mq_msgsize = ipc_ns->mq_msgsize_max; | 255 | ipc_ns->mq_msg_default); |
256 | info->attr.mq_msgsize = min(ipc_ns->mq_msgsize_max, | ||
257 | ipc_ns->mq_msgsize_default); | ||
149 | if (attr) { | 258 | if (attr) { |
150 | info->attr.mq_maxmsg = attr->mq_maxmsg; | 259 | info->attr.mq_maxmsg = attr->mq_maxmsg; |
151 | info->attr.mq_msgsize = attr->mq_msgsize; | 260 | info->attr.mq_msgsize = attr->mq_msgsize; |
152 | } | 261 | } |
153 | mq_msg_tblsz = info->attr.mq_maxmsg * sizeof(struct msg_msg *); | 262 | /* |
154 | info->messages = kmalloc(mq_msg_tblsz, GFP_KERNEL); | 263 | * We used to allocate a static array of pointers and account |
155 | if (!info->messages) | 264 | * the size of that array as well as one msg_msg struct per |
156 | goto out_inode; | 265 | * possible message into the queue size. That's no longer |
266 | * accurate as the queue is now an rbtree and will grow and | ||
267 | * shrink depending on usage patterns. We can, however, still | ||
268 | * account one msg_msg struct per message, but the nodes are | ||
269 | * allocated depending on priority usage, and most programs | ||
270 | * only use one, or a handful, of priorities. However, since | ||
271 | * this is pinned memory, we need to assume worst case, so | ||
272 | * that means the min(mq_maxmsg, max_priorities) * struct | ||
273 | * posix_msg_tree_node. | ||
274 | */ | ||
275 | mq_treesize = info->attr.mq_maxmsg * sizeof(struct msg_msg) + | ||
276 | min_t(unsigned int, info->attr.mq_maxmsg, MQ_PRIO_MAX) * | ||
277 | sizeof(struct posix_msg_tree_node); | ||
157 | 278 | ||
158 | mq_bytes = (mq_msg_tblsz + | 279 | mq_bytes = mq_treesize + (info->attr.mq_maxmsg * |
159 | (info->attr.mq_maxmsg * info->attr.mq_msgsize)); | 280 | info->attr.mq_msgsize); |
160 | 281 | ||
161 | spin_lock(&mq_lock); | 282 | spin_lock(&mq_lock); |
162 | if (u->mq_bytes + mq_bytes < u->mq_bytes || | 283 | if (u->mq_bytes + mq_bytes < u->mq_bytes || |
@@ -247,9 +368,9 @@ static void mqueue_evict_inode(struct inode *inode) | |||
247 | { | 368 | { |
248 | struct mqueue_inode_info *info; | 369 | struct mqueue_inode_info *info; |
249 | struct user_struct *user; | 370 | struct user_struct *user; |
250 | unsigned long mq_bytes; | 371 | unsigned long mq_bytes, mq_treesize; |
251 | int i; | ||
252 | struct ipc_namespace *ipc_ns; | 372 | struct ipc_namespace *ipc_ns; |
373 | struct msg_msg *msg; | ||
253 | 374 | ||
254 | clear_inode(inode); | 375 | clear_inode(inode); |
255 | 376 | ||
@@ -259,14 +380,19 @@ static void mqueue_evict_inode(struct inode *inode) | |||
259 | ipc_ns = get_ns_from_inode(inode); | 380 | ipc_ns = get_ns_from_inode(inode); |
260 | info = MQUEUE_I(inode); | 381 | info = MQUEUE_I(inode); |
261 | spin_lock(&info->lock); | 382 | spin_lock(&info->lock); |
262 | for (i = 0; i < info->attr.mq_curmsgs; i++) | 383 | while ((msg = msg_get(info)) != NULL) |
263 | free_msg(info->messages[i]); | 384 | free_msg(msg); |
264 | kfree(info->messages); | 385 | kfree(info->node_cache); |
265 | spin_unlock(&info->lock); | 386 | spin_unlock(&info->lock); |
266 | 387 | ||
267 | /* Total amount of bytes accounted for the mqueue */ | 388 | /* Total amount of bytes accounted for the mqueue */ |
268 | mq_bytes = info->attr.mq_maxmsg * (sizeof(struct msg_msg *) | 389 | mq_treesize = info->attr.mq_maxmsg * sizeof(struct msg_msg) + |
269 | + info->attr.mq_msgsize); | 390 | min_t(unsigned int, info->attr.mq_maxmsg, MQ_PRIO_MAX) * |
391 | sizeof(struct posix_msg_tree_node); | ||
392 | |||
393 | mq_bytes = mq_treesize + (info->attr.mq_maxmsg * | ||
394 | info->attr.mq_msgsize); | ||
395 | |||
270 | user = info->user; | 396 | user = info->user; |
271 | if (user) { | 397 | if (user) { |
272 | spin_lock(&mq_lock); | 398 | spin_lock(&mq_lock); |
@@ -300,8 +426,9 @@ static int mqueue_create(struct inode *dir, struct dentry *dentry, | |||
300 | error = -EACCES; | 426 | error = -EACCES; |
301 | goto out_unlock; | 427 | goto out_unlock; |
302 | } | 428 | } |
303 | if (ipc_ns->mq_queues_count >= ipc_ns->mq_queues_max && | 429 | if (ipc_ns->mq_queues_count >= HARD_QUEUESMAX || |
304 | !capable(CAP_SYS_RESOURCE)) { | 430 | (ipc_ns->mq_queues_count >= ipc_ns->mq_queues_max && |
431 | !capable(CAP_SYS_RESOURCE))) { | ||
305 | error = -ENOSPC; | 432 | error = -ENOSPC; |
306 | goto out_unlock; | 433 | goto out_unlock; |
307 | } | 434 | } |
@@ -485,26 +612,6 @@ static struct ext_wait_queue *wq_get_first_waiter( | |||
485 | return list_entry(ptr, struct ext_wait_queue, list); | 612 | return list_entry(ptr, struct ext_wait_queue, list); |
486 | } | 613 | } |
487 | 614 | ||
488 | /* Auxiliary functions to manipulate messages' list */ | ||
489 | static void msg_insert(struct msg_msg *ptr, struct mqueue_inode_info *info) | ||
490 | { | ||
491 | int k; | ||
492 | |||
493 | k = info->attr.mq_curmsgs - 1; | ||
494 | while (k >= 0 && info->messages[k]->m_type >= ptr->m_type) { | ||
495 | info->messages[k + 1] = info->messages[k]; | ||
496 | k--; | ||
497 | } | ||
498 | info->attr.mq_curmsgs++; | ||
499 | info->qsize += ptr->m_ts; | ||
500 | info->messages[k + 1] = ptr; | ||
501 | } | ||
502 | |||
503 | static inline struct msg_msg *msg_get(struct mqueue_inode_info *info) | ||
504 | { | ||
505 | info->qsize -= info->messages[--info->attr.mq_curmsgs]->m_ts; | ||
506 | return info->messages[info->attr.mq_curmsgs]; | ||
507 | } | ||
508 | 615 | ||
509 | static inline void set_cookie(struct sk_buff *skb, char code) | 616 | static inline void set_cookie(struct sk_buff *skb, char code) |
510 | { | 617 | { |
@@ -585,24 +692,30 @@ static void remove_notification(struct mqueue_inode_info *info) | |||
585 | 692 | ||
586 | static int mq_attr_ok(struct ipc_namespace *ipc_ns, struct mq_attr *attr) | 693 | static int mq_attr_ok(struct ipc_namespace *ipc_ns, struct mq_attr *attr) |
587 | { | 694 | { |
695 | int mq_treesize; | ||
696 | unsigned long total_size; | ||
697 | |||
588 | if (attr->mq_maxmsg <= 0 || attr->mq_msgsize <= 0) | 698 | if (attr->mq_maxmsg <= 0 || attr->mq_msgsize <= 0) |
589 | return 0; | 699 | return -EINVAL; |
590 | if (capable(CAP_SYS_RESOURCE)) { | 700 | if (capable(CAP_SYS_RESOURCE)) { |
591 | if (attr->mq_maxmsg > HARD_MSGMAX) | 701 | if (attr->mq_maxmsg > HARD_MSGMAX || |
592 | return 0; | 702 | attr->mq_msgsize > HARD_MSGSIZEMAX) |
703 | return -EINVAL; | ||
593 | } else { | 704 | } else { |
594 | if (attr->mq_maxmsg > ipc_ns->mq_msg_max || | 705 | if (attr->mq_maxmsg > ipc_ns->mq_msg_max || |
595 | attr->mq_msgsize > ipc_ns->mq_msgsize_max) | 706 | attr->mq_msgsize > ipc_ns->mq_msgsize_max) |
596 | return 0; | 707 | return -EINVAL; |
597 | } | 708 | } |
598 | /* check for overflow */ | 709 | /* check for overflow */ |
599 | if (attr->mq_msgsize > ULONG_MAX/attr->mq_maxmsg) | 710 | if (attr->mq_msgsize > ULONG_MAX/attr->mq_maxmsg) |
600 | return 0; | 711 | return -EOVERFLOW; |
601 | if ((unsigned long)(attr->mq_maxmsg * (attr->mq_msgsize | 712 | mq_treesize = attr->mq_maxmsg * sizeof(struct msg_msg) + |
602 | + sizeof (struct msg_msg *))) < | 713 | min_t(unsigned int, attr->mq_maxmsg, MQ_PRIO_MAX) * |
603 | (unsigned long)(attr->mq_maxmsg * attr->mq_msgsize)) | 714 | sizeof(struct posix_msg_tree_node); |
604 | return 0; | 715 | total_size = attr->mq_maxmsg * attr->mq_msgsize; |
605 | return 1; | 716 | if (total_size + mq_treesize < total_size) |
717 | return -EOVERFLOW; | ||
718 | return 0; | ||
606 | } | 719 | } |
607 | 720 | ||
608 | /* | 721 | /* |
@@ -617,12 +730,21 @@ static struct file *do_create(struct ipc_namespace *ipc_ns, struct dentry *dir, | |||
617 | int ret; | 730 | int ret; |
618 | 731 | ||
619 | if (attr) { | 732 | if (attr) { |
620 | if (!mq_attr_ok(ipc_ns, attr)) { | 733 | ret = mq_attr_ok(ipc_ns, attr); |
621 | ret = -EINVAL; | 734 | if (ret) |
622 | goto out; | 735 | goto out; |
623 | } | ||
624 | /* store for use during create */ | 736 | /* store for use during create */ |
625 | dentry->d_fsdata = attr; | 737 | dentry->d_fsdata = attr; |
738 | } else { | ||
739 | struct mq_attr def_attr; | ||
740 | |||
741 | def_attr.mq_maxmsg = min(ipc_ns->mq_msg_max, | ||
742 | ipc_ns->mq_msg_default); | ||
743 | def_attr.mq_msgsize = min(ipc_ns->mq_msgsize_max, | ||
744 | ipc_ns->mq_msgsize_default); | ||
745 | ret = mq_attr_ok(ipc_ns, &def_attr); | ||
746 | if (ret) | ||
747 | goto out; | ||
626 | } | 748 | } |
627 | 749 | ||
628 | mode &= ~current_umask(); | 750 | mode &= ~current_umask(); |
@@ -837,7 +959,8 @@ static inline void pipelined_receive(struct mqueue_inode_info *info) | |||
837 | wake_up_interruptible(&info->wait_q); | 959 | wake_up_interruptible(&info->wait_q); |
838 | return; | 960 | return; |
839 | } | 961 | } |
840 | msg_insert(sender->msg, info); | 962 | if (msg_insert(sender->msg, info)) |
963 | return; | ||
841 | list_del(&sender->list); | 964 | list_del(&sender->list); |
842 | sender->state = STATE_PENDING; | 965 | sender->state = STATE_PENDING; |
843 | wake_up_process(sender->task); | 966 | wake_up_process(sender->task); |
@@ -857,7 +980,8 @@ SYSCALL_DEFINE5(mq_timedsend, mqd_t, mqdes, const char __user *, u_msg_ptr, | |||
857 | struct mqueue_inode_info *info; | 980 | struct mqueue_inode_info *info; |
858 | ktime_t expires, *timeout = NULL; | 981 | ktime_t expires, *timeout = NULL; |
859 | struct timespec ts; | 982 | struct timespec ts; |
860 | int ret; | 983 | struct posix_msg_tree_node *new_leaf = NULL; |
984 | int ret = 0; | ||
861 | 985 | ||
862 | if (u_abs_timeout) { | 986 | if (u_abs_timeout) { |
863 | int res = prepare_timeout(u_abs_timeout, &expires, &ts); | 987 | int res = prepare_timeout(u_abs_timeout, &expires, &ts); |
@@ -905,34 +1029,60 @@ SYSCALL_DEFINE5(mq_timedsend, mqd_t, mqdes, const char __user *, u_msg_ptr, | |||
905 | msg_ptr->m_ts = msg_len; | 1029 | msg_ptr->m_ts = msg_len; |
906 | msg_ptr->m_type = msg_prio; | 1030 | msg_ptr->m_type = msg_prio; |
907 | 1031 | ||
1032 | /* | ||
1033 | * msg_insert really wants us to have a valid, spare node struct so | ||
1034 | * it doesn't have to kmalloc a GFP_ATOMIC allocation, but it will | ||
1035 | * fall back to that if necessary. | ||
1036 | */ | ||
1037 | if (!info->node_cache) | ||
1038 | new_leaf = kmalloc(sizeof(*new_leaf), GFP_KERNEL); | ||
1039 | |||
908 | spin_lock(&info->lock); | 1040 | spin_lock(&info->lock); |
909 | 1041 | ||
1042 | if (!info->node_cache && new_leaf) { | ||
1043 | /* Save our speculative allocation into the cache */ | ||
1044 | rb_init_node(&new_leaf->rb_node); | ||
1045 | INIT_LIST_HEAD(&new_leaf->msg_list); | ||
1046 | info->node_cache = new_leaf; | ||
1047 | info->qsize += sizeof(*new_leaf); | ||
1048 | new_leaf = NULL; | ||
1049 | } else { | ||
1050 | kfree(new_leaf); | ||
1051 | } | ||
1052 | |||
910 | if (info->attr.mq_curmsgs == info->attr.mq_maxmsg) { | 1053 | if (info->attr.mq_curmsgs == info->attr.mq_maxmsg) { |
911 | if (filp->f_flags & O_NONBLOCK) { | 1054 | if (filp->f_flags & O_NONBLOCK) { |
912 | spin_unlock(&info->lock); | ||
913 | ret = -EAGAIN; | 1055 | ret = -EAGAIN; |
914 | } else { | 1056 | } else { |
915 | wait.task = current; | 1057 | wait.task = current; |
916 | wait.msg = (void *) msg_ptr; | 1058 | wait.msg = (void *) msg_ptr; |
917 | wait.state = STATE_NONE; | 1059 | wait.state = STATE_NONE; |
918 | ret = wq_sleep(info, SEND, timeout, &wait); | 1060 | ret = wq_sleep(info, SEND, timeout, &wait); |
1061 | /* | ||
1062 | * wq_sleep must be called with info->lock held, and | ||
1063 | * returns with the lock released | ||
1064 | */ | ||
1065 | goto out_free; | ||
919 | } | 1066 | } |
920 | if (ret < 0) | ||
921 | free_msg(msg_ptr); | ||
922 | } else { | 1067 | } else { |
923 | receiver = wq_get_first_waiter(info, RECV); | 1068 | receiver = wq_get_first_waiter(info, RECV); |
924 | if (receiver) { | 1069 | if (receiver) { |
925 | pipelined_send(info, msg_ptr, receiver); | 1070 | pipelined_send(info, msg_ptr, receiver); |
926 | } else { | 1071 | } else { |
927 | /* adds message to the queue */ | 1072 | /* adds message to the queue */ |
928 | msg_insert(msg_ptr, info); | 1073 | ret = msg_insert(msg_ptr, info); |
1074 | if (ret) | ||
1075 | goto out_unlock; | ||
929 | __do_notify(info); | 1076 | __do_notify(info); |
930 | } | 1077 | } |
931 | inode->i_atime = inode->i_mtime = inode->i_ctime = | 1078 | inode->i_atime = inode->i_mtime = inode->i_ctime = |
932 | CURRENT_TIME; | 1079 | CURRENT_TIME; |
933 | spin_unlock(&info->lock); | ||
934 | ret = 0; | ||
935 | } | 1080 | } |
1081 | out_unlock: | ||
1082 | spin_unlock(&info->lock); | ||
1083 | out_free: | ||
1084 | if (ret) | ||
1085 | free_msg(msg_ptr); | ||
936 | out_fput: | 1086 | out_fput: |
937 | fput(filp); | 1087 | fput(filp); |
938 | out: | 1088 | out: |
@@ -951,6 +1101,7 @@ SYSCALL_DEFINE5(mq_timedreceive, mqd_t, mqdes, char __user *, u_msg_ptr, | |||
951 | struct ext_wait_queue wait; | 1101 | struct ext_wait_queue wait; |
952 | ktime_t expires, *timeout = NULL; | 1102 | ktime_t expires, *timeout = NULL; |
953 | struct timespec ts; | 1103 | struct timespec ts; |
1104 | struct posix_msg_tree_node *new_leaf = NULL; | ||
954 | 1105 | ||
955 | if (u_abs_timeout) { | 1106 | if (u_abs_timeout) { |
956 | int res = prepare_timeout(u_abs_timeout, &expires, &ts); | 1107 | int res = prepare_timeout(u_abs_timeout, &expires, &ts); |
@@ -986,7 +1137,26 @@ SYSCALL_DEFINE5(mq_timedreceive, mqd_t, mqdes, char __user *, u_msg_ptr, | |||
986 | goto out_fput; | 1137 | goto out_fput; |
987 | } | 1138 | } |
988 | 1139 | ||
1140 | /* | ||
1141 | * msg_insert really wants us to have a valid, spare node struct so | ||
1142 | * it doesn't have to kmalloc a GFP_ATOMIC allocation, but it will | ||
1143 | * fall back to that if necessary. | ||
1144 | */ | ||
1145 | if (!info->node_cache) | ||
1146 | new_leaf = kmalloc(sizeof(*new_leaf), GFP_KERNEL); | ||
1147 | |||
989 | spin_lock(&info->lock); | 1148 | spin_lock(&info->lock); |
1149 | |||
1150 | if (!info->node_cache && new_leaf) { | ||
1151 | /* Save our speculative allocation into the cache */ | ||
1152 | rb_init_node(&new_leaf->rb_node); | ||
1153 | INIT_LIST_HEAD(&new_leaf->msg_list); | ||
1154 | info->node_cache = new_leaf; | ||
1155 | info->qsize += sizeof(*new_leaf); | ||
1156 | } else { | ||
1157 | kfree(new_leaf); | ||
1158 | } | ||
1159 | |||
990 | if (info->attr.mq_curmsgs == 0) { | 1160 | if (info->attr.mq_curmsgs == 0) { |
991 | if (filp->f_flags & O_NONBLOCK) { | 1161 | if (filp->f_flags & O_NONBLOCK) { |
992 | spin_unlock(&info->lock); | 1162 | spin_unlock(&info->lock); |
@@ -1251,6 +1421,8 @@ int mq_init_ns(struct ipc_namespace *ns) | |||
1251 | ns->mq_queues_max = DFLT_QUEUESMAX; | 1421 | ns->mq_queues_max = DFLT_QUEUESMAX; |
1252 | ns->mq_msg_max = DFLT_MSGMAX; | 1422 | ns->mq_msg_max = DFLT_MSGMAX; |
1253 | ns->mq_msgsize_max = DFLT_MSGSIZEMAX; | 1423 | ns->mq_msgsize_max = DFLT_MSGSIZEMAX; |
1424 | ns->mq_msg_default = DFLT_MSG; | ||
1425 | ns->mq_msgsize_default = DFLT_MSGSIZE; | ||
1254 | 1426 | ||
1255 | ns->mq_mnt = kern_mount_data(&mqueue_fs_type, ns); | 1427 | ns->mq_mnt = kern_mount_data(&mqueue_fs_type, ns); |
1256 | if (IS_ERR(ns->mq_mnt)) { | 1428 | if (IS_ERR(ns->mq_mnt)) { |
diff --git a/kernel/Makefile b/kernel/Makefile index 6c07f30fa9b7..80be6ca0cc75 100644 --- a/kernel/Makefile +++ b/kernel/Makefile | |||
@@ -25,6 +25,9 @@ endif | |||
25 | obj-y += sched/ | 25 | obj-y += sched/ |
26 | obj-y += power/ | 26 | obj-y += power/ |
27 | 27 | ||
28 | ifeq ($(CONFIG_CHECKPOINT_RESTORE),y) | ||
29 | obj-$(CONFIG_X86) += kcmp.o | ||
30 | endif | ||
28 | obj-$(CONFIG_FREEZER) += freezer.o | 31 | obj-$(CONFIG_FREEZER) += freezer.o |
29 | obj-$(CONFIG_PROFILING) += profile.o | 32 | obj-$(CONFIG_PROFILING) += profile.o |
30 | obj-$(CONFIG_STACKTRACE) += stacktrace.o | 33 | obj-$(CONFIG_STACKTRACE) += stacktrace.o |
diff --git a/kernel/cpu.c b/kernel/cpu.c index 0e6353cf147a..a4eb5227a19e 100644 --- a/kernel/cpu.c +++ b/kernel/cpu.c | |||
@@ -10,7 +10,10 @@ | |||
10 | #include <linux/sched.h> | 10 | #include <linux/sched.h> |
11 | #include <linux/unistd.h> | 11 | #include <linux/unistd.h> |
12 | #include <linux/cpu.h> | 12 | #include <linux/cpu.h> |
13 | #include <linux/oom.h> | ||
14 | #include <linux/rcupdate.h> | ||
13 | #include <linux/export.h> | 15 | #include <linux/export.h> |
16 | #include <linux/bug.h> | ||
14 | #include <linux/kthread.h> | 17 | #include <linux/kthread.h> |
15 | #include <linux/stop_machine.h> | 18 | #include <linux/stop_machine.h> |
16 | #include <linux/mutex.h> | 19 | #include <linux/mutex.h> |
@@ -173,6 +176,47 @@ void __ref unregister_cpu_notifier(struct notifier_block *nb) | |||
173 | } | 176 | } |
174 | EXPORT_SYMBOL(unregister_cpu_notifier); | 177 | EXPORT_SYMBOL(unregister_cpu_notifier); |
175 | 178 | ||
179 | /** | ||
180 | * clear_tasks_mm_cpumask - Safely clear tasks' mm_cpumask for a CPU | ||
181 | * @cpu: a CPU id | ||
182 | * | ||
183 | * This function walks all processes, finds a valid mm struct for each one and | ||
184 | * then clears a corresponding bit in mm's cpumask. While this all sounds | ||
185 | * trivial, there are various non-obvious corner cases, which this function | ||
186 | * tries to solve in a safe manner. | ||
187 | * | ||
188 | * Also note that the function uses a somewhat relaxed locking scheme, so it may | ||
189 | * be called only for an already offlined CPU. | ||
190 | */ | ||
191 | void clear_tasks_mm_cpumask(int cpu) | ||
192 | { | ||
193 | struct task_struct *p; | ||
194 | |||
195 | /* | ||
196 | * This function is called after the cpu is taken down and marked | ||
197 | * offline, so its not like new tasks will ever get this cpu set in | ||
198 | * their mm mask. -- Peter Zijlstra | ||
199 | * Thus, we may use rcu_read_lock() here, instead of grabbing | ||
200 | * full-fledged tasklist_lock. | ||
201 | */ | ||
202 | WARN_ON(cpu_online(cpu)); | ||
203 | rcu_read_lock(); | ||
204 | for_each_process(p) { | ||
205 | struct task_struct *t; | ||
206 | |||
207 | /* | ||
208 | * Main thread might exit, but other threads may still have | ||
209 | * a valid mm. Find one. | ||
210 | */ | ||
211 | t = find_lock_task_mm(p); | ||
212 | if (!t) | ||
213 | continue; | ||
214 | cpumask_clear_cpu(cpu, mm_cpumask(t->mm)); | ||
215 | task_unlock(t); | ||
216 | } | ||
217 | rcu_read_unlock(); | ||
218 | } | ||
219 | |||
176 | static inline void check_for_tasks(int cpu) | 220 | static inline void check_for_tasks(int cpu) |
177 | { | 221 | { |
178 | struct task_struct *p; | 222 | struct task_struct *p; |
diff --git a/kernel/cpu_pm.c b/kernel/cpu_pm.c index 249152e15308..9656a3c36503 100644 --- a/kernel/cpu_pm.c +++ b/kernel/cpu_pm.c | |||
@@ -81,7 +81,7 @@ int cpu_pm_unregister_notifier(struct notifier_block *nb) | |||
81 | EXPORT_SYMBOL_GPL(cpu_pm_unregister_notifier); | 81 | EXPORT_SYMBOL_GPL(cpu_pm_unregister_notifier); |
82 | 82 | ||
83 | /** | 83 | /** |
84 | * cpm_pm_enter - CPU low power entry notifier | 84 | * cpu_pm_enter - CPU low power entry notifier |
85 | * | 85 | * |
86 | * Notifies listeners that a single CPU is entering a low power state that may | 86 | * Notifies listeners that a single CPU is entering a low power state that may |
87 | * cause some blocks in the same power domain as the cpu to reset. | 87 | * cause some blocks in the same power domain as the cpu to reset. |
@@ -89,7 +89,7 @@ EXPORT_SYMBOL_GPL(cpu_pm_unregister_notifier); | |||
89 | * Must be called on the affected CPU with interrupts disabled. Platform is | 89 | * Must be called on the affected CPU with interrupts disabled. Platform is |
90 | * responsible for ensuring that cpu_pm_enter is not called twice on the same | 90 | * responsible for ensuring that cpu_pm_enter is not called twice on the same |
91 | * CPU before cpu_pm_exit is called. Notified drivers can include VFP | 91 | * CPU before cpu_pm_exit is called. Notified drivers can include VFP |
92 | * co-processor, interrupt controller and it's PM extensions, local CPU | 92 | * co-processor, interrupt controller and its PM extensions, local CPU |
93 | * timers context save/restore which shouldn't be interrupted. Hence it | 93 | * timers context save/restore which shouldn't be interrupted. Hence it |
94 | * must be called with interrupts disabled. | 94 | * must be called with interrupts disabled. |
95 | * | 95 | * |
@@ -115,13 +115,13 @@ int cpu_pm_enter(void) | |||
115 | EXPORT_SYMBOL_GPL(cpu_pm_enter); | 115 | EXPORT_SYMBOL_GPL(cpu_pm_enter); |
116 | 116 | ||
117 | /** | 117 | /** |
118 | * cpm_pm_exit - CPU low power exit notifier | 118 | * cpu_pm_exit - CPU low power exit notifier |
119 | * | 119 | * |
120 | * Notifies listeners that a single CPU is exiting a low power state that may | 120 | * Notifies listeners that a single CPU is exiting a low power state that may |
121 | * have caused some blocks in the same power domain as the cpu to reset. | 121 | * have caused some blocks in the same power domain as the cpu to reset. |
122 | * | 122 | * |
123 | * Notified drivers can include VFP co-processor, interrupt controller | 123 | * Notified drivers can include VFP co-processor, interrupt controller |
124 | * and it's PM extensions, local CPU timers context save/restore which | 124 | * and its PM extensions, local CPU timers context save/restore which |
125 | * shouldn't be interrupted. Hence it must be called with interrupts disabled. | 125 | * shouldn't be interrupted. Hence it must be called with interrupts disabled. |
126 | * | 126 | * |
127 | * Return conditions are same as __raw_notifier_call_chain. | 127 | * Return conditions are same as __raw_notifier_call_chain. |
@@ -139,7 +139,7 @@ int cpu_pm_exit(void) | |||
139 | EXPORT_SYMBOL_GPL(cpu_pm_exit); | 139 | EXPORT_SYMBOL_GPL(cpu_pm_exit); |
140 | 140 | ||
141 | /** | 141 | /** |
142 | * cpm_cluster_pm_enter - CPU cluster low power entry notifier | 142 | * cpu_cluster_pm_enter - CPU cluster low power entry notifier |
143 | * | 143 | * |
144 | * Notifies listeners that all cpus in a power domain are entering a low power | 144 | * Notifies listeners that all cpus in a power domain are entering a low power |
145 | * state that may cause some blocks in the same power domain to reset. | 145 | * state that may cause some blocks in the same power domain to reset. |
@@ -147,7 +147,7 @@ EXPORT_SYMBOL_GPL(cpu_pm_exit); | |||
147 | * Must be called after cpu_pm_enter has been called on all cpus in the power | 147 | * Must be called after cpu_pm_enter has been called on all cpus in the power |
148 | * domain, and before cpu_pm_exit has been called on any cpu in the power | 148 | * domain, and before cpu_pm_exit has been called on any cpu in the power |
149 | * domain. Notified drivers can include VFP co-processor, interrupt controller | 149 | * domain. Notified drivers can include VFP co-processor, interrupt controller |
150 | * and it's PM extensions, local CPU timers context save/restore which | 150 | * and its PM extensions, local CPU timers context save/restore which |
151 | * shouldn't be interrupted. Hence it must be called with interrupts disabled. | 151 | * shouldn't be interrupted. Hence it must be called with interrupts disabled. |
152 | * | 152 | * |
153 | * Must be called with interrupts disabled. | 153 | * Must be called with interrupts disabled. |
@@ -174,7 +174,7 @@ int cpu_cluster_pm_enter(void) | |||
174 | EXPORT_SYMBOL_GPL(cpu_cluster_pm_enter); | 174 | EXPORT_SYMBOL_GPL(cpu_cluster_pm_enter); |
175 | 175 | ||
176 | /** | 176 | /** |
177 | * cpm_cluster_pm_exit - CPU cluster low power exit notifier | 177 | * cpu_cluster_pm_exit - CPU cluster low power exit notifier |
178 | * | 178 | * |
179 | * Notifies listeners that all cpus in a power domain are exiting form a | 179 | * Notifies listeners that all cpus in a power domain are exiting form a |
180 | * low power state that may have caused some blocks in the same power domain | 180 | * low power state that may have caused some blocks in the same power domain |
@@ -183,7 +183,7 @@ EXPORT_SYMBOL_GPL(cpu_cluster_pm_enter); | |||
183 | * Must be called after cpu_pm_exit has been called on all cpus in the power | 183 | * Must be called after cpu_pm_exit has been called on all cpus in the power |
184 | * domain, and before cpu_pm_exit has been called on any cpu in the power | 184 | * domain, and before cpu_pm_exit has been called on any cpu in the power |
185 | * domain. Notified drivers can include VFP co-processor, interrupt controller | 185 | * domain. Notified drivers can include VFP co-processor, interrupt controller |
186 | * and it's PM extensions, local CPU timers context save/restore which | 186 | * and its PM extensions, local CPU timers context save/restore which |
187 | * shouldn't be interrupted. Hence it must be called with interrupts disabled. | 187 | * shouldn't be interrupted. Hence it must be called with interrupts disabled. |
188 | * | 188 | * |
189 | * Return conditions are same as __raw_notifier_call_chain. | 189 | * Return conditions are same as __raw_notifier_call_chain. |
diff --git a/kernel/exit.c b/kernel/exit.c index 910a0716e17a..6d85655353e9 100644 --- a/kernel/exit.c +++ b/kernel/exit.c | |||
@@ -884,9 +884,9 @@ static void check_stack_usage(void) | |||
884 | 884 | ||
885 | spin_lock(&low_water_lock); | 885 | spin_lock(&low_water_lock); |
886 | if (free < lowest_to_date) { | 886 | if (free < lowest_to_date) { |
887 | printk(KERN_WARNING "%s used greatest stack depth: %lu bytes " | 887 | printk(KERN_WARNING "%s (%d) used greatest stack depth: " |
888 | "left\n", | 888 | "%lu bytes left\n", |
889 | current->comm, free); | 889 | current->comm, task_pid_nr(current), free); |
890 | lowest_to_date = free; | 890 | lowest_to_date = free; |
891 | } | 891 | } |
892 | spin_unlock(&low_water_lock); | 892 | spin_unlock(&low_water_lock); |
@@ -1214,7 +1214,7 @@ static int wait_task_zombie(struct wait_opts *wo, struct task_struct *p) | |||
1214 | unsigned long state; | 1214 | unsigned long state; |
1215 | int retval, status, traced; | 1215 | int retval, status, traced; |
1216 | pid_t pid = task_pid_vnr(p); | 1216 | pid_t pid = task_pid_vnr(p); |
1217 | uid_t uid = from_kuid_munged(current_user_ns(), __task_cred(p)->uid); | 1217 | uid_t uid = from_kuid_munged(current_user_ns(), task_uid(p)); |
1218 | struct siginfo __user *infop; | 1218 | struct siginfo __user *infop; |
1219 | 1219 | ||
1220 | if (!likely(wo->wo_flags & WEXITED)) | 1220 | if (!likely(wo->wo_flags & WEXITED)) |
diff --git a/kernel/fork.c b/kernel/fork.c index 31a32c7dd169..c55b61ab6d64 100644 --- a/kernel/fork.c +++ b/kernel/fork.c | |||
@@ -787,9 +787,6 @@ void mm_release(struct task_struct *tsk, struct mm_struct *mm) | |||
787 | /* Get rid of any cached register state */ | 787 | /* Get rid of any cached register state */ |
788 | deactivate_mm(tsk, mm); | 788 | deactivate_mm(tsk, mm); |
789 | 789 | ||
790 | if (tsk->vfork_done) | ||
791 | complete_vfork_done(tsk); | ||
792 | |||
793 | /* | 790 | /* |
794 | * If we're exiting normally, clear a user-space tid field if | 791 | * If we're exiting normally, clear a user-space tid field if |
795 | * requested. We leave this alone when dying by signal, to leave | 792 | * requested. We leave this alone when dying by signal, to leave |
@@ -810,6 +807,13 @@ void mm_release(struct task_struct *tsk, struct mm_struct *mm) | |||
810 | } | 807 | } |
811 | tsk->clear_child_tid = NULL; | 808 | tsk->clear_child_tid = NULL; |
812 | } | 809 | } |
810 | |||
811 | /* | ||
812 | * All done, finally we can wake up parent and return this mm to him. | ||
813 | * Also kthread_stop() uses this completion for synchronization. | ||
814 | */ | ||
815 | if (tsk->vfork_done) | ||
816 | complete_vfork_done(tsk); | ||
813 | } | 817 | } |
814 | 818 | ||
815 | /* | 819 | /* |
diff --git a/kernel/irq/manage.c b/kernel/irq/manage.c index bb32326afe87..7c475cd3f6e6 100644 --- a/kernel/irq/manage.c +++ b/kernel/irq/manage.c | |||
@@ -7,6 +7,8 @@ | |||
7 | * This file contains driver APIs to the irq subsystem. | 7 | * This file contains driver APIs to the irq subsystem. |
8 | */ | 8 | */ |
9 | 9 | ||
10 | #define pr_fmt(fmt) "genirq: " fmt | ||
11 | |||
10 | #include <linux/irq.h> | 12 | #include <linux/irq.h> |
11 | #include <linux/kthread.h> | 13 | #include <linux/kthread.h> |
12 | #include <linux/module.h> | 14 | #include <linux/module.h> |
@@ -565,7 +567,7 @@ int __irq_set_trigger(struct irq_desc *desc, unsigned int irq, | |||
565 | * IRQF_TRIGGER_* but the PIC does not support multiple | 567 | * IRQF_TRIGGER_* but the PIC does not support multiple |
566 | * flow-types? | 568 | * flow-types? |
567 | */ | 569 | */ |
568 | pr_debug("genirq: No set_type function for IRQ %d (%s)\n", irq, | 570 | pr_debug("No set_type function for IRQ %d (%s)\n", irq, |
569 | chip ? (chip->name ? : "unknown") : "unknown"); | 571 | chip ? (chip->name ? : "unknown") : "unknown"); |
570 | return 0; | 572 | return 0; |
571 | } | 573 | } |
@@ -600,7 +602,7 @@ int __irq_set_trigger(struct irq_desc *desc, unsigned int irq, | |||
600 | ret = 0; | 602 | ret = 0; |
601 | break; | 603 | break; |
602 | default: | 604 | default: |
603 | pr_err("genirq: Setting trigger mode %lu for irq %u failed (%pF)\n", | 605 | pr_err("Setting trigger mode %lu for irq %u failed (%pF)\n", |
604 | flags, irq, chip->irq_set_type); | 606 | flags, irq, chip->irq_set_type); |
605 | } | 607 | } |
606 | if (unmask) | 608 | if (unmask) |
@@ -837,7 +839,7 @@ void exit_irq_thread(void) | |||
837 | 839 | ||
838 | action = kthread_data(tsk); | 840 | action = kthread_data(tsk); |
839 | 841 | ||
840 | pr_err("genirq: exiting task \"%s\" (%d) is an active IRQ thread (irq %d)\n", | 842 | pr_err("exiting task \"%s\" (%d) is an active IRQ thread (irq %d)\n", |
841 | tsk->comm ? tsk->comm : "", tsk->pid, action->irq); | 843 | tsk->comm ? tsk->comm : "", tsk->pid, action->irq); |
842 | 844 | ||
843 | desc = irq_to_desc(action->irq); | 845 | desc = irq_to_desc(action->irq); |
@@ -1044,7 +1046,7 @@ __setup_irq(unsigned int irq, struct irq_desc *desc, struct irqaction *new) | |||
1044 | * has. The type flags are unreliable as the | 1046 | * has. The type flags are unreliable as the |
1045 | * underlying chip implementation can override them. | 1047 | * underlying chip implementation can override them. |
1046 | */ | 1048 | */ |
1047 | pr_err("genirq: Threaded irq requested with handler=NULL and !ONESHOT for irq %d\n", | 1049 | pr_err("Threaded irq requested with handler=NULL and !ONESHOT for irq %d\n", |
1048 | irq); | 1050 | irq); |
1049 | ret = -EINVAL; | 1051 | ret = -EINVAL; |
1050 | goto out_mask; | 1052 | goto out_mask; |
@@ -1095,7 +1097,7 @@ __setup_irq(unsigned int irq, struct irq_desc *desc, struct irqaction *new) | |||
1095 | 1097 | ||
1096 | if (nmsk != omsk) | 1098 | if (nmsk != omsk) |
1097 | /* hope the handler works with current trigger mode */ | 1099 | /* hope the handler works with current trigger mode */ |
1098 | pr_warning("genirq: irq %d uses trigger mode %u; requested %u\n", | 1100 | pr_warning("irq %d uses trigger mode %u; requested %u\n", |
1099 | irq, nmsk, omsk); | 1101 | irq, nmsk, omsk); |
1100 | } | 1102 | } |
1101 | 1103 | ||
@@ -1133,7 +1135,7 @@ __setup_irq(unsigned int irq, struct irq_desc *desc, struct irqaction *new) | |||
1133 | 1135 | ||
1134 | mismatch: | 1136 | mismatch: |
1135 | if (!(new->flags & IRQF_PROBE_SHARED)) { | 1137 | if (!(new->flags & IRQF_PROBE_SHARED)) { |
1136 | pr_err("genirq: Flags mismatch irq %d. %08x (%s) vs. %08x (%s)\n", | 1138 | pr_err("Flags mismatch irq %d. %08x (%s) vs. %08x (%s)\n", |
1137 | irq, new->flags, new->name, old->flags, old->name); | 1139 | irq, new->flags, new->name, old->flags, old->name); |
1138 | #ifdef CONFIG_DEBUG_SHIRQ | 1140 | #ifdef CONFIG_DEBUG_SHIRQ |
1139 | dump_stack(); | 1141 | dump_stack(); |
diff --git a/kernel/kcmp.c b/kernel/kcmp.c new file mode 100644 index 000000000000..30b7b225306c --- /dev/null +++ b/kernel/kcmp.c | |||
@@ -0,0 +1,196 @@ | |||
1 | #include <linux/kernel.h> | ||
2 | #include <linux/syscalls.h> | ||
3 | #include <linux/fdtable.h> | ||
4 | #include <linux/string.h> | ||
5 | #include <linux/random.h> | ||
6 | #include <linux/module.h> | ||
7 | #include <linux/init.h> | ||
8 | #include <linux/errno.h> | ||
9 | #include <linux/cache.h> | ||
10 | #include <linux/bug.h> | ||
11 | #include <linux/err.h> | ||
12 | #include <linux/kcmp.h> | ||
13 | |||
14 | #include <asm/unistd.h> | ||
15 | |||
16 | /* | ||
17 | * We don't expose the real in-memory order of objects for security reasons. | ||
18 | * But still the comparison results should be suitable for sorting. So we | ||
19 | * obfuscate kernel pointers values and compare the production instead. | ||
20 | * | ||
21 | * The obfuscation is done in two steps. First we xor the kernel pointer with | ||
22 | * a random value, which puts pointer into a new position in a reordered space. | ||
23 | * Secondly we multiply the xor production with a large odd random number to | ||
24 | * permute its bits even more (the odd multiplier guarantees that the product | ||
25 | * is unique ever after the high bits are truncated, since any odd number is | ||
26 | * relative prime to 2^n). | ||
27 | * | ||
28 | * Note also that the obfuscation itself is invisible to userspace and if needed | ||
29 | * it can be changed to an alternate scheme. | ||
30 | */ | ||
31 | static unsigned long cookies[KCMP_TYPES][2] __read_mostly; | ||
32 | |||
33 | static long kptr_obfuscate(long v, int type) | ||
34 | { | ||
35 | return (v ^ cookies[type][0]) * cookies[type][1]; | ||
36 | } | ||
37 | |||
38 | /* | ||
39 | * 0 - equal, i.e. v1 = v2 | ||
40 | * 1 - less than, i.e. v1 < v2 | ||
41 | * 2 - greater than, i.e. v1 > v2 | ||
42 | * 3 - not equal but ordering unavailable (reserved for future) | ||
43 | */ | ||
44 | static int kcmp_ptr(void *v1, void *v2, enum kcmp_type type) | ||
45 | { | ||
46 | long ret; | ||
47 | |||
48 | ret = kptr_obfuscate((long)v1, type) - kptr_obfuscate((long)v2, type); | ||
49 | |||
50 | return (ret < 0) | ((ret > 0) << 1); | ||
51 | } | ||
52 | |||
53 | /* The caller must have pinned the task */ | ||
54 | static struct file * | ||
55 | get_file_raw_ptr(struct task_struct *task, unsigned int idx) | ||
56 | { | ||
57 | struct file *file = NULL; | ||
58 | |||
59 | task_lock(task); | ||
60 | rcu_read_lock(); | ||
61 | |||
62 | if (task->files) | ||
63 | file = fcheck_files(task->files, idx); | ||
64 | |||
65 | rcu_read_unlock(); | ||
66 | task_unlock(task); | ||
67 | |||
68 | return file; | ||
69 | } | ||
70 | |||
71 | static void kcmp_unlock(struct mutex *m1, struct mutex *m2) | ||
72 | { | ||
73 | if (likely(m2 != m1)) | ||
74 | mutex_unlock(m2); | ||
75 | mutex_unlock(m1); | ||
76 | } | ||
77 | |||
78 | static int kcmp_lock(struct mutex *m1, struct mutex *m2) | ||
79 | { | ||
80 | int err; | ||
81 | |||
82 | if (m2 > m1) | ||
83 | swap(m1, m2); | ||
84 | |||
85 | err = mutex_lock_killable(m1); | ||
86 | if (!err && likely(m1 != m2)) { | ||
87 | err = mutex_lock_killable_nested(m2, SINGLE_DEPTH_NESTING); | ||
88 | if (err) | ||
89 | mutex_unlock(m1); | ||
90 | } | ||
91 | |||
92 | return err; | ||
93 | } | ||
94 | |||
95 | SYSCALL_DEFINE5(kcmp, pid_t, pid1, pid_t, pid2, int, type, | ||
96 | unsigned long, idx1, unsigned long, idx2) | ||
97 | { | ||
98 | struct task_struct *task1, *task2; | ||
99 | int ret; | ||
100 | |||
101 | rcu_read_lock(); | ||
102 | |||
103 | /* | ||
104 | * Tasks are looked up in caller's PID namespace only. | ||
105 | */ | ||
106 | task1 = find_task_by_vpid(pid1); | ||
107 | task2 = find_task_by_vpid(pid2); | ||
108 | if (!task1 || !task2) | ||
109 | goto err_no_task; | ||
110 | |||
111 | get_task_struct(task1); | ||
112 | get_task_struct(task2); | ||
113 | |||
114 | rcu_read_unlock(); | ||
115 | |||
116 | /* | ||
117 | * One should have enough rights to inspect task details. | ||
118 | */ | ||
119 | ret = kcmp_lock(&task1->signal->cred_guard_mutex, | ||
120 | &task2->signal->cred_guard_mutex); | ||
121 | if (ret) | ||
122 | goto err; | ||
123 | if (!ptrace_may_access(task1, PTRACE_MODE_READ) || | ||
124 | !ptrace_may_access(task2, PTRACE_MODE_READ)) { | ||
125 | ret = -EPERM; | ||
126 | goto err_unlock; | ||
127 | } | ||
128 | |||
129 | switch (type) { | ||
130 | case KCMP_FILE: { | ||
131 | struct file *filp1, *filp2; | ||
132 | |||
133 | filp1 = get_file_raw_ptr(task1, idx1); | ||
134 | filp2 = get_file_raw_ptr(task2, idx2); | ||
135 | |||
136 | if (filp1 && filp2) | ||
137 | ret = kcmp_ptr(filp1, filp2, KCMP_FILE); | ||
138 | else | ||
139 | ret = -EBADF; | ||
140 | break; | ||
141 | } | ||
142 | case KCMP_VM: | ||
143 | ret = kcmp_ptr(task1->mm, task2->mm, KCMP_VM); | ||
144 | break; | ||
145 | case KCMP_FILES: | ||
146 | ret = kcmp_ptr(task1->files, task2->files, KCMP_FILES); | ||
147 | break; | ||
148 | case KCMP_FS: | ||
149 | ret = kcmp_ptr(task1->fs, task2->fs, KCMP_FS); | ||
150 | break; | ||
151 | case KCMP_SIGHAND: | ||
152 | ret = kcmp_ptr(task1->sighand, task2->sighand, KCMP_SIGHAND); | ||
153 | break; | ||
154 | case KCMP_IO: | ||
155 | ret = kcmp_ptr(task1->io_context, task2->io_context, KCMP_IO); | ||
156 | break; | ||
157 | case KCMP_SYSVSEM: | ||
158 | #ifdef CONFIG_SYSVIPC | ||
159 | ret = kcmp_ptr(task1->sysvsem.undo_list, | ||
160 | task2->sysvsem.undo_list, | ||
161 | KCMP_SYSVSEM); | ||
162 | #else | ||
163 | ret = -EOPNOTSUPP; | ||
164 | #endif | ||
165 | break; | ||
166 | default: | ||
167 | ret = -EINVAL; | ||
168 | break; | ||
169 | } | ||
170 | |||
171 | err_unlock: | ||
172 | kcmp_unlock(&task1->signal->cred_guard_mutex, | ||
173 | &task2->signal->cred_guard_mutex); | ||
174 | err: | ||
175 | put_task_struct(task1); | ||
176 | put_task_struct(task2); | ||
177 | |||
178 | return ret; | ||
179 | |||
180 | err_no_task: | ||
181 | rcu_read_unlock(); | ||
182 | return -ESRCH; | ||
183 | } | ||
184 | |||
185 | static __init int kcmp_cookies_init(void) | ||
186 | { | ||
187 | int i; | ||
188 | |||
189 | get_random_bytes(cookies, sizeof(cookies)); | ||
190 | |||
191 | for (i = 0; i < KCMP_TYPES; i++) | ||
192 | cookies[i][1] |= (~(~0UL >> 1) | 1); | ||
193 | |||
194 | return 0; | ||
195 | } | ||
196 | arch_initcall(kcmp_cookies_init); | ||
diff --git a/kernel/kmod.c b/kernel/kmod.c index 05698a7415fe..ff2c7cb86d77 100644 --- a/kernel/kmod.c +++ b/kernel/kmod.c | |||
@@ -221,13 +221,12 @@ fail: | |||
221 | return 0; | 221 | return 0; |
222 | } | 222 | } |
223 | 223 | ||
224 | void call_usermodehelper_freeinfo(struct subprocess_info *info) | 224 | static void call_usermodehelper_freeinfo(struct subprocess_info *info) |
225 | { | 225 | { |
226 | if (info->cleanup) | 226 | if (info->cleanup) |
227 | (*info->cleanup)(info); | 227 | (*info->cleanup)(info); |
228 | kfree(info); | 228 | kfree(info); |
229 | } | 229 | } |
230 | EXPORT_SYMBOL(call_usermodehelper_freeinfo); | ||
231 | 230 | ||
232 | static void umh_complete(struct subprocess_info *sub_info) | 231 | static void umh_complete(struct subprocess_info *sub_info) |
233 | { | 232 | { |
@@ -410,7 +409,7 @@ EXPORT_SYMBOL_GPL(usermodehelper_read_unlock); | |||
410 | 409 | ||
411 | /** | 410 | /** |
412 | * __usermodehelper_set_disable_depth - Modify usermodehelper_disabled. | 411 | * __usermodehelper_set_disable_depth - Modify usermodehelper_disabled. |
413 | * depth: New value to assign to usermodehelper_disabled. | 412 | * @depth: New value to assign to usermodehelper_disabled. |
414 | * | 413 | * |
415 | * Change the value of usermodehelper_disabled (under umhelper_sem locked for | 414 | * Change the value of usermodehelper_disabled (under umhelper_sem locked for |
416 | * writing) and wakeup tasks waiting for it to change. | 415 | * writing) and wakeup tasks waiting for it to change. |
@@ -479,6 +478,7 @@ static void helper_unlock(void) | |||
479 | * structure. This should be passed to call_usermodehelper_exec to | 478 | * structure. This should be passed to call_usermodehelper_exec to |
480 | * exec the process and free the structure. | 479 | * exec the process and free the structure. |
481 | */ | 480 | */ |
481 | static | ||
482 | struct subprocess_info *call_usermodehelper_setup(char *path, char **argv, | 482 | struct subprocess_info *call_usermodehelper_setup(char *path, char **argv, |
483 | char **envp, gfp_t gfp_mask) | 483 | char **envp, gfp_t gfp_mask) |
484 | { | 484 | { |
@@ -494,7 +494,6 @@ struct subprocess_info *call_usermodehelper_setup(char *path, char **argv, | |||
494 | out: | 494 | out: |
495 | return sub_info; | 495 | return sub_info; |
496 | } | 496 | } |
497 | EXPORT_SYMBOL(call_usermodehelper_setup); | ||
498 | 497 | ||
499 | /** | 498 | /** |
500 | * call_usermodehelper_setfns - set a cleanup/init function | 499 | * call_usermodehelper_setfns - set a cleanup/init function |
@@ -512,6 +511,7 @@ EXPORT_SYMBOL(call_usermodehelper_setup); | |||
512 | * Function must be runnable in either a process context or the | 511 | * Function must be runnable in either a process context or the |
513 | * context in which call_usermodehelper_exec is called. | 512 | * context in which call_usermodehelper_exec is called. |
514 | */ | 513 | */ |
514 | static | ||
515 | void call_usermodehelper_setfns(struct subprocess_info *info, | 515 | void call_usermodehelper_setfns(struct subprocess_info *info, |
516 | int (*init)(struct subprocess_info *info, struct cred *new), | 516 | int (*init)(struct subprocess_info *info, struct cred *new), |
517 | void (*cleanup)(struct subprocess_info *info), | 517 | void (*cleanup)(struct subprocess_info *info), |
@@ -521,7 +521,6 @@ void call_usermodehelper_setfns(struct subprocess_info *info, | |||
521 | info->init = init; | 521 | info->init = init; |
522 | info->data = data; | 522 | info->data = data; |
523 | } | 523 | } |
524 | EXPORT_SYMBOL(call_usermodehelper_setfns); | ||
525 | 524 | ||
526 | /** | 525 | /** |
527 | * call_usermodehelper_exec - start a usermode application | 526 | * call_usermodehelper_exec - start a usermode application |
@@ -535,6 +534,7 @@ EXPORT_SYMBOL(call_usermodehelper_setfns); | |||
535 | * asynchronously if wait is not set, and runs as a child of keventd. | 534 | * asynchronously if wait is not set, and runs as a child of keventd. |
536 | * (ie. it runs with full root capabilities). | 535 | * (ie. it runs with full root capabilities). |
537 | */ | 536 | */ |
537 | static | ||
538 | int call_usermodehelper_exec(struct subprocess_info *sub_info, int wait) | 538 | int call_usermodehelper_exec(struct subprocess_info *sub_info, int wait) |
539 | { | 539 | { |
540 | DECLARE_COMPLETION_ONSTACK(done); | 540 | DECLARE_COMPLETION_ONSTACK(done); |
@@ -576,7 +576,25 @@ unlock: | |||
576 | helper_unlock(); | 576 | helper_unlock(); |
577 | return retval; | 577 | return retval; |
578 | } | 578 | } |
579 | EXPORT_SYMBOL(call_usermodehelper_exec); | 579 | |
580 | int call_usermodehelper_fns( | ||
581 | char *path, char **argv, char **envp, int wait, | ||
582 | int (*init)(struct subprocess_info *info, struct cred *new), | ||
583 | void (*cleanup)(struct subprocess_info *), void *data) | ||
584 | { | ||
585 | struct subprocess_info *info; | ||
586 | gfp_t gfp_mask = (wait == UMH_NO_WAIT) ? GFP_ATOMIC : GFP_KERNEL; | ||
587 | |||
588 | info = call_usermodehelper_setup(path, argv, envp, gfp_mask); | ||
589 | |||
590 | if (info == NULL) | ||
591 | return -ENOMEM; | ||
592 | |||
593 | call_usermodehelper_setfns(info, init, cleanup, data); | ||
594 | |||
595 | return call_usermodehelper_exec(info, wait); | ||
596 | } | ||
597 | EXPORT_SYMBOL(call_usermodehelper_fns); | ||
580 | 598 | ||
581 | static int proc_cap_handler(struct ctl_table *table, int write, | 599 | static int proc_cap_handler(struct ctl_table *table, int write, |
582 | void __user *buffer, size_t *lenp, loff_t *ppos) | 600 | void __user *buffer, size_t *lenp, loff_t *ppos) |
diff --git a/kernel/pid_namespace.c b/kernel/pid_namespace.c index 57bc1fd35b3c..16b20e38c4a1 100644 --- a/kernel/pid_namespace.c +++ b/kernel/pid_namespace.c | |||
@@ -149,7 +149,12 @@ void zap_pid_ns_processes(struct pid_namespace *pid_ns) | |||
149 | { | 149 | { |
150 | int nr; | 150 | int nr; |
151 | int rc; | 151 | int rc; |
152 | struct task_struct *task; | 152 | struct task_struct *task, *me = current; |
153 | |||
154 | /* Ignore SIGCHLD causing any terminated children to autoreap */ | ||
155 | spin_lock_irq(&me->sighand->siglock); | ||
156 | me->sighand->action[SIGCHLD - 1].sa.sa_handler = SIG_IGN; | ||
157 | spin_unlock_irq(&me->sighand->siglock); | ||
153 | 158 | ||
154 | /* | 159 | /* |
155 | * The last thread in the cgroup-init thread group is terminating. | 160 | * The last thread in the cgroup-init thread group is terminating. |
@@ -191,6 +196,7 @@ void zap_pid_ns_processes(struct pid_namespace *pid_ns) | |||
191 | return; | 196 | return; |
192 | } | 197 | } |
193 | 198 | ||
199 | #ifdef CONFIG_CHECKPOINT_RESTORE | ||
194 | static int pid_ns_ctl_handler(struct ctl_table *table, int write, | 200 | static int pid_ns_ctl_handler(struct ctl_table *table, int write, |
195 | void __user *buffer, size_t *lenp, loff_t *ppos) | 201 | void __user *buffer, size_t *lenp, loff_t *ppos) |
196 | { | 202 | { |
@@ -218,8 +224,8 @@ static struct ctl_table pid_ns_ctl_table[] = { | |||
218 | }, | 224 | }, |
219 | { } | 225 | { } |
220 | }; | 226 | }; |
221 | |||
222 | static struct ctl_path kern_path[] = { { .procname = "kernel", }, { } }; | 227 | static struct ctl_path kern_path[] = { { .procname = "kernel", }, { } }; |
228 | #endif /* CONFIG_CHECKPOINT_RESTORE */ | ||
223 | 229 | ||
224 | int reboot_pid_ns(struct pid_namespace *pid_ns, int cmd) | 230 | int reboot_pid_ns(struct pid_namespace *pid_ns, int cmd) |
225 | { | 231 | { |
@@ -253,7 +259,10 @@ int reboot_pid_ns(struct pid_namespace *pid_ns, int cmd) | |||
253 | static __init int pid_namespaces_init(void) | 259 | static __init int pid_namespaces_init(void) |
254 | { | 260 | { |
255 | pid_ns_cachep = KMEM_CACHE(pid_namespace, SLAB_PANIC); | 261 | pid_ns_cachep = KMEM_CACHE(pid_namespace, SLAB_PANIC); |
262 | |||
263 | #ifdef CONFIG_CHECKPOINT_RESTORE | ||
256 | register_sysctl_paths(kern_path, pid_ns_ctl_table); | 264 | register_sysctl_paths(kern_path, pid_ns_ctl_table); |
265 | #endif | ||
257 | return 0; | 266 | return 0; |
258 | } | 267 | } |
259 | 268 | ||
diff --git a/kernel/resource.c b/kernel/resource.c index 7e8ea66a8c01..e1d2b8ee76d5 100644 --- a/kernel/resource.c +++ b/kernel/resource.c | |||
@@ -515,8 +515,8 @@ out: | |||
515 | * @root: root resource descriptor | 515 | * @root: root resource descriptor |
516 | * @new: resource descriptor desired by caller | 516 | * @new: resource descriptor desired by caller |
517 | * @size: requested resource region size | 517 | * @size: requested resource region size |
518 | * @min: minimum size to allocate | 518 | * @min: minimum boundary to allocate |
519 | * @max: maximum size to allocate | 519 | * @max: maximum boundary to allocate |
520 | * @align: alignment requested, in bytes | 520 | * @align: alignment requested, in bytes |
521 | * @alignf: alignment function, optional, called if not NULL | 521 | * @alignf: alignment function, optional, called if not NULL |
522 | * @alignf_data: arbitrary data to pass to the @alignf function | 522 | * @alignf_data: arbitrary data to pass to the @alignf function |
diff --git a/kernel/signal.c b/kernel/signal.c index f7b418217633..08dfbd748cd2 100644 --- a/kernel/signal.c +++ b/kernel/signal.c | |||
@@ -1656,19 +1656,18 @@ bool do_notify_parent(struct task_struct *tsk, int sig) | |||
1656 | info.si_signo = sig; | 1656 | info.si_signo = sig; |
1657 | info.si_errno = 0; | 1657 | info.si_errno = 0; |
1658 | /* | 1658 | /* |
1659 | * we are under tasklist_lock here so our parent is tied to | 1659 | * We are under tasklist_lock here so our parent is tied to |
1660 | * us and cannot exit and release its namespace. | 1660 | * us and cannot change. |
1661 | * | 1661 | * |
1662 | * the only it can is to switch its nsproxy with sys_unshare, | 1662 | * task_active_pid_ns will always return the same pid namespace |
1663 | * bu uncharing pid namespaces is not allowed, so we'll always | 1663 | * until a task passes through release_task. |
1664 | * see relevant namespace | ||
1665 | * | 1664 | * |
1666 | * write_lock() currently calls preempt_disable() which is the | 1665 | * write_lock() currently calls preempt_disable() which is the |
1667 | * same as rcu_read_lock(), but according to Oleg, this is not | 1666 | * same as rcu_read_lock(), but according to Oleg, this is not |
1668 | * correct to rely on this | 1667 | * correct to rely on this |
1669 | */ | 1668 | */ |
1670 | rcu_read_lock(); | 1669 | rcu_read_lock(); |
1671 | info.si_pid = task_pid_nr_ns(tsk, tsk->parent->nsproxy->pid_ns); | 1670 | info.si_pid = task_pid_nr_ns(tsk, task_active_pid_ns(tsk->parent)); |
1672 | info.si_uid = from_kuid_munged(task_cred_xxx(tsk->parent, user_ns), | 1671 | info.si_uid = from_kuid_munged(task_cred_xxx(tsk->parent, user_ns), |
1673 | task_uid(tsk)); | 1672 | task_uid(tsk)); |
1674 | rcu_read_unlock(); | 1673 | rcu_read_unlock(); |
diff --git a/kernel/sys.c b/kernel/sys.c index 6df42624e454..9ff89cb9657a 100644 --- a/kernel/sys.c +++ b/kernel/sys.c | |||
@@ -36,6 +36,8 @@ | |||
36 | #include <linux/personality.h> | 36 | #include <linux/personality.h> |
37 | #include <linux/ptrace.h> | 37 | #include <linux/ptrace.h> |
38 | #include <linux/fs_struct.h> | 38 | #include <linux/fs_struct.h> |
39 | #include <linux/file.h> | ||
40 | #include <linux/mount.h> | ||
39 | #include <linux/gfp.h> | 41 | #include <linux/gfp.h> |
40 | #include <linux/syscore_ops.h> | 42 | #include <linux/syscore_ops.h> |
41 | #include <linux/version.h> | 43 | #include <linux/version.h> |
@@ -1378,8 +1380,8 @@ SYSCALL_DEFINE2(sethostname, char __user *, name, int, len) | |||
1378 | memcpy(u->nodename, tmp, len); | 1380 | memcpy(u->nodename, tmp, len); |
1379 | memset(u->nodename + len, 0, sizeof(u->nodename) - len); | 1381 | memset(u->nodename + len, 0, sizeof(u->nodename) - len); |
1380 | errno = 0; | 1382 | errno = 0; |
1383 | uts_proc_notify(UTS_PROC_HOSTNAME); | ||
1381 | } | 1384 | } |
1382 | uts_proc_notify(UTS_PROC_HOSTNAME); | ||
1383 | up_write(&uts_sem); | 1385 | up_write(&uts_sem); |
1384 | return errno; | 1386 | return errno; |
1385 | } | 1387 | } |
@@ -1429,8 +1431,8 @@ SYSCALL_DEFINE2(setdomainname, char __user *, name, int, len) | |||
1429 | memcpy(u->domainname, tmp, len); | 1431 | memcpy(u->domainname, tmp, len); |
1430 | memset(u->domainname + len, 0, sizeof(u->domainname) - len); | 1432 | memset(u->domainname + len, 0, sizeof(u->domainname) - len); |
1431 | errno = 0; | 1433 | errno = 0; |
1434 | uts_proc_notify(UTS_PROC_DOMAINNAME); | ||
1432 | } | 1435 | } |
1433 | uts_proc_notify(UTS_PROC_DOMAINNAME); | ||
1434 | up_write(&uts_sem); | 1436 | up_write(&uts_sem); |
1435 | return errno; | 1437 | return errno; |
1436 | } | 1438 | } |
@@ -1784,77 +1786,102 @@ SYSCALL_DEFINE1(umask, int, mask) | |||
1784 | } | 1786 | } |
1785 | 1787 | ||
1786 | #ifdef CONFIG_CHECKPOINT_RESTORE | 1788 | #ifdef CONFIG_CHECKPOINT_RESTORE |
1789 | static bool vma_flags_mismatch(struct vm_area_struct *vma, | ||
1790 | unsigned long required, | ||
1791 | unsigned long banned) | ||
1792 | { | ||
1793 | return (vma->vm_flags & required) != required || | ||
1794 | (vma->vm_flags & banned); | ||
1795 | } | ||
1796 | |||
1797 | static int prctl_set_mm_exe_file(struct mm_struct *mm, unsigned int fd) | ||
1798 | { | ||
1799 | struct file *exe_file; | ||
1800 | struct dentry *dentry; | ||
1801 | int err; | ||
1802 | |||
1803 | /* | ||
1804 | * Setting new mm::exe_file is only allowed when no VM_EXECUTABLE vma's | ||
1805 | * remain. So perform a quick test first. | ||
1806 | */ | ||
1807 | if (mm->num_exe_file_vmas) | ||
1808 | return -EBUSY; | ||
1809 | |||
1810 | exe_file = fget(fd); | ||
1811 | if (!exe_file) | ||
1812 | return -EBADF; | ||
1813 | |||
1814 | dentry = exe_file->f_path.dentry; | ||
1815 | |||
1816 | /* | ||
1817 | * Because the original mm->exe_file points to executable file, make | ||
1818 | * sure that this one is executable as well, to avoid breaking an | ||
1819 | * overall picture. | ||
1820 | */ | ||
1821 | err = -EACCES; | ||
1822 | if (!S_ISREG(dentry->d_inode->i_mode) || | ||
1823 | exe_file->f_path.mnt->mnt_flags & MNT_NOEXEC) | ||
1824 | goto exit; | ||
1825 | |||
1826 | err = inode_permission(dentry->d_inode, MAY_EXEC); | ||
1827 | if (err) | ||
1828 | goto exit; | ||
1829 | |||
1830 | /* | ||
1831 | * The symlink can be changed only once, just to disallow arbitrary | ||
1832 | * transitions malicious software might bring in. This means one | ||
1833 | * could make a snapshot over all processes running and monitor | ||
1834 | * /proc/pid/exe changes to notice unusual activity if needed. | ||
1835 | */ | ||
1836 | down_write(&mm->mmap_sem); | ||
1837 | if (likely(!mm->exe_file)) | ||
1838 | set_mm_exe_file(mm, exe_file); | ||
1839 | else | ||
1840 | err = -EBUSY; | ||
1841 | up_write(&mm->mmap_sem); | ||
1842 | |||
1843 | exit: | ||
1844 | fput(exe_file); | ||
1845 | return err; | ||
1846 | } | ||
1847 | |||
1787 | static int prctl_set_mm(int opt, unsigned long addr, | 1848 | static int prctl_set_mm(int opt, unsigned long addr, |
1788 | unsigned long arg4, unsigned long arg5) | 1849 | unsigned long arg4, unsigned long arg5) |
1789 | { | 1850 | { |
1790 | unsigned long rlim = rlimit(RLIMIT_DATA); | 1851 | unsigned long rlim = rlimit(RLIMIT_DATA); |
1791 | unsigned long vm_req_flags; | ||
1792 | unsigned long vm_bad_flags; | ||
1793 | struct vm_area_struct *vma; | ||
1794 | int error = 0; | ||
1795 | struct mm_struct *mm = current->mm; | 1852 | struct mm_struct *mm = current->mm; |
1853 | struct vm_area_struct *vma; | ||
1854 | int error; | ||
1796 | 1855 | ||
1797 | if (arg4 | arg5) | 1856 | if (arg5 || (arg4 && opt != PR_SET_MM_AUXV)) |
1798 | return -EINVAL; | 1857 | return -EINVAL; |
1799 | 1858 | ||
1800 | if (!capable(CAP_SYS_RESOURCE)) | 1859 | if (!capable(CAP_SYS_RESOURCE)) |
1801 | return -EPERM; | 1860 | return -EPERM; |
1802 | 1861 | ||
1862 | if (opt == PR_SET_MM_EXE_FILE) | ||
1863 | return prctl_set_mm_exe_file(mm, (unsigned int)addr); | ||
1864 | |||
1803 | if (addr >= TASK_SIZE) | 1865 | if (addr >= TASK_SIZE) |
1804 | return -EINVAL; | 1866 | return -EINVAL; |
1805 | 1867 | ||
1868 | error = -EINVAL; | ||
1869 | |||
1806 | down_read(&mm->mmap_sem); | 1870 | down_read(&mm->mmap_sem); |
1807 | vma = find_vma(mm, addr); | 1871 | vma = find_vma(mm, addr); |
1808 | 1872 | ||
1809 | if (opt != PR_SET_MM_START_BRK && opt != PR_SET_MM_BRK) { | ||
1810 | /* It must be existing VMA */ | ||
1811 | if (!vma || vma->vm_start > addr) | ||
1812 | goto out; | ||
1813 | } | ||
1814 | |||
1815 | error = -EINVAL; | ||
1816 | switch (opt) { | 1873 | switch (opt) { |
1817 | case PR_SET_MM_START_CODE: | 1874 | case PR_SET_MM_START_CODE: |
1875 | mm->start_code = addr; | ||
1876 | break; | ||
1818 | case PR_SET_MM_END_CODE: | 1877 | case PR_SET_MM_END_CODE: |
1819 | vm_req_flags = VM_READ | VM_EXEC; | 1878 | mm->end_code = addr; |
1820 | vm_bad_flags = VM_WRITE | VM_MAYSHARE; | ||
1821 | |||
1822 | if ((vma->vm_flags & vm_req_flags) != vm_req_flags || | ||
1823 | (vma->vm_flags & vm_bad_flags)) | ||
1824 | goto out; | ||
1825 | |||
1826 | if (opt == PR_SET_MM_START_CODE) | ||
1827 | mm->start_code = addr; | ||
1828 | else | ||
1829 | mm->end_code = addr; | ||
1830 | break; | 1879 | break; |
1831 | |||
1832 | case PR_SET_MM_START_DATA: | 1880 | case PR_SET_MM_START_DATA: |
1833 | case PR_SET_MM_END_DATA: | 1881 | mm->start_data = addr; |
1834 | vm_req_flags = VM_READ | VM_WRITE; | ||
1835 | vm_bad_flags = VM_EXEC | VM_MAYSHARE; | ||
1836 | |||
1837 | if ((vma->vm_flags & vm_req_flags) != vm_req_flags || | ||
1838 | (vma->vm_flags & vm_bad_flags)) | ||
1839 | goto out; | ||
1840 | |||
1841 | if (opt == PR_SET_MM_START_DATA) | ||
1842 | mm->start_data = addr; | ||
1843 | else | ||
1844 | mm->end_data = addr; | ||
1845 | break; | 1882 | break; |
1846 | 1883 | case PR_SET_MM_END_DATA: | |
1847 | case PR_SET_MM_START_STACK: | 1884 | mm->end_data = addr; |
1848 | |||
1849 | #ifdef CONFIG_STACK_GROWSUP | ||
1850 | vm_req_flags = VM_READ | VM_WRITE | VM_GROWSUP; | ||
1851 | #else | ||
1852 | vm_req_flags = VM_READ | VM_WRITE | VM_GROWSDOWN; | ||
1853 | #endif | ||
1854 | if ((vma->vm_flags & vm_req_flags) != vm_req_flags) | ||
1855 | goto out; | ||
1856 | |||
1857 | mm->start_stack = addr; | ||
1858 | break; | 1885 | break; |
1859 | 1886 | ||
1860 | case PR_SET_MM_START_BRK: | 1887 | case PR_SET_MM_START_BRK: |
@@ -1881,16 +1908,77 @@ static int prctl_set_mm(int opt, unsigned long addr, | |||
1881 | mm->brk = addr; | 1908 | mm->brk = addr; |
1882 | break; | 1909 | break; |
1883 | 1910 | ||
1911 | /* | ||
1912 | * If command line arguments and environment | ||
1913 | * are placed somewhere else on stack, we can | ||
1914 | * set them up here, ARG_START/END to setup | ||
1915 | * command line argumets and ENV_START/END | ||
1916 | * for environment. | ||
1917 | */ | ||
1918 | case PR_SET_MM_START_STACK: | ||
1919 | case PR_SET_MM_ARG_START: | ||
1920 | case PR_SET_MM_ARG_END: | ||
1921 | case PR_SET_MM_ENV_START: | ||
1922 | case PR_SET_MM_ENV_END: | ||
1923 | if (!vma) { | ||
1924 | error = -EFAULT; | ||
1925 | goto out; | ||
1926 | } | ||
1927 | #ifdef CONFIG_STACK_GROWSUP | ||
1928 | if (vma_flags_mismatch(vma, VM_READ | VM_WRITE | VM_GROWSUP, 0)) | ||
1929 | #else | ||
1930 | if (vma_flags_mismatch(vma, VM_READ | VM_WRITE | VM_GROWSDOWN, 0)) | ||
1931 | #endif | ||
1932 | goto out; | ||
1933 | if (opt == PR_SET_MM_START_STACK) | ||
1934 | mm->start_stack = addr; | ||
1935 | else if (opt == PR_SET_MM_ARG_START) | ||
1936 | mm->arg_start = addr; | ||
1937 | else if (opt == PR_SET_MM_ARG_END) | ||
1938 | mm->arg_end = addr; | ||
1939 | else if (opt == PR_SET_MM_ENV_START) | ||
1940 | mm->env_start = addr; | ||
1941 | else if (opt == PR_SET_MM_ENV_END) | ||
1942 | mm->env_end = addr; | ||
1943 | break; | ||
1944 | |||
1945 | /* | ||
1946 | * This doesn't move auxiliary vector itself | ||
1947 | * since it's pinned to mm_struct, but allow | ||
1948 | * to fill vector with new values. It's up | ||
1949 | * to a caller to provide sane values here | ||
1950 | * otherwise user space tools which use this | ||
1951 | * vector might be unhappy. | ||
1952 | */ | ||
1953 | case PR_SET_MM_AUXV: { | ||
1954 | unsigned long user_auxv[AT_VECTOR_SIZE]; | ||
1955 | |||
1956 | if (arg4 > sizeof(user_auxv)) | ||
1957 | goto out; | ||
1958 | up_read(&mm->mmap_sem); | ||
1959 | |||
1960 | if (copy_from_user(user_auxv, (const void __user *)addr, arg4)) | ||
1961 | return -EFAULT; | ||
1962 | |||
1963 | /* Make sure the last entry is always AT_NULL */ | ||
1964 | user_auxv[AT_VECTOR_SIZE - 2] = 0; | ||
1965 | user_auxv[AT_VECTOR_SIZE - 1] = 0; | ||
1966 | |||
1967 | BUILD_BUG_ON(sizeof(user_auxv) != sizeof(mm->saved_auxv)); | ||
1968 | |||
1969 | task_lock(current); | ||
1970 | memcpy(mm->saved_auxv, user_auxv, arg4); | ||
1971 | task_unlock(current); | ||
1972 | |||
1973 | return 0; | ||
1974 | } | ||
1884 | default: | 1975 | default: |
1885 | error = -EINVAL; | ||
1886 | goto out; | 1976 | goto out; |
1887 | } | 1977 | } |
1888 | 1978 | ||
1889 | error = 0; | 1979 | error = 0; |
1890 | |||
1891 | out: | 1980 | out: |
1892 | up_read(&mm->mmap_sem); | 1981 | up_read(&mm->mmap_sem); |
1893 | |||
1894 | return error; | 1982 | return error; |
1895 | } | 1983 | } |
1896 | #else /* CONFIG_CHECKPOINT_RESTORE */ | 1984 | #else /* CONFIG_CHECKPOINT_RESTORE */ |
@@ -2114,7 +2202,6 @@ int orderly_poweroff(bool force) | |||
2114 | NULL | 2202 | NULL |
2115 | }; | 2203 | }; |
2116 | int ret = -ENOMEM; | 2204 | int ret = -ENOMEM; |
2117 | struct subprocess_info *info; | ||
2118 | 2205 | ||
2119 | if (argv == NULL) { | 2206 | if (argv == NULL) { |
2120 | printk(KERN_WARNING "%s failed to allocate memory for \"%s\"\n", | 2207 | printk(KERN_WARNING "%s failed to allocate memory for \"%s\"\n", |
@@ -2122,18 +2209,16 @@ int orderly_poweroff(bool force) | |||
2122 | goto out; | 2209 | goto out; |
2123 | } | 2210 | } |
2124 | 2211 | ||
2125 | info = call_usermodehelper_setup(argv[0], argv, envp, GFP_ATOMIC); | 2212 | ret = call_usermodehelper_fns(argv[0], argv, envp, UMH_NO_WAIT, |
2126 | if (info == NULL) { | 2213 | NULL, argv_cleanup, NULL); |
2127 | argv_free(argv); | 2214 | out: |
2128 | goto out; | 2215 | if (likely(!ret)) |
2129 | } | 2216 | return 0; |
2130 | |||
2131 | call_usermodehelper_setfns(info, NULL, argv_cleanup, NULL); | ||
2132 | 2217 | ||
2133 | ret = call_usermodehelper_exec(info, UMH_NO_WAIT); | 2218 | if (ret == -ENOMEM) |
2219 | argv_free(argv); | ||
2134 | 2220 | ||
2135 | out: | 2221 | if (force) { |
2136 | if (ret && force) { | ||
2137 | printk(KERN_WARNING "Failed to start orderly shutdown: " | 2222 | printk(KERN_WARNING "Failed to start orderly shutdown: " |
2138 | "forcing the issue\n"); | 2223 | "forcing the issue\n"); |
2139 | 2224 | ||
diff --git a/kernel/sys_ni.c b/kernel/sys_ni.c index 47bfa16430d7..dbff751e4086 100644 --- a/kernel/sys_ni.c +++ b/kernel/sys_ni.c | |||
@@ -203,3 +203,6 @@ cond_syscall(sys_fanotify_mark); | |||
203 | cond_syscall(sys_name_to_handle_at); | 203 | cond_syscall(sys_name_to_handle_at); |
204 | cond_syscall(sys_open_by_handle_at); | 204 | cond_syscall(sys_open_by_handle_at); |
205 | cond_syscall(compat_sys_open_by_handle_at); | 205 | cond_syscall(compat_sys_open_by_handle_at); |
206 | |||
207 | /* compare kernel pointers */ | ||
208 | cond_syscall(sys_kcmp); | ||
diff --git a/lib/vsprintf.c b/lib/vsprintf.c index 5391299c1e78..c3f36d415bdf 100644 --- a/lib/vsprintf.c +++ b/lib/vsprintf.c | |||
@@ -112,106 +112,199 @@ int skip_atoi(const char **s) | |||
112 | /* Decimal conversion is by far the most typical, and is used | 112 | /* Decimal conversion is by far the most typical, and is used |
113 | * for /proc and /sys data. This directly impacts e.g. top performance | 113 | * for /proc and /sys data. This directly impacts e.g. top performance |
114 | * with many processes running. We optimize it for speed | 114 | * with many processes running. We optimize it for speed |
115 | * using code from | 115 | * using ideas described at <http://www.cs.uiowa.edu/~jones/bcd/divide.html> |
116 | * http://www.cs.uiowa.edu/~jones/bcd/decimal.html | 116 | * (with permission from the author, Douglas W. Jones). |
117 | * (with permission from the author, Douglas W. Jones). */ | 117 | */ |
118 | 118 | ||
119 | /* Formats correctly any integer in [0,99999]. | 119 | #if BITS_PER_LONG != 32 || BITS_PER_LONG_LONG != 64 |
120 | * Outputs from one to five digits depending on input. | 120 | /* Formats correctly any integer in [0, 999999999] */ |
121 | * On i386 gcc 4.1.2 -O2: ~250 bytes of code. */ | ||
122 | static noinline_for_stack | 121 | static noinline_for_stack |
123 | char *put_dec_trunc(char *buf, unsigned q) | 122 | char *put_dec_full9(char *buf, unsigned q) |
124 | { | 123 | { |
125 | unsigned d3, d2, d1, d0; | 124 | unsigned r; |
126 | d1 = (q>>4) & 0xf; | ||
127 | d2 = (q>>8) & 0xf; | ||
128 | d3 = (q>>12); | ||
129 | |||
130 | d0 = 6*(d3 + d2 + d1) + (q & 0xf); | ||
131 | q = (d0 * 0xcd) >> 11; | ||
132 | d0 = d0 - 10*q; | ||
133 | *buf++ = d0 + '0'; /* least significant digit */ | ||
134 | d1 = q + 9*d3 + 5*d2 + d1; | ||
135 | if (d1 != 0) { | ||
136 | q = (d1 * 0xcd) >> 11; | ||
137 | d1 = d1 - 10*q; | ||
138 | *buf++ = d1 + '0'; /* next digit */ | ||
139 | |||
140 | d2 = q + 2*d2; | ||
141 | if ((d2 != 0) || (d3 != 0)) { | ||
142 | q = (d2 * 0xd) >> 7; | ||
143 | d2 = d2 - 10*q; | ||
144 | *buf++ = d2 + '0'; /* next digit */ | ||
145 | |||
146 | d3 = q + 4*d3; | ||
147 | if (d3 != 0) { | ||
148 | q = (d3 * 0xcd) >> 11; | ||
149 | d3 = d3 - 10*q; | ||
150 | *buf++ = d3 + '0'; /* next digit */ | ||
151 | if (q != 0) | ||
152 | *buf++ = q + '0'; /* most sign. digit */ | ||
153 | } | ||
154 | } | ||
155 | } | ||
156 | 125 | ||
126 | /* | ||
127 | * Possible ways to approx. divide by 10 | ||
128 | * (x * 0x1999999a) >> 32 x < 1073741829 (multiply must be 64-bit) | ||
129 | * (x * 0xcccd) >> 19 x < 81920 (x < 262149 when 64-bit mul) | ||
130 | * (x * 0x6667) >> 18 x < 43699 | ||
131 | * (x * 0x3334) >> 17 x < 16389 | ||
132 | * (x * 0x199a) >> 16 x < 16389 | ||
133 | * (x * 0x0ccd) >> 15 x < 16389 | ||
134 | * (x * 0x0667) >> 14 x < 2739 | ||
135 | * (x * 0x0334) >> 13 x < 1029 | ||
136 | * (x * 0x019a) >> 12 x < 1029 | ||
137 | * (x * 0x00cd) >> 11 x < 1029 shorter code than * 0x67 (on i386) | ||
138 | * (x * 0x0067) >> 10 x < 179 | ||
139 | * (x * 0x0034) >> 9 x < 69 same | ||
140 | * (x * 0x001a) >> 8 x < 69 same | ||
141 | * (x * 0x000d) >> 7 x < 69 same, shortest code (on i386) | ||
142 | * (x * 0x0007) >> 6 x < 19 | ||
143 | * See <http://www.cs.uiowa.edu/~jones/bcd/divide.html> | ||
144 | */ | ||
145 | r = (q * (uint64_t)0x1999999a) >> 32; | ||
146 | *buf++ = (q - 10 * r) + '0'; /* 1 */ | ||
147 | q = (r * (uint64_t)0x1999999a) >> 32; | ||
148 | *buf++ = (r - 10 * q) + '0'; /* 2 */ | ||
149 | r = (q * (uint64_t)0x1999999a) >> 32; | ||
150 | *buf++ = (q - 10 * r) + '0'; /* 3 */ | ||
151 | q = (r * (uint64_t)0x1999999a) >> 32; | ||
152 | *buf++ = (r - 10 * q) + '0'; /* 4 */ | ||
153 | r = (q * (uint64_t)0x1999999a) >> 32; | ||
154 | *buf++ = (q - 10 * r) + '0'; /* 5 */ | ||
155 | /* Now value is under 10000, can avoid 64-bit multiply */ | ||
156 | q = (r * 0x199a) >> 16; | ||
157 | *buf++ = (r - 10 * q) + '0'; /* 6 */ | ||
158 | r = (q * 0xcd) >> 11; | ||
159 | *buf++ = (q - 10 * r) + '0'; /* 7 */ | ||
160 | q = (r * 0xcd) >> 11; | ||
161 | *buf++ = (r - 10 * q) + '0'; /* 8 */ | ||
162 | *buf++ = q + '0'; /* 9 */ | ||
157 | return buf; | 163 | return buf; |
158 | } | 164 | } |
159 | /* Same with if's removed. Always emits five digits */ | 165 | #endif |
166 | |||
167 | /* Similar to above but do not pad with zeros. | ||
168 | * Code can be easily arranged to print 9 digits too, but our callers | ||
169 | * always call put_dec_full9() instead when the number has 9 decimal digits. | ||
170 | */ | ||
160 | static noinline_for_stack | 171 | static noinline_for_stack |
161 | char *put_dec_full(char *buf, unsigned q) | 172 | char *put_dec_trunc8(char *buf, unsigned r) |
162 | { | 173 | { |
163 | /* BTW, if q is in [0,9999], 8-bit ints will be enough, */ | 174 | unsigned q; |
164 | /* but anyway, gcc produces better code with full-sized ints */ | 175 | |
165 | unsigned d3, d2, d1, d0; | 176 | /* Copy of previous function's body with added early returns */ |
166 | d1 = (q>>4) & 0xf; | 177 | q = (r * (uint64_t)0x1999999a) >> 32; |
167 | d2 = (q>>8) & 0xf; | 178 | *buf++ = (r - 10 * q) + '0'; /* 2 */ |
168 | d3 = (q>>12); | 179 | if (q == 0) |
180 | return buf; | ||
181 | r = (q * (uint64_t)0x1999999a) >> 32; | ||
182 | *buf++ = (q - 10 * r) + '0'; /* 3 */ | ||
183 | if (r == 0) | ||
184 | return buf; | ||
185 | q = (r * (uint64_t)0x1999999a) >> 32; | ||
186 | *buf++ = (r - 10 * q) + '0'; /* 4 */ | ||
187 | if (q == 0) | ||
188 | return buf; | ||
189 | r = (q * (uint64_t)0x1999999a) >> 32; | ||
190 | *buf++ = (q - 10 * r) + '0'; /* 5 */ | ||
191 | if (r == 0) | ||
192 | return buf; | ||
193 | q = (r * 0x199a) >> 16; | ||
194 | *buf++ = (r - 10 * q) + '0'; /* 6 */ | ||
195 | if (q == 0) | ||
196 | return buf; | ||
197 | r = (q * 0xcd) >> 11; | ||
198 | *buf++ = (q - 10 * r) + '0'; /* 7 */ | ||
199 | if (r == 0) | ||
200 | return buf; | ||
201 | q = (r * 0xcd) >> 11; | ||
202 | *buf++ = (r - 10 * q) + '0'; /* 8 */ | ||
203 | if (q == 0) | ||
204 | return buf; | ||
205 | *buf++ = q + '0'; /* 9 */ | ||
206 | return buf; | ||
207 | } | ||
169 | 208 | ||
170 | /* | 209 | /* There are two algorithms to print larger numbers. |
171 | * Possible ways to approx. divide by 10 | 210 | * One is generic: divide by 1000000000 and repeatedly print |
172 | * gcc -O2 replaces multiply with shifts and adds | 211 | * groups of (up to) 9 digits. It's conceptually simple, |
173 | * (x * 0xcd) >> 11: 11001101 - shorter code than * 0x67 (on i386) | 212 | * but requires a (unsigned long long) / 1000000000 division. |
174 | * (x * 0x67) >> 10: 1100111 | 213 | * |
175 | * (x * 0x34) >> 9: 110100 - same | 214 | * Second algorithm splits 64-bit unsigned long long into 16-bit chunks, |
176 | * (x * 0x1a) >> 8: 11010 - same | 215 | * manipulates them cleverly and generates groups of 4 decimal digits. |
177 | * (x * 0x0d) >> 7: 1101 - same, shortest code (on i386) | 216 | * It so happens that it does NOT require long long division. |
178 | */ | 217 | * |
179 | d0 = 6*(d3 + d2 + d1) + (q & 0xf); | 218 | * If long is > 32 bits, division of 64-bit values is relatively easy, |
180 | q = (d0 * 0xcd) >> 11; | 219 | * and we will use the first algorithm. |
181 | d0 = d0 - 10*q; | 220 | * If long long is > 64 bits (strange architecture with VERY large long long), |
182 | *buf++ = d0 + '0'; | 221 | * second algorithm can't be used, and we again use the first one. |
183 | d1 = q + 9*d3 + 5*d2 + d1; | 222 | * |
184 | q = (d1 * 0xcd) >> 11; | 223 | * Else (if long is 32 bits and long long is 64 bits) we use second one. |
185 | d1 = d1 - 10*q; | 224 | */ |
186 | *buf++ = d1 + '0'; | ||
187 | |||
188 | d2 = q + 2*d2; | ||
189 | q = (d2 * 0xd) >> 7; | ||
190 | d2 = d2 - 10*q; | ||
191 | *buf++ = d2 + '0'; | ||
192 | |||
193 | d3 = q + 4*d3; | ||
194 | q = (d3 * 0xcd) >> 11; /* - shorter code */ | ||
195 | /* q = (d3 * 0x67) >> 10; - would also work */ | ||
196 | d3 = d3 - 10*q; | ||
197 | *buf++ = d3 + '0'; | ||
198 | *buf++ = q + '0'; | ||
199 | 225 | ||
200 | return buf; | 226 | #if BITS_PER_LONG != 32 || BITS_PER_LONG_LONG != 64 |
227 | |||
228 | /* First algorithm: generic */ | ||
229 | |||
230 | static | ||
231 | char *put_dec(char *buf, unsigned long long n) | ||
232 | { | ||
233 | if (n >= 100*1000*1000) { | ||
234 | while (n >= 1000*1000*1000) | ||
235 | buf = put_dec_full9(buf, do_div(n, 1000*1000*1000)); | ||
236 | if (n >= 100*1000*1000) | ||
237 | return put_dec_full9(buf, n); | ||
238 | } | ||
239 | return put_dec_trunc8(buf, n); | ||
201 | } | 240 | } |
202 | /* No inlining helps gcc to use registers better */ | 241 | |
242 | #else | ||
243 | |||
244 | /* Second algorithm: valid only for 64-bit long longs */ | ||
245 | |||
203 | static noinline_for_stack | 246 | static noinline_for_stack |
204 | char *put_dec(char *buf, unsigned long long num) | 247 | char *put_dec_full4(char *buf, unsigned q) |
205 | { | 248 | { |
206 | while (1) { | 249 | unsigned r; |
207 | unsigned rem; | 250 | r = (q * 0xcccd) >> 19; |
208 | if (num < 100000) | 251 | *buf++ = (q - 10 * r) + '0'; |
209 | return put_dec_trunc(buf, num); | 252 | q = (r * 0x199a) >> 16; |
210 | rem = do_div(num, 100000); | 253 | *buf++ = (r - 10 * q) + '0'; |
211 | buf = put_dec_full(buf, rem); | 254 | r = (q * 0xcd) >> 11; |
212 | } | 255 | *buf++ = (q - 10 * r) + '0'; |
256 | *buf++ = r + '0'; | ||
257 | return buf; | ||
213 | } | 258 | } |
214 | 259 | ||
260 | /* Based on code by Douglas W. Jones found at | ||
261 | * <http://www.cs.uiowa.edu/~jones/bcd/decimal.html#sixtyfour> | ||
262 | * (with permission from the author). | ||
263 | * Performs no 64-bit division and hence should be fast on 32-bit machines. | ||
264 | */ | ||
265 | static | ||
266 | char *put_dec(char *buf, unsigned long long n) | ||
267 | { | ||
268 | uint32_t d3, d2, d1, q, h; | ||
269 | |||
270 | if (n < 100*1000*1000) | ||
271 | return put_dec_trunc8(buf, n); | ||
272 | |||
273 | d1 = ((uint32_t)n >> 16); /* implicit "& 0xffff" */ | ||
274 | h = (n >> 32); | ||
275 | d2 = (h ) & 0xffff; | ||
276 | d3 = (h >> 16); /* implicit "& 0xffff" */ | ||
277 | |||
278 | q = 656 * d3 + 7296 * d2 + 5536 * d1 + ((uint32_t)n & 0xffff); | ||
279 | |||
280 | buf = put_dec_full4(buf, q % 10000); | ||
281 | q = q / 10000; | ||
282 | |||
283 | d1 = q + 7671 * d3 + 9496 * d2 + 6 * d1; | ||
284 | buf = put_dec_full4(buf, d1 % 10000); | ||
285 | q = d1 / 10000; | ||
286 | |||
287 | d2 = q + 4749 * d3 + 42 * d2; | ||
288 | buf = put_dec_full4(buf, d2 % 10000); | ||
289 | q = d2 / 10000; | ||
290 | |||
291 | d3 = q + 281 * d3; | ||
292 | if (!d3) | ||
293 | goto done; | ||
294 | buf = put_dec_full4(buf, d3 % 10000); | ||
295 | q = d3 / 10000; | ||
296 | if (!q) | ||
297 | goto done; | ||
298 | buf = put_dec_full4(buf, q); | ||
299 | done: | ||
300 | while (buf[-1] == '0') | ||
301 | --buf; | ||
302 | |||
303 | return buf; | ||
304 | } | ||
305 | |||
306 | #endif | ||
307 | |||
215 | /* | 308 | /* |
216 | * Convert passed number to decimal string. | 309 | * Convert passed number to decimal string. |
217 | * Returns the length of string. On buffer overflow, returns 0. | 310 | * Returns the length of string. On buffer overflow, returns 0. |
@@ -220,16 +313,22 @@ char *put_dec(char *buf, unsigned long long num) | |||
220 | */ | 313 | */ |
221 | int num_to_str(char *buf, int size, unsigned long long num) | 314 | int num_to_str(char *buf, int size, unsigned long long num) |
222 | { | 315 | { |
223 | char tmp[21]; /* Enough for 2^64 in decimal */ | 316 | char tmp[sizeof(num) * 3]; |
224 | int idx, len; | 317 | int idx, len; |
225 | 318 | ||
226 | len = put_dec(tmp, num) - tmp; | 319 | /* put_dec() may work incorrectly for num = 0 (generate "", not "0") */ |
320 | if (num <= 9) { | ||
321 | tmp[0] = '0' + num; | ||
322 | len = 1; | ||
323 | } else { | ||
324 | len = put_dec(tmp, num) - tmp; | ||
325 | } | ||
227 | 326 | ||
228 | if (len > size) | 327 | if (len > size) |
229 | return 0; | 328 | return 0; |
230 | for (idx = 0; idx < len; ++idx) | 329 | for (idx = 0; idx < len; ++idx) |
231 | buf[idx] = tmp[len - idx - 1]; | 330 | buf[idx] = tmp[len - idx - 1]; |
232 | return len; | 331 | return len; |
233 | } | 332 | } |
234 | 333 | ||
235 | #define ZEROPAD 1 /* pad with zero */ | 334 | #define ZEROPAD 1 /* pad with zero */ |
@@ -314,8 +413,8 @@ char *number(char *buf, char *end, unsigned long long num, | |||
314 | 413 | ||
315 | /* generate full string in tmp[], in reverse order */ | 414 | /* generate full string in tmp[], in reverse order */ |
316 | i = 0; | 415 | i = 0; |
317 | if (num == 0) | 416 | if (num < spec.base) |
318 | tmp[i++] = '0'; | 417 | tmp[i++] = digits[num] | locase; |
319 | /* Generic code, for any base: | 418 | /* Generic code, for any base: |
320 | else do { | 419 | else do { |
321 | tmp[i++] = (digits[do_div(num,base)] | locase); | 420 | tmp[i++] = (digits[do_div(num,base)] | locase); |
@@ -611,7 +710,7 @@ char *ip4_string(char *p, const u8 *addr, const char *fmt) | |||
611 | } | 710 | } |
612 | for (i = 0; i < 4; i++) { | 711 | for (i = 0; i < 4; i++) { |
613 | char temp[3]; /* hold each IP quad in reverse order */ | 712 | char temp[3]; /* hold each IP quad in reverse order */ |
614 | int digits = put_dec_trunc(temp, addr[index]) - temp; | 713 | int digits = put_dec_trunc8(temp, addr[index]) - temp; |
615 | if (leading_zeros) { | 714 | if (leading_zeros) { |
616 | if (digits < 3) | 715 | if (digits < 3) |
617 | *p++ = '0'; | 716 | *p++ = '0'; |
@@ -870,13 +969,15 @@ static noinline_for_stack | |||
870 | char *pointer(const char *fmt, char *buf, char *end, void *ptr, | 969 | char *pointer(const char *fmt, char *buf, char *end, void *ptr, |
871 | struct printf_spec spec) | 970 | struct printf_spec spec) |
872 | { | 971 | { |
972 | int default_width = 2 * sizeof(void *) + (spec.flags & SPECIAL ? 2 : 0); | ||
973 | |||
873 | if (!ptr && *fmt != 'K') { | 974 | if (!ptr && *fmt != 'K') { |
874 | /* | 975 | /* |
875 | * Print (null) with the same width as a pointer so it makes | 976 | * Print (null) with the same width as a pointer so it makes |
876 | * tabular output look nice. | 977 | * tabular output look nice. |
877 | */ | 978 | */ |
878 | if (spec.field_width == -1) | 979 | if (spec.field_width == -1) |
879 | spec.field_width = 2 * sizeof(void *); | 980 | spec.field_width = default_width; |
880 | return string(buf, end, "(null)", spec); | 981 | return string(buf, end, "(null)", spec); |
881 | } | 982 | } |
882 | 983 | ||
@@ -931,7 +1032,7 @@ char *pointer(const char *fmt, char *buf, char *end, void *ptr, | |||
931 | */ | 1032 | */ |
932 | if (in_irq() || in_serving_softirq() || in_nmi()) { | 1033 | if (in_irq() || in_serving_softirq() || in_nmi()) { |
933 | if (spec.field_width == -1) | 1034 | if (spec.field_width == -1) |
934 | spec.field_width = 2 * sizeof(void *); | 1035 | spec.field_width = default_width; |
935 | return string(buf, end, "pK-error", spec); | 1036 | return string(buf, end, "pK-error", spec); |
936 | } | 1037 | } |
937 | if (!((kptr_restrict == 0) || | 1038 | if (!((kptr_restrict == 0) || |
@@ -948,7 +1049,7 @@ char *pointer(const char *fmt, char *buf, char *end, void *ptr, | |||
948 | } | 1049 | } |
949 | spec.flags |= SMALL; | 1050 | spec.flags |= SMALL; |
950 | if (spec.field_width == -1) { | 1051 | if (spec.field_width == -1) { |
951 | spec.field_width = 2 * sizeof(void *); | 1052 | spec.field_width = default_width; |
952 | spec.flags |= ZEROPAD; | 1053 | spec.flags |= ZEROPAD; |
953 | } | 1054 | } |
954 | spec.base = 16; | 1055 | spec.base = 16; |
diff --git a/mm/process_vm_access.c b/mm/process_vm_access.c index c20ff48994c2..926b46649749 100644 --- a/mm/process_vm_access.c +++ b/mm/process_vm_access.c | |||
@@ -371,15 +371,15 @@ static ssize_t process_vm_rw(pid_t pid, | |||
371 | /* Check iovecs */ | 371 | /* Check iovecs */ |
372 | if (vm_write) | 372 | if (vm_write) |
373 | rc = rw_copy_check_uvector(WRITE, lvec, liovcnt, UIO_FASTIOV, | 373 | rc = rw_copy_check_uvector(WRITE, lvec, liovcnt, UIO_FASTIOV, |
374 | iovstack_l, &iov_l, 1); | 374 | iovstack_l, &iov_l); |
375 | else | 375 | else |
376 | rc = rw_copy_check_uvector(READ, lvec, liovcnt, UIO_FASTIOV, | 376 | rc = rw_copy_check_uvector(READ, lvec, liovcnt, UIO_FASTIOV, |
377 | iovstack_l, &iov_l, 1); | 377 | iovstack_l, &iov_l); |
378 | if (rc <= 0) | 378 | if (rc <= 0) |
379 | goto free_iovecs; | 379 | goto free_iovecs; |
380 | 380 | ||
381 | rc = rw_copy_check_uvector(READ, rvec, riovcnt, UIO_FASTIOV, | 381 | rc = rw_copy_check_uvector(CHECK_IOVEC_ONLY, rvec, riovcnt, UIO_FASTIOV, |
382 | iovstack_r, &iov_r, 0); | 382 | iovstack_r, &iov_r); |
383 | if (rc <= 0) | 383 | if (rc <= 0) |
384 | goto free_iovecs; | 384 | goto free_iovecs; |
385 | 385 | ||
@@ -438,16 +438,16 @@ compat_process_vm_rw(compat_pid_t pid, | |||
438 | if (vm_write) | 438 | if (vm_write) |
439 | rc = compat_rw_copy_check_uvector(WRITE, lvec, liovcnt, | 439 | rc = compat_rw_copy_check_uvector(WRITE, lvec, liovcnt, |
440 | UIO_FASTIOV, iovstack_l, | 440 | UIO_FASTIOV, iovstack_l, |
441 | &iov_l, 1); | 441 | &iov_l); |
442 | else | 442 | else |
443 | rc = compat_rw_copy_check_uvector(READ, lvec, liovcnt, | 443 | rc = compat_rw_copy_check_uvector(READ, lvec, liovcnt, |
444 | UIO_FASTIOV, iovstack_l, | 444 | UIO_FASTIOV, iovstack_l, |
445 | &iov_l, 1); | 445 | &iov_l); |
446 | if (rc <= 0) | 446 | if (rc <= 0) |
447 | goto free_iovecs; | 447 | goto free_iovecs; |
448 | rc = compat_rw_copy_check_uvector(READ, rvec, riovcnt, | 448 | rc = compat_rw_copy_check_uvector(CHECK_IOVEC_ONLY, rvec, riovcnt, |
449 | UIO_FASTIOV, iovstack_r, | 449 | UIO_FASTIOV, iovstack_r, |
450 | &iov_r, 0); | 450 | &iov_r); |
451 | if (rc <= 0) | 451 | if (rc <= 0) |
452 | goto free_iovecs; | 452 | goto free_iovecs; |
453 | 453 | ||
diff --git a/scripts/checkpatch.pl b/scripts/checkpatch.pl index faea0ec612bf..e5bd60ff48e3 100755 --- a/scripts/checkpatch.pl +++ b/scripts/checkpatch.pl | |||
@@ -2382,6 +2382,19 @@ sub process { | |||
2382 | } | 2382 | } |
2383 | } | 2383 | } |
2384 | 2384 | ||
2385 | if ($line =~ /\bprintk\s*\(\s*KERN_([A-Z]+)/) { | ||
2386 | my $orig = $1; | ||
2387 | my $level = lc($orig); | ||
2388 | $level = "warn" if ($level eq "warning"); | ||
2389 | WARN("PREFER_PR_LEVEL", | ||
2390 | "Prefer pr_$level(... to printk(KERN_$1, ...\n" . $herecurr); | ||
2391 | } | ||
2392 | |||
2393 | if ($line =~ /\bpr_warning\s*\(/) { | ||
2394 | WARN("PREFER_PR_LEVEL", | ||
2395 | "Prefer pr_warn(... to pr_warning(...\n" . $herecurr); | ||
2396 | } | ||
2397 | |||
2385 | # function brace can't be on same line, except for #defines of do while, | 2398 | # function brace can't be on same line, except for #defines of do while, |
2386 | # or if closed on same line | 2399 | # or if closed on same line |
2387 | if (($line=~/$Type\s*$Ident\(.*\).*\s{/) and | 2400 | if (($line=~/$Type\s*$Ident\(.*\).*\s{/) and |
@@ -2448,6 +2461,13 @@ sub process { | |||
2448 | "space prohibited between function name and open parenthesis '('\n" . $herecurr); | 2461 | "space prohibited between function name and open parenthesis '('\n" . $herecurr); |
2449 | } | 2462 | } |
2450 | } | 2463 | } |
2464 | |||
2465 | # check for whitespace before a non-naked semicolon | ||
2466 | if ($line =~ /^\+.*\S\s+;/) { | ||
2467 | CHK("SPACING", | ||
2468 | "space prohibited before semicolon\n" . $herecurr); | ||
2469 | } | ||
2470 | |||
2451 | # Check operator spacing. | 2471 | # Check operator spacing. |
2452 | if (!($line=~/\#\s*include/)) { | 2472 | if (!($line=~/\#\s*include/)) { |
2453 | my $ops = qr{ | 2473 | my $ops = qr{ |
diff --git a/security/keys/compat.c b/security/keys/compat.c index fab4f8dda6c6..c92d42b021aa 100644 --- a/security/keys/compat.c +++ b/security/keys/compat.c | |||
@@ -38,7 +38,7 @@ long compat_keyctl_instantiate_key_iov( | |||
38 | 38 | ||
39 | ret = compat_rw_copy_check_uvector(WRITE, _payload_iov, ioc, | 39 | ret = compat_rw_copy_check_uvector(WRITE, _payload_iov, ioc, |
40 | ARRAY_SIZE(iovstack), | 40 | ARRAY_SIZE(iovstack), |
41 | iovstack, &iov, 1); | 41 | iovstack, &iov); |
42 | if (ret < 0) | 42 | if (ret < 0) |
43 | return ret; | 43 | return ret; |
44 | if (ret == 0) | 44 | if (ret == 0) |
diff --git a/security/keys/keyctl.c b/security/keys/keyctl.c index ddb3e05bc5fc..21907ea35b15 100644 --- a/security/keys/keyctl.c +++ b/security/keys/keyctl.c | |||
@@ -84,7 +84,7 @@ SYSCALL_DEFINE5(add_key, const char __user *, _type, | |||
84 | vm = false; | 84 | vm = false; |
85 | if (_payload) { | 85 | if (_payload) { |
86 | ret = -ENOMEM; | 86 | ret = -ENOMEM; |
87 | payload = kmalloc(plen, GFP_KERNEL); | 87 | payload = kmalloc(plen, GFP_KERNEL | __GFP_NOWARN); |
88 | if (!payload) { | 88 | if (!payload) { |
89 | if (plen <= PAGE_SIZE) | 89 | if (plen <= PAGE_SIZE) |
90 | goto error2; | 90 | goto error2; |
@@ -1110,7 +1110,7 @@ long keyctl_instantiate_key_iov(key_serial_t id, | |||
1110 | goto no_payload; | 1110 | goto no_payload; |
1111 | 1111 | ||
1112 | ret = rw_copy_check_uvector(WRITE, _payload_iov, ioc, | 1112 | ret = rw_copy_check_uvector(WRITE, _payload_iov, ioc, |
1113 | ARRAY_SIZE(iovstack), iovstack, &iov, 1); | 1113 | ARRAY_SIZE(iovstack), iovstack, &iov); |
1114 | if (ret < 0) | 1114 | if (ret < 0) |
1115 | return ret; | 1115 | return ret; |
1116 | if (ret == 0) | 1116 | if (ret == 0) |
diff --git a/security/keys/request_key.c b/security/keys/request_key.c index cc3790315d2f..000e75017520 100644 --- a/security/keys/request_key.c +++ b/security/keys/request_key.c | |||
@@ -93,16 +93,9 @@ static void umh_keys_cleanup(struct subprocess_info *info) | |||
93 | static int call_usermodehelper_keys(char *path, char **argv, char **envp, | 93 | static int call_usermodehelper_keys(char *path, char **argv, char **envp, |
94 | struct key *session_keyring, int wait) | 94 | struct key *session_keyring, int wait) |
95 | { | 95 | { |
96 | gfp_t gfp_mask = (wait == UMH_NO_WAIT) ? GFP_ATOMIC : GFP_KERNEL; | 96 | return call_usermodehelper_fns(path, argv, envp, wait, |
97 | struct subprocess_info *info = | 97 | umh_keys_init, umh_keys_cleanup, |
98 | call_usermodehelper_setup(path, argv, envp, gfp_mask); | 98 | key_get(session_keyring)); |
99 | |||
100 | if (!info) | ||
101 | return -ENOMEM; | ||
102 | |||
103 | call_usermodehelper_setfns(info, umh_keys_init, umh_keys_cleanup, | ||
104 | key_get(session_keyring)); | ||
105 | return call_usermodehelper_exec(info, wait); | ||
106 | } | 99 | } |
107 | 100 | ||
108 | /* | 101 | /* |
diff --git a/tools/testing/selftests/Makefile b/tools/testing/selftests/Makefile index 28bc57ee757c..a4162e15c25f 100644 --- a/tools/testing/selftests/Makefile +++ b/tools/testing/selftests/Makefile | |||
@@ -1,4 +1,4 @@ | |||
1 | TARGETS = breakpoints vm | 1 | TARGETS = breakpoints kcmp mqueue vm |
2 | 2 | ||
3 | all: | 3 | all: |
4 | for TARGET in $(TARGETS); do \ | 4 | for TARGET in $(TARGETS); do \ |
diff --git a/tools/testing/selftests/kcmp/Makefile b/tools/testing/selftests/kcmp/Makefile new file mode 100644 index 000000000000..dc79b86ea65c --- /dev/null +++ b/tools/testing/selftests/kcmp/Makefile | |||
@@ -0,0 +1,29 @@ | |||
1 | uname_M := $(shell uname -m 2>/dev/null || echo not) | ||
2 | ARCH ?= $(shell echo $(uname_M) | sed -e s/i.86/i386/) | ||
3 | ifeq ($(ARCH),i386) | ||
4 | ARCH := X86 | ||
5 | CFLAGS := -DCONFIG_X86_32 -D__i386__ | ||
6 | endif | ||
7 | ifeq ($(ARCH),x86_64) | ||
8 | ARCH := X86 | ||
9 | CFLAGS := -DCONFIG_X86_64 -D__x86_64__ | ||
10 | endif | ||
11 | |||
12 | CFLAGS += -I../../../../arch/x86/include/generated/ | ||
13 | CFLAGS += -I../../../../include/ | ||
14 | CFLAGS += -I../../../../usr/include/ | ||
15 | CFLAGS += -I../../../../arch/x86/include/ | ||
16 | |||
17 | all: | ||
18 | ifeq ($(ARCH),X86) | ||
19 | gcc $(CFLAGS) kcmp_test.c -o run_test | ||
20 | else | ||
21 | echo "Not an x86 target, can't build kcmp selftest" | ||
22 | endif | ||
23 | |||
24 | run-tests: all | ||
25 | ./kcmp_test | ||
26 | |||
27 | clean: | ||
28 | rm -fr ./run_test | ||
29 | rm -fr ./test-file | ||
diff --git a/tools/testing/selftests/kcmp/kcmp_test.c b/tools/testing/selftests/kcmp/kcmp_test.c new file mode 100644 index 000000000000..358cc6bfa35d --- /dev/null +++ b/tools/testing/selftests/kcmp/kcmp_test.c | |||
@@ -0,0 +1,94 @@ | |||
1 | #define _GNU_SOURCE | ||
2 | |||
3 | #include <stdio.h> | ||
4 | #include <stdlib.h> | ||
5 | #include <signal.h> | ||
6 | #include <limits.h> | ||
7 | #include <unistd.h> | ||
8 | #include <errno.h> | ||
9 | #include <string.h> | ||
10 | #include <fcntl.h> | ||
11 | |||
12 | #include <linux/unistd.h> | ||
13 | #include <linux/kcmp.h> | ||
14 | |||
15 | #include <sys/syscall.h> | ||
16 | #include <sys/types.h> | ||
17 | #include <sys/stat.h> | ||
18 | #include <sys/wait.h> | ||
19 | |||
20 | static long sys_kcmp(int pid1, int pid2, int type, int fd1, int fd2) | ||
21 | { | ||
22 | return syscall(__NR_kcmp, pid1, pid2, type, fd1, fd2); | ||
23 | } | ||
24 | |||
25 | int main(int argc, char **argv) | ||
26 | { | ||
27 | const char kpath[] = "kcmp-test-file"; | ||
28 | int pid1, pid2; | ||
29 | int fd1, fd2; | ||
30 | int status; | ||
31 | |||
32 | fd1 = open(kpath, O_RDWR | O_CREAT | O_TRUNC, 0644); | ||
33 | pid1 = getpid(); | ||
34 | |||
35 | if (fd1 < 0) { | ||
36 | perror("Can't create file"); | ||
37 | exit(1); | ||
38 | } | ||
39 | |||
40 | pid2 = fork(); | ||
41 | if (pid2 < 0) { | ||
42 | perror("fork failed"); | ||
43 | exit(1); | ||
44 | } | ||
45 | |||
46 | if (!pid2) { | ||
47 | int pid2 = getpid(); | ||
48 | int ret; | ||
49 | |||
50 | fd2 = open(kpath, O_RDWR, 0644); | ||
51 | if (fd2 < 0) { | ||
52 | perror("Can't open file"); | ||
53 | exit(1); | ||
54 | } | ||
55 | |||
56 | /* An example of output and arguments */ | ||
57 | printf("pid1: %6d pid2: %6d FD: %2ld FILES: %2ld VM: %2ld " | ||
58 | "FS: %2ld SIGHAND: %2ld IO: %2ld SYSVSEM: %2ld " | ||
59 | "INV: %2ld\n", | ||
60 | pid1, pid2, | ||
61 | sys_kcmp(pid1, pid2, KCMP_FILE, fd1, fd2), | ||
62 | sys_kcmp(pid1, pid2, KCMP_FILES, 0, 0), | ||
63 | sys_kcmp(pid1, pid2, KCMP_VM, 0, 0), | ||
64 | sys_kcmp(pid1, pid2, KCMP_FS, 0, 0), | ||
65 | sys_kcmp(pid1, pid2, KCMP_SIGHAND, 0, 0), | ||
66 | sys_kcmp(pid1, pid2, KCMP_IO, 0, 0), | ||
67 | sys_kcmp(pid1, pid2, KCMP_SYSVSEM, 0, 0), | ||
68 | |||
69 | /* This one should fail */ | ||
70 | sys_kcmp(pid1, pid2, KCMP_TYPES + 1, 0, 0)); | ||
71 | |||
72 | /* This one should return same fd */ | ||
73 | ret = sys_kcmp(pid1, pid2, KCMP_FILE, fd1, fd1); | ||
74 | if (ret) { | ||
75 | printf("FAIL: 0 expected but %d returned\n", ret); | ||
76 | ret = -1; | ||
77 | } else | ||
78 | printf("PASS: 0 returned as expected\n"); | ||
79 | |||
80 | /* Compare with self */ | ||
81 | ret = sys_kcmp(pid1, pid1, KCMP_VM, 0, 0); | ||
82 | if (ret) { | ||
83 | printf("FAIL: 0 expected but %li returned\n", ret); | ||
84 | ret = -1; | ||
85 | } else | ||
86 | printf("PASS: 0 returned as expected\n"); | ||
87 | |||
88 | exit(ret); | ||
89 | } | ||
90 | |||
91 | waitpid(pid2, &status, P_ALL); | ||
92 | |||
93 | return 0; | ||
94 | } | ||
diff --git a/tools/testing/selftests/mqueue/.gitignore b/tools/testing/selftests/mqueue/.gitignore new file mode 100644 index 000000000000..d8d42377205a --- /dev/null +++ b/tools/testing/selftests/mqueue/.gitignore | |||
@@ -0,0 +1,2 @@ | |||
1 | mq_open_tests | ||
2 | mq_perf_tests | ||
diff --git a/tools/testing/selftests/mqueue/Makefile b/tools/testing/selftests/mqueue/Makefile new file mode 100644 index 000000000000..54c0aad2b47c --- /dev/null +++ b/tools/testing/selftests/mqueue/Makefile | |||
@@ -0,0 +1,10 @@ | |||
1 | all: | ||
2 | gcc -O2 -lrt mq_open_tests.c -o mq_open_tests | ||
3 | gcc -O2 -lrt -lpthread -lpopt -o mq_perf_tests mq_perf_tests.c | ||
4 | |||
5 | run_tests: | ||
6 | ./mq_open_tests /test1 | ||
7 | ./mq_perf_tests | ||
8 | |||
9 | clean: | ||
10 | rm -f mq_open_tests mq_perf_tests | ||
diff --git a/tools/testing/selftests/mqueue/mq_open_tests.c b/tools/testing/selftests/mqueue/mq_open_tests.c new file mode 100644 index 000000000000..711cc2923047 --- /dev/null +++ b/tools/testing/selftests/mqueue/mq_open_tests.c | |||
@@ -0,0 +1,492 @@ | |||
1 | /* | ||
2 | * This application is Copyright 2012 Red Hat, Inc. | ||
3 | * Doug Ledford <dledford@redhat.com> | ||
4 | * | ||
5 | * mq_open_tests is free software: you can redistribute it and/or modify | ||
6 | * it under the terms of the GNU General Public License as published by | ||
7 | * the Free Software Foundation, version 3. | ||
8 | * | ||
9 | * mq_open_tests is distributed in the hope that it will be useful, | ||
10 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
11 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
12 | * GNU General Public License for more details. | ||
13 | * | ||
14 | * For the full text of the license, see <http://www.gnu.org/licenses/>. | ||
15 | * | ||
16 | * mq_open_tests.c | ||
17 | * Tests the various situations that should either succeed or fail to | ||
18 | * open a posix message queue and then reports whether or not they | ||
19 | * did as they were supposed to. | ||
20 | * | ||
21 | */ | ||
22 | #include <stdio.h> | ||
23 | #include <stdlib.h> | ||
24 | #include <unistd.h> | ||
25 | #include <fcntl.h> | ||
26 | #include <string.h> | ||
27 | #include <limits.h> | ||
28 | #include <errno.h> | ||
29 | #include <sys/types.h> | ||
30 | #include <sys/time.h> | ||
31 | #include <sys/resource.h> | ||
32 | #include <sys/stat.h> | ||
33 | #include <mqueue.h> | ||
34 | |||
35 | static char *usage = | ||
36 | "Usage:\n" | ||
37 | " %s path\n" | ||
38 | "\n" | ||
39 | " path Path name of the message queue to create\n" | ||
40 | "\n" | ||
41 | " Note: this program must be run as root in order to enable all tests\n" | ||
42 | "\n"; | ||
43 | |||
44 | char *DEF_MSGS = "/proc/sys/fs/mqueue/msg_default"; | ||
45 | char *DEF_MSGSIZE = "/proc/sys/fs/mqueue/msgsize_default"; | ||
46 | char *MAX_MSGS = "/proc/sys/fs/mqueue/msg_max"; | ||
47 | char *MAX_MSGSIZE = "/proc/sys/fs/mqueue/msgsize_max"; | ||
48 | |||
49 | int default_settings; | ||
50 | struct rlimit saved_limits, cur_limits; | ||
51 | int saved_def_msgs, saved_def_msgsize, saved_max_msgs, saved_max_msgsize; | ||
52 | int cur_def_msgs, cur_def_msgsize, cur_max_msgs, cur_max_msgsize; | ||
53 | FILE *def_msgs, *def_msgsize, *max_msgs, *max_msgsize; | ||
54 | char *queue_path; | ||
55 | mqd_t queue = -1; | ||
56 | |||
57 | static inline void __set(FILE *stream, int value, char *err_msg); | ||
58 | void shutdown(int exit_val, char *err_cause, int line_no); | ||
59 | static inline int get(FILE *stream); | ||
60 | static inline void set(FILE *stream, int value); | ||
61 | static inline void getr(int type, struct rlimit *rlim); | ||
62 | static inline void setr(int type, struct rlimit *rlim); | ||
63 | void validate_current_settings(); | ||
64 | static inline void test_queue(struct mq_attr *attr, struct mq_attr *result); | ||
65 | static inline int test_queue_fail(struct mq_attr *attr, struct mq_attr *result); | ||
66 | |||
67 | static inline void __set(FILE *stream, int value, char *err_msg) | ||
68 | { | ||
69 | rewind(stream); | ||
70 | if (fprintf(stream, "%d", value) < 0) | ||
71 | perror(err_msg); | ||
72 | } | ||
73 | |||
74 | |||
75 | void shutdown(int exit_val, char *err_cause, int line_no) | ||
76 | { | ||
77 | static int in_shutdown = 0; | ||
78 | |||
79 | /* In case we get called recursively by a set() call below */ | ||
80 | if (in_shutdown++) | ||
81 | return; | ||
82 | |||
83 | seteuid(0); | ||
84 | |||
85 | if (queue != -1) | ||
86 | if (mq_close(queue)) | ||
87 | perror("mq_close() during shutdown"); | ||
88 | if (queue_path) | ||
89 | /* | ||
90 | * Be silent if this fails, if we cleaned up already it's | ||
91 | * expected to fail | ||
92 | */ | ||
93 | mq_unlink(queue_path); | ||
94 | if (default_settings) { | ||
95 | if (saved_def_msgs) | ||
96 | __set(def_msgs, saved_def_msgs, | ||
97 | "failed to restore saved_def_msgs"); | ||
98 | if (saved_def_msgsize) | ||
99 | __set(def_msgsize, saved_def_msgsize, | ||
100 | "failed to restore saved_def_msgsize"); | ||
101 | } | ||
102 | if (saved_max_msgs) | ||
103 | __set(max_msgs, saved_max_msgs, | ||
104 | "failed to restore saved_max_msgs"); | ||
105 | if (saved_max_msgsize) | ||
106 | __set(max_msgsize, saved_max_msgsize, | ||
107 | "failed to restore saved_max_msgsize"); | ||
108 | if (exit_val) | ||
109 | error(exit_val, errno, "%s at %d", err_cause, line_no); | ||
110 | exit(0); | ||
111 | } | ||
112 | |||
113 | static inline int get(FILE *stream) | ||
114 | { | ||
115 | int value; | ||
116 | rewind(stream); | ||
117 | if (fscanf(stream, "%d", &value) != 1) | ||
118 | shutdown(4, "Error reading /proc entry", __LINE__ - 1); | ||
119 | return value; | ||
120 | } | ||
121 | |||
122 | static inline void set(FILE *stream, int value) | ||
123 | { | ||
124 | int new_value; | ||
125 | |||
126 | rewind(stream); | ||
127 | if (fprintf(stream, "%d", value) < 0) | ||
128 | return shutdown(5, "Failed writing to /proc file", | ||
129 | __LINE__ - 1); | ||
130 | new_value = get(stream); | ||
131 | if (new_value != value) | ||
132 | return shutdown(5, "We didn't get what we wrote to /proc back", | ||
133 | __LINE__ - 1); | ||
134 | } | ||
135 | |||
136 | static inline void getr(int type, struct rlimit *rlim) | ||
137 | { | ||
138 | if (getrlimit(type, rlim)) | ||
139 | shutdown(6, "getrlimit()", __LINE__ - 1); | ||
140 | } | ||
141 | |||
142 | static inline void setr(int type, struct rlimit *rlim) | ||
143 | { | ||
144 | if (setrlimit(type, rlim)) | ||
145 | shutdown(7, "setrlimit()", __LINE__ - 1); | ||
146 | } | ||
147 | |||
148 | void validate_current_settings() | ||
149 | { | ||
150 | int rlim_needed; | ||
151 | |||
152 | if (cur_limits.rlim_cur < 4096) { | ||
153 | printf("Current rlimit value for POSIX message queue bytes is " | ||
154 | "unreasonably low,\nincreasing.\n\n"); | ||
155 | cur_limits.rlim_cur = 8192; | ||
156 | cur_limits.rlim_max = 16384; | ||
157 | setr(RLIMIT_MSGQUEUE, &cur_limits); | ||
158 | } | ||
159 | |||
160 | if (default_settings) { | ||
161 | rlim_needed = (cur_def_msgs + 1) * (cur_def_msgsize + 1 + | ||
162 | 2 * sizeof(void *)); | ||
163 | if (rlim_needed > cur_limits.rlim_cur) { | ||
164 | printf("Temporarily lowering default queue parameters " | ||
165 | "to something that will work\n" | ||
166 | "with the current rlimit values.\n\n"); | ||
167 | set(def_msgs, 10); | ||
168 | cur_def_msgs = 10; | ||
169 | set(def_msgsize, 128); | ||
170 | cur_def_msgsize = 128; | ||
171 | } | ||
172 | } else { | ||
173 | rlim_needed = (cur_max_msgs + 1) * (cur_max_msgsize + 1 + | ||
174 | 2 * sizeof(void *)); | ||
175 | if (rlim_needed > cur_limits.rlim_cur) { | ||
176 | printf("Temporarily lowering maximum queue parameters " | ||
177 | "to something that will work\n" | ||
178 | "with the current rlimit values in case this is " | ||
179 | "a kernel that ties the default\n" | ||
180 | "queue parameters to the maximum queue " | ||
181 | "parameters.\n\n"); | ||
182 | set(max_msgs, 10); | ||
183 | cur_max_msgs = 10; | ||
184 | set(max_msgsize, 128); | ||
185 | cur_max_msgsize = 128; | ||
186 | } | ||
187 | } | ||
188 | } | ||
189 | |||
190 | /* | ||
191 | * test_queue - Test opening a queue, shutdown if we fail. This should | ||
192 | * only be called in situations that should never fail. We clean up | ||
193 | * after ourselves and return the queue attributes in *result. | ||
194 | */ | ||
195 | static inline void test_queue(struct mq_attr *attr, struct mq_attr *result) | ||
196 | { | ||
197 | int flags = O_RDWR | O_EXCL | O_CREAT; | ||
198 | int perms = DEFFILEMODE; | ||
199 | |||
200 | if ((queue = mq_open(queue_path, flags, perms, attr)) == -1) | ||
201 | shutdown(1, "mq_open()", __LINE__); | ||
202 | if (mq_getattr(queue, result)) | ||
203 | shutdown(1, "mq_getattr()", __LINE__); | ||
204 | if (mq_close(queue)) | ||
205 | shutdown(1, "mq_close()", __LINE__); | ||
206 | queue = -1; | ||
207 | if (mq_unlink(queue_path)) | ||
208 | shutdown(1, "mq_unlink()", __LINE__); | ||
209 | } | ||
210 | |||
211 | /* | ||
212 | * Same as test_queue above, but failure is not fatal. | ||
213 | * Returns: | ||
214 | * 0 - Failed to create a queue | ||
215 | * 1 - Created a queue, attributes in *result | ||
216 | */ | ||
217 | static inline int test_queue_fail(struct mq_attr *attr, struct mq_attr *result) | ||
218 | { | ||
219 | int flags = O_RDWR | O_EXCL | O_CREAT; | ||
220 | int perms = DEFFILEMODE; | ||
221 | |||
222 | if ((queue = mq_open(queue_path, flags, perms, attr)) == -1) | ||
223 | return 0; | ||
224 | if (mq_getattr(queue, result)) | ||
225 | shutdown(1, "mq_getattr()", __LINE__); | ||
226 | if (mq_close(queue)) | ||
227 | shutdown(1, "mq_close()", __LINE__); | ||
228 | queue = -1; | ||
229 | if (mq_unlink(queue_path)) | ||
230 | shutdown(1, "mq_unlink()", __LINE__); | ||
231 | return 1; | ||
232 | } | ||
233 | |||
234 | int main(int argc, char *argv[]) | ||
235 | { | ||
236 | struct mq_attr attr, result; | ||
237 | |||
238 | if (argc != 2) { | ||
239 | fprintf(stderr, "Must pass a valid queue name\n\n"); | ||
240 | fprintf(stderr, usage, argv[0]); | ||
241 | exit(1); | ||
242 | } | ||
243 | |||
244 | /* | ||
245 | * Although we can create a msg queue with a non-absolute path name, | ||
246 | * unlink will fail. So, if the name doesn't start with a /, add one | ||
247 | * when we save it. | ||
248 | */ | ||
249 | if (*argv[1] == '/') | ||
250 | queue_path = strdup(argv[1]); | ||
251 | else { | ||
252 | queue_path = malloc(strlen(argv[1]) + 2); | ||
253 | if (!queue_path) { | ||
254 | perror("malloc()"); | ||
255 | exit(1); | ||
256 | } | ||
257 | queue_path[0] = '/'; | ||
258 | queue_path[1] = 0; | ||
259 | strcat(queue_path, argv[1]); | ||
260 | } | ||
261 | |||
262 | if (getuid() != 0) { | ||
263 | fprintf(stderr, "Not running as root, but almost all tests " | ||
264 | "require root in order to modify\nsystem settings. " | ||
265 | "Exiting.\n"); | ||
266 | exit(1); | ||
267 | } | ||
268 | |||
269 | /* Find out what files there are for us to make tweaks in */ | ||
270 | def_msgs = fopen(DEF_MSGS, "r+"); | ||
271 | def_msgsize = fopen(DEF_MSGSIZE, "r+"); | ||
272 | max_msgs = fopen(MAX_MSGS, "r+"); | ||
273 | max_msgsize = fopen(MAX_MSGSIZE, "r+"); | ||
274 | |||
275 | if (!max_msgs) | ||
276 | shutdown(2, "Failed to open msg_max", __LINE__); | ||
277 | if (!max_msgsize) | ||
278 | shutdown(2, "Failed to open msgsize_max", __LINE__); | ||
279 | if (def_msgs || def_msgsize) | ||
280 | default_settings = 1; | ||
281 | |||
282 | /* Load up the current system values for everything we can */ | ||
283 | getr(RLIMIT_MSGQUEUE, &saved_limits); | ||
284 | cur_limits = saved_limits; | ||
285 | if (default_settings) { | ||
286 | saved_def_msgs = cur_def_msgs = get(def_msgs); | ||
287 | saved_def_msgsize = cur_def_msgsize = get(def_msgsize); | ||
288 | } | ||
289 | saved_max_msgs = cur_max_msgs = get(max_msgs); | ||
290 | saved_max_msgsize = cur_max_msgsize = get(max_msgsize); | ||
291 | |||
292 | /* Tell the user our initial state */ | ||
293 | printf("\nInitial system state:\n"); | ||
294 | printf("\tUsing queue path:\t\t%s\n", queue_path); | ||
295 | printf("\tRLIMIT_MSGQUEUE(soft):\t\t%d\n", saved_limits.rlim_cur); | ||
296 | printf("\tRLIMIT_MSGQUEUE(hard):\t\t%d\n", saved_limits.rlim_max); | ||
297 | printf("\tMaximum Message Size:\t\t%d\n", saved_max_msgsize); | ||
298 | printf("\tMaximum Queue Size:\t\t%d\n", saved_max_msgs); | ||
299 | if (default_settings) { | ||
300 | printf("\tDefault Message Size:\t\t%d\n", saved_def_msgsize); | ||
301 | printf("\tDefault Queue Size:\t\t%d\n", saved_def_msgs); | ||
302 | } else { | ||
303 | printf("\tDefault Message Size:\t\tNot Supported\n"); | ||
304 | printf("\tDefault Queue Size:\t\tNot Supported\n"); | ||
305 | } | ||
306 | printf("\n"); | ||
307 | |||
308 | validate_current_settings(); | ||
309 | |||
310 | printf("Adjusted system state for testing:\n"); | ||
311 | printf("\tRLIMIT_MSGQUEUE(soft):\t\t%d\n", cur_limits.rlim_cur); | ||
312 | printf("\tRLIMIT_MSGQUEUE(hard):\t\t%d\n", cur_limits.rlim_max); | ||
313 | printf("\tMaximum Message Size:\t\t%d\n", cur_max_msgsize); | ||
314 | printf("\tMaximum Queue Size:\t\t%d\n", cur_max_msgs); | ||
315 | if (default_settings) { | ||
316 | printf("\tDefault Message Size:\t\t%d\n", cur_def_msgsize); | ||
317 | printf("\tDefault Queue Size:\t\t%d\n", cur_def_msgs); | ||
318 | } | ||
319 | |||
320 | printf("\n\nTest series 1, behavior when no attr struct " | ||
321 | "passed to mq_open:\n"); | ||
322 | if (!default_settings) { | ||
323 | test_queue(NULL, &result); | ||
324 | printf("Given sane system settings, mq_open without an attr " | ||
325 | "struct succeeds:\tPASS\n"); | ||
326 | if (result.mq_maxmsg != cur_max_msgs || | ||
327 | result.mq_msgsize != cur_max_msgsize) { | ||
328 | printf("Kernel does not support setting the default " | ||
329 | "mq attributes,\nbut also doesn't tie the " | ||
330 | "defaults to the maximums:\t\t\tPASS\n"); | ||
331 | } else { | ||
332 | set(max_msgs, ++cur_max_msgs); | ||
333 | set(max_msgsize, ++cur_max_msgsize); | ||
334 | test_queue(NULL, &result); | ||
335 | if (result.mq_maxmsg == cur_max_msgs && | ||
336 | result.mq_msgsize == cur_max_msgsize) | ||
337 | printf("Kernel does not support setting the " | ||
338 | "default mq attributes and\n" | ||
339 | "also ties system wide defaults to " | ||
340 | "the system wide maximums:\t\t" | ||
341 | "FAIL\n"); | ||
342 | else | ||
343 | printf("Kernel does not support setting the " | ||
344 | "default mq attributes,\n" | ||
345 | "but also doesn't tie the defaults to " | ||
346 | "the maximums:\t\t\tPASS\n"); | ||
347 | } | ||
348 | } else { | ||
349 | printf("Kernel supports setting defaults separately from " | ||
350 | "maximums:\t\tPASS\n"); | ||
351 | /* | ||
352 | * While we are here, go ahead and test that the kernel | ||
353 | * properly follows the default settings | ||
354 | */ | ||
355 | test_queue(NULL, &result); | ||
356 | printf("Given sane values, mq_open without an attr struct " | ||
357 | "succeeds:\t\tPASS\n"); | ||
358 | if (result.mq_maxmsg != cur_def_msgs || | ||
359 | result.mq_msgsize != cur_def_msgsize) | ||
360 | printf("Kernel supports setting defaults, but does " | ||
361 | "not actually honor them:\tFAIL\n\n"); | ||
362 | else { | ||
363 | set(def_msgs, ++cur_def_msgs); | ||
364 | set(def_msgsize, ++cur_def_msgsize); | ||
365 | /* In case max was the same as the default */ | ||
366 | set(max_msgs, ++cur_max_msgs); | ||
367 | set(max_msgsize, ++cur_max_msgsize); | ||
368 | test_queue(NULL, &result); | ||
369 | if (result.mq_maxmsg != cur_def_msgs || | ||
370 | result.mq_msgsize != cur_def_msgsize) | ||
371 | printf("Kernel supports setting defaults, but " | ||
372 | "does not actually honor them:\t" | ||
373 | "FAIL\n"); | ||
374 | else | ||
375 | printf("Kernel properly honors default setting " | ||
376 | "knobs:\t\t\t\tPASS\n"); | ||
377 | } | ||
378 | set(def_msgs, cur_max_msgs + 1); | ||
379 | cur_def_msgs = cur_max_msgs + 1; | ||
380 | set(def_msgsize, cur_max_msgsize + 1); | ||
381 | cur_def_msgsize = cur_max_msgsize + 1; | ||
382 | if (cur_def_msgs * (cur_def_msgsize + 2 * sizeof(void *)) >= | ||
383 | cur_limits.rlim_cur) { | ||
384 | cur_limits.rlim_cur = (cur_def_msgs + 2) * | ||
385 | (cur_def_msgsize + 2 * sizeof(void *)); | ||
386 | cur_limits.rlim_max = 2 * cur_limits.rlim_cur; | ||
387 | setr(RLIMIT_MSGQUEUE, &cur_limits); | ||
388 | } | ||
389 | if (test_queue_fail(NULL, &result)) { | ||
390 | if (result.mq_maxmsg == cur_max_msgs && | ||
391 | result.mq_msgsize == cur_max_msgsize) | ||
392 | printf("Kernel properly limits default values " | ||
393 | "to lesser of default/max:\t\tPASS\n"); | ||
394 | else | ||
395 | printf("Kernel does not properly set default " | ||
396 | "queue parameters when\ndefaults > " | ||
397 | "max:\t\t\t\t\t\t\t\tFAIL\n"); | ||
398 | } else | ||
399 | printf("Kernel fails to open mq because defaults are " | ||
400 | "greater than maximums:\tFAIL\n"); | ||
401 | set(def_msgs, --cur_def_msgs); | ||
402 | set(def_msgsize, --cur_def_msgsize); | ||
403 | cur_limits.rlim_cur = cur_limits.rlim_max = cur_def_msgs * | ||
404 | cur_def_msgsize; | ||
405 | setr(RLIMIT_MSGQUEUE, &cur_limits); | ||
406 | if (test_queue_fail(NULL, &result)) | ||
407 | printf("Kernel creates queue even though defaults " | ||
408 | "would exceed\nrlimit setting:" | ||
409 | "\t\t\t\t\t\t\t\tFAIL\n"); | ||
410 | else | ||
411 | printf("Kernel properly fails to create queue when " | ||
412 | "defaults would\nexceed rlimit:" | ||
413 | "\t\t\t\t\t\t\t\tPASS\n"); | ||
414 | } | ||
415 | |||
416 | /* | ||
417 | * Test #2 - open with an attr struct that exceeds rlimit | ||
418 | */ | ||
419 | printf("\n\nTest series 2, behavior when attr struct is " | ||
420 | "passed to mq_open:\n"); | ||
421 | cur_max_msgs = 32; | ||
422 | cur_max_msgsize = cur_limits.rlim_max >> 4; | ||
423 | set(max_msgs, cur_max_msgs); | ||
424 | set(max_msgsize, cur_max_msgsize); | ||
425 | attr.mq_maxmsg = cur_max_msgs; | ||
426 | attr.mq_msgsize = cur_max_msgsize; | ||
427 | if (test_queue_fail(&attr, &result)) | ||
428 | printf("Queue open in excess of rlimit max when euid = 0 " | ||
429 | "succeeded:\t\tFAIL\n"); | ||
430 | else | ||
431 | printf("Queue open in excess of rlimit max when euid = 0 " | ||
432 | "failed:\t\tPASS\n"); | ||
433 | attr.mq_maxmsg = cur_max_msgs + 1; | ||
434 | attr.mq_msgsize = 10; | ||
435 | if (test_queue_fail(&attr, &result)) | ||
436 | printf("Queue open with mq_maxmsg > limit when euid = 0 " | ||
437 | "succeeded:\t\tPASS\n"); | ||
438 | else | ||
439 | printf("Queue open with mq_maxmsg > limit when euid = 0 " | ||
440 | "failed:\t\tFAIL\n"); | ||
441 | attr.mq_maxmsg = 1; | ||
442 | attr.mq_msgsize = cur_max_msgsize + 1; | ||
443 | if (test_queue_fail(&attr, &result)) | ||
444 | printf("Queue open with mq_msgsize > limit when euid = 0 " | ||
445 | "succeeded:\t\tPASS\n"); | ||
446 | else | ||
447 | printf("Queue open with mq_msgsize > limit when euid = 0 " | ||
448 | "failed:\t\tFAIL\n"); | ||
449 | attr.mq_maxmsg = 65536; | ||
450 | attr.mq_msgsize = 65536; | ||
451 | if (test_queue_fail(&attr, &result)) | ||
452 | printf("Queue open with total size > 2GB when euid = 0 " | ||
453 | "succeeded:\t\tFAIL\n"); | ||
454 | else | ||
455 | printf("Queue open with total size > 2GB when euid = 0 " | ||
456 | "failed:\t\t\tPASS\n"); | ||
457 | seteuid(99); | ||
458 | attr.mq_maxmsg = cur_max_msgs; | ||
459 | attr.mq_msgsize = cur_max_msgsize; | ||
460 | if (test_queue_fail(&attr, &result)) | ||
461 | printf("Queue open in excess of rlimit max when euid = 99 " | ||
462 | "succeeded:\t\tFAIL\n"); | ||
463 | else | ||
464 | printf("Queue open in excess of rlimit max when euid = 99 " | ||
465 | "failed:\t\tPASS\n"); | ||
466 | attr.mq_maxmsg = cur_max_msgs + 1; | ||
467 | attr.mq_msgsize = 10; | ||
468 | if (test_queue_fail(&attr, &result)) | ||
469 | printf("Queue open with mq_maxmsg > limit when euid = 99 " | ||
470 | "succeeded:\t\tFAIL\n"); | ||
471 | else | ||
472 | printf("Queue open with mq_maxmsg > limit when euid = 99 " | ||
473 | "failed:\t\tPASS\n"); | ||
474 | attr.mq_maxmsg = 1; | ||
475 | attr.mq_msgsize = cur_max_msgsize + 1; | ||
476 | if (test_queue_fail(&attr, &result)) | ||
477 | printf("Queue open with mq_msgsize > limit when euid = 99 " | ||
478 | "succeeded:\t\tFAIL\n"); | ||
479 | else | ||
480 | printf("Queue open with mq_msgsize > limit when euid = 99 " | ||
481 | "failed:\t\tPASS\n"); | ||
482 | attr.mq_maxmsg = 65536; | ||
483 | attr.mq_msgsize = 65536; | ||
484 | if (test_queue_fail(&attr, &result)) | ||
485 | printf("Queue open with total size > 2GB when euid = 99 " | ||
486 | "succeeded:\t\tFAIL\n"); | ||
487 | else | ||
488 | printf("Queue open with total size > 2GB when euid = 99 " | ||
489 | "failed:\t\t\tPASS\n"); | ||
490 | |||
491 | shutdown(0,"",0); | ||
492 | } | ||
diff --git a/tools/testing/selftests/mqueue/mq_perf_tests.c b/tools/testing/selftests/mqueue/mq_perf_tests.c new file mode 100644 index 000000000000..2fadd4b97045 --- /dev/null +++ b/tools/testing/selftests/mqueue/mq_perf_tests.c | |||
@@ -0,0 +1,741 @@ | |||
1 | /* | ||
2 | * This application is Copyright 2012 Red Hat, Inc. | ||
3 | * Doug Ledford <dledford@redhat.com> | ||
4 | * | ||
5 | * mq_perf_tests is free software: you can redistribute it and/or modify | ||
6 | * it under the terms of the GNU General Public License as published by | ||
7 | * the Free Software Foundation, version 3. | ||
8 | * | ||
9 | * mq_perf_tests is distributed in the hope that it will be useful, | ||
10 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
11 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
12 | * GNU General Public License for more details. | ||
13 | * | ||
14 | * For the full text of the license, see <http://www.gnu.org/licenses/>. | ||
15 | * | ||
16 | * mq_perf_tests.c | ||
17 | * Tests various types of message queue workloads, concentrating on those | ||
18 | * situations that invole large message sizes, large message queue depths, | ||
19 | * or both, and reports back useful metrics about kernel message queue | ||
20 | * performance. | ||
21 | * | ||
22 | */ | ||
23 | #define _GNU_SOURCE | ||
24 | #include <stdio.h> | ||
25 | #include <stdlib.h> | ||
26 | #include <unistd.h> | ||
27 | #include <fcntl.h> | ||
28 | #include <string.h> | ||
29 | #include <limits.h> | ||
30 | #include <errno.h> | ||
31 | #include <signal.h> | ||
32 | #include <pthread.h> | ||
33 | #include <sched.h> | ||
34 | #include <sys/types.h> | ||
35 | #include <sys/time.h> | ||
36 | #include <sys/resource.h> | ||
37 | #include <sys/stat.h> | ||
38 | #include <mqueue.h> | ||
39 | #include <popt.h> | ||
40 | |||
41 | static char *usage = | ||
42 | "Usage:\n" | ||
43 | " %s [-c #[,#..] -f] path\n" | ||
44 | "\n" | ||
45 | " -c # Skip most tests and go straight to a high queue depth test\n" | ||
46 | " and then run that test continuously (useful for running at\n" | ||
47 | " the same time as some other workload to see how much the\n" | ||
48 | " cache thrashing caused by adding messages to a very deep\n" | ||
49 | " queue impacts the performance of other programs). The number\n" | ||
50 | " indicates which CPU core we should bind the process to during\n" | ||
51 | " the run. If you have more than one physical CPU, then you\n" | ||
52 | " will need one copy per physical CPU package, and you should\n" | ||
53 | " specify the CPU cores to pin ourself to via a comma separated\n" | ||
54 | " list of CPU values.\n" | ||
55 | " -f Only usable with continuous mode. Pin ourself to the CPUs\n" | ||
56 | " as requested, then instead of looping doing a high mq\n" | ||
57 | " workload, just busy loop. This will allow us to lock up a\n" | ||
58 | " single CPU just like we normally would, but without actually\n" | ||
59 | " thrashing the CPU cache. This is to make it easier to get\n" | ||
60 | " comparable numbers from some other workload running on the\n" | ||
61 | " other CPUs. One set of numbers with # CPUs locked up running\n" | ||
62 | " an mq workload, and another set of numbers with those same\n" | ||
63 | " CPUs locked away from the test workload, but not doing\n" | ||
64 | " anything to trash the cache like the mq workload might.\n" | ||
65 | " path Path name of the message queue to create\n" | ||
66 | "\n" | ||
67 | " Note: this program must be run as root in order to enable all tests\n" | ||
68 | "\n"; | ||
69 | |||
70 | char *MAX_MSGS = "/proc/sys/fs/mqueue/msg_max"; | ||
71 | char *MAX_MSGSIZE = "/proc/sys/fs/mqueue/msgsize_max"; | ||
72 | |||
73 | #define min(a, b) ((a) < (b) ? (a) : (b)) | ||
74 | #define MAX_CPUS 64 | ||
75 | char *cpu_option_string; | ||
76 | int cpus_to_pin[MAX_CPUS]; | ||
77 | int num_cpus_to_pin; | ||
78 | pthread_t cpu_threads[MAX_CPUS]; | ||
79 | pthread_t main_thread; | ||
80 | cpu_set_t *cpu_set; | ||
81 | int cpu_set_size; | ||
82 | int cpus_online; | ||
83 | |||
84 | #define MSG_SIZE 16 | ||
85 | #define TEST1_LOOPS 10000000 | ||
86 | #define TEST2_LOOPS 100000 | ||
87 | int continuous_mode; | ||
88 | int continuous_mode_fake; | ||
89 | |||
90 | struct rlimit saved_limits, cur_limits; | ||
91 | int saved_max_msgs, saved_max_msgsize; | ||
92 | int cur_max_msgs, cur_max_msgsize; | ||
93 | FILE *max_msgs, *max_msgsize; | ||
94 | int cur_nice; | ||
95 | char *queue_path = "/mq_perf_tests"; | ||
96 | mqd_t queue = -1; | ||
97 | struct mq_attr result; | ||
98 | int mq_prio_max; | ||
99 | |||
100 | const struct poptOption options[] = { | ||
101 | { | ||
102 | .longName = "continuous", | ||
103 | .shortName = 'c', | ||
104 | .argInfo = POPT_ARG_STRING, | ||
105 | .arg = &cpu_option_string, | ||
106 | .val = 'c', | ||
107 | .descrip = "Run continuous tests at a high queue depth in " | ||
108 | "order to test the effects of cache thrashing on " | ||
109 | "other tasks on the system. This test is intended " | ||
110 | "to be run on one core of each physical CPU while " | ||
111 | "some other CPU intensive task is run on all the other " | ||
112 | "cores of that same physical CPU and the other task " | ||
113 | "is timed. It is assumed that the process of adding " | ||
114 | "messages to the message queue in a tight loop will " | ||
115 | "impact that other task to some degree. Once the " | ||
116 | "tests are performed in this way, you should then " | ||
117 | "re-run the tests using fake mode in order to check " | ||
118 | "the difference in time required to perform the CPU " | ||
119 | "intensive task", | ||
120 | .argDescrip = "cpu[,cpu]", | ||
121 | }, | ||
122 | { | ||
123 | .longName = "fake", | ||
124 | .shortName = 'f', | ||
125 | .argInfo = POPT_ARG_NONE, | ||
126 | .arg = &continuous_mode_fake, | ||
127 | .val = 0, | ||
128 | .descrip = "Tie up the CPUs that we would normally tie up in" | ||
129 | "continuous mode, but don't actually do any mq stuff, " | ||
130 | "just keep the CPU busy so it can't be used to process " | ||
131 | "system level tasks as this would free up resources on " | ||
132 | "the other CPU cores and skew the comparison between " | ||
133 | "the no-mqueue work and mqueue work tests", | ||
134 | .argDescrip = NULL, | ||
135 | }, | ||
136 | { | ||
137 | .longName = "path", | ||
138 | .shortName = 'p', | ||
139 | .argInfo = POPT_ARG_STRING | POPT_ARGFLAG_SHOW_DEFAULT, | ||
140 | .arg = &queue_path, | ||
141 | .val = 'p', | ||
142 | .descrip = "The name of the path to use in the mqueue " | ||
143 | "filesystem for our tests", | ||
144 | .argDescrip = "pathname", | ||
145 | }, | ||
146 | POPT_AUTOHELP | ||
147 | POPT_TABLEEND | ||
148 | }; | ||
149 | |||
150 | static inline void __set(FILE *stream, int value, char *err_msg); | ||
151 | void shutdown(int exit_val, char *err_cause, int line_no); | ||
152 | void sig_action_SIGUSR1(int signum, siginfo_t *info, void *context); | ||
153 | void sig_action(int signum, siginfo_t *info, void *context); | ||
154 | static inline int get(FILE *stream); | ||
155 | static inline void set(FILE *stream, int value); | ||
156 | static inline int try_set(FILE *stream, int value); | ||
157 | static inline void getr(int type, struct rlimit *rlim); | ||
158 | static inline void setr(int type, struct rlimit *rlim); | ||
159 | static inline void open_queue(struct mq_attr *attr); | ||
160 | void increase_limits(void); | ||
161 | |||
162 | static inline void __set(FILE *stream, int value, char *err_msg) | ||
163 | { | ||
164 | rewind(stream); | ||
165 | if (fprintf(stream, "%d", value) < 0) | ||
166 | perror(err_msg); | ||
167 | } | ||
168 | |||
169 | |||
170 | void shutdown(int exit_val, char *err_cause, int line_no) | ||
171 | { | ||
172 | static int in_shutdown = 0; | ||
173 | int errno_at_shutdown = errno; | ||
174 | int i; | ||
175 | |||
176 | /* In case we get called by multiple threads or from an sighandler */ | ||
177 | if (in_shutdown++) | ||
178 | return; | ||
179 | |||
180 | for (i = 0; i < num_cpus_to_pin; i++) | ||
181 | if (cpu_threads[i]) { | ||
182 | pthread_kill(cpu_threads[i], SIGUSR1); | ||
183 | pthread_join(cpu_threads[i], NULL); | ||
184 | } | ||
185 | |||
186 | if (queue != -1) | ||
187 | if (mq_close(queue)) | ||
188 | perror("mq_close() during shutdown"); | ||
189 | if (queue_path) | ||
190 | /* | ||
191 | * Be silent if this fails, if we cleaned up already it's | ||
192 | * expected to fail | ||
193 | */ | ||
194 | mq_unlink(queue_path); | ||
195 | if (saved_max_msgs) | ||
196 | __set(max_msgs, saved_max_msgs, | ||
197 | "failed to restore saved_max_msgs"); | ||
198 | if (saved_max_msgsize) | ||
199 | __set(max_msgsize, saved_max_msgsize, | ||
200 | "failed to restore saved_max_msgsize"); | ||
201 | if (exit_val) | ||
202 | error(exit_val, errno_at_shutdown, "%s at %d", | ||
203 | err_cause, line_no); | ||
204 | exit(0); | ||
205 | } | ||
206 | |||
207 | void sig_action_SIGUSR1(int signum, siginfo_t *info, void *context) | ||
208 | { | ||
209 | if (pthread_self() != main_thread) | ||
210 | pthread_exit(0); | ||
211 | else { | ||
212 | fprintf(stderr, "Caught signal %d in SIGUSR1 handler, " | ||
213 | "exiting\n", signum); | ||
214 | shutdown(0, "", 0); | ||
215 | fprintf(stderr, "\n\nReturned from shutdown?!?!\n\n"); | ||
216 | exit(0); | ||
217 | } | ||
218 | } | ||
219 | |||
220 | void sig_action(int signum, siginfo_t *info, void *context) | ||
221 | { | ||
222 | if (pthread_self() != main_thread) | ||
223 | pthread_kill(main_thread, signum); | ||
224 | else { | ||
225 | fprintf(stderr, "Caught signal %d, exiting\n", signum); | ||
226 | shutdown(0, "", 0); | ||
227 | fprintf(stderr, "\n\nReturned from shutdown?!?!\n\n"); | ||
228 | exit(0); | ||
229 | } | ||
230 | } | ||
231 | |||
232 | static inline int get(FILE *stream) | ||
233 | { | ||
234 | int value; | ||
235 | rewind(stream); | ||
236 | if (fscanf(stream, "%d", &value) != 1) | ||
237 | shutdown(4, "Error reading /proc entry", __LINE__); | ||
238 | return value; | ||
239 | } | ||
240 | |||
241 | static inline void set(FILE *stream, int value) | ||
242 | { | ||
243 | int new_value; | ||
244 | |||
245 | rewind(stream); | ||
246 | if (fprintf(stream, "%d", value) < 0) | ||
247 | return shutdown(5, "Failed writing to /proc file", __LINE__); | ||
248 | new_value = get(stream); | ||
249 | if (new_value != value) | ||
250 | return shutdown(5, "We didn't get what we wrote to /proc back", | ||
251 | __LINE__); | ||
252 | } | ||
253 | |||
254 | static inline int try_set(FILE *stream, int value) | ||
255 | { | ||
256 | int new_value; | ||
257 | |||
258 | rewind(stream); | ||
259 | fprintf(stream, "%d", value); | ||
260 | new_value = get(stream); | ||
261 | return new_value == value; | ||
262 | } | ||
263 | |||
264 | static inline void getr(int type, struct rlimit *rlim) | ||
265 | { | ||
266 | if (getrlimit(type, rlim)) | ||
267 | shutdown(6, "getrlimit()", __LINE__); | ||
268 | } | ||
269 | |||
270 | static inline void setr(int type, struct rlimit *rlim) | ||
271 | { | ||
272 | if (setrlimit(type, rlim)) | ||
273 | shutdown(7, "setrlimit()", __LINE__); | ||
274 | } | ||
275 | |||
276 | /** | ||
277 | * open_queue - open the global queue for testing | ||
278 | * @attr - An attr struct specifying the desired queue traits | ||
279 | * @result - An attr struct that lists the actual traits the queue has | ||
280 | * | ||
281 | * This open is not allowed to fail, failure will result in an orderly | ||
282 | * shutdown of the program. The global queue_path is used to set what | ||
283 | * queue to open, the queue descriptor is saved in the global queue | ||
284 | * variable. | ||
285 | */ | ||
286 | static inline void open_queue(struct mq_attr *attr) | ||
287 | { | ||
288 | int flags = O_RDWR | O_EXCL | O_CREAT | O_NONBLOCK; | ||
289 | int perms = DEFFILEMODE; | ||
290 | |||
291 | queue = mq_open(queue_path, flags, perms, attr); | ||
292 | if (queue == -1) | ||
293 | shutdown(1, "mq_open()", __LINE__); | ||
294 | if (mq_getattr(queue, &result)) | ||
295 | shutdown(1, "mq_getattr()", __LINE__); | ||
296 | printf("\n\tQueue %s created:\n", queue_path); | ||
297 | printf("\t\tmq_flags:\t\t\t%s\n", result.mq_flags & O_NONBLOCK ? | ||
298 | "O_NONBLOCK" : "(null)"); | ||
299 | printf("\t\tmq_maxmsg:\t\t\t%d\n", result.mq_maxmsg); | ||
300 | printf("\t\tmq_msgsize:\t\t\t%d\n", result.mq_msgsize); | ||
301 | printf("\t\tmq_curmsgs:\t\t\t%d\n", result.mq_curmsgs); | ||
302 | } | ||
303 | |||
304 | void *fake_cont_thread(void *arg) | ||
305 | { | ||
306 | int i; | ||
307 | |||
308 | for (i = 0; i < num_cpus_to_pin; i++) | ||
309 | if (cpu_threads[i] == pthread_self()) | ||
310 | break; | ||
311 | printf("\tStarted fake continuous mode thread %d on CPU %d\n", i, | ||
312 | cpus_to_pin[i]); | ||
313 | while (1) | ||
314 | ; | ||
315 | } | ||
316 | |||
317 | void *cont_thread(void *arg) | ||
318 | { | ||
319 | char buff[MSG_SIZE]; | ||
320 | int i, priority; | ||
321 | |||
322 | for (i = 0; i < num_cpus_to_pin; i++) | ||
323 | if (cpu_threads[i] == pthread_self()) | ||
324 | break; | ||
325 | printf("\tStarted continuous mode thread %d on CPU %d\n", i, | ||
326 | cpus_to_pin[i]); | ||
327 | while (1) { | ||
328 | while (mq_send(queue, buff, sizeof(buff), 0) == 0) | ||
329 | ; | ||
330 | mq_receive(queue, buff, sizeof(buff), &priority); | ||
331 | } | ||
332 | } | ||
333 | |||
334 | #define drain_queue() \ | ||
335 | while (mq_receive(queue, buff, MSG_SIZE, &prio_in) == MSG_SIZE) | ||
336 | |||
337 | #define do_untimed_send() \ | ||
338 | do { \ | ||
339 | if (mq_send(queue, buff, MSG_SIZE, prio_out)) \ | ||
340 | shutdown(3, "Test send failure", __LINE__); \ | ||
341 | } while (0) | ||
342 | |||
343 | #define do_send_recv() \ | ||
344 | do { \ | ||
345 | clock_gettime(clock, &start); \ | ||
346 | if (mq_send(queue, buff, MSG_SIZE, prio_out)) \ | ||
347 | shutdown(3, "Test send failure", __LINE__); \ | ||
348 | clock_gettime(clock, &middle); \ | ||
349 | if (mq_receive(queue, buff, MSG_SIZE, &prio_in) != MSG_SIZE) \ | ||
350 | shutdown(3, "Test receive failure", __LINE__); \ | ||
351 | clock_gettime(clock, &end); \ | ||
352 | nsec = ((middle.tv_sec - start.tv_sec) * 1000000000) + \ | ||
353 | (middle.tv_nsec - start.tv_nsec); \ | ||
354 | send_total.tv_nsec += nsec; \ | ||
355 | if (send_total.tv_nsec >= 1000000000) { \ | ||
356 | send_total.tv_sec++; \ | ||
357 | send_total.tv_nsec -= 1000000000; \ | ||
358 | } \ | ||
359 | nsec = ((end.tv_sec - middle.tv_sec) * 1000000000) + \ | ||
360 | (end.tv_nsec - middle.tv_nsec); \ | ||
361 | recv_total.tv_nsec += nsec; \ | ||
362 | if (recv_total.tv_nsec >= 1000000000) { \ | ||
363 | recv_total.tv_sec++; \ | ||
364 | recv_total.tv_nsec -= 1000000000; \ | ||
365 | } \ | ||
366 | } while (0) | ||
367 | |||
368 | struct test { | ||
369 | char *desc; | ||
370 | void (*func)(int *); | ||
371 | }; | ||
372 | |||
373 | void const_prio(int *prio) | ||
374 | { | ||
375 | return; | ||
376 | } | ||
377 | |||
378 | void inc_prio(int *prio) | ||
379 | { | ||
380 | if (++*prio == mq_prio_max) | ||
381 | *prio = 0; | ||
382 | } | ||
383 | |||
384 | void dec_prio(int *prio) | ||
385 | { | ||
386 | if (--*prio < 0) | ||
387 | *prio = mq_prio_max - 1; | ||
388 | } | ||
389 | |||
390 | void random_prio(int *prio) | ||
391 | { | ||
392 | *prio = random() % mq_prio_max; | ||
393 | } | ||
394 | |||
395 | struct test test2[] = { | ||
396 | {"\n\tTest #2a: Time send/recv message, queue full, constant prio\n", | ||
397 | const_prio}, | ||
398 | {"\n\tTest #2b: Time send/recv message, queue full, increasing prio\n", | ||
399 | inc_prio}, | ||
400 | {"\n\tTest #2c: Time send/recv message, queue full, decreasing prio\n", | ||
401 | dec_prio}, | ||
402 | {"\n\tTest #2d: Time send/recv message, queue full, random prio\n", | ||
403 | random_prio}, | ||
404 | {NULL, NULL} | ||
405 | }; | ||
406 | |||
407 | /** | ||
408 | * Tests to perform (all done with MSG_SIZE messages): | ||
409 | * | ||
410 | * 1) Time to add/remove message with 0 messages on queue | ||
411 | * 1a) with constant prio | ||
412 | * 2) Time to add/remove message when queue close to capacity: | ||
413 | * 2a) with constant prio | ||
414 | * 2b) with increasing prio | ||
415 | * 2c) with decreasing prio | ||
416 | * 2d) with random prio | ||
417 | * 3) Test limits of priorities honored (double check _SC_MQ_PRIO_MAX) | ||
418 | */ | ||
419 | void *perf_test_thread(void *arg) | ||
420 | { | ||
421 | char buff[MSG_SIZE]; | ||
422 | int prio_out, prio_in; | ||
423 | int i; | ||
424 | clockid_t clock; | ||
425 | pthread_t *t; | ||
426 | struct timespec res, start, middle, end, send_total, recv_total; | ||
427 | unsigned long long nsec; | ||
428 | struct test *cur_test; | ||
429 | |||
430 | t = &cpu_threads[0]; | ||
431 | printf("\n\tStarted mqueue performance test thread on CPU %d\n", | ||
432 | cpus_to_pin[0]); | ||
433 | mq_prio_max = sysconf(_SC_MQ_PRIO_MAX); | ||
434 | if (mq_prio_max == -1) | ||
435 | shutdown(2, "sysconf(_SC_MQ_PRIO_MAX)", __LINE__); | ||
436 | if (pthread_getcpuclockid(cpu_threads[0], &clock) != 0) | ||
437 | shutdown(2, "pthread_getcpuclockid", __LINE__); | ||
438 | |||
439 | if (clock_getres(clock, &res)) | ||
440 | shutdown(2, "clock_getres()", __LINE__); | ||
441 | |||
442 | printf("\t\tMax priorities:\t\t\t%d\n", mq_prio_max); | ||
443 | printf("\t\tClock resolution:\t\t%d nsec%s\n", res.tv_nsec, | ||
444 | res.tv_nsec > 1 ? "s" : ""); | ||
445 | |||
446 | |||
447 | |||
448 | printf("\n\tTest #1: Time send/recv message, queue empty\n"); | ||
449 | printf("\t\t(%d iterations)\n", TEST1_LOOPS); | ||
450 | prio_out = 0; | ||
451 | send_total.tv_sec = 0; | ||
452 | send_total.tv_nsec = 0; | ||
453 | recv_total.tv_sec = 0; | ||
454 | recv_total.tv_nsec = 0; | ||
455 | for (i = 0; i < TEST1_LOOPS; i++) | ||
456 | do_send_recv(); | ||
457 | printf("\t\tSend msg:\t\t\t%d.%ds total time\n", | ||
458 | send_total.tv_sec, send_total.tv_nsec); | ||
459 | nsec = ((unsigned long long)send_total.tv_sec * 1000000000 + | ||
460 | send_total.tv_nsec) / TEST1_LOOPS; | ||
461 | printf("\t\t\t\t\t\t%d nsec/msg\n", nsec); | ||
462 | printf("\t\tRecv msg:\t\t\t%d.%ds total time\n", | ||
463 | recv_total.tv_sec, recv_total.tv_nsec); | ||
464 | nsec = ((unsigned long long)recv_total.tv_sec * 1000000000 + | ||
465 | recv_total.tv_nsec) / TEST1_LOOPS; | ||
466 | printf("\t\t\t\t\t\t%d nsec/msg\n", nsec); | ||
467 | |||
468 | |||
469 | for (cur_test = test2; cur_test->desc != NULL; cur_test++) { | ||
470 | printf(cur_test->desc); | ||
471 | printf("\t\t(%d iterations)\n", TEST2_LOOPS); | ||
472 | prio_out = 0; | ||
473 | send_total.tv_sec = 0; | ||
474 | send_total.tv_nsec = 0; | ||
475 | recv_total.tv_sec = 0; | ||
476 | recv_total.tv_nsec = 0; | ||
477 | printf("\t\tFilling queue..."); | ||
478 | fflush(stdout); | ||
479 | clock_gettime(clock, &start); | ||
480 | for (i = 0; i < result.mq_maxmsg - 1; i++) { | ||
481 | do_untimed_send(); | ||
482 | cur_test->func(&prio_out); | ||
483 | } | ||
484 | clock_gettime(clock, &end); | ||
485 | nsec = ((unsigned long long)(end.tv_sec - start.tv_sec) * | ||
486 | 1000000000) + (end.tv_nsec - start.tv_nsec); | ||
487 | printf("done.\t\t%lld.%llds\n", nsec / 1000000000, | ||
488 | nsec % 1000000000); | ||
489 | printf("\t\tTesting..."); | ||
490 | fflush(stdout); | ||
491 | for (i = 0; i < TEST2_LOOPS; i++) { | ||
492 | do_send_recv(); | ||
493 | cur_test->func(&prio_out); | ||
494 | } | ||
495 | printf("done.\n"); | ||
496 | printf("\t\tSend msg:\t\t\t%d.%ds total time\n", | ||
497 | send_total.tv_sec, send_total.tv_nsec); | ||
498 | nsec = ((unsigned long long)send_total.tv_sec * 1000000000 + | ||
499 | send_total.tv_nsec) / TEST2_LOOPS; | ||
500 | printf("\t\t\t\t\t\t%d nsec/msg\n", nsec); | ||
501 | printf("\t\tRecv msg:\t\t\t%d.%ds total time\n", | ||
502 | recv_total.tv_sec, recv_total.tv_nsec); | ||
503 | nsec = ((unsigned long long)recv_total.tv_sec * 1000000000 + | ||
504 | recv_total.tv_nsec) / TEST2_LOOPS; | ||
505 | printf("\t\t\t\t\t\t%d nsec/msg\n", nsec); | ||
506 | printf("\t\tDraining queue..."); | ||
507 | fflush(stdout); | ||
508 | clock_gettime(clock, &start); | ||
509 | drain_queue(); | ||
510 | clock_gettime(clock, &end); | ||
511 | nsec = ((unsigned long long)(end.tv_sec - start.tv_sec) * | ||
512 | 1000000000) + (end.tv_nsec - start.tv_nsec); | ||
513 | printf("done.\t\t%lld.%llds\n", nsec / 1000000000, | ||
514 | nsec % 1000000000); | ||
515 | } | ||
516 | return 0; | ||
517 | } | ||
518 | |||
519 | void increase_limits(void) | ||
520 | { | ||
521 | cur_limits.rlim_cur = RLIM_INFINITY; | ||
522 | cur_limits.rlim_max = RLIM_INFINITY; | ||
523 | setr(RLIMIT_MSGQUEUE, &cur_limits); | ||
524 | while (try_set(max_msgs, cur_max_msgs += 10)) | ||
525 | ; | ||
526 | cur_max_msgs = get(max_msgs); | ||
527 | while (try_set(max_msgsize, cur_max_msgsize += 1024)) | ||
528 | ; | ||
529 | cur_max_msgsize = get(max_msgsize); | ||
530 | if (setpriority(PRIO_PROCESS, 0, -20) != 0) | ||
531 | shutdown(2, "setpriority()", __LINE__); | ||
532 | cur_nice = -20; | ||
533 | } | ||
534 | |||
535 | int main(int argc, char *argv[]) | ||
536 | { | ||
537 | struct mq_attr attr; | ||
538 | char *option, *next_option; | ||
539 | int i, cpu; | ||
540 | struct sigaction sa; | ||
541 | poptContext popt_context; | ||
542 | char rc; | ||
543 | void *retval; | ||
544 | |||
545 | main_thread = pthread_self(); | ||
546 | num_cpus_to_pin = 0; | ||
547 | |||
548 | if (sysconf(_SC_NPROCESSORS_ONLN) == -1) { | ||
549 | perror("sysconf(_SC_NPROCESSORS_ONLN)"); | ||
550 | exit(1); | ||
551 | } | ||
552 | cpus_online = min(MAX_CPUS, sysconf(_SC_NPROCESSORS_ONLN)); | ||
553 | cpu_set = CPU_ALLOC(cpus_online); | ||
554 | if (cpu_set == NULL) { | ||
555 | perror("CPU_ALLOC()"); | ||
556 | exit(1); | ||
557 | } | ||
558 | cpu_set_size = CPU_ALLOC_SIZE(cpus_online); | ||
559 | CPU_ZERO_S(cpu_set_size, cpu_set); | ||
560 | |||
561 | popt_context = poptGetContext(NULL, argc, (const char **)argv, | ||
562 | options, 0); | ||
563 | |||
564 | while ((rc = poptGetNextOpt(popt_context)) > 0) { | ||
565 | switch (rc) { | ||
566 | case 'c': | ||
567 | continuous_mode = 1; | ||
568 | option = cpu_option_string; | ||
569 | do { | ||
570 | next_option = strchr(option, ','); | ||
571 | if (next_option) | ||
572 | *next_option = '\0'; | ||
573 | cpu = atoi(option); | ||
574 | if (cpu >= cpus_online) | ||
575 | fprintf(stderr, "CPU %d exceeds " | ||
576 | "cpus online, ignoring.\n", | ||
577 | cpu); | ||
578 | else | ||
579 | cpus_to_pin[num_cpus_to_pin++] = cpu; | ||
580 | if (next_option) | ||
581 | option = ++next_option; | ||
582 | } while (next_option && num_cpus_to_pin < MAX_CPUS); | ||
583 | /* Double check that they didn't give us the same CPU | ||
584 | * more than once */ | ||
585 | for (cpu = 0; cpu < num_cpus_to_pin; cpu++) { | ||
586 | if (CPU_ISSET_S(cpus_to_pin[cpu], cpu_set_size, | ||
587 | cpu_set)) { | ||
588 | fprintf(stderr, "Any given CPU may " | ||
589 | "only be given once.\n"); | ||
590 | exit(1); | ||
591 | } else | ||
592 | CPU_SET_S(cpus_to_pin[cpu], | ||
593 | cpu_set_size, cpu_set); | ||
594 | } | ||
595 | break; | ||
596 | case 'p': | ||
597 | /* | ||
598 | * Although we can create a msg queue with a | ||
599 | * non-absolute path name, unlink will fail. So, | ||
600 | * if the name doesn't start with a /, add one | ||
601 | * when we save it. | ||
602 | */ | ||
603 | option = queue_path; | ||
604 | if (*option != '/') { | ||
605 | queue_path = malloc(strlen(option) + 2); | ||
606 | if (!queue_path) { | ||
607 | perror("malloc()"); | ||
608 | exit(1); | ||
609 | } | ||
610 | queue_path[0] = '/'; | ||
611 | queue_path[1] = 0; | ||
612 | strcat(queue_path, option); | ||
613 | free(option); | ||
614 | } | ||
615 | break; | ||
616 | } | ||
617 | } | ||
618 | |||
619 | if (continuous_mode && num_cpus_to_pin == 0) { | ||
620 | fprintf(stderr, "Must pass at least one CPU to continuous " | ||
621 | "mode.\n"); | ||
622 | poptPrintUsage(popt_context, stderr, 0); | ||
623 | exit(1); | ||
624 | } else if (!continuous_mode) { | ||
625 | num_cpus_to_pin = 1; | ||
626 | cpus_to_pin[0] = cpus_online - 1; | ||
627 | } | ||
628 | |||
629 | if (getuid() != 0) { | ||
630 | fprintf(stderr, "Not running as root, but almost all tests " | ||
631 | "require root in order to modify\nsystem settings. " | ||
632 | "Exiting.\n"); | ||
633 | exit(1); | ||
634 | } | ||
635 | |||
636 | max_msgs = fopen(MAX_MSGS, "r+"); | ||
637 | max_msgsize = fopen(MAX_MSGSIZE, "r+"); | ||
638 | if (!max_msgs) | ||
639 | shutdown(2, "Failed to open msg_max", __LINE__); | ||
640 | if (!max_msgsize) | ||
641 | shutdown(2, "Failed to open msgsize_max", __LINE__); | ||
642 | |||
643 | /* Load up the current system values for everything we can */ | ||
644 | getr(RLIMIT_MSGQUEUE, &saved_limits); | ||
645 | cur_limits = saved_limits; | ||
646 | saved_max_msgs = cur_max_msgs = get(max_msgs); | ||
647 | saved_max_msgsize = cur_max_msgsize = get(max_msgsize); | ||
648 | errno = 0; | ||
649 | cur_nice = getpriority(PRIO_PROCESS, 0); | ||
650 | if (errno) | ||
651 | shutdown(2, "getpriority()", __LINE__); | ||
652 | |||
653 | /* Tell the user our initial state */ | ||
654 | printf("\nInitial system state:\n"); | ||
655 | printf("\tUsing queue path:\t\t\t%s\n", queue_path); | ||
656 | printf("\tRLIMIT_MSGQUEUE(soft):\t\t\t%d\n", saved_limits.rlim_cur); | ||
657 | printf("\tRLIMIT_MSGQUEUE(hard):\t\t\t%d\n", saved_limits.rlim_max); | ||
658 | printf("\tMaximum Message Size:\t\t\t%d\n", saved_max_msgsize); | ||
659 | printf("\tMaximum Queue Size:\t\t\t%d\n", saved_max_msgs); | ||
660 | printf("\tNice value:\t\t\t\t%d\n", cur_nice); | ||
661 | printf("\n"); | ||
662 | |||
663 | increase_limits(); | ||
664 | |||
665 | printf("Adjusted system state for testing:\n"); | ||
666 | if (cur_limits.rlim_cur == RLIM_INFINITY) { | ||
667 | printf("\tRLIMIT_MSGQUEUE(soft):\t\t\t(unlimited)\n"); | ||
668 | printf("\tRLIMIT_MSGQUEUE(hard):\t\t\t(unlimited)\n"); | ||
669 | } else { | ||
670 | printf("\tRLIMIT_MSGQUEUE(soft):\t\t\t%d\n", | ||
671 | cur_limits.rlim_cur); | ||
672 | printf("\tRLIMIT_MSGQUEUE(hard):\t\t\t%d\n", | ||
673 | cur_limits.rlim_max); | ||
674 | } | ||
675 | printf("\tMaximum Message Size:\t\t\t%d\n", cur_max_msgsize); | ||
676 | printf("\tMaximum Queue Size:\t\t\t%d\n", cur_max_msgs); | ||
677 | printf("\tNice value:\t\t\t\t%d\n", cur_nice); | ||
678 | printf("\tContinuous mode:\t\t\t(%s)\n", continuous_mode ? | ||
679 | (continuous_mode_fake ? "fake mode" : "enabled") : | ||
680 | "disabled"); | ||
681 | printf("\tCPUs to pin:\t\t\t\t%d", cpus_to_pin[0]); | ||
682 | for (cpu = 1; cpu < num_cpus_to_pin; cpu++) | ||
683 | printf(",%d", cpus_to_pin[cpu]); | ||
684 | printf("\n"); | ||
685 | |||
686 | sa.sa_sigaction = sig_action_SIGUSR1; | ||
687 | sigemptyset(&sa.sa_mask); | ||
688 | sigaddset(&sa.sa_mask, SIGHUP); | ||
689 | sigaddset(&sa.sa_mask, SIGINT); | ||
690 | sigaddset(&sa.sa_mask, SIGQUIT); | ||
691 | sigaddset(&sa.sa_mask, SIGTERM); | ||
692 | sa.sa_flags = SA_SIGINFO; | ||
693 | if (sigaction(SIGUSR1, &sa, NULL) == -1) | ||
694 | shutdown(1, "sigaction(SIGUSR1)", __LINE__); | ||
695 | sa.sa_sigaction = sig_action; | ||
696 | if (sigaction(SIGHUP, &sa, NULL) == -1) | ||
697 | shutdown(1, "sigaction(SIGHUP)", __LINE__); | ||
698 | if (sigaction(SIGINT, &sa, NULL) == -1) | ||
699 | shutdown(1, "sigaction(SIGINT)", __LINE__); | ||
700 | if (sigaction(SIGQUIT, &sa, NULL) == -1) | ||
701 | shutdown(1, "sigaction(SIGQUIT)", __LINE__); | ||
702 | if (sigaction(SIGTERM, &sa, NULL) == -1) | ||
703 | shutdown(1, "sigaction(SIGTERM)", __LINE__); | ||
704 | |||
705 | if (!continuous_mode_fake) { | ||
706 | attr.mq_flags = O_NONBLOCK; | ||
707 | attr.mq_maxmsg = cur_max_msgs; | ||
708 | attr.mq_msgsize = MSG_SIZE; | ||
709 | open_queue(&attr); | ||
710 | } | ||
711 | for (i = 0; i < num_cpus_to_pin; i++) { | ||
712 | pthread_attr_t thread_attr; | ||
713 | void *thread_func; | ||
714 | |||
715 | if (continuous_mode_fake) | ||
716 | thread_func = &fake_cont_thread; | ||
717 | else if (continuous_mode) | ||
718 | thread_func = &cont_thread; | ||
719 | else | ||
720 | thread_func = &perf_test_thread; | ||
721 | |||
722 | CPU_ZERO_S(cpu_set_size, cpu_set); | ||
723 | CPU_SET_S(cpus_to_pin[i], cpu_set_size, cpu_set); | ||
724 | pthread_attr_init(&thread_attr); | ||
725 | pthread_attr_setaffinity_np(&thread_attr, cpu_set_size, | ||
726 | cpu_set); | ||
727 | if (pthread_create(&cpu_threads[i], &thread_attr, thread_func, | ||
728 | NULL)) | ||
729 | shutdown(1, "pthread_create()", __LINE__); | ||
730 | pthread_attr_destroy(&thread_attr); | ||
731 | } | ||
732 | |||
733 | if (!continuous_mode) { | ||
734 | pthread_join(cpu_threads[0], &retval); | ||
735 | shutdown((long)retval, "perf_test_thread()", __LINE__); | ||
736 | } else { | ||
737 | while (1) | ||
738 | sleep(1); | ||
739 | } | ||
740 | shutdown(0, "", 0); | ||
741 | } | ||
diff --git a/usr/Kconfig b/usr/Kconfig index 65b845bd4e3e..085872bb2bb5 100644 --- a/usr/Kconfig +++ b/usr/Kconfig | |||
@@ -134,7 +134,7 @@ config INITRAMFS_COMPRESSION_BZIP2 | |||
134 | depends on RD_BZIP2 | 134 | depends on RD_BZIP2 |
135 | help | 135 | help |
136 | Its compression ratio and speed is intermediate. | 136 | Its compression ratio and speed is intermediate. |
137 | Decompression speed is slowest among the four. The initramfs | 137 | Decompression speed is slowest among the choices. The initramfs |
138 | size is about 10% smaller with bzip2, in comparison to gzip. | 138 | size is about 10% smaller with bzip2, in comparison to gzip. |
139 | Bzip2 uses a large amount of memory. For modern kernels you | 139 | Bzip2 uses a large amount of memory. For modern kernels you |
140 | will need at least 8MB RAM or more for booting. | 140 | will need at least 8MB RAM or more for booting. |
@@ -143,9 +143,9 @@ config INITRAMFS_COMPRESSION_LZMA | |||
143 | bool "LZMA" | 143 | bool "LZMA" |
144 | depends on RD_LZMA | 144 | depends on RD_LZMA |
145 | help | 145 | help |
146 | The most recent compression algorithm. | 146 | This algorithm's compression ratio is best. |
147 | Its ratio is best, decompression speed is between the other | 147 | Decompression speed is between the other choices. |
148 | three. Compression is slowest. The initramfs size is about 33% | 148 | Compression is slowest. The initramfs size is about 33% |
149 | smaller with LZMA in comparison to gzip. | 149 | smaller with LZMA in comparison to gzip. |
150 | 150 | ||
151 | config INITRAMFS_COMPRESSION_XZ | 151 | config INITRAMFS_COMPRESSION_XZ |
@@ -161,7 +161,7 @@ config INITRAMFS_COMPRESSION_LZO | |||
161 | bool "LZO" | 161 | bool "LZO" |
162 | depends on RD_LZO | 162 | depends on RD_LZO |
163 | help | 163 | help |
164 | Its compression ratio is the poorest among the four. The kernel | 164 | Its compression ratio is the poorest among the choices. The kernel |
165 | size is about 10% bigger than gzip; however its speed | 165 | size is about 10% bigger than gzip; however its speed |
166 | (both compression and decompression) is the fastest. | 166 | (both compression and decompression) is the fastest. |
167 | 167 | ||