summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
Diffstat (limited to 'lib')
-rw-r--r--lib/Kconfig3
-rw-r--r--lib/Kconfig.debug72
-rw-r--r--lib/Makefile2
-rw-r--r--lib/alloc_tag.c2
-rw-r--r--lib/base64.c189
-rw-r--r--lib/cache_maint.c138
-rw-r--r--lib/dynamic_debug.c1
-rw-r--r--lib/fonts/Kconfig12
-rw-r--r--lib/fonts/Makefile1
-rw-r--r--lib/fonts/font_ter10x18.c5143
-rw-r--r--lib/fonts/fonts.c3
-rw-r--r--lib/hweight.c4
-rw-r--r--lib/lockref.c1
-rw-r--r--lib/math/div64.c185
-rw-r--r--lib/math/test_mul_u64_u64_div_u64.c191
-rw-r--r--lib/plist.c4
-rw-r--r--lib/raid6/recov_rvv.c7
-rw-r--r--lib/raid6/rvv.c299
-rw-r--r--lib/raid6/rvv.h17
-rw-r--r--lib/raid6/test/Makefile8
-rw-r--r--lib/ratelimit.c2
-rw-r--r--lib/rbtree.c29
-rw-r--r--lib/sys_info.c169
-rw-r--r--lib/test_hmm.c457
-rw-r--r--lib/test_hmm_uapi.h3
-rw-r--r--lib/test_kho.c140
-rw-r--r--lib/test_vmalloc.c28
-rw-r--r--lib/tests/Makefile1
-rw-r--r--lib/tests/base64_kunit.c294
-rw-r--r--lib/tests/string_kunit.c13
-rw-r--r--lib/tests/test_fprobe.c99
-rw-r--r--lib/usercopy.c4
-rw-r--r--lib/xxhash.c29
-rw-r--r--lib/xz/xz_dec_bcj.c95
-rw-r--r--lib/xz/xz_private.h4
35 files changed, 6928 insertions, 721 deletions
diff --git a/lib/Kconfig b/lib/Kconfig
index e629449dd2a3..2923924bea78 100644
--- a/lib/Kconfig
+++ b/lib/Kconfig
@@ -542,6 +542,9 @@ config MEMREGION
config ARCH_HAS_CPU_CACHE_INVALIDATE_MEMREGION
bool
+config GENERIC_CPU_CACHE_MAINTENANCE
+ bool
+
config ARCH_HAS_MEMREMAP_COMPAT_ALIGN
bool
diff --git a/lib/Kconfig.debug b/lib/Kconfig.debug
index 742b23ef0d8b..ba36939fda79 100644
--- a/lib/Kconfig.debug
+++ b/lib/Kconfig.debug
@@ -342,8 +342,7 @@ config DEBUG_INFO_COMPRESSED_ZLIB
depends on $(cc-option,-gz=zlib)
depends on $(ld-option,--compress-debug-sections=zlib)
help
- Compress the debug information using zlib. Requires GCC 5.0+ or Clang
- 5.0+, binutils 2.26+, and zlib.
+ Compress the debug information using zlib.
Users of dpkg-deb via debian/rules may find an increase in
size of their debug .deb packages with this config set, due to the
@@ -493,23 +492,23 @@ config DEBUG_SECTION_MISMATCH
bool "Enable full Section mismatch analysis"
depends on CC_IS_GCC
help
- The section mismatch analysis checks if there are illegal
- references from one section to another section.
- During linktime or runtime, some sections are dropped;
- any use of code/data previously in these sections would
- most likely result in an oops.
- In the code, functions and variables are annotated with
- __init,, etc. (see the full list in include/linux/init.h),
- which results in the code/data being placed in specific sections.
+ The section mismatch analysis checks if there are illegal references
+ from one section to another. During linktime or runtime, some
+ sections are dropped; any use of code/data previously in these
+ sections would most likely result in an oops.
+
+ In the code, functions and variables are annotated with __init,
+ __initdata, and so on (see the full list in include/linux/init.h).
+ This directs the toolchain to place code/data in specific sections.
+
The section mismatch analysis is always performed after a full
- kernel build, and enabling this option causes the following
- additional step to occur:
- - Add the option -fno-inline-functions-called-once to gcc commands.
- When inlining a function annotated with __init in a non-init
- function, we would lose the section information and thus
- the analysis would not catch the illegal reference.
- This option tells gcc to inline less (but it does result in
- a larger kernel).
+ kernel build, and enabling this option causes the option
+ -fno-inline-functions-called-once to be added to gcc commands.
+
+ However, when inlining a function annotated with __init in
+ a non-init function, we would lose the section information and thus
+ the analysis would not catch the illegal reference. This option
+ tells gcc to inline less (but it does result in a larger kernel).
config SECTION_MISMATCH_WARN_ONLY
bool "Make section mismatch errors non-fatal"
@@ -688,7 +687,7 @@ choice
help
This selects the default access restrictions for debugfs.
It can be overridden with kernel command line option
- debugfs=[on,no-mount,off]. The restrictions apply for API access
+ debugfs=[on,off]. The restrictions apply for API access
and filesystem registration.
config DEBUG_FS_ALLOW_ALL
@@ -697,13 +696,6 @@ config DEBUG_FS_ALLOW_ALL
No restrictions apply. Both API and filesystem registration
is on. This is the normal default operation.
-config DEBUG_FS_DISALLOW_MOUNT
- bool "Do not register debugfs as filesystem"
- help
- The API is open but filesystem is not loaded. Clients can still do
- their work and read with debug tools that do not need
- debugfs filesystem.
-
config DEBUG_FS_ALLOW_NONE
bool "No access"
help
@@ -1267,12 +1259,13 @@ config DEFAULT_HUNG_TASK_TIMEOUT
Keeping the default should be fine in most cases.
config BOOTPARAM_HUNG_TASK_PANIC
- bool "Panic (Reboot) On Hung Tasks"
+ int "Number of hung tasks to trigger kernel panic"
depends on DETECT_HUNG_TASK
+ default 0
help
- Say Y here to enable the kernel to panic on "hung tasks",
- which are bugs that cause the kernel to leave a task stuck
- in uninterruptible "D" state.
+ When set to a non-zero value, a kernel panic will be triggered
+ if the number of hung tasks found during a single scan reaches
+ this value.
The panic can be used in combination with panic_timeout,
to cause the system to reboot automatically after a
@@ -2824,8 +2817,25 @@ config CMDLINE_KUNIT_TEST
If unsure, say N.
+config BASE64_KUNIT
+ tristate "KUnit test for base64 decoding and encoding" if !KUNIT_ALL_TESTS
+ depends on KUNIT
+ default KUNIT_ALL_TESTS
+ help
+ This builds the base64 unit tests.
+
+ The tests cover the encoding and decoding logic of Base64 functions
+ in the kernel.
+ In addition to correctness checks, simple performance benchmarks
+ for both encoding and decoding are also included.
+
+ For more information on KUnit and unit tests in general please refer
+ to the KUnit documentation in Documentation/dev-tools/kunit/.
+
+ If unsure, say N.
+
config BITS_TEST
- tristate "KUnit test for bits.h" if !KUNIT_ALL_TESTS
+ tristate "KUnit test for bit functions and macros" if !KUNIT_ALL_TESTS
depends on KUNIT
default KUNIT_ALL_TESTS
help
diff --git a/lib/Makefile b/lib/Makefile
index 1ab2c4be3b66..aaf677cf4527 100644
--- a/lib/Makefile
+++ b/lib/Makefile
@@ -127,6 +127,8 @@ obj-$(CONFIG_HAS_IOMEM) += iomap_copy.o devres.o
obj-$(CONFIG_CHECK_SIGNATURE) += check_signature.o
obj-$(CONFIG_DEBUG_LOCKING_API_SELFTESTS) += locking-selftest.o
+obj-$(CONFIG_GENERIC_CPU_CACHE_MAINTENANCE) += cache_maint.o
+
lib-y += logic_pio.o
lib-$(CONFIG_INDIRECT_IOMEM) += logic_iomem.o
diff --git a/lib/alloc_tag.c b/lib/alloc_tag.c
index f26456988445..27fee57a5c91 100644
--- a/lib/alloc_tag.c
+++ b/lib/alloc_tag.c
@@ -845,7 +845,7 @@ static int __init alloc_tag_init(void)
alloc_tag_cttype = codetag_register_type(&desc);
if (IS_ERR(alloc_tag_cttype)) {
- pr_err("Allocation tags registration failed, errno = %ld\n", PTR_ERR(alloc_tag_cttype));
+ pr_err("Allocation tags registration failed, errno = %pe\n", alloc_tag_cttype);
free_mod_tags_mem();
shutdown_mem_profiling(true);
return PTR_ERR(alloc_tag_cttype);
diff --git a/lib/base64.c b/lib/base64.c
index b736a7a431c5..41961a444028 100644
--- a/lib/base64.c
+++ b/lib/base64.c
@@ -1,12 +1,12 @@
// SPDX-License-Identifier: GPL-2.0
/*
- * base64.c - RFC4648-compliant base64 encoding
+ * base64.c - Base64 with support for multiple variants
*
* Copyright (c) 2020 Hannes Reinecke, SUSE
*
* Based on the base64url routines from fs/crypto/fname.c
- * (which are using the URL-safe base64 encoding),
- * modified to use the standard coding table from RFC4648 section 4.
+ * (which are using the URL-safe Base64 encoding),
+ * modified to support multiple Base64 variants.
*/
#include <linux/kernel.h>
@@ -15,89 +15,170 @@
#include <linux/string.h>
#include <linux/base64.h>
-static const char base64_table[65] =
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
+static const char base64_tables[][65] = {
+ [BASE64_STD] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",
+ [BASE64_URLSAFE] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_",
+ [BASE64_IMAP] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+,",
+};
+/*
+ * Initialize the base64 reverse mapping for a single character
+ * This macro maps a character to its corresponding base64 value,
+ * returning -1 if the character is invalid.
+ * char 'A'-'Z' maps to 0-25, 'a'-'z' maps to 26-51, '0'-'9' maps to 52-61,
+ * ch_62 maps to 62, ch_63 maps to 63, and other characters return -1
+ */
+#define INIT_1(v, ch_62, ch_63) \
+ [v] = (v) >= 'A' && (v) <= 'Z' ? (v) - 'A' \
+ : (v) >= 'a' && (v) <= 'z' ? (v) - 'a' + 26 \
+ : (v) >= '0' && (v) <= '9' ? (v) - '0' + 52 \
+ : (v) == (ch_62) ? 62 : (v) == (ch_63) ? 63 : -1
+
+/*
+ * Recursive macros to generate multiple Base64 reverse mapping table entries.
+ * Each macro generates a sequence of entries in the lookup table:
+ * INIT_2 generates 2 entries, INIT_4 generates 4, INIT_8 generates 8, and so on up to INIT_32.
+ */
+#define INIT_2(v, ...) INIT_1(v, __VA_ARGS__), INIT_1((v) + 1, __VA_ARGS__)
+#define INIT_4(v, ...) INIT_2(v, __VA_ARGS__), INIT_2((v) + 2, __VA_ARGS__)
+#define INIT_8(v, ...) INIT_4(v, __VA_ARGS__), INIT_4((v) + 4, __VA_ARGS__)
+#define INIT_16(v, ...) INIT_8(v, __VA_ARGS__), INIT_8((v) + 8, __VA_ARGS__)
+#define INIT_32(v, ...) INIT_16(v, __VA_ARGS__), INIT_16((v) + 16, __VA_ARGS__)
+
+#define BASE64_REV_INIT(ch_62, ch_63) { \
+ [0 ... 0x1f] = -1, \
+ INIT_32(0x20, ch_62, ch_63), \
+ INIT_32(0x40, ch_62, ch_63), \
+ INIT_32(0x60, ch_62, ch_63), \
+ [0x80 ... 0xff] = -1 }
+
+static const s8 base64_rev_maps[][256] = {
+ [BASE64_STD] = BASE64_REV_INIT('+', '/'),
+ [BASE64_URLSAFE] = BASE64_REV_INIT('-', '_'),
+ [BASE64_IMAP] = BASE64_REV_INIT('+', ',')
+};
+
+#undef BASE64_REV_INIT
+#undef INIT_32
+#undef INIT_16
+#undef INIT_8
+#undef INIT_4
+#undef INIT_2
+#undef INIT_1
/**
- * base64_encode() - base64-encode some binary data
+ * base64_encode() - Base64-encode some binary data
* @src: the binary data to encode
* @srclen: the length of @src in bytes
- * @dst: (output) the base64-encoded string. Not NUL-terminated.
+ * @dst: (output) the Base64-encoded string. Not NUL-terminated.
+ * @padding: whether to append '=' padding characters
+ * @variant: which base64 variant to use
*
- * Encodes data using base64 encoding, i.e. the "Base 64 Encoding" specified
- * by RFC 4648, including the '='-padding.
+ * Encodes data using the selected Base64 variant.
*
- * Return: the length of the resulting base64-encoded string in bytes.
+ * Return: the length of the resulting Base64-encoded string in bytes.
*/
-int base64_encode(const u8 *src, int srclen, char *dst)
+int base64_encode(const u8 *src, int srclen, char *dst, bool padding, enum base64_variant variant)
{
u32 ac = 0;
- int bits = 0;
- int i;
char *cp = dst;
+ const char *base64_table = base64_tables[variant];
- for (i = 0; i < srclen; i++) {
- ac = (ac << 8) | src[i];
- bits += 8;
- do {
- bits -= 6;
- *cp++ = base64_table[(ac >> bits) & 0x3f];
- } while (bits >= 6);
- }
- if (bits) {
- *cp++ = base64_table[(ac << (6 - bits)) & 0x3f];
- bits -= 6;
+ while (srclen >= 3) {
+ ac = src[0] << 16 | src[1] << 8 | src[2];
+ *cp++ = base64_table[ac >> 18];
+ *cp++ = base64_table[(ac >> 12) & 0x3f];
+ *cp++ = base64_table[(ac >> 6) & 0x3f];
+ *cp++ = base64_table[ac & 0x3f];
+
+ src += 3;
+ srclen -= 3;
}
- while (bits < 0) {
- *cp++ = '=';
- bits += 2;
+
+ switch (srclen) {
+ case 2:
+ ac = src[0] << 16 | src[1] << 8;
+ *cp++ = base64_table[ac >> 18];
+ *cp++ = base64_table[(ac >> 12) & 0x3f];
+ *cp++ = base64_table[(ac >> 6) & 0x3f];
+ if (padding)
+ *cp++ = '=';
+ break;
+ case 1:
+ ac = src[0] << 16;
+ *cp++ = base64_table[ac >> 18];
+ *cp++ = base64_table[(ac >> 12) & 0x3f];
+ if (padding) {
+ *cp++ = '=';
+ *cp++ = '=';
+ }
+ break;
}
return cp - dst;
}
EXPORT_SYMBOL_GPL(base64_encode);
/**
- * base64_decode() - base64-decode a string
+ * base64_decode() - Base64-decode a string
* @src: the string to decode. Doesn't need to be NUL-terminated.
* @srclen: the length of @src in bytes
* @dst: (output) the decoded binary data
+ * @padding: whether to append '=' padding characters
+ * @variant: which base64 variant to use
*
- * Decodes a string using base64 encoding, i.e. the "Base 64 Encoding"
- * specified by RFC 4648, including the '='-padding.
- *
- * This implementation hasn't been optimized for performance.
+ * Decodes a string using the selected Base64 variant.
*
* Return: the length of the resulting decoded binary data in bytes,
- * or -1 if the string isn't a valid base64 string.
+ * or -1 if the string isn't a valid Base64 string.
*/
-int base64_decode(const char *src, int srclen, u8 *dst)
+int base64_decode(const char *src, int srclen, u8 *dst, bool padding, enum base64_variant variant)
{
- u32 ac = 0;
- int bits = 0;
- int i;
u8 *bp = dst;
+ s8 input[4];
+ s32 val;
+ const u8 *s = (const u8 *)src;
+ const s8 *base64_rev_tables = base64_rev_maps[variant];
- for (i = 0; i < srclen; i++) {
- const char *p = strchr(base64_table, src[i]);
+ while (srclen >= 4) {
+ input[0] = base64_rev_tables[s[0]];
+ input[1] = base64_rev_tables[s[1]];
+ input[2] = base64_rev_tables[s[2]];
+ input[3] = base64_rev_tables[s[3]];
- if (src[i] == '=') {
- ac = (ac << 6);
- bits += 6;
- if (bits >= 8)
- bits -= 8;
- continue;
- }
- if (p == NULL || src[i] == 0)
- return -1;
- ac = (ac << 6) | (p - base64_table);
- bits += 6;
- if (bits >= 8) {
- bits -= 8;
- *bp++ = (u8)(ac >> bits);
+ val = input[0] << 18 | input[1] << 12 | input[2] << 6 | input[3];
+
+ if (unlikely(val < 0)) {
+ if (!padding || srclen != 4 || s[3] != '=')
+ return -1;
+ padding = 0;
+ srclen = s[2] == '=' ? 2 : 3;
+ break;
}
+
+ *bp++ = val >> 16;
+ *bp++ = val >> 8;
+ *bp++ = val;
+
+ s += 4;
+ srclen -= 4;
}
- if (ac & ((1 << bits) - 1))
+
+ if (likely(!srclen))
+ return bp - dst;
+ if (padding || srclen == 1)
return -1;
+
+ val = (base64_rev_tables[s[0]] << 12) | (base64_rev_tables[s[1]] << 6);
+ *bp++ = val >> 10;
+
+ if (srclen == 2) {
+ if (val & 0x800003ff)
+ return -1;
+ } else {
+ val |= base64_rev_tables[s[2]];
+ if (val & 0x80000003)
+ return -1;
+ *bp++ = val >> 2;
+ }
return bp - dst;
}
EXPORT_SYMBOL_GPL(base64_decode);
diff --git a/lib/cache_maint.c b/lib/cache_maint.c
new file mode 100644
index 000000000000..9256a9ffc34c
--- /dev/null
+++ b/lib/cache_maint.c
@@ -0,0 +1,138 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Generic support for Memory System Cache Maintenance operations.
+ *
+ * Coherency maintenance drivers register with this simple framework that will
+ * iterate over each registered instance to first kick off invalidation and
+ * then to wait until it is complete.
+ *
+ * If no implementations are registered yet cpu_cache_has_invalidate_memregion()
+ * will return false. If this runs concurrently with unregistration then a
+ * race exists but this is no worse than the case where the operations instance
+ * responsible for a given memory region has not yet registered.
+ */
+#include <linux/cache_coherency.h>
+#include <linux/cleanup.h>
+#include <linux/container_of.h>
+#include <linux/export.h>
+#include <linux/kref.h>
+#include <linux/list.h>
+#include <linux/memregion.h>
+#include <linux/module.h>
+#include <linux/rwsem.h>
+#include <linux/slab.h>
+
+static LIST_HEAD(cache_ops_instance_list);
+static DECLARE_RWSEM(cache_ops_instance_list_lock);
+
+static void __cache_coherency_ops_instance_free(struct kref *kref)
+{
+ struct cache_coherency_ops_inst *cci =
+ container_of(kref, struct cache_coherency_ops_inst, kref);
+ kfree(cci);
+}
+
+void cache_coherency_ops_instance_put(struct cache_coherency_ops_inst *cci)
+{
+ kref_put(&cci->kref, __cache_coherency_ops_instance_free);
+}
+EXPORT_SYMBOL_GPL(cache_coherency_ops_instance_put);
+
+static int cache_inval_one(struct cache_coherency_ops_inst *cci, void *data)
+{
+ if (!cci->ops)
+ return -EINVAL;
+
+ return cci->ops->wbinv(cci, data);
+}
+
+static int cache_inval_done_one(struct cache_coherency_ops_inst *cci)
+{
+ if (!cci->ops)
+ return -EINVAL;
+
+ if (!cci->ops->done)
+ return 0;
+
+ return cci->ops->done(cci);
+}
+
+static int cache_invalidate_memregion(phys_addr_t addr, size_t size)
+{
+ int ret;
+ struct cache_coherency_ops_inst *cci;
+ struct cc_inval_params params = {
+ .addr = addr,
+ .size = size,
+ };
+
+ guard(rwsem_read)(&cache_ops_instance_list_lock);
+ list_for_each_entry(cci, &cache_ops_instance_list, node) {
+ ret = cache_inval_one(cci, &params);
+ if (ret)
+ return ret;
+ }
+ list_for_each_entry(cci, &cache_ops_instance_list, node) {
+ ret = cache_inval_done_one(cci);
+ if (ret)
+ return ret;
+ }
+
+ return 0;
+}
+
+struct cache_coherency_ops_inst *
+_cache_coherency_ops_instance_alloc(const struct cache_coherency_ops *ops,
+ size_t size)
+{
+ struct cache_coherency_ops_inst *cci;
+
+ if (!ops || !ops->wbinv)
+ return NULL;
+
+ cci = kzalloc(size, GFP_KERNEL);
+ if (!cci)
+ return NULL;
+
+ cci->ops = ops;
+ INIT_LIST_HEAD(&cci->node);
+ kref_init(&cci->kref);
+
+ return cci;
+}
+EXPORT_SYMBOL_NS_GPL(_cache_coherency_ops_instance_alloc, "CACHE_COHERENCY");
+
+int cache_coherency_ops_instance_register(struct cache_coherency_ops_inst *cci)
+{
+ guard(rwsem_write)(&cache_ops_instance_list_lock);
+ list_add(&cci->node, &cache_ops_instance_list);
+
+ return 0;
+}
+EXPORT_SYMBOL_NS_GPL(cache_coherency_ops_instance_register, "CACHE_COHERENCY");
+
+void cache_coherency_ops_instance_unregister(struct cache_coherency_ops_inst *cci)
+{
+ guard(rwsem_write)(&cache_ops_instance_list_lock);
+ list_del(&cci->node);
+}
+EXPORT_SYMBOL_NS_GPL(cache_coherency_ops_instance_unregister, "CACHE_COHERENCY");
+
+int cpu_cache_invalidate_memregion(phys_addr_t start, size_t len)
+{
+ return cache_invalidate_memregion(start, len);
+}
+EXPORT_SYMBOL_NS_GPL(cpu_cache_invalidate_memregion, "DEVMEM");
+
+/*
+ * Used for optimization / debug purposes only as removal can race
+ *
+ * Machines that do not support invalidation, e.g. VMs, will not have any
+ * operations instance to register and so this will always return false.
+ */
+bool cpu_cache_has_invalidate_memregion(void)
+{
+ guard(rwsem_read)(&cache_ops_instance_list_lock);
+ return !list_empty(&cache_ops_instance_list);
+}
+EXPORT_SYMBOL_NS_GPL(cpu_cache_has_invalidate_memregion, "DEVMEM");
diff --git a/lib/dynamic_debug.c b/lib/dynamic_debug.c
index 5a007952f7f2..7d7892e57a01 100644
--- a/lib/dynamic_debug.c
+++ b/lib/dynamic_debug.c
@@ -95,6 +95,7 @@ static const struct { unsigned flag:8; char opt_char; } opt_array[] = {
{ _DPRINTK_FLAGS_INCL_SOURCENAME, 's' },
{ _DPRINTK_FLAGS_INCL_LINENO, 'l' },
{ _DPRINTK_FLAGS_INCL_TID, 't' },
+ { _DPRINTK_FLAGS_INCL_STACK, 'd' },
{ _DPRINTK_FLAGS_NONE, '_' },
};
diff --git a/lib/fonts/Kconfig b/lib/fonts/Kconfig
index ae59b5b4e225..7d03823e46dc 100644
--- a/lib/fonts/Kconfig
+++ b/lib/fonts/Kconfig
@@ -112,6 +112,17 @@ config FONT_SUN12x22
big letters (like the letters used in the SPARC PROM). If the
standard font is unreadable for you, say Y, otherwise say N.
+config FONT_TER10x18
+ bool "Terminus 10x18 font (not supported by all drivers)"
+ depends on FRAMEBUFFER_CONSOLE || DRM_PANIC
+ depends on !SPARC && FONTS || SPARC
+ help
+ Terminus Font is a clean, fixed width bitmap font, designed
+ for long (8 and more hours per day) work with computers.
+ This is the high resolution version made for use with 13-16" laptops.
+ It fits between the normal 8x16 font and Terminus 16x32.
+ If other fonts are unreadable for you, say Y, otherwise say N.
+
config FONT_TER16x32
bool "Terminus 16x32 font (not supported by all drivers)"
depends on FRAMEBUFFER_CONSOLE || DRM_PANIC
@@ -140,6 +151,7 @@ config FONT_AUTOSELECT
depends on !FONT_SUN8x16
depends on !FONT_SUN12x22
depends on !FONT_10x18
+ depends on !FONT_TER10x18
depends on !FONT_TER16x32
depends on !FONT_6x8
select FONT_8x16
diff --git a/lib/fonts/Makefile b/lib/fonts/Makefile
index e16f68492174..30a85a4292fa 100644
--- a/lib/fonts/Makefile
+++ b/lib/fonts/Makefile
@@ -14,6 +14,7 @@ font-objs-$(CONFIG_FONT_PEARL_8x8) += font_pearl_8x8.o
font-objs-$(CONFIG_FONT_ACORN_8x8) += font_acorn_8x8.o
font-objs-$(CONFIG_FONT_MINI_4x6) += font_mini_4x6.o
font-objs-$(CONFIG_FONT_6x10) += font_6x10.o
+font-objs-$(CONFIG_FONT_TER10x18) += font_ter10x18.o
font-objs-$(CONFIG_FONT_TER16x32) += font_ter16x32.o
font-objs-$(CONFIG_FONT_6x8) += font_6x8.o
diff --git a/lib/fonts/font_ter10x18.c b/lib/fonts/font_ter10x18.c
new file mode 100644
index 000000000000..80356e9d56c7
--- /dev/null
+++ b/lib/fonts/font_ter10x18.c
@@ -0,0 +1,5143 @@
+// SPDX-License-Identifier: GPL-2.0
+#include <linux/font.h>
+#include <linux/module.h>
+
+#define FONTDATAMAX 9216
+
+static const struct font_data fontdata_ter10x18 = {
+ { 0, 0, FONTDATAMAX, 0 }, {
+ /* 0 0x00 '^@' */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x7f, 0x80, /* -########- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x7f, 0x80, /* -########- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+
+ /* 1 0x01 '^A' */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x7f, 0x80, /* -########- */
+ 0x80, 0x40, /* #--------# */
+ 0x80, 0x40, /* #--------# */
+ 0xb3, 0x40, /* #-##--##-# */
+ 0xb3, 0x40, /* #-##--##-# */
+ 0x80, 0x40, /* #--------# */
+ 0x80, 0x40, /* #--------# */
+ 0xbf, 0x40, /* #-######-# */
+ 0x9e, 0x40, /* #--####--# */
+ 0x80, 0x40, /* #--------# */
+ 0x80, 0x40, /* #--------# */
+ 0x7f, 0x80, /* -########- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+
+ /* 2 0x02 '^B' */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x7f, 0x80, /* -########- */
+ 0xff, 0xc0, /* ########## */
+ 0xff, 0xc0, /* ########## */
+ 0xcc, 0xc0, /* ##--##--## */
+ 0xcc, 0xc0, /* ##--##--## */
+ 0xff, 0xc0, /* ########## */
+ 0xff, 0xc0, /* ########## */
+ 0xc0, 0xc0, /* ##------## */
+ 0xe1, 0xc0, /* ###----### */
+ 0xff, 0xc0, /* ########## */
+ 0xff, 0xc0, /* ########## */
+ 0x7f, 0x80, /* -########- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+
+ /* 3 0x03 '^C' */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x73, 0x80, /* -###--###- */
+ 0xf3, 0xc0, /* ####--#### */
+ 0xff, 0xc0, /* ########## */
+ 0xff, 0xc0, /* ########## */
+ 0xff, 0xc0, /* ########## */
+ 0xff, 0xc0, /* ########## */
+ 0x7f, 0x80, /* -########- */
+ 0x3f, 0x00, /* --######-- */
+ 0x1e, 0x00, /* ---####--- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+
+ /* 4 0x04 '^D' */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x1e, 0x00, /* ---####--- */
+ 0x3f, 0x00, /* --######-- */
+ 0x7f, 0x80, /* -########- */
+ 0xff, 0xc0, /* ########## */
+ 0xff, 0xc0, /* ########## */
+ 0x7f, 0x80, /* -########- */
+ 0x3f, 0x00, /* --######-- */
+ 0x1e, 0x00, /* ---####--- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+
+ /* 5 0x05 '^E' */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x1e, 0x00, /* ---####--- */
+ 0x3f, 0x00, /* --######-- */
+ 0x3f, 0x00, /* --######-- */
+ 0x1e, 0x00, /* ---####--- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x6d, 0x80, /* -##-##-##- */
+ 0xff, 0xc0, /* ########## */
+ 0xff, 0xc0, /* ########## */
+ 0xff, 0xc0, /* ########## */
+ 0x6d, 0x80, /* -##-##-##- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x3f, 0x00, /* --######-- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+
+ /* 6 0x06 '^F' */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x1e, 0x00, /* ---####--- */
+ 0x3f, 0x00, /* --######-- */
+ 0x7f, 0x80, /* -########- */
+ 0xff, 0xc0, /* ########## */
+ 0xff, 0xc0, /* ########## */
+ 0xff, 0xc0, /* ########## */
+ 0x6d, 0x80, /* -##-##-##- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x3f, 0x00, /* --######-- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+
+ /* 7 0x07 '^G' */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x1e, 0x00, /* ---####--- */
+ 0x1e, 0x00, /* ---####--- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+
+ /* 8 0x08 '^H' */
+ 0xff, 0xc0, /* ########## */
+ 0xff, 0xc0, /* ########## */
+ 0xff, 0xc0, /* ########## */
+ 0xff, 0xc0, /* ########## */
+ 0xff, 0xc0, /* ########## */
+ 0xff, 0xc0, /* ########## */
+ 0xff, 0xc0, /* ########## */
+ 0xf3, 0xc0, /* ####--#### */
+ 0xe1, 0xc0, /* ###----### */
+ 0xe1, 0xc0, /* ###----### */
+ 0xf3, 0xc0, /* ####--#### */
+ 0xff, 0xc0, /* ########## */
+ 0xff, 0xc0, /* ########## */
+ 0xff, 0xc0, /* ########## */
+ 0xff, 0xc0, /* ########## */
+ 0xff, 0xc0, /* ########## */
+ 0xff, 0xc0, /* ########## */
+ 0xff, 0xc0, /* ########## */
+
+ /* 9 0x09 '^I' */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x1e, 0x00, /* ---####--- */
+ 0x33, 0x00, /* --##--##-- */
+ 0x21, 0x00, /* --#----#-- */
+ 0x21, 0x00, /* --#----#-- */
+ 0x33, 0x00, /* --##--##-- */
+ 0x1e, 0x00, /* ---####--- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+
+ /* 10 0x0a '^J' */
+ 0xff, 0xc0, /* ########## */
+ 0xff, 0xc0, /* ########## */
+ 0xff, 0xc0, /* ########## */
+ 0xff, 0xc0, /* ########## */
+ 0xff, 0xc0, /* ########## */
+ 0xff, 0xc0, /* ########## */
+ 0xe1, 0xc0, /* ###----### */
+ 0xcc, 0xc0, /* ##--##--## */
+ 0xde, 0xc0, /* ##-####-## */
+ 0xde, 0xc0, /* ##-####-## */
+ 0xcc, 0xc0, /* ##--##--## */
+ 0xe1, 0xc0, /* ###----### */
+ 0xff, 0xc0, /* ########## */
+ 0xff, 0xc0, /* ########## */
+ 0xff, 0xc0, /* ########## */
+ 0xff, 0xc0, /* ########## */
+ 0xff, 0xc0, /* ########## */
+ 0xff, 0xc0, /* ########## */
+
+ /* 11 0x0b '^K' */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x0f, 0x80, /* ----#####- */
+ 0x03, 0x80, /* ------###- */
+ 0x06, 0x80, /* -----##-#- */
+ 0x0c, 0x80, /* ----##--#- */
+ 0x3e, 0x00, /* --#####--- */
+ 0x63, 0x00, /* -##---##-- */
+ 0x63, 0x00, /* -##---##-- */
+ 0x63, 0x00, /* -##---##-- */
+ 0x63, 0x00, /* -##---##-- */
+ 0x63, 0x00, /* -##---##-- */
+ 0x63, 0x00, /* -##---##-- */
+ 0x3e, 0x00, /* --#####--- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+
+ /* 12 0x0c '^L' */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x3f, 0x00, /* --######-- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x3f, 0x00, /* --######-- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x7f, 0x80, /* -########- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+
+ /* 13 0x0d '^M' */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x3f, 0x80, /* --#######- */
+ 0x31, 0x80, /* --##---##- */
+ 0x31, 0x80, /* --##---##- */
+ 0x3f, 0x80, /* --#######- */
+ 0x30, 0x00, /* --##------ */
+ 0x30, 0x00, /* --##------ */
+ 0x30, 0x00, /* --##------ */
+ 0x30, 0x00, /* --##------ */
+ 0x30, 0x00, /* --##------ */
+ 0x30, 0x00, /* --##------ */
+ 0xf0, 0x00, /* ####------ */
+ 0xe0, 0x00, /* ###------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+
+ /* 14 0x0e '^N' */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x7f, 0x80, /* -########- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x7f, 0x80, /* -########- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x63, 0x80, /* -##---###- */
+ 0xe3, 0x00, /* ###---##-- */
+ 0xc0, 0x00, /* ##-------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+
+ /* 15 0x0f '^O' */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x0c, 0x00, /* ----##---- */
+ 0xcc, 0xc0, /* ##--##--## */
+ 0x6d, 0x80, /* -##-##-##- */
+ 0x3f, 0x00, /* --######-- */
+ 0x1e, 0x00, /* ---####--- */
+ 0xf3, 0xc0, /* ####--#### */
+ 0x1e, 0x00, /* ---####--- */
+ 0x3f, 0x00, /* --######-- */
+ 0x6d, 0x80, /* -##-##-##- */
+ 0xcc, 0xc0, /* ##--##--## */
+ 0x0c, 0x00, /* ----##---- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+
+ /* 16 0x10 '^P' */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0xc0, 0x00, /* ##-------- */
+ 0xf0, 0x00, /* ####------ */
+ 0xfc, 0x00, /* ######---- */
+ 0xff, 0x00, /* ########-- */
+ 0xff, 0xc0, /* ########## */
+ 0xff, 0xc0, /* ########## */
+ 0xff, 0x00, /* ########-- */
+ 0xfc, 0x00, /* ######---- */
+ 0xf0, 0x00, /* ####------ */
+ 0xc0, 0x00, /* ##-------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+
+ /* 17 0x11 '^Q' */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0xc0, /* --------## */
+ 0x03, 0xc0, /* ------#### */
+ 0x0f, 0xc0, /* ----###### */
+ 0x3f, 0xc0, /* --######## */
+ 0xff, 0xc0, /* ########## */
+ 0xff, 0xc0, /* ########## */
+ 0x3f, 0xc0, /* --######## */
+ 0x0f, 0xc0, /* ----###### */
+ 0x03, 0xc0, /* ------#### */
+ 0x00, 0xc0, /* --------## */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+
+ /* 18 0x12 '^R' */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x1e, 0x00, /* ---####--- */
+ 0x3f, 0x00, /* --######-- */
+ 0x6d, 0x80, /* -##-##-##- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x6d, 0x80, /* -##-##-##- */
+ 0x3f, 0x00, /* --######-- */
+ 0x1e, 0x00, /* ---####--- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+
+ /* 19 0x13 '^S' */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x33, 0x00, /* --##--##-- */
+ 0x33, 0x00, /* --##--##-- */
+ 0x33, 0x00, /* --##--##-- */
+ 0x33, 0x00, /* --##--##-- */
+ 0x33, 0x00, /* --##--##-- */
+ 0x33, 0x00, /* --##--##-- */
+ 0x33, 0x00, /* --##--##-- */
+ 0x33, 0x00, /* --##--##-- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x33, 0x00, /* --##--##-- */
+ 0x33, 0x00, /* --##--##-- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+
+ /* 20 0x14 '^T' */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x3f, 0x80, /* --#######- */
+ 0x6d, 0x80, /* -##-##-##- */
+ 0x6d, 0x80, /* -##-##-##- */
+ 0x6d, 0x80, /* -##-##-##- */
+ 0x6d, 0x80, /* -##-##-##- */
+ 0x6d, 0x80, /* -##-##-##- */
+ 0x3d, 0x80, /* --####-##- */
+ 0x0d, 0x80, /* ----##-##- */
+ 0x0d, 0x80, /* ----##-##- */
+ 0x0d, 0x80, /* ----##-##- */
+ 0x0d, 0x80, /* ----##-##- */
+ 0x0d, 0x80, /* ----##-##- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+
+ /* 21 0x15 '^U' */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x1e, 0x00, /* ---####--- */
+ 0x33, 0x00, /* --##--##-- */
+ 0x30, 0x00, /* --##------ */
+ 0x1c, 0x00, /* ---###---- */
+ 0x36, 0x00, /* --##-##--- */
+ 0x33, 0x00, /* --##--##-- */
+ 0x33, 0x00, /* --##--##-- */
+ 0x33, 0x00, /* --##--##-- */
+ 0x1b, 0x00, /* ---##-##-- */
+ 0x0e, 0x00, /* ----###--- */
+ 0x03, 0x00, /* ------##-- */
+ 0x33, 0x00, /* --##--##-- */
+ 0x1e, 0x00, /* ---####--- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+
+ /* 22 0x16 '^V' */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0xff, 0x80, /* #########- */
+ 0xff, 0x80, /* #########- */
+ 0xff, 0x80, /* #########- */
+ 0xff, 0x80, /* #########- */
+ 0xff, 0x80, /* #########- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+
+ /* 23 0x17 '^W' */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x1e, 0x00, /* ---####--- */
+ 0x3f, 0x00, /* --######-- */
+ 0x6d, 0x80, /* -##-##-##- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x6d, 0x80, /* -##-##-##- */
+ 0x3f, 0x00, /* --######-- */
+ 0x1e, 0x00, /* ---####--- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x7f, 0x80, /* -########- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+
+ /* 24 0x18 '^X' */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x1e, 0x00, /* ---####--- */
+ 0x3f, 0x00, /* --######-- */
+ 0x6d, 0x80, /* -##-##-##- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+
+ /* 25 0x19 '^Y' */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x6d, 0x80, /* -##-##-##- */
+ 0x3f, 0x00, /* --######-- */
+ 0x1e, 0x00, /* ---####--- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+
+ /* 26 0x1a '^Z' */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x04, 0x00, /* -----#---- */
+ 0x06, 0x00, /* -----##--- */
+ 0x03, 0x00, /* ------##-- */
+ 0xff, 0x80, /* #########- */
+ 0xff, 0x80, /* #########- */
+ 0x03, 0x00, /* ------##-- */
+ 0x06, 0x00, /* -----##--- */
+ 0x04, 0x00, /* -----#---- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+
+ /* 27 0x1b '^[' */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x10, 0x00, /* ---#------ */
+ 0x30, 0x00, /* --##------ */
+ 0x60, 0x00, /* -##------- */
+ 0xff, 0x80, /* #########- */
+ 0xff, 0x80, /* #########- */
+ 0x60, 0x00, /* -##------- */
+ 0x30, 0x00, /* --##------ */
+ 0x10, 0x00, /* ---#------ */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+
+ /* 28 0x1c '^\' */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x60, 0x00, /* -##------- */
+ 0x60, 0x00, /* -##------- */
+ 0x60, 0x00, /* -##------- */
+ 0x60, 0x00, /* -##------- */
+ 0x60, 0x00, /* -##------- */
+ 0x60, 0x00, /* -##------- */
+ 0x7f, 0x80, /* -########- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+
+ /* 29 0x1d '^]' */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x12, 0x00, /* ---#--#--- */
+ 0x33, 0x00, /* --##--##-- */
+ 0x61, 0x80, /* -##----##- */
+ 0xff, 0xc0, /* ########## */
+ 0xff, 0xc0, /* ########## */
+ 0x61, 0x80, /* -##----##- */
+ 0x33, 0x00, /* --##--##-- */
+ 0x12, 0x00, /* ---#--#--- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+
+ /* 30 0x1e '^^' */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x1e, 0x00, /* ---####--- */
+ 0x1e, 0x00, /* ---####--- */
+ 0x3f, 0x00, /* --######-- */
+ 0x3f, 0x00, /* --######-- */
+ 0x7f, 0x80, /* -########- */
+ 0x7f, 0x80, /* -########- */
+ 0xff, 0xc0, /* ########## */
+ 0xff, 0xc0, /* ########## */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+
+ /* 31 0x1f '^_' */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0xff, 0xc0, /* ########## */
+ 0xff, 0xc0, /* ########## */
+ 0x7f, 0x80, /* -########- */
+ 0x7f, 0x80, /* -########- */
+ 0x3f, 0x00, /* --######-- */
+ 0x3f, 0x00, /* --######-- */
+ 0x1e, 0x00, /* ---####--- */
+ 0x1e, 0x00, /* ---####--- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+
+ /* 32 0x20 ' ' */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+
+ /* 33 0x21 '!' */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+
+ /* 34 0x22 '"' */
+ 0x00, 0x00, /* ---------- */
+ 0x33, 0x00, /* --##--##-- */
+ 0x33, 0x00, /* --##--##-- */
+ 0x33, 0x00, /* --##--##-- */
+ 0x33, 0x00, /* --##--##-- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+
+ /* 35 0x23 '#' */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x33, 0x00, /* --##--##-- */
+ 0x33, 0x00, /* --##--##-- */
+ 0x33, 0x00, /* --##--##-- */
+ 0x7f, 0x80, /* -########- */
+ 0x33, 0x00, /* --##--##-- */
+ 0x33, 0x00, /* --##--##-- */
+ 0x33, 0x00, /* --##--##-- */
+ 0x33, 0x00, /* --##--##-- */
+ 0x7f, 0x80, /* -########- */
+ 0x33, 0x00, /* --##--##-- */
+ 0x33, 0x00, /* --##--##-- */
+ 0x33, 0x00, /* --##--##-- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+
+ /* 36 0x24 '$' */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x3f, 0x00, /* --######-- */
+ 0x6d, 0x80, /* -##-##-##- */
+ 0x6c, 0x00, /* -##-##---- */
+ 0x6c, 0x00, /* -##-##---- */
+ 0x6c, 0x00, /* -##-##---- */
+ 0x3f, 0x00, /* --######-- */
+ 0x0d, 0x80, /* ----##-##- */
+ 0x0d, 0x80, /* ----##-##- */
+ 0x0d, 0x80, /* ----##-##- */
+ 0x6d, 0x80, /* -##-##-##- */
+ 0x3f, 0x00, /* --######-- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x00, 0x00, /* ---------- */
+
+ /* 37 0x25 '%' */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x73, 0x00, /* -###--##-- */
+ 0x53, 0x00, /* -#-#--##-- */
+ 0x76, 0x00, /* -###-##--- */
+ 0x06, 0x00, /* -----##--- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x18, 0x00, /* ---##----- */
+ 0x18, 0x00, /* ---##----- */
+ 0x30, 0x00, /* --##------ */
+ 0x37, 0x00, /* --##-###-- */
+ 0x65, 0x00, /* -##--#-#-- */
+ 0x67, 0x00, /* -##--###-- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+
+ /* 38 0x26 '&' */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x3c, 0x00, /* --####---- */
+ 0x66, 0x00, /* -##--##--- */
+ 0x66, 0x00, /* -##--##--- */
+ 0x66, 0x00, /* -##--##--- */
+ 0x3c, 0x00, /* --####---- */
+ 0x39, 0x80, /* --###--##- */
+ 0x6d, 0x80, /* -##-##-##- */
+ 0xc7, 0x00, /* ##---###-- */
+ 0xc3, 0x00, /* ##----##-- */
+ 0xc3, 0x00, /* ##----##-- */
+ 0x67, 0x80, /* -##--####- */
+ 0x3d, 0x80, /* --####-##- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+
+ /* 39 0x27 ''' */
+ 0x00, 0x00, /* ---------- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+
+ /* 40 0x28 '(' */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x06, 0x00, /* -----##--- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x18, 0x00, /* ---##----- */
+ 0x18, 0x00, /* ---##----- */
+ 0x18, 0x00, /* ---##----- */
+ 0x18, 0x00, /* ---##----- */
+ 0x18, 0x00, /* ---##----- */
+ 0x18, 0x00, /* ---##----- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x06, 0x00, /* -----##--- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+
+ /* 41 0x29 ')' */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x18, 0x00, /* ---##----- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x06, 0x00, /* -----##--- */
+ 0x06, 0x00, /* -----##--- */
+ 0x06, 0x00, /* -----##--- */
+ 0x06, 0x00, /* -----##--- */
+ 0x06, 0x00, /* -----##--- */
+ 0x06, 0x00, /* -----##--- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x18, 0x00, /* ---##----- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+
+ /* 42 0x2a '*' */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x63, 0x00, /* -##---##-- */
+ 0x36, 0x00, /* --##-##--- */
+ 0x1c, 0x00, /* ---###---- */
+ 0xff, 0x80, /* #########- */
+ 0x1c, 0x00, /* ---###---- */
+ 0x36, 0x00, /* --##-##--- */
+ 0x63, 0x00, /* -##---##-- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+
+ /* 43 0x2b '+' */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x7f, 0x80, /* -########- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+
+ /* 44 0x2c ',' */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x18, 0x00, /* ---##----- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+
+ /* 45 0x2d '-' */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x7f, 0x80, /* -########- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+
+ /* 46 0x2e '.' */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+
+ /* 47 0x2f '/' */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x03, 0x00, /* ------##-- */
+ 0x03, 0x00, /* ------##-- */
+ 0x06, 0x00, /* -----##--- */
+ 0x06, 0x00, /* -----##--- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x18, 0x00, /* ---##----- */
+ 0x18, 0x00, /* ---##----- */
+ 0x30, 0x00, /* --##------ */
+ 0x30, 0x00, /* --##------ */
+ 0x60, 0x00, /* -##------- */
+ 0x60, 0x00, /* -##------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+
+ /* 48 0x30 '0' */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x3f, 0x00, /* --######-- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x63, 0x80, /* -##---###- */
+ 0x67, 0x80, /* -##--####- */
+ 0x6d, 0x80, /* -##-##-##- */
+ 0x79, 0x80, /* -####--##- */
+ 0x71, 0x80, /* -###---##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x3f, 0x00, /* --######-- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+
+ /* 49 0x31 '1' */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x1c, 0x00, /* ---###---- */
+ 0x3c, 0x00, /* --####---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x3f, 0x00, /* --######-- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+
+ /* 50 0x32 '2' */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x3f, 0x00, /* --######-- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x01, 0x80, /* -------##- */
+ 0x03, 0x00, /* ------##-- */
+ 0x06, 0x00, /* -----##--- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x18, 0x00, /* ---##----- */
+ 0x30, 0x00, /* --##------ */
+ 0x60, 0x00, /* -##------- */
+ 0x7f, 0x80, /* -########- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+
+ /* 51 0x33 '3' */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x3f, 0x00, /* --######-- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x01, 0x80, /* -------##- */
+ 0x01, 0x80, /* -------##- */
+ 0x1f, 0x00, /* ---#####-- */
+ 0x01, 0x80, /* -------##- */
+ 0x01, 0x80, /* -------##- */
+ 0x01, 0x80, /* -------##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x3f, 0x00, /* --######-- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+
+ /* 52 0x34 '4' */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x01, 0x80, /* -------##- */
+ 0x03, 0x80, /* ------###- */
+ 0x07, 0x80, /* -----####- */
+ 0x0d, 0x80, /* ----##-##- */
+ 0x19, 0x80, /* ---##--##- */
+ 0x31, 0x80, /* --##---##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x7f, 0x80, /* -########- */
+ 0x01, 0x80, /* -------##- */
+ 0x01, 0x80, /* -------##- */
+ 0x01, 0x80, /* -------##- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+
+ /* 53 0x35 '5' */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x7f, 0x80, /* -########- */
+ 0x60, 0x00, /* -##------- */
+ 0x60, 0x00, /* -##------- */
+ 0x60, 0x00, /* -##------- */
+ 0x60, 0x00, /* -##------- */
+ 0x7f, 0x00, /* -#######-- */
+ 0x01, 0x80, /* -------##- */
+ 0x01, 0x80, /* -------##- */
+ 0x01, 0x80, /* -------##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x3f, 0x00, /* --######-- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+
+ /* 54 0x36 '6' */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x1f, 0x00, /* ---#####-- */
+ 0x30, 0x00, /* --##------ */
+ 0x60, 0x00, /* -##------- */
+ 0x60, 0x00, /* -##------- */
+ 0x60, 0x00, /* -##------- */
+ 0x7f, 0x00, /* -#######-- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x3f, 0x00, /* --######-- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+
+ /* 55 0x37 '7' */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x7f, 0x80, /* -########- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x01, 0x80, /* -------##- */
+ 0x03, 0x00, /* ------##-- */
+ 0x03, 0x00, /* ------##-- */
+ 0x06, 0x00, /* -----##--- */
+ 0x06, 0x00, /* -----##--- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+
+ /* 56 0x38 '8' */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x3f, 0x00, /* --######-- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x3f, 0x00, /* --######-- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x3f, 0x00, /* --######-- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+
+ /* 57 0x39 '9' */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x3f, 0x00, /* --######-- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x3f, 0x80, /* --#######- */
+ 0x01, 0x80, /* -------##- */
+ 0x01, 0x80, /* -------##- */
+ 0x01, 0x80, /* -------##- */
+ 0x03, 0x00, /* ------##-- */
+ 0x3e, 0x00, /* --#####--- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+
+ /* 58 0x3a ':' */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+
+ /* 59 0x3b ';' */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x18, 0x00, /* ---##----- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+
+ /* 60 0x3c '<' */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x03, 0x00, /* ------##-- */
+ 0x06, 0x00, /* -----##--- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x18, 0x00, /* ---##----- */
+ 0x30, 0x00, /* --##------ */
+ 0x60, 0x00, /* -##------- */
+ 0x60, 0x00, /* -##------- */
+ 0x30, 0x00, /* --##------ */
+ 0x18, 0x00, /* ---##----- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x06, 0x00, /* -----##--- */
+ 0x03, 0x00, /* ------##-- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+
+ /* 61 0x3d '=' */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x7f, 0x80, /* -########- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x7f, 0x80, /* -########- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+
+ /* 62 0x3e '>' */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x60, 0x00, /* -##------- */
+ 0x30, 0x00, /* --##------ */
+ 0x18, 0x00, /* ---##----- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x06, 0x00, /* -----##--- */
+ 0x03, 0x00, /* ------##-- */
+ 0x03, 0x00, /* ------##-- */
+ 0x06, 0x00, /* -----##--- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x18, 0x00, /* ---##----- */
+ 0x30, 0x00, /* --##------ */
+ 0x60, 0x00, /* -##------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+
+ /* 63 0x3f '?' */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x1e, 0x00, /* ---####--- */
+ 0x33, 0x00, /* --##--##-- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x01, 0x80, /* -------##- */
+ 0x03, 0x00, /* ------##-- */
+ 0x06, 0x00, /* -----##--- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x00, 0x00, /* ---------- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+
+ /* 64 0x40 '@' */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x7f, 0x00, /* -#######-- */
+ 0xc1, 0x80, /* ##-----##- */
+ 0xc1, 0x80, /* ##-----##- */
+ 0xcf, 0x80, /* ##--#####- */
+ 0xd9, 0x80, /* ##-##--##- */
+ 0xd9, 0x80, /* ##-##--##- */
+ 0xd9, 0x80, /* ##-##--##- */
+ 0xd9, 0x80, /* ##-##--##- */
+ 0xcf, 0x80, /* ##--#####- */
+ 0xc0, 0x00, /* ##-------- */
+ 0xc0, 0x00, /* ##-------- */
+ 0x7f, 0x80, /* -########- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+
+ /* 65 0x41 'A' */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x3f, 0x00, /* --######-- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x7f, 0x80, /* -########- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+
+ /* 66 0x42 'B' */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x7f, 0x00, /* -#######-- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x7f, 0x00, /* -#######-- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x7f, 0x00, /* -#######-- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+
+ /* 67 0x43 'C' */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x3f, 0x00, /* --######-- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x60, 0x00, /* -##------- */
+ 0x60, 0x00, /* -##------- */
+ 0x60, 0x00, /* -##------- */
+ 0x60, 0x00, /* -##------- */
+ 0x60, 0x00, /* -##------- */
+ 0x60, 0x00, /* -##------- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x3f, 0x00, /* --######-- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+
+ /* 68 0x44 'D' */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x7e, 0x00, /* -######--- */
+ 0x63, 0x00, /* -##---##-- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x63, 0x00, /* -##---##-- */
+ 0x7e, 0x00, /* -######--- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+
+ /* 69 0x45 'E' */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x7f, 0x80, /* -########- */
+ 0x60, 0x00, /* -##------- */
+ 0x60, 0x00, /* -##------- */
+ 0x60, 0x00, /* -##------- */
+ 0x60, 0x00, /* -##------- */
+ 0x7e, 0x00, /* -######--- */
+ 0x60, 0x00, /* -##------- */
+ 0x60, 0x00, /* -##------- */
+ 0x60, 0x00, /* -##------- */
+ 0x60, 0x00, /* -##------- */
+ 0x60, 0x00, /* -##------- */
+ 0x7f, 0x80, /* -########- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+
+ /* 70 0x46 'F' */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x7f, 0x80, /* -########- */
+ 0x60, 0x00, /* -##------- */
+ 0x60, 0x00, /* -##------- */
+ 0x60, 0x00, /* -##------- */
+ 0x60, 0x00, /* -##------- */
+ 0x7e, 0x00, /* -######--- */
+ 0x60, 0x00, /* -##------- */
+ 0x60, 0x00, /* -##------- */
+ 0x60, 0x00, /* -##------- */
+ 0x60, 0x00, /* -##------- */
+ 0x60, 0x00, /* -##------- */
+ 0x60, 0x00, /* -##------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+
+ /* 71 0x47 'G' */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x3f, 0x00, /* --######-- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x60, 0x00, /* -##------- */
+ 0x60, 0x00, /* -##------- */
+ 0x60, 0x00, /* -##------- */
+ 0x67, 0x80, /* -##--####- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x3f, 0x00, /* --######-- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+
+ /* 72 0x48 'H' */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x7f, 0x80, /* -########- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+
+ /* 73 0x49 'I' */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x1e, 0x00, /* ---####--- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x1e, 0x00, /* ---####--- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+
+ /* 74 0x4a 'J' */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x07, 0x80, /* -----####- */
+ 0x03, 0x00, /* ------##-- */
+ 0x03, 0x00, /* ------##-- */
+ 0x03, 0x00, /* ------##-- */
+ 0x03, 0x00, /* ------##-- */
+ 0x03, 0x00, /* ------##-- */
+ 0x03, 0x00, /* ------##-- */
+ 0x03, 0x00, /* ------##-- */
+ 0x63, 0x00, /* -##---##-- */
+ 0x63, 0x00, /* -##---##-- */
+ 0x63, 0x00, /* -##---##-- */
+ 0x3e, 0x00, /* --#####--- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+
+ /* 75 0x4b 'K' */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x63, 0x00, /* -##---##-- */
+ 0x66, 0x00, /* -##--##--- */
+ 0x6c, 0x00, /* -##-##---- */
+ 0x78, 0x00, /* -####----- */
+ 0x78, 0x00, /* -####----- */
+ 0x6c, 0x00, /* -##-##---- */
+ 0x66, 0x00, /* -##--##--- */
+ 0x63, 0x00, /* -##---##-- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+
+ /* 76 0x4c 'L' */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x60, 0x00, /* -##------- */
+ 0x60, 0x00, /* -##------- */
+ 0x60, 0x00, /* -##------- */
+ 0x60, 0x00, /* -##------- */
+ 0x60, 0x00, /* -##------- */
+ 0x60, 0x00, /* -##------- */
+ 0x60, 0x00, /* -##------- */
+ 0x60, 0x00, /* -##------- */
+ 0x60, 0x00, /* -##------- */
+ 0x60, 0x00, /* -##------- */
+ 0x60, 0x00, /* -##------- */
+ 0x7f, 0x80, /* -########- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+
+ /* 77 0x4d 'M' */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x80, 0x80, /* #-------#- */
+ 0xc1, 0x80, /* ##-----##- */
+ 0xe3, 0x80, /* ###---###- */
+ 0xf7, 0x80, /* ####-####- */
+ 0xdd, 0x80, /* ##-###-##- */
+ 0xc9, 0x80, /* ##--#--##- */
+ 0xc1, 0x80, /* ##-----##- */
+ 0xc1, 0x80, /* ##-----##- */
+ 0xc1, 0x80, /* ##-----##- */
+ 0xc1, 0x80, /* ##-----##- */
+ 0xc1, 0x80, /* ##-----##- */
+ 0xc1, 0x80, /* ##-----##- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+
+ /* 78 0x4e 'N' */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x71, 0x80, /* -###---##- */
+ 0x79, 0x80, /* -####--##- */
+ 0x6d, 0x80, /* -##-##-##- */
+ 0x67, 0x80, /* -##--####- */
+ 0x63, 0x80, /* -##---###- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+
+ /* 79 0x4f 'O' */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x3f, 0x00, /* --######-- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x3f, 0x00, /* --######-- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+
+ /* 80 0x50 'P' */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x7f, 0x00, /* -#######-- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x7f, 0x00, /* -#######-- */
+ 0x60, 0x00, /* -##------- */
+ 0x60, 0x00, /* -##------- */
+ 0x60, 0x00, /* -##------- */
+ 0x60, 0x00, /* -##------- */
+ 0x60, 0x00, /* -##------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+
+ /* 81 0x51 'Q' */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x3f, 0x00, /* --######-- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x67, 0x80, /* -##--####- */
+ 0x3f, 0x00, /* --######-- */
+ 0x03, 0x00, /* ------##-- */
+ 0x01, 0x80, /* -------##- */
+ 0x00, 0x00, /* ---------- */
+
+ /* 82 0x52 'R' */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x7f, 0x00, /* -#######-- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x7f, 0x00, /* -#######-- */
+ 0x78, 0x00, /* -####----- */
+ 0x6c, 0x00, /* -##-##---- */
+ 0x66, 0x00, /* -##--##--- */
+ 0x63, 0x00, /* -##---##-- */
+ 0x61, 0x80, /* -##----##- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+
+ /* 83 0x53 'S' */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x3f, 0x00, /* --######-- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x60, 0x00, /* -##------- */
+ 0x60, 0x00, /* -##------- */
+ 0x3f, 0x00, /* --######-- */
+ 0x01, 0x80, /* -------##- */
+ 0x01, 0x80, /* -------##- */
+ 0x01, 0x80, /* -------##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x3f, 0x00, /* --######-- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+
+ /* 84 0x54 'T' */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x7f, 0x80, /* -########- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+
+ /* 85 0x55 'U' */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x3f, 0x00, /* --######-- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+
+ /* 86 0x56 'V' */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x33, 0x00, /* --##--##-- */
+ 0x33, 0x00, /* --##--##-- */
+ 0x33, 0x00, /* --##--##-- */
+ 0x33, 0x00, /* --##--##-- */
+ 0x1e, 0x00, /* ---####--- */
+ 0x1e, 0x00, /* ---####--- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+
+ /* 87 0x57 'W' */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0xc1, 0x80, /* ##-----##- */
+ 0xc1, 0x80, /* ##-----##- */
+ 0xc1, 0x80, /* ##-----##- */
+ 0xc1, 0x80, /* ##-----##- */
+ 0xc1, 0x80, /* ##-----##- */
+ 0xc1, 0x80, /* ##-----##- */
+ 0xc9, 0x80, /* ##--#--##- */
+ 0xdd, 0x80, /* ##-###-##- */
+ 0xf7, 0x80, /* ####-####- */
+ 0xe3, 0x80, /* ###---###- */
+ 0xc1, 0x80, /* ##-----##- */
+ 0x80, 0x80, /* #-------#- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+
+ /* 88 0x58 'X' */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x33, 0x00, /* --##--##-- */
+ 0x33, 0x00, /* --##--##-- */
+ 0x1e, 0x00, /* ---####--- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x1e, 0x00, /* ---####--- */
+ 0x33, 0x00, /* --##--##-- */
+ 0x33, 0x00, /* --##--##-- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+
+ /* 89 0x59 'Y' */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x33, 0x00, /* --##--##-- */
+ 0x33, 0x00, /* --##--##-- */
+ 0x1e, 0x00, /* ---####--- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+
+ /* 90 0x5a 'Z' */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x7f, 0x80, /* -########- */
+ 0x01, 0x80, /* -------##- */
+ 0x01, 0x80, /* -------##- */
+ 0x03, 0x00, /* ------##-- */
+ 0x06, 0x00, /* -----##--- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x18, 0x00, /* ---##----- */
+ 0x30, 0x00, /* --##------ */
+ 0x60, 0x00, /* -##------- */
+ 0x60, 0x00, /* -##------- */
+ 0x60, 0x00, /* -##------- */
+ 0x7f, 0x80, /* -########- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+
+ /* 91 0x5b '[' */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x1e, 0x00, /* ---####--- */
+ 0x18, 0x00, /* ---##----- */
+ 0x18, 0x00, /* ---##----- */
+ 0x18, 0x00, /* ---##----- */
+ 0x18, 0x00, /* ---##----- */
+ 0x18, 0x00, /* ---##----- */
+ 0x18, 0x00, /* ---##----- */
+ 0x18, 0x00, /* ---##----- */
+ 0x18, 0x00, /* ---##----- */
+ 0x18, 0x00, /* ---##----- */
+ 0x18, 0x00, /* ---##----- */
+ 0x1e, 0x00, /* ---####--- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+
+ /* 92 0x5c '\' */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x60, 0x00, /* -##------- */
+ 0x60, 0x00, /* -##------- */
+ 0x30, 0x00, /* --##------ */
+ 0x30, 0x00, /* --##------ */
+ 0x18, 0x00, /* ---##----- */
+ 0x18, 0x00, /* ---##----- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x06, 0x00, /* -----##--- */
+ 0x06, 0x00, /* -----##--- */
+ 0x03, 0x00, /* ------##-- */
+ 0x03, 0x00, /* ------##-- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+
+ /* 93 0x5d ']' */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x1e, 0x00, /* ---####--- */
+ 0x06, 0x00, /* -----##--- */
+ 0x06, 0x00, /* -----##--- */
+ 0x06, 0x00, /* -----##--- */
+ 0x06, 0x00, /* -----##--- */
+ 0x06, 0x00, /* -----##--- */
+ 0x06, 0x00, /* -----##--- */
+ 0x06, 0x00, /* -----##--- */
+ 0x06, 0x00, /* -----##--- */
+ 0x06, 0x00, /* -----##--- */
+ 0x06, 0x00, /* -----##--- */
+ 0x1e, 0x00, /* ---####--- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+
+ /* 94 0x5e '^' */
+ 0x00, 0x00, /* ---------- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x1e, 0x00, /* ---####--- */
+ 0x33, 0x00, /* --##--##-- */
+ 0x61, 0x80, /* -##----##- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+
+ /* 95 0x5f '_' */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x7f, 0x80, /* -########- */
+ 0x00, 0x00, /* ---------- */
+
+ /* 96 0x60 '`' */
+ 0x30, 0x00, /* --##------ */
+ 0x18, 0x00, /* ---##----- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+
+ /* 97 0x61 'a' */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x3f, 0x00, /* --######-- */
+ 0x01, 0x80, /* -------##- */
+ 0x01, 0x80, /* -------##- */
+ 0x3f, 0x80, /* --#######- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x3f, 0x80, /* --#######- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+
+ /* 98 0x62 'b' */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x60, 0x00, /* -##------- */
+ 0x60, 0x00, /* -##------- */
+ 0x60, 0x00, /* -##------- */
+ 0x7f, 0x00, /* -#######-- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x7f, 0x00, /* -#######-- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+
+ /* 99 0x63 'c' */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x3f, 0x00, /* --######-- */
+ 0x61, 0x80, /* -##----##- */
+ 0x60, 0x00, /* -##------- */
+ 0x60, 0x00, /* -##------- */
+ 0x60, 0x00, /* -##------- */
+ 0x60, 0x00, /* -##------- */
+ 0x60, 0x00, /* -##------- */
+ 0x61, 0x80, /* -##----##- */
+ 0x3f, 0x00, /* --######-- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+
+ /* 100 0x64 'd' */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x01, 0x80, /* -------##- */
+ 0x01, 0x80, /* -------##- */
+ 0x01, 0x80, /* -------##- */
+ 0x3f, 0x80, /* --#######- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x3f, 0x80, /* --#######- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+
+ /* 101 0x65 'e' */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x3f, 0x00, /* --######-- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x7f, 0x80, /* -########- */
+ 0x60, 0x00, /* -##------- */
+ 0x60, 0x00, /* -##------- */
+ 0x61, 0x80, /* -##----##- */
+ 0x3f, 0x00, /* --######-- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+
+ /* 102 0x66 'f' */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x07, 0x80, /* -----####- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x3f, 0x00, /* --######-- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+
+ /* 103 0x67 'g' */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x3f, 0x80, /* --#######- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x3f, 0x80, /* --#######- */
+ 0x01, 0x80, /* -------##- */
+ 0x01, 0x80, /* -------##- */
+ 0x3f, 0x00, /* --######-- */
+
+ /* 104 0x68 'h' */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x60, 0x00, /* -##------- */
+ 0x60, 0x00, /* -##------- */
+ 0x60, 0x00, /* -##------- */
+ 0x7f, 0x00, /* -#######-- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+
+ /* 105 0x69 'i' */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x00, 0x00, /* ---------- */
+ 0x1c, 0x00, /* ---###---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x1e, 0x00, /* ---####--- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+
+ /* 106 0x6a 'j' */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x03, 0x00, /* ------##-- */
+ 0x03, 0x00, /* ------##-- */
+ 0x00, 0x00, /* ---------- */
+ 0x07, 0x00, /* -----###-- */
+ 0x03, 0x00, /* ------##-- */
+ 0x03, 0x00, /* ------##-- */
+ 0x03, 0x00, /* ------##-- */
+ 0x03, 0x00, /* ------##-- */
+ 0x03, 0x00, /* ------##-- */
+ 0x03, 0x00, /* ------##-- */
+ 0x03, 0x00, /* ------##-- */
+ 0x03, 0x00, /* ------##-- */
+ 0x33, 0x00, /* --##--##-- */
+ 0x33, 0x00, /* --##--##-- */
+ 0x1e, 0x00, /* ---####--- */
+
+ /* 107 0x6b 'k' */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x60, 0x00, /* -##------- */
+ 0x60, 0x00, /* -##------- */
+ 0x60, 0x00, /* -##------- */
+ 0x61, 0x80, /* -##----##- */
+ 0x63, 0x00, /* -##---##-- */
+ 0x66, 0x00, /* -##--##--- */
+ 0x6c, 0x00, /* -##-##---- */
+ 0x78, 0x00, /* -####----- */
+ 0x6c, 0x00, /* -##-##---- */
+ 0x66, 0x00, /* -##--##--- */
+ 0x63, 0x00, /* -##---##-- */
+ 0x61, 0x80, /* -##----##- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+
+ /* 108 0x6c 'l' */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x1c, 0x00, /* ---###---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x1e, 0x00, /* ---####--- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+
+ /* 109 0x6d 'm' */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x7f, 0x00, /* -#######-- */
+ 0x6d, 0x80, /* -##-##-##- */
+ 0x6d, 0x80, /* -##-##-##- */
+ 0x6d, 0x80, /* -##-##-##- */
+ 0x6d, 0x80, /* -##-##-##- */
+ 0x6d, 0x80, /* -##-##-##- */
+ 0x6d, 0x80, /* -##-##-##- */
+ 0x6d, 0x80, /* -##-##-##- */
+ 0x6d, 0x80, /* -##-##-##- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+
+ /* 110 0x6e 'n' */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x7f, 0x00, /* -#######-- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+
+ /* 111 0x6f 'o' */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x3f, 0x00, /* --######-- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x3f, 0x00, /* --######-- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+
+ /* 112 0x70 'p' */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x7f, 0x00, /* -#######-- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x7f, 0x00, /* -#######-- */
+ 0x60, 0x00, /* -##------- */
+ 0x60, 0x00, /* -##------- */
+ 0x60, 0x00, /* -##------- */
+
+ /* 113 0x71 'q' */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x3f, 0x80, /* --#######- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x3f, 0x80, /* --#######- */
+ 0x01, 0x80, /* -------##- */
+ 0x01, 0x80, /* -------##- */
+ 0x01, 0x80, /* -------##- */
+
+ /* 114 0x72 'r' */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x6f, 0x80, /* -##-#####- */
+ 0x78, 0x00, /* -####----- */
+ 0x70, 0x00, /* -###------ */
+ 0x60, 0x00, /* -##------- */
+ 0x60, 0x00, /* -##------- */
+ 0x60, 0x00, /* -##------- */
+ 0x60, 0x00, /* -##------- */
+ 0x60, 0x00, /* -##------- */
+ 0x60, 0x00, /* -##------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+
+ /* 115 0x73 's' */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x3f, 0x00, /* --######-- */
+ 0x61, 0x80, /* -##----##- */
+ 0x60, 0x00, /* -##------- */
+ 0x60, 0x00, /* -##------- */
+ 0x3f, 0x00, /* --######-- */
+ 0x01, 0x80, /* -------##- */
+ 0x01, 0x80, /* -------##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x3f, 0x00, /* --######-- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+
+ /* 116 0x74 't' */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x18, 0x00, /* ---##----- */
+ 0x18, 0x00, /* ---##----- */
+ 0x18, 0x00, /* ---##----- */
+ 0x7e, 0x00, /* -######--- */
+ 0x18, 0x00, /* ---##----- */
+ 0x18, 0x00, /* ---##----- */
+ 0x18, 0x00, /* ---##----- */
+ 0x18, 0x00, /* ---##----- */
+ 0x18, 0x00, /* ---##----- */
+ 0x18, 0x00, /* ---##----- */
+ 0x18, 0x00, /* ---##----- */
+ 0x0f, 0x00, /* ----####-- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+
+ /* 117 0x75 'u' */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x3f, 0x80, /* --#######- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+
+ /* 118 0x76 'v' */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x33, 0x00, /* --##--##-- */
+ 0x33, 0x00, /* --##--##-- */
+ 0x33, 0x00, /* --##--##-- */
+ 0x1e, 0x00, /* ---####--- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+
+ /* 119 0x77 'w' */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x6d, 0x80, /* -##-##-##- */
+ 0x6d, 0x80, /* -##-##-##- */
+ 0x6d, 0x80, /* -##-##-##- */
+ 0x6d, 0x80, /* -##-##-##- */
+ 0x6d, 0x80, /* -##-##-##- */
+ 0x3f, 0x00, /* --######-- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+
+ /* 120 0x78 'x' */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x33, 0x00, /* --##--##-- */
+ 0x1e, 0x00, /* ---####--- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x1e, 0x00, /* ---####--- */
+ 0x33, 0x00, /* --##--##-- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+
+ /* 121 0x79 'y' */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x3f, 0x80, /* --#######- */
+ 0x01, 0x80, /* -------##- */
+ 0x01, 0x80, /* -------##- */
+ 0x3f, 0x00, /* --######-- */
+
+ /* 122 0x7a 'z' */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x7f, 0x80, /* -########- */
+ 0x01, 0x80, /* -------##- */
+ 0x03, 0x00, /* ------##-- */
+ 0x06, 0x00, /* -----##--- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x18, 0x00, /* ---##----- */
+ 0x30, 0x00, /* --##------ */
+ 0x60, 0x00, /* -##------- */
+ 0x7f, 0x80, /* -########- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+
+ /* 123 0x7b '{' */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x07, 0x00, /* -----###-- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x38, 0x00, /* --###----- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x07, 0x00, /* -----###-- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+
+ /* 124 0x7c '|' */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+
+ /* 125 0x7d '}' */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x38, 0x00, /* --###----- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x07, 0x00, /* -----###-- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x38, 0x00, /* --###----- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+
+ /* 126 0x7e '~' */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x39, 0x80, /* --###--##- */
+ 0x6d, 0x80, /* -##-##-##- */
+ 0x6d, 0x80, /* -##-##-##- */
+ 0x67, 0x00, /* -##--###-- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+
+ /* 127 0x7f '' */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x08, 0x00, /* ----#----- */
+ 0x1c, 0x00, /* ---###---- */
+ 0x36, 0x00, /* --##-##--- */
+ 0x63, 0x00, /* -##---##-- */
+ 0xc1, 0x80, /* ##-----##- */
+ 0xc1, 0x80, /* ##-----##- */
+ 0xc1, 0x80, /* ##-----##- */
+ 0xc1, 0x80, /* ##-----##- */
+ 0xc1, 0x80, /* ##-----##- */
+ 0xff, 0x80, /* #########- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+
+ /* 128 0x80 '' */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x3f, 0x00, /* --######-- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x60, 0x00, /* -##------- */
+ 0x60, 0x00, /* -##------- */
+ 0x60, 0x00, /* -##------- */
+ 0x60, 0x00, /* -##------- */
+ 0x60, 0x00, /* -##------- */
+ 0x60, 0x00, /* -##------- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x3f, 0x00, /* --######-- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x18, 0x00, /* ---##----- */
+
+ /* 129 0x81 '' */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x33, 0x00, /* --##--##-- */
+ 0x33, 0x00, /* --##--##-- */
+ 0x00, 0x00, /* ---------- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x3f, 0x80, /* --#######- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+
+ /* 130 0x82 '' */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x06, 0x00, /* -----##--- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x00, 0x00, /* ---------- */
+ 0x3f, 0x00, /* --######-- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x7f, 0x80, /* -########- */
+ 0x60, 0x00, /* -##------- */
+ 0x60, 0x00, /* -##------- */
+ 0x61, 0x80, /* -##----##- */
+ 0x3f, 0x00, /* --######-- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+
+ /* 131 0x83 '' */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x1e, 0x00, /* ---####--- */
+ 0x33, 0x00, /* --##--##-- */
+ 0x00, 0x00, /* ---------- */
+ 0x3f, 0x00, /* --######-- */
+ 0x01, 0x80, /* -------##- */
+ 0x01, 0x80, /* -------##- */
+ 0x3f, 0x80, /* --#######- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x3f, 0x80, /* --#######- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+
+ /* 132 0x84 '' */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x33, 0x00, /* --##--##-- */
+ 0x33, 0x00, /* --##--##-- */
+ 0x00, 0x00, /* ---------- */
+ 0x3f, 0x00, /* --######-- */
+ 0x01, 0x80, /* -------##- */
+ 0x01, 0x80, /* -------##- */
+ 0x3f, 0x80, /* --#######- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x3f, 0x80, /* --#######- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+
+ /* 133 0x85 '' */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x18, 0x00, /* ---##----- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x00, 0x00, /* ---------- */
+ 0x3f, 0x00, /* --######-- */
+ 0x01, 0x80, /* -------##- */
+ 0x01, 0x80, /* -------##- */
+ 0x3f, 0x80, /* --#######- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x3f, 0x80, /* --#######- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+
+ /* 134 0x86 '' */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x1e, 0x00, /* ---####--- */
+ 0x33, 0x00, /* --##--##-- */
+ 0x1e, 0x00, /* ---####--- */
+ 0x3f, 0x00, /* --######-- */
+ 0x01, 0x80, /* -------##- */
+ 0x01, 0x80, /* -------##- */
+ 0x3f, 0x80, /* --#######- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x3f, 0x80, /* --#######- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+
+ /* 135 0x87 '' */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x3f, 0x00, /* --######-- */
+ 0x61, 0x80, /* -##----##- */
+ 0x60, 0x00, /* -##------- */
+ 0x60, 0x00, /* -##------- */
+ 0x60, 0x00, /* -##------- */
+ 0x60, 0x00, /* -##------- */
+ 0x60, 0x00, /* -##------- */
+ 0x61, 0x80, /* -##----##- */
+ 0x3f, 0x00, /* --######-- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x18, 0x00, /* ---##----- */
+
+ /* 136 0x88 '' */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x1e, 0x00, /* ---####--- */
+ 0x33, 0x00, /* --##--##-- */
+ 0x00, 0x00, /* ---------- */
+ 0x3f, 0x00, /* --######-- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x7f, 0x80, /* -########- */
+ 0x60, 0x00, /* -##------- */
+ 0x60, 0x00, /* -##------- */
+ 0x61, 0x80, /* -##----##- */
+ 0x3f, 0x00, /* --######-- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+
+ /* 137 0x89 '' */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x33, 0x00, /* --##--##-- */
+ 0x33, 0x00, /* --##--##-- */
+ 0x00, 0x00, /* ---------- */
+ 0x3f, 0x00, /* --######-- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x7f, 0x80, /* -########- */
+ 0x60, 0x00, /* -##------- */
+ 0x60, 0x00, /* -##------- */
+ 0x61, 0x80, /* -##----##- */
+ 0x3f, 0x00, /* --######-- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+
+ /* 138 0x8a '' */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x18, 0x00, /* ---##----- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x00, 0x00, /* ---------- */
+ 0x3f, 0x00, /* --######-- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x7f, 0x80, /* -########- */
+ 0x60, 0x00, /* -##------- */
+ 0x60, 0x00, /* -##------- */
+ 0x61, 0x80, /* -##----##- */
+ 0x3f, 0x00, /* --######-- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+
+ /* 139 0x8b '' */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x33, 0x00, /* --##--##-- */
+ 0x33, 0x00, /* --##--##-- */
+ 0x00, 0x00, /* ---------- */
+ 0x1c, 0x00, /* ---###---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x1e, 0x00, /* ---####--- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+
+ /* 140 0x8c '' */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x1e, 0x00, /* ---####--- */
+ 0x33, 0x00, /* --##--##-- */
+ 0x00, 0x00, /* ---------- */
+ 0x1c, 0x00, /* ---###---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x1e, 0x00, /* ---####--- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+
+ /* 141 0x8d '' */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x18, 0x00, /* ---##----- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x00, 0x00, /* ---------- */
+ 0x1c, 0x00, /* ---###---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x1e, 0x00, /* ---####--- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+
+ /* 142 0x8e '' */
+ 0x33, 0x00, /* --##--##-- */
+ 0x33, 0x00, /* --##--##-- */
+ 0x00, 0x00, /* ---------- */
+ 0x3f, 0x00, /* --######-- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x7f, 0x80, /* -########- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+
+ /* 143 0x8f '' */
+ 0x1e, 0x00, /* ---####--- */
+ 0x33, 0x00, /* --##--##-- */
+ 0x1e, 0x00, /* ---####--- */
+ 0x3f, 0x00, /* --######-- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x7f, 0x80, /* -########- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+
+ /* 144 0x90 '' */
+ 0x06, 0x00, /* -----##--- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x00, 0x00, /* ---------- */
+ 0x7f, 0x80, /* -########- */
+ 0x60, 0x00, /* -##------- */
+ 0x60, 0x00, /* -##------- */
+ 0x60, 0x00, /* -##------- */
+ 0x60, 0x00, /* -##------- */
+ 0x7e, 0x00, /* -######--- */
+ 0x60, 0x00, /* -##------- */
+ 0x60, 0x00, /* -##------- */
+ 0x60, 0x00, /* -##------- */
+ 0x60, 0x00, /* -##------- */
+ 0x60, 0x00, /* -##------- */
+ 0x7f, 0x80, /* -########- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+
+ /* 145 0x91 '' */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x7b, 0x80, /* -####-###- */
+ 0x0c, 0xc0, /* ----##--## */
+ 0x0c, 0xc0, /* ----##--## */
+ 0x7c, 0xc0, /* -#####--## */
+ 0xcf, 0xc0, /* ##--###### */
+ 0xcc, 0x00, /* ##--##---- */
+ 0xcc, 0x00, /* ##--##---- */
+ 0xcc, 0xc0, /* ##--##--## */
+ 0x77, 0x80, /* -###-####- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+
+ /* 146 0x92 '' */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x7f, 0xc0, /* -######### */
+ 0xc6, 0x00, /* ##---##--- */
+ 0xc6, 0x00, /* ##---##--- */
+ 0xc6, 0x00, /* ##---##--- */
+ 0xc6, 0x00, /* ##---##--- */
+ 0xff, 0xc0, /* ########## */
+ 0xc6, 0x00, /* ##---##--- */
+ 0xc6, 0x00, /* ##---##--- */
+ 0xc6, 0x00, /* ##---##--- */
+ 0xc6, 0x00, /* ##---##--- */
+ 0xc6, 0x00, /* ##---##--- */
+ 0xc7, 0xc0, /* ##---##### */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+
+ /* 147 0x93 '' */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x1e, 0x00, /* ---####--- */
+ 0x33, 0x00, /* --##--##-- */
+ 0x00, 0x00, /* ---------- */
+ 0x3f, 0x00, /* --######-- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x3f, 0x00, /* --######-- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+
+ /* 148 0x94 '' */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x33, 0x00, /* --##--##-- */
+ 0x33, 0x00, /* --##--##-- */
+ 0x00, 0x00, /* ---------- */
+ 0x3f, 0x00, /* --######-- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x3f, 0x00, /* --######-- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+
+ /* 149 0x95 '' */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x18, 0x00, /* ---##----- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x00, 0x00, /* ---------- */
+ 0x3f, 0x00, /* --######-- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x3f, 0x00, /* --######-- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+
+ /* 150 0x96 '' */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x1e, 0x00, /* ---####--- */
+ 0x33, 0x00, /* --##--##-- */
+ 0x00, 0x00, /* ---------- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x3f, 0x80, /* --#######- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+
+ /* 151 0x97 '' */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x18, 0x00, /* ---##----- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x00, 0x00, /* ---------- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x3f, 0x80, /* --#######- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+
+ /* 152 0x98 '' */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x33, 0x00, /* --##--##-- */
+ 0x33, 0x00, /* --##--##-- */
+ 0x00, 0x00, /* ---------- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x3f, 0x80, /* --#######- */
+ 0x01, 0x80, /* -------##- */
+ 0x01, 0x80, /* -------##- */
+ 0x3f, 0x00, /* --######-- */
+
+ /* 153 0x99 '' */
+ 0x33, 0x00, /* --##--##-- */
+ 0x33, 0x00, /* --##--##-- */
+ 0x00, 0x00, /* ---------- */
+ 0x3f, 0x00, /* --######-- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x3f, 0x00, /* --######-- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+
+ /* 154 0x9a '' */
+ 0x33, 0x00, /* --##--##-- */
+ 0x33, 0x00, /* --##--##-- */
+ 0x00, 0x00, /* ---------- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x3f, 0x00, /* --######-- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+
+ /* 155 0x9b '' */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x3f, 0x00, /* --######-- */
+ 0x6d, 0x80, /* -##-##-##- */
+ 0x6c, 0x00, /* -##-##---- */
+ 0x6c, 0x00, /* -##-##---- */
+ 0x6c, 0x00, /* -##-##---- */
+ 0x6c, 0x00, /* -##-##---- */
+ 0x6c, 0x00, /* -##-##---- */
+ 0x6d, 0x80, /* -##-##-##- */
+ 0x3f, 0x00, /* --######-- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x00, 0x00, /* ---------- */
+
+ /* 156 0x9c '' */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x1e, 0x00, /* ---####--- */
+ 0x33, 0x00, /* --##--##-- */
+ 0x30, 0x00, /* --##------ */
+ 0x30, 0x00, /* --##------ */
+ 0x30, 0x00, /* --##------ */
+ 0x7e, 0x00, /* -######--- */
+ 0x30, 0x00, /* --##------ */
+ 0x30, 0x00, /* --##------ */
+ 0x30, 0x00, /* --##------ */
+ 0x30, 0x00, /* --##------ */
+ 0x31, 0x80, /* --##---##- */
+ 0x7f, 0x80, /* -########- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+
+ /* 157 0x9d '' */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x33, 0x00, /* --##--##-- */
+ 0x33, 0x00, /* --##--##-- */
+ 0x1e, 0x00, /* ---####--- */
+ 0x1e, 0x00, /* ---####--- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x3f, 0x00, /* --######-- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x3f, 0x00, /* --######-- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+
+ /* 158 0x9e '' */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0xf8, 0x00, /* #####----- */
+ 0xcc, 0x00, /* ##--##---- */
+ 0xcc, 0x00, /* ##--##---- */
+ 0xcc, 0x00, /* ##--##---- */
+ 0xcc, 0x00, /* ##--##---- */
+ 0xfb, 0x00, /* #####-##-- */
+ 0xc3, 0x00, /* ##----##-- */
+ 0xc7, 0x80, /* ##---####- */
+ 0xc3, 0x00, /* ##----##-- */
+ 0xc3, 0x00, /* ##----##-- */
+ 0xc3, 0x00, /* ##----##-- */
+ 0xc1, 0x80, /* ##-----##- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+
+ /* 159 0x9f '' */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x07, 0x00, /* -----###-- */
+ 0x0d, 0x80, /* ----##-##- */
+ 0x0d, 0x80, /* ----##-##- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x3f, 0x00, /* --######-- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x6c, 0x00, /* -##-##---- */
+ 0x6c, 0x00, /* -##-##---- */
+ 0x38, 0x00, /* --###----- */
+
+ /* 160 0xa0 '' */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x06, 0x00, /* -----##--- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x00, 0x00, /* ---------- */
+ 0x3f, 0x00, /* --######-- */
+ 0x01, 0x80, /* -------##- */
+ 0x01, 0x80, /* -------##- */
+ 0x3f, 0x80, /* --#######- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x3f, 0x80, /* --#######- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+
+ /* 161 0xa1 '' */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x06, 0x00, /* -----##--- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x00, 0x00, /* ---------- */
+ 0x1c, 0x00, /* ---###---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x1e, 0x00, /* ---####--- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+
+ /* 162 0xa2 '' */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x06, 0x00, /* -----##--- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x00, 0x00, /* ---------- */
+ 0x3f, 0x00, /* --######-- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x3f, 0x00, /* --######-- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+
+ /* 163 0xa3 '' */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x06, 0x00, /* -----##--- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x00, 0x00, /* ---------- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x3f, 0x80, /* --#######- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+
+ /* 164 0xa4 '' */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x3b, 0x80, /* --###-###- */
+ 0x6e, 0x00, /* -##-###--- */
+ 0x00, 0x00, /* ---------- */
+ 0x7f, 0x00, /* -#######-- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+
+ /* 165 0xa5 '' */
+ 0x3b, 0x80, /* --###-###- */
+ 0x6e, 0x00, /* -##-###--- */
+ 0x00, 0x00, /* ---------- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x71, 0x80, /* -###---##- */
+ 0x79, 0x80, /* -####--##- */
+ 0x6d, 0x80, /* -##-##-##- */
+ 0x67, 0x80, /* -##--####- */
+ 0x63, 0x80, /* -##---###- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+
+ /* 166 0xa6 '' */
+ 0x00, 0x00, /* ---------- */
+ 0x3e, 0x00, /* --#####--- */
+ 0x03, 0x00, /* ------##-- */
+ 0x3f, 0x00, /* --######-- */
+ 0x63, 0x00, /* -##---##-- */
+ 0x63, 0x00, /* -##---##-- */
+ 0x3f, 0x00, /* --######-- */
+ 0x00, 0x00, /* ---------- */
+ 0x7f, 0x00, /* -#######-- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+
+ /* 167 0xa7 '' */
+ 0x00, 0x00, /* ---------- */
+ 0x3e, 0x00, /* --#####--- */
+ 0x63, 0x00, /* -##---##-- */
+ 0x63, 0x00, /* -##---##-- */
+ 0x63, 0x00, /* -##---##-- */
+ 0x63, 0x00, /* -##---##-- */
+ 0x3e, 0x00, /* --#####--- */
+ 0x00, 0x00, /* ---------- */
+ 0x7f, 0x00, /* -#######-- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+
+ /* 168 0xa8 '' */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x00, 0x00, /* ---------- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x18, 0x00, /* ---##----- */
+ 0x30, 0x00, /* --##------ */
+ 0x60, 0x00, /* -##------- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x33, 0x00, /* --##--##-- */
+ 0x1e, 0x00, /* ---####--- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+
+ /* 169 0xa9 '' */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x7f, 0x80, /* -########- */
+ 0x60, 0x00, /* -##------- */
+ 0x60, 0x00, /* -##------- */
+ 0x60, 0x00, /* -##------- */
+ 0x60, 0x00, /* -##------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+
+ /* 170 0xaa '' */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x7f, 0x80, /* -########- */
+ 0x01, 0x80, /* -------##- */
+ 0x01, 0x80, /* -------##- */
+ 0x01, 0x80, /* -------##- */
+ 0x01, 0x80, /* -------##- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+
+ /* 171 0xab '' */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x30, 0x00, /* --##------ */
+ 0x70, 0x00, /* -###------ */
+ 0x30, 0x80, /* --##----#- */
+ 0x31, 0x80, /* --##---##- */
+ 0x33, 0x00, /* --##--##-- */
+ 0x36, 0x00, /* --##-##--- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x18, 0x00, /* ---##----- */
+ 0x37, 0x00, /* --##-###-- */
+ 0x6d, 0x80, /* -##-##-##- */
+ 0xc1, 0x80, /* ##-----##- */
+ 0x83, 0x00, /* #-----##-- */
+ 0x06, 0x00, /* -----##--- */
+ 0x0f, 0x80, /* ----#####- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+
+ /* 172 0xac '' */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x30, 0x00, /* --##------ */
+ 0x70, 0x00, /* -###------ */
+ 0x30, 0x80, /* --##----#- */
+ 0x31, 0x80, /* --##---##- */
+ 0x33, 0x00, /* --##--##-- */
+ 0x36, 0x00, /* --##-##--- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x19, 0x80, /* ---##--##- */
+ 0x33, 0x80, /* --##--###- */
+ 0x67, 0x80, /* -##--####- */
+ 0xcd, 0x80, /* ##--##-##- */
+ 0x8f, 0x80, /* #---#####- */
+ 0x01, 0x80, /* -------##- */
+ 0x01, 0x80, /* -------##- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+
+ /* 173 0xad '' */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+
+ /* 174 0xae '' */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x0c, 0xc0, /* ----##--## */
+ 0x19, 0x80, /* ---##--##- */
+ 0x33, 0x00, /* --##--##-- */
+ 0x66, 0x00, /* -##--##--- */
+ 0xcc, 0x00, /* ##--##---- */
+ 0x66, 0x00, /* -##--##--- */
+ 0x33, 0x00, /* --##--##-- */
+ 0x19, 0x80, /* ---##--##- */
+ 0x0c, 0xc0, /* ----##--## */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+
+ /* 175 0xaf '' */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0xcc, 0x00, /* ##--##---- */
+ 0x66, 0x00, /* -##--##--- */
+ 0x33, 0x00, /* --##--##-- */
+ 0x19, 0x80, /* ---##--##- */
+ 0x0c, 0xc0, /* ----##--## */
+ 0x19, 0x80, /* ---##--##- */
+ 0x33, 0x00, /* --##--##-- */
+ 0x66, 0x00, /* -##--##--- */
+ 0xcc, 0x00, /* ##--##---- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+
+ /* 176 0xb0 '' */
+ 0xaa, 0x80, /* #-#-#-#-#- */
+ 0x00, 0x00, /* ---------- */
+ 0xaa, 0x80, /* #-#-#-#-#- */
+ 0x00, 0x00, /* ---------- */
+ 0xaa, 0x80, /* #-#-#-#-#- */
+ 0x00, 0x00, /* ---------- */
+ 0xaa, 0x80, /* #-#-#-#-#- */
+ 0x00, 0x00, /* ---------- */
+ 0xaa, 0x80, /* #-#-#-#-#- */
+ 0x00, 0x00, /* ---------- */
+ 0xaa, 0x80, /* #-#-#-#-#- */
+ 0x00, 0x00, /* ---------- */
+ 0xaa, 0x80, /* #-#-#-#-#- */
+ 0x00, 0x00, /* ---------- */
+ 0xaa, 0x80, /* #-#-#-#-#- */
+ 0x00, 0x00, /* ---------- */
+ 0xaa, 0x80, /* #-#-#-#-#- */
+ 0x00, 0x00, /* ---------- */
+
+ /* 177 0xb1 '' */
+ 0xaa, 0x80, /* #-#-#-#-#- */
+ 0x55, 0x40, /* -#-#-#-#-# */
+ 0xaa, 0x80, /* #-#-#-#-#- */
+ 0x55, 0x40, /* -#-#-#-#-# */
+ 0xaa, 0x80, /* #-#-#-#-#- */
+ 0x55, 0x40, /* -#-#-#-#-# */
+ 0xaa, 0x80, /* #-#-#-#-#- */
+ 0x55, 0x40, /* -#-#-#-#-# */
+ 0xaa, 0x80, /* #-#-#-#-#- */
+ 0x55, 0x40, /* -#-#-#-#-# */
+ 0xaa, 0x80, /* #-#-#-#-#- */
+ 0x55, 0x40, /* -#-#-#-#-# */
+ 0xaa, 0x80, /* #-#-#-#-#- */
+ 0x55, 0x40, /* -#-#-#-#-# */
+ 0xaa, 0x80, /* #-#-#-#-#- */
+ 0x55, 0x40, /* -#-#-#-#-# */
+ 0xaa, 0x80, /* #-#-#-#-#- */
+ 0x55, 0x40, /* -#-#-#-#-# */
+
+ /* 178 0xb2 '' */
+ 0xff, 0xc0, /* ########## */
+ 0xaa, 0x80, /* #-#-#-#-#- */
+ 0xff, 0xc0, /* ########## */
+ 0xaa, 0x80, /* #-#-#-#-#- */
+ 0xff, 0xc0, /* ########## */
+ 0xaa, 0x80, /* #-#-#-#-#- */
+ 0xff, 0xc0, /* ########## */
+ 0xaa, 0x80, /* #-#-#-#-#- */
+ 0xff, 0xc0, /* ########## */
+ 0xaa, 0x80, /* #-#-#-#-#- */
+ 0xff, 0xc0, /* ########## */
+ 0xaa, 0x80, /* #-#-#-#-#- */
+ 0xff, 0xc0, /* ########## */
+ 0xaa, 0x80, /* #-#-#-#-#- */
+ 0xff, 0xc0, /* ########## */
+ 0xaa, 0x80, /* #-#-#-#-#- */
+ 0xff, 0xc0, /* ########## */
+ 0xaa, 0x80, /* #-#-#-#-#- */
+
+ /* 179 0xb3 '' */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+
+ /* 180 0xb4 '' */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0xfc, 0x00, /* ######---- */
+ 0xfc, 0x00, /* ######---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+
+ /* 181 0xb5 '' */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0xfc, 0x00, /* ######---- */
+ 0xfc, 0x00, /* ######---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0xfc, 0x00, /* ######---- */
+ 0xfc, 0x00, /* ######---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+
+ /* 182 0xb6 '' */
+ 0x36, 0x00, /* --##-##--- */
+ 0x36, 0x00, /* --##-##--- */
+ 0x36, 0x00, /* --##-##--- */
+ 0x36, 0x00, /* --##-##--- */
+ 0x36, 0x00, /* --##-##--- */
+ 0x36, 0x00, /* --##-##--- */
+ 0x36, 0x00, /* --##-##--- */
+ 0x36, 0x00, /* --##-##--- */
+ 0xf6, 0x00, /* ####-##--- */
+ 0xf6, 0x00, /* ####-##--- */
+ 0x36, 0x00, /* --##-##--- */
+ 0x36, 0x00, /* --##-##--- */
+ 0x36, 0x00, /* --##-##--- */
+ 0x36, 0x00, /* --##-##--- */
+ 0x36, 0x00, /* --##-##--- */
+ 0x36, 0x00, /* --##-##--- */
+ 0x36, 0x00, /* --##-##--- */
+ 0x36, 0x00, /* --##-##--- */
+
+ /* 183 0xb7 '' */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0xfe, 0x00, /* #######--- */
+ 0xfe, 0x00, /* #######--- */
+ 0x36, 0x00, /* --##-##--- */
+ 0x36, 0x00, /* --##-##--- */
+ 0x36, 0x00, /* --##-##--- */
+ 0x36, 0x00, /* --##-##--- */
+ 0x36, 0x00, /* --##-##--- */
+ 0x36, 0x00, /* --##-##--- */
+ 0x36, 0x00, /* --##-##--- */
+ 0x36, 0x00, /* --##-##--- */
+
+ /* 184 0xb8 '' */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0xfc, 0x00, /* ######---- */
+ 0xfc, 0x00, /* ######---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0xfc, 0x00, /* ######---- */
+ 0xfc, 0x00, /* ######---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+
+ /* 185 0xb9 '' */
+ 0x36, 0x00, /* --##-##--- */
+ 0x36, 0x00, /* --##-##--- */
+ 0x36, 0x00, /* --##-##--- */
+ 0x36, 0x00, /* --##-##--- */
+ 0x36, 0x00, /* --##-##--- */
+ 0x36, 0x00, /* --##-##--- */
+ 0xf6, 0x00, /* ####-##--- */
+ 0xf6, 0x00, /* ####-##--- */
+ 0x06, 0x00, /* -----##--- */
+ 0xf6, 0x00, /* ####-##--- */
+ 0xf6, 0x00, /* ####-##--- */
+ 0x36, 0x00, /* --##-##--- */
+ 0x36, 0x00, /* --##-##--- */
+ 0x36, 0x00, /* --##-##--- */
+ 0x36, 0x00, /* --##-##--- */
+ 0x36, 0x00, /* --##-##--- */
+ 0x36, 0x00, /* --##-##--- */
+ 0x36, 0x00, /* --##-##--- */
+
+ /* 186 0xba '' */
+ 0x36, 0x00, /* --##-##--- */
+ 0x36, 0x00, /* --##-##--- */
+ 0x36, 0x00, /* --##-##--- */
+ 0x36, 0x00, /* --##-##--- */
+ 0x36, 0x00, /* --##-##--- */
+ 0x36, 0x00, /* --##-##--- */
+ 0x36, 0x00, /* --##-##--- */
+ 0x36, 0x00, /* --##-##--- */
+ 0x36, 0x00, /* --##-##--- */
+ 0x36, 0x00, /* --##-##--- */
+ 0x36, 0x00, /* --##-##--- */
+ 0x36, 0x00, /* --##-##--- */
+ 0x36, 0x00, /* --##-##--- */
+ 0x36, 0x00, /* --##-##--- */
+ 0x36, 0x00, /* --##-##--- */
+ 0x36, 0x00, /* --##-##--- */
+ 0x36, 0x00, /* --##-##--- */
+ 0x36, 0x00, /* --##-##--- */
+
+ /* 187 0xbb '' */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0xfe, 0x00, /* #######--- */
+ 0xfe, 0x00, /* #######--- */
+ 0x06, 0x00, /* -----##--- */
+ 0xf6, 0x00, /* ####-##--- */
+ 0xf6, 0x00, /* ####-##--- */
+ 0x36, 0x00, /* --##-##--- */
+ 0x36, 0x00, /* --##-##--- */
+ 0x36, 0x00, /* --##-##--- */
+ 0x36, 0x00, /* --##-##--- */
+ 0x36, 0x00, /* --##-##--- */
+ 0x36, 0x00, /* --##-##--- */
+ 0x36, 0x00, /* --##-##--- */
+
+ /* 188 0xbc '' */
+ 0x36, 0x00, /* --##-##--- */
+ 0x36, 0x00, /* --##-##--- */
+ 0x36, 0x00, /* --##-##--- */
+ 0x36, 0x00, /* --##-##--- */
+ 0x36, 0x00, /* --##-##--- */
+ 0x36, 0x00, /* --##-##--- */
+ 0xf6, 0x00, /* ####-##--- */
+ 0xf6, 0x00, /* ####-##--- */
+ 0x06, 0x00, /* -----##--- */
+ 0xfe, 0x00, /* #######--- */
+ 0xfe, 0x00, /* #######--- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+
+ /* 189 0xbd '' */
+ 0x36, 0x00, /* --##-##--- */
+ 0x36, 0x00, /* --##-##--- */
+ 0x36, 0x00, /* --##-##--- */
+ 0x36, 0x00, /* --##-##--- */
+ 0x36, 0x00, /* --##-##--- */
+ 0x36, 0x00, /* --##-##--- */
+ 0x36, 0x00, /* --##-##--- */
+ 0x36, 0x00, /* --##-##--- */
+ 0xfe, 0x00, /* #######--- */
+ 0xfe, 0x00, /* #######--- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+
+ /* 190 0xbe '' */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0xfc, 0x00, /* ######---- */
+ 0xfc, 0x00, /* ######---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0xfc, 0x00, /* ######---- */
+ 0xfc, 0x00, /* ######---- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+
+ /* 191 0xbf '' */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0xfc, 0x00, /* ######---- */
+ 0xfc, 0x00, /* ######---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+
+ /* 192 0xc0 '' */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0f, 0xc0, /* ----###### */
+ 0x0f, 0xc0, /* ----###### */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+
+ /* 193 0xc1 '' */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0xff, 0xc0, /* ########## */
+ 0xff, 0xc0, /* ########## */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+
+ /* 194 0xc2 '' */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0xff, 0xc0, /* ########## */
+ 0xff, 0xc0, /* ########## */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+
+ /* 195 0xc3 '' */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0f, 0xc0, /* ----###### */
+ 0x0f, 0xc0, /* ----###### */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+
+ /* 196 0xc4 '' */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0xff, 0xc0, /* ########## */
+ 0xff, 0xc0, /* ########## */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+
+ /* 197 0xc5 '' */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0xff, 0xc0, /* ########## */
+ 0xff, 0xc0, /* ########## */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+
+ /* 198 0xc6 '' */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0f, 0xc0, /* ----###### */
+ 0x0f, 0xc0, /* ----###### */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0f, 0xc0, /* ----###### */
+ 0x0f, 0xc0, /* ----###### */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+
+ /* 199 0xc7 '' */
+ 0x36, 0x00, /* --##-##--- */
+ 0x36, 0x00, /* --##-##--- */
+ 0x36, 0x00, /* --##-##--- */
+ 0x36, 0x00, /* --##-##--- */
+ 0x36, 0x00, /* --##-##--- */
+ 0x36, 0x00, /* --##-##--- */
+ 0x36, 0x00, /* --##-##--- */
+ 0x36, 0x00, /* --##-##--- */
+ 0x37, 0xc0, /* --##-##### */
+ 0x37, 0xc0, /* --##-##### */
+ 0x36, 0x00, /* --##-##--- */
+ 0x36, 0x00, /* --##-##--- */
+ 0x36, 0x00, /* --##-##--- */
+ 0x36, 0x00, /* --##-##--- */
+ 0x36, 0x00, /* --##-##--- */
+ 0x36, 0x00, /* --##-##--- */
+ 0x36, 0x00, /* --##-##--- */
+ 0x36, 0x00, /* --##-##--- */
+
+ /* 200 0xc8 '' */
+ 0x36, 0x00, /* --##-##--- */
+ 0x36, 0x00, /* --##-##--- */
+ 0x36, 0x00, /* --##-##--- */
+ 0x36, 0x00, /* --##-##--- */
+ 0x36, 0x00, /* --##-##--- */
+ 0x36, 0x00, /* --##-##--- */
+ 0x37, 0xc0, /* --##-##### */
+ 0x37, 0xc0, /* --##-##### */
+ 0x30, 0x00, /* --##------ */
+ 0x3f, 0xc0, /* --######## */
+ 0x3f, 0xc0, /* --######## */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+
+ /* 201 0xc9 '' */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x3f, 0xc0, /* --######## */
+ 0x3f, 0xc0, /* --######## */
+ 0x30, 0x00, /* --##------ */
+ 0x37, 0xc0, /* --##-##### */
+ 0x37, 0xc0, /* --##-##### */
+ 0x36, 0x00, /* --##-##--- */
+ 0x36, 0x00, /* --##-##--- */
+ 0x36, 0x00, /* --##-##--- */
+ 0x36, 0x00, /* --##-##--- */
+ 0x36, 0x00, /* --##-##--- */
+ 0x36, 0x00, /* --##-##--- */
+ 0x36, 0x00, /* --##-##--- */
+
+ /* 202 0xca '' */
+ 0x36, 0x00, /* --##-##--- */
+ 0x36, 0x00, /* --##-##--- */
+ 0x36, 0x00, /* --##-##--- */
+ 0x36, 0x00, /* --##-##--- */
+ 0x36, 0x00, /* --##-##--- */
+ 0x36, 0x00, /* --##-##--- */
+ 0xf7, 0xc0, /* ####-##### */
+ 0xf7, 0xc0, /* ####-##### */
+ 0x00, 0x00, /* ---------- */
+ 0xff, 0xc0, /* ########## */
+ 0xff, 0xc0, /* ########## */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+
+ /* 203 0xcb '' */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0xff, 0xc0, /* ########## */
+ 0xff, 0xc0, /* ########## */
+ 0x00, 0x00, /* ---------- */
+ 0xf7, 0xc0, /* ####-##### */
+ 0xf7, 0xc0, /* ####-##### */
+ 0x36, 0x00, /* --##-##--- */
+ 0x36, 0x00, /* --##-##--- */
+ 0x36, 0x00, /* --##-##--- */
+ 0x36, 0x00, /* --##-##--- */
+ 0x36, 0x00, /* --##-##--- */
+ 0x36, 0x00, /* --##-##--- */
+ 0x36, 0x00, /* --##-##--- */
+
+ /* 204 0xcc '' */
+ 0x36, 0x00, /* --##-##--- */
+ 0x36, 0x00, /* --##-##--- */
+ 0x36, 0x00, /* --##-##--- */
+ 0x36, 0x00, /* --##-##--- */
+ 0x36, 0x00, /* --##-##--- */
+ 0x36, 0x00, /* --##-##--- */
+ 0x37, 0xc0, /* --##-##### */
+ 0x37, 0xc0, /* --##-##### */
+ 0x30, 0x00, /* --##------ */
+ 0x37, 0xc0, /* --##-##### */
+ 0x37, 0xc0, /* --##-##### */
+ 0x36, 0x00, /* --##-##--- */
+ 0x36, 0x00, /* --##-##--- */
+ 0x36, 0x00, /* --##-##--- */
+ 0x36, 0x00, /* --##-##--- */
+ 0x36, 0x00, /* --##-##--- */
+ 0x36, 0x00, /* --##-##--- */
+ 0x36, 0x00, /* --##-##--- */
+
+ /* 205 0xcd '' */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0xff, 0xc0, /* ########## */
+ 0xff, 0xc0, /* ########## */
+ 0x00, 0x00, /* ---------- */
+ 0xff, 0xc0, /* ########## */
+ 0xff, 0xc0, /* ########## */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+
+ /* 206 0xce '' */
+ 0x36, 0x00, /* --##-##--- */
+ 0x36, 0x00, /* --##-##--- */
+ 0x36, 0x00, /* --##-##--- */
+ 0x36, 0x00, /* --##-##--- */
+ 0x36, 0x00, /* --##-##--- */
+ 0x36, 0x00, /* --##-##--- */
+ 0xf7, 0xc0, /* ####-##### */
+ 0xf7, 0xc0, /* ####-##### */
+ 0x00, 0x00, /* ---------- */
+ 0xf7, 0xc0, /* ####-##### */
+ 0xf7, 0xc0, /* ####-##### */
+ 0x36, 0x00, /* --##-##--- */
+ 0x36, 0x00, /* --##-##--- */
+ 0x36, 0x00, /* --##-##--- */
+ 0x36, 0x00, /* --##-##--- */
+ 0x36, 0x00, /* --##-##--- */
+ 0x36, 0x00, /* --##-##--- */
+ 0x36, 0x00, /* --##-##--- */
+
+ /* 207 0xcf '' */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0xff, 0xc0, /* ########## */
+ 0xff, 0xc0, /* ########## */
+ 0x00, 0x00, /* ---------- */
+ 0xff, 0xc0, /* ########## */
+ 0xff, 0xc0, /* ########## */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+
+ /* 208 0xd0 '' */
+ 0x36, 0x00, /* --##-##--- */
+ 0x36, 0x00, /* --##-##--- */
+ 0x36, 0x00, /* --##-##--- */
+ 0x36, 0x00, /* --##-##--- */
+ 0x36, 0x00, /* --##-##--- */
+ 0x36, 0x00, /* --##-##--- */
+ 0x36, 0x00, /* --##-##--- */
+ 0x36, 0x00, /* --##-##--- */
+ 0xff, 0xc0, /* ########## */
+ 0xff, 0xc0, /* ########## */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+
+ /* 209 0xd1 '' */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0xff, 0xc0, /* ########## */
+ 0xff, 0xc0, /* ########## */
+ 0x00, 0x00, /* ---------- */
+ 0xff, 0xc0, /* ########## */
+ 0xff, 0xc0, /* ########## */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+
+ /* 210 0xd2 '' */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0xff, 0xc0, /* ########## */
+ 0xff, 0xc0, /* ########## */
+ 0x36, 0x00, /* --##-##--- */
+ 0x36, 0x00, /* --##-##--- */
+ 0x36, 0x00, /* --##-##--- */
+ 0x36, 0x00, /* --##-##--- */
+ 0x36, 0x00, /* --##-##--- */
+ 0x36, 0x00, /* --##-##--- */
+ 0x36, 0x00, /* --##-##--- */
+ 0x36, 0x00, /* --##-##--- */
+
+ /* 211 0xd3 '' */
+ 0x36, 0x00, /* --##-##--- */
+ 0x36, 0x00, /* --##-##--- */
+ 0x36, 0x00, /* --##-##--- */
+ 0x36, 0x00, /* --##-##--- */
+ 0x36, 0x00, /* --##-##--- */
+ 0x36, 0x00, /* --##-##--- */
+ 0x36, 0x00, /* --##-##--- */
+ 0x36, 0x00, /* --##-##--- */
+ 0x3f, 0xc0, /* --######## */
+ 0x3f, 0xc0, /* --######## */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+
+ /* 212 0xd4 '' */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0f, 0xc0, /* ----###### */
+ 0x0f, 0xc0, /* ----###### */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0f, 0xc0, /* ----###### */
+ 0x0f, 0xc0, /* ----###### */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+
+ /* 213 0xd5 '' */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x0f, 0xc0, /* ----###### */
+ 0x0f, 0xc0, /* ----###### */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0f, 0xc0, /* ----###### */
+ 0x0f, 0xc0, /* ----###### */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+
+ /* 214 0xd6 '' */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x3f, 0xc0, /* --######## */
+ 0x3f, 0xc0, /* --######## */
+ 0x36, 0x00, /* --##-##--- */
+ 0x36, 0x00, /* --##-##--- */
+ 0x36, 0x00, /* --##-##--- */
+ 0x36, 0x00, /* --##-##--- */
+ 0x36, 0x00, /* --##-##--- */
+ 0x36, 0x00, /* --##-##--- */
+ 0x36, 0x00, /* --##-##--- */
+ 0x36, 0x00, /* --##-##--- */
+
+ /* 215 0xd7 '' */
+ 0x36, 0x00, /* --##-##--- */
+ 0x36, 0x00, /* --##-##--- */
+ 0x36, 0x00, /* --##-##--- */
+ 0x36, 0x00, /* --##-##--- */
+ 0x36, 0x00, /* --##-##--- */
+ 0x36, 0x00, /* --##-##--- */
+ 0x36, 0x00, /* --##-##--- */
+ 0x36, 0x00, /* --##-##--- */
+ 0xff, 0xc0, /* ########## */
+ 0xff, 0xc0, /* ########## */
+ 0x36, 0x00, /* --##-##--- */
+ 0x36, 0x00, /* --##-##--- */
+ 0x36, 0x00, /* --##-##--- */
+ 0x36, 0x00, /* --##-##--- */
+ 0x36, 0x00, /* --##-##--- */
+ 0x36, 0x00, /* --##-##--- */
+ 0x36, 0x00, /* --##-##--- */
+ 0x36, 0x00, /* --##-##--- */
+
+ /* 216 0xd8 '' */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0xff, 0xc0, /* ########## */
+ 0xff, 0xc0, /* ########## */
+ 0x0c, 0x00, /* ----##---- */
+ 0xff, 0xc0, /* ########## */
+ 0xff, 0xc0, /* ########## */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+
+ /* 217 0xd9 '' */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0xfc, 0x00, /* ######---- */
+ 0xfc, 0x00, /* ######---- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+
+ /* 218 0xda '' */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x0f, 0xc0, /* ----###### */
+ 0x0f, 0xc0, /* ----###### */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+
+ /* 219 0xdb '' */
+ 0xff, 0xc0, /* ########## */
+ 0xff, 0xc0, /* ########## */
+ 0xff, 0xc0, /* ########## */
+ 0xff, 0xc0, /* ########## */
+ 0xff, 0xc0, /* ########## */
+ 0xff, 0xc0, /* ########## */
+ 0xff, 0xc0, /* ########## */
+ 0xff, 0xc0, /* ########## */
+ 0xff, 0xc0, /* ########## */
+ 0xff, 0xc0, /* ########## */
+ 0xff, 0xc0, /* ########## */
+ 0xff, 0xc0, /* ########## */
+ 0xff, 0xc0, /* ########## */
+ 0xff, 0xc0, /* ########## */
+ 0xff, 0xc0, /* ########## */
+ 0xff, 0xc0, /* ########## */
+ 0xff, 0xc0, /* ########## */
+ 0xff, 0xc0, /* ########## */
+
+ /* 220 0xdc '' */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0xff, 0xc0, /* ########## */
+ 0xff, 0xc0, /* ########## */
+ 0xff, 0xc0, /* ########## */
+ 0xff, 0xc0, /* ########## */
+ 0xff, 0xc0, /* ########## */
+ 0xff, 0xc0, /* ########## */
+ 0xff, 0xc0, /* ########## */
+ 0xff, 0xc0, /* ########## */
+ 0xff, 0xc0, /* ########## */
+
+ /* 221 0xdd '' */
+ 0xf8, 0x00, /* #####----- */
+ 0xf8, 0x00, /* #####----- */
+ 0xf8, 0x00, /* #####----- */
+ 0xf8, 0x00, /* #####----- */
+ 0xf8, 0x00, /* #####----- */
+ 0xf8, 0x00, /* #####----- */
+ 0xf8, 0x00, /* #####----- */
+ 0xf8, 0x00, /* #####----- */
+ 0xf8, 0x00, /* #####----- */
+ 0xf8, 0x00, /* #####----- */
+ 0xf8, 0x00, /* #####----- */
+ 0xf8, 0x00, /* #####----- */
+ 0xf8, 0x00, /* #####----- */
+ 0xf8, 0x00, /* #####----- */
+ 0xf8, 0x00, /* #####----- */
+ 0xf8, 0x00, /* #####----- */
+ 0xf8, 0x00, /* #####----- */
+ 0xf8, 0x00, /* #####----- */
+
+ /* 222 0xde '' */
+ 0x07, 0xc0, /* -----##### */
+ 0x07, 0xc0, /* -----##### */
+ 0x07, 0xc0, /* -----##### */
+ 0x07, 0xc0, /* -----##### */
+ 0x07, 0xc0, /* -----##### */
+ 0x07, 0xc0, /* -----##### */
+ 0x07, 0xc0, /* -----##### */
+ 0x07, 0xc0, /* -----##### */
+ 0x07, 0xc0, /* -----##### */
+ 0x07, 0xc0, /* -----##### */
+ 0x07, 0xc0, /* -----##### */
+ 0x07, 0xc0, /* -----##### */
+ 0x07, 0xc0, /* -----##### */
+ 0x07, 0xc0, /* -----##### */
+ 0x07, 0xc0, /* -----##### */
+ 0x07, 0xc0, /* -----##### */
+ 0x07, 0xc0, /* -----##### */
+ 0x07, 0xc0, /* -----##### */
+
+ /* 223 0xdf '' */
+ 0xff, 0xc0, /* ########## */
+ 0xff, 0xc0, /* ########## */
+ 0xff, 0xc0, /* ########## */
+ 0xff, 0xc0, /* ########## */
+ 0xff, 0xc0, /* ########## */
+ 0xff, 0xc0, /* ########## */
+ 0xff, 0xc0, /* ########## */
+ 0xff, 0xc0, /* ########## */
+ 0xff, 0xc0, /* ########## */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+
+ /* 224 0xe0 '' */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x7d, 0x80, /* -#####-##- */
+ 0xc7, 0x00, /* ##---###-- */
+ 0xc6, 0x00, /* ##---##--- */
+ 0xc6, 0x00, /* ##---##--- */
+ 0xc6, 0x00, /* ##---##--- */
+ 0xc6, 0x00, /* ##---##--- */
+ 0xc6, 0x00, /* ##---##--- */
+ 0xc7, 0x00, /* ##---###-- */
+ 0x7d, 0x80, /* -#####-##- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+
+ /* 225 0xe1 '' */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x3e, 0x00, /* --#####--- */
+ 0x63, 0x00, /* -##---##-- */
+ 0x63, 0x00, /* -##---##-- */
+ 0x63, 0x00, /* -##---##-- */
+ 0x62, 0x00, /* -##---#--- */
+ 0x7f, 0x00, /* -#######-- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x7f, 0x00, /* -#######-- */
+ 0x60, 0x00, /* -##------- */
+ 0x60, 0x00, /* -##------- */
+ 0x60, 0x00, /* -##------- */
+
+ /* 226 0xe2 '' */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x7f, 0x80, /* -########- */
+ 0x60, 0x00, /* -##------- */
+ 0x60, 0x00, /* -##------- */
+ 0x60, 0x00, /* -##------- */
+ 0x60, 0x00, /* -##------- */
+ 0x60, 0x00, /* -##------- */
+ 0x60, 0x00, /* -##------- */
+ 0x60, 0x00, /* -##------- */
+ 0x60, 0x00, /* -##------- */
+ 0x60, 0x00, /* -##------- */
+ 0x60, 0x00, /* -##------- */
+ 0x60, 0x00, /* -##------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+
+ /* 227 0xe3 '' */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x7f, 0x80, /* -########- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+
+ /* 228 0xe4 '' */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x7f, 0x80, /* -########- */
+ 0x60, 0x00, /* -##------- */
+ 0x30, 0x00, /* --##------ */
+ 0x18, 0x00, /* ---##----- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x06, 0x00, /* -----##--- */
+ 0x06, 0x00, /* -----##--- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x18, 0x00, /* ---##----- */
+ 0x30, 0x00, /* --##------ */
+ 0x60, 0x00, /* -##------- */
+ 0x7f, 0x80, /* -########- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+
+ /* 229 0xe5 '' */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x1f, 0xc0, /* ---####### */
+ 0x33, 0x00, /* --##--##-- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x33, 0x00, /* --##--##-- */
+ 0x1e, 0x00, /* ---####--- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+
+ /* 230 0xe6 '' */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x63, 0x80, /* -##---###- */
+ 0x7d, 0x80, /* -#####-##- */
+ 0x60, 0x00, /* -##------- */
+ 0x60, 0x00, /* -##------- */
+ 0x60, 0x00, /* -##------- */
+
+ /* 231 0xe7 '' */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x7f, 0x80, /* -########- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x07, 0x00, /* -----###-- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+
+ /* 232 0xe8 '' */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x3f, 0x00, /* --######-- */
+ 0x6d, 0x80, /* -##-##-##- */
+ 0x6d, 0x80, /* -##-##-##- */
+ 0x6d, 0x80, /* -##-##-##- */
+ 0x6d, 0x80, /* -##-##-##- */
+ 0x6d, 0x80, /* -##-##-##- */
+ 0x6d, 0x80, /* -##-##-##- */
+ 0x6d, 0x80, /* -##-##-##- */
+ 0x6d, 0x80, /* -##-##-##- */
+ 0x3f, 0x00, /* --######-- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+
+ /* 233 0xe9 '' */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x3f, 0x00, /* --######-- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x6d, 0x80, /* -##-##-##- */
+ 0x6d, 0x80, /* -##-##-##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x3f, 0x00, /* --######-- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+
+ /* 234 0xea '' */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x3f, 0x00, /* --######-- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x33, 0x00, /* --##--##-- */
+ 0x33, 0x00, /* --##--##-- */
+ 0x73, 0x80, /* -###--###- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+
+ /* 235 0xeb '' */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x3f, 0x00, /* --######-- */
+ 0x18, 0x00, /* ---##----- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x1e, 0x00, /* ---####--- */
+ 0x33, 0x00, /* --##--##-- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x33, 0x00, /* --##--##-- */
+ 0x1e, 0x00, /* ---####--- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+
+ /* 236 0xec '' */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x3f, 0x00, /* --######-- */
+ 0x6d, 0x80, /* -##-##-##- */
+ 0x6d, 0x80, /* -##-##-##- */
+ 0x6d, 0x80, /* -##-##-##- */
+ 0x6d, 0x80, /* -##-##-##- */
+ 0x3f, 0x00, /* --######-- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+
+ /* 237 0xed '' */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x01, 0x80, /* -------##- */
+ 0x03, 0x00, /* ------##-- */
+ 0x3f, 0x00, /* --######-- */
+ 0x67, 0x80, /* -##--####- */
+ 0x6d, 0x80, /* -##-##-##- */
+ 0x6d, 0x80, /* -##-##-##- */
+ 0x6d, 0x80, /* -##-##-##- */
+ 0x79, 0x80, /* -####--##- */
+ 0x3f, 0x00, /* --######-- */
+ 0x30, 0x00, /* --##------ */
+ 0x60, 0x00, /* -##------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+
+ /* 238 0xee '' */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x1f, 0x80, /* ---######- */
+ 0x30, 0x00, /* --##------ */
+ 0x60, 0x00, /* -##------- */
+ 0x60, 0x00, /* -##------- */
+ 0x7f, 0x80, /* -########- */
+ 0x60, 0x00, /* -##------- */
+ 0x60, 0x00, /* -##------- */
+ 0x30, 0x00, /* --##------ */
+ 0x1f, 0x80, /* ---######- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+
+ /* 239 0xef '' */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x1e, 0x00, /* ---####--- */
+ 0x33, 0x00, /* --##--##-- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x61, 0x80, /* -##----##- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+
+ /* 240 0xf0 '' */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x7f, 0x80, /* -########- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x7f, 0x80, /* -########- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x7f, 0x80, /* -########- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+
+ /* 241 0xf1 '' */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x7f, 0x80, /* -########- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x7f, 0x80, /* -########- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+
+ /* 242 0xf2 '' */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x30, 0x00, /* --##------ */
+ 0x18, 0x00, /* ---##----- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x06, 0x00, /* -----##--- */
+ 0x03, 0x00, /* ------##-- */
+ 0x03, 0x00, /* ------##-- */
+ 0x06, 0x00, /* -----##--- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x18, 0x00, /* ---##----- */
+ 0x30, 0x00, /* --##------ */
+ 0x00, 0x00, /* ---------- */
+ 0x7f, 0x80, /* -########- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+
+ /* 243 0xf3 '' */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x03, 0x00, /* ------##-- */
+ 0x06, 0x00, /* -----##--- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x18, 0x00, /* ---##----- */
+ 0x30, 0x00, /* --##------ */
+ 0x30, 0x00, /* --##------ */
+ 0x18, 0x00, /* ---##----- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x06, 0x00, /* -----##--- */
+ 0x03, 0x00, /* ------##-- */
+ 0x00, 0x00, /* ---------- */
+ 0x7f, 0x80, /* -########- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+
+ /* 244 0xf4 '' */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x07, 0x00, /* -----###-- */
+ 0x0d, 0x80, /* ----##-##- */
+ 0x0d, 0x80, /* ----##-##- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+
+ /* 245 0xf5 '' */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x6c, 0x00, /* -##-##---- */
+ 0x6c, 0x00, /* -##-##---- */
+ 0x38, 0x00, /* --###----- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+
+ /* 246 0xf6 '' */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x7f, 0x80, /* -########- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+
+ /* 247 0xf7 '' */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x39, 0x80, /* --###--##- */
+ 0x6d, 0x80, /* -##-##-##- */
+ 0x67, 0x00, /* -##--###-- */
+ 0x00, 0x00, /* ---------- */
+ 0x39, 0x80, /* --###--##- */
+ 0x6d, 0x80, /* -##-##-##- */
+ 0x67, 0x00, /* -##--###-- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+
+ /* 248 0xf8 '' */
+ 0x00, 0x00, /* ---------- */
+ 0x1e, 0x00, /* ---####--- */
+ 0x33, 0x00, /* --##--##-- */
+ 0x33, 0x00, /* --##--##-- */
+ 0x33, 0x00, /* --##--##-- */
+ 0x1e, 0x00, /* ---####--- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+
+ /* 249 0xf9 '' */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x1c, 0x00, /* ---###---- */
+ 0x1c, 0x00, /* ---###---- */
+ 0x1c, 0x00, /* ---###---- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+
+ /* 250 0xfa '' */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+
+ /* 251 0xfb '' */
+ 0x00, 0x00, /* ---------- */
+ 0x03, 0x80, /* ------###- */
+ 0x03, 0x80, /* ------###- */
+ 0x03, 0x00, /* ------##-- */
+ 0x03, 0x00, /* ------##-- */
+ 0x03, 0x00, /* ------##-- */
+ 0x03, 0x00, /* ------##-- */
+ 0x03, 0x00, /* ------##-- */
+ 0x63, 0x00, /* -##---##-- */
+ 0x63, 0x00, /* -##---##-- */
+ 0x63, 0x00, /* -##---##-- */
+ 0x33, 0x00, /* --##--##-- */
+ 0x1b, 0x00, /* ---##-##-- */
+ 0x0f, 0x00, /* ----####-- */
+ 0x07, 0x00, /* -----###-- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+
+ /* 252 0xfc '' */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x3e, 0x00, /* --#####--- */
+ 0x33, 0x00, /* --##--##-- */
+ 0x33, 0x00, /* --##--##-- */
+ 0x33, 0x00, /* --##--##-- */
+ 0x33, 0x00, /* --##--##-- */
+ 0x33, 0x00, /* --##--##-- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+
+ /* 253 0xfd '' */
+ 0x00, 0x00, /* ---------- */
+ 0x1e, 0x00, /* ---####--- */
+ 0x33, 0x00, /* --##--##-- */
+ 0x33, 0x00, /* --##--##-- */
+ 0x06, 0x00, /* -----##--- */
+ 0x0c, 0x00, /* ----##---- */
+ 0x18, 0x00, /* ---##----- */
+ 0x3f, 0x00, /* --######-- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+
+ /* 254 0xfe '' */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x3f, 0x00, /* --######-- */
+ 0x3f, 0x00, /* --######-- */
+ 0x3f, 0x00, /* --######-- */
+ 0x3f, 0x00, /* --######-- */
+ 0x3f, 0x00, /* --######-- */
+ 0x3f, 0x00, /* --######-- */
+ 0x3f, 0x00, /* --######-- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+
+ /* 255 0xff '' */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+ 0x00, 0x00, /* ---------- */
+} };
+
+
+const struct font_desc font_ter_10x18 = {
+ .idx = TER10x18_IDX,
+ .name = "TER10x18",
+ .width = 10,
+ .height = 18,
+ .charcount = 256,
+ .data = fontdata_ter10x18.data,
+#ifdef __sparc__
+ .pref = 5,
+#else
+ .pref = -1,
+#endif
+};
diff --git a/lib/fonts/fonts.c b/lib/fonts/fonts.c
index 47e34950b665..a7f118b30171 100644
--- a/lib/fonts/fonts.c
+++ b/lib/fonts/fonts.c
@@ -54,6 +54,9 @@ static const struct font_desc *fonts[] = {
#ifdef CONFIG_FONT_6x10
&font_6x10,
#endif
+#ifdef CONFIG_FONT_TER10x18
+ &font_ter_10x18,
+#endif
#ifdef CONFIG_FONT_TER16x32
&font_ter_16x32,
#endif
diff --git a/lib/hweight.c b/lib/hweight.c
index c94586b62551..0dfcafc3fd39 100644
--- a/lib/hweight.c
+++ b/lib/hweight.c
@@ -4,8 +4,8 @@
#include <asm/types.h>
/**
- * hweightN - returns the hamming weight of a N-bit word
- * @x: the word to weigh
+ * DOC: __sw_hweightN - returns the hamming weight of a N-bit word
+ * @w: the word to weigh
*
* The Hamming Weight of a number is the total number of bits set in it.
*/
diff --git a/lib/lockref.c b/lib/lockref.c
index 5d8e3ef3860e..9210fc6ae714 100644
--- a/lib/lockref.c
+++ b/lib/lockref.c
@@ -105,6 +105,7 @@ EXPORT_SYMBOL(lockref_put_return);
* @lockref: pointer to lockref structure
* Return: 1 if count updated successfully or 0 if count <= 1 and lock taken
*/
+#undef lockref_put_or_lock
bool lockref_put_or_lock(struct lockref *lockref)
{
CMPXCHG_LOOP(
diff --git a/lib/math/div64.c b/lib/math/div64.c
index bf77b9843175..d1e92ea24fce 100644
--- a/lib/math/div64.c
+++ b/lib/math/div64.c
@@ -177,94 +177,157 @@ EXPORT_SYMBOL(div64_s64);
* Iterative div/mod for use when dividend is not expected to be much
* bigger than divisor.
*/
+#ifndef iter_div_u64_rem
u32 iter_div_u64_rem(u64 dividend, u32 divisor, u64 *remainder)
{
return __iter_div_u64_rem(dividend, divisor, remainder);
}
EXPORT_SYMBOL(iter_div_u64_rem);
+#endif
-#ifndef mul_u64_u64_div_u64
-u64 mul_u64_u64_div_u64(u64 a, u64 b, u64 c)
-{
- if (ilog2(a) + ilog2(b) <= 62)
- return div64_u64(a * b, c);
+#if !defined(mul_u64_add_u64_div_u64) || defined(test_mul_u64_add_u64_div_u64)
-#if defined(__SIZEOF_INT128__)
+#define mul_add(a, b, c) add_u64_u32(mul_u32_u32(a, b), c)
+#if defined(__SIZEOF_INT128__) && !defined(test_mul_u64_add_u64_div_u64)
+static inline u64 mul_u64_u64_add_u64(u64 *p_lo, u64 a, u64 b, u64 c)
+{
/* native 64x64=128 bits multiplication */
- u128 prod = (u128)a * b;
- u64 n_lo = prod, n_hi = prod >> 64;
+ u128 prod = (u128)a * b + c;
+ *p_lo = prod;
+ return prod >> 64;
+}
#else
-
- /* perform a 64x64=128 bits multiplication manually */
- u32 a_lo = a, a_hi = a >> 32, b_lo = b, b_hi = b >> 32;
+static inline u64 mul_u64_u64_add_u64(u64 *p_lo, u64 a, u64 b, u64 c)
+{
+ /* perform a 64x64=128 bits multiplication in 32bit chunks */
u64 x, y, z;
- x = (u64)a_lo * b_lo;
- y = (u64)a_lo * b_hi + (u32)(x >> 32);
- z = (u64)a_hi * b_hi + (u32)(y >> 32);
- y = (u64)a_hi * b_lo + (u32)y;
- z += (u32)(y >> 32);
- x = (y << 32) + (u32)x;
-
- u64 n_lo = x, n_hi = z;
+ /* Since (x-1)(x-1) + 2(x-1) == x.x - 1 two u32 can be added to a u64 */
+ x = mul_add(a, b, c);
+ y = mul_add(a, b >> 32, c >> 32);
+ y = add_u64_u32(y, x >> 32);
+ z = mul_add(a >> 32, b >> 32, y >> 32);
+ y = mul_add(a >> 32, b, y);
+ *p_lo = (y << 32) + (u32)x;
+ return add_u64_u32(z, y >> 32);
+}
+#endif
+#ifndef BITS_PER_ITER
+#define BITS_PER_ITER (__LONG_WIDTH__ >= 64 ? 32 : 16)
#endif
- /* make sure c is not zero, trigger runtime exception otherwise */
- if (unlikely(c == 0)) {
- unsigned long zero = 0;
+#if BITS_PER_ITER == 32
+#define mul_u64_long_add_u64(p_lo, a, b, c) mul_u64_u64_add_u64(p_lo, a, b, c)
+#define add_u64_long(a, b) ((a) + (b))
+#else
+#undef BITS_PER_ITER
+#define BITS_PER_ITER 16
+static inline u32 mul_u64_long_add_u64(u64 *p_lo, u64 a, u32 b, u64 c)
+{
+ u64 n_lo = mul_add(a, b, c);
+ u64 n_med = mul_add(a >> 32, b, c >> 32);
- OPTIMIZER_HIDE_VAR(zero);
- return ~0UL/zero;
- }
+ n_med = add_u64_u32(n_med, n_lo >> 32);
+ *p_lo = n_med << 32 | (u32)n_lo;
+ return n_med >> 32;
+}
+
+#define add_u64_long(a, b) add_u64_u32(a, b)
+#endif
+
+u64 mul_u64_add_u64_div_u64(u64 a, u64 b, u64 c, u64 d)
+{
+ unsigned long d_msig, q_digit;
+ unsigned int reps, d_z_hi;
+ u64 quotient, n_lo, n_hi;
+ u32 overflow;
- int shift = __builtin_ctzll(c);
+ n_hi = mul_u64_u64_add_u64(&n_lo, a, b, c);
- /* try reducing the fraction in case the dividend becomes <= 64 bits */
- if ((n_hi >> shift) == 0) {
- u64 n = shift ? (n_lo >> shift) | (n_hi << (64 - shift)) : n_lo;
+ if (!n_hi)
+ return div64_u64(n_lo, d);
- return div64_u64(n, c >> shift);
- /*
- * The remainder value if needed would be:
- * res = div64_u64_rem(n, c >> shift, &rem);
- * rem = (rem << shift) + (n_lo - (n << shift));
- */
- }
+ if (unlikely(n_hi >= d)) {
+ /* trigger runtime exception if divisor is zero */
+ if (d == 0) {
+ unsigned long zero = 0;
- if (n_hi >= c) {
+ OPTIMIZER_HIDE_VAR(zero);
+ return ~0UL/zero;
+ }
/* overflow: result is unrepresentable in a u64 */
- return -1;
+ return ~0ULL;
}
- /* Do the full 128 by 64 bits division */
-
- shift = __builtin_clzll(c);
- c <<= shift;
+ /* Left align the divisor, shifting the dividend to match */
+ d_z_hi = __builtin_clzll(d);
+ if (d_z_hi) {
+ d <<= d_z_hi;
+ n_hi = n_hi << d_z_hi | n_lo >> (64 - d_z_hi);
+ n_lo <<= d_z_hi;
+ }
- int p = 64 + shift;
- u64 res = 0;
- bool carry;
+ reps = 64 / BITS_PER_ITER;
+ /* Optimise loop count for small dividends */
+ if (!(u32)(n_hi >> 32)) {
+ reps -= 32 / BITS_PER_ITER;
+ n_hi = n_hi << 32 | n_lo >> 32;
+ n_lo <<= 32;
+ }
+#if BITS_PER_ITER == 16
+ if (!(u32)(n_hi >> 48)) {
+ reps--;
+ n_hi = add_u64_u32(n_hi << 16, n_lo >> 48);
+ n_lo <<= 16;
+ }
+#endif
- do {
- carry = n_hi >> 63;
- shift = carry ? 1 : __builtin_clzll(n_hi);
- if (p < shift)
- break;
- p -= shift;
- n_hi <<= shift;
- n_hi |= n_lo >> (64 - shift);
- n_lo <<= shift;
- if (carry || (n_hi >= c)) {
- n_hi -= c;
- res |= 1ULL << p;
+ /* Invert the dividend so we can use add instead of subtract. */
+ n_lo = ~n_lo;
+ n_hi = ~n_hi;
+
+ /*
+ * Get the most significant BITS_PER_ITER bits of the divisor.
+ * This is used to get a low 'guestimate' of the quotient digit.
+ */
+ d_msig = (d >> (64 - BITS_PER_ITER)) + 1;
+
+ /*
+ * Now do a 'long division' with BITS_PER_ITER bit 'digits'.
+ * The 'guess' quotient digit can be low and BITS_PER_ITER+1 bits.
+ * The worst case is dividing ~0 by 0x8000 which requires two subtracts.
+ */
+ quotient = 0;
+ while (reps--) {
+ q_digit = (unsigned long)(~n_hi >> (64 - 2 * BITS_PER_ITER)) / d_msig;
+ /* Shift 'n' left to align with the product q_digit * d */
+ overflow = n_hi >> (64 - BITS_PER_ITER);
+ n_hi = add_u64_u32(n_hi << BITS_PER_ITER, n_lo >> (64 - BITS_PER_ITER));
+ n_lo <<= BITS_PER_ITER;
+ /* Add product to negated divisor */
+ overflow += mul_u64_long_add_u64(&n_hi, d, q_digit, n_hi);
+ /* Adjust for the q_digit 'guestimate' being low */
+ while (overflow < 0xffffffff >> (32 - BITS_PER_ITER)) {
+ q_digit++;
+ n_hi += d;
+ overflow += n_hi < d;
}
- } while (n_hi);
- /* The remainder value if needed would be n_hi << p */
+ quotient = add_u64_long(quotient << BITS_PER_ITER, q_digit);
+ }
- return res;
+ /*
+ * The above only ensures the remainder doesn't overflow,
+ * it can still be possible to add (aka subtract) another copy
+ * of the divisor.
+ */
+ if ((n_hi + d) > n_hi)
+ quotient++;
+ return quotient;
}
-EXPORT_SYMBOL(mul_u64_u64_div_u64);
+#if !defined(test_mul_u64_add_u64_div_u64)
+EXPORT_SYMBOL(mul_u64_add_u64_div_u64);
+#endif
#endif
diff --git a/lib/math/test_mul_u64_u64_div_u64.c b/lib/math/test_mul_u64_u64_div_u64.c
index 58d058de4e73..338d014f0c73 100644
--- a/lib/math/test_mul_u64_u64_div_u64.c
+++ b/lib/math/test_mul_u64_u64_div_u64.c
@@ -10,80 +10,141 @@
#include <linux/printk.h>
#include <linux/math64.h>
-typedef struct { u64 a; u64 b; u64 c; u64 result; } test_params;
+typedef struct { u64 a; u64 b; u64 d; u64 result; uint round_up;} test_params;
static test_params test_values[] = {
/* this contains many edge values followed by a couple random values */
-{ 0xb, 0x7, 0x3, 0x19 },
-{ 0xffff0000, 0xffff0000, 0xf, 0x1110eeef00000000 },
-{ 0xffffffff, 0xffffffff, 0x1, 0xfffffffe00000001 },
-{ 0xffffffff, 0xffffffff, 0x2, 0x7fffffff00000000 },
-{ 0x1ffffffff, 0xffffffff, 0x2, 0xfffffffe80000000 },
-{ 0x1ffffffff, 0xffffffff, 0x3, 0xaaaaaaa9aaaaaaab },
-{ 0x1ffffffff, 0x1ffffffff, 0x4, 0xffffffff00000000 },
-{ 0xffff000000000000, 0xffff000000000000, 0xffff000000000001, 0xfffeffffffffffff },
-{ 0x3333333333333333, 0x3333333333333333, 0x5555555555555555, 0x1eb851eb851eb851 },
-{ 0x7fffffffffffffff, 0x2, 0x3, 0x5555555555555554 },
-{ 0xffffffffffffffff, 0x2, 0x8000000000000000, 0x3 },
-{ 0xffffffffffffffff, 0x2, 0xc000000000000000, 0x2 },
-{ 0xffffffffffffffff, 0x4000000000000004, 0x8000000000000000, 0x8000000000000007 },
-{ 0xffffffffffffffff, 0x4000000000000001, 0x8000000000000000, 0x8000000000000001 },
-{ 0xffffffffffffffff, 0x8000000000000001, 0xffffffffffffffff, 0x8000000000000001 },
-{ 0xfffffffffffffffe, 0x8000000000000001, 0xffffffffffffffff, 0x8000000000000000 },
-{ 0xffffffffffffffff, 0x8000000000000001, 0xfffffffffffffffe, 0x8000000000000001 },
-{ 0xffffffffffffffff, 0x8000000000000001, 0xfffffffffffffffd, 0x8000000000000002 },
-{ 0x7fffffffffffffff, 0xffffffffffffffff, 0xc000000000000000, 0xaaaaaaaaaaaaaaa8 },
-{ 0xffffffffffffffff, 0x7fffffffffffffff, 0xa000000000000000, 0xccccccccccccccca },
-{ 0xffffffffffffffff, 0x7fffffffffffffff, 0x9000000000000000, 0xe38e38e38e38e38b },
-{ 0x7fffffffffffffff, 0x7fffffffffffffff, 0x5000000000000000, 0xccccccccccccccc9 },
-{ 0xffffffffffffffff, 0xfffffffffffffffe, 0xffffffffffffffff, 0xfffffffffffffffe },
-{ 0xe6102d256d7ea3ae, 0x70a77d0be4c31201, 0xd63ec35ab3220357, 0x78f8bf8cc86c6e18 },
-{ 0xf53bae05cb86c6e1, 0x3847b32d2f8d32e0, 0xcfd4f55a647f403c, 0x42687f79d8998d35 },
-{ 0x9951c5498f941092, 0x1f8c8bfdf287a251, 0xa3c8dc5f81ea3fe2, 0x1d887cb25900091f },
-{ 0x374fee9daa1bb2bb, 0x0d0bfbff7b8ae3ef, 0xc169337bd42d5179, 0x03bb2dbaffcbb961 },
-{ 0xeac0d03ac10eeaf0, 0x89be05dfa162ed9b, 0x92bb1679a41f0e4b, 0xdc5f5cc9e270d216 },
+{ 0xb, 0x7, 0x3, 0x19, 1 },
+{ 0xffff0000, 0xffff0000, 0xf, 0x1110eeef00000000, 0 },
+{ 0xffffffff, 0xffffffff, 0x1, 0xfffffffe00000001, 0 },
+{ 0xffffffff, 0xffffffff, 0x2, 0x7fffffff00000000, 1 },
+{ 0x1ffffffff, 0xffffffff, 0x2, 0xfffffffe80000000, 1 },
+{ 0x1ffffffff, 0xffffffff, 0x3, 0xaaaaaaa9aaaaaaab, 0 },
+{ 0x1ffffffff, 0x1ffffffff, 0x4, 0xffffffff00000000, 1 },
+{ 0xffff000000000000, 0xffff000000000000, 0xffff000000000001, 0xfffeffffffffffff, 1 },
+{ 0x3333333333333333, 0x3333333333333333, 0x5555555555555555, 0x1eb851eb851eb851, 1 },
+{ 0x7fffffffffffffff, 0x2, 0x3, 0x5555555555555554, 1 },
+{ 0xffffffffffffffff, 0x2, 0x8000000000000000, 0x3, 1 },
+{ 0xffffffffffffffff, 0x2, 0xc000000000000000, 0x2, 1 },
+{ 0xffffffffffffffff, 0x4000000000000004, 0x8000000000000000, 0x8000000000000007, 1 },
+{ 0xffffffffffffffff, 0x4000000000000001, 0x8000000000000000, 0x8000000000000001, 1 },
+{ 0xffffffffffffffff, 0x8000000000000001, 0xffffffffffffffff, 0x8000000000000001, 0 },
+{ 0xfffffffffffffffe, 0x8000000000000001, 0xffffffffffffffff, 0x8000000000000000, 1 },
+{ 0xffffffffffffffff, 0x8000000000000001, 0xfffffffffffffffe, 0x8000000000000001, 1 },
+{ 0xffffffffffffffff, 0x8000000000000001, 0xfffffffffffffffd, 0x8000000000000002, 1 },
+{ 0x7fffffffffffffff, 0xffffffffffffffff, 0xc000000000000000, 0xaaaaaaaaaaaaaaa8, 1 },
+{ 0xffffffffffffffff, 0x7fffffffffffffff, 0xa000000000000000, 0xccccccccccccccca, 1 },
+{ 0xffffffffffffffff, 0x7fffffffffffffff, 0x9000000000000000, 0xe38e38e38e38e38b, 1 },
+{ 0x7fffffffffffffff, 0x7fffffffffffffff, 0x5000000000000000, 0xccccccccccccccc9, 1 },
+{ 0xffffffffffffffff, 0xfffffffffffffffe, 0xffffffffffffffff, 0xfffffffffffffffe, 0 },
+{ 0xe6102d256d7ea3ae, 0x70a77d0be4c31201, 0xd63ec35ab3220357, 0x78f8bf8cc86c6e18, 1 },
+{ 0xf53bae05cb86c6e1, 0x3847b32d2f8d32e0, 0xcfd4f55a647f403c, 0x42687f79d8998d35, 1 },
+{ 0x9951c5498f941092, 0x1f8c8bfdf287a251, 0xa3c8dc5f81ea3fe2, 0x1d887cb25900091f, 1 },
+{ 0x374fee9daa1bb2bb, 0x0d0bfbff7b8ae3ef, 0xc169337bd42d5179, 0x03bb2dbaffcbb961, 1 },
+{ 0xeac0d03ac10eeaf0, 0x89be05dfa162ed9b, 0x92bb1679a41f0e4b, 0xdc5f5cc9e270d216, 1 },
};
/*
* The above table can be verified with the following shell script:
- *
- * #!/bin/sh
- * sed -ne 's/^{ \+\(.*\), \+\(.*\), \+\(.*\), \+\(.*\) },$/\1 \2 \3 \4/p' \
- * lib/math/test_mul_u64_u64_div_u64.c |
- * while read a b c r; do
- * expected=$( printf "obase=16; ibase=16; %X * %X / %X\n" $a $b $c | bc )
- * given=$( printf "%X\n" $r )
- * if [ "$expected" = "$given" ]; then
- * echo "$a * $b / $c = $r OK"
- * else
- * echo "$a * $b / $c = $r is wrong" >&2
- * echo "should be equivalent to 0x$expected" >&2
- * exit 1
- * fi
- * done
+
+#!/bin/sh
+sed -ne 's/^{ \+\(.*\), \+\(.*\), \+\(.*\), \+\(.*\), \+\(.*\) },$/\1 \2 \3 \4 \5/p' \
+ lib/math/test_mul_u64_u64_div_u64.c |
+while read a b d r e; do
+ expected=$( printf "obase=16; ibase=16; %X * %X / %X\n" $a $b $d | bc )
+ given=$( printf "%X\n" $r )
+ if [ "$expected" = "$given" ]; then
+ echo "$a * $b / $d = $r OK"
+ else
+ echo "$a * $b / $d = $r is wrong" >&2
+ echo "should be equivalent to 0x$expected" >&2
+ exit 1
+ fi
+ expected=$( printf "obase=16; ibase=16; (%X * %X + %X) / %X\n" $a $b $((d-1)) $d | bc )
+ given=$( printf "%X\n" $((r + e)) )
+ if [ "$expected" = "$given" ]; then
+ echo "$a * $b +/ $d = $(printf '%#x' $((r + e))) OK"
+ else
+ echo "$a * $b +/ $d = $(printf '%#x' $((r + e))) is wrong" >&2
+ echo "should be equivalent to 0x$expected" >&2
+ exit 1
+ fi
+done
+
*/
-static int __init test_init(void)
+static u64 test_mul_u64_add_u64_div_u64(u64 a, u64 b, u64 c, u64 d);
+#if __LONG_WIDTH__ >= 64
+#define TEST_32BIT_DIV
+static u64 test_mul_u64_add_u64_div_u64_32bit(u64 a, u64 b, u64 c, u64 d);
+#endif
+
+static int __init test_run(unsigned int fn_no, const char *fn_name)
{
+ u64 start_time;
+ int errors = 0;
+ int tests = 0;
int i;
- pr_info("Starting mul_u64_u64_div_u64() test\n");
+ start_time = ktime_get_ns();
for (i = 0; i < ARRAY_SIZE(test_values); i++) {
u64 a = test_values[i].a;
u64 b = test_values[i].b;
- u64 c = test_values[i].c;
+ u64 d = test_values[i].d;
u64 expected_result = test_values[i].result;
- u64 result = mul_u64_u64_div_u64(a, b, c);
+ u64 result, result_up;
+
+ switch (fn_no) {
+ default:
+ result = mul_u64_u64_div_u64(a, b, d);
+ result_up = mul_u64_u64_div_u64_roundup(a, b, d);
+ break;
+ case 1:
+ result = test_mul_u64_add_u64_div_u64(a, b, 0, d);
+ result_up = test_mul_u64_add_u64_div_u64(a, b, d - 1, d);
+ break;
+#ifdef TEST_32BIT_DIV
+ case 2:
+ result = test_mul_u64_add_u64_div_u64_32bit(a, b, 0, d);
+ result_up = test_mul_u64_add_u64_div_u64_32bit(a, b, d - 1, d);
+ break;
+#endif
+ }
+
+ tests += 2;
if (result != expected_result) {
- pr_err("ERROR: 0x%016llx * 0x%016llx / 0x%016llx\n", a, b, c);
+ pr_err("ERROR: 0x%016llx * 0x%016llx / 0x%016llx\n", a, b, d);
pr_err("ERROR: expected result: %016llx\n", expected_result);
pr_err("ERROR: obtained result: %016llx\n", result);
+ errors++;
+ }
+ expected_result += test_values[i].round_up;
+ if (result_up != expected_result) {
+ pr_err("ERROR: 0x%016llx * 0x%016llx +/ 0x%016llx\n", a, b, d);
+ pr_err("ERROR: expected result: %016llx\n", expected_result);
+ pr_err("ERROR: obtained result: %016llx\n", result_up);
+ errors++;
}
}
- pr_info("Completed mul_u64_u64_div_u64() test\n");
+ pr_info("Completed %s() test, %d tests, %d errors, %llu ns\n",
+ fn_name, tests, errors, ktime_get_ns() - start_time);
+ return errors;
+}
+
+static int __init test_init(void)
+{
+ pr_info("Starting mul_u64_u64_div_u64() test\n");
+ if (test_run(0, "mul_u64_u64_div_u64"))
+ return -EINVAL;
+ if (test_run(1, "test_mul_u64_u64_div_u64"))
+ return -EINVAL;
+#ifdef TEST_32BIT_DIV
+ if (test_run(2, "test_mul_u64_u64_div_u64_32bit"))
+ return -EINVAL;
+#endif
return 0;
}
@@ -91,6 +152,36 @@ static void __exit test_exit(void)
{
}
+/* Compile the generic mul_u64_add_u64_div_u64() code */
+#undef __div64_32
+#define __div64_32 __div64_32
+#define div_s64_rem div_s64_rem
+#define div64_u64_rem div64_u64_rem
+#define div64_u64 div64_u64
+#define div64_s64 div64_s64
+#define iter_div_u64_rem iter_div_u64_rem
+
+#undef mul_u64_add_u64_div_u64
+#define mul_u64_add_u64_div_u64 test_mul_u64_add_u64_div_u64
+#define test_mul_u64_add_u64_div_u64 test_mul_u64_add_u64_div_u64
+
+#include "div64.c"
+
+#ifdef TEST_32BIT_DIV
+/* Recompile the generic code for 32bit long */
+#undef test_mul_u64_add_u64_div_u64
+#define test_mul_u64_add_u64_div_u64 test_mul_u64_add_u64_div_u64_32bit
+#undef BITS_PER_ITER
+#define BITS_PER_ITER 16
+
+#define mul_u64_u64_add_u64 mul_u64_u64_add_u64_32bit
+#undef mul_u64_long_add_u64
+#undef add_u64_long
+#undef mul_add
+
+#include "div64.c"
+#endif
+
module_init(test_init);
module_exit(test_exit);
diff --git a/lib/plist.c b/lib/plist.c
index 330febb4bd7d..ba677c31e8f3 100644
--- a/lib/plist.c
+++ b/lib/plist.c
@@ -47,8 +47,8 @@ static void plist_check_list(struct list_head *top)
plist_check_prev_next(top, prev, next);
while (next != top) {
- WRITE_ONCE(prev, next);
- WRITE_ONCE(next, prev->next);
+ prev = next;
+ next = prev->next;
plist_check_prev_next(top, prev, next);
}
}
diff --git a/lib/raid6/recov_rvv.c b/lib/raid6/recov_rvv.c
index 5f779719c3d3..40c393206b6a 100644
--- a/lib/raid6/recov_rvv.c
+++ b/lib/raid6/recov_rvv.c
@@ -4,13 +4,8 @@
* Author: Chunyan Zhang <zhangchunyan@iscas.ac.cn>
*/
-#include <asm/vector.h>
#include <linux/raid/pq.h>
-
-static int rvv_has_vector(void)
-{
- return has_vector();
-}
+#include "rvv.h"
static void __raid6_2data_recov_rvv(int bytes, u8 *p, u8 *q, u8 *dp,
u8 *dq, const u8 *pbmul,
diff --git a/lib/raid6/rvv.c b/lib/raid6/rvv.c
index 89da5fc247aa..75c9dafedb28 100644
--- a/lib/raid6/rvv.c
+++ b/lib/raid6/rvv.c
@@ -9,22 +9,17 @@
* Copyright 2002-2004 H. Peter Anvin
*/
-#include <asm/vector.h>
-#include <linux/raid/pq.h>
#include "rvv.h"
-#define NSIZE (riscv_v_vsize / 32) /* NSIZE = vlenb */
-
-static int rvv_has_vector(void)
-{
- return has_vector();
-}
+#ifdef __riscv_vector
+#error "This code must be built without compiler support for vector"
+#endif
static void raid6_rvv1_gen_syndrome_real(int disks, unsigned long bytes, void **ptrs)
{
u8 **dptr = (u8 **)ptrs;
u8 *p, *q;
- unsigned long vl, d;
+ unsigned long vl, d, nsize;
int z, z0;
z0 = disks - 3; /* Highest data disk */
@@ -38,8 +33,10 @@ static void raid6_rvv1_gen_syndrome_real(int disks, unsigned long bytes, void **
: "=&r" (vl)
);
+ nsize = vl;
+
/* v0:wp0, v1:wq0, v2:wd0/w20, v3:w10 */
- for (d = 0; d < bytes; d += NSIZE * 1) {
+ for (d = 0; d < bytes; d += nsize * 1) {
/* wq$$ = wp$$ = *(unative_t *)&dptr[z0][d+$$*NSIZE]; */
asm volatile (".option push\n"
".option arch,+v\n"
@@ -47,7 +44,7 @@ static void raid6_rvv1_gen_syndrome_real(int disks, unsigned long bytes, void **
"vmv.v.v v1, v0\n"
".option pop\n"
: :
- [wp0]"r"(&dptr[z0][d + 0 * NSIZE])
+ [wp0]"r"(&dptr[z0][d + 0 * nsize])
);
for (z = z0 - 1 ; z >= 0 ; z--) {
@@ -71,7 +68,7 @@ static void raid6_rvv1_gen_syndrome_real(int disks, unsigned long bytes, void **
"vxor.vv v0, v0, v2\n"
".option pop\n"
: :
- [wd0]"r"(&dptr[z][d + 0 * NSIZE]),
+ [wd0]"r"(&dptr[z][d + 0 * nsize]),
[x1d]"r"(0x1d)
);
}
@@ -86,8 +83,8 @@ static void raid6_rvv1_gen_syndrome_real(int disks, unsigned long bytes, void **
"vse8.v v1, (%[wq0])\n"
".option pop\n"
: :
- [wp0]"r"(&p[d + NSIZE * 0]),
- [wq0]"r"(&q[d + NSIZE * 0])
+ [wp0]"r"(&p[d + nsize * 0]),
+ [wq0]"r"(&q[d + nsize * 0])
);
}
}
@@ -97,7 +94,7 @@ static void raid6_rvv1_xor_syndrome_real(int disks, int start, int stop,
{
u8 **dptr = (u8 **)ptrs;
u8 *p, *q;
- unsigned long vl, d;
+ unsigned long vl, d, nsize;
int z, z0;
z0 = stop; /* P/Q right side optimization */
@@ -111,8 +108,10 @@ static void raid6_rvv1_xor_syndrome_real(int disks, int start, int stop,
: "=&r" (vl)
);
+ nsize = vl;
+
/* v0:wp0, v1:wq0, v2:wd0/w20, v3:w10 */
- for (d = 0 ; d < bytes ; d += NSIZE * 1) {
+ for (d = 0 ; d < bytes ; d += nsize * 1) {
/* wq$$ = wp$$ = *(unative_t *)&dptr[z0][d+$$*NSIZE]; */
asm volatile (".option push\n"
".option arch,+v\n"
@@ -120,7 +119,7 @@ static void raid6_rvv1_xor_syndrome_real(int disks, int start, int stop,
"vmv.v.v v1, v0\n"
".option pop\n"
: :
- [wp0]"r"(&dptr[z0][d + 0 * NSIZE])
+ [wp0]"r"(&dptr[z0][d + 0 * nsize])
);
/* P/Q data pages */
@@ -145,7 +144,7 @@ static void raid6_rvv1_xor_syndrome_real(int disks, int start, int stop,
"vxor.vv v0, v0, v2\n"
".option pop\n"
: :
- [wd0]"r"(&dptr[z][d + 0 * NSIZE]),
+ [wd0]"r"(&dptr[z][d + 0 * nsize]),
[x1d]"r"(0x1d)
);
}
@@ -185,8 +184,8 @@ static void raid6_rvv1_xor_syndrome_real(int disks, int start, int stop,
"vse8.v v3, (%[wq0])\n"
".option pop\n"
: :
- [wp0]"r"(&p[d + NSIZE * 0]),
- [wq0]"r"(&q[d + NSIZE * 0])
+ [wp0]"r"(&p[d + nsize * 0]),
+ [wq0]"r"(&q[d + nsize * 0])
);
}
}
@@ -195,7 +194,7 @@ static void raid6_rvv2_gen_syndrome_real(int disks, unsigned long bytes, void **
{
u8 **dptr = (u8 **)ptrs;
u8 *p, *q;
- unsigned long vl, d;
+ unsigned long vl, d, nsize;
int z, z0;
z0 = disks - 3; /* Highest data disk */
@@ -209,11 +208,13 @@ static void raid6_rvv2_gen_syndrome_real(int disks, unsigned long bytes, void **
: "=&r" (vl)
);
+ nsize = vl;
+
/*
* v0:wp0, v1:wq0, v2:wd0/w20, v3:w10
* v4:wp1, v5:wq1, v6:wd1/w21, v7:w11
*/
- for (d = 0; d < bytes; d += NSIZE * 2) {
+ for (d = 0; d < bytes; d += nsize * 2) {
/* wq$$ = wp$$ = *(unative_t *)&dptr[z0][d+$$*NSIZE]; */
asm volatile (".option push\n"
".option arch,+v\n"
@@ -223,8 +224,8 @@ static void raid6_rvv2_gen_syndrome_real(int disks, unsigned long bytes, void **
"vmv.v.v v5, v4\n"
".option pop\n"
: :
- [wp0]"r"(&dptr[z0][d + 0 * NSIZE]),
- [wp1]"r"(&dptr[z0][d + 1 * NSIZE])
+ [wp0]"r"(&dptr[z0][d + 0 * nsize]),
+ [wp1]"r"(&dptr[z0][d + 1 * nsize])
);
for (z = z0 - 1; z >= 0; z--) {
@@ -256,8 +257,8 @@ static void raid6_rvv2_gen_syndrome_real(int disks, unsigned long bytes, void **
"vxor.vv v4, v4, v6\n"
".option pop\n"
: :
- [wd0]"r"(&dptr[z][d + 0 * NSIZE]),
- [wd1]"r"(&dptr[z][d + 1 * NSIZE]),
+ [wd0]"r"(&dptr[z][d + 0 * nsize]),
+ [wd1]"r"(&dptr[z][d + 1 * nsize]),
[x1d]"r"(0x1d)
);
}
@@ -274,10 +275,10 @@ static void raid6_rvv2_gen_syndrome_real(int disks, unsigned long bytes, void **
"vse8.v v5, (%[wq1])\n"
".option pop\n"
: :
- [wp0]"r"(&p[d + NSIZE * 0]),
- [wq0]"r"(&q[d + NSIZE * 0]),
- [wp1]"r"(&p[d + NSIZE * 1]),
- [wq1]"r"(&q[d + NSIZE * 1])
+ [wp0]"r"(&p[d + nsize * 0]),
+ [wq0]"r"(&q[d + nsize * 0]),
+ [wp1]"r"(&p[d + nsize * 1]),
+ [wq1]"r"(&q[d + nsize * 1])
);
}
}
@@ -287,7 +288,7 @@ static void raid6_rvv2_xor_syndrome_real(int disks, int start, int stop,
{
u8 **dptr = (u8 **)ptrs;
u8 *p, *q;
- unsigned long vl, d;
+ unsigned long vl, d, nsize;
int z, z0;
z0 = stop; /* P/Q right side optimization */
@@ -301,11 +302,13 @@ static void raid6_rvv2_xor_syndrome_real(int disks, int start, int stop,
: "=&r" (vl)
);
+ nsize = vl;
+
/*
* v0:wp0, v1:wq0, v2:wd0/w20, v3:w10
* v4:wp1, v5:wq1, v6:wd1/w21, v7:w11
*/
- for (d = 0; d < bytes; d += NSIZE * 2) {
+ for (d = 0; d < bytes; d += nsize * 2) {
/* wq$$ = wp$$ = *(unative_t *)&dptr[z0][d+$$*NSIZE]; */
asm volatile (".option push\n"
".option arch,+v\n"
@@ -315,8 +318,8 @@ static void raid6_rvv2_xor_syndrome_real(int disks, int start, int stop,
"vmv.v.v v5, v4\n"
".option pop\n"
: :
- [wp0]"r"(&dptr[z0][d + 0 * NSIZE]),
- [wp1]"r"(&dptr[z0][d + 1 * NSIZE])
+ [wp0]"r"(&dptr[z0][d + 0 * nsize]),
+ [wp1]"r"(&dptr[z0][d + 1 * nsize])
);
/* P/Q data pages */
@@ -349,8 +352,8 @@ static void raid6_rvv2_xor_syndrome_real(int disks, int start, int stop,
"vxor.vv v4, v4, v6\n"
".option pop\n"
: :
- [wd0]"r"(&dptr[z][d + 0 * NSIZE]),
- [wd1]"r"(&dptr[z][d + 1 * NSIZE]),
+ [wd0]"r"(&dptr[z][d + 0 * nsize]),
+ [wd1]"r"(&dptr[z][d + 1 * nsize]),
[x1d]"r"(0x1d)
);
}
@@ -403,10 +406,10 @@ static void raid6_rvv2_xor_syndrome_real(int disks, int start, int stop,
"vse8.v v7, (%[wq1])\n"
".option pop\n"
: :
- [wp0]"r"(&p[d + NSIZE * 0]),
- [wq0]"r"(&q[d + NSIZE * 0]),
- [wp1]"r"(&p[d + NSIZE * 1]),
- [wq1]"r"(&q[d + NSIZE * 1])
+ [wp0]"r"(&p[d + nsize * 0]),
+ [wq0]"r"(&q[d + nsize * 0]),
+ [wp1]"r"(&p[d + nsize * 1]),
+ [wq1]"r"(&q[d + nsize * 1])
);
}
}
@@ -415,7 +418,7 @@ static void raid6_rvv4_gen_syndrome_real(int disks, unsigned long bytes, void **
{
u8 **dptr = (u8 **)ptrs;
u8 *p, *q;
- unsigned long vl, d;
+ unsigned long vl, d, nsize;
int z, z0;
z0 = disks - 3; /* Highest data disk */
@@ -429,13 +432,15 @@ static void raid6_rvv4_gen_syndrome_real(int disks, unsigned long bytes, void **
: "=&r" (vl)
);
+ nsize = vl;
+
/*
* v0:wp0, v1:wq0, v2:wd0/w20, v3:w10
* v4:wp1, v5:wq1, v6:wd1/w21, v7:w11
* v8:wp2, v9:wq2, v10:wd2/w22, v11:w12
* v12:wp3, v13:wq3, v14:wd3/w23, v15:w13
*/
- for (d = 0; d < bytes; d += NSIZE * 4) {
+ for (d = 0; d < bytes; d += nsize * 4) {
/* wq$$ = wp$$ = *(unative_t *)&dptr[z0][d+$$*NSIZE]; */
asm volatile (".option push\n"
".option arch,+v\n"
@@ -449,10 +454,10 @@ static void raid6_rvv4_gen_syndrome_real(int disks, unsigned long bytes, void **
"vmv.v.v v13, v12\n"
".option pop\n"
: :
- [wp0]"r"(&dptr[z0][d + 0 * NSIZE]),
- [wp1]"r"(&dptr[z0][d + 1 * NSIZE]),
- [wp2]"r"(&dptr[z0][d + 2 * NSIZE]),
- [wp3]"r"(&dptr[z0][d + 3 * NSIZE])
+ [wp0]"r"(&dptr[z0][d + 0 * nsize]),
+ [wp1]"r"(&dptr[z0][d + 1 * nsize]),
+ [wp2]"r"(&dptr[z0][d + 2 * nsize]),
+ [wp3]"r"(&dptr[z0][d + 3 * nsize])
);
for (z = z0 - 1; z >= 0; z--) {
@@ -500,10 +505,10 @@ static void raid6_rvv4_gen_syndrome_real(int disks, unsigned long bytes, void **
"vxor.vv v12, v12, v14\n"
".option pop\n"
: :
- [wd0]"r"(&dptr[z][d + 0 * NSIZE]),
- [wd1]"r"(&dptr[z][d + 1 * NSIZE]),
- [wd2]"r"(&dptr[z][d + 2 * NSIZE]),
- [wd3]"r"(&dptr[z][d + 3 * NSIZE]),
+ [wd0]"r"(&dptr[z][d + 0 * nsize]),
+ [wd1]"r"(&dptr[z][d + 1 * nsize]),
+ [wd2]"r"(&dptr[z][d + 2 * nsize]),
+ [wd3]"r"(&dptr[z][d + 3 * nsize]),
[x1d]"r"(0x1d)
);
}
@@ -524,14 +529,14 @@ static void raid6_rvv4_gen_syndrome_real(int disks, unsigned long bytes, void **
"vse8.v v13, (%[wq3])\n"
".option pop\n"
: :
- [wp0]"r"(&p[d + NSIZE * 0]),
- [wq0]"r"(&q[d + NSIZE * 0]),
- [wp1]"r"(&p[d + NSIZE * 1]),
- [wq1]"r"(&q[d + NSIZE * 1]),
- [wp2]"r"(&p[d + NSIZE * 2]),
- [wq2]"r"(&q[d + NSIZE * 2]),
- [wp3]"r"(&p[d + NSIZE * 3]),
- [wq3]"r"(&q[d + NSIZE * 3])
+ [wp0]"r"(&p[d + nsize * 0]),
+ [wq0]"r"(&q[d + nsize * 0]),
+ [wp1]"r"(&p[d + nsize * 1]),
+ [wq1]"r"(&q[d + nsize * 1]),
+ [wp2]"r"(&p[d + nsize * 2]),
+ [wq2]"r"(&q[d + nsize * 2]),
+ [wp3]"r"(&p[d + nsize * 3]),
+ [wq3]"r"(&q[d + nsize * 3])
);
}
}
@@ -541,7 +546,7 @@ static void raid6_rvv4_xor_syndrome_real(int disks, int start, int stop,
{
u8 **dptr = (u8 **)ptrs;
u8 *p, *q;
- unsigned long vl, d;
+ unsigned long vl, d, nsize;
int z, z0;
z0 = stop; /* P/Q right side optimization */
@@ -555,13 +560,15 @@ static void raid6_rvv4_xor_syndrome_real(int disks, int start, int stop,
: "=&r" (vl)
);
+ nsize = vl;
+
/*
* v0:wp0, v1:wq0, v2:wd0/w20, v3:w10
* v4:wp1, v5:wq1, v6:wd1/w21, v7:w11
* v8:wp2, v9:wq2, v10:wd2/w22, v11:w12
* v12:wp3, v13:wq3, v14:wd3/w23, v15:w13
*/
- for (d = 0; d < bytes; d += NSIZE * 4) {
+ for (d = 0; d < bytes; d += nsize * 4) {
/* wq$$ = wp$$ = *(unative_t *)&dptr[z0][d+$$*NSIZE]; */
asm volatile (".option push\n"
".option arch,+v\n"
@@ -575,10 +582,10 @@ static void raid6_rvv4_xor_syndrome_real(int disks, int start, int stop,
"vmv.v.v v13, v12\n"
".option pop\n"
: :
- [wp0]"r"(&dptr[z0][d + 0 * NSIZE]),
- [wp1]"r"(&dptr[z0][d + 1 * NSIZE]),
- [wp2]"r"(&dptr[z0][d + 2 * NSIZE]),
- [wp3]"r"(&dptr[z0][d + 3 * NSIZE])
+ [wp0]"r"(&dptr[z0][d + 0 * nsize]),
+ [wp1]"r"(&dptr[z0][d + 1 * nsize]),
+ [wp2]"r"(&dptr[z0][d + 2 * nsize]),
+ [wp3]"r"(&dptr[z0][d + 3 * nsize])
);
/* P/Q data pages */
@@ -627,10 +634,10 @@ static void raid6_rvv4_xor_syndrome_real(int disks, int start, int stop,
"vxor.vv v12, v12, v14\n"
".option pop\n"
: :
- [wd0]"r"(&dptr[z][d + 0 * NSIZE]),
- [wd1]"r"(&dptr[z][d + 1 * NSIZE]),
- [wd2]"r"(&dptr[z][d + 2 * NSIZE]),
- [wd3]"r"(&dptr[z][d + 3 * NSIZE]),
+ [wd0]"r"(&dptr[z][d + 0 * nsize]),
+ [wd1]"r"(&dptr[z][d + 1 * nsize]),
+ [wd2]"r"(&dptr[z][d + 2 * nsize]),
+ [wd3]"r"(&dptr[z][d + 3 * nsize]),
[x1d]"r"(0x1d)
);
}
@@ -709,14 +716,14 @@ static void raid6_rvv4_xor_syndrome_real(int disks, int start, int stop,
"vse8.v v15, (%[wq3])\n"
".option pop\n"
: :
- [wp0]"r"(&p[d + NSIZE * 0]),
- [wq0]"r"(&q[d + NSIZE * 0]),
- [wp1]"r"(&p[d + NSIZE * 1]),
- [wq1]"r"(&q[d + NSIZE * 1]),
- [wp2]"r"(&p[d + NSIZE * 2]),
- [wq2]"r"(&q[d + NSIZE * 2]),
- [wp3]"r"(&p[d + NSIZE * 3]),
- [wq3]"r"(&q[d + NSIZE * 3])
+ [wp0]"r"(&p[d + nsize * 0]),
+ [wq0]"r"(&q[d + nsize * 0]),
+ [wp1]"r"(&p[d + nsize * 1]),
+ [wq1]"r"(&q[d + nsize * 1]),
+ [wp2]"r"(&p[d + nsize * 2]),
+ [wq2]"r"(&q[d + nsize * 2]),
+ [wp3]"r"(&p[d + nsize * 3]),
+ [wq3]"r"(&q[d + nsize * 3])
);
}
}
@@ -725,7 +732,7 @@ static void raid6_rvv8_gen_syndrome_real(int disks, unsigned long bytes, void **
{
u8 **dptr = (u8 **)ptrs;
u8 *p, *q;
- unsigned long vl, d;
+ unsigned long vl, d, nsize;
int z, z0;
z0 = disks - 3; /* Highest data disk */
@@ -739,6 +746,8 @@ static void raid6_rvv8_gen_syndrome_real(int disks, unsigned long bytes, void **
: "=&r" (vl)
);
+ nsize = vl;
+
/*
* v0:wp0, v1:wq0, v2:wd0/w20, v3:w10
* v4:wp1, v5:wq1, v6:wd1/w21, v7:w11
@@ -749,7 +758,7 @@ static void raid6_rvv8_gen_syndrome_real(int disks, unsigned long bytes, void **
* v24:wp6, v25:wq6, v26:wd6/w26, v27:w16
* v28:wp7, v29:wq7, v30:wd7/w27, v31:w17
*/
- for (d = 0; d < bytes; d += NSIZE * 8) {
+ for (d = 0; d < bytes; d += nsize * 8) {
/* wq$$ = wp$$ = *(unative_t *)&dptr[z0][d+$$*NSIZE]; */
asm volatile (".option push\n"
".option arch,+v\n"
@@ -771,14 +780,14 @@ static void raid6_rvv8_gen_syndrome_real(int disks, unsigned long bytes, void **
"vmv.v.v v29, v28\n"
".option pop\n"
: :
- [wp0]"r"(&dptr[z0][d + 0 * NSIZE]),
- [wp1]"r"(&dptr[z0][d + 1 * NSIZE]),
- [wp2]"r"(&dptr[z0][d + 2 * NSIZE]),
- [wp3]"r"(&dptr[z0][d + 3 * NSIZE]),
- [wp4]"r"(&dptr[z0][d + 4 * NSIZE]),
- [wp5]"r"(&dptr[z0][d + 5 * NSIZE]),
- [wp6]"r"(&dptr[z0][d + 6 * NSIZE]),
- [wp7]"r"(&dptr[z0][d + 7 * NSIZE])
+ [wp0]"r"(&dptr[z0][d + 0 * nsize]),
+ [wp1]"r"(&dptr[z0][d + 1 * nsize]),
+ [wp2]"r"(&dptr[z0][d + 2 * nsize]),
+ [wp3]"r"(&dptr[z0][d + 3 * nsize]),
+ [wp4]"r"(&dptr[z0][d + 4 * nsize]),
+ [wp5]"r"(&dptr[z0][d + 5 * nsize]),
+ [wp6]"r"(&dptr[z0][d + 6 * nsize]),
+ [wp7]"r"(&dptr[z0][d + 7 * nsize])
);
for (z = z0 - 1; z >= 0; z--) {
@@ -858,14 +867,14 @@ static void raid6_rvv8_gen_syndrome_real(int disks, unsigned long bytes, void **
"vxor.vv v28, v28, v30\n"
".option pop\n"
: :
- [wd0]"r"(&dptr[z][d + 0 * NSIZE]),
- [wd1]"r"(&dptr[z][d + 1 * NSIZE]),
- [wd2]"r"(&dptr[z][d + 2 * NSIZE]),
- [wd3]"r"(&dptr[z][d + 3 * NSIZE]),
- [wd4]"r"(&dptr[z][d + 4 * NSIZE]),
- [wd5]"r"(&dptr[z][d + 5 * NSIZE]),
- [wd6]"r"(&dptr[z][d + 6 * NSIZE]),
- [wd7]"r"(&dptr[z][d + 7 * NSIZE]),
+ [wd0]"r"(&dptr[z][d + 0 * nsize]),
+ [wd1]"r"(&dptr[z][d + 1 * nsize]),
+ [wd2]"r"(&dptr[z][d + 2 * nsize]),
+ [wd3]"r"(&dptr[z][d + 3 * nsize]),
+ [wd4]"r"(&dptr[z][d + 4 * nsize]),
+ [wd5]"r"(&dptr[z][d + 5 * nsize]),
+ [wd6]"r"(&dptr[z][d + 6 * nsize]),
+ [wd7]"r"(&dptr[z][d + 7 * nsize]),
[x1d]"r"(0x1d)
);
}
@@ -894,22 +903,22 @@ static void raid6_rvv8_gen_syndrome_real(int disks, unsigned long bytes, void **
"vse8.v v29, (%[wq7])\n"
".option pop\n"
: :
- [wp0]"r"(&p[d + NSIZE * 0]),
- [wq0]"r"(&q[d + NSIZE * 0]),
- [wp1]"r"(&p[d + NSIZE * 1]),
- [wq1]"r"(&q[d + NSIZE * 1]),
- [wp2]"r"(&p[d + NSIZE * 2]),
- [wq2]"r"(&q[d + NSIZE * 2]),
- [wp3]"r"(&p[d + NSIZE * 3]),
- [wq3]"r"(&q[d + NSIZE * 3]),
- [wp4]"r"(&p[d + NSIZE * 4]),
- [wq4]"r"(&q[d + NSIZE * 4]),
- [wp5]"r"(&p[d + NSIZE * 5]),
- [wq5]"r"(&q[d + NSIZE * 5]),
- [wp6]"r"(&p[d + NSIZE * 6]),
- [wq6]"r"(&q[d + NSIZE * 6]),
- [wp7]"r"(&p[d + NSIZE * 7]),
- [wq7]"r"(&q[d + NSIZE * 7])
+ [wp0]"r"(&p[d + nsize * 0]),
+ [wq0]"r"(&q[d + nsize * 0]),
+ [wp1]"r"(&p[d + nsize * 1]),
+ [wq1]"r"(&q[d + nsize * 1]),
+ [wp2]"r"(&p[d + nsize * 2]),
+ [wq2]"r"(&q[d + nsize * 2]),
+ [wp3]"r"(&p[d + nsize * 3]),
+ [wq3]"r"(&q[d + nsize * 3]),
+ [wp4]"r"(&p[d + nsize * 4]),
+ [wq4]"r"(&q[d + nsize * 4]),
+ [wp5]"r"(&p[d + nsize * 5]),
+ [wq5]"r"(&q[d + nsize * 5]),
+ [wp6]"r"(&p[d + nsize * 6]),
+ [wq6]"r"(&q[d + nsize * 6]),
+ [wp7]"r"(&p[d + nsize * 7]),
+ [wq7]"r"(&q[d + nsize * 7])
);
}
}
@@ -919,7 +928,7 @@ static void raid6_rvv8_xor_syndrome_real(int disks, int start, int stop,
{
u8 **dptr = (u8 **)ptrs;
u8 *p, *q;
- unsigned long vl, d;
+ unsigned long vl, d, nsize;
int z, z0;
z0 = stop; /* P/Q right side optimization */
@@ -933,6 +942,8 @@ static void raid6_rvv8_xor_syndrome_real(int disks, int start, int stop,
: "=&r" (vl)
);
+ nsize = vl;
+
/*
* v0:wp0, v1:wq0, v2:wd0/w20, v3:w10
* v4:wp1, v5:wq1, v6:wd1/w21, v7:w11
@@ -943,7 +954,7 @@ static void raid6_rvv8_xor_syndrome_real(int disks, int start, int stop,
* v24:wp6, v25:wq6, v26:wd6/w26, v27:w16
* v28:wp7, v29:wq7, v30:wd7/w27, v31:w17
*/
- for (d = 0; d < bytes; d += NSIZE * 8) {
+ for (d = 0; d < bytes; d += nsize * 8) {
/* wq$$ = wp$$ = *(unative_t *)&dptr[z0][d+$$*NSIZE]; */
asm volatile (".option push\n"
".option arch,+v\n"
@@ -965,14 +976,14 @@ static void raid6_rvv8_xor_syndrome_real(int disks, int start, int stop,
"vmv.v.v v29, v28\n"
".option pop\n"
: :
- [wp0]"r"(&dptr[z0][d + 0 * NSIZE]),
- [wp1]"r"(&dptr[z0][d + 1 * NSIZE]),
- [wp2]"r"(&dptr[z0][d + 2 * NSIZE]),
- [wp3]"r"(&dptr[z0][d + 3 * NSIZE]),
- [wp4]"r"(&dptr[z0][d + 4 * NSIZE]),
- [wp5]"r"(&dptr[z0][d + 5 * NSIZE]),
- [wp6]"r"(&dptr[z0][d + 6 * NSIZE]),
- [wp7]"r"(&dptr[z0][d + 7 * NSIZE])
+ [wp0]"r"(&dptr[z0][d + 0 * nsize]),
+ [wp1]"r"(&dptr[z0][d + 1 * nsize]),
+ [wp2]"r"(&dptr[z0][d + 2 * nsize]),
+ [wp3]"r"(&dptr[z0][d + 3 * nsize]),
+ [wp4]"r"(&dptr[z0][d + 4 * nsize]),
+ [wp5]"r"(&dptr[z0][d + 5 * nsize]),
+ [wp6]"r"(&dptr[z0][d + 6 * nsize]),
+ [wp7]"r"(&dptr[z0][d + 7 * nsize])
);
/* P/Q data pages */
@@ -1053,14 +1064,14 @@ static void raid6_rvv8_xor_syndrome_real(int disks, int start, int stop,
"vxor.vv v28, v28, v30\n"
".option pop\n"
: :
- [wd0]"r"(&dptr[z][d + 0 * NSIZE]),
- [wd1]"r"(&dptr[z][d + 1 * NSIZE]),
- [wd2]"r"(&dptr[z][d + 2 * NSIZE]),
- [wd3]"r"(&dptr[z][d + 3 * NSIZE]),
- [wd4]"r"(&dptr[z][d + 4 * NSIZE]),
- [wd5]"r"(&dptr[z][d + 5 * NSIZE]),
- [wd6]"r"(&dptr[z][d + 6 * NSIZE]),
- [wd7]"r"(&dptr[z][d + 7 * NSIZE]),
+ [wd0]"r"(&dptr[z][d + 0 * nsize]),
+ [wd1]"r"(&dptr[z][d + 1 * nsize]),
+ [wd2]"r"(&dptr[z][d + 2 * nsize]),
+ [wd3]"r"(&dptr[z][d + 3 * nsize]),
+ [wd4]"r"(&dptr[z][d + 4 * nsize]),
+ [wd5]"r"(&dptr[z][d + 5 * nsize]),
+ [wd6]"r"(&dptr[z][d + 6 * nsize]),
+ [wd7]"r"(&dptr[z][d + 7 * nsize]),
[x1d]"r"(0x1d)
);
}
@@ -1191,22 +1202,22 @@ static void raid6_rvv8_xor_syndrome_real(int disks, int start, int stop,
"vse8.v v31, (%[wq7])\n"
".option pop\n"
: :
- [wp0]"r"(&p[d + NSIZE * 0]),
- [wq0]"r"(&q[d + NSIZE * 0]),
- [wp1]"r"(&p[d + NSIZE * 1]),
- [wq1]"r"(&q[d + NSIZE * 1]),
- [wp2]"r"(&p[d + NSIZE * 2]),
- [wq2]"r"(&q[d + NSIZE * 2]),
- [wp3]"r"(&p[d + NSIZE * 3]),
- [wq3]"r"(&q[d + NSIZE * 3]),
- [wp4]"r"(&p[d + NSIZE * 4]),
- [wq4]"r"(&q[d + NSIZE * 4]),
- [wp5]"r"(&p[d + NSIZE * 5]),
- [wq5]"r"(&q[d + NSIZE * 5]),
- [wp6]"r"(&p[d + NSIZE * 6]),
- [wq6]"r"(&q[d + NSIZE * 6]),
- [wp7]"r"(&p[d + NSIZE * 7]),
- [wq7]"r"(&q[d + NSIZE * 7])
+ [wp0]"r"(&p[d + nsize * 0]),
+ [wq0]"r"(&q[d + nsize * 0]),
+ [wp1]"r"(&p[d + nsize * 1]),
+ [wq1]"r"(&q[d + nsize * 1]),
+ [wp2]"r"(&p[d + nsize * 2]),
+ [wq2]"r"(&q[d + nsize * 2]),
+ [wp3]"r"(&p[d + nsize * 3]),
+ [wq3]"r"(&q[d + nsize * 3]),
+ [wp4]"r"(&p[d + nsize * 4]),
+ [wq4]"r"(&q[d + nsize * 4]),
+ [wp5]"r"(&p[d + nsize * 5]),
+ [wq5]"r"(&q[d + nsize * 5]),
+ [wp6]"r"(&p[d + nsize * 6]),
+ [wq6]"r"(&q[d + nsize * 6]),
+ [wp7]"r"(&p[d + nsize * 7]),
+ [wq7]"r"(&q[d + nsize * 7])
);
}
}
diff --git a/lib/raid6/rvv.h b/lib/raid6/rvv.h
index 94044a1b707b..6d0708a2c8a4 100644
--- a/lib/raid6/rvv.h
+++ b/lib/raid6/rvv.h
@@ -7,6 +7,23 @@
* Definitions for RISC-V RAID-6 code
*/
+#ifdef __KERNEL__
+#include <asm/vector.h>
+#else
+#define kernel_vector_begin()
+#define kernel_vector_end()
+#include <sys/auxv.h>
+#include <asm/hwcap.h>
+#define has_vector() (getauxval(AT_HWCAP) & COMPAT_HWCAP_ISA_V)
+#endif
+
+#include <linux/raid/pq.h>
+
+static int rvv_has_vector(void)
+{
+ return has_vector();
+}
+
#define RAID6_RVV_WRAPPER(_n) \
static void raid6_rvv ## _n ## _gen_syndrome(int disks, \
size_t bytes, void **ptrs) \
diff --git a/lib/raid6/test/Makefile b/lib/raid6/test/Makefile
index 8f2dd2210ba8..09bbe2b14cce 100644
--- a/lib/raid6/test/Makefile
+++ b/lib/raid6/test/Makefile
@@ -35,6 +35,11 @@ ifeq ($(ARCH),aarch64)
HAS_NEON = yes
endif
+ifeq ($(findstring riscv,$(ARCH)),riscv)
+ CFLAGS += -I../../../arch/riscv/include -DCONFIG_RISCV=1
+ HAS_RVV = yes
+endif
+
ifeq ($(findstring ppc,$(ARCH)),ppc)
CFLAGS += -I../../../arch/powerpc/include
HAS_ALTIVEC := $(shell printf '$(pound)include <altivec.h>\nvector int a;\n' |\
@@ -63,6 +68,9 @@ else ifeq ($(HAS_ALTIVEC),yes)
vpermxor1.o vpermxor2.o vpermxor4.o vpermxor8.o
else ifeq ($(ARCH),loongarch64)
OBJS += loongarch_simd.o recov_loongarch_simd.o
+else ifeq ($(HAS_RVV),yes)
+ OBJS += rvv.o recov_rvv.o
+ CFLAGS += -DCONFIG_RISCV_ISA_V=1
endif
.c.o:
diff --git a/lib/ratelimit.c b/lib/ratelimit.c
index 859c251b23ce..e2d65d3b1c35 100644
--- a/lib/ratelimit.c
+++ b/lib/ratelimit.c
@@ -27,7 +27,7 @@
int ___ratelimit(struct ratelimit_state *rs, const char *func)
{
/* Paired with WRITE_ONCE() in .proc_handler().
- * Changing two values seperately could be inconsistent
+ * Changing two values separately could be inconsistent
* and some message could be lost. (See: net_ratelimit_state).
*/
int interval = READ_ONCE(rs->interval);
diff --git a/lib/rbtree.c b/lib/rbtree.c
index 5114eda6309c..18d42bcf4ec9 100644
--- a/lib/rbtree.c
+++ b/lib/rbtree.c
@@ -460,35 +460,6 @@ void __rb_insert_augmented(struct rb_node *node, struct rb_root *root,
}
EXPORT_SYMBOL(__rb_insert_augmented);
-/*
- * This function returns the first node (in sort order) of the tree.
- */
-struct rb_node *rb_first(const struct rb_root *root)
-{
- struct rb_node *n;
-
- n = root->rb_node;
- if (!n)
- return NULL;
- while (n->rb_left)
- n = n->rb_left;
- return n;
-}
-EXPORT_SYMBOL(rb_first);
-
-struct rb_node *rb_last(const struct rb_root *root)
-{
- struct rb_node *n;
-
- n = root->rb_node;
- if (!n)
- return NULL;
- while (n->rb_right)
- n = n->rb_right;
- return n;
-}
-EXPORT_SYMBOL(rb_last);
-
struct rb_node *rb_next(const struct rb_node *node)
{
struct rb_node *parent;
diff --git a/lib/sys_info.c b/lib/sys_info.c
index 496f9151c9b6..f32a06ec9ed4 100644
--- a/lib/sys_info.c
+++ b/lib/sys_info.c
@@ -1,31 +1,35 @@
// SPDX-License-Identifier: GPL-2.0-only
-#include <linux/sched/debug.h>
+#include <linux/array_size.h>
+#include <linux/bitops.h>
+#include <linux/cleanup.h>
#include <linux/console.h>
+#include <linux/log2.h>
#include <linux/kernel.h>
#include <linux/ftrace.h>
-#include <linux/sysctl.h>
#include <linux/nmi.h>
+#include <linux/sched/debug.h>
+#include <linux/string.h>
+#include <linux/sysctl.h>
#include <linux/sys_info.h>
-struct sys_info_name {
- unsigned long bit;
- const char *name;
+static const char * const si_names[] = {
+ [ilog2(SYS_INFO_TASKS)] = "tasks",
+ [ilog2(SYS_INFO_MEM)] = "mem",
+ [ilog2(SYS_INFO_TIMERS)] = "timers",
+ [ilog2(SYS_INFO_LOCKS)] = "locks",
+ [ilog2(SYS_INFO_FTRACE)] = "ftrace",
+ [ilog2(SYS_INFO_PANIC_CONSOLE_REPLAY)] = "",
+ [ilog2(SYS_INFO_ALL_BT)] = "all_bt",
+ [ilog2(SYS_INFO_BLOCKED_TASKS)] = "blocked_tasks",
};
/*
- * When 'si_names' gets updated, please make sure the 'sys_info_avail'
- * below is updated accordingly.
+ * Default kernel sys_info mask.
+ * If a kernel module calls sys_info() with "parameter == 0", then
+ * this mask will be used.
*/
-static const struct sys_info_name si_names[] = {
- { SYS_INFO_TASKS, "tasks" },
- { SYS_INFO_MEM, "mem" },
- { SYS_INFO_TIMERS, "timers" },
- { SYS_INFO_LOCKS, "locks" },
- { SYS_INFO_FTRACE, "ftrace" },
- { SYS_INFO_ALL_CPU_BT, "all_bt" },
- { SYS_INFO_BLOCKED_TASKS, "blocked_tasks" },
-};
+static unsigned long kernel_si_mask;
/* Expecting string like "xxx_sys_info=tasks,mem,timers,locks,ftrace,..." */
unsigned long sys_info_parse_param(char *str)
@@ -36,12 +40,9 @@ unsigned long sys_info_parse_param(char *str)
s = str;
while ((name = strsep(&s, ",")) && *name) {
- for (i = 0; i < ARRAY_SIZE(si_names); i++) {
- if (!strcmp(name, si_names[i].name)) {
- si_bits |= si_names[i].bit;
- break;
- }
- }
+ i = match_string(si_names, ARRAY_SIZE(si_names), name);
+ if (i >= 0)
+ __set_bit(i, &si_bits);
}
return si_bits;
@@ -49,56 +50,93 @@ unsigned long sys_info_parse_param(char *str)
#ifdef CONFIG_SYSCTL
-static const char sys_info_avail[] __maybe_unused = "tasks,mem,timers,locks,ftrace,all_bt,blocked_tasks";
+static int sys_info_write_handler(const struct ctl_table *table,
+ void *buffer, size_t *lenp, loff_t *ppos,
+ unsigned long *si_bits_global)
+{
+ unsigned long si_bits;
+ int ret;
+
+ ret = proc_dostring(table, 1, buffer, lenp, ppos);
+ if (ret)
+ return ret;
+
+ si_bits = sys_info_parse_param(table->data);
+
+ /* The access to the global value is not synchronized. */
+ WRITE_ONCE(*si_bits_global, si_bits);
+
+ return 0;
+}
+
+static int sys_info_read_handler(const struct ctl_table *table,
+ void *buffer, size_t *lenp, loff_t *ppos,
+ unsigned long *si_bits_global)
+{
+ unsigned long si_bits;
+ unsigned int len = 0;
+ char *delim = "";
+ unsigned int i;
+
+ /* The access to the global value is not synchronized. */
+ si_bits = READ_ONCE(*si_bits_global);
+
+ for_each_set_bit(i, &si_bits, ARRAY_SIZE(si_names)) {
+ if (*si_names[i]) {
+ len += scnprintf(table->data + len, table->maxlen - len,
+ "%s%s", delim, si_names[i]);
+ delim = ",";
+ }
+ }
+
+ return proc_dostring(table, 0, buffer, lenp, ppos);
+}
int sysctl_sys_info_handler(const struct ctl_table *ro_table, int write,
void *buffer, size_t *lenp,
loff_t *ppos)
{
- char names[sizeof(sys_info_avail)];
struct ctl_table table;
- unsigned long *si_bits_global;
-
- si_bits_global = ro_table->data;
-
- if (write) {
- unsigned long si_bits;
- int ret;
-
- table = *ro_table;
- table.data = names;
- table.maxlen = sizeof(names);
- ret = proc_dostring(&table, write, buffer, lenp, ppos);
- if (ret)
- return ret;
-
- si_bits = sys_info_parse_param(names);
- /* The access to the global value is not synchronized. */
- WRITE_ONCE(*si_bits_global, si_bits);
- return 0;
- } else {
- /* for 'read' operation */
- char *delim = "";
- int i, len = 0;
-
- names[0] = '\0';
- for (i = 0; i < ARRAY_SIZE(si_names); i++) {
- if (*si_bits_global & si_names[i].bit) {
- len += scnprintf(names + len, sizeof(names) - len,
- "%s%s", delim, si_names[i].name);
- delim = ",";
- }
- }
+ unsigned int i;
+ size_t maxlen;
- table = *ro_table;
- table.data = names;
- table.maxlen = sizeof(names);
- return proc_dostring(&table, write, buffer, lenp, ppos);
- }
+ maxlen = 0;
+ for (i = 0; i < ARRAY_SIZE(si_names); i++)
+ maxlen += strlen(si_names[i]) + 1;
+
+ char *names __free(kfree) = kzalloc(maxlen, GFP_KERNEL);
+ if (!names)
+ return -ENOMEM;
+
+ table = *ro_table;
+ table.data = names;
+ table.maxlen = maxlen;
+
+ if (write)
+ return sys_info_write_handler(&table, buffer, lenp, ppos, ro_table->data);
+ else
+ return sys_info_read_handler(&table, buffer, lenp, ppos, ro_table->data);
+}
+
+static const struct ctl_table sys_info_sysctls[] = {
+ {
+ .procname = "kernel_sys_info",
+ .data = &kernel_si_mask,
+ .maxlen = sizeof(kernel_si_mask),
+ .mode = 0644,
+ .proc_handler = sysctl_sys_info_handler,
+ },
+};
+
+static int __init sys_info_sysctl_init(void)
+{
+ register_sysctl_init("kernel", sys_info_sysctls);
+ return 0;
}
+subsys_initcall(sys_info_sysctl_init);
#endif
-void sys_info(unsigned long si_mask)
+static void __sys_info(unsigned long si_mask)
{
if (si_mask & SYS_INFO_TASKS)
show_state();
@@ -115,9 +153,14 @@ void sys_info(unsigned long si_mask)
if (si_mask & SYS_INFO_FTRACE)
ftrace_dump(DUMP_ALL);
- if (si_mask & SYS_INFO_ALL_CPU_BT)
+ if (si_mask & SYS_INFO_ALL_BT)
trigger_all_cpu_backtrace();
if (si_mask & SYS_INFO_BLOCKED_TASKS)
show_state_filter(TASK_UNINTERRUPTIBLE);
}
+
+void sys_info(unsigned long si_mask)
+{
+ __sys_info(si_mask ? : kernel_si_mask);
+}
diff --git a/lib/test_hmm.c b/lib/test_hmm.c
index 83e3d8208a54..8af169d3873a 100644
--- a/lib/test_hmm.c
+++ b/lib/test_hmm.c
@@ -92,6 +92,7 @@ struct dmirror {
struct xarray pt;
struct mmu_interval_notifier notifier;
struct mutex mutex;
+ __u64 flags;
};
/*
@@ -119,6 +120,7 @@ struct dmirror_device {
unsigned long calloc;
unsigned long cfree;
struct page *free_pages;
+ struct folio *free_folios;
spinlock_t lock; /* protects the above */
};
@@ -492,7 +494,7 @@ fini:
}
static int dmirror_allocate_chunk(struct dmirror_device *mdevice,
- struct page **ppage)
+ struct page **ppage, bool is_large)
{
struct dmirror_chunk *devmem;
struct resource *res = NULL;
@@ -572,20 +574,45 @@ static int dmirror_allocate_chunk(struct dmirror_device *mdevice,
pfn_first, pfn_last);
spin_lock(&mdevice->lock);
- for (pfn = pfn_first; pfn < pfn_last; pfn++) {
+ for (pfn = pfn_first; pfn < pfn_last; ) {
struct page *page = pfn_to_page(pfn);
+ if (is_large && IS_ALIGNED(pfn, HPAGE_PMD_NR)
+ && (pfn + HPAGE_PMD_NR <= pfn_last)) {
+ page->zone_device_data = mdevice->free_folios;
+ mdevice->free_folios = page_folio(page);
+ pfn += HPAGE_PMD_NR;
+ continue;
+ }
+
page->zone_device_data = mdevice->free_pages;
mdevice->free_pages = page;
+ pfn++;
}
+
+ ret = 0;
if (ppage) {
- *ppage = mdevice->free_pages;
- mdevice->free_pages = (*ppage)->zone_device_data;
- mdevice->calloc++;
+ if (is_large) {
+ if (!mdevice->free_folios) {
+ ret = -ENOMEM;
+ goto err_unlock;
+ }
+ *ppage = folio_page(mdevice->free_folios, 0);
+ mdevice->free_folios = (*ppage)->zone_device_data;
+ mdevice->calloc += HPAGE_PMD_NR;
+ } else if (mdevice->free_pages) {
+ *ppage = mdevice->free_pages;
+ mdevice->free_pages = (*ppage)->zone_device_data;
+ mdevice->calloc++;
+ } else {
+ ret = -ENOMEM;
+ goto err_unlock;
+ }
}
+err_unlock:
spin_unlock(&mdevice->lock);
- return 0;
+ return ret;
err_release:
mutex_unlock(&mdevice->devmem_lock);
@@ -598,10 +625,13 @@ err_devmem:
return ret;
}
-static struct page *dmirror_devmem_alloc_page(struct dmirror_device *mdevice)
+static struct page *dmirror_devmem_alloc_page(struct dmirror *dmirror,
+ bool is_large)
{
struct page *dpage = NULL;
struct page *rpage = NULL;
+ unsigned int order = is_large ? HPAGE_PMD_ORDER : 0;
+ struct dmirror_device *mdevice = dmirror->mdevice;
/*
* For ZONE_DEVICE private type, this is a fake device so we allocate
@@ -610,49 +640,55 @@ static struct page *dmirror_devmem_alloc_page(struct dmirror_device *mdevice)
* data and ignore rpage.
*/
if (dmirror_is_private_zone(mdevice)) {
- rpage = alloc_page(GFP_HIGHUSER);
+ rpage = folio_page(folio_alloc(GFP_HIGHUSER, order), 0);
if (!rpage)
return NULL;
}
spin_lock(&mdevice->lock);
- if (mdevice->free_pages) {
+ if (is_large && mdevice->free_folios) {
+ dpage = folio_page(mdevice->free_folios, 0);
+ mdevice->free_folios = dpage->zone_device_data;
+ mdevice->calloc += 1 << order;
+ spin_unlock(&mdevice->lock);
+ } else if (!is_large && mdevice->free_pages) {
dpage = mdevice->free_pages;
mdevice->free_pages = dpage->zone_device_data;
mdevice->calloc++;
spin_unlock(&mdevice->lock);
} else {
spin_unlock(&mdevice->lock);
- if (dmirror_allocate_chunk(mdevice, &dpage))
+ if (dmirror_allocate_chunk(mdevice, &dpage, is_large))
goto error;
}
- zone_device_page_init(dpage);
+ zone_device_folio_init(page_folio(dpage), order);
dpage->zone_device_data = rpage;
return dpage;
error:
if (rpage)
- __free_page(rpage);
+ __free_pages(rpage, order);
return NULL;
}
static void dmirror_migrate_alloc_and_copy(struct migrate_vma *args,
struct dmirror *dmirror)
{
- struct dmirror_device *mdevice = dmirror->mdevice;
const unsigned long *src = args->src;
unsigned long *dst = args->dst;
unsigned long addr;
- for (addr = args->start; addr < args->end; addr += PAGE_SIZE,
- src++, dst++) {
+ for (addr = args->start; addr < args->end; ) {
struct page *spage;
struct page *dpage;
struct page *rpage;
+ bool is_large = *src & MIGRATE_PFN_COMPOUND;
+ int write = (*src & MIGRATE_PFN_WRITE) ? MIGRATE_PFN_WRITE : 0;
+ unsigned long nr = 1;
if (!(*src & MIGRATE_PFN_MIGRATE))
- continue;
+ goto next;
/*
* Note that spage might be NULL which is OK since it is an
@@ -662,17 +698,50 @@ static void dmirror_migrate_alloc_and_copy(struct migrate_vma *args,
if (WARN(spage && is_zone_device_page(spage),
"page already in device spage pfn: 0x%lx\n",
page_to_pfn(spage)))
+ goto next;
+
+ if (dmirror->flags & HMM_DMIRROR_FLAG_FAIL_ALLOC) {
+ dmirror->flags &= ~HMM_DMIRROR_FLAG_FAIL_ALLOC;
+ dpage = NULL;
+ } else
+ dpage = dmirror_devmem_alloc_page(dmirror, is_large);
+
+ if (!dpage) {
+ struct folio *folio;
+ unsigned long i;
+ unsigned long spfn = *src >> MIGRATE_PFN_SHIFT;
+ struct page *src_page;
+
+ if (!is_large)
+ goto next;
+
+ if (!spage && is_large) {
+ nr = HPAGE_PMD_NR;
+ } else {
+ folio = page_folio(spage);
+ nr = folio_nr_pages(folio);
+ }
+
+ for (i = 0; i < nr && addr < args->end; i++) {
+ dpage = dmirror_devmem_alloc_page(dmirror, false);
+ rpage = BACKING_PAGE(dpage);
+ rpage->zone_device_data = dmirror;
+
+ *dst = migrate_pfn(page_to_pfn(dpage)) | write;
+ src_page = pfn_to_page(spfn + i);
+
+ if (spage)
+ copy_highpage(rpage, src_page);
+ else
+ clear_highpage(rpage);
+ src++;
+ dst++;
+ addr += PAGE_SIZE;
+ }
continue;
-
- dpage = dmirror_devmem_alloc_page(mdevice);
- if (!dpage)
- continue;
+ }
rpage = BACKING_PAGE(dpage);
- if (spage)
- copy_highpage(rpage, spage);
- else
- clear_highpage(rpage);
/*
* Normally, a device would use the page->zone_device_data to
@@ -684,10 +753,42 @@ static void dmirror_migrate_alloc_and_copy(struct migrate_vma *args,
pr_debug("migrating from sys to dev pfn src: 0x%lx pfn dst: 0x%lx\n",
page_to_pfn(spage), page_to_pfn(dpage));
- *dst = migrate_pfn(page_to_pfn(dpage));
- if ((*src & MIGRATE_PFN_WRITE) ||
- (!spage && args->vma->vm_flags & VM_WRITE))
- *dst |= MIGRATE_PFN_WRITE;
+
+ *dst = migrate_pfn(page_to_pfn(dpage)) | write;
+
+ if (is_large) {
+ int i;
+ struct folio *folio = page_folio(dpage);
+ *dst |= MIGRATE_PFN_COMPOUND;
+
+ if (folio_test_large(folio)) {
+ for (i = 0; i < folio_nr_pages(folio); i++) {
+ struct page *dst_page =
+ pfn_to_page(page_to_pfn(rpage) + i);
+ struct page *src_page =
+ pfn_to_page(page_to_pfn(spage) + i);
+
+ if (spage)
+ copy_highpage(dst_page, src_page);
+ else
+ clear_highpage(dst_page);
+ src++;
+ dst++;
+ addr += PAGE_SIZE;
+ }
+ continue;
+ }
+ }
+
+ if (spage)
+ copy_highpage(rpage, spage);
+ else
+ clear_highpage(rpage);
+
+next:
+ src++;
+ dst++;
+ addr += PAGE_SIZE;
}
}
@@ -734,14 +835,17 @@ static int dmirror_migrate_finalize_and_map(struct migrate_vma *args,
const unsigned long *src = args->src;
const unsigned long *dst = args->dst;
unsigned long pfn;
+ const unsigned long start_pfn = start >> PAGE_SHIFT;
+ const unsigned long end_pfn = end >> PAGE_SHIFT;
/* Map the migrated pages into the device's page tables. */
mutex_lock(&dmirror->mutex);
- for (pfn = start >> PAGE_SHIFT; pfn < (end >> PAGE_SHIFT); pfn++,
- src++, dst++) {
+ for (pfn = start_pfn; pfn < end_pfn; pfn++, src++, dst++) {
struct page *dpage;
void *entry;
+ int nr, i;
+ struct page *rpage;
if (!(*src & MIGRATE_PFN_MIGRATE))
continue;
@@ -750,13 +854,25 @@ static int dmirror_migrate_finalize_and_map(struct migrate_vma *args,
if (!dpage)
continue;
- entry = BACKING_PAGE(dpage);
- if (*dst & MIGRATE_PFN_WRITE)
- entry = xa_tag_pointer(entry, DPT_XA_TAG_WRITE);
- entry = xa_store(&dmirror->pt, pfn, entry, GFP_ATOMIC);
- if (xa_is_err(entry)) {
- mutex_unlock(&dmirror->mutex);
- return xa_err(entry);
+ if (*dst & MIGRATE_PFN_COMPOUND)
+ nr = folio_nr_pages(page_folio(dpage));
+ else
+ nr = 1;
+
+ WARN_ON_ONCE(end_pfn < start_pfn + nr);
+
+ rpage = BACKING_PAGE(dpage);
+ VM_WARN_ON(folio_nr_pages(page_folio(rpage)) != nr);
+
+ for (i = 0; i < nr; i++) {
+ entry = folio_page(page_folio(rpage), i);
+ if (*dst & MIGRATE_PFN_WRITE)
+ entry = xa_tag_pointer(entry, DPT_XA_TAG_WRITE);
+ entry = xa_store(&dmirror->pt, pfn + i, entry, GFP_ATOMIC);
+ if (xa_is_err(entry)) {
+ mutex_unlock(&dmirror->mutex);
+ return xa_err(entry);
+ }
}
}
@@ -829,31 +945,77 @@ static vm_fault_t dmirror_devmem_fault_alloc_and_copy(struct migrate_vma *args,
unsigned long start = args->start;
unsigned long end = args->end;
unsigned long addr;
+ unsigned int order = 0;
+ int i;
- for (addr = start; addr < end; addr += PAGE_SIZE,
- src++, dst++) {
+ for (addr = start; addr < end; ) {
struct page *dpage, *spage;
spage = migrate_pfn_to_page(*src);
- if (!spage || !(*src & MIGRATE_PFN_MIGRATE))
- continue;
+ if (!spage || !(*src & MIGRATE_PFN_MIGRATE)) {
+ addr += PAGE_SIZE;
+ goto next;
+ }
if (WARN_ON(!is_device_private_page(spage) &&
- !is_device_coherent_page(spage)))
- continue;
- spage = BACKING_PAGE(spage);
- dpage = alloc_page_vma(GFP_HIGHUSER_MOVABLE, args->vma, addr);
- if (!dpage)
- continue;
- pr_debug("migrating from dev to sys pfn src: 0x%lx pfn dst: 0x%lx\n",
- page_to_pfn(spage), page_to_pfn(dpage));
+ !is_device_coherent_page(spage))) {
+ addr += PAGE_SIZE;
+ goto next;
+ }
- lock_page(dpage);
- xa_erase(&dmirror->pt, addr >> PAGE_SHIFT);
- copy_highpage(dpage, spage);
- *dst = migrate_pfn(page_to_pfn(dpage));
+ spage = BACKING_PAGE(spage);
+ order = folio_order(page_folio(spage));
+ if (order)
+ *dst = MIGRATE_PFN_COMPOUND;
if (*src & MIGRATE_PFN_WRITE)
*dst |= MIGRATE_PFN_WRITE;
+
+ if (dmirror->flags & HMM_DMIRROR_FLAG_FAIL_ALLOC) {
+ dmirror->flags &= ~HMM_DMIRROR_FLAG_FAIL_ALLOC;
+ *dst &= ~MIGRATE_PFN_COMPOUND;
+ dpage = NULL;
+ } else if (order) {
+ dpage = folio_page(vma_alloc_folio(GFP_HIGHUSER_MOVABLE,
+ order, args->vma, addr), 0);
+ } else {
+ dpage = alloc_page_vma(GFP_HIGHUSER_MOVABLE, args->vma, addr);
+ }
+
+ if (!dpage && !order)
+ return VM_FAULT_OOM;
+
+ pr_debug("migrating from sys to dev pfn src: 0x%lx pfn dst: 0x%lx\n",
+ page_to_pfn(spage), page_to_pfn(dpage));
+
+ if (dpage) {
+ lock_page(dpage);
+ *dst |= migrate_pfn(page_to_pfn(dpage));
+ }
+
+ for (i = 0; i < (1 << order); i++) {
+ struct page *src_page;
+ struct page *dst_page;
+
+ /* Try with smaller pages if large allocation fails */
+ if (!dpage && order) {
+ dpage = alloc_page_vma(GFP_HIGHUSER_MOVABLE, args->vma, addr);
+ lock_page(dpage);
+ dst[i] = migrate_pfn(page_to_pfn(dpage));
+ dst_page = pfn_to_page(page_to_pfn(dpage));
+ dpage = NULL; /* For the next iteration */
+ } else {
+ dst_page = pfn_to_page(page_to_pfn(dpage) + i);
+ }
+
+ src_page = pfn_to_page(page_to_pfn(spage) + i);
+
+ xa_erase(&dmirror->pt, addr >> PAGE_SHIFT);
+ addr += PAGE_SIZE;
+ copy_highpage(dst_page, src_page);
+ }
+next:
+ src += 1 << order;
+ dst += 1 << order;
}
return 0;
}
@@ -879,11 +1041,14 @@ static int dmirror_migrate_to_system(struct dmirror *dmirror,
unsigned long size = cmd->npages << PAGE_SHIFT;
struct mm_struct *mm = dmirror->notifier.mm;
struct vm_area_struct *vma;
- unsigned long src_pfns[32] = { 0 };
- unsigned long dst_pfns[32] = { 0 };
struct migrate_vma args = { 0 };
unsigned long next;
int ret;
+ unsigned long *src_pfns;
+ unsigned long *dst_pfns;
+
+ src_pfns = kvcalloc(PTRS_PER_PTE, sizeof(*src_pfns), GFP_KERNEL | __GFP_NOFAIL);
+ dst_pfns = kvcalloc(PTRS_PER_PTE, sizeof(*dst_pfns), GFP_KERNEL | __GFP_NOFAIL);
start = cmd->addr;
end = start + size;
@@ -902,7 +1067,7 @@ static int dmirror_migrate_to_system(struct dmirror *dmirror,
ret = -EINVAL;
goto out;
}
- next = min(end, addr + (ARRAY_SIZE(src_pfns) << PAGE_SHIFT));
+ next = min(end, addr + (PTRS_PER_PTE << PAGE_SHIFT));
if (next > vma->vm_end)
next = vma->vm_end;
@@ -912,7 +1077,7 @@ static int dmirror_migrate_to_system(struct dmirror *dmirror,
args.start = addr;
args.end = next;
args.pgmap_owner = dmirror->mdevice;
- args.flags = dmirror_select_device(dmirror);
+ args.flags = dmirror_select_device(dmirror) | MIGRATE_VMA_SELECT_COMPOUND;
ret = migrate_vma_setup(&args);
if (ret)
@@ -928,6 +1093,8 @@ static int dmirror_migrate_to_system(struct dmirror *dmirror,
out:
mmap_read_unlock(mm);
mmput(mm);
+ kvfree(src_pfns);
+ kvfree(dst_pfns);
return ret;
}
@@ -939,12 +1106,12 @@ static int dmirror_migrate_to_device(struct dmirror *dmirror,
unsigned long size = cmd->npages << PAGE_SHIFT;
struct mm_struct *mm = dmirror->notifier.mm;
struct vm_area_struct *vma;
- unsigned long src_pfns[32] = { 0 };
- unsigned long dst_pfns[32] = { 0 };
struct dmirror_bounce bounce;
struct migrate_vma args = { 0 };
unsigned long next;
int ret;
+ unsigned long *src_pfns = NULL;
+ unsigned long *dst_pfns = NULL;
start = cmd->addr;
end = start + size;
@@ -955,6 +1122,18 @@ static int dmirror_migrate_to_device(struct dmirror *dmirror,
if (!mmget_not_zero(mm))
return -EINVAL;
+ ret = -ENOMEM;
+ src_pfns = kvcalloc(PTRS_PER_PTE, sizeof(*src_pfns),
+ GFP_KERNEL | __GFP_NOFAIL);
+ if (!src_pfns)
+ goto free_mem;
+
+ dst_pfns = kvcalloc(PTRS_PER_PTE, sizeof(*dst_pfns),
+ GFP_KERNEL | __GFP_NOFAIL);
+ if (!dst_pfns)
+ goto free_mem;
+
+ ret = 0;
mmap_read_lock(mm);
for (addr = start; addr < end; addr = next) {
vma = vma_lookup(mm, addr);
@@ -962,7 +1141,7 @@ static int dmirror_migrate_to_device(struct dmirror *dmirror,
ret = -EINVAL;
goto out;
}
- next = min(end, addr + (ARRAY_SIZE(src_pfns) << PAGE_SHIFT));
+ next = min(end, addr + (PTRS_PER_PTE << PAGE_SHIFT));
if (next > vma->vm_end)
next = vma->vm_end;
@@ -972,7 +1151,8 @@ static int dmirror_migrate_to_device(struct dmirror *dmirror,
args.start = addr;
args.end = next;
args.pgmap_owner = dmirror->mdevice;
- args.flags = MIGRATE_VMA_SELECT_SYSTEM;
+ args.flags = MIGRATE_VMA_SELECT_SYSTEM |
+ MIGRATE_VMA_SELECT_COMPOUND;
ret = migrate_vma_setup(&args);
if (ret)
goto out;
@@ -992,7 +1172,7 @@ static int dmirror_migrate_to_device(struct dmirror *dmirror,
*/
ret = dmirror_bounce_init(&bounce, start, size);
if (ret)
- return ret;
+ goto free_mem;
mutex_lock(&dmirror->mutex);
ret = dmirror_do_read(dmirror, start, end, &bounce);
mutex_unlock(&dmirror->mutex);
@@ -1003,11 +1183,14 @@ static int dmirror_migrate_to_device(struct dmirror *dmirror,
}
cmd->cpages = bounce.cpages;
dmirror_bounce_fini(&bounce);
- return ret;
+ goto free_mem;
out:
mmap_read_unlock(mm);
mmput(mm);
+free_mem:
+ kfree(src_pfns);
+ kfree(dst_pfns);
return ret;
}
@@ -1200,6 +1383,7 @@ static void dmirror_device_evict_chunk(struct dmirror_chunk *chunk)
unsigned long i;
unsigned long *src_pfns;
unsigned long *dst_pfns;
+ unsigned int order = 0;
src_pfns = kvcalloc(npages, sizeof(*src_pfns), GFP_KERNEL | __GFP_NOFAIL);
dst_pfns = kvcalloc(npages, sizeof(*dst_pfns), GFP_KERNEL | __GFP_NOFAIL);
@@ -1215,13 +1399,25 @@ static void dmirror_device_evict_chunk(struct dmirror_chunk *chunk)
if (WARN_ON(!is_device_private_page(spage) &&
!is_device_coherent_page(spage)))
continue;
+
+ order = folio_order(page_folio(spage));
spage = BACKING_PAGE(spage);
- dpage = alloc_page(GFP_HIGHUSER_MOVABLE | __GFP_NOFAIL);
+ if (src_pfns[i] & MIGRATE_PFN_COMPOUND) {
+ dpage = folio_page(folio_alloc(GFP_HIGHUSER_MOVABLE,
+ order), 0);
+ } else {
+ dpage = alloc_page(GFP_HIGHUSER_MOVABLE | __GFP_NOFAIL);
+ order = 0;
+ }
+
+ /* TODO Support splitting here */
lock_page(dpage);
- copy_highpage(dpage, spage);
dst_pfns[i] = migrate_pfn(page_to_pfn(dpage));
if (src_pfns[i] & MIGRATE_PFN_WRITE)
dst_pfns[i] |= MIGRATE_PFN_WRITE;
+ if (order)
+ dst_pfns[i] |= MIGRATE_PFN_COMPOUND;
+ folio_copy(page_folio(dpage), page_folio(spage));
}
migrate_device_pages(src_pfns, dst_pfns, npages);
migrate_device_finalize(src_pfns, dst_pfns, npages);
@@ -1234,7 +1430,12 @@ static void dmirror_remove_free_pages(struct dmirror_chunk *devmem)
{
struct dmirror_device *mdevice = devmem->mdevice;
struct page *page;
+ struct folio *folio;
+
+ for (folio = mdevice->free_folios; folio; folio = folio_zone_device_data(folio))
+ if (dmirror_page_to_chunk(folio_page(folio, 0)) == devmem)
+ mdevice->free_folios = folio_zone_device_data(folio);
for (page = mdevice->free_pages; page; page = page->zone_device_data)
if (dmirror_page_to_chunk(page) == devmem)
mdevice->free_pages = page->zone_device_data;
@@ -1265,6 +1466,7 @@ static void dmirror_device_remove_chunks(struct dmirror_device *mdevice)
mdevice->devmem_count = 0;
mdevice->devmem_capacity = 0;
mdevice->free_pages = NULL;
+ mdevice->free_folios = NULL;
kfree(mdevice->devmem_chunks);
mdevice->devmem_chunks = NULL;
}
@@ -1329,6 +1531,10 @@ static long dmirror_fops_unlocked_ioctl(struct file *filp,
dmirror_device_remove_chunks(dmirror->mdevice);
ret = 0;
break;
+ case HMM_DMIRROR_FLAGS:
+ dmirror->flags = cmd.npages;
+ ret = 0;
+ break;
default:
return -EINVAL;
@@ -1374,22 +1580,35 @@ static const struct file_operations dmirror_fops = {
.owner = THIS_MODULE,
};
-static void dmirror_devmem_free(struct page *page)
+static void dmirror_devmem_free(struct folio *folio)
{
+ struct page *page = &folio->page;
struct page *rpage = BACKING_PAGE(page);
struct dmirror_device *mdevice;
+ struct folio *rfolio = page_folio(rpage);
+ unsigned int order = folio_order(rfolio);
- if (rpage != page)
- __free_page(rpage);
+ if (rpage != page) {
+ if (order)
+ __free_pages(rpage, order);
+ else
+ __free_page(rpage);
+ rpage = NULL;
+ }
mdevice = dmirror_page_to_device(page);
spin_lock(&mdevice->lock);
/* Return page to our allocator if not freeing the chunk */
if (!dmirror_page_to_chunk(page)->remove) {
- mdevice->cfree++;
- page->zone_device_data = mdevice->free_pages;
- mdevice->free_pages = page;
+ mdevice->cfree += 1 << order;
+ if (order) {
+ page->zone_device_data = mdevice->free_folios;
+ mdevice->free_folios = page_folio(page);
+ } else {
+ page->zone_device_data = mdevice->free_pages;
+ mdevice->free_pages = page;
+ }
}
spin_unlock(&mdevice->lock);
}
@@ -1397,36 +1616,61 @@ static void dmirror_devmem_free(struct page *page)
static vm_fault_t dmirror_devmem_fault(struct vm_fault *vmf)
{
struct migrate_vma args = { 0 };
- unsigned long src_pfns = 0;
- unsigned long dst_pfns = 0;
struct page *rpage;
struct dmirror *dmirror;
- vm_fault_t ret;
+ vm_fault_t ret = 0;
+ unsigned int order, nr;
/*
* Normally, a device would use the page->zone_device_data to point to
* the mirror but here we use it to hold the page for the simulated
* device memory and that page holds the pointer to the mirror.
*/
- rpage = vmf->page->zone_device_data;
+ rpage = folio_zone_device_data(page_folio(vmf->page));
dmirror = rpage->zone_device_data;
/* FIXME demonstrate how we can adjust migrate range */
+ order = folio_order(page_folio(vmf->page));
+ nr = 1 << order;
+
+ /*
+ * When folios are partially mapped, we can't rely on the folio
+ * order of vmf->page as the folio might not be fully split yet
+ */
+ if (vmf->pte) {
+ order = 0;
+ nr = 1;
+ }
+
+ /*
+ * Consider a per-cpu cache of src and dst pfns, but with
+ * large number of cpus that might not scale well.
+ */
+ args.start = ALIGN_DOWN(vmf->address, (PAGE_SIZE << order));
args.vma = vmf->vma;
- args.start = vmf->address;
- args.end = args.start + PAGE_SIZE;
- args.src = &src_pfns;
- args.dst = &dst_pfns;
+ args.end = args.start + (PAGE_SIZE << order);
+
+ nr = (args.end - args.start) >> PAGE_SHIFT;
+ args.src = kcalloc(nr, sizeof(unsigned long), GFP_KERNEL);
+ args.dst = kcalloc(nr, sizeof(unsigned long), GFP_KERNEL);
args.pgmap_owner = dmirror->mdevice;
args.flags = dmirror_select_device(dmirror);
args.fault_page = vmf->page;
+ if (!args.src || !args.dst) {
+ ret = VM_FAULT_OOM;
+ goto err;
+ }
+
+ if (order)
+ args.flags |= MIGRATE_VMA_SELECT_COMPOUND;
+
if (migrate_vma_setup(&args))
return VM_FAULT_SIGBUS;
ret = dmirror_devmem_fault_alloc_and_copy(&args, dmirror);
if (ret)
- return ret;
+ goto err;
migrate_vma_pages(&args);
/*
* No device finalize step is needed since
@@ -1434,12 +1678,50 @@ static vm_fault_t dmirror_devmem_fault(struct vm_fault *vmf)
* invalidated the device page table.
*/
migrate_vma_finalize(&args);
- return 0;
+err:
+ kfree(args.src);
+ kfree(args.dst);
+ return ret;
+}
+
+static void dmirror_devmem_folio_split(struct folio *head, struct folio *tail)
+{
+ struct page *rpage = BACKING_PAGE(folio_page(head, 0));
+ struct page *rpage_tail;
+ struct folio *rfolio;
+ unsigned long offset = 0;
+
+ if (!rpage) {
+ tail->page.zone_device_data = NULL;
+ return;
+ }
+
+ rfolio = page_folio(rpage);
+
+ if (tail == NULL) {
+ folio_reset_order(rfolio);
+ rfolio->mapping = NULL;
+ folio_set_count(rfolio, 1);
+ return;
+ }
+
+ offset = folio_pfn(tail) - folio_pfn(head);
+
+ rpage_tail = folio_page(rfolio, offset);
+ tail->page.zone_device_data = rpage_tail;
+ rpage_tail->zone_device_data = rpage->zone_device_data;
+ clear_compound_head(rpage_tail);
+ rpage_tail->mapping = NULL;
+
+ folio_page(tail, 0)->mapping = folio_page(head, 0)->mapping;
+ tail->pgmap = head->pgmap;
+ folio_set_count(page_folio(rpage_tail), 1);
}
static const struct dev_pagemap_ops dmirror_devmem_ops = {
- .page_free = dmirror_devmem_free,
+ .folio_free = dmirror_devmem_free,
.migrate_to_ram = dmirror_devmem_fault,
+ .folio_split = dmirror_devmem_folio_split,
};
static int dmirror_device_init(struct dmirror_device *mdevice, int id)
@@ -1458,20 +1740,25 @@ static int dmirror_device_init(struct dmirror_device *mdevice, int id)
ret = dev_set_name(&mdevice->device, "hmm_dmirror%u", id);
if (ret)
- return ret;
+ goto put_device;
ret = cdev_device_add(&mdevice->cdevice, &mdevice->device);
if (ret)
- return ret;
+ goto put_device;
/* Build a list of free ZONE_DEVICE struct pages */
- return dmirror_allocate_chunk(mdevice, NULL);
+ return dmirror_allocate_chunk(mdevice, NULL, false);
+
+put_device:
+ put_device(&mdevice->device);
+ return ret;
}
static void dmirror_device_remove(struct dmirror_device *mdevice)
{
dmirror_device_remove_chunks(mdevice);
cdev_device_del(&mdevice->cdevice, &mdevice->device);
+ put_device(&mdevice->device);
}
static int __init hmm_dmirror_init(void)
diff --git a/lib/test_hmm_uapi.h b/lib/test_hmm_uapi.h
index 8c818a2cf4f6..f94c6d457338 100644
--- a/lib/test_hmm_uapi.h
+++ b/lib/test_hmm_uapi.h
@@ -37,6 +37,9 @@ struct hmm_dmirror_cmd {
#define HMM_DMIRROR_EXCLUSIVE _IOWR('H', 0x05, struct hmm_dmirror_cmd)
#define HMM_DMIRROR_CHECK_EXCLUSIVE _IOWR('H', 0x06, struct hmm_dmirror_cmd)
#define HMM_DMIRROR_RELEASE _IOWR('H', 0x07, struct hmm_dmirror_cmd)
+#define HMM_DMIRROR_FLAGS _IOWR('H', 0x08, struct hmm_dmirror_cmd)
+
+#define HMM_DMIRROR_FLAG_FAIL_ALLOC (1ULL << 0)
/*
* Values returned in hmm_dmirror_cmd.ptr for HMM_DMIRROR_SNAPSHOT.
diff --git a/lib/test_kho.c b/lib/test_kho.c
index fff018e5548d..47de56280795 100644
--- a/lib/test_kho.c
+++ b/lib/test_kho.c
@@ -33,44 +33,28 @@ struct kho_test_state {
unsigned int nr_folios;
struct folio **folios;
phys_addr_t *folios_info;
+ struct kho_vmalloc folios_info_phys;
+ int nr_folios_preserved;
struct folio *fdt;
__wsum csum;
};
static struct kho_test_state kho_test_state;
-static int kho_test_notifier(struct notifier_block *self, unsigned long cmd,
- void *v)
+static void kho_test_unpreserve_data(struct kho_test_state *state)
{
- struct kho_test_state *state = &kho_test_state;
- struct kho_serialization *ser = v;
- int err = 0;
-
- switch (cmd) {
- case KEXEC_KHO_ABORT:
- return NOTIFY_DONE;
- case KEXEC_KHO_FINALIZE:
- /* Handled below */
- break;
- default:
- return NOTIFY_BAD;
- }
-
- err |= kho_preserve_folio(state->fdt);
- err |= kho_add_subtree(ser, KHO_TEST_FDT, folio_address(state->fdt));
+ for (int i = 0; i < state->nr_folios_preserved; i++)
+ kho_unpreserve_folio(state->folios[i]);
- return err ? NOTIFY_BAD : NOTIFY_DONE;
+ kho_unpreserve_vmalloc(&state->folios_info_phys);
+ vfree(state->folios_info);
}
-static struct notifier_block kho_test_nb = {
- .notifier_call = kho_test_notifier,
-};
-
-static int kho_test_save_data(struct kho_test_state *state, void *fdt)
+static int kho_test_preserve_data(struct kho_test_state *state)
{
- phys_addr_t *folios_info __free(kvfree) = NULL;
struct kho_vmalloc folios_info_phys;
- int err = 0;
+ phys_addr_t *folios_info;
+ int err;
folios_info = vmalloc_array(state->nr_folios, sizeof(*folios_info));
if (!folios_info)
@@ -78,62 +62,98 @@ static int kho_test_save_data(struct kho_test_state *state, void *fdt)
err = kho_preserve_vmalloc(folios_info, &folios_info_phys);
if (err)
- return err;
+ goto err_free_info;
+
+ state->folios_info_phys = folios_info_phys;
+ state->folios_info = folios_info;
for (int i = 0; i < state->nr_folios; i++) {
struct folio *folio = state->folios[i];
unsigned int order = folio_order(folio);
folios_info[i] = virt_to_phys(folio_address(folio)) | order;
-
err = kho_preserve_folio(folio);
if (err)
- break;
+ goto err_unpreserve;
+ state->nr_folios_preserved++;
}
+ return 0;
+
+err_unpreserve:
+ /*
+ * kho_test_unpreserve_data frees folio_info, bail out immediately to
+ * avoid double free
+ */
+ kho_test_unpreserve_data(state);
+ return err;
+
+err_free_info:
+ vfree(folios_info);
+ return err;
+}
+
+static int kho_test_prepare_fdt(struct kho_test_state *state, ssize_t fdt_size)
+{
+ const char compatible[] = KHO_TEST_COMPAT;
+ unsigned int magic = KHO_TEST_MAGIC;
+ void *fdt = folio_address(state->fdt);
+ int err;
+
+ err = fdt_create(fdt, fdt_size);
+ err |= fdt_finish_reservemap(fdt);
+ err |= fdt_begin_node(fdt, "");
+ err |= fdt_property(fdt, "compatible", compatible, sizeof(compatible));
+ err |= fdt_property(fdt, "magic", &magic, sizeof(magic));
+
err |= fdt_begin_node(fdt, "data");
err |= fdt_property(fdt, "nr_folios", &state->nr_folios,
sizeof(state->nr_folios));
- err |= fdt_property(fdt, "folios_info", &folios_info_phys,
- sizeof(folios_info_phys));
+ err |= fdt_property(fdt, "folios_info", &state->folios_info_phys,
+ sizeof(state->folios_info_phys));
err |= fdt_property(fdt, "csum", &state->csum, sizeof(state->csum));
err |= fdt_end_node(fdt);
- if (!err)
- state->folios_info = no_free_ptr(folios_info);
+ err |= fdt_end_node(fdt);
+ err |= fdt_finish(fdt);
return err;
}
-static int kho_test_prepare_fdt(struct kho_test_state *state)
+static int kho_test_preserve(struct kho_test_state *state)
{
- const char compatible[] = KHO_TEST_COMPAT;
- unsigned int magic = KHO_TEST_MAGIC;
ssize_t fdt_size;
- int err = 0;
- void *fdt;
+ int err;
fdt_size = state->nr_folios * sizeof(phys_addr_t) + PAGE_SIZE;
state->fdt = folio_alloc(GFP_KERNEL, get_order(fdt_size));
if (!state->fdt)
return -ENOMEM;
- fdt = folio_address(state->fdt);
-
- err |= fdt_create(fdt, fdt_size);
- err |= fdt_finish_reservemap(fdt);
+ err = kho_preserve_folio(state->fdt);
+ if (err)
+ goto err_free_fdt;
- err |= fdt_begin_node(fdt, "");
- err |= fdt_property(fdt, "compatible", compatible, sizeof(compatible));
- err |= fdt_property(fdt, "magic", &magic, sizeof(magic));
- err |= kho_test_save_data(state, fdt);
- err |= fdt_end_node(fdt);
+ err = kho_test_preserve_data(state);
+ if (err)
+ goto err_unpreserve_fdt;
- err |= fdt_finish(fdt);
+ err = kho_test_prepare_fdt(state, fdt_size);
+ if (err)
+ goto err_unpreserve_data;
+ err = kho_add_subtree(KHO_TEST_FDT, folio_address(state->fdt));
if (err)
- folio_put(state->fdt);
+ goto err_unpreserve_data;
+
+ return 0;
+err_unpreserve_data:
+ kho_test_unpreserve_data(state);
+err_unpreserve_fdt:
+ kho_unpreserve_folio(state->fdt);
+err_free_fdt:
+ folio_put(state->fdt);
return err;
}
@@ -199,18 +219,12 @@ static int kho_test_save(void)
if (err)
goto err_free_folios;
- err = kho_test_prepare_fdt(state);
+ err = kho_test_preserve(state);
if (err)
goto err_free_folios;
- err = register_kho_notifier(&kho_test_nb);
- if (err)
- goto err_free_fdt;
-
return 0;
-err_free_fdt:
- folio_put(state->fdt);
err_free_folios:
kvfree(folios);
return err;
@@ -292,7 +306,6 @@ static int kho_test_restore(phys_addr_t fdt_phys)
if (err)
return err;
- pr_info("KHO restore succeeded\n");
return 0;
}
@@ -305,8 +318,15 @@ static int __init kho_test_init(void)
return 0;
err = kho_retrieve_subtree(KHO_TEST_FDT, &fdt_phys);
- if (!err)
- return kho_test_restore(fdt_phys);
+ if (!err) {
+ err = kho_test_restore(fdt_phys);
+ if (err)
+ pr_err("KHO restore failed\n");
+ else
+ pr_info("KHO restore succeeded\n");
+
+ return err;
+ }
if (err != -ENOENT) {
pr_warn("failed to retrieve %s FDT: %d\n", KHO_TEST_FDT, err);
@@ -329,7 +349,7 @@ static void kho_test_cleanup(void)
static void __exit kho_test_exit(void)
{
- unregister_kho_notifier(&kho_test_nb);
+ kho_remove_subtree(folio_address(kho_test_state.fdt));
kho_test_cleanup();
}
module_exit(kho_test_exit);
diff --git a/lib/test_vmalloc.c b/lib/test_vmalloc.c
index 2815658ccc37..6521c05c7816 100644
--- a/lib/test_vmalloc.c
+++ b/lib/test_vmalloc.c
@@ -54,6 +54,7 @@ __param(int, run_test_mask, 7,
"\t\tid: 256, name: kvfree_rcu_1_arg_vmalloc_test\n"
"\t\tid: 512, name: kvfree_rcu_2_arg_vmalloc_test\n"
"\t\tid: 1024, name: vm_map_ram_test\n"
+ "\t\tid: 2048, name: no_block_alloc_test\n"
/* Add a new test case description here. */
);
@@ -283,6 +284,30 @@ static int fix_size_alloc_test(void)
return 0;
}
+static int no_block_alloc_test(void)
+{
+ void *ptr;
+ int i;
+
+ for (i = 0; i < test_loop_count; i++) {
+ bool use_atomic = !!(get_random_u8() % 2);
+ gfp_t gfp = use_atomic ? GFP_ATOMIC : GFP_NOWAIT;
+ unsigned long size = (nr_pages > 0 ? nr_pages : 1) * PAGE_SIZE;
+
+ preempt_disable();
+ ptr = __vmalloc(size, gfp);
+ preempt_enable();
+
+ if (!ptr)
+ return -1;
+
+ *((__u8 *)ptr) = 0;
+ vfree(ptr);
+ }
+
+ return 0;
+}
+
static int
pcpu_alloc_test(void)
{
@@ -411,6 +436,7 @@ static struct test_case_desc test_case_array[] = {
{ "kvfree_rcu_1_arg_vmalloc_test", kvfree_rcu_1_arg_vmalloc_test, },
{ "kvfree_rcu_2_arg_vmalloc_test", kvfree_rcu_2_arg_vmalloc_test, },
{ "vm_map_ram_test", vm_map_ram_test, },
+ { "no_block_alloc_test", no_block_alloc_test, true },
/* Add a new test case here. */
};
@@ -474,7 +500,7 @@ static int test_func(void *private)
for (j = 0; j < test_repeat_count; j++) {
ret = test_case_array[index].test_func();
- if (!ret && !test_case_array[index].xfail)
+ if (!ret)
t->data[index].test_passed++;
else if (ret && test_case_array[index].xfail)
t->data[index].test_xfailed++;
diff --git a/lib/tests/Makefile b/lib/tests/Makefile
index f7460831cfdd..601dba4b7d96 100644
--- a/lib/tests/Makefile
+++ b/lib/tests/Makefile
@@ -4,6 +4,7 @@
# KUnit tests
CFLAGS_bitfield_kunit.o := $(DISABLE_STRUCTLEAK_PLUGIN)
+obj-$(CONFIG_BASE64_KUNIT) += base64_kunit.o
obj-$(CONFIG_BITFIELD_KUNIT) += bitfield_kunit.o
obj-$(CONFIG_BITS_TEST) += test_bits.o
obj-$(CONFIG_BLACKHOLE_DEV_KUNIT_TEST) += blackhole_dev_kunit.o
diff --git a/lib/tests/base64_kunit.c b/lib/tests/base64_kunit.c
new file mode 100644
index 000000000000..f7252070c359
--- /dev/null
+++ b/lib/tests/base64_kunit.c
@@ -0,0 +1,294 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * base64_kunit_test.c - KUnit tests for base64 encoding and decoding functions
+ *
+ * Copyright (c) 2025, Guan-Chun Wu <409411716@gms.tku.edu.tw>
+ */
+
+#include <kunit/test.h>
+#include <linux/base64.h>
+
+/* ---------- Benchmark helpers ---------- */
+static u64 bench_encode_ns(const u8 *data, int len, char *dst, int reps,
+ enum base64_variant variant)
+{
+ u64 t0, t1;
+
+ t0 = ktime_get_ns();
+ for (int i = 0; i < reps; i++)
+ base64_encode(data, len, dst, true, variant);
+ t1 = ktime_get_ns();
+
+ return div64_u64(t1 - t0, (u64)reps);
+}
+
+static u64 bench_decode_ns(const char *data, int len, u8 *dst, int reps,
+ enum base64_variant variant)
+{
+ u64 t0, t1;
+
+ t0 = ktime_get_ns();
+ for (int i = 0; i < reps; i++)
+ base64_decode(data, len, dst, true, variant);
+ t1 = ktime_get_ns();
+
+ return div64_u64(t1 - t0, (u64)reps);
+}
+
+static void run_perf_and_check(struct kunit *test, const char *label, int size,
+ enum base64_variant variant)
+{
+ const int reps = 1000;
+ size_t outlen = DIV_ROUND_UP(size, 3) * 4;
+ u8 *in = kmalloc(size, GFP_KERNEL);
+ char *enc = kmalloc(outlen, GFP_KERNEL);
+ u8 *decoded = kmalloc(size, GFP_KERNEL);
+
+ KUNIT_ASSERT_NOT_ERR_OR_NULL(test, in);
+ KUNIT_ASSERT_NOT_ERR_OR_NULL(test, enc);
+ KUNIT_ASSERT_NOT_ERR_OR_NULL(test, decoded);
+
+ get_random_bytes(in, size);
+ int enc_len = base64_encode(in, size, enc, true, variant);
+ int dec_len = base64_decode(enc, enc_len, decoded, true, variant);
+
+ /* correctness sanity check */
+ KUNIT_EXPECT_EQ(test, dec_len, size);
+ KUNIT_EXPECT_MEMEQ(test, decoded, in, size);
+
+ /* benchmark encode */
+
+ u64 t1 = bench_encode_ns(in, size, enc, reps, variant);
+
+ kunit_info(test, "[%s] encode run : %lluns", label, t1);
+
+ u64 t2 = bench_decode_ns(enc, enc_len, decoded, reps, variant);
+
+ kunit_info(test, "[%s] decode run : %lluns", label, t2);
+
+ kfree(in);
+ kfree(enc);
+ kfree(decoded);
+}
+
+static void base64_performance_tests(struct kunit *test)
+{
+ /* run on STD variant only */
+ run_perf_and_check(test, "64B", 64, BASE64_STD);
+ run_perf_and_check(test, "1KB", 1024, BASE64_STD);
+}
+
+/* ---------- Helpers for encode ---------- */
+static void expect_encode_ok(struct kunit *test, const u8 *src, int srclen,
+ const char *expected, bool padding,
+ enum base64_variant variant)
+{
+ char buf[128];
+ int encoded_len = base64_encode(src, srclen, buf, padding, variant);
+
+ buf[encoded_len] = '\0';
+
+ KUNIT_EXPECT_EQ(test, encoded_len, strlen(expected));
+ KUNIT_EXPECT_STREQ(test, buf, expected);
+}
+
+/* ---------- Helpers for decode ---------- */
+static void expect_decode_ok(struct kunit *test, const char *src,
+ const u8 *expected, int expected_len, bool padding,
+ enum base64_variant variant)
+{
+ u8 buf[128];
+ int decoded_len = base64_decode(src, strlen(src), buf, padding, variant);
+
+ KUNIT_EXPECT_EQ(test, decoded_len, expected_len);
+ KUNIT_EXPECT_MEMEQ(test, buf, expected, expected_len);
+}
+
+static void expect_decode_err(struct kunit *test, const char *src,
+ int srclen, bool padding,
+ enum base64_variant variant)
+{
+ u8 buf[64];
+ int decoded_len = base64_decode(src, srclen, buf, padding, variant);
+
+ KUNIT_EXPECT_EQ(test, decoded_len, -1);
+}
+
+/* ---------- Encode Tests ---------- */
+static void base64_std_encode_tests(struct kunit *test)
+{
+ /* With padding */
+ expect_encode_ok(test, (const u8 *)"", 0, "", true, BASE64_STD);
+ expect_encode_ok(test, (const u8 *)"f", 1, "Zg==", true, BASE64_STD);
+ expect_encode_ok(test, (const u8 *)"fo", 2, "Zm8=", true, BASE64_STD);
+ expect_encode_ok(test, (const u8 *)"foo", 3, "Zm9v", true, BASE64_STD);
+ expect_encode_ok(test, (const u8 *)"foob", 4, "Zm9vYg==", true, BASE64_STD);
+ expect_encode_ok(test, (const u8 *)"fooba", 5, "Zm9vYmE=", true, BASE64_STD);
+ expect_encode_ok(test, (const u8 *)"foobar", 6, "Zm9vYmFy", true, BASE64_STD);
+
+ /* Extra cases with padding */
+ expect_encode_ok(test, (const u8 *)"Hello, world!", 13, "SGVsbG8sIHdvcmxkIQ==",
+ true, BASE64_STD);
+ expect_encode_ok(test, (const u8 *)"ABCDEFGHIJKLMNOPQRSTUVWXYZ", 26,
+ "QUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVo=", true, BASE64_STD);
+ expect_encode_ok(test, (const u8 *)"abcdefghijklmnopqrstuvwxyz", 26,
+ "YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXo=", true, BASE64_STD);
+ expect_encode_ok(test, (const u8 *)"0123456789+/", 12, "MDEyMzQ1Njc4OSsv",
+ true, BASE64_STD);
+
+ /* Without padding */
+ expect_encode_ok(test, (const u8 *)"", 0, "", false, BASE64_STD);
+ expect_encode_ok(test, (const u8 *)"f", 1, "Zg", false, BASE64_STD);
+ expect_encode_ok(test, (const u8 *)"fo", 2, "Zm8", false, BASE64_STD);
+ expect_encode_ok(test, (const u8 *)"foo", 3, "Zm9v", false, BASE64_STD);
+ expect_encode_ok(test, (const u8 *)"foob", 4, "Zm9vYg", false, BASE64_STD);
+ expect_encode_ok(test, (const u8 *)"fooba", 5, "Zm9vYmE", false, BASE64_STD);
+ expect_encode_ok(test, (const u8 *)"foobar", 6, "Zm9vYmFy", false, BASE64_STD);
+
+ /* Extra cases without padding */
+ expect_encode_ok(test, (const u8 *)"Hello, world!", 13, "SGVsbG8sIHdvcmxkIQ",
+ false, BASE64_STD);
+ expect_encode_ok(test, (const u8 *)"ABCDEFGHIJKLMNOPQRSTUVWXYZ", 26,
+ "QUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVo", false, BASE64_STD);
+ expect_encode_ok(test, (const u8 *)"abcdefghijklmnopqrstuvwxyz", 26,
+ "YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXo", false, BASE64_STD);
+ expect_encode_ok(test, (const u8 *)"0123456789+/", 12, "MDEyMzQ1Njc4OSsv",
+ false, BASE64_STD);
+}
+
+/* ---------- Decode Tests ---------- */
+static void base64_std_decode_tests(struct kunit *test)
+{
+ /* -------- With padding --------*/
+ expect_decode_ok(test, "", (const u8 *)"", 0, true, BASE64_STD);
+ expect_decode_ok(test, "Zg==", (const u8 *)"f", 1, true, BASE64_STD);
+ expect_decode_ok(test, "Zm8=", (const u8 *)"fo", 2, true, BASE64_STD);
+ expect_decode_ok(test, "Zm9v", (const u8 *)"foo", 3, true, BASE64_STD);
+ expect_decode_ok(test, "Zm9vYg==", (const u8 *)"foob", 4, true, BASE64_STD);
+ expect_decode_ok(test, "Zm9vYmE=", (const u8 *)"fooba", 5, true, BASE64_STD);
+ expect_decode_ok(test, "Zm9vYmFy", (const u8 *)"foobar", 6, true, BASE64_STD);
+ expect_decode_ok(test, "SGVsbG8sIHdvcmxkIQ==", (const u8 *)"Hello, world!", 13,
+ true, BASE64_STD);
+ expect_decode_ok(test, "QUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVo=",
+ (const u8 *)"ABCDEFGHIJKLMNOPQRSTUVWXYZ", 26, true, BASE64_STD);
+ expect_decode_ok(test, "YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXo=",
+ (const u8 *)"abcdefghijklmnopqrstuvwxyz", 26, true, BASE64_STD);
+
+ /* Error cases */
+ expect_decode_err(test, "Zg=!", 4, true, BASE64_STD);
+ expect_decode_err(test, "Zm$=", 4, true, BASE64_STD);
+ expect_decode_err(test, "Z===", 4, true, BASE64_STD);
+ expect_decode_err(test, "Zg", 2, true, BASE64_STD);
+ expect_decode_err(test, "Zm9v====", 8, true, BASE64_STD);
+ expect_decode_err(test, "Zm==A", 5, true, BASE64_STD);
+
+ {
+ char with_nul[4] = { 'Z', 'g', '\0', '=' };
+
+ expect_decode_err(test, with_nul, 4, true, BASE64_STD);
+ }
+
+ /* -------- Without padding --------*/
+ expect_decode_ok(test, "", (const u8 *)"", 0, false, BASE64_STD);
+ expect_decode_ok(test, "Zg", (const u8 *)"f", 1, false, BASE64_STD);
+ expect_decode_ok(test, "Zm8", (const u8 *)"fo", 2, false, BASE64_STD);
+ expect_decode_ok(test, "Zm9v", (const u8 *)"foo", 3, false, BASE64_STD);
+ expect_decode_ok(test, "Zm9vYg", (const u8 *)"foob", 4, false, BASE64_STD);
+ expect_decode_ok(test, "Zm9vYmE", (const u8 *)"fooba", 5, false, BASE64_STD);
+ expect_decode_ok(test, "Zm9vYmFy", (const u8 *)"foobar", 6, false, BASE64_STD);
+ expect_decode_ok(test, "TWFu", (const u8 *)"Man", 3, false, BASE64_STD);
+ expect_decode_ok(test, "SGVsbG8sIHdvcmxkIQ", (const u8 *)"Hello, world!", 13,
+ false, BASE64_STD);
+ expect_decode_ok(test, "QUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVo",
+ (const u8 *)"ABCDEFGHIJKLMNOPQRSTUVWXYZ", 26, false, BASE64_STD);
+ expect_decode_ok(test, "YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXo",
+ (const u8 *)"abcdefghijklmnopqrstuvwxyz", 26, false, BASE64_STD);
+ expect_decode_ok(test, "MDEyMzQ1Njc4OSsv", (const u8 *)"0123456789+/", 12,
+ false, BASE64_STD);
+
+ /* Error cases */
+ expect_decode_err(test, "Zg=!", 4, false, BASE64_STD);
+ expect_decode_err(test, "Zm$=", 4, false, BASE64_STD);
+ expect_decode_err(test, "Z===", 4, false, BASE64_STD);
+ expect_decode_err(test, "Zg=", 3, false, BASE64_STD);
+ expect_decode_err(test, "Zm9v====", 8, false, BASE64_STD);
+ expect_decode_err(test, "Zm==v", 4, false, BASE64_STD);
+
+ {
+ char with_nul[4] = { 'Z', 'g', '\0', '=' };
+
+ expect_decode_err(test, with_nul, 4, false, BASE64_STD);
+ }
+}
+
+/* ---------- Variant tests (URLSAFE / IMAP) ---------- */
+static void base64_variant_tests(struct kunit *test)
+{
+ const u8 sample1[] = { 0x00, 0xfb, 0xff, 0x7f, 0x80 };
+ char std_buf[128], url_buf[128], imap_buf[128];
+ u8 back[128];
+ int n_std, n_url, n_imap, m;
+ int i;
+
+ n_std = base64_encode(sample1, sizeof(sample1), std_buf, false, BASE64_STD);
+ n_url = base64_encode(sample1, sizeof(sample1), url_buf, false, BASE64_URLSAFE);
+ std_buf[n_std] = '\0';
+ url_buf[n_url] = '\0';
+
+ for (i = 0; i < n_std; i++) {
+ if (std_buf[i] == '+')
+ std_buf[i] = '-';
+ else if (std_buf[i] == '/')
+ std_buf[i] = '_';
+ }
+ KUNIT_EXPECT_STREQ(test, std_buf, url_buf);
+
+ m = base64_decode(url_buf, n_url, back, false, BASE64_URLSAFE);
+ KUNIT_EXPECT_EQ(test, m, (int)sizeof(sample1));
+ KUNIT_EXPECT_MEMEQ(test, back, sample1, sizeof(sample1));
+
+ n_std = base64_encode(sample1, sizeof(sample1), std_buf, false, BASE64_STD);
+ n_imap = base64_encode(sample1, sizeof(sample1), imap_buf, false, BASE64_IMAP);
+ std_buf[n_std] = '\0';
+ imap_buf[n_imap] = '\0';
+
+ for (i = 0; i < n_std; i++)
+ if (std_buf[i] == '/')
+ std_buf[i] = ',';
+ KUNIT_EXPECT_STREQ(test, std_buf, imap_buf);
+
+ m = base64_decode(imap_buf, n_imap, back, false, BASE64_IMAP);
+ KUNIT_EXPECT_EQ(test, m, (int)sizeof(sample1));
+ KUNIT_EXPECT_MEMEQ(test, back, sample1, sizeof(sample1));
+
+ {
+ const char *bad = "Zg==";
+ u8 tmp[8];
+
+ m = base64_decode(bad, strlen(bad), tmp, false, BASE64_URLSAFE);
+ KUNIT_EXPECT_EQ(test, m, -1);
+
+ m = base64_decode(bad, strlen(bad), tmp, false, BASE64_IMAP);
+ KUNIT_EXPECT_EQ(test, m, -1);
+ }
+}
+
+/* ---------- Test registration ---------- */
+static struct kunit_case base64_test_cases[] = {
+ KUNIT_CASE(base64_performance_tests),
+ KUNIT_CASE(base64_std_encode_tests),
+ KUNIT_CASE(base64_std_decode_tests),
+ KUNIT_CASE(base64_variant_tests),
+ {}
+};
+
+static struct kunit_suite base64_test_suite = {
+ .name = "base64",
+ .test_cases = base64_test_cases,
+};
+
+kunit_test_suite(base64_test_suite);
+
+MODULE_AUTHOR("Guan-Chun Wu <409411716@gms.tku.edu.tw>");
+MODULE_DESCRIPTION("KUnit tests for Base64 encoding/decoding, including performance checks");
+MODULE_LICENSE("GPL");
diff --git a/lib/tests/string_kunit.c b/lib/tests/string_kunit.c
index 0ed7448a26d3..f9a8e557ba77 100644
--- a/lib/tests/string_kunit.c
+++ b/lib/tests/string_kunit.c
@@ -602,6 +602,18 @@ static void string_test_memtostr(struct kunit *test)
KUNIT_EXPECT_EQ(test, dest[7], '\0');
}
+static void string_test_strends(struct kunit *test)
+{
+ KUNIT_EXPECT_TRUE(test, strends("foo-bar", "bar"));
+ KUNIT_EXPECT_TRUE(test, strends("foo-bar", "-bar"));
+ KUNIT_EXPECT_TRUE(test, strends("foobar", "foobar"));
+ KUNIT_EXPECT_TRUE(test, strends("foobar", ""));
+ KUNIT_EXPECT_FALSE(test, strends("bar", "foobar"));
+ KUNIT_EXPECT_FALSE(test, strends("", "foo"));
+ KUNIT_EXPECT_FALSE(test, strends("foobar", "ba"));
+ KUNIT_EXPECT_TRUE(test, strends("", ""));
+}
+
static struct kunit_case string_test_cases[] = {
KUNIT_CASE(string_test_memset16),
KUNIT_CASE(string_test_memset32),
@@ -623,6 +635,7 @@ static struct kunit_case string_test_cases[] = {
KUNIT_CASE(string_test_strlcat),
KUNIT_CASE(string_test_strtomem),
KUNIT_CASE(string_test_memtostr),
+ KUNIT_CASE(string_test_strends),
{}
};
diff --git a/lib/tests/test_fprobe.c b/lib/tests/test_fprobe.c
index cf92111b5c79..108c7aa33cb4 100644
--- a/lib/tests/test_fprobe.c
+++ b/lib/tests/test_fprobe.c
@@ -12,7 +12,8 @@
static struct kunit *current_test;
-static u32 rand1, entry_val, exit_val;
+static u32 rand1, entry_only_val, entry_val, exit_val;
+static u32 entry_only_count, entry_count, exit_count;
/* Use indirect calls to avoid inlining the target functions */
static u32 (*target)(u32 value);
@@ -190,6 +191,101 @@ static void test_fprobe_skip(struct kunit *test)
KUNIT_EXPECT_EQ(test, 0, unregister_fprobe(&fp));
}
+/* Handler for fprobe entry only case */
+static notrace int entry_only_handler(struct fprobe *fp, unsigned long ip,
+ unsigned long ret_ip,
+ struct ftrace_regs *fregs, void *data)
+{
+ KUNIT_EXPECT_FALSE(current_test, preemptible());
+ KUNIT_EXPECT_EQ(current_test, ip, target_ip);
+
+ entry_only_count++;
+ entry_only_val = (rand1 / div_factor);
+
+ return 0;
+}
+
+static notrace int fprobe_entry_multi_handler(struct fprobe *fp, unsigned long ip,
+ unsigned long ret_ip,
+ struct ftrace_regs *fregs,
+ void *data)
+{
+ KUNIT_EXPECT_FALSE(current_test, preemptible());
+ KUNIT_EXPECT_EQ(current_test, ip, target_ip);
+
+ entry_count++;
+ entry_val = (rand1 / div_factor);
+
+ return 0;
+}
+
+static notrace void fprobe_exit_multi_handler(struct fprobe *fp, unsigned long ip,
+ unsigned long ret_ip,
+ struct ftrace_regs *fregs,
+ void *data)
+{
+ unsigned long ret = ftrace_regs_get_return_value(fregs);
+
+ KUNIT_EXPECT_FALSE(current_test, preemptible());
+ KUNIT_EXPECT_EQ(current_test, ip, target_ip);
+ KUNIT_EXPECT_EQ(current_test, ret, (rand1 / div_factor));
+
+ exit_count++;
+ exit_val = ret;
+}
+
+static void check_fprobe_multi(struct kunit *test)
+{
+ entry_only_count = entry_count = exit_count = 0;
+ entry_only_val = entry_val = exit_val = 0;
+
+ target(rand1);
+
+ /* Verify all handlers were called */
+ KUNIT_EXPECT_EQ(test, 1, entry_only_count);
+ KUNIT_EXPECT_EQ(test, 1, entry_count);
+ KUNIT_EXPECT_EQ(test, 1, exit_count);
+
+ /* Verify values are correct */
+ KUNIT_EXPECT_EQ(test, (rand1 / div_factor), entry_only_val);
+ KUNIT_EXPECT_EQ(test, (rand1 / div_factor), entry_val);
+ KUNIT_EXPECT_EQ(test, (rand1 / div_factor), exit_val);
+}
+
+/* Test multiple fprobes hooking the same target function */
+static void test_fprobe_multi(struct kunit *test)
+{
+ struct fprobe fp1 = {
+ .entry_handler = fprobe_entry_multi_handler,
+ .exit_handler = fprobe_exit_multi_handler,
+ };
+ struct fprobe fp2 = {
+ .entry_handler = entry_only_handler,
+ };
+
+ current_test = test;
+
+ /* Test Case 1: Register in order 1 -> 2 */
+ KUNIT_EXPECT_EQ(test, 0, register_fprobe(&fp1, "fprobe_selftest_target", NULL));
+ KUNIT_EXPECT_EQ(test, 0, register_fprobe(&fp2, "fprobe_selftest_target", NULL));
+
+ check_fprobe_multi(test);
+
+ /* Unregister all */
+ KUNIT_EXPECT_EQ(test, 0, unregister_fprobe(&fp1));
+ KUNIT_EXPECT_EQ(test, 0, unregister_fprobe(&fp2));
+
+ /* Test Case 2: Register in order 2 -> 1 */
+ KUNIT_EXPECT_EQ(test, 0, register_fprobe(&fp2, "fprobe_selftest_target", NULL));
+ KUNIT_EXPECT_EQ(test, 0, register_fprobe(&fp1, "fprobe_selftest_target", NULL));
+
+ check_fprobe_multi(test);
+
+ /* Unregister all */
+ KUNIT_EXPECT_EQ(test, 0, unregister_fprobe(&fp1));
+ KUNIT_EXPECT_EQ(test, 0, unregister_fprobe(&fp2));
+}
+
static unsigned long get_ftrace_location(void *func)
{
unsigned long size, addr = (unsigned long)func;
@@ -217,6 +313,7 @@ static struct kunit_case fprobe_testcases[] = {
KUNIT_CASE(test_fprobe_syms),
KUNIT_CASE(test_fprobe_data),
KUNIT_CASE(test_fprobe_skip),
+ KUNIT_CASE(test_fprobe_multi),
{}
};
diff --git a/lib/usercopy.c b/lib/usercopy.c
index 7b17b83c8042..b00a3a957de6 100644
--- a/lib/usercopy.c
+++ b/lib/usercopy.c
@@ -12,7 +12,7 @@
/* out-of-line parts */
-#if !defined(INLINE_COPY_FROM_USER) || defined(CONFIG_RUST)
+#if !defined(INLINE_COPY_FROM_USER)
unsigned long _copy_from_user(void *to, const void __user *from, unsigned long n)
{
return _inline_copy_from_user(to, from, n);
@@ -20,7 +20,7 @@ unsigned long _copy_from_user(void *to, const void __user *from, unsigned long n
EXPORT_SYMBOL(_copy_from_user);
#endif
-#if !defined(INLINE_COPY_TO_USER) || defined(CONFIG_RUST)
+#if !defined(INLINE_COPY_TO_USER)
unsigned long _copy_to_user(void __user *to, const void *from, unsigned long n)
{
return _inline_copy_to_user(to, from, n);
diff --git a/lib/xxhash.c b/lib/xxhash.c
index cf629766f376..4125b3e3cf7f 100644
--- a/lib/xxhash.c
+++ b/lib/xxhash.c
@@ -73,21 +73,6 @@ static const uint64_t PRIME64_3 = 1609587929392839161ULL;
static const uint64_t PRIME64_4 = 9650029242287828579ULL;
static const uint64_t PRIME64_5 = 2870177450012600261ULL;
-/*-**************************
- * Utils
- ***************************/
-void xxh32_copy_state(struct xxh32_state *dst, const struct xxh32_state *src)
-{
- memcpy(dst, src, sizeof(*dst));
-}
-EXPORT_SYMBOL(xxh32_copy_state);
-
-void xxh64_copy_state(struct xxh64_state *dst, const struct xxh64_state *src)
-{
- memcpy(dst, src, sizeof(*dst));
-}
-EXPORT_SYMBOL(xxh64_copy_state);
-
/*-***************************
* Simple Hash Functions
****************************/
@@ -239,20 +224,6 @@ EXPORT_SYMBOL(xxh64);
/*-**************************************************
* Advanced Hash Functions
***************************************************/
-void xxh32_reset(struct xxh32_state *statePtr, const uint32_t seed)
-{
- /* use a local state for memcpy() to avoid strict-aliasing warnings */
- struct xxh32_state state;
-
- memset(&state, 0, sizeof(state));
- state.v1 = seed + PRIME32_1 + PRIME32_2;
- state.v2 = seed + PRIME32_2;
- state.v3 = seed + 0;
- state.v4 = seed - PRIME32_1;
- memcpy(statePtr, &state, sizeof(state));
-}
-EXPORT_SYMBOL(xxh32_reset);
-
void xxh64_reset(struct xxh64_state *statePtr, const uint64_t seed)
{
/* use a local state for memcpy() to avoid strict-aliasing warnings */
diff --git a/lib/xz/xz_dec_bcj.c b/lib/xz/xz_dec_bcj.c
index 8237db17eee3..610d58d947ab 100644
--- a/lib/xz/xz_dec_bcj.c
+++ b/lib/xz/xz_dec_bcj.c
@@ -20,7 +20,6 @@ struct xz_dec_bcj {
enum {
BCJ_X86 = 4, /* x86 or x86-64 */
BCJ_POWERPC = 5, /* Big endian only */
- BCJ_IA64 = 6, /* Big or little endian */
BCJ_ARM = 7, /* Little endian only */
BCJ_ARMTHUMB = 8, /* Little endian only */
BCJ_SPARC = 9, /* Big or little endian */
@@ -180,92 +179,6 @@ static size_t bcj_powerpc(struct xz_dec_bcj *s, uint8_t *buf, size_t size)
}
#endif
-#ifdef XZ_DEC_IA64
-static size_t bcj_ia64(struct xz_dec_bcj *s, uint8_t *buf, size_t size)
-{
- static const uint8_t branch_table[32] = {
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 4, 4, 6, 6, 0, 0, 7, 7,
- 4, 4, 0, 0, 4, 4, 0, 0
- };
-
- /*
- * The local variables take a little bit stack space, but it's less
- * than what LZMA2 decoder takes, so it doesn't make sense to reduce
- * stack usage here without doing that for the LZMA2 decoder too.
- */
-
- /* Loop counters */
- size_t i;
- size_t j;
-
- /* Instruction slot (0, 1, or 2) in the 128-bit instruction word */
- uint32_t slot;
-
- /* Bitwise offset of the instruction indicated by slot */
- uint32_t bit_pos;
-
- /* bit_pos split into byte and bit parts */
- uint32_t byte_pos;
- uint32_t bit_res;
-
- /* Address part of an instruction */
- uint32_t addr;
-
- /* Mask used to detect which instructions to convert */
- uint32_t mask;
-
- /* 41-bit instruction stored somewhere in the lowest 48 bits */
- uint64_t instr;
-
- /* Instruction normalized with bit_res for easier manipulation */
- uint64_t norm;
-
- size &= ~(size_t)15;
-
- for (i = 0; i < size; i += 16) {
- mask = branch_table[buf[i] & 0x1F];
- for (slot = 0, bit_pos = 5; slot < 3; ++slot, bit_pos += 41) {
- if (((mask >> slot) & 1) == 0)
- continue;
-
- byte_pos = bit_pos >> 3;
- bit_res = bit_pos & 7;
- instr = 0;
- for (j = 0; j < 6; ++j)
- instr |= (uint64_t)(buf[i + j + byte_pos])
- << (8 * j);
-
- norm = instr >> bit_res;
-
- if (((norm >> 37) & 0x0F) == 0x05
- && ((norm >> 9) & 0x07) == 0) {
- addr = (norm >> 13) & 0x0FFFFF;
- addr |= ((uint32_t)(norm >> 36) & 1) << 20;
- addr <<= 4;
- addr -= s->pos + (uint32_t)i;
- addr >>= 4;
-
- norm &= ~((uint64_t)0x8FFFFF << 13);
- norm |= (uint64_t)(addr & 0x0FFFFF) << 13;
- norm |= (uint64_t)(addr & 0x100000)
- << (36 - 20);
-
- instr &= (1 << bit_res) - 1;
- instr |= norm << bit_res;
-
- for (j = 0; j < 6; j++)
- buf[i + j + byte_pos]
- = (uint8_t)(instr >> (8 * j));
- }
- }
- }
-
- return i;
-}
-#endif
-
#ifdef XZ_DEC_ARM
static size_t bcj_arm(struct xz_dec_bcj *s, uint8_t *buf, size_t size)
{
@@ -509,11 +422,6 @@ static void bcj_apply(struct xz_dec_bcj *s,
filtered = bcj_powerpc(s, buf, size);
break;
#endif
-#ifdef XZ_DEC_IA64
- case BCJ_IA64:
- filtered = bcj_ia64(s, buf, size);
- break;
-#endif
#ifdef XZ_DEC_ARM
case BCJ_ARM:
filtered = bcj_arm(s, buf, size);
@@ -699,9 +607,6 @@ enum xz_ret xz_dec_bcj_reset(struct xz_dec_bcj *s, uint8_t id)
#ifdef XZ_DEC_POWERPC
case BCJ_POWERPC:
#endif
-#ifdef XZ_DEC_IA64
- case BCJ_IA64:
-#endif
#ifdef XZ_DEC_ARM
case BCJ_ARM:
#endif
diff --git a/lib/xz/xz_private.h b/lib/xz/xz_private.h
index 8409784b1639..6775078f3cce 100644
--- a/lib/xz/xz_private.h
+++ b/lib/xz/xz_private.h
@@ -24,9 +24,6 @@
# ifdef CONFIG_XZ_DEC_POWERPC
# define XZ_DEC_POWERPC
# endif
-# ifdef CONFIG_XZ_DEC_IA64
-# define XZ_DEC_IA64
-# endif
# ifdef CONFIG_XZ_DEC_ARM
# define XZ_DEC_ARM
# endif
@@ -103,7 +100,6 @@
*/
#ifndef XZ_DEC_BCJ
# if defined(XZ_DEC_X86) || defined(XZ_DEC_POWERPC) \
- || defined(XZ_DEC_IA64) \
|| defined(XZ_DEC_ARM) || defined(XZ_DEC_ARMTHUMB) \
|| defined(XZ_DEC_SPARC) || defined(XZ_DEC_ARM64) \
|| defined(XZ_DEC_RISCV)