3.4.91-stable review
Greg Kroah-Hartman
maintainercover 3.4.91-stable review
This is the start of the stable review cycle for the 3.4.91 release. There are 9 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Sun May 18 22:54:50 UTC 2014. Anything received after that time might be too late.
The whole patch series can be found in one patch at:
kernel.org/pub/linux/kernel/v3.0/stable-review/patch-3.4.91-rc1.gz
and the diffstat can be found below.
thanks,
greg k-h
-------------
Pseudo-Shortlog of commits:
Greg Kroah-Hartman <[email protected]>
Linux 3.4.91-rc1
Mikulas Patocka <[email protected]>
tgafb: fix mode setting with fbset
Andreas Schwab <[email protected]>
powerpc: Add vr save/restore functions
Steven Rostedt (Red Hat) <[email protected]>
tracepoint: Do not waste memory on mods with no tracepoints
Thomas Graf <[email protected]>
netfilter: Can't fail and free after table replacement
Joe Perches <[email protected]>
net: Add net_ratelimited_function and net_<level>_ratelimited macros
Andrey Vagin <[email protected]>
netfilter: nf_conntrack: reserve two bytes for nf_ct_ext->len
Roman Pen <[email protected]>
blktrace: fix accounting of partially completed requests
Peter Hurley <[email protected]>
n_tty: Fix n_tty_write crash when echoing in raw mode
Dan Carpenter <[email protected]>
SCSI: megaraid: missing bounds check in mimd_to_kioc()
-------------
Diffstat:
Makefile | 4 +- arch/powerpc/lib/crtsavres.S | 186 ++++++++++++++++++++++++++++ block/blk-core.c | 2 +- drivers/scsi/megaraid/megaraid_mm.c | 2 + drivers/tty/n_tty.c | 2 + drivers/video/tgafb.c | 15 ++- include/linux/net.h | 23 ++++ include/net/netfilter/nf_conntrack_extend.h | 4 +- include/trace/events/block.h | 33 ++++- kernel/trace/blktrace.c | 20 +-- kernel/tracepoint.c | 6 + net/bridge/netfilter/ebtables.c | 5 +- net/ipv4/netfilter/arp_tables.c | 6 +- net/ipv4/netfilter/ip_tables.c | 6 +- net/ipv6/netfilter/ip6_tables.c | 6 +- scripts/mod/modpost.c | 8 +- 16 files changed, 297 insertions(+), 31 deletions(-)
Greg Kroah-Hartman
maintainerPATCH 1/9 SCSI: megaraid: missing bounds check in mimd_to_kioc()
3.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Dan Carpenter <[email protected]>
commit 3de2260140417759c669d391613d583baf03b0cf upstream.
pthru32->dataxferlen comes from the user so we need to check that it's not too large so we don't overflow the buffer.
--- drivers/scsi/megaraid/megaraid_mm.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/scsi/megaraid/megaraid_mm.c +2 -0
@@ -486,6 +486,8 @@ mimd_to_kioc(mimd_t __user *umimd, mraid pthru32->dataxferaddr = kioc->buf_paddr;if (kioc->data_dir &UIOC_WR ) { +if (pthru32->dataxferlen > kioc->xferlen) +return -EINVAL ;if (copy_from_user (kioc->buf_vaddr, kioc->user_data, pthru32->dataxferlen)) {return (-EFAULT );
Greg Kroah-Hartman
maintainerPATCH 2/9 n_tty: Fix n_tty_write crash when echoing in raw mode
In reply to Greg Kroah-Hartman3.4-stable review patch. If anyone has any objections, please let me know.
------------------
commit 4291086b1f081b869c6d79e5b7441633dc3ace00 upstream.
The tty atomic_write_lock does not provide an exclusion guarantee for the tty driver if the termios settings are LECHO & !OPOST. And since it is unexpected and not allowed to call TTY buffer helpers like tty_insert_flip_string concurrently, this may lead to crashes when concurrect writers call pty_write. In that case the following two writers:
* the ECHOing from a workqueue and
* pty_write from the process
race and can overflow the corresponding TTY buffer like follows.
If we look into tty_insert_flip_string_fixed_flag, there is:
int space = __tty_buffer_request_room(port, goal, flags); struct tty_buffer *tb = port->buf.tail;
...
memcpy(char_buf_ptr(tb, tb->used), chars, space);
...
tb->used += space;
so the race of the two can result in something like this:
A B__tty_buffer_request_room
__tty_buffer_request_roommemcpy(buf(tb->used), ...)
tb->used += space;
memcpy(buf(tb->used), ...) ->BOOMB's memcpy is past the tty_buffer due to the previous A's tb->used increment.
Since the N_TTY line discipline input processing can output concurrently with a tty write, obtain the N_TTY ldisc output_lock to serialize echo output with normal tty writes. This ensures the tty buffer helper tty_insert_flip_string is not called concurrently and everything is fine.
Note that this is nicely reproducible by an ordinary user using forkpty and some setup around that (raw termios + ECHO). And it is present in kernels at least after commit d945cb9cce20ac7143c2de8d88b187f62db99bdc (pty: Rework the pty layer to use the normal buffering logic) in 2.6.31-rc3.
js: add more info to the commit log
js: switch to bool
js: lock unconditionally
js: lock only the tty->ops->write call
References: CVE-2014-0196
--- drivers/tty/n_tty.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/tty/n_tty.c +2 -0
@@ -1996,7 +1996,9 @@ static ssize_t n_tty_write(struct tty_st tty->ops->flush_chars (tty); }else {while (nr >0 ) { +mutex_lock (&tty->output_lock); c = tty->ops->write (tty, b, nr); +mutex_unlock (&tty->output_lock);if (c <0 ) { retval = c; goto break_out;
Greg Kroah-Hartman
maintainerPATCH 3/9 blktrace: fix accounting of partially completed requests
In reply to Greg Kroah-Hartman3.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Roman Pen <[email protected]>
commit af5040da01ef980670b3741b3e10733ee3e33566 upstream.
trace_block_rq_complete does not take into account that request can be partially completed, so we can get the following incorrect output of blkparser:
C R 232 + 240 [0] C R 240 + 232 [0] C R 248 + 224 [0] C R 256 + 216 [0]
but should be:
C R 232 + 8 [0] C R 240 + 8 [0] C R 248 + 8 [0] C R 256 + 8 [0]
Also, the whole output summary statistics of completed requests and final throughput will be incorrect.
This patch takes into account real completion size of the request and fixes wrong completion accounting.
--- block/blk-core.c | 2 +- include/trace/events/block.h | 33 ++++++++++++++++++++++++++++++--- kernel/trace/blktrace.c | 20 +++++++++++--------- 3 files changed, 42 insertions(+), 13 deletions(-)
block/blk-core.c +1 -1
@@ -2104,7 +2104,7 @@ bool blk_update_request(struct request *if (!req->bio)return false; -trace_block_rq_complete (req->q, req); +trace_block_rq_complete (req->q, req, nr_bytes);/* * For fs requests, rq is just carrier of independent bio's
include/trace/events/block.h +30 -3
@@ -81,6 +81,7 @@ DEFINE_EVENT(block_rq_with_error, block_* block_rq_complete - block IO operation completed by device driver * @q: queue containing the block operation request * @rq: block operations request +* @nr_bytes: number of completed bytes * * The block_rq_complete tracepoint event indicates that some portion * of operation request has been completed by the device driver. If
@@ -88,11 +89,37 @@ DEFINE_EVENT(block_rq_with_error, block_* do for the request. If @rq->bio is non-NULL then there is * additional work required to complete the request. */ -DEFINE_EVENT (block_rq_with_error, block_rq_complete, +TRACE_EVENT (block_rq_complete, - TP_PROTO(struct request_queue *q, struct request *rq), + TP_PROTO(struct request_queue *q, struct request *rq, + unsigned int nr_bytes), -TP_ARGS (q, rq) +TP_ARGS (q, rq, nr_bytes), + +TP_STRUCT__entry ( + __field( dev_t, dev ) + __field( sector_t, sector ) + __field( unsigned int, nr_sector ) + __field( int, errors ) + __array( char, rwbs, RWBS_LEN ) +__dynamic_array ( char, cmd,blk_cmd_buf_len (rq) ) + ), + +TP_fast_assign ( + __entry->dev = rq->rq_disk ? disk_devt(rq->rq_disk) : 0; + __entry->sector = blk_rq_pos(rq); + __entry->nr_sector = nr_bytes >> 9; + __entry->errors = rq->errors; + + blk_fill_rwbs(__entry->rwbs, rq->cmd_flags, nr_bytes); + blk_dump_cmd(__get_str(cmd), rq); + ), + +TP_printk ("%d,%d %s (%s) %llu + %u [%d]" , +MAJOR (__entry->dev),MINOR (__entry->dev), + __entry->rwbs,__get_str (cmd), + (unsigned long long )__entry->sector, + __entry->nr_sector, __entry->errors) ); DECLARE_EVENT_CLASS(block_rq,
kernel/trace/blktrace.c +11 -9
@@ -685,6 +685,7 @@ void blk_trace_shutdown(struct request_q* blk_add_trace_rq - Add a trace for a request oriented action * @q: queue the io is for * @rq: the source request +* @nr_bytes: number of completed bytes * @what: the action * * Description:
@@ -692,7 +693,7 @@ void blk_trace_shutdown(struct request_q* **/ static void blk_add_trace_rq (struct request_queue *q,struct request *rq, -u32 what) +unsigned int nr_bytes,u32 what) {struct blk_trace *bt = q->blk_trace;
@@ -701,11 +702,11 @@ static void blk_add_trace_rq(struct requif (rq->cmd_type ==REQ_TYPE_BLOCK_PC ) { what |=BLK_TC_ACT (BLK_TC_PC ); -__blk_add_trace (bt,0 ,blk_rq_bytes (rq), rq->cmd_flags, +__blk_add_trace (bt,0 , nr_bytes, rq->cmd_flags, what, rq->errors, rq->cmd_len, rq->cmd); }else { what |=BLK_TC_ACT (BLK_TC_FS ); -__blk_add_trace (bt,blk_rq_pos (rq),blk_rq_bytes (rq), +__blk_add_trace (bt,blk_rq_pos (rq), nr_bytes, rq->cmd_flags, what, rq->errors,0 ,NULL ); } }
@@ -713,33 +714,34 @@ static void blk_add_trace_rq(struct requstatic void blk_add_trace_rq_abort (void *ignore,struct request_queue *q,struct request *rq) { -blk_add_trace_rq (q, rq,BLK_TA_ABORT ); +blk_add_trace_rq (q, rq,blk_rq_bytes (rq),BLK_TA_ABORT ); }static void blk_add_trace_rq_insert (void *ignore,struct request_queue *q,struct request *rq) { -blk_add_trace_rq (q, rq,BLK_TA_INSERT ); +blk_add_trace_rq (q, rq,blk_rq_bytes (rq),BLK_TA_INSERT ); }static void blk_add_trace_rq_issue (void *ignore,struct request_queue *q,struct request *rq) { -blk_add_trace_rq (q, rq,BLK_TA_ISSUE ); +blk_add_trace_rq (q, rq,blk_rq_bytes (rq),BLK_TA_ISSUE ); }static void blk_add_trace_rq_requeue (void *ignore,struct request_queue *q,struct request *rq) { -blk_add_trace_rq (q, rq,BLK_TA_REQUEUE ); +blk_add_trace_rq (q, rq,blk_rq_bytes (rq),BLK_TA_REQUEUE ); }static void blk_add_trace_rq_complete (void *ignore,struct request_queue *q, -struct request *rq) +struct request *rq, +unsigned int nr_bytes) { -blk_add_trace_rq (q, rq,BLK_TA_COMPLETE ); +blk_add_trace_rq (q, rq, nr_bytes,BLK_TA_COMPLETE ); }/**
Greg Kroah-Hartman
maintainerPATCH 4/9 netfilter: nf_conntrack: reserve two bytes for nf_ct_ext->len
In reply to Greg Kroah-Hartman3.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Andrey Vagin <[email protected]>
commit 223b02d923ecd7c84cf9780bb3686f455d279279 upstream.
"len" contains sizeof(nf_ct_ext) and size of extensions. In a worst case it can contain all extensions. Bellow you can find sizes for all types of extensions. Their sum is definitely bigger than 256.
nf_ct_ext_types[0]->len = 24
nf_ct_ext_types[1]->len = 32
nf_ct_ext_types[2]->len = 24
nf_ct_ext_types[3]->len = 32
nf_ct_ext_types[4]->len = 152
nf_ct_ext_types[5]->len = 2
nf_ct_ext_types[6]->len = 16
nf_ct_ext_types[7]->len = 8
I have seen "len" up to 280 and my host has crashes w/o this patch.
The right way to fix this problem is reducing the size of the ecache extension (4) and Florian is going to do this, but these changes will be quite large to be appropriate for a stable tree.
--- include/net/netfilter/nf_conntrack_extend.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
include/net/netfilter/nf_conntrack_extend.h +2 -2
@@ -37,8 +37,8 @@ enum nf_ct_ext_id {/* Extensions: optional stuff which isn't permanently in struct. */ struct nf_ct_ext {struct rcu_head rcu; -u8 offset[NF_CT_EXT_NUM ]; -u8 len; +u16 offset[NF_CT_EXT_NUM ]; +u16 len;char data[0 ]; };
Greg Kroah-Hartman
maintainerPATCH 5/9 net: Add net_ratelimited_function and net_<level>_ratelimited macros
In reply to Greg Kroah-Hartman3.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Joe Perches <[email protected]>
commit 3a3bfb61e64476ff1e4ac3122cb6dec9c79b795c upstream.
__ratelimit() can be considered an inverted bool test because it returns true when not ratelimited. Several tests in the kernel tree use this __ratelimit() function incorrectly.
No net_ratelimit uses are incorrect currently though.
Most uses of net_ratelimit are to log something via printk or pr_<level>.
In order to minimize the uses of net_ratelimit, and to start standardizing the code style used for __ratelimit() and net_ratelimit(), add a net_ratelimited_function() macro and net_<level>_ratelimited() logging macros similar to pr_<level>_ratelimited that use the global net_ratelimit instead of a static per call site "struct ratelimit_state".
--- include/linux/net.h | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+)
include/linux/net.h +23 -0
@@ -259,6 +259,29 @@ extern struct socket *sockfd_lookup(int#define sockfd_put (sock) fput(sock->file)extern int net_ratelimit (void ); +#define net_ratelimited_function (function, ...) \ +do { \ + if (net_ratelimit()) \ + function(__VA_ARGS__); \ +} while (0) + +#define net_emerg_ratelimited (fmt, ...) \ + net_ratelimited_function(pr_emerg, fmt, ##__VA_ARGS__) +#define net_alert_ratelimited (fmt, ...) \ + net_ratelimited_function(pr_alert, fmt, ##__VA_ARGS__) +#define net_crit_ratelimited (fmt, ...) \ + net_ratelimited_function(pr_crit, fmt, ##__VA_ARGS__) +#define net_err_ratelimited (fmt, ...) \ + net_ratelimited_function(pr_err, fmt, ##__VA_ARGS__) +#define net_notice_ratelimited (fmt, ...) \ + net_ratelimited_function(pr_notice, fmt, ##__VA_ARGS__) +#define net_warn_ratelimited (fmt, ...) \ + net_ratelimited_function(pr_warn, fmt, ##__VA_ARGS__) +#define net_info_ratelimited (fmt, ...) \ + net_ratelimited_function(pr_info, fmt, ##__VA_ARGS__) +#define net_dbg_ratelimited (fmt, ...) \ + net_ratelimited_function(pr_debug, fmt, ##__VA_ARGS__) +#define net_random () random32()#define net_srandom (seed) srandom32((__force u32)seed)
Greg Kroah-Hartman
maintainerPATCH 6/9 netfilter: Cant fail and free after table replacement
In reply to Greg Kroah-Hartman3.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Thomas Graf <[email protected]>
commit c58dd2dd443c26d856a168db108a0cd11c285bf3 upstream.
All xtables variants suffer from the defect that the copy_to_user() to copy the counters to user memory may fail after the table has already been exchanged and thus exposed. Return an error at this point will result in freeing the already exposed table. Any subsequent packet processing will result in a kernel panic.
We can't copy the counters before exposing the new tables as we want provide the counter state after the old table has been unhooked. Therefore convert this into a silent error.
--- net/bridge/netfilter/ebtables.c | 5 ++--- net/ipv4/netfilter/arp_tables.c | 6 ++++-- net/ipv4/netfilter/ip_tables.c | 6 ++++-- net/ipv6/netfilter/ip6_tables.c | 6 ++++-- 4 files changed, 14 insertions(+), 9 deletions(-)
net/bridge/netfilter/ebtables.c +2 -3
@@ -1044,10 +1044,9 @@ static int do_replace_finish(struct netif (repl->num_counters &©_to_user (repl->counters, counterstmp, repl->num_counters *sizeof (struct ebt_counter ))) { - ret = -EFAULT ; +/* Silent error, can't fail, new table is already in place */ +net_warn_ratelimited ("ebtables: counters copy to user failed while replacing table\n" ); } -else - ret =0 ;/* decrease module count and free resources */ EBT_ENTRY_ITERATE(table->entries, table->entries_size,
net/ipv4/netfilter/arp_tables.c +4 -2
@@ -1039,8 +1039,10 @@ static int __do_replace(struct net *net,xt_free_table_info (oldinfo);if (copy_to_user (counters_ptr, counters, -sizeof (struct xt_counters ) * num_counters) !=0 ) - ret = -EFAULT ; +sizeof (struct xt_counters ) * num_counters) !=0 ) { +/* Silent error, can't fail, new table is already in place */ +net_warn_ratelimited ("arptables: counters copy to user failed while replacing table\n" ); + }vfree (counters);xt_table_unlock (t);return ret;
net/ipv4/netfilter/ip_tables.c +4 -2
@@ -1227,8 +1227,10 @@ __do_replace(struct net *net, const charxt_free_table_info (oldinfo);if (copy_to_user (counters_ptr, counters, -sizeof (struct xt_counters ) * num_counters) !=0 ) - ret = -EFAULT ; +sizeof (struct xt_counters ) * num_counters) !=0 ) { +/* Silent error, can't fail, new table is already in place */ +net_warn_ratelimited ("iptables: counters copy to user failed while replacing table\n" ); + }vfree (counters);xt_table_unlock (t);return ret;
net/ipv6/netfilter/ip6_tables.c +4 -2
@@ -1236,8 +1236,10 @@ __do_replace(struct net *net, const charxt_free_table_info (oldinfo);if (copy_to_user (counters_ptr, counters, -sizeof (struct xt_counters ) * num_counters) !=0 ) - ret = -EFAULT ; +sizeof (struct xt_counters ) * num_counters) !=0 ) { +/* Silent error, can't fail, new table is already in place */ +net_warn_ratelimited ("ip6tables: counters copy to user failed while replacing table\n" ); + }vfree (counters);xt_table_unlock (t);return ret;
Greg Kroah-Hartman
maintainerPATCH 7/9 tracepoint: Do not waste memory on mods with no tracepoints
In reply to Greg Kroah-Hartman3.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: "Steven Rostedt (Red Hat)" <[email protected]>
commit 7dec935a3aa04412cba2cebe1524ae0d34a30c24 upstream.
No reason to allocate tp_module structures for modules that have no tracepoints. This just wastes memory.
--- kernel/tracepoint.c | 6 ++++++ 1 file changed, 6 insertions(+)
kernel/tracepoint.c +6 -0
@@ -638,6 +638,9 @@ static int tracepoint_module_coming(strustruct tp_module *tp_mod, *iter;int ret =0 ; +if (!mod->num_tracepoints) +return 0 ; +/* * We skip modules that taint the kernel, especially those with different * module headers (for forced load), to make sure we don't cause a crash.
@@ -681,6 +684,9 @@ static int tracepoint_module_going(struc {struct tp_module *pos; +if (!mod->num_tracepoints) +return 0 ; +mutex_lock (&tracepoints_mutex);tracepoint_update_probe_range (mod->tracepoints_ptrs, mod->tracepoints_ptrs + mod->num_tracepoints);
Greg Kroah-Hartman
maintainerPATCH 8/9 powerpc: Add vr save/restore functions
In reply to Greg Kroah-Hartman3.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Andreas Schwab <[email protected]>
commit 8fe9c93e7453e67b8bd09f263ec1bb0783c733fc upstream.
GCC 4.8 now generates out-of-line vr save/restore functions when optimizing for size. They are needed for the raid6 altivec support.
--- arch/powerpc/lib/crtsavres.S | 186 +++++++++++++++++++++++++++++++++++++++++++ scripts/mod/modpost.c | 8 + 2 files changed, 192 insertions(+), 2 deletions(-)
arch/powerpc/lib/crtsavres.S +186 -0
@@ -230,6 +230,87 @@ _GLOBAL(_rest32gpr_31_x) mr 1,11 blr +#ifdef CONFIG_ALTIVEC +/* Called with r0 pointing just beyond the end of the vector save area. */ + +_GLOBAL(_savevr_20) + li r11,-192 + stvx vr20,r11,r0 +_GLOBAL(_savevr_21) + li r11,-176 + stvx vr21,r11,r0 +_GLOBAL(_savevr_22) + li r11,-160 + stvx vr22,r11,r0 +_GLOBAL(_savevr_23) + li r11,-144 + stvx vr23,r11,r0 +_GLOBAL(_savevr_24) + li r11,-128 + stvx vr24,r11,r0 +_GLOBAL(_savevr_25) + li r11,-112 + stvx vr25,r11,r0 +_GLOBAL(_savevr_26) + li r11,-96 + stvx vr26,r11,r0 +_GLOBAL(_savevr_27) + li r11,-80 + stvx vr27,r11,r0 +_GLOBAL(_savevr_28) + li r11,-64 + stvx vr28,r11,r0 +_GLOBAL(_savevr_29) + li r11,-48 + stvx vr29,r11,r0 +_GLOBAL(_savevr_30) + li r11,-32 + stvx vr30,r11,r0 +_GLOBAL(_savevr_31) + li r11,-16 + stvx vr31,r11,r0 + blr + +_GLOBAL(_restvr_20) + li r11,-192 + lvx vr20,r11,r0 +_GLOBAL(_restvr_21) + li r11,-176 + lvx vr21,r11,r0 +_GLOBAL(_restvr_22) + li r11,-160 + lvx vr22,r11,r0 +_GLOBAL(_restvr_23) + li r11,-144 + lvx vr23,r11,r0 +_GLOBAL(_restvr_24) + li r11,-128 + lvx vr24,r11,r0 +_GLOBAL(_restvr_25) + li r11,-112 + lvx vr25,r11,r0 +_GLOBAL(_restvr_26) + li r11,-96 + lvx vr26,r11,r0 +_GLOBAL(_restvr_27) + li r11,-80 + lvx vr27,r11,r0 +_GLOBAL(_restvr_28) + li r11,-64 + lvx vr28,r11,r0 +_GLOBAL(_restvr_29) + li r11,-48 + lvx vr29,r11,r0 +_GLOBAL(_restvr_30) + li r11,-32 + lvx vr30,r11,r0 +_GLOBAL(_restvr_31) + li r11,-16 + lvx vr31,r11,r0 + blr + +#endif /* CONFIG_ALTIVEC */ + #else /* CONFIG_PPC64 */ .globl _savegpr0_14
@@ -353,6 +434,111 @@ _restgpr0_31: mtlr r0 blr +#ifdef CONFIG_ALTIVEC +/* Called with r0 pointing just beyond the end of the vector save area. */ + +.globl _savevr_20 +_savevr_20: + li r12,-192 + stvx vr20,r12,r0 +.globl _savevr_21 +_savevr_21: + li r12,-176 + stvx vr21,r12,r0 +.globl _savevr_22 +_savevr_22: + li r12,-160 + stvx vr22,r12,r0 +.globl _savevr_23 +_savevr_23: + li r12,-144 + stvx vr23,r12,r0 +.globl _savevr_24 +_savevr_24: + li r12,-128 + stvx vr24,r12,r0 +.globl _savevr_25 +_savevr_25: + li r12,-112 + stvx vr25,r12,r0 +.globl _savevr_26 +_savevr_26: + li r12,-96 + stvx vr26,r12,r0 +.globl _savevr_27 +_savevr_27: + li r12,-80 + stvx vr27,r12,r0 +.globl _savevr_28 +_savevr_28: + li r12,-64 + stvx vr28,r12,r0 +.globl _savevr_29 +_savevr_29: + li r12,-48 + stvx vr29,r12,r0 +.globl _savevr_30 +_savevr_30: + li r12,-32 + stvx vr30,r12,r0 +.globl _savevr_31 +_savevr_31: + li r12,-16 + stvx vr31,r12,r0 + blr + +.globl _restvr_20 +_restvr_20: + li r12,-192 + lvx vr20,r12,r0 +.globl _restvr_21 +_restvr_21: + li r12,-176 + lvx vr21,r12,r0 +.globl _restvr_22 +_restvr_22: + li r12,-160 + lvx vr22,r12,r0 +.globl _restvr_23 +_restvr_23: + li r12,-144 + lvx vr23,r12,r0 +.globl _restvr_24 +_restvr_24: + li r12,-128 + lvx vr24,r12,r0 +.globl _restvr_25 +_restvr_25: + li r12,-112 + lvx vr25,r12,r0 +.globl _restvr_26 +_restvr_26: + li r12,-96 + lvx vr26,r12,r0 +.globl _restvr_27 +_restvr_27: + li r12,-80 + lvx vr27,r12,r0 +.globl _restvr_28 +_restvr_28: + li r12,-64 + lvx vr28,r12,r0 +.globl _restvr_29 +_restvr_29: + li r12,-48 + lvx vr29,r12,r0 +.globl _restvr_30 +_restvr_30: + li r12,-32 + lvx vr30,r12,r0 +.globl _restvr_31 +_restvr_31: + li r12,-16 + lvx vr31,r12,r0 + blr + +#endif /* CONFIG_ALTIVEC */ + #endif /* CONFIG_PPC64 */ #endif
scripts/mod/modpost.c +6 -2
@@ -569,12 +569,16 @@ static int ignore_undef_symbol(struct elif (strncmp (symname,"_restgpr_" ,sizeof ("_restgpr_" ) -1 ) ==0 ||strncmp (symname,"_savegpr_" ,sizeof ("_savegpr_" ) -1 ) ==0 ||strncmp (symname,"_rest32gpr_" ,sizeof ("_rest32gpr_" ) -1 ) ==0 || -strncmp (symname,"_save32gpr_" ,sizeof ("_save32gpr_" ) -1 ) ==0 ) +strncmp (symname,"_save32gpr_" ,sizeof ("_save32gpr_" ) -1 ) ==0 || +strncmp (symname,"_restvr_" ,sizeof ("_restvr_" ) -1 ) ==0 || +strncmp (symname,"_savevr_" ,sizeof ("_savevr_" ) -1 ) ==0 )return 1 ;if (info->hdr->e_machine ==EM_PPC64 )/* Special register function linked on all modules during final link of .ko */ if (strncmp (symname,"_restgpr0_" ,sizeof ("_restgpr0_" ) -1 ) ==0 || -strncmp (symname,"_savegpr0_" ,sizeof ("_savegpr0_" ) -1 ) ==0 ) +strncmp (symname,"_savegpr0_" ,sizeof ("_savegpr0_" ) -1 ) ==0 || +strncmp (symname,"_restvr_" ,sizeof ("_restvr_" ) -1 ) ==0 || +strncmp (symname,"_savevr_" ,sizeof ("_savevr_" ) -1 ) ==0 )return 1 ;/* Do not ignore this symbol */ return 0 ;
Greg Kroah-Hartman
maintainerPATCH 9/9 tgafb: fix mode setting with fbset
In reply to Greg Kroah-Hartman3.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Mikulas Patocka <[email protected]>
commit 624966589041deb32a2626ee2e176e8274581101 upstream.
Mode setting in the TGA driver is broken for these reasons:
- info->fix.line_length is set just once in tgafb_init_fix function. If we change videomode, info->fix.line_length is not recalculated - so the video mode is changed but the screen is corrupted because of wrong info->fix.line_length.
- info->fix.smem_len is set in tgafb_init_fix to the size of the default video mode (640x480). If we set a higher resolution, info->fix.smem_len is smaller than the current screen size, preventing the userspace program from mapping the framebuffer.
This patch fixes it:
- info->fix.line_length initialization is moved to tgafb_set_par so that it is recalculated with each mode change.
- info->fix.smem_len is set to a fixed value representing the real amount of video ram (the values are taken from xfree86 driver).
- add a check to tgafb_check_var to prevent us from setting a videomode that doesn't fit into videoram.
- in tgafb_register, tgafb_init_fix is moved upwards, to be called before fb_find_mode (because fb_find_mode already needs the videoram size set in tgafb_init_fix).
--- drivers/video/tgafb.c | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-)
drivers/video/tgafb.c +12 -3
@@ -192,6 +192,8 @@ tgafb_check_var(struct fb_var_screeninfoif (var->xres_virtual != var->xres || var->yres_virtual != var->yres)return -EINVAL ; +if (var->xres * var->yres * (var->bits_per_pixel >>3 ) > info->fix.smem_len) +return -EINVAL ;if (var->nonstd)return -EINVAL ;if (1000000000 / var->pixclock >TGA_PLL_MAX_FREQ )
@@ -272,6 +274,7 @@ tgafb_set_par(struct fb_info *info) par->yres = info->var.yres; par->pll_freq = pll_freq =1000000000 / info->var.pixclock; par->bits_per_pixel = info->var.bits_per_pixel; + info->fix.line_length = par->xres * (par->bits_per_pixel >>3 ); tga_type = par->tga_type;
@@ -1318,6 +1321,7 @@ tgafb_init_fix(struct fb_info *info)int tga_bus_tc =TGA_BUS_TC (par->dev);u8 tga_type = par->tga_type;const char *tga_type_name =NULL ; +unsigned memory_size;switch (tga_type) {case TGA_TYPE_8PLANE :
@@ -1325,21 +1329,25 @@ tgafb_init_fix(struct fb_info *info) tga_type_name ="Digital ZLXp-E1" ;if (tga_bus_tc) tga_type_name ="Digital ZLX-E1" ; + memory_size =2097152 ;break ;case TGA_TYPE_24PLANE :if (tga_bus_pci) tga_type_name ="Digital ZLXp-E2" ;if (tga_bus_tc) tga_type_name ="Digital ZLX-E2" ; + memory_size =8388608 ;break ;case TGA_TYPE_24PLUSZ :if (tga_bus_pci) tga_type_name ="Digital ZLXp-E3" ;if (tga_bus_tc) tga_type_name ="Digital ZLX-E3" ; + memory_size =16777216 ;break ;default : tga_type_name ="Unknown" ; + memory_size =16777216 ;break ; }
@@ -1351,9 +1359,8 @@ tgafb_init_fix(struct fb_info *info) ? FB_VISUAL_PSEUDOCOLOR : FB_VISUAL_DIRECTCOLOR); - info->fix.line_length = par->xres * (par->bits_per_pixel >>3 ); info->fix.smem_start = (size_t ) par->tga_fb_base; - info->fix.smem_len = info->fix.line_length * par->yres; + info->fix.smem_len = memory_size; info->fix.mmio_start = (size_t ) par->tga_regs_base; info->fix.mmio_len =512 ;
@@ -1478,6 +1485,9 @@ tgafb_register(struct device *dev) modedb_tga = &modedb_tc; modedbsize_tga =1 ; } + +tgafb_init_fix (info); + ret = fb_find_mode(&info->var, info, mode_option ? mode_option : mode_option_tga, modedb_tga, modedbsize_tga, NULL,
@@ -1495,7 +1505,6 @@ tgafb_register(struct device *dev) }tgafb_set_par (info); -tgafb_init_fix (info);if (register_framebuffer (info) <0 ) {printk (KERN_ERR "tgafb: Could not register framebuffer\n" );
Quoted 8 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 3.4.91 release. There are 9 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Sun May 18 22:54:50 UTC 2014. Anything received after that time might be too late.
Build results:
total: 134 pass: 109 skipped: 18 fail: 7
Qemu tests all passed.
There are two new build failures, powerpc:ppc64e_defconfig and powerpc:chroma_defconfig. Those are not due to source code changes, but due to added builds. Failures are seen if the images are built with binutils 2.24, and are caused by a changed assembler ABI. A patch to fix the problem has been submitted but is not yet upstream.
Detailed results are available at http://server.roeck-us.net:8010/builders.
powerpc builds with binutils 2.24 are shown as 'powerpc_24' architecture.
Guenter
Greg Kroah-Hartman
maintainerQuoted 15 lines · Guenter Roeck
Quoted 8 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 3.4.91 release. There are 9 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Sun May 18 22:54:50 UTC 2014. Anything received after that time might be too late.
Build results:
total: 134 pass: 109 skipped: 18 fail: 7Qemu tests all passed.
Quoted 8 lines
There are two new build failures, powerpc:ppc64e_defconfig and powerpc:chroma_defconfig. Those are not due to source code changes, but due to added builds. Failures are seen if the images are built with binutils 2.24, and are caused by a changed assembler ABI. A patch to fix the problem has been submitted but is not yet upstream.
Detailed results are available at http://server.roeck-us.net:8010/builders.
powerpc builds with binutils 2.24 are shown as 'powerpc_24' architecture.
Thanks for testing and letting me know.
greg k-h
At Sat, 17 May 2014 08:44:45 -0700,
Quoted 22 lines · Guenter Roeck
Quoted 8 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 3.4.91 release. There are 9 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Sun May 18 22:54:50 UTC 2014. Anything received after that time might be too late.
Build results:
total: 134 pass: 109 skipped: 18 fail: 7Qemu tests all passed.
There are two new build failures, powerpc:ppc64e_defconfig and powerpc:chroma_defconfig. Those are not due to source code changes, but due to added builds. Failures are seen if the images are built with binutils 2.24, and are caused by a changed assembler ABI. A patch to fix the problem has been submitted but is not yet upstream.
Quoted 5 lines
Detailed results are available at http://server.roeck-us.net:8010/builders.
powerpc builds with binutils 2.24 are shown as 'powerpc_24' architecture.Guenter
This kernel passed my test.
- Test Cases:
- Build this kernel.
- Boot this kernel.
- Build the latest mainline kernel with this kernel.
- Test Tool:
https://github.com/satoru-takeuchi/test-linux-stable
- Test Result (kernel .config, ktest config and test log):
http://satoru-takeuchi.org/test-linux-stable/results/<version>-<test datetime>.tar.xz
- Build Environment:
- OS: Debian Jessy x86_64
- CPU: Intel(R) Core(TM) i5-2400 CPU @ 3.10GHz x 4
- memory: 8GB
- Test Target Environment:
- Debian Jessy x86_64 (KVM guest on the Build Environment)
- # of vCPU: 2
- memory: 2GB
Thanks,
Satoru
Greg Kroah-Hartman
maintainerQuoted 48 lines · Satoru Takeuchi
At Sat, 17 May 2014 08:44:45 -0700,
Quoted 22 lines · Guenter Roeck
Quoted 8 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 3.4.91 release. There are 9 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Sun May 18 22:54:50 UTC 2014. Anything received after that time might be too late.
Build results:
total: 134 pass: 109 skipped: 18 fail: 7Qemu tests all passed.
There are two new build failures, powerpc:ppc64e_defconfig and powerpc:chroma_defconfig. Those are not due to source code changes, but due to added builds. Failures are seen if the images are built with binutils 2.24, and are caused by a changed assembler ABI. A patch to fix the problem has been submitted but is not yet upstream.
Quoted 5 lines
Detailed results are available at http://server.roeck-us.net:8010/builders.
powerpc builds with binutils 2.24 are shown as 'powerpc_24' architecture.Guenter
This kernel passed my test.
- Test Cases:
- Build this kernel.
- Boot this kernel.
- Build the latest mainline kernel with this kernel.- Test Tool:
https://github.com/satoru-takeuchi/test-linux-stable- Test Result (kernel .config, ktest config and test log):
http://satoru-takeuchi.org/test-linux-stable/results/<version>-<test datetime>.tar.xz- Build Environment:
- OS: Debian Jessyx86_64
- CPU: Intel(R) Core(TM) i5-2400 CPU @ 3.10GHz x 4
- memory: 8GB
Quoted 4 lines
- Test Target Environment:
- Debian Jessyx86_64(KVM guest on the Build Environment)
- # of vCPU: 2
- memory: 2GB
Thanks for testing and letting me know.
greg k-h