From b8ea2cb5120a92fe63053a2896be42abbb919a76 Mon Sep 17 00:00:00 2001 From: Zachary Amsden Date: Wed, 9 Nov 2005 13:23:01 +0100 Subject: [PATCH 01/25] [BLOCK] elevator init fixes I got a panic in the elevator code, backtrace : Unable to handle kernel NULL pointer dereference at virtual address 00000060 .. EIP is at elevator_put+0x0/0x30 (null elevator_type passed) .. elevator_init+0x38 blk_init_queu_node+0xc9 floppy_init+0xdb do_initcalls+0x23 init+0x10a init+0x0 Clearly if the kmalloc here fails, e->elevator_type is not yet set; this appears to be the correct fix, but I think I probably hit the second case due to a race condition. Someone more familiar with the elevator code should look at this more closely until I can determine if I can reproduce. Signed-off-by: Zachary Amsden Signed-off-by: Andrew Morton Signed-off-by: Jens Axboe --- block/elevator.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/block/elevator.c b/block/elevator.c index d4a49a3df829..23cfbe528be1 100644 --- a/block/elevator.c +++ b/block/elevator.c @@ -190,14 +190,14 @@ int elevator_init(request_queue_t *q, char *name) eq = kmalloc(sizeof(struct elevator_queue), GFP_KERNEL); if (!eq) { - elevator_put(e->elevator_type); + elevator_put(e); return -ENOMEM; } ret = elevator_attach(q, e, eq); if (ret) { kfree(eq); - elevator_put(e->elevator_type); + elevator_put(e); } return ret; From cff3ba2204a0797b05150a4b2b7f40a55023d952 Mon Sep 17 00:00:00 2001 From: Zachary Amsden Date: Wed, 9 Nov 2005 13:24:20 +0100 Subject: [PATCH 02/25] [BLOCK] elevator init fixes #2 In addition to the first patch, which is probably goodness, I found the cause of my panic - applying this patch fixes it and now I am booting. If the chosen_elevator[] is not found, fall back to noop. Signed-off-by: Andrew Morton Signed-off-by: Jens Axboe --- block/elevator.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/block/elevator.c b/block/elevator.c index 23cfbe528be1..e58928e809ea 100644 --- a/block/elevator.c +++ b/block/elevator.c @@ -155,9 +155,10 @@ static void elevator_setup_default(void) /* * If the given scheduler is not available, fall back to no-op. */ - if (!(e = elevator_find(chosen_elevator))) + if ((e = elevator_find(chosen_elevator))) + elevator_put(e); + else strcpy(chosen_elevator, "noop"); - elevator_put(e); } static int __init elevator_setup(char *str) From 47a004103d663bbba8c7c433a710a86f44351cf3 Mon Sep 17 00:00:00 2001 From: Jens Axboe Date: Wed, 9 Nov 2005 13:38:47 +0100 Subject: [PATCH 03/25] [BLOCK] Document the READ/WRITE splitup of the disk stats Use the symbolic name where appropriate and add a comment to the disk_stats structure. Signed-off-by: Jens Axboe --- block/genhd.c | 14 ++++++++------ include/linux/genhd.h | 4 ++-- 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/block/genhd.c b/block/genhd.c index 54aec4a1ae13..f04609d553b8 100644 --- a/block/genhd.c +++ b/block/genhd.c @@ -391,12 +391,14 @@ static ssize_t disk_stats_read(struct gendisk * disk, char *page) "%8u %8u %8llu %8u " "%8u %8u %8u" "\n", - disk_stat_read(disk, ios[0]), disk_stat_read(disk, merges[0]), - (unsigned long long)disk_stat_read(disk, sectors[0]), - jiffies_to_msecs(disk_stat_read(disk, ticks[0])), - disk_stat_read(disk, ios[1]), disk_stat_read(disk, merges[1]), - (unsigned long long)disk_stat_read(disk, sectors[1]), - jiffies_to_msecs(disk_stat_read(disk, ticks[1])), + disk_stat_read(disk, ios[READ]), + disk_stat_read(disk, merges[READ]), + (unsigned long long)disk_stat_read(disk, sectors[READ]), + jiffies_to_msecs(disk_stat_read(disk, ticks[READ])), + disk_stat_read(disk, ios[WRITE]), + disk_stat_read(disk, merges[WRITE]), + (unsigned long long)disk_stat_read(disk, sectors[WRITE]), + jiffies_to_msecs(disk_stat_read(disk, ticks[WRITE])), disk->in_flight, jiffies_to_msecs(disk_stat_read(disk, io_ticks)), jiffies_to_msecs(disk_stat_read(disk, time_in_queue))); diff --git a/include/linux/genhd.h b/include/linux/genhd.h index 8eeaa53a68c9..eef5ccdcd731 100644 --- a/include/linux/genhd.h +++ b/include/linux/genhd.h @@ -78,7 +78,7 @@ struct hd_struct { sector_t start_sect; sector_t nr_sects; struct kobject kobj; - unsigned ios[2], sectors[2]; + unsigned ios[2], sectors[2]; /* READs and WRITEs */ int policy, partno; }; @@ -89,7 +89,7 @@ struct hd_struct { #define GENHD_FL_SUPPRESS_PARTITION_INFO 32 struct disk_stats { - unsigned sectors[2]; + unsigned sectors[2]; /* READs and WRITEs */ unsigned ios[2]; unsigned merges[2]; unsigned ticks[2]; From 407df2aa29a33fe16f6ee4bac8cdfa414783b9f1 Mon Sep 17 00:00:00 2001 From: Tejun Heo Date: Thu, 10 Nov 2005 08:48:21 +0100 Subject: [PATCH 04/25] [BLOCK] elevator: run queue in elevator_switch elevator_dispatch needs to run queue after forced dispatching; otherwise, the queue might stall. Signed-off-by: Tejun Heo Signed-off-by: Jens Axboe --- block/elevator.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/block/elevator.c b/block/elevator.c index e58928e809ea..a475b1a19f67 100644 --- a/block/elevator.c +++ b/block/elevator.c @@ -696,6 +696,8 @@ static void elevator_switch(request_queue_t *q, struct elevator_type *new_e) ; while (q->rq.elvpriv) { + blk_remove_plug(q); + q->request_fn(q); spin_unlock_irq(q->queue_lock); msleep(10); spin_lock_irq(q->queue_lock); From 1b5ed5e1f1315e37380e55102f58bcae3344d2a7 Mon Sep 17 00:00:00 2001 From: Tejun Heo Date: Thu, 10 Nov 2005 08:49:19 +0100 Subject: [PATCH 05/25] [BLOCK] cfq-iosched: cfq forced dispatching fix cfq forced dispatching might not return all requests on the queue. This bug can hang elevator switchinig and corrupt request ordering during flush sequence. Signed-off-by: Tejun Heo Signed-off-by: Jens Axboe --- block/cfq-iosched.c | 54 +++++++++++++++++++++++++++++++++++++-------- 1 file changed, 45 insertions(+), 9 deletions(-) diff --git a/block/cfq-iosched.c b/block/cfq-iosched.c index ecacca9c877e..452538644bce 100644 --- a/block/cfq-iosched.c +++ b/block/cfq-iosched.c @@ -999,7 +999,7 @@ cfq_prio_to_maxrq(struct cfq_data *cfqd, struct cfq_queue *cfqq) /* * get next queue for service */ -static struct cfq_queue *cfq_select_queue(struct cfq_data *cfqd, int force) +static struct cfq_queue *cfq_select_queue(struct cfq_data *cfqd) { unsigned long now = jiffies; struct cfq_queue *cfqq; @@ -1023,7 +1023,7 @@ static struct cfq_queue *cfq_select_queue(struct cfq_data *cfqd, int force) */ if (!RB_EMPTY(&cfqq->sort_list)) goto keep_queue; - else if (!force && cfq_cfqq_class_sync(cfqq) && + else if (cfq_cfqq_class_sync(cfqq) && time_before(now, cfqq->slice_end)) { if (cfq_arm_slice_timer(cfqd, cfqq)) return NULL; @@ -1091,6 +1091,42 @@ __cfq_dispatch_requests(struct cfq_data *cfqd, struct cfq_queue *cfqq, return dispatched; } +static int +cfq_forced_dispatch_cfqqs(struct list_head *list) +{ + int dispatched = 0; + struct cfq_queue *cfqq, *next; + struct cfq_rq *crq; + + list_for_each_entry_safe(cfqq, next, list, cfq_list) { + while ((crq = cfqq->next_crq)) { + cfq_dispatch_insert(cfqq->cfqd->queue, crq); + dispatched++; + } + BUG_ON(!list_empty(&cfqq->fifo)); + } + return dispatched; +} + +static int +cfq_forced_dispatch(struct cfq_data *cfqd) +{ + int i, dispatched = 0; + + for (i = 0; i < CFQ_PRIO_LISTS; i++) + dispatched += cfq_forced_dispatch_cfqqs(&cfqd->rr_list[i]); + + dispatched += cfq_forced_dispatch_cfqqs(&cfqd->busy_rr); + dispatched += cfq_forced_dispatch_cfqqs(&cfqd->cur_rr); + dispatched += cfq_forced_dispatch_cfqqs(&cfqd->idle_rr); + + cfq_slice_expired(cfqd, 0); + + BUG_ON(cfqd->busy_queues); + + return dispatched; +} + static int cfq_dispatch_requests(request_queue_t *q, int force) { @@ -1100,7 +1136,10 @@ cfq_dispatch_requests(request_queue_t *q, int force) if (!cfqd->busy_queues) return 0; - cfqq = cfq_select_queue(cfqd, force); + if (unlikely(force)) + return cfq_forced_dispatch(cfqd); + + cfqq = cfq_select_queue(cfqd); if (cfqq) { int max_dispatch; @@ -1115,12 +1154,9 @@ cfq_dispatch_requests(request_queue_t *q, int force) cfq_clear_cfqq_wait_request(cfqq); del_timer(&cfqd->idle_slice_timer); - if (!force) { - max_dispatch = cfqd->cfq_quantum; - if (cfq_class_idle(cfqq)) - max_dispatch = 1; - } else - max_dispatch = INT_MAX; + max_dispatch = cfqd->cfq_quantum; + if (cfq_class_idle(cfqq)) + max_dispatch = 1; return __cfq_dispatch_requests(cfqd, cfqq, max_dispatch); } From 15853af9f07673680439b224519c692f1352b959 Mon Sep 17 00:00:00 2001 From: Tejun Heo Date: Thu, 10 Nov 2005 08:52:05 +0100 Subject: [PATCH 06/25] [BLOCK] Implement elv_drain_elevator for improved switch error detection This patch adds request_queue->nr_sorted which keeps the number of requests in the iosched and implement elv_drain_elevator which performs forced dispatching. elv_drain_elevator checks whether iosched actually dispatches all requests it has and prints error message if it doesn't. As buggy forced dispatching can result in wrong barrier operations, I think this extra check is worthwhile. Signed-off-by: Tejun Heo Signed-off-by: Jens Axboe --- block/elevator.c | 25 ++++++++++++++++++++----- include/linux/blkdev.h | 2 ++ 2 files changed, 22 insertions(+), 5 deletions(-) diff --git a/block/elevator.c b/block/elevator.c index a475b1a19f67..73aa46b6db49 100644 --- a/block/elevator.c +++ b/block/elevator.c @@ -226,6 +226,7 @@ void elv_dispatch_sort(request_queue_t *q, struct request *rq) if (q->last_merge == rq) q->last_merge = NULL; + q->nr_sorted--; boundary = q->end_sector; @@ -284,6 +285,7 @@ void elv_merge_requests(request_queue_t *q, struct request *rq, if (e->ops->elevator_merge_req_fn) e->ops->elevator_merge_req_fn(q, rq, next); + q->nr_sorted--; q->last_merge = rq; } @@ -315,6 +317,20 @@ void elv_requeue_request(request_queue_t *q, struct request *rq) __elv_add_request(q, rq, ELEVATOR_INSERT_FRONT, 0); } +static void elv_drain_elevator(request_queue_t *q) +{ + static int printed; + while (q->elevator->ops->elevator_dispatch_fn(q, 1)) + ; + if (q->nr_sorted == 0) + return; + if (printed++ < 10) { + printk(KERN_ERR "%s: forced dispatching is broken " + "(nr_sorted=%u), please report this\n", + q->elevator->elevator_type->elevator_name, q->nr_sorted); + } +} + void __elv_add_request(request_queue_t *q, struct request *rq, int where, int plug) { @@ -349,9 +365,7 @@ void __elv_add_request(request_queue_t *q, struct request *rq, int where, case ELEVATOR_INSERT_BACK: rq->flags |= REQ_SOFTBARRIER; - - while (q->elevator->ops->elevator_dispatch_fn(q, 1)) - ; + elv_drain_elevator(q); list_add_tail(&rq->queuelist, &q->queue_head); /* * We kick the queue here for the following reasons. @@ -370,6 +384,7 @@ void __elv_add_request(request_queue_t *q, struct request *rq, int where, case ELEVATOR_INSERT_SORT: BUG_ON(!blk_fs_request(rq)); rq->flags |= REQ_SORTED; + q->nr_sorted++; if (q->last_merge == NULL && rq_mergeable(rq)) q->last_merge = rq; /* @@ -692,8 +707,7 @@ static void elevator_switch(request_queue_t *q, struct elevator_type *new_e) set_bit(QUEUE_FLAG_ELVSWITCH, &q->queue_flags); - while (q->elevator->ops->elevator_dispatch_fn(q, 1)) - ; + elv_drain_elevator(q); while (q->rq.elvpriv) { blk_remove_plug(q); @@ -701,6 +715,7 @@ static void elevator_switch(request_queue_t *q, struct elevator_type *new_e) spin_unlock_irq(q->queue_lock); msleep(10); spin_lock_irq(q->queue_lock); + elv_drain_elevator(q); } spin_unlock_irq(q->queue_lock); diff --git a/include/linux/blkdev.h b/include/linux/blkdev.h index 025a7f084dbd..a33a31e71bbc 100644 --- a/include/linux/blkdev.h +++ b/include/linux/blkdev.h @@ -406,6 +406,7 @@ struct request_queue atomic_t refcnt; + unsigned int nr_sorted; unsigned int in_flight; /* @@ -631,6 +632,7 @@ static inline void elv_dispatch_add_tail(struct request_queue *q, { if (q->last_merge == rq) q->last_merge = NULL; + q->nr_sorted--; q->end_sector = rq_end_sector(rq); q->boundary_rq = rq; From be56123568072d223263a6a70a087d1e7faabb83 Mon Sep 17 00:00:00 2001 From: Tejun Heo Date: Thu, 10 Nov 2005 08:55:01 +0100 Subject: [PATCH 07/25] [BLOCK] fix string handling in elv_iosched_store elv_iosched_store doesn't terminate string passed from userspace if it's too long. Also, if the written length is zero (probably not possible), it accesses elevator_name[-1]. This patch fixes both bugs. Signed-off-by: Tejun Heo Signed-off-by: Jens Axboe --- block/elevator.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/block/elevator.c b/block/elevator.c index 73aa46b6db49..cacfff7418e4 100644 --- a/block/elevator.c +++ b/block/elevator.c @@ -762,13 +762,15 @@ error: ssize_t elv_iosched_store(request_queue_t *q, const char *name, size_t count) { char elevator_name[ELV_NAME_MAX]; + size_t len; struct elevator_type *e; - memset(elevator_name, 0, sizeof(elevator_name)); - strncpy(elevator_name, name, sizeof(elevator_name)); + elevator_name[sizeof(elevator_name) - 1] = '\0'; + strncpy(elevator_name, name, sizeof(elevator_name) - 1); + len = strlen(elevator_name); - if (elevator_name[strlen(elevator_name) - 1] == '\n') - elevator_name[strlen(elevator_name) - 1] = '\0'; + if (len && elevator_name[len - 1] == '\n') + elevator_name[len - 1] = '\0'; e = elevator_get(elevator_name); if (!e) { From b740d98f5614e34b4cff2e1e67826f007c8d4f30 Mon Sep 17 00:00:00 2001 From: Tejun Heo Date: Thu, 10 Nov 2005 18:20:16 +0100 Subject: [PATCH 08/25] [BLOCK] cfq-iosched: fix slice_left calculation When cfq slice expires, remainder of slice is calculated and stored in cfqq->slice_left. Current code calculates the opposite of remainder - how many jiffies the cfqq has used past slice end. This patch fixes the bug. Signed-off-by: Tejun Heo Signed-off-by: Jens Axboe --- block/cfq-iosched.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/block/cfq-iosched.c b/block/cfq-iosched.c index 452538644bce..2b64f5852bfd 100644 --- a/block/cfq-iosched.c +++ b/block/cfq-iosched.c @@ -861,8 +861,8 @@ __cfq_slice_expired(struct cfq_data *cfqd, struct cfq_queue *cfqq, * store what was left of this slice, if the queue idled out * or was preempted */ - if (time_after(now, cfqq->slice_end)) - cfqq->slice_left = now - cfqq->slice_end; + if (time_after(cfqq->slice_end, now)) + cfqq->slice_left = cfqq->slice_end - now; else cfqq->slice_left = 0; From 5a7c47eefb31f6b4982add7473ef3e551b058ea4 Mon Sep 17 00:00:00 2001 From: Tejun Heo Date: Thu, 10 Nov 2005 18:21:30 +0100 Subject: [PATCH 09/25] [BLOCK] noop-iosched: reimplementation of request dispatching The original implementation directly used dispatch queue. As new generic dispatch queue imposes stricter rules over ioscheds and dispatch queue usage, this direct use becomes somewhat problematic. This patch reimplements noop-iosched such that it complies to generic iosched model better. Request merging with q->last_merge and rq->queuelist.prev/next work again now. Signed-off-by: Tejun Heo Signed-off-by: Jens Axboe #include -static void elevator_noop_add_request(request_queue_t *q, struct request *rq) +struct noop_data { + struct list_head queue; +}; + +static void noop_merged_requests(request_queue_t *q, struct request *rq, + struct request *next) { - rq->flags |= REQ_NOMERGE; - elv_dispatch_add_tail(q, rq); + list_del_init(&next->queuelist); } -static int elevator_noop_dispatch(request_queue_t *q, int force) +static int noop_dispatch(request_queue_t *q, int force) { + struct noop_data *nd = q->elevator->elevator_data; + + if (!list_empty(&nd->queue)) { + struct request *rq; + rq = list_entry(nd->queue.next, struct request, queuelist); + list_del_init(&rq->queuelist); + elv_dispatch_sort(q, rq); + return 1; + } return 0; } +static void noop_add_request(request_queue_t *q, struct request *rq) +{ + struct noop_data *nd = q->elevator->elevator_data; + + list_add_tail(&rq->queuelist, &nd->queue); +} + +static int noop_queue_empty(request_queue_t *q) +{ + struct noop_data *nd = q->elevator->elevator_data; + + return list_empty(&nd->queue); +} + +static struct request * +noop_former_request(request_queue_t *q, struct request *rq) +{ + struct noop_data *nd = q->elevator->elevator_data; + + if (rq->queuelist.prev == &nd->queue) + return NULL; + return list_entry(rq->queuelist.prev, struct request, queuelist); +} + +static struct request * +noop_latter_request(request_queue_t *q, struct request *rq) +{ + struct noop_data *nd = q->elevator->elevator_data; + + if (rq->queuelist.next == &nd->queue) + return NULL; + return list_entry(rq->queuelist.next, struct request, queuelist); +} + +static int noop_init_queue(request_queue_t *q, elevator_t *e) +{ + struct noop_data *nd; + + nd = kmalloc(sizeof(*nd), GFP_KERNEL); + if (!nd) + return -ENOMEM; + INIT_LIST_HEAD(&nd->queue); + e->elevator_data = nd; + return 0; +} + +static void noop_exit_queue(elevator_t *e) +{ + struct noop_data *nd = e->elevator_data; + + BUG_ON(!list_empty(&nd->queue)); + kfree(nd); +} + static struct elevator_type elevator_noop = { .ops = { - .elevator_dispatch_fn = elevator_noop_dispatch, - .elevator_add_req_fn = elevator_noop_add_request, + .elevator_merge_req_fn = noop_merged_requests, + .elevator_dispatch_fn = noop_dispatch, + .elevator_add_req_fn = noop_add_request, + .elevator_queue_empty_fn = noop_queue_empty, + .elevator_former_req_fn = noop_former_request, + .elevator_latter_req_fn = noop_latter_request, + .elevator_init_fn = noop_init_queue, + .elevator_exit_fn = noop_exit_queue, }, .elevator_name = "noop", .elevator_owner = THIS_MODULE, From 3beb2077125d8457118140653e75efc998ac6630 Mon Sep 17 00:00:00 2001 From: Tejun Heo Date: Thu, 10 Nov 2005 18:22:36 +0100 Subject: [PATCH 10/25] [BLOCK] elevator: elv_latter/former_request update With generic dispatch queue update, implicit former/latter request handling using rq->queuelist.prev/next doesn't work as expected anymore. Also, the only iosched dependent on this feature was noop-iosched and it has been reimplemented to have its own latter/former methods. This patch removes implicit former/latter handling. Signed-off-by: Tejun Heo Signed-off-by: Jens Axboe --- block/elevator.c | 14 -------------- 1 file changed, 14 deletions(-) diff --git a/block/elevator.c b/block/elevator.c index cacfff7418e4..e4c58827bb46 100644 --- a/block/elevator.c +++ b/block/elevator.c @@ -541,33 +541,19 @@ int elv_queue_empty(request_queue_t *q) struct request *elv_latter_request(request_queue_t *q, struct request *rq) { - struct list_head *next; - elevator_t *e = q->elevator; if (e->ops->elevator_latter_req_fn) return e->ops->elevator_latter_req_fn(q, rq); - - next = rq->queuelist.next; - if (next != &q->queue_head && next != &rq->queuelist) - return list_entry_rq(next); - return NULL; } struct request *elv_former_request(request_queue_t *q, struct request *rq) { - struct list_head *prev; - elevator_t *e = q->elevator; if (e->ops->elevator_former_req_fn) return e->ops->elevator_former_req_fn(q, rq); - - prev = rq->queuelist.prev; - if (prev != &q->queue_head && prev != &rq->queuelist) - return list_entry_rq(prev); - return NULL; } From 0fde7f591860e48dd210144ff24c061da03bfa39 Mon Sep 17 00:00:00 2001 From: Linus Torvalds Date: Sat, 12 Nov 2005 10:14:02 -0800 Subject: [PATCH 11/25] Revert "[PATCH] fbcon: Add rl (Roman Large) font" This reverts 998e6d51162707685336ff99c029c8911b270d32 commit. --- drivers/video/console/Kconfig | 7 - drivers/video/console/Makefile | 1 - drivers/video/console/font_rl.c | 4374 ------------------------------- drivers/video/console/fonts.c | 4 - include/linux/font.h | 2 - 5 files changed, 4388 deletions(-) delete mode 100644 drivers/video/console/font_rl.c diff --git a/drivers/video/console/Kconfig b/drivers/video/console/Kconfig index 94c5f1392cce..5f74df993406 100644 --- a/drivers/video/console/Kconfig +++ b/drivers/video/console/Kconfig @@ -215,12 +215,5 @@ config FONT_10x18 big letters. It fits between the sun 12x22 and the normal 8x16 font. If other fonts are too big or too small for you, say Y, otherwise say N. -config FONT_RL - bool "console Roman Large 8x16 font" if FONTS - depends on FRAMEBUFFER_CONSOLE - help - This is the visually-appealing "RL" console font that is - included with the kbd package. - endmenu diff --git a/drivers/video/console/Makefile b/drivers/video/console/Makefile index fed600c9ca55..9b26dda18a38 100644 --- a/drivers/video/console/Makefile +++ b/drivers/video/console/Makefile @@ -15,7 +15,6 @@ font-objs-$(CONFIG_FONT_10x18) += font_10x18.o 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_RL) += font_rl.o font-objs += $(font-objs-y) diff --git a/drivers/video/console/font_rl.c b/drivers/video/console/font_rl.c deleted file mode 100644 index dfecc27d8ded..000000000000 --- a/drivers/video/console/font_rl.c +++ /dev/null @@ -1,4374 +0,0 @@ - -/* This font is simply the "rl.fnt" console font from the kbd utility. - * Converted by Zack T Smith, fbui@comcast.net. - * The original binary file is covered under the GNU Public License. - */ - -#include - -#define FONTDATAMAX 4096 - -static unsigned char patterns[4096] = { -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, - -0x00, -0x00, -0x3c, -0x42, -0x81, -0xe7, -0xa5, -0x99, -0x81, -0x81, -0x99, -0x42, -0x3c, -0x00, -0x00, -0x00, - -0x00, -0x00, -0x3c, -0x7e, -0xff, -0x99, -0xdb, -0xe7, -0xff, -0xff, -0xe7, -0x7e, -0x3c, -0x00, -0x00, -0x00, - -0x00, -0x00, -0x00, -0x6c, -0xfe, -0xfe, -0xfe, -0xfe, -0xfe, -0x7c, -0x38, -0x10, -0x00, -0x00, -0x00, -0x00, - -0x00, -0x00, -0x00, -0x00, -0x10, -0x38, -0x7c, -0xfe, -0x7c, -0x38, -0x10, -0x00, -0x00, -0x00, -0x00, -0x00, - -0x00, -0x00, -0x38, -0x38, -0x10, -0xd6, -0xfe, -0xd6, -0x10, -0x10, -0x38, -0x7c, -0x00, -0x00, -0x00, -0x00, - -0x00, -0x00, -0x10, -0x38, -0x7c, -0xfe, -0xfe, -0x54, -0x10, -0x10, -0x38, -0x7c, -0x00, -0x00, -0x00, -0x00, - -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, -0x18, -0x3c, -0x3c, -0x18, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, - -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xe7, -0xc3, -0xc3, -0xe7, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, - -0x00, -0x00, -0x00, -0x00, -0x00, -0x3c, -0x66, -0x42, -0x42, -0x66, -0x3c, -0x00, -0x00, -0x00, -0x00, -0x00, - -0xff, -0xff, -0xff, -0xff, -0xff, -0xc3, -0x99, -0xbd, -0xbd, -0x99, -0xc3, -0xff, -0xff, -0xff, -0xff, -0xff, - -0x00, -0x00, -0x0f, -0x07, -0x0d, -0x18, -0x78, -0xcc, -0xcc, -0xcc, -0xcc, -0x78, -0x00, -0x00, -0x00, -0x00, - -0x00, -0x00, -0x3c, -0x66, -0x66, -0x66, -0x3c, -0x18, -0x7e, -0x18, -0x18, -0x18, -0x00, -0x00, -0x00, -0x00, - -0x00, -0x08, -0x0c, -0x0a, -0x0a, -0x0a, -0x08, -0x08, -0x08, -0x38, -0x78, -0x30, -0x00, -0x00, -0x00, -0x00, - -0x00, -0x10, -0x18, -0x1c, -0x1e, -0x1e, -0x16, -0x12, -0x72, -0xf2, -0x62, -0x0e, -0x1e, -0x0c, -0x00, -0x00, - -0x00, -0x00, -0x00, -0x10, -0x92, -0x54, -0x38, -0xfe, -0x38, -0x54, -0x92, -0x10, -0x00, -0x00, -0x00, -0x00, - -0x00, -0x00, -0x00, -0x80, -0xc0, -0xe0, -0xb8, -0x8e, -0xb8, -0xe0, -0xc0, -0x80, -0x00, -0x00, -0x00, -0x00, - -0x00, -0x00, -0x00, -0x02, -0x06, -0x0e, -0x3a, -0xe2, -0x3a, -0x0e, -0x06, -0x02, -0x00, -0x00, -0x00, -0x00, - -0x00, -0x00, -0x10, -0x38, -0x7c, -0xd6, -0x10, -0x10, -0x10, -0x10, -0xd6, -0x7c, -0x38, -0x10, -0x00, -0x00, - -0x00, -0x42, -0xe7, -0xe7, -0xe7, -0xe7, -0x42, -0x42, -0x42, -0x00, -0x66, -0x66, -0x66, -0x00, -0x00, -0x00, - -0x00, -0x7f, -0xca, -0xca, -0xca, -0xca, -0x7a, -0x0a, -0x0a, -0x0a, -0x0a, -0x0a, -0x1b, -0x00, -0x00, -0x00, - -0x00, -0x1e, -0x31, -0x78, -0xcc, -0xc6, -0xc3, -0x63, -0x33, -0x1e, -0x8c, -0x78, -0x00, -0x00, -0x00, -0x00, - -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, -0xfe, -0xfe, -0xfe, -0xfe, -0x00, -0x00, -0x00, -0x00, - -0x00, -0x00, -0x10, -0x38, -0x7c, -0xd6, -0x10, -0x10, -0x10, -0x10, -0xd6, -0x7c, -0x38, -0x10, -0xfe, -0x00, - -0x00, -0x00, -0x10, -0x38, -0x7c, -0xd6, -0x10, -0x10, -0x10, -0x10, -0x10, -0x10, -0x10, -0x10, -0x00, -0x00, - -0x00, -0x00, -0x10, -0x10, -0x10, -0x10, -0x10, -0x10, -0x10, -0x10, -0xd6, -0x7c, -0x38, -0x10, -0x00, -0x00, - -0x00, -0x00, -0x00, -0x00, -0x00, -0x08, -0x0c, -0x06, -0xff, -0x06, -0x0c, -0x08, -0x00, -0x00, -0x00, -0x00, - -0x00, -0x00, -0x00, -0x00, -0x00, -0x10, -0x30, -0x60, -0xff, -0x60, -0x30, -0x10, -0x00, -0x00, -0x00, -0x00, - -0x22, -0x44, -0x88, -0xcc, -0xee, -0x44, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, - -0x00, -0x00, -0x00, -0x00, -0x00, -0x24, -0x42, -0xff, -0x42, -0x24, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, - -0x00, -0x00, -0x00, -0x10, -0x38, -0x38, -0x6c, -0x6c, -0xc6, -0xfe, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, - -0x00, -0x00, -0x00, -0xfe, -0xc6, -0x6c, -0x6c, -0x38, -0x38, -0x10, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, - -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, - -0x00, -0x18, -0x3c, -0x3c, -0x3c, -0x3c, -0x18, -0x18, -0x18, -0x10, -0x00, -0x18, -0x18, -0x00, -0x00, -0x00, - -0x22, -0x77, -0x33, -0x11, -0x22, -0x44, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, - -0x00, -0x00, -0x12, -0x12, -0x12, -0x7f, -0x24, -0x24, -0x24, -0xfe, -0x48, -0x48, -0x48, -0x00, -0x00, -0x00, - -0x10, -0x10, -0x7c, -0xd2, -0xd0, -0xd0, -0xd0, -0x7c, -0x16, -0x16, -0x16, -0x96, -0x7c, -0x10, -0x10, -0x00, - -0x00, -0x42, -0xbe, -0x44, -0x0c, -0x08, -0x18, -0x10, -0x30, -0x20, -0x64, -0x4a, -0xc4, -0x00, -0x00, -0x00, - -0x00, -0x38, -0x6c, -0x6c, -0x6c, -0x38, -0x37, -0x72, -0xdc, -0xcc, -0xcc, -0xcc, -0x77, -0x00, -0x00, -0x00, - -0x10, -0x38, -0x18, -0x08, -0x10, -0x20, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, - -0x00, -0x04, -0x08, -0x10, -0x10, -0x30, -0x30, -0x30, -0x30, -0x30, -0x10, -0x10, -0x08, -0x04, -0x00, -0x00, - -0x00, -0x20, -0x10, -0x08, -0x08, -0x0c, -0x0c, -0x0c, -0x0c, -0x0c, -0x08, -0x08, -0x10, -0x20, -0x00, -0x00, - -0x00, -0x00, -0x00, -0x00, -0x44, -0x28, -0x38, -0xfe, -0x38, -0x28, -0x44, -0x00, -0x00, -0x00, -0x00, -0x00, - -0x00, -0x00, -0x00, -0x00, -0x00, -0x18, -0x18, -0x7e, -0x18, -0x18, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, - -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, -0x10, -0x38, -0x18, -0x08, -0x10, -0x20, - -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, -0x7e, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, - -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, -0x10, -0x38, -0x10, -0x00, -0x00, -0x00, - -0x00, -0x06, -0x06, -0x0c, -0x0c, -0x18, -0x18, -0x30, -0x30, -0x60, -0x60, -0xc0, -0xc0, -0x00, -0x00, -0x00, - -0x00, -0x00, -0x00, -0x00, -0x3c, -0x46, -0xc6, -0xc6, -0xc6, -0xc6, -0xc6, -0xc4, -0x78, -0x00, -0x00, -0x00, - -0x00, -0x00, -0x00, -0x00, -0x08, -0x18, -0x78, -0x18, -0x18, -0x18, -0x18, -0x18, -0x7e, -0x00, -0x00, -0x00, - -0x00, -0x00, -0x00, -0x00, -0x7c, -0x86, -0x06, -0x0c, -0x18, -0x20, -0x40, -0xc1, -0xfe, -0x00, -0x00, -0x00, - -0x00, -0x00, -0x00, -0x00, -0x3c, -0x46, -0x04, -0x08, -0x1c, -0x06, -0x06, -0x06, -0x06, -0x0c, -0x70, -0x00, - -0x00, -0x00, -0x00, -0x00, -0x04, -0x08, -0x10, -0x2c, -0x4c, -0x8c, -0x8c, -0xfe, -0x0c, -0x0c, -0x0c, -0x00, - -0x00, -0x00, -0x00, -0x02, -0x3c, -0x20, -0x20, -0x70, -0x0c, -0x06, -0x06, -0x06, -0x06, -0x0c, -0x70, -0x00, - -0x00, -0x00, -0x18, -0x20, -0x40, -0xc0, -0xdc, -0xc6, -0xc6, -0xc6, -0xc6, -0x44, -0x38, -0x00, -0x00, -0x00, - -0x00, -0x00, -0x00, -0x40, -0x7e, -0x82, -0x06, -0x04, -0x0c, -0x18, -0x18, -0x30, -0x30, -0x30, -0x30, -0x00, - -0x00, -0x00, -0x7c, -0xc6, -0xc6, -0x64, -0x38, -0x4c, -0xc6, -0xc6, -0xc6, -0xc6, -0x7c, -0x00, -0x00, -0x00, - -0x00, -0x00, -0x00, -0x00, -0x38, -0x44, -0xc6, -0xc6, -0x76, -0x06, -0x06, -0x06, -0x04, -0x08, -0x30, -0x00, - -0x00, -0x00, -0x00, -0x00, -0x10, -0x38, -0x10, -0x00, -0x00, -0x00, -0x10, -0x38, -0x10, -0x00, -0x00, -0x00, - -0x00, -0x00, -0x00, -0x00, -0x10, -0x38, -0x10, -0x00, -0x00, -0x00, -0x10, -0x38, -0x18, -0x08, -0x10, -0x20, - -0x00, -0x06, -0x0c, -0x18, -0x30, -0x60, -0xa0, -0xa0, -0x60, -0x30, -0x18, -0x0c, -0x06, -0x00, -0x00, -0x00, - -0x00, -0x00, -0x00, -0x00, -0x00, -0x7e, -0x00, -0x00, -0x7e, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, - -0x00, -0x60, -0x30, -0x18, -0x0c, -0x06, -0x05, -0x05, -0x06, -0x0c, -0x18, -0x30, -0x60, -0x00, -0x00, -0x00, - -0x00, -0x7c, -0x86, -0xc6, -0x06, -0x04, -0x08, -0x10, -0x10, -0x18, -0x00, -0x18, -0x18, -0x00, -0x00, -0x00, - -0x00, -0x00, -0x3c, -0x46, -0xc6, -0xce, -0xd6, -0xd6, -0xd6, -0xdc, -0xc0, -0xc4, -0x78, -0x00, -0x00, -0x00, - -0x00, -0x18, -0x18, -0x18, -0x3c, -0x2c, -0x2c, -0x2c, -0x7e, -0x46, -0x46, -0x46, -0xef, -0x00, -0x00, -0x00, - -0x00, -0xfc, -0x66, -0x66, -0x66, -0x66, -0x7c, -0x66, -0x66, -0x66, -0x66, -0x66, -0xfc, -0x00, -0x00, -0x00, - -0x00, -0x3a, -0x66, -0xc2, -0xc0, -0xc0, -0xc0, -0xc0, -0xc0, -0xc0, -0xc0, -0x62, -0x3c, -0x00, -0x00, -0x00, - -0x00, -0xfc, -0x66, -0x63, -0x63, -0x63, -0x63, -0x63, -0x63, -0x63, -0x63, -0x66, -0xfc, -0x00, -0x00, -0x00, - -0x00, -0xff, -0x61, -0x60, -0x60, -0x64, -0x7c, -0x64, -0x60, -0x60, -0x60, -0x61, -0xfe, -0x00, -0x00, -0x00, - -0x00, -0xff, -0x61, -0x61, -0x60, -0x64, -0x7c, -0x64, -0x60, -0x60, -0x60, -0x60, -0xf0, -0x00, -0x00, -0x00, - -0x00, -0x3a, -0x66, -0xc2, -0xc0, -0xc0, -0xc0, -0xcf, -0xc6, -0xc6, -0xc6, -0x66, -0x38, -0x00, -0x00, -0x00, - -0x00, -0xf7, -0x62, -0x62, -0x62, -0x62, -0x7e, -0x62, -0x62, -0x62, -0x62, -0x62, -0xf7, -0x00, -0x00, -0x00, - -0x00, -0x3c, -0x18, -0x18, -0x18, -0x18, -0x18, -0x18, -0x18, -0x18, -0x18, -0x18, -0x3c, -0x00, -0x00, -0x00, - -0x00, -0x1e, -0x0c, -0x0c, -0x0c, -0x0c, -0x0c, -0x0c, -0x0c, -0x0c, -0x0c, -0x0c, -0x0c, -0x0c, -0x08, -0xf0, - -0x00, -0xf7, -0x64, -0x6c, -0x68, -0x68, -0x78, -0x6c, -0x6c, -0x6c, -0x66, -0x66, -0xf7, -0x00, -0x00, -0x00, - -0x00, -0xf8, -0x60, -0x60, -0x60, -0x60, -0x60, -0x60, -0x60, -0x60, -0x60, -0x61, -0xfe, -0x00, -0x00, -0x00, - -0x00, -0xc3, -0x66, -0x76, -0x7e, -0x56, -0x56, -0x46, -0x46, -0x46, -0x46, -0x46, -0xef, -0x00, -0x00, -0x00, - -0x00, -0xe7, -0x62, -0x62, -0x72, -0x52, -0x5a, -0x4a, -0x4e, -0x46, -0x46, -0x42, -0xe2, -0x00, -0x00, -0x00, - -0x00, -0x3c, -0x66, -0xc3, -0xc3, -0xc3, -0xc3, -0xc3, -0xc3, -0xc3, -0xc3, -0x66, -0x3c, -0x00, -0x00, -0x00, - -0x00, -0xfc, -0x66, -0x66, -0x66, -0x66, -0x6c, -0x60, -0x60, -0x60, -0x60, -0x60, -0xf0, -0x00, -0x00, -0x00, - -0x00, -0x3c, -0x66, -0xc3, -0xc3, -0xc3, -0xc3, -0xc3, -0xc3, -0xc3, -0xc3, -0x66, -0x3c, -0x10, -0x39, -0x0e, - -0x00, -0xfc, -0x66, -0x66, -0x66, -0x66, -0x7c, -0x6c, -0x66, -0x66, -0x66, -0x66, -0xf3, -0x00, -0x00, -0x00, - -0x00, -0x7a, -0xc6, -0xc2, -0xc0, -0x70, -0x3c, -0x0e, -0x06, -0x06, -0x86, -0xc6, -0xbc, -0x00, -0x00, -0x00, - -0x00, -0xff, -0x99, -0x18, -0x18, -0x18, -0x18, -0x18, -0x18, -0x18, -0x18, -0x18, -0x3c, -0x00, -0x00, -0x00, - -0x00, -0xf7, -0x62, -0x62, -0x62, -0x62, -0x62, -0x62, -0x62, -0x62, -0x62, -0x62, -0x3c, -0x00, -0x00, -0x00, - -0x00, -0xf7, -0x62, -0x62, -0x62, -0x76, -0x34, -0x34, -0x34, -0x3c, -0x18, -0x18, -0x18, -0x00, -0x00, -0x00, - -0x00, -0xf7, -0x62, -0x62, -0x62, -0x62, -0x6a, -0x6a, -0x6a, -0x6a, -0x7e, -0x7e, -0x34, -0x00, -0x00, -0x00, - -0x00, -0xf7, -0x62, -0x62, -0x34, -0x34, -0x18, -0x18, -0x2c, -0x2c, -0x46, -0x46, -0xef, -0x00, -0x00, -0x00, - -0x00, -0xf7, -0x62, -0x62, -0x62, -0x34, -0x34, -0x18, -0x18, -0x18, -0x18, -0x18, -0x3c, -0x00, -0x00, -0x00, - -0x00, -0x7f, -0x46, -0x86, -0x0c, -0x0c, -0x18, -0x18, -0x30, -0x30, -0x61, -0x62, -0xfe, -0x00, -0x00, -0x00, - -0x00, -0x3c, -0x30, -0x30, -0x30, -0x30, -0x30, -0x30, -0x30, -0x30, -0x30, -0x30, -0x3c, -0x00, -0x00, -0x00, - -0x00, -0xc0, -0xc0, -0x60, -0x60, -0x30, -0x30, -0x18, -0x18, -0x0c, -0x0c, -0x06, -0x06, -0x00, -0x00, -0x00, - -0x00, -0x3c, -0x0c, -0x0c, -0x0c, -0x0c, -0x0c, -0x0c, -0x0c, -0x0c, -0x0c, -0x0c, -0x3c, -0x00, -0x00, -0x00, - -0x00, -0x10, -0x38, -0x4c, -0x86, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, - -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, -0xff, -0x00, -0x00, - -0x00, -0x18, -0x20, -0x30, -0x38, -0x10, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, - -0x00, -0x00, -0x00, -0x00, -0x00, -0x78, -0x8c, -0x0c, -0x3c, -0xcc, -0xcc, -0xcd, -0x76, -0x00, -0x00, -0x00, - -0x00, -0x20, -0xe0, -0x60, -0x60, -0x6c, -0x76, -0x66, -0x66, -0x66, -0x66, -0x76, -0x6c, -0x00, -0x00, -0x00, - -0x00, -0x00, -0x00, -0x00, -0x00, -0x3c, -0x66, -0x60, -0x60, -0x60, -0x60, -0x62, -0x3c, -0x00, -0x00, -0x00, - -0x00, -0x04, -0x1c, -0x0c, -0x0c, -0x6c, -0xdc, -0xcc, -0xcc, -0xcc, -0xcc, -0xdc, -0x66, -0x00, -0x00, -0x00, - -0x00, -0x00, -0x00, -0x00, -0x00, -0x3c, -0x66, -0x7e, -0x60, -0x60, -0x60, -0x62, -0x3c, -0x00, -0x00, -0x00, - -0x00, -0x1e, -0x31, -0x33, -0x30, -0x30, -0x78, -0x30, -0x30, -0x30, -0x30, -0x30, -0x78, -0x00, -0x00, -0x00, - -0x00, -0x00, -0x00, -0x00, -0x00, -0x7b, -0xce, -0xcc, -0xcc, -0xcc, -0x78, -0x60, -0x7c, -0x86, -0xc6, -0x7c, - -0x00, -0x20, -0xe0, -0x60, -0x60, -0x6c, -0x76, -0x66, -0x66, -0x66, -0x66, -0x66, -0xf7, -0x00, -0x00, -0x00, - -0x00, -0x10, -0x38, -0x10, -0x00, -0x18, -0x38, -0x18, -0x18, -0x18, -0x18, -0x18, -0x3c, -0x00, -0x00, -0x00, - -0x00, -0x08, -0x1c, -0x08, -0x00, -0x0c, -0x1c, -0x0c, -0x0c, -0x0c, -0x0c, -0x0c, -0x6c, -0x4c, -0x38, -0x00, - -0x00, -0x20, -0xe0, -0x60, -0x60, -0x67, -0x66, -0x6c, -0x78, -0x6c, -0x6c, -0x66, -0xe7, -0x00, -0x00, -0x00, - -0x00, -0x08, -0x38, -0x18, -0x18, -0x18, -0x18, -0x18, -0x18, -0x18, -0x18, -0x18, -0x3c, -0x00, -0x00, -0x00, - -0x00, -0x00, -0x00, -0x00, -0x00, -0x6a, -0xfe, -0x6a, -0x6a, -0x6a, -0x62, -0x62, -0xf7, -0x00, -0x00, -0x00, - -0x00, -0x00, -0x00, -0x00, -0x00, -0x5c, -0xf6, -0x66, -0x66, -0x66, -0x66, -0x66, -0xf7, -0x00, -0x00, -0x00, - -0x00, -0x00, -0x00, -0x00, -0x00, -0x3c, -0x66, -0x66, -0x66, -0x66, -0x66, -0x66, -0x3c, -0x00, -0x00, -0x00, - -0x00, -0x00, -0x00, -0x00, -0x00, -0x5c, -0xe6, -0x66, -0x66, -0x66, -0x66, -0x66, -0x7c, -0x60, -0x60, -0xf0, - -0x00, -0x00, -0x00, -0x00, -0x00, -0x76, -0xcc, -0xcc, -0xcc, -0xcc, -0xcc, -0xcc, -0x7c, -0x0c, -0x0c, -0x1e, - -0x00, -0x00, -0x00, -0x00, -0x00, -0x5e, -0xf6, -0x60, -0x60, -0x60, -0x60, -0x60, -0xf0, -0x00, -0x00, -0x00, - -0x00, -0x00, -0x00, -0x00, -0x00, -0x7a, -0xc6, -0x72, -0x1c, -0x06, -0x86, -0xc6, -0xbc, -0x00, -0x00, -0x00, - -0x00, -0x00, -0x00, -0x10, -0x30, -0x7c, -0x30, -0x30, -0x30, -0x30, -0x30, -0x34, -0x18, -0x00, -0x00, -0x00, - -0x00, -0x00, -0x00, -0x00, -0x00, -0xee, -0x66, -0x66, -0x66, -0x66, -0x66, -0x67, -0x3a, -0x00, -0x00, -0x00, - -0x00, -0x00, -0x00, -0x00, -0x00, -0xf7, -0x62, -0x76, -0x34, -0x34, -0x3c, -0x18, -0x18, -0x00, -0x00, -0x00, - -0x00, -0x00, -0x00, -0x00, -0x00, -0xf7, -0x62, -0x6a, -0x6a, -0x6a, -0x6a, -0x7e, -0x24, -0x00, -0x00, -0x00, - -0x00, -0x00, -0x00, -0x00, -0x00, -0xf7, -0x62, -0x34, -0x18, -0x2c, -0x46, -0x46, -0xef, -0x00, -0x00, -0x00, - -0x00, -0x00, -0x00, -0x00, -0x00, -0xf7, -0x62, -0x62, -0x34, -0x34, -0x18, -0x18, -0x18, -0x10, -0xb0, -0xe0, - -0x00, -0x00, -0x00, -0x00, -0x00, -0xfe, -0x8c, -0x18, -0x30, -0x30, -0x60, -0xc2, -0xfe, -0x00, -0x00, -0x00, - -0x00, -0x0e, -0x18, -0x10, -0x10, -0x08, -0x70, -0x70, -0x08, -0x10, -0x10, -0x18, -0x0e, -0x00, -0x00, -0x00, - -0x18, -0x18, -0x18, -0x18, -0x18, -0x18, -0x18, -0x18, -0x18, -0x18, -0x18, -0x18, -0x18, -0x18, -0x00, -0x00, - -0x00, -0x70, -0x18, -0x08, -0x08, -0x10, -0x0e, -0x0e, -0x10, -0x08, -0x08, -0x18, -0x70, -0x00, -0x00, -0x00, - -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, -0x76, -0xdc, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, - -0x00, -0x00, -0x00, -0x00, -0x10, -0x38, -0x6c, -0xc6, -0xc6, -0xc6, -0xfe, -0x00, -0x00, -0x00, -0x00, -0x00, - -0x00, -0x00, -0x3a, -0x66, -0xc2, -0xc0, -0xc0, -0xc0, -0xc0, -0xc0, -0x62, -0x3c, -0x18, -0x0c, -0x24, -0x18, - -0x00, -0x00, -0x66, -0x00, -0x00, -0xee, -0x66, -0x66, -0x66, -0x66, -0x66, -0x66, -0x3b, -0x00, -0x00, -0x00, - -0x00, -0x0c, -0x18, -0x20, -0x00, -0x3c, -0x66, -0x7e, -0x60, -0x60, -0x60, -0x62, -0x3c, -0x00, -0x00, -0x00, - -0x00, -0x30, -0x58, -0x8c, -0x00, -0x78, -0x8c, -0x0c, -0x3c, -0xcc, -0xcc, -0xcd, -0x76, -0x00, -0x00, -0x00, - -0x00, -0x00, -0x66, -0x00, -0x00, -0x78, -0x8c, -0x0c, -0x3c, -0xcc, -0xcc, -0xcd, -0x76, -0x00, -0x00, -0x00, - -0x00, -0x30, -0x18, -0x04, -0x00, -0x78, -0x8c, -0x0c, -0x3c, -0xcc, -0xcc, -0xcd, -0x76, -0x00, -0x00, -0x00, - -0x38, -0x44, -0x44, -0x38, -0x00, -0x78, -0x8c, -0x0c, -0x3c, -0xcc, -0xcc, -0xcd, -0x76, -0x00, -0x00, -0x00, - -0x00, -0x00, -0x00, -0x00, -0x00, -0x3c, -0x66, -0x60, -0x60, -0x60, -0x60, -0x62, -0x3c, -0x08, -0x24, -0x18, - -0x00, -0x18, -0x2c, -0x46, -0x00, -0x3c, -0x66, -0x7e, -0x60, -0x60, -0x60, -0x62, -0x3c, -0x00, -0x00, -0x00, - -0x00, -0x00, -0x66, -0x00, -0x00, -0x3c, -0x66, -0x7e, -0x60, -0x60, -0x60, -0x62, -0x3c, -0x00, -0x00, -0x00, - -0x00, -0x30, -0x18, -0x04, -0x00, -0x3c, -0x66, -0x7e, -0x60, -0x60, -0x60, -0x62, -0x3c, -0x00, -0x00, -0x00, - -0x00, -0x00, -0x66, -0x00, -0x00, -0x38, -0x18, -0x18, -0x18, -0x18, -0x18, -0x18, -0x3c, -0x00, -0x00, -0x00, - -0x00, -0x18, -0x2c, -0x46, -0x00, -0x38, -0x18, -0x18, -0x18, -0x18, -0x18, -0x18, -0x3c, -0x00, -0x00, -0x00, - -0x00, -0x60, -0x30, -0x08, -0x00, -0x38, -0x18, -0x18, -0x18, -0x18, -0x18, -0x18, -0x3c, -0x00, -0x00, -0x00, - -0x66, -0x18, -0x18, -0x18, -0x3c, -0x2c, -0x2c, -0x2c, -0x7e, -0x46, -0x46, -0x46, -0xef, -0x00, -0x00, -0x00, - -0x18, -0x24, -0x18, -0x18, -0x3c, -0x2c, -0x2c, -0x2c, -0x7e, -0x46, -0x46, -0x46, -0xef, -0x00, -0x00, -0x00, - -0x0c, -0x18, -0xff, -0x61, -0x60, -0x60, -0x64, -0x7c, -0x64, -0x60, -0x60, -0x61, -0xfe, -0x00, -0x00, -0x00, - -0x00, -0x00, -0x00, -0x00, -0x00, -0x76, -0x9b, -0x1b, -0x3f, -0xd8, -0xd8, -0xd9, -0x6e, -0x00, -0x00, -0x00, - -0x00, -0x1f, -0x1d, -0x1d, -0x3c, -0x2c, -0x2e, -0x2c, -0x7c, -0x4c, -0x4c, -0x4d, -0xef, -0x00, -0x00, -0x00, - -0x00, -0x18, -0x2c, -0x46, -0x00, -0x3c, -0x66, -0x66, -0x66, -0x66, -0x66, -0x66, -0x3c, -0x00, -0x00, -0x00, - -0x00, -0x00, -0x66, -0x00, -0x00, -0x3c, -0x66, -0x66, -0x66, -0x66, -0x66, -0x66, -0x3c, -0x00, -0x00, -0x00, - -0x00, -0x30, -0x18, -0x04, -0x00, -0x3c, -0x66, -0x66, -0x66, -0x66, -0x66, -0x66, -0x3c, -0x00, -0x00, -0x00, - -0x00, -0x18, -0x2c, -0x46, -0x00, -0xee, -0x66, -0x66, -0x66, -0x66, -0x66, -0x67, -0x3a, -0x00, -0x00, -0x00, - -0x00, -0x30, -0x18, -0x04, -0x00, -0xee, -0x66, -0x66, -0x66, -0x66, -0x66, -0x67, -0x3a, -0x00, -0x00, -0x00, - -0x00, -0x00, -0x66, -0x00, -0x00, -0xf7, -0x62, -0x62, -0x34, -0x34, -0x18, -0x18, -0x18, -0x10, -0xb0, -0xe0, - -0x66, -0x00, -0x3c, -0x66, -0xc3, -0xc3, -0xc3, -0xc3, -0xc3, -0xc3, -0xc3, -0x66, -0x3c, -0x00, -0x00, -0x00, - -0x66, -0x00, -0xf7, -0x62, -0x62, -0x62, -0x62, -0x62, -0x62, -0x62, -0x62, -0x62, -0x3c, -0x00, -0x00, -0x00, - -0x00, -0x00, -0x10, -0x10, -0x10, -0x7c, -0xc6, -0xc0, -0xc0, -0xc0, -0xc0, -0xc2, -0x7c, -0x10, -0x10, -0x00, - -0x00, -0x38, -0x64, -0x6c, -0x60, -0x60, -0xf0, -0x60, -0x60, -0x60, -0x60, -0x66, -0xfc, -0x00, -0x00, -0x00, - -0x00, -0x81, -0xc3, -0x66, -0x3c, -0x18, -0xff, -0x18, -0x18, -0xff, -0x18, -0x18, -0x18, -0x00, -0x00, -0x00, - -0x00, -0xfe, -0x63, -0x63, -0x63, -0x63, -0x6e, -0x60, -0x64, -0x6e, -0x64, -0x64, -0xf5, -0x06, -0x00, -0x00, - -0x00, -0x0e, -0x19, -0x1b, -0x18, -0x18, -0x3c, -0x18, -0x18, -0x18, -0x18, -0xd8, -0x98, -0x70, -0x00, -0x00, - -0x00, -0x0c, -0x18, -0x20, -0x00, -0x78, -0x8c, -0x0c, -0x3c, -0xcc, -0xcc, -0xcd, -0x76, -0x00, -0x00, -0x00, - -0x00, -0x06, -0x0c, -0x10, -0x00, -0x38, -0x18, -0x18, -0x18, -0x18, -0x18, -0x18, -0x3c, -0x00, -0x00, -0x00, - -0x00, -0x0c, -0x18, -0x20, -0x00, -0x3c, -0x66, -0x66, -0x66, -0x66, -0x66, -0x66, -0x3c, -0x00, -0x00, -0x00, - -0x00, -0x0c, -0x18, -0x20, -0x00, -0xee, -0x66, -0x66, -0x66, -0x66, -0x66, -0x67, -0x3a, -0x00, -0x00, -0x00, - -0x00, -0x00, -0x32, -0x4c, -0x00, -0x5c, -0xf6, -0x66, -0x66, -0x66, -0x66, -0x66, -0xf7, -0x00, -0x00, -0x00, - -0x32, -0x4c, -0x00, -0xe7, -0x72, -0x52, -0x5a, -0x4a, -0x4e, -0x46, -0x46, -0x42, -0xe2, -0x00, -0x00, -0x00, - -0x00, -0x78, -0x8c, -0x0c, -0x3c, -0xcc, -0xcc, -0xcd, -0x76, -0x00, -0xfe, -0x00, -0x00, -0x00, -0x00, -0x00, - -0x00, -0x3c, -0x66, -0x66, -0x66, -0x66, -0x66, -0x66, -0x3c, -0x00, -0x7e, -0x00, -0x00, -0x00, -0x00, -0x00, - -0x00, -0x30, -0x30, -0x00, -0x30, -0x10, -0x10, -0x20, -0x40, -0xc0, -0xc6, -0xc2, -0x7c, -0x00, -0x00, -0x00, - -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, -0xfe, -0xc0, -0xc0, -0xc0, -0xc0, -0x00, -0x00, -0x00, -0x00, -0x00, - -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, -0xfe, -0x06, -0x06, -0x06, -0x06, -0x00, -0x00, -0x00, -0x00, -0x00, - -0x00, -0x20, -0xe0, -0x63, -0x66, -0xfc, -0x18, -0x30, -0x60, -0xce, -0x93, -0x06, -0x0c, -0x1f, -0x00, -0x00, - -0x00, -0x20, -0xe0, -0x63, -0x66, -0xfc, -0x18, -0x30, -0x64, -0xc8, -0x96, -0x3f, -0x06, -0x06, -0x00, -0x00, - -0x00, -0x18, -0x18, -0x00, -0x08, -0x18, -0x18, -0x18, -0x3c, -0x3c, -0x3c, -0x3c, -0x18, -0x00, -0x00, -0x00, - -0x00, -0x00, -0x00, -0x00, -0x00, -0x36, -0x6c, -0xd8, -0xd8, -0x6c, -0x36, -0x00, -0x00, -0x00, -0x00, -0x00, - -0x00, -0x00, -0x00, -0x00, -0x00, -0xd8, -0x6c, -0x36, -0x36, -0x6c, -0xd8, -0x00, -0x00, -0x00, -0x00, -0x00, - -0x82, -0x10, -0x82, -0x10, -0x82, -0x10, -0x82, -0x10, -0x82, -0x10, -0x82, -0x10, -0x82, -0x10, -0x82, -0x10, - -0x00, -0x95, -0x00, -0xa9, -0x00, -0x95, -0x00, -0xa9, -0x00, -0x95, -0x00, -0xa9, -0x00, -0x95, -0x00, -0xa9, - -0x92, -0x49, -0x92, -0x49, -0x92, -0x49, -0x92, -0x49, -0x92, -0x49, -0x92, -0x49, -0x92, -0x49, -0x92, -0x49, - -0x18, -0x18, -0x18, -0x18, -0x18, -0x18, -0x18, -0x18, -0x18, -0x18, -0x18, -0x18, -0x18, -0x18, -0x18, -0x18, - -0x18, -0x18, -0x18, -0x18, -0x18, -0x18, -0x18, -0xf8, -0x18, -0x18, -0x18, -0x18, -0x18, -0x18, -0x18, -0x18, - -0x18, -0x18, -0x18, -0x18, -0x18, -0x18, -0xf8, -0x18, -0x18, -0xf8, -0x18, -0x18, -0x18, -0x18, -0x18, -0x18, - -0x66, -0x66, -0x66, -0x66, -0x66, -0x66, -0x66, -0xe6, -0x66, -0x66, -0x66, -0x66, -0x66, -0x66, -0x66, -0x66, - -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, -0xfe, -0x66, -0x66, -0x66, -0x66, -0x66, -0x66, -0x66, -0x66, - -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, -0xf8, -0x18, -0x18, -0xf8, -0x18, -0x18, -0x18, -0x18, -0x18, -0x18, - -0x66, -0x66, -0x66, -0x66, -0x66, -0x66, -0xe6, -0x06, -0x06, -0xe6, -0x66, -0x66, -0x66, -0x66, -0x66, -0x66, - -0x66, -0x66, -0x66, -0x66, -0x66, -0x66, -0x66, -0x66, -0x66, -0x66, -0x66, -0x66, -0x66, -0x66, -0x66, -0x66, - -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, -0xfe, -0x06, -0x06, -0xe6, -0x66, -0x66, -0x66, -0x66, -0x66, -0x66, - -0x66, -0x66, -0x66, -0x66, -0x66, -0x66, -0xe6, -0x06, -0x06, -0xfe, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, - -0x66, -0x66, -0x66, -0x66, -0x66, -0x66, -0x66, -0xfe, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, - -0x18, -0x18, -0x18, -0x18, -0x18, -0x18, -0xf8, -0x18, -0x18, -0xf8, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, - -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, -0xf8, -0x18, -0x18, -0x18, -0x18, -0x18, -0x18, -0x18, -0x18, - -0x18, -0x18, -0x18, -0x18, -0x18, -0x18, -0x18, -0x1f, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, - -0x18, -0x18, -0x18, -0x18, -0x18, -0x18, -0x18, -0xff, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, - -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, -0xff, -0x18, -0x18, -0x18, -0x18, -0x18, -0x18, -0x18, -0x18, - -0x18, -0x18, -0x18, -0x18, -0x18, -0x18, -0x18, -0x1f, -0x18, -0x18, -0x18, -0x18, -0x18, -0x18, -0x18, -0x18, - -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, -0xff, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, - -0x18, -0x18, -0x18, -0x18, -0x18, -0x18, -0x18, -0xff, -0x18, -0x18, -0x18, -0x18, -0x18, -0x18, -0x18, -0x18, - -0x18, -0x18, -0x18, -0x18, -0x18, -0x18, -0x1f, -0x18, -0x18, -0x1f, -0x18, -0x18, -0x18, -0x18, -0x18, -0x18, - -0x66, -0x66, -0x66, -0x66, -0x66, -0x66, -0x66, -0x67, -0x66, -0x66, -0x66, -0x66, -0x66, -0x66, -0x66, -0x66, - -0x66, -0x66, -0x66, -0x66, -0x66, -0x66, -0x67, -0x60, -0x60, -0x7f, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, - -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, -0x7f, -0x60, -0x60, -0x67, -0x66, -0x66, -0x66, -0x66, -0x66, -0x66, - -0x66, -0x66, -0x66, -0x66, -0x66, -0x66, -0xe7, -0x00, -0x00, -0xff, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, - -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, -0xff, -0x00, -0x00, -0xe7, -0x66, -0x66, -0x66, -0x66, -0x66, -0x66, - -0x66, -0x66, -0x66, -0x66, -0x66, -0x66, -0x67, -0x60, -0x60, -0x67, -0x66, -0x66, -0x66, -0x66, -0x66, -0x66, - -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, -0xff, -0x00, -0x00, -0xff, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, - -0x66, -0x66, -0x66, -0x66, -0x66, -0x66, -0xe7, -0x00, -0x00, -0xe7, -0x66, -0x66, -0x66, -0x66, -0x66, -0x66, - -0x18, -0x18, -0x18, -0x18, -0x18, -0x18, -0xff, -0x00, -0x00, -0xff, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, - -0x66, -0x66, -0x66, -0x66, -0x66, -0x66, -0x66, -0xff, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, - -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, -0xff, -0x00, -0x00, -0xff, -0x18, -0x18, -0x18, -0x18, -0x18, -0x18, - -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, -0xff, -0x66, -0x66, -0x66, -0x66, -0x66, -0x66, -0x66, -0x66, - -0x66, -0x66, -0x66, -0x66, -0x66, -0x66, -0x66, -0x7f, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, - -0x18, -0x18, -0x18, -0x18, -0x18, -0x18, -0x1f, -0x18, -0x18, -0x1f, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, - -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, -0x1f, -0x18, -0x18, -0x1f, -0x18, -0x18, -0x18, -0x18, -0x18, -0x18, - -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, -0x7f, -0x66, -0x66, -0x66, -0x66, -0x66, -0x66, -0x66, -0x66, - -0x66, -0x66, -0x66, -0x66, -0x66, -0x66, -0x66, -0xff, -0x66, -0x66, -0x66, -0x66, -0x66, -0x66, -0x66, -0x66, - -0x18, -0x18, -0x18, -0x18, -0x18, -0x18, -0xff, -0x00, -0x00, -0xff, -0x18, -0x18, -0x18, -0x18, -0x18, -0x18, - -0x18, -0x18, -0x18, -0x18, -0x18, -0x18, -0x18, -0xf8, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, - -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, -0x1f, -0x18, -0x18, -0x18, -0x18, -0x18, -0x18, -0x18, -0x18, - -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, - -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, - -0xf0, -0xf0, -0xf0, -0xf0, -0xf0, -0xf0, -0xf0, -0xf0, -0xf0, -0xf0, -0xf0, -0xf0, -0xf0, -0xf0, -0xf0, -0xf0, - -0x0f, -0x0f, -0x0f, -0x0f, -0x0f, -0x0f, -0x0f, -0x0f, -0x0f, -0x0f, -0x0f, -0x0f, -0x0f, -0x0f, -0x0f, -0x0f, - -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, - -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, -0x77, -0xcc, -0xcc, -0xcc, -0xcc, -0xde, -0x73, -0x00, -0x00, -0x00, - -0x00, -0x7c, -0xc6, -0xc6, -0xc6, -0xc4, -0xc8, -0xc4, -0xc6, -0xc6, -0xc6, -0xc6, -0xdc, -0xc0, -0xc0, -0x00, - -0x00, -0xff, -0x61, -0x60, -0x60, -0x60, -0x60, -0x60, -0x60, -0x60, -0x60, -0x60, -0xf0, -0x00, -0x00, -0x00, - -0x00, -0x00, -0x00, -0x00, -0x01, -0x7e, -0xa4, -0x24, -0x2c, -0x6c, -0x6c, -0x6c, -0x48, -0x00, -0x00, -0x00, - -0x00, -0xff, -0xc1, -0x60, -0x30, -0x18, -0x0c, -0x18, -0x30, -0x60, -0xc0, -0xc1, -0xfe, -0x00, -0x00, -0x00, - -0x00, -0x00, -0x00, -0x00, -0x00, -0x7f, -0xc8, -0xc8, -0xc8, -0xc8, -0xc8, -0xc8, -0x70, -0x00, -0x00, -0x00, - -0x00, -0x00, -0x00, -0x00, -0x00, -0x22, -0x66, -0x66, -0x66, -0x66, -0x66, -0x7c, -0x60, -0x60, -0x60, -0xc0, - -0x00, -0x00, -0x00, -0x00, -0x00, -0x76, -0xdc, -0x18, -0x18, -0x18, -0x18, -0x18, -0x10, -0x00, -0x00, -0x00, - -0x00, -0x38, -0x10, -0x7c, -0xd6, -0xd6, -0xd6, -0xd6, -0xd6, -0xd6, -0x7c, -0x10, -0x38, -0x00, -0x00, -0x00, - -0x00, -0x38, -0x6c, -0xc6, -0xc6, -0xc6, -0xfe, -0xc6, -0xc6, -0xc6, -0xc6, -0x6c, -0x38, -0x00, -0x00, -0x00, - -0x00, -0x3c, -0x66, -0xc3, -0xc3, -0xc3, -0xc3, -0xc3, -0x66, -0x24, -0x24, -0xa5, -0xe7, -0x00, -0x00, -0x00, - -0x00, -0x1e, -0x31, -0x30, -0x18, -0x0c, -0x3e, -0x66, -0x66, -0x66, -0x66, -0x66, -0x3c, -0x00, -0x00, -0x00, - -0x00, -0x00, -0x00, -0x00, -0x6e, -0xff, -0x99, -0x99, -0x99, -0x99, -0xff, -0x76, -0x00, -0x00, -0x00, -0x00, - -0x00, -0x00, -0x00, -0x02, -0x04, -0x7c, -0xca, -0x92, -0xa6, -0x7c, -0x40, -0x80, -0x00, -0x00, -0x00, -0x00, - -0x00, -0x1c, -0x30, -0x60, -0x60, -0x60, -0x7c, -0x60, -0x60, -0x60, -0x60, -0x30, -0x1c, -0x00, -0x00, -0x00, - -0x00, -0x00, -0x7c, -0xc6, -0xc6, -0xc6, -0xc6, -0xc6, -0xc6, -0xc6, -0xc6, -0xc6, -0xc6, -0x00, -0x00, -0x00, - -0x00, -0x00, -0x00, -0xfe, -0x00, -0x00, -0x00, -0x7c, -0x00, -0x00, -0x00, -0xfe, -0x00, -0x00, -0x00, -0x00, - -0x00, -0x00, -0x00, -0x00, -0x18, -0x18, -0x7e, -0x18, -0x18, -0x00, -0x00, -0x7e, -0x00, -0x00, -0x00, -0x00, - -0x00, -0x00, -0x00, -0x30, -0x18, -0x0c, -0x06, -0x0c, -0x18, -0x30, -0x00, -0x7e, -0x00, -0x00, -0x00, -0x00, - -0x00, -0x00, -0x00, -0x0c, -0x18, -0x30, -0x60, -0x30, -0x18, -0x0c, -0x00, -0x7e, -0x00, -0x00, -0x00, -0x00, - -0x00, -0x00, -0x00, -0x0e, -0x19, -0x1b, -0x18, -0x18, -0x18, -0x18, -0x18, -0x18, -0x18, -0x18, -0x18, -0x18, - -0x18, -0x18, -0x18, -0x18, -0x18, -0x18, -0x18, -0x18, -0x18, -0xd8, -0x98, -0x70, -0x00, -0x00, -0x00, -0x00, - -0x00, -0x00, -0x00, -0x00, -0x18, -0x18, -0x00, -0x7e, -0x00, -0x18, -0x18, -0x00, -0x00, -0x00, -0x00, -0x00, - -0x00, -0x00, -0x00, -0x00, -0x00, -0x76, -0xdc, -0x00, -0x00, -0x76, -0xdc, -0x00, -0x00, -0x00, -0x00, -0x00, - -0x00, -0x38, -0x44, -0x44, -0x44, -0x38, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, - -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, -0x18, -0x18, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, - -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, -0x18, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, - -0x00, -0x00, -0x07, -0x06, -0x06, -0x0c, -0x0c, -0x08, -0x98, -0xd0, -0xf0, -0x60, -0x20, -0x00, -0x00, -0x00, - -0x00, -0xcc, -0x76, -0x66, -0x66, -0x66, -0x66, -0xf7, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, - -0x00, -0x70, -0x98, -0x18, -0x30, -0x60, -0x88, -0xf8, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, - -0x00, -0x00, -0x00, -0x00, -0x00, -0x7c, -0x64, -0x64, -0x64, -0x64, -0x64, -0x7c, -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_rl = { - RL_IDX, - "RomanLarge", - 8, - 16, - patterns, - -1 -}; diff --git a/drivers/video/console/fonts.c b/drivers/video/console/fonts.c index 9be83bed1959..4fd07d9eca03 100644 --- a/drivers/video/console/fonts.c +++ b/drivers/video/console/fonts.c @@ -64,10 +64,6 @@ static const struct font_desc *fonts[] = { #undef NO_FONTS &font_mini_4x6, #endif -#ifdef CONFIG_FONT_RL -#undef NO_FONTS - &font_rl, -#endif }; #define num_fonts (sizeof(fonts)/sizeof(*fonts)) diff --git a/include/linux/font.h b/include/linux/font.h index 8aac48c37f3d..53b129f07f6f 100644 --- a/include/linux/font.h +++ b/include/linux/font.h @@ -31,7 +31,6 @@ struct font_desc { #define SUN12x22_IDX 7 #define ACORN8x8_IDX 8 #define MINI4x6_IDX 9 -#define RL_IDX 10 extern const struct font_desc font_vga_8x8, font_vga_8x16, @@ -42,7 +41,6 @@ extern const struct font_desc font_vga_8x8, font_sun_8x16, font_sun_12x22, font_acorn_8x8, - font_rl, font_mini_4x6; /* Find a font with a specific name */ From 44e6f84e3597905816a0440e7218d2ed072120da Mon Sep 17 00:00:00 2001 From: Prakash Punnoor Date: Sat, 12 Nov 2005 09:17:38 +0100 Subject: [PATCH 12/25] [PATCH] fix b2c2 dvb undefined symbol This fixes drivers/built-in.o: In function `flexcop_frontend_init': : undefined reference to `lgdt330x_attach' [ Side note: I really dislike that dvb people want to include every possible frontend into the kernel - I only need the mt312 one for my Skystar2 card. I'd highly appreciate it this would be made selectable again... ] Signed-off-by: Prakash Punnoor Signed-off-by: Linus Torvalds --- drivers/media/dvb/b2c2/Kconfig | 1 + 1 file changed, 1 insertion(+) diff --git a/drivers/media/dvb/b2c2/Kconfig b/drivers/media/dvb/b2c2/Kconfig index d7417eac2aba..2583a865a58e 100644 --- a/drivers/media/dvb/b2c2/Kconfig +++ b/drivers/media/dvb/b2c2/Kconfig @@ -7,6 +7,7 @@ config DVB_B2C2_FLEXCOP select DVB_NXT2002 select DVB_STV0297 select DVB_BCM3510 + select DVB_LGDT330X help Support for the digital TV receiver chip made by B2C2 Inc. included in Technisats PCI cards and USB boxes. From 4f005551a8fac21b6fec8d10d57cd12d373d79e1 Mon Sep 17 00:00:00 2001 From: Dmitry Torokhov Date: Sat, 12 Nov 2005 00:55:15 -0500 Subject: [PATCH 13/25] [PATCH] I8K: fix /proc reporting of blank service tags Make /proc/i8k display '?' when service tag is blank in BIOS. This fixes segfault in i8k gkrellm plugin. Signed-off-by: Dmitry Torokhov Signed-off-by: Linus Torvalds --- drivers/char/i8k.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/drivers/char/i8k.c b/drivers/char/i8k.c index 6c4b3f986d0c..f3c3aaf4560e 100644 --- a/drivers/char/i8k.c +++ b/drivers/char/i8k.c @@ -99,7 +99,9 @@ struct smm_regs { static inline char *i8k_get_dmi_data(int field) { - return dmi_get_system_info(field) ? : "N/A"; + char *dmi_data = dmi_get_system_info(field); + + return dmi_data && *dmi_data ? dmi_data : "?"; } /* @@ -396,7 +398,7 @@ static int i8k_proc_show(struct seq_file *seq, void *offset) return seq_printf(seq, "%s %s %s %d %d %d %d %d %d %d\n", I8K_PROC_FMT, bios_version, - dmi_get_system_info(DMI_PRODUCT_SERIAL) ? : "N/A", + i8k_get_dmi_data(DMI_PRODUCT_SERIAL), cpu_temp, left_fan, right_fan, left_speed, right_speed, ac_power, fn_key); From 535f8d65d808421a6e1730990e39d41885b1f951 Mon Sep 17 00:00:00 2001 From: Christoph Hellwig Date: Sat, 12 Nov 2005 12:10:54 -0800 Subject: [PATCH 14/25] [SPARC]: Fix RTC compat ioctl kernel log spam. On Fri, Nov 11, 2005 at 12:58:40PM -0800, David S. Miller wrote: > > This change: > > diff-tree 8ca2bdc7a98b9584ac5f640761501405154171c7 (from feee207e44d3643d19e648aAuthor: Christoph Hellwig > Date: Wed Nov 9 12:07:18 2005 -0800 > > [SPARC] sbus rtc: implement ->compat_ioctl > > Signed-off-by: Christoph Hellwig > Signed-off-by: David S. Miller > > results in the console now getting spewed on sparc64 systems > with messages like: > > [ 11.968298] ioctl32(hwclock:464): Unknown cmd fd(3) cmd(401c7014){00} arg(efc > What's happening is hwclock tries first the SBUS rtc device ioctls > then the normal rtc driver ones. > > So things actually worked better when we had the SBUS rtc compat ioctl > directly handled via the generic compat ioctl code. > > There are _so_ many rtc drivers in the kernel implementing the > generic rtc ioctls that I don't think putting a ->compat_ioctl > into all of them to fix this problem is feasible. Unless we > write a single rtc_compat_ioctl(), export it to modules, and hook > it into all of those somehow. > > But even that doesn't appear to have any pretty implementation. > > Any better ideas? We had similar problems with other ioctls where userspace did things like that. What we did there was to put the compat handler to generic code. The patch below does that, adding a big comment about what's going on and removing the COMPAT_IOCTL entires for these on powerpc that not only weren't ever useful but are duplicated now aswell. Signed-off-by: Christoph Hellwig Signed-off-by: David S. Miller --- arch/powerpc/kernel/ioctl32.c | 4 ---- drivers/sbus/char/rtc.c | 22 ---------------------- include/linux/compat_ioctl.h | 8 ++++++++ 3 files changed, 8 insertions(+), 26 deletions(-) diff --git a/arch/powerpc/kernel/ioctl32.c b/arch/powerpc/kernel/ioctl32.c index 3fa6a93adbd0..0fa3d27fef01 100644 --- a/arch/powerpc/kernel/ioctl32.c +++ b/arch/powerpc/kernel/ioctl32.c @@ -40,10 +40,6 @@ IOCTL_TABLE_START #define DECLARES #include "compat_ioctl.c" -/* Little p (/dev/rtc, /dev/envctrl, etc.) */ -COMPATIBLE_IOCTL(_IOR('p', 20, int[7])) /* RTCGET */ -COMPATIBLE_IOCTL(_IOW('p', 21, int[7])) /* RTCSET */ - IOCTL_TABLE_END int ioctl_table_size = ARRAY_SIZE(ioctl_start); diff --git a/drivers/sbus/char/rtc.c b/drivers/sbus/char/rtc.c index 5774bdd0e26f..9b988baf0b51 100644 --- a/drivers/sbus/char/rtc.c +++ b/drivers/sbus/char/rtc.c @@ -210,27 +210,6 @@ static int rtc_ioctl(struct inode *inode, struct file *file, unsigned int cmd, } } -static long rtc_compat_ioctl(struct file *file, unsigned int cmd, - unsigned long arg) -{ - int rval = -ENOIOCTLCMD; - - switch (cmd) { - /* - * These two are specific to this driver, the generic rtc ioctls - * are hanlded elsewhere. - */ - case RTCGET: - case RTCSET: - lock_kernel(); - rval = rtc_ioctl(file->f_dentry->d_inode, file, cmd, arg); - unlock_kernel(); - break; - } - - return rval; -} - static int rtc_open(struct inode *inode, struct file *file) { int ret; @@ -258,7 +237,6 @@ static struct file_operations rtc_fops = { .owner = THIS_MODULE, .llseek = no_llseek, .ioctl = rtc_ioctl, - .compat_ioctl = rtc_compat_ioctl, .open = rtc_open, .release = rtc_release, }; diff --git a/include/linux/compat_ioctl.h b/include/linux/compat_ioctl.h index 2209ad3499a3..174f3379e5d9 100644 --- a/include/linux/compat_ioctl.h +++ b/include/linux/compat_ioctl.h @@ -259,6 +259,14 @@ COMPATIBLE_IOCTL(RTC_RD_TIME) COMPATIBLE_IOCTL(RTC_SET_TIME) COMPATIBLE_IOCTL(RTC_WKALM_SET) COMPATIBLE_IOCTL(RTC_WKALM_RD) +/* + * These two are only for the sbus rtc driver, but + * hwclock tries them on every rtc device first when + * running on sparc. On other architectures the entries + * are useless but harmless. + */ +COMPATIBLE_IOCTL(_IOR('p', 20, int[7])) /* RTCGET */ +COMPATIBLE_IOCTL(_IOW('p', 21, int[7])) /* RTCSET */ /* Little m */ COMPATIBLE_IOCTL(MTIOCTOP) /* Socket level stuff */ From 9ffb83bcc5c5337f980dc0576bf13ac9bd4fd33d Mon Sep 17 00:00:00 2001 From: Christoph Hellwig Date: Sat, 12 Nov 2005 12:11:12 -0800 Subject: [PATCH 15/25] [SBUSFB]: implement ->compat_ioctl This patch adds a new function, sbusfb_compat_ioctl() to drivers/video/sbuslib.c and uses it as compat_ioctl in all sbus fb drivers This remove the last per-arch compat ioctl bits in arch/sparc64/kernel/ioctl32.c so it would be nice if people could test if this actually copiles and works and if yes apply it :) Signed-off-by: Christoph Hellwig Signed-off-by: David S. Miller --- arch/sparc64/kernel/ioctl32.c | 92 ----------------------------- drivers/video/bw2.c | 3 + drivers/video/cg14.c | 3 + drivers/video/cg3.c | 3 + drivers/video/cg6.c | 3 + drivers/video/ffb.c | 3 + drivers/video/leo.c | 3 + drivers/video/p9100.c | 3 + drivers/video/sbuslib.c | 107 ++++++++++++++++++++++++++++++++++ drivers/video/sbuslib.h | 2 + drivers/video/tcx.c | 3 + 11 files changed, 133 insertions(+), 92 deletions(-) diff --git a/arch/sparc64/kernel/ioctl32.c b/arch/sparc64/kernel/ioctl32.c index e62214354bb5..196b208665a2 100644 --- a/arch/sparc64/kernel/ioctl32.c +++ b/arch/sparc64/kernel/ioctl32.c @@ -12,86 +12,10 @@ #define INCLUDES #include "compat_ioctl.c" #include -#include - -/* Use this to get at 32-bit user passed pointers. - * See sys_sparc32.c for description about it. - */ -#define A(__x) compat_ptr(__x) #define CODE #include "compat_ioctl.c" -struct fbcmap32 { - int index; /* first element (0 origin) */ - int count; - u32 red; - u32 green; - u32 blue; -}; - -#define FBIOPUTCMAP32 _IOW('F', 3, struct fbcmap32) -#define FBIOGETCMAP32 _IOW('F', 4, struct fbcmap32) - -static int fbiogetputcmap(unsigned int fd, unsigned int cmd, unsigned long arg) -{ - struct fbcmap32 __user *argp = (void __user *)arg; - struct fbcmap __user *p = compat_alloc_user_space(sizeof(*p)); - u32 addr; - int ret; - - ret = copy_in_user(p, argp, 2 * sizeof(int)); - ret |= get_user(addr, &argp->red); - ret |= put_user(compat_ptr(addr), &p->red); - ret |= get_user(addr, &argp->green); - ret |= put_user(compat_ptr(addr), &p->green); - ret |= get_user(addr, &argp->blue); - ret |= put_user(compat_ptr(addr), &p->blue); - if (ret) - return -EFAULT; - return sys_ioctl(fd, (cmd == FBIOPUTCMAP32) ? FBIOPUTCMAP_SPARC : FBIOGETCMAP_SPARC, (unsigned long)p); -} - -struct fbcursor32 { - short set; /* what to set, choose from the list above */ - short enable; /* cursor on/off */ - struct fbcurpos pos; /* cursor position */ - struct fbcurpos hot; /* cursor hot spot */ - struct fbcmap32 cmap; /* color map info */ - struct fbcurpos size; /* cursor bit map size */ - u32 image; /* cursor image bits */ - u32 mask; /* cursor mask bits */ -}; - -#define FBIOSCURSOR32 _IOW('F', 24, struct fbcursor32) -#define FBIOGCURSOR32 _IOW('F', 25, struct fbcursor32) - -static int fbiogscursor(unsigned int fd, unsigned int cmd, unsigned long arg) -{ - struct fbcursor __user *p = compat_alloc_user_space(sizeof(*p)); - struct fbcursor32 __user *argp = (void __user *)arg; - compat_uptr_t addr; - int ret; - - ret = copy_in_user(p, argp, - 2 * sizeof (short) + 2 * sizeof(struct fbcurpos)); - ret |= copy_in_user(&p->size, &argp->size, sizeof(struct fbcurpos)); - ret |= copy_in_user(&p->cmap, &argp->cmap, 2 * sizeof(int)); - ret |= get_user(addr, &argp->cmap.red); - ret |= put_user(compat_ptr(addr), &p->cmap.red); - ret |= get_user(addr, &argp->cmap.green); - ret |= put_user(compat_ptr(addr), &p->cmap.green); - ret |= get_user(addr, &argp->cmap.blue); - ret |= put_user(compat_ptr(addr), &p->cmap.blue); - ret |= get_user(addr, &argp->mask); - ret |= put_user(compat_ptr(addr), &p->mask); - ret |= get_user(addr, &argp->image); - ret |= put_user(compat_ptr(addr), &p->image); - if (ret) - return -EFAULT; - return sys_ioctl (fd, FBIOSCURSOR, (unsigned long)p); -} - #define COMPATIBLE_IOCTL(cmd) HANDLE_IOCTL((cmd),sys_ioctl) #define HANDLE_IOCTL(cmd,handler) { (cmd), (ioctl_trans_handler_t)(handler), NULL }, #define IOCTL_TABLE_START \ @@ -103,22 +27,6 @@ IOCTL_TABLE_START #include #define DECLARES #include "compat_ioctl.c" -COMPATIBLE_IOCTL(FBIOGTYPE) -COMPATIBLE_IOCTL(FBIOSATTR) -COMPATIBLE_IOCTL(FBIOGATTR) -COMPATIBLE_IOCTL(FBIOSVIDEO) -COMPATIBLE_IOCTL(FBIOGVIDEO) -COMPATIBLE_IOCTL(FBIOGCURSOR32) /* This is not implemented yet. Later it should be converted... */ -COMPATIBLE_IOCTL(FBIOSCURPOS) -COMPATIBLE_IOCTL(FBIOGCURPOS) -COMPATIBLE_IOCTL(FBIOGCURMAX) -/* Little k */ -/* Little v, the video4linux ioctls */ -/* And these ioctls need translation */ -/* Note SIOCRTMSG is no longer, so this is safe and * the user would have seen just an -EINVAL anyways. */ -HANDLE_IOCTL(FBIOPUTCMAP32, fbiogetputcmap) -HANDLE_IOCTL(FBIOGETCMAP32, fbiogetputcmap) -HANDLE_IOCTL(FBIOSCURSOR32, fbiogscursor) #if 0 HANDLE_IOCTL(RTC32_IRQP_READ, do_rtc_ioctl) HANDLE_IOCTL(RTC32_IRQP_SET, do_rtc_ioctl) diff --git a/drivers/video/bw2.c b/drivers/video/bw2.c index f53bf3ba1278..d3728f60961e 100644 --- a/drivers/video/bw2.c +++ b/drivers/video/bw2.c @@ -51,6 +51,9 @@ static struct fb_ops bw2_ops = { .fb_imageblit = cfb_imageblit, .fb_mmap = bw2_mmap, .fb_ioctl = bw2_ioctl, +#ifdef CONFIG_COMPAT + .fb_compat_ioctl = sbusfb_compat_ioctl, +#endif }; /* OBio addresses for the bwtwo registers */ diff --git a/drivers/video/cg14.c b/drivers/video/cg14.c index 030d4b13b1c2..1bed50f2a276 100644 --- a/drivers/video/cg14.c +++ b/drivers/video/cg14.c @@ -49,6 +49,9 @@ static struct fb_ops cg14_ops = { .fb_imageblit = cfb_imageblit, .fb_mmap = cg14_mmap, .fb_ioctl = cg14_ioctl, +#ifdef CONFIG_COMPAT + .fb_compat_ioctl = sbusfb_compat_ioctl, +#endif }; #define CG14_MCR_INTENABLE_SHIFT 7 diff --git a/drivers/video/cg3.c b/drivers/video/cg3.c index b94eee8c42d5..a1354e7e0513 100644 --- a/drivers/video/cg3.c +++ b/drivers/video/cg3.c @@ -50,6 +50,9 @@ static struct fb_ops cg3_ops = { .fb_imageblit = cfb_imageblit, .fb_mmap = cg3_mmap, .fb_ioctl = cg3_ioctl, +#ifdef CONFIG_COMPAT + .fb_compat_ioctl = sbusfb_compat_ioctl, +#endif }; diff --git a/drivers/video/cg6.c b/drivers/video/cg6.c index 414c4409e924..9debe642fd2f 100644 --- a/drivers/video/cg6.c +++ b/drivers/video/cg6.c @@ -54,6 +54,9 @@ static struct fb_ops cg6_ops = { .fb_sync = cg6_sync, .fb_mmap = cg6_mmap, .fb_ioctl = cg6_ioctl, +#ifdef CONFIG_COMPAT + .fb_compat_ioctl = sbusfb_compat_ioctl, +#endif }; /* Offset of interesting structures in the OBIO space */ diff --git a/drivers/video/ffb.c b/drivers/video/ffb.c index 04417dc16c2e..2584daec7bbf 100644 --- a/drivers/video/ffb.c +++ b/drivers/video/ffb.c @@ -57,6 +57,9 @@ static struct fb_ops ffb_ops = { .fb_sync = ffb_sync, .fb_mmap = ffb_mmap, .fb_ioctl = ffb_ioctl, +#ifdef CONFIG_COMPAT + .fb_compat_ioctl = sbusfb_compat_ioctl, +#endif }; /* Register layout and definitions */ diff --git a/drivers/video/leo.c b/drivers/video/leo.c index 84a7fe435bb8..376d4a171ec7 100644 --- a/drivers/video/leo.c +++ b/drivers/video/leo.c @@ -51,6 +51,9 @@ static struct fb_ops leo_ops = { .fb_imageblit = cfb_imageblit, .fb_mmap = leo_mmap, .fb_ioctl = leo_ioctl, +#ifdef CONFIG_COMPAT + .fb_compat_ioctl = sbusfb_compat_ioctl, +#endif }; #define LEO_OFF_LC_SS0_KRN 0x00200000UL diff --git a/drivers/video/p9100.c b/drivers/video/p9100.c index 9aaf65fb623a..18bcda23d2cf 100644 --- a/drivers/video/p9100.c +++ b/drivers/video/p9100.c @@ -48,6 +48,9 @@ static struct fb_ops p9100_ops = { .fb_imageblit = cfb_imageblit, .fb_mmap = p9100_mmap, .fb_ioctl = p9100_ioctl, +#ifdef CONFIG_COMPAT + .fb_compat_ioctl = sbusfb_compat_ioctl, +#endif }; /* P9100 control registers */ diff --git a/drivers/video/sbuslib.c b/drivers/video/sbuslib.c index 34f72edba820..646c43f921c5 100644 --- a/drivers/video/sbuslib.c +++ b/drivers/video/sbuslib.c @@ -3,6 +3,7 @@ * Copyright (C) 2003 David S. Miller (davem@redhat.com) */ +#include #include #include #include @@ -182,3 +183,109 @@ int sbusfb_ioctl_helper(unsigned long cmd, unsigned long arg, }; } EXPORT_SYMBOL(sbusfb_ioctl_helper); + +#ifdef CONFIG_COMPAT +struct fbcmap32 { + int index; /* first element (0 origin) */ + int count; + u32 red; + u32 green; + u32 blue; +}; + +#define FBIOPUTCMAP32 _IOW('F', 3, struct fbcmap32) +#define FBIOGETCMAP32 _IOW('F', 4, struct fbcmap32) + +static int fbiogetputcmap(struct file *file, struct fb_info *info, + unsigned int cmd, unsigned long arg) +{ + struct fbcmap32 __user *argp = (void __user *)arg; + struct fbcmap __user *p = compat_alloc_user_space(sizeof(*p)); + u32 addr; + int ret; + + ret = copy_in_user(p, argp, 2 * sizeof(int)); + ret |= get_user(addr, &argp->red); + ret |= put_user(compat_ptr(addr), &p->red); + ret |= get_user(addr, &argp->green); + ret |= put_user(compat_ptr(addr), &p->green); + ret |= get_user(addr, &argp->blue); + ret |= put_user(compat_ptr(addr), &p->blue); + if (ret) + return -EFAULT; + return info->fbops->fb_ioctl(file->f_dentry->d_inode, file, + (cmd == FBIOPUTCMAP32) ? + FBIOPUTCMAP_SPARC : FBIOGETCMAP_SPARC, + (unsigned long)p, info); +} + +struct fbcursor32 { + short set; /* what to set, choose from the list above */ + short enable; /* cursor on/off */ + struct fbcurpos pos; /* cursor position */ + struct fbcurpos hot; /* cursor hot spot */ + struct fbcmap32 cmap; /* color map info */ + struct fbcurpos size; /* cursor bit map size */ + u32 image; /* cursor image bits */ + u32 mask; /* cursor mask bits */ +}; + +#define FBIOSCURSOR32 _IOW('F', 24, struct fbcursor32) +#define FBIOGCURSOR32 _IOW('F', 25, struct fbcursor32) + +static int fbiogscursor(struct file *file, struct fb_info *info, + unsigned long arg) +{ + struct fbcursor __user *p = compat_alloc_user_space(sizeof(*p)); + struct fbcursor32 __user *argp = (void __user *)arg; + compat_uptr_t addr; + int ret; + + ret = copy_in_user(p, argp, + 2 * sizeof (short) + 2 * sizeof(struct fbcurpos)); + ret |= copy_in_user(&p->size, &argp->size, sizeof(struct fbcurpos)); + ret |= copy_in_user(&p->cmap, &argp->cmap, 2 * sizeof(int)); + ret |= get_user(addr, &argp->cmap.red); + ret |= put_user(compat_ptr(addr), &p->cmap.red); + ret |= get_user(addr, &argp->cmap.green); + ret |= put_user(compat_ptr(addr), &p->cmap.green); + ret |= get_user(addr, &argp->cmap.blue); + ret |= put_user(compat_ptr(addr), &p->cmap.blue); + ret |= get_user(addr, &argp->mask); + ret |= put_user(compat_ptr(addr), &p->mask); + ret |= get_user(addr, &argp->image); + ret |= put_user(compat_ptr(addr), &p->image); + if (ret) + return -EFAULT; + return info->fbops->fb_ioctl(file->f_dentry->d_inode, file, + FBIOSCURSOR, (unsigned long)p, info); +} + +long sbusfb_compat_ioctl(struct file *file, unsigned int cmd, + unsigned long arg, struct fb_info *info) +{ + switch (cmd) { + case FBIOGTYPE: + case FBIOSATTR: + case FBIOGATTR: + case FBIOSVIDEO: + case FBIOGVIDEO: + case FBIOGCURSOR32: /* This is not implemented yet. + Later it should be converted... */ + case FBIOSCURPOS: + case FBIOGCURPOS: + case FBIOGCURMAX: + return info->fbops->fb_ioctl(file->f_dentry->d_inode, + file, cmd, arg, info); + case FBIOPUTCMAP32: + return fbiogetputcmap(file, info, cmd, arg); + case FBIOGETCMAP32: + return fbiogetputcmap(file, info, cmd, arg); + case FBIOSCURSOR32: + return fbiogscursor(file, info, arg); + default: + return -ENOIOCTLCMD; + } +} +EXPORT_SYMBOL(sbusfb_compat_ioctl); +#endif diff --git a/drivers/video/sbuslib.h b/drivers/video/sbuslib.h index a6aa33ba09d6..b470e52ce9e2 100644 --- a/drivers/video/sbuslib.h +++ b/drivers/video/sbuslib.h @@ -20,5 +20,7 @@ extern int sbusfb_mmap_helper(struct sbus_mmap_map *map, int sbusfb_ioctl_helper(unsigned long cmd, unsigned long arg, struct fb_info *info, int type, int fb_depth, unsigned long fb_size); +long sbusfb_compat_ioctl(struct file *file, unsigned int cmd, + unsigned long arg, struct fb_info *info); #endif /* _SBUSLIB_H */ diff --git a/drivers/video/tcx.c b/drivers/video/tcx.c index 59fff29bc02e..fe4f63f3849d 100644 --- a/drivers/video/tcx.c +++ b/drivers/video/tcx.c @@ -52,6 +52,9 @@ static struct fb_ops tcx_ops = { .fb_imageblit = cfb_imageblit, .fb_mmap = tcx_mmap, .fb_ioctl = tcx_ioctl, +#ifdef CONFIG_COMPAT + .fb_compat_ioctl = sbusfb_compat_ioctl, +#endif }; /* THC definitions */ From efacfbcb6c88677809f44a574fbcd9824835dccb Mon Sep 17 00:00:00 2001 From: Herbert Xu Date: Sat, 12 Nov 2005 12:12:05 -0800 Subject: [PATCH 16/25] [IPV6]: Fix rtnetlink dump infinite loop The recent change to netlink dump "done" callback handling broke IPv6 which played dirty tricks with the "done" callback. This causes an infinite loop during a dump. The following patch fixes it. This bug was reported by Jeff Garzik. Signed-off-by: Herbert Xu Signed-off-by: David S. Miller --- net/ipv6/route.c | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/net/ipv6/route.c b/net/ipv6/route.c index f7f42c3e96cb..a7a537b50595 100644 --- a/net/ipv6/route.c +++ b/net/ipv6/route.c @@ -1701,10 +1701,8 @@ static void fib6_dump_end(struct netlink_callback *cb) fib6_walker_unlink(w); kfree(w); } - if (cb->args[1]) { - cb->done = (void*)cb->args[1]; - cb->args[1] = 0; - } + cb->done = (void*)cb->args[1]; + cb->args[1] = 0; } static int fib6_dump_done(struct netlink_callback *cb) From a2d7222f0f5861ce13b9308c30bd18f28ebeb583 Mon Sep 17 00:00:00 2001 From: Vlad Drukker Date: Sat, 12 Nov 2005 12:13:14 -0800 Subject: [PATCH 17/25] [NETFILTER] {ip,nf}_conntrack TCP: Accept SYN+PUSH like SYN Some devices (e.g. Qlogic iSCSI HBA hardware like QLA4010 up to firmware 3.0.0.4) initiates TCP with SYN and PUSH flags set. The Linux TCP/IP stack deals fine with that, but the connection tracking code doesn't. This patch alters TCP connection tracking to accept SYN+PUSH as a valid flag combination. Signed-off-by: Vlad Drukker Signed-off-by: Harald Welte Signed-off-by: David S. Miller --- net/ipv4/netfilter/ip_conntrack_proto_tcp.c | 1 + net/netfilter/nf_conntrack_proto_tcp.c | 1 + 2 files changed, 2 insertions(+) diff --git a/net/ipv4/netfilter/ip_conntrack_proto_tcp.c b/net/ipv4/netfilter/ip_conntrack_proto_tcp.c index 468c6003b4c7..5b3f5220f289 100644 --- a/net/ipv4/netfilter/ip_conntrack_proto_tcp.c +++ b/net/ipv4/netfilter/ip_conntrack_proto_tcp.c @@ -814,6 +814,7 @@ static u8 tcp_valid_flags[(TH_FIN|TH_SYN|TH_RST|TH_PUSH|TH_ACK|TH_URG) + 1] = { [TH_SYN] = 1, [TH_SYN|TH_ACK] = 1, + [TH_SYN|TH_PUSH] = 1, [TH_SYN|TH_ACK|TH_PUSH] = 1, [TH_RST] = 1, [TH_RST|TH_ACK] = 1, diff --git a/net/netfilter/nf_conntrack_proto_tcp.c b/net/netfilter/nf_conntrack_proto_tcp.c index 83d90dd624f0..156680ddb042 100644 --- a/net/netfilter/nf_conntrack_proto_tcp.c +++ b/net/netfilter/nf_conntrack_proto_tcp.c @@ -779,6 +779,7 @@ static u8 tcp_valid_flags[(TH_FIN|TH_SYN|TH_RST|TH_PUSH|TH_ACK|TH_URG) + 1] = { [TH_SYN] = 1, [TH_SYN|TH_ACK] = 1, + [TH_SYN|TH_PUSH] = 1, [TH_SYN|TH_ACK|TH_PUSH] = 1, [TH_RST] = 1, [TH_RST|TH_ACK] = 1, From 8225ccbaf01b459cf1e462047a51b2851e756bc1 Mon Sep 17 00:00:00 2001 From: Thomas Graf Date: Sat, 12 Nov 2005 12:15:16 -0800 Subject: [PATCH 18/25] [IPV6]: Fix unnecessary GFP_ATOMIC allocation in fib6 dump Signed-off-by: Thomas Graf Signed-off-by: David S. Miller --- net/ipv6/route.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/net/ipv6/route.c b/net/ipv6/route.c index a7a537b50595..9a71a8d1078a 100644 --- a/net/ipv6/route.c +++ b/net/ipv6/route.c @@ -1732,7 +1732,7 @@ int inet6_dump_fib(struct sk_buff *skb, struct netlink_callback *cb) /* * 2. allocate and initialize walker. */ - w = kmalloc(sizeof(*w), GFP_ATOMIC); + w = kmalloc(sizeof(*w), GFP_KERNEL); if (w == NULL) return -ENOMEM; RT6_TRACE("dump<%p", w); From e9c05afa80ba9368ec5f78d493b17a8f836ef508 Mon Sep 17 00:00:00 2001 From: Tejun Heo Date: Mon, 14 Nov 2005 00:24:18 +0900 Subject: [PATCH 19/25] [PATCH] sil24: add missing ata_pad_free() sil24_port_stop() is missing call to ata_pad_free() thus leaking pad buffer when a port is stopped. This patch adds it. Signed-off-by: Tejun Heo Signed-off-by: Jeff Garzik --- drivers/scsi/sata_sil24.c | 1 + 1 file changed, 1 insertion(+) diff --git a/drivers/scsi/sata_sil24.c b/drivers/scsi/sata_sil24.c index d3198d9a72c1..55e744d6db88 100644 --- a/drivers/scsi/sata_sil24.c +++ b/drivers/scsi/sata_sil24.c @@ -687,6 +687,7 @@ static void sil24_port_stop(struct ata_port *ap) struct sil24_port_priv *pp = ap->private_data; sil24_cblk_free(pp, dev); + ata_pad_free(ap, dev); kfree(pp); } From dc15ae14e97ee9d5ed740cbb0b94996076d8b37e Mon Sep 17 00:00:00 2001 From: "J. Bruce Fields" Date: Thu, 10 Nov 2005 19:08:00 -0500 Subject: [PATCH 20/25] [PATCH] VFS: Fix memory leak with file leases The patch http://linux.bkbits.net:8080/linux-2.6/diffs/fs/locks.c@1.70??nav=index.html introduced a pretty nasty memory leak in the lease code. When freeing the lease, the code in locks_delete_lock() will correctly clean up the fasync queue, but when we return to fcntl_setlease(), the freed fasync entry will be reinstated. This patch ensures that we skip the call to fasync_helper() when we're freeing up the lease. Signed-off-by: J. Bruce Fields Signed-off-by: Trond Myklebust --- fs/locks.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fs/locks.c b/fs/locks.c index a1e8b2248014..600d1fbe3571 100644 --- a/fs/locks.c +++ b/fs/locks.c @@ -1430,7 +1430,7 @@ int fcntl_setlease(unsigned int fd, struct file *filp, long arg) lock_kernel(); error = __setlease(filp, arg, &flp); - if (error) + if (error || arg == F_UNLCK) goto out_unlock; error = fasync_helper(fd, filp, 1, &flp->fl_fasync); From f3a9388e4ebea57583272007311fffa26ebbb305 Mon Sep 17 00:00:00 2001 From: Chris Wright Date: Fri, 11 Nov 2005 17:20:14 -0800 Subject: [PATCH 21/25] [PATCH] VFS: local denial-of-service with file leases Remove time_out_leases() printk that's easily triggered by users. Signed-off-by: Chris Wright Signed-off-by: Trond Myklebust --- fs/locks.c | 1 - 1 file changed, 1 deletion(-) diff --git a/fs/locks.c b/fs/locks.c index 600d1fbe3571..250ef53d25ef 100644 --- a/fs/locks.c +++ b/fs/locks.c @@ -1105,7 +1105,6 @@ static void time_out_leases(struct inode *inode) before = &fl->fl_next; continue; } - printk(KERN_INFO "lease broken - owner pid = %d\n", fl->fl_pid); lease_modify(before, fl->fl_type & ~F_INPROGRESS); if (fl == *before) /* lease_modify may have freed fl */ before = &fl->fl_next; From ef63d0049a28008c133e83743681c66e8b0872be Mon Sep 17 00:00:00 2001 From: Sean Young Date: Wed, 9 Nov 2005 00:12:50 +0000 Subject: [PATCH 22/25] [MTD] maps: Replace dependency on non existing config option CONFIG_ELAN doesn't exist any more; CONFIG_X86_ELAN is too specific so make ts-5500 memory map dependant on CONFIG_X86. Signed-off-by: Sean Young Signed-off-by: Thomas Gleixner --- drivers/mtd/maps/Kconfig | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/mtd/maps/Kconfig b/drivers/mtd/maps/Kconfig index 48638c8097a5..846a533323a8 100644 --- a/drivers/mtd/maps/Kconfig +++ b/drivers/mtd/maps/Kconfig @@ -94,7 +94,7 @@ config MTD_NETSC520 config MTD_TS5500 tristate "JEDEC Flash device mapped on Technologic Systems TS-5500" - depends on ELAN + depends on X86 select MTD_PARTITIONS select MTD_JEDECPROBE select MTD_CFI_AMDSTD From 5b9d1f19a7d6f13a97ac3eea9a1caea011ebd0ae Mon Sep 17 00:00:00 2001 From: Thomas Gleixner Date: Sun, 13 Nov 2005 19:33:24 +0100 Subject: [PATCH 23/25] [JFFS2] Remove broken and useless debug code Signed-off-by: Thomas Gleixner --- fs/jffs2/scan.c | 3 --- 1 file changed, 3 deletions(-) diff --git a/fs/jffs2/scan.c b/fs/jffs2/scan.c index 0e7456ec99fd..3e51dd1da8aa 100644 --- a/fs/jffs2/scan.c +++ b/fs/jffs2/scan.c @@ -284,9 +284,6 @@ int jffs2_fill_scan_buf (struct jffs2_sb_info *c, void *buf, D1(printk(KERN_WARNING "Read at 0x%x gave only 0x%zx bytes\n", ofs, retlen)); return -EIO; } - D2(printk(KERN_DEBUG "Read 0x%x bytes from 0x%08x into buf\n", len, ofs)); - D2(printk(KERN_DEBUG "000: %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x\n", - buf[0], buf[1], buf[2], buf[3], buf[4], buf[5], buf[6], buf[7], buf[8], buf[9], buf[10], buf[11], buf[12], buf[13], buf[14], buf[15])); return 0; } From e12a1be6e8fa47ae6cdc4127a1b4640e19c288eb Mon Sep 17 00:00:00 2001 From: Mark Lord Date: Sat, 12 Nov 2005 18:55:45 -0500 Subject: [PATCH 24/25] [PATCH] libata: fix comments on ata_tf_from_fis() Fix description on comments for ata_tf_from_fis(). Signed-off-by: Mark Lord Signed-off-by: Jeff Garzik --- drivers/scsi/libata-core.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/drivers/scsi/libata-core.c b/drivers/scsi/libata-core.c index e51d9a8a2796..d81db3a3d4b9 100644 --- a/drivers/scsi/libata-core.c +++ b/drivers/scsi/libata-core.c @@ -532,8 +532,7 @@ void ata_tf_to_fis(const struct ata_taskfile *tf, u8 *fis, u8 pmp) * @fis: Buffer from which data will be input * @tf: Taskfile to output * - * Converts a standard ATA taskfile to a Serial ATA - * FIS structure (Register - Host to Device). + * Converts a serial ATA FIS structure to a standard ATA taskfile. * * LOCKING: * Inherited from caller. From dcc2d1e7f0acf7d3f7ae632a73cd5f828ef9de20 Mon Sep 17 00:00:00 2001 From: Mark Lord Date: Sun, 13 Nov 2005 16:22:06 -0500 Subject: [PATCH 25/25] [libata passthru] address slave devices correctly --- drivers/scsi/libata-scsi.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/drivers/scsi/libata-scsi.c b/drivers/scsi/libata-scsi.c index 261be24e1df3..0df4b682965d 100644 --- a/drivers/scsi/libata-scsi.c +++ b/drivers/scsi/libata-scsi.c @@ -2276,6 +2276,12 @@ ata_scsi_pass_thru(struct ata_queued_cmd *qc, const u8 *scsicmd) tf->device = scsicmd[8]; tf->command = scsicmd[9]; } + /* + * If slave is possible, enforce correct master/slave bit + */ + if (qc->ap->flags & ATA_FLAG_SLAVE_POSS) + tf->device = qc->dev->devno ? + tf->device | ATA_DEV1 : tf->device & ~ATA_DEV1; /* * Filter SET_FEATURES - XFER MODE command -- otherwise,