linux_dsm_epyc7002/arch/arm
Kees Cook 8779657d29 stackprotector: Introduce CONFIG_CC_STACKPROTECTOR_STRONG
This changes the stack protector config option into a choice of
"None", "Regular", and "Strong":

   CONFIG_CC_STACKPROTECTOR_NONE
   CONFIG_CC_STACKPROTECTOR_REGULAR
   CONFIG_CC_STACKPROTECTOR_STRONG

"Regular" means the old CONFIG_CC_STACKPROTECTOR=y option.

"Strong" is a new mode introduced by this patch. With "Strong" the
kernel is built with -fstack-protector-strong (available in
gcc 4.9 and later). This option increases the coverage of the stack
protector without the heavy performance hit of -fstack-protector-all.

For reference, the stack protector options available in gcc are:

-fstack-protector-all:
  Adds the stack-canary saving prefix and stack-canary checking
  suffix to _all_ function entry and exit. Results in substantial
  use of stack space for saving the canary for deep stack users
  (e.g. historically xfs), and measurable (though shockingly still
  low) performance hit due to all the saving/checking. Really not
  suitable for sane systems, and was entirely removed as an option
  from the kernel many years ago.

-fstack-protector:
  Adds the canary save/check to functions that define an 8
  (--param=ssp-buffer-size=N, N=8 by default) or more byte local
  char array. Traditionally, stack overflows happened with
  string-based manipulations, so this was a way to find those
  functions. Very few total functions actually get the canary; no
  measurable performance or size overhead.

-fstack-protector-strong
  Adds the canary for a wider set of functions, since it's not
  just those with strings that have ultimately been vulnerable to
  stack-busting. With this superset, more functions end up with a
  canary, but it still remains small compared to all functions
  with only a small change in performance. Based on the original
  design document, a function gets the canary when it contains any
  of:

    - local variable's address used as part of the right hand side
      of an assignment or function argument
    - local variable is an array (or union containing an array),
      regardless of array type or length
    - uses register local variables

  https://docs.google.com/a/google.com/document/d/1xXBH6rRZue4f296vGt9YQcuLVQHeE516stHwt8M9xyU

Find below a comparison of "size" and "objdump" output when built with
gcc-4.9 in three configurations:

  - defconfig
	11430641 kernel text size
	36110 function bodies

  - defconfig + CONFIG_CC_STACKPROTECTOR_REGULAR
	11468490 kernel text size (+0.33%)
	1015 of 36110 functions are stack-protected (2.81%)

  - defconfig + CONFIG_CC_STACKPROTECTOR_STRONG via this patch
	11692790 kernel text size (+2.24%)
	7401 of 36110 functions are stack-protected (20.5%)

With -strong, ARM's compressed boot code now triggers stack
protection, so a static guard was added. Since this is only used
during decompression and was never used before, the exposure
here is very small. Once it switches to the full kernel, the
stack guard is back to normal.

Chrome OS has been using -fstack-protector-strong for its kernel
builds for the last 8 months with no problems.

