From: Greg Kroah-Hartman Date: Sat, 26 Jul 2014 19:00:44 +0000 (-0700) Subject: 3.15-stable patches X-Git-Tag: v3.4.100~1 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=5d454441e8d0db2f7d790639403882298d6b4b1b;p=thirdparty%2Fkernel%2Fstable-queue.git 3.15-stable patches added patches: aio-protect-reqs_available-updates-from-changes-in-interrupt-handlers.patch arc-implement-ptrace-ptrace_get_thread_area.patch arm-dts-imx-add-alias-for-ethernet-controller.patch don-t-trigger-congestion-wait-on-dirty-but-not-writeout-pages.patch gpio-dwapb-drop-irq_setup_generic_chip.patch ib-mlx5-enable-block-multicast-loopback-for-kernel-consumers.patch iwlwifi-mvm-disable-cts-to-self.patch sched-fix-possible-divide-by-zero-in-avg_atom-calculation.patch x86-efi-include-a-.bss-section-within-the-pe-coff-headers.patch --- diff --git a/queue-3.15/aio-protect-reqs_available-updates-from-changes-in-interrupt-handlers.patch b/queue-3.15/aio-protect-reqs_available-updates-from-changes-in-interrupt-handlers.patch new file mode 100644 index 00000000000..ad781d5067c --- /dev/null +++ b/queue-3.15/aio-protect-reqs_available-updates-from-changes-in-interrupt-handlers.patch @@ -0,0 +1,72 @@ +From 263782c1c95bbddbb022dc092fd89a36bb8d5577 Mon Sep 17 00:00:00 2001 +From: Benjamin LaHaise +Date: Mon, 14 Jul 2014 12:49:26 -0400 +Subject: aio: protect reqs_available updates from changes in interrupt handlers + +From: Benjamin LaHaise + +commit 263782c1c95bbddbb022dc092fd89a36bb8d5577 upstream. + +As of commit f8567a3845ac05bb28f3c1b478ef752762bd39ef it is now possible to +have put_reqs_available() called from irq context. While put_reqs_available() +is per cpu, it did not protect itself from interrupts on the same CPU. This +lead to aio_complete() corrupting the available io requests count when run +under a heavy O_DIRECT workloads as reported by Robert Elliott. Fix this by +disabling irq updates around the per cpu batch updates of reqs_available. + +Many thanks to Robert and folks for testing and tracking this down. + +Reported-by: Robert Elliot +Tested-by: Robert Elliot +Signed-off-by: Benjamin LaHaise +Cc: Jens Axboe , Christoph Hellwig +Signed-off-by: Greg Kroah-Hartman + +--- + fs/aio.c | 7 +++++++ + 1 file changed, 7 insertions(+) + +--- a/fs/aio.c ++++ b/fs/aio.c +@@ -830,16 +830,20 @@ void exit_aio(struct mm_struct *mm) + static void put_reqs_available(struct kioctx *ctx, unsigned nr) + { + struct kioctx_cpu *kcpu; ++ unsigned long flags; + + preempt_disable(); + kcpu = this_cpu_ptr(ctx->cpu); + ++ local_irq_save(flags); + kcpu->reqs_available += nr; ++ + while (kcpu->reqs_available >= ctx->req_batch * 2) { + kcpu->reqs_available -= ctx->req_batch; + atomic_add(ctx->req_batch, &ctx->reqs_available); + } + ++ local_irq_restore(flags); + preempt_enable(); + } + +@@ -847,10 +851,12 @@ static bool get_reqs_available(struct ki + { + struct kioctx_cpu *kcpu; + bool ret = false; ++ unsigned long flags; + + preempt_disable(); + kcpu = this_cpu_ptr(ctx->cpu); + ++ local_irq_save(flags); + if (!kcpu->reqs_available) { + int old, avail = atomic_read(&ctx->reqs_available); + +@@ -869,6 +875,7 @@ static bool get_reqs_available(struct ki + ret = true; + kcpu->reqs_available--; + out: ++ local_irq_restore(flags); + preempt_enable(); + return ret; + } diff --git a/queue-3.15/arc-implement-ptrace-ptrace_get_thread_area.patch b/queue-3.15/arc-implement-ptrace-ptrace_get_thread_area.patch new file mode 100644 index 00000000000..3d745f225d1 --- /dev/null +++ b/queue-3.15/arc-implement-ptrace-ptrace_get_thread_area.patch @@ -0,0 +1,44 @@ +From a4b6cb735b25aa84a462a1985e3e43bebaf5beb4 Mon Sep 17 00:00:00 2001 +From: Anton Kolesov +Date: Fri, 20 Jun 2014 20:28:39 +0400 +Subject: ARC: Implement ptrace(PTRACE_GET_THREAD_AREA) + +From: Anton Kolesov + +commit a4b6cb735b25aa84a462a1985e3e43bebaf5beb4 upstream. + +This patch adds implementation of GET_THREAD_AREA ptrace request type. This +is required by GDB to debug NPTL applications. + +Signed-off-by: Anton Kolesov +Signed-off-by: Vineet Gupta +Signed-off-by: Greg Kroah-Hartman + +--- + arch/arc/include/uapi/asm/ptrace.h | 1 + + arch/arc/kernel/ptrace.c | 4 ++++ + 2 files changed, 5 insertions(+) + +--- a/arch/arc/include/uapi/asm/ptrace.h ++++ b/arch/arc/include/uapi/asm/ptrace.h +@@ -11,6 +11,7 @@ + #ifndef _UAPI__ASM_ARC_PTRACE_H + #define _UAPI__ASM_ARC_PTRACE_H + ++#define PTRACE_GET_THREAD_AREA 25 + + #ifndef __ASSEMBLY__ + /* +--- a/arch/arc/kernel/ptrace.c ++++ b/arch/arc/kernel/ptrace.c +@@ -146,6 +146,10 @@ long arch_ptrace(struct task_struct *chi + pr_debug("REQ=%ld: ADDR =0x%lx, DATA=0x%lx)\n", request, addr, data); + + switch (request) { ++ case PTRACE_GET_THREAD_AREA: ++ ret = put_user(task_thread_info(child)->thr_ptr, ++ (unsigned long __user *)data); ++ break; + default: + ret = ptrace_request(child, request, addr, data); + break; diff --git a/queue-3.15/arm-dts-imx-add-alias-for-ethernet-controller.patch b/queue-3.15/arm-dts-imx-add-alias-for-ethernet-controller.patch new file mode 100644 index 00000000000..3f3f88fda30 --- /dev/null +++ b/queue-3.15/arm-dts-imx-add-alias-for-ethernet-controller.patch @@ -0,0 +1,107 @@ +From 22970070e027cbbb9b2878f8f7c31d0d7f29e94d Mon Sep 17 00:00:00 2001 +From: Marek Vasut +Date: Fri, 28 Feb 2014 12:58:41 +0100 +Subject: ARM: dts: imx: Add alias for ethernet controller + +From: Marek Vasut + +commit 22970070e027cbbb9b2878f8f7c31d0d7f29e94d upstream. + +Add alias for FEC ethernet on i.MX to allow bootloaders (like U-Boot) +patch-in the MAC address for FEC using this alias. + +Signed-off-by: Marek Vasut +Signed-off-by: Shawn Guo +Signed-off-by: Greg Kroah-Hartman + +--- + arch/arm/boot/dts/imx25.dtsi | 1 + + arch/arm/boot/dts/imx27.dtsi | 1 + + arch/arm/boot/dts/imx35.dtsi | 1 + + arch/arm/boot/dts/imx50.dtsi | 1 + + arch/arm/boot/dts/imx51.dtsi | 1 + + arch/arm/boot/dts/imx53.dtsi | 1 + + arch/arm/boot/dts/imx6qdl.dtsi | 1 + + arch/arm/boot/dts/imx6sl.dtsi | 1 + + 8 files changed, 8 insertions(+) + +--- a/arch/arm/boot/dts/imx25.dtsi ++++ b/arch/arm/boot/dts/imx25.dtsi +@@ -14,6 +14,7 @@ + + / { + aliases { ++ ethernet0 = &fec; + gpio0 = &gpio1; + gpio1 = &gpio2; + gpio2 = &gpio3; +--- a/arch/arm/boot/dts/imx27.dtsi ++++ b/arch/arm/boot/dts/imx27.dtsi +@@ -16,6 +16,7 @@ + + / { + aliases { ++ ethernet0 = &fec; + gpio0 = &gpio1; + gpio1 = &gpio2; + gpio2 = &gpio3; +--- a/arch/arm/boot/dts/imx35.dtsi ++++ b/arch/arm/boot/dts/imx35.dtsi +@@ -13,6 +13,7 @@ + + / { + aliases { ++ ethernet0 = &fec; + gpio0 = &gpio1; + gpio1 = &gpio2; + gpio2 = &gpio3; +--- a/arch/arm/boot/dts/imx50.dtsi ++++ b/arch/arm/boot/dts/imx50.dtsi +@@ -17,6 +17,7 @@ + + / { + aliases { ++ ethernet0 = &fec; + gpio0 = &gpio1; + gpio1 = &gpio2; + gpio2 = &gpio3; +--- a/arch/arm/boot/dts/imx51.dtsi ++++ b/arch/arm/boot/dts/imx51.dtsi +@@ -19,6 +19,7 @@ + + / { + aliases { ++ ethernet0 = &fec; + gpio0 = &gpio1; + gpio1 = &gpio2; + gpio2 = &gpio3; +--- a/arch/arm/boot/dts/imx53.dtsi ++++ b/arch/arm/boot/dts/imx53.dtsi +@@ -18,6 +18,7 @@ + + / { + aliases { ++ ethernet0 = &fec; + gpio0 = &gpio1; + gpio1 = &gpio2; + gpio2 = &gpio3; +--- a/arch/arm/boot/dts/imx6qdl.dtsi ++++ b/arch/arm/boot/dts/imx6qdl.dtsi +@@ -16,6 +16,7 @@ + + / { + aliases { ++ ethernet0 = &fec; + can0 = &can1; + can1 = &can2; + gpio0 = &gpio1; +--- a/arch/arm/boot/dts/imx6sl.dtsi ++++ b/arch/arm/boot/dts/imx6sl.dtsi +@@ -14,6 +14,7 @@ + + / { + aliases { ++ ethernet0 = &fec; + gpio0 = &gpio1; + gpio1 = &gpio2; + gpio2 = &gpio3; diff --git a/queue-3.15/don-t-trigger-congestion-wait-on-dirty-but-not-writeout-pages.patch b/queue-3.15/don-t-trigger-congestion-wait-on-dirty-but-not-writeout-pages.patch new file mode 100644 index 00000000000..9208fcdcc29 --- /dev/null +++ b/queue-3.15/don-t-trigger-congestion-wait-on-dirty-but-not-writeout-pages.patch @@ -0,0 +1,81 @@ +From b738d764652dc5aab1c8939f637112981fce9e0e Mon Sep 17 00:00:00 2001 +From: Linus Torvalds +Date: Sun, 8 Jun 2014 14:17:00 -0700 +Subject: Don't trigger congestion wait on dirty-but-not-writeout pages + +From: Linus Torvalds + +commit b738d764652dc5aab1c8939f637112981fce9e0e upstream. + +shrink_inactive_list() used to wait 0.1s to avoid congestion when all +the pages that were isolated from the inactive list were dirty but not +under active writeback. That makes no real sense, and apparently causes +major interactivity issues under some loads since 3.11. + +The ostensible reason for it was to wait for kswapd to start writing +pages, but that seems questionable as well, since the congestion wait +code seems to trigger for kswapd itself as well. Also, the logic behind +delaying anything when we haven't actually started writeback is not +clear - it only delays actually starting that writeback. + +We'll still trigger the congestion waiting if + + (a) the process is kswapd, and we hit pages flagged for immediate + reclaim + + (b) the process is not kswapd, and the zone backing dev writeback is + actually congested. + +This probably needs to be revisited, but as it is this fixes a reported +regression. + +Reported-by: Felipe Contreras +Pinpointed-by: Hillf Danton +Cc: Michal Hocko +Cc: Andrew Morton +Cc: Mel Gorman +Signed-off-by: Linus Torvalds +Signed-off-by: Greg Kroah-Hartman + +[mhocko@suse.cz: backport to 3.12 stable tree] +Fixes: e2be15f6c3ee ('mm: vmscan: stall page reclaim and writeback pages based on dirty/writepage pages encountered') +Reported-by: Felipe Contreras +Pinpointed-by: Hillf Danton +Cc: Michal Hocko +Cc: Andrew Morton +Cc: Mel Gorman +Signed-off-by: Linus Torvalds +Signed-off-by: Michal Hocko +Signed-off-by: Greg Kroah-Hartman + +--- + mm/vmscan.c | 11 +++++------ + 1 file changed, 5 insertions(+), 6 deletions(-) + +--- a/mm/vmscan.c ++++ b/mm/vmscan.c +@@ -1554,19 +1554,18 @@ shrink_inactive_list(unsigned long nr_to + * If dirty pages are scanned that are not queued for IO, it + * implies that flushers are not keeping up. In this case, flag + * the zone ZONE_TAIL_LRU_DIRTY and kswapd will start writing +- * pages from reclaim context. It will forcibly stall in the +- * next check. ++ * pages from reclaim context. + */ + if (nr_unqueued_dirty == nr_taken) + zone_set_flag(zone, ZONE_TAIL_LRU_DIRTY); + + /* +- * In addition, if kswapd scans pages marked marked for +- * immediate reclaim and under writeback (nr_immediate), it +- * implies that pages are cycling through the LRU faster than ++ * If kswapd scans pages marked marked for immediate ++ * reclaim and under writeback (nr_immediate), it implies ++ * that pages are cycling through the LRU faster than + * they are written so also forcibly stall. + */ +- if (nr_unqueued_dirty == nr_taken || nr_immediate) ++ if (nr_immediate) + congestion_wait(BLK_RW_ASYNC, HZ/10); + } + diff --git a/queue-3.15/gpio-dwapb-drop-irq_setup_generic_chip.patch b/queue-3.15/gpio-dwapb-drop-irq_setup_generic_chip.patch new file mode 100644 index 00000000000..bbe258356e6 --- /dev/null +++ b/queue-3.15/gpio-dwapb-drop-irq_setup_generic_chip.patch @@ -0,0 +1,37 @@ +From 11d3d334af07408ce3a68860c40006ddcd343da5 Mon Sep 17 00:00:00 2001 +From: Sebastian Andrzej Siewior +Date: Mon, 7 Apr 2014 12:13:05 +0200 +Subject: gpio: dwapb: drop irq_setup_generic_chip() + +From: Sebastian Andrzej Siewior + +commit 11d3d334af07408ce3a68860c40006ddcd343da5 upstream. + +The driver calls irq_alloc_domain_generic_chips() which creates a gc and +adds it to gc_list. The driver later then calls irq_setup_generic_chip() +which also initializes the gc and adds it to the gc_list() and this +corrupts the list. Enable LIST_DEBUG and you see the kernel complain. +This isn't required, irq_alloc_domain_generic_chips() did the init. + +Signed-off-by: Sebastian Andrzej Siewior +Tested-by: Alan Tull +Signed-off-by: Linus Walleij +Signed-off-by: dann frazier +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/gpio/gpio-dwapb.c | 3 --- + 1 file changed, 3 deletions(-) + +--- a/drivers/gpio/gpio-dwapb.c ++++ b/drivers/gpio/gpio-dwapb.c +@@ -260,9 +260,6 @@ static void dwapb_configure_irqs(struct + ct->regs.ack = GPIO_PORTA_EOI; + ct->regs.mask = GPIO_INTMASK; + +- irq_setup_generic_chip(irq_gc, IRQ_MSK(port->bgc.gc.ngpio), +- IRQ_GC_INIT_NESTED_LOCK, IRQ_NOREQUEST, 0); +- + irq_set_chained_handler(irq, dwapb_irq_handler); + irq_set_handler_data(irq, gpio); + diff --git a/queue-3.15/ib-mlx5-enable-block-multicast-loopback-for-kernel-consumers.patch b/queue-3.15/ib-mlx5-enable-block-multicast-loopback-for-kernel-consumers.patch new file mode 100644 index 00000000000..22117f9c176 --- /dev/null +++ b/queue-3.15/ib-mlx5-enable-block-multicast-loopback-for-kernel-consumers.patch @@ -0,0 +1,35 @@ +From 652c1a05171695d21b84dd3a723606b50eeb80fd Mon Sep 17 00:00:00 2001 +From: Or Gerlitz +Date: Wed, 25 Jun 2014 16:44:14 +0300 +Subject: IB/mlx5: Enable "block multicast loopback" for kernel consumers + +From: Or Gerlitz + +commit 652c1a05171695d21b84dd3a723606b50eeb80fd upstream. + +In commit f360d88a2efd, we advertise blocking multicast loopback to both +kernel and userspace consumers, but don't allow kernel consumers (e.g IPoIB) +to use it with their UD QPs. Fix that. + +Fixes: f360d88a2efd ("IB/mlx5: Add block multicast loopback support") +Reported-by: Haggai Eran +Signed-off-by: Eli Cohen +Signed-off-by: Or Gerlitz +Signed-off-by: Roland Dreier +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/infiniband/hw/mlx5/qp.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +--- a/drivers/infiniband/hw/mlx5/qp.c ++++ b/drivers/infiniband/hw/mlx5/qp.c +@@ -671,7 +671,7 @@ static int create_kernel_qp(struct mlx5_ + int err; + + uuari = &dev->mdev.priv.uuari; +- if (init_attr->create_flags & ~IB_QP_CREATE_SIGNATURE_EN) ++ if (init_attr->create_flags & ~(IB_QP_CREATE_SIGNATURE_EN | IB_QP_CREATE_BLOCK_MULTICAST_LOOPBACK)) + return -EINVAL; + + if (init_attr->qp_type == MLX5_IB_QPT_REG_UMR) diff --git a/queue-3.15/iwlwifi-mvm-disable-cts-to-self.patch b/queue-3.15/iwlwifi-mvm-disable-cts-to-self.patch new file mode 100644 index 00000000000..8afbf193c1f --- /dev/null +++ b/queue-3.15/iwlwifi-mvm-disable-cts-to-self.patch @@ -0,0 +1,40 @@ +From dc271ee0d04d12d6bfabacbec803289a7072fbd9 Mon Sep 17 00:00:00 2001 +From: Emmanuel Grumbach +Date: Thu, 3 Jul 2014 20:46:35 +0300 +Subject: iwlwifi: mvm: disable CTS to Self + +From: Emmanuel Grumbach + +commit dc271ee0d04d12d6bfabacbec803289a7072fbd9 upstream. + +Firmware folks seem say that this flag can make trouble. +Drop it. The advantage of CTS to self is that it slightly +reduces the cost of the protection, but make the protection +less reliable. + +Signed-off-by: Emmanuel Grumbach +Signed-off-by: Greg Kroah-Hartman + + +--- + drivers/net/wireless/iwlwifi/mvm/mac-ctxt.c | 8 ++------ + 1 file changed, 2 insertions(+), 6 deletions(-) + +--- a/drivers/net/wireless/iwlwifi/mvm/mac-ctxt.c ++++ b/drivers/net/wireless/iwlwifi/mvm/mac-ctxt.c +@@ -667,13 +667,9 @@ static void iwl_mvm_mac_ctxt_cmd_common( + if (vif->bss_conf.qos) + cmd->qos_flags |= cpu_to_le32(MAC_QOS_FLG_UPDATE_EDCA); + +- /* Don't use cts to self as the fw doesn't support it currently. */ +- if (vif->bss_conf.use_cts_prot) { ++ if (vif->bss_conf.use_cts_prot) + cmd->protection_flags |= cpu_to_le32(MAC_PROT_FLG_TGG_PROTECT); +- if (IWL_UCODE_API(mvm->fw->ucode_ver) >= 8) +- cmd->protection_flags |= +- cpu_to_le32(MAC_PROT_FLG_SELF_CTS_EN); +- } ++ + IWL_DEBUG_RATE(mvm, "use_cts_prot %d, ht_operation_mode %d\n", + vif->bss_conf.use_cts_prot, + vif->bss_conf.ht_operation_mode); diff --git a/queue-3.15/sched-fix-possible-divide-by-zero-in-avg_atom-calculation.patch b/queue-3.15/sched-fix-possible-divide-by-zero-in-avg_atom-calculation.patch new file mode 100644 index 00000000000..6c340aafcf4 --- /dev/null +++ b/queue-3.15/sched-fix-possible-divide-by-zero-in-avg_atom-calculation.patch @@ -0,0 +1,44 @@ +From b0ab99e7736af88b8ac1b7ae50ea287fffa2badc Mon Sep 17 00:00:00 2001 +From: Mateusz Guzik +Date: Sat, 14 Jun 2014 15:00:09 +0200 +Subject: sched: Fix possible divide by zero in avg_atom() calculation + +From: Mateusz Guzik + +commit b0ab99e7736af88b8ac1b7ae50ea287fffa2badc upstream. + +proc_sched_show_task() does: + + if (nr_switches) + do_div(avg_atom, nr_switches); + +nr_switches is unsigned long and do_div truncates it to 32 bits, which +means it can test non-zero on e.g. x86-64 and be truncated to zero for +division. + +Fix the problem by using div64_ul() instead. + +As a side effect calculations of avg_atom for big nr_switches are now correct. + +Signed-off-by: Mateusz Guzik +Signed-off-by: Peter Zijlstra +Cc: Linus Torvalds +Link: http://lkml.kernel.org/r/1402750809-31991-1-git-send-email-mguzik@redhat.com +Signed-off-by: Ingo Molnar +Signed-off-by: Greg Kroah-Hartman + +--- + kernel/sched/debug.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +--- a/kernel/sched/debug.c ++++ b/kernel/sched/debug.c +@@ -608,7 +608,7 @@ void proc_sched_show_task(struct task_st + + avg_atom = p->se.sum_exec_runtime; + if (nr_switches) +- do_div(avg_atom, nr_switches); ++ avg_atom = div64_ul(avg_atom, nr_switches); + else + avg_atom = -1LL; + diff --git a/queue-3.15/series b/queue-3.15/series index 400d9d9dde9..8d5ca80d90a 100644 --- a/queue-3.15/series +++ b/queue-3.15/series @@ -98,3 +98,12 @@ dm-cache-metadata-do-not-allow-the-data-block-size-to-change.patch rdma-cxgb4-initialize-the-device-status-page.patch pm-sleep-fix-request_firmware-error-at-resume.patch locking-mutex-disable-optimistic-spinning-on-some-architectures.patch +sched-fix-possible-divide-by-zero-in-avg_atom-calculation.patch +x86-efi-include-a-.bss-section-within-the-pe-coff-headers.patch +ib-mlx5-enable-block-multicast-loopback-for-kernel-consumers.patch +aio-protect-reqs_available-updates-from-changes-in-interrupt-handlers.patch +gpio-dwapb-drop-irq_setup_generic_chip.patch +arm-dts-imx-add-alias-for-ethernet-controller.patch +iwlwifi-mvm-disable-cts-to-self.patch +don-t-trigger-congestion-wait-on-dirty-but-not-writeout-pages.patch +arc-implement-ptrace-ptrace_get_thread_area.patch diff --git a/queue-3.15/x86-efi-include-a-.bss-section-within-the-pe-coff-headers.patch b/queue-3.15/x86-efi-include-a-.bss-section-within-the-pe-coff-headers.patch new file mode 100644 index 00000000000..76b643af977 --- /dev/null +++ b/queue-3.15/x86-efi-include-a-.bss-section-within-the-pe-coff-headers.patch @@ -0,0 +1,179 @@ +From c7fb93ec51d462ec3540a729ba446663c26a0505 Mon Sep 17 00:00:00 2001 +From: Michael Brown +Date: Thu, 10 Jul 2014 12:26:20 +0100 +Subject: x86/efi: Include a .bss section within the PE/COFF headers +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +From: Michael Brown + +commit c7fb93ec51d462ec3540a729ba446663c26a0505 upstream. + +The PE/COFF headers currently describe only the initialised-data +portions of the image, and result in no space being allocated for the +uninitialised-data portions. Consequently, the EFI boot stub will end +up overwriting unexpected areas of memory, with unpredictable results. + +Fix by including a .bss section in the PE/COFF headers (functionally +equivalent to the init_size field in the bzImage header). + +Signed-off-by: Michael Brown +Cc: Thomas Bächler +Cc: Josh Boyer +Signed-off-by: Matt Fleming +Signed-off-by: Greg Kroah-Hartman + +--- + arch/x86/boot/header.S | 26 ++++++++++++++++++++++---- + arch/x86/boot/tools/build.c | 38 ++++++++++++++++++++++++++++++-------- + 2 files changed, 52 insertions(+), 12 deletions(-) + +--- a/arch/x86/boot/header.S ++++ b/arch/x86/boot/header.S +@@ -91,10 +91,9 @@ bs_die: + + .section ".bsdata", "a" + bugger_off_msg: +- .ascii "Direct floppy boot is not supported. " +- .ascii "Use a boot loader program instead.\r\n" ++ .ascii "Use a boot loader.\r\n" + .ascii "\n" +- .ascii "Remove disk and press any key to reboot ...\r\n" ++ .ascii "Remove disk and press any key to reboot...\r\n" + .byte 0 + + #ifdef CONFIG_EFI_STUB +@@ -108,7 +107,7 @@ coff_header: + #else + .word 0x8664 # x86-64 + #endif +- .word 3 # nr_sections ++ .word 4 # nr_sections + .long 0 # TimeDateStamp + .long 0 # PointerToSymbolTable + .long 1 # NumberOfSymbols +@@ -250,6 +249,25 @@ section_table: + .word 0 # NumberOfLineNumbers + .long 0x60500020 # Characteristics (section flags) + ++ # ++ # The offset & size fields are filled in by build.c. ++ # ++ .ascii ".bss" ++ .byte 0 ++ .byte 0 ++ .byte 0 ++ .byte 0 ++ .long 0 ++ .long 0x0 ++ .long 0 # Size of initialized data ++ # on disk ++ .long 0x0 ++ .long 0 # PointerToRelocations ++ .long 0 # PointerToLineNumbers ++ .word 0 # NumberOfRelocations ++ .word 0 # NumberOfLineNumbers ++ .long 0xc8000080 # Characteristics (section flags) ++ + #endif /* CONFIG_EFI_STUB */ + + # Kernel attributes; used by setup. This is part 1 of the +--- a/arch/x86/boot/tools/build.c ++++ b/arch/x86/boot/tools/build.c +@@ -143,7 +143,7 @@ static void usage(void) + + #ifdef CONFIG_EFI_STUB + +-static void update_pecoff_section_header(char *section_name, u32 offset, u32 size) ++static void update_pecoff_section_header_fields(char *section_name, u32 vma, u32 size, u32 datasz, u32 offset) + { + unsigned int pe_header; + unsigned short num_sections; +@@ -164,10 +164,10 @@ static void update_pecoff_section_header + put_unaligned_le32(size, section + 0x8); + + /* section header vma field */ +- put_unaligned_le32(offset, section + 0xc); ++ put_unaligned_le32(vma, section + 0xc); + + /* section header 'size of initialised data' field */ +- put_unaligned_le32(size, section + 0x10); ++ put_unaligned_le32(datasz, section + 0x10); + + /* section header 'file offset' field */ + put_unaligned_le32(offset, section + 0x14); +@@ -179,6 +179,11 @@ static void update_pecoff_section_header + } + } + ++static void update_pecoff_section_header(char *section_name, u32 offset, u32 size) ++{ ++ update_pecoff_section_header_fields(section_name, offset, size, size, offset); ++} ++ + static void update_pecoff_setup_and_reloc(unsigned int size) + { + u32 setup_offset = 0x200; +@@ -203,9 +208,6 @@ static void update_pecoff_text(unsigned + + pe_header = get_unaligned_le32(&buf[0x3c]); + +- /* Size of image */ +- put_unaligned_le32(file_sz, &buf[pe_header + 0x50]); +- + /* + * Size of code: Subtract the size of the first sector (512 bytes) + * which includes the header. +@@ -220,6 +222,22 @@ static void update_pecoff_text(unsigned + update_pecoff_section_header(".text", text_start, text_sz); + } + ++static void update_pecoff_bss(unsigned int file_sz, unsigned int init_sz) ++{ ++ unsigned int pe_header; ++ unsigned int bss_sz = init_sz - file_sz; ++ ++ pe_header = get_unaligned_le32(&buf[0x3c]); ++ ++ /* Size of uninitialized data */ ++ put_unaligned_le32(bss_sz, &buf[pe_header + 0x24]); ++ ++ /* Size of image */ ++ put_unaligned_le32(init_sz, &buf[pe_header + 0x50]); ++ ++ update_pecoff_section_header_fields(".bss", file_sz, bss_sz, 0, 0); ++} ++ + static int reserve_pecoff_reloc_section(int c) + { + /* Reserve 0x20 bytes for .reloc section */ +@@ -259,6 +277,8 @@ static void efi_stub_entry_update(void) + static inline void update_pecoff_setup_and_reloc(unsigned int size) {} + static inline void update_pecoff_text(unsigned int text_start, + unsigned int file_sz) {} ++static inline void update_pecoff_bss(unsigned int file_sz, ++ unsigned int init_sz) {} + static inline void efi_stub_defaults(void) {} + static inline void efi_stub_entry_update(void) {} + +@@ -310,7 +330,7 @@ static void parse_zoffset(char *fname) + + int main(int argc, char ** argv) + { +- unsigned int i, sz, setup_sectors; ++ unsigned int i, sz, setup_sectors, init_sz; + int c; + u32 sys_size; + struct stat sb; +@@ -376,7 +396,9 @@ int main(int argc, char ** argv) + buf[0x1f1] = setup_sectors-1; + put_unaligned_le32(sys_size, &buf[0x1f4]); + +- update_pecoff_text(setup_sectors * 512, sz + i + ((sys_size * 16) - sz)); ++ update_pecoff_text(setup_sectors * 512, i + (sys_size * 16)); ++ init_sz = get_unaligned_le32(&buf[0x260]); ++ update_pecoff_bss(i + (sys_size * 16), init_sz); + + efi_stub_entry_update(); +