Signed-off-by: Kees Cook <keescook@chromium.org>
Cc: Arjan van de Ven <arjan@linux.intel.com>
Cc: Michal Marek <mmarek@suse.cz>
Cc: Russell King <linux@arm.linux.org.uk>
Cc: Ralf Baechle <ralf@linux-mips.org>
Cc: Paul Mundt <lethal@linux-sh.org>
Cc: James Hogan <james.hogan@imgtec.com>
Cc: Stephen Rothwell <sfr@canb.auug.org.au>
Cc: Shawn Guo <shawn.guo@linaro.org>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Andrew Morton <akpm@linux-foundation.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: linux-arm-kernel@lists.infradead.org
Cc: linux-mips@linux-mips.org
Cc: linux-arch@vger.kernel.org
Link: http://lkml.kernel.org/r/1387481759-14535-3-git-send-email-keescook@chromium.org
[ Improved the changelog and descriptions some more. ]
Signed-off-by: Ingo Molnar <mingo@kernel.org>
2013-12-20 09:38:40 +01:00
..
boot stackprotector: Introduce CONFIG_CC_STACKPROTECTOR_STRONG 2013-12-20 09:38:40 +01:00
common Merge branch 'next' of git://git.infradead.org/users/vkoul/slave-dma 2013-11-20 13:20:24 -08:00
configs ARM: multi_v7_defconfig: enable SDHCI_BCM_KONA and MMC_BLOCK_MINORS=16 2013-12-03 12:39:14 -08:00
crypto
include ARM: fix asm/memory.h build error 2013-12-13 20:25:30 +00:00
kernel ARM: fix asm/memory.h build error 2013-12-13 20:25:30 +00:00
kvm Fix percpu vmalloc allocations 2013-11-19 10:43:05 +02:00
lib ARM: 7907/1: lib: delay-loop: Add align directive to fix BogoMIPS calculation 2013-11-30 22:21:03 +00:00
mach-at91 ARM: SoC fixes for 3.13-rc 2013-12-04 08:56:18 -08:00
mach-bcm BCM changes for 3.13/soc. A number of cleanup related changes. 2013-10-30 14:03:39 -07:00
mach-bcm2835 Merge branch 'irq-core-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip 2013-11-12 10:02:59 +09:00
mach-clps711x
mach-cns3xxx
mach-davinci This pull request includes a patch 2013-12-04 14:28:26 -08:00
mach-dove ARM: driver updates for 3.13 2013-11-11 17:05:37 +09:00
mach-ebsa110
mach-ep93xx usb: ohci: remove ep93xx bus glue platform driver 2013-10-29 16:43:37 -07:00
mach-exynos ACPI and power management updates for 3.13-rc1 2013-11-14 13:41:48 +09:00
mach-footbridge ARM: footbridge: fix EBSA285 LEDs 2013-11-30 22:20:59 +00:00
mach-gemini GPIO bulk changes for the v3.13 development cycle 2013-11-12 15:50:46 +09:00
mach-highbank ARM: highbank: handle soft poweroff and reset key events 2013-12-04 09:28:50 -08:00
mach-imx Merge branch 'i2c/for-next' of git://git.kernel.org/pub/scm/linux/kernel/git/wsa/linux 2013-11-18 15:50:07 -08:00
mach-integrator Few clock fixes, a runtime PM fix, and pinctrl-single fix along 2013-11-15 15:17:59 -08:00
mach-iop13xx dmaengine: remove DMA unmap from drivers 2013-11-14 11:04:38 -08:00
mach-iop32x
mach-iop33x
mach-ixp4xx Merge branch 'for-linus' of git://git.linaro.org/people/rmk/linux-arm 2013-11-14 08:51:29 +09:00
mach-keystone DeviceTree updates for 3.13. This is a bit larger pull request than 2013-11-12 16:52:17 +09:00
mach-kirkwood Merge branch 'i2c/for-next' of git://git.kernel.org/pub/scm/linux/kernel/git/wsa/linux 2013-11-18 15:50:07 -08:00
mach-ks8695
mach-lpc32xx
mach-mmp fbdev changes for 3.13 2013-11-14 14:44:20 +09:00
mach-msm Merge branch 'timers-core-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip 2013-11-12 10:36:00 +09:00
mach-mv78xx0
mach-mvebu
mach-mxs ARM: SoC DT updates for 3.13 2013-11-11 17:34:56 +09:00
mach-netx
mach-nomadik
mach-nspire
mach-omap1 Merge branch 'i2c/for-next' of git://git.kernel.org/pub/scm/linux/kernel/git/wsa/linux 2013-11-18 15:50:07 -08:00
mach-omap2 ARM: OMAP2+: omap_device: add fail hook for runtime_pm when bad data is detected 2013-12-10 09:39:52 -08:00
mach-orion5x
mach-picoxcell
mach-prima2
mach-pxa ARM: pxa: prevent PXA270 occasional reboot freezes 2013-12-11 16:35:16 -08:00
mach-realview
mach-rockchip ARM: SoC board updates for 3.13 2013-11-11 16:57:16 +09:00
mach-rpc
mach-s3c24xx Merge branch 'i2c/for-next' of git://git.kernel.org/pub/scm/linux/kernel/git/wsa/linux 2013-11-18 15:50:07 -08:00
mach-s3c64xx pwm: Changes for v3.13-rc1 2013-11-16 12:21:40 -08:00
mach-s5p64x0
mach-s5pc100
mach-s5pv210 pwm: Changes for v3.13-rc1 2013-11-16 12:21:40 -08:00
mach-sa1100 ACPI and power management updates for 3.13-rc1 2013-11-14 13:41:48 +09:00
mach-shmobile pwm: Changes for v3.13-rc1 2013-11-16 12:21:40 -08:00
mach-socfpga arm: socfpga: Enable ARM_TWD for socfpga 2013-12-03 14:19:48 -08:00
mach-spear
mach-sti ARM: SoC fixes for 3.13 merge window 2013-11-16 12:45:55 -08:00
mach-sunxi ARM: sunxi: remove .init_time hooks 2013-10-28 10:19:45 -07:00
mach-tegra ARM: tegra: add missing break to fuse initialization code 2013-12-11 17:09:11 -08:00
mach-u300 DeviceTree updates for 3.13. This is a bit larger pull request than 2013-11-12 16:52:17 +09:00
mach-ux500 Revert "ARM: ux500: Stop passing MMC's platform data for Device Tree boots" 2013-11-26 21:02:20 +01:00
mach-versatile
mach-vexpress ARM: vexpress/TC2: Implement MCPM power_down_finish() 2013-11-25 14:12:14 -08:00
mach-virt
mach-vt8500
mach-w90x900
mach-zynq ACPI and power management updates for 3.13-rc1 2013-11-14 13:41:48 +09:00
mm ARM: 7908/1: mm: Fix the arm_dma_limit calculation 2013-12-09 23:24:28 +00:00
net Merge branch 'devel-stable' into for-next 2013-11-12 10:58:59 +00:00
nwfpe
oprofile
plat-iop
plat-omap ARM: OMAP2+: Disable POSTED mode for errata i103 and i767 2013-11-26 15:03:36 -08:00
plat-orion
plat-pxa
plat-samsung pwm: Changes for v3.13-rc1 2013-11-16 12:21:40 -08:00
plat-versatile
tools
vfp ARM: 7873/1: vfp: clear vfp_current_hw_state for dying cpu 2013-10-30 22:10:10 +00:00
xen xen/arm: p2m_init and p2m_lock should be static 2013-11-18 15:33:10 +00:00
Kconfig stackprotector: Unify the HAVE_CC_STACKPROTECTOR logic between architectures 2013-12-20 09:38:40 +01:00
Kconfig-nommu
Kconfig.debug Merge branch 'for-linus' of git://git.linaro.org/people/rmk/linux-arm 2013-11-14 08:51:29 +09:00
Makefile stackprotector: Unify the HAVE_CC_STACKPROTECTOR logic between architectures 2013-12-20 09:38:40 +01:00