All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCHSET x86/master] add stack protector support for x86_32
@ 2009-02-09 13:39 Tejun Heo
  2009-02-09 13:39 ` [PATCH 01/11] x86: include correct %gs in a.out core dump Tejun Heo
                   ` (12 more replies)
  0 siblings, 13 replies; 48+ messages in thread
From: Tejun Heo @ 2009-02-09 13:39 UTC (permalink / raw)
  To: hpa, jeremy, tglx, mingo, linux-kernel, x86, rusty


Hello,

This patchset adds stack protector support for x86_32.  The basics are
the same with x86_64 but there are some noticeable differences.

* x86_32 uses %fs for percpu base.  %gs is unused by the kernel and
  managed lazily.  %gs is used for userland TLS and loading %gs with
  different value on kernel entry is known to cost quite a bit on some
  chips.

  Lazy %gs handling is made optional and disabled if stack protector
  is enabled.  To do this, entry for %gs is added to pt_regs.  This
  adds one "pushl $0" to SAVE_ALL in entry_32.S when lazy %gs is on.
  However, no overhead is added to common exit path and error_code
  entry path shed a few instructions.  I don't think there will be
  noticeable overhead but then again it does add an instruction to a
  very hot path.  Would this be okay?

* x86_32 doesn't support direct access to shadow part of %gs and
  there's no swapgs, so GDT entry should be built for stack canary.

  GDT entry 28 is used for this.  The boot cpu one is setup from
  head_32.S.  Others while setting up percpu areas.

* math_emu register access was completely broken.  Fixed.

* x86_32 exception handlers take register frame verbatim as struct
  pt_regs.  With -fstack-protector, gcc copies pt_regs into the
  callee's stack frame to put it after the stack canary.  Of course it
  doesn't copy back (as the callee owns the argument) and any change
  made to pt_regs is lost on return.  This is currently worked around
  by adding -fno-stack-protector to any file containing such
  functions.  We really need to teach gcc about the calling
  convention.

This patchset contains the following eleven patches.

  0001-x86-include-correct-gs-in-a.out-core-dump.patch
  0002-x86-math_emu-info-cleanup.patch
  0003-x86-fix-math_emu-register-frame-access.patch
  0004-elf-add-ELF_CORE_COPY_KERNEL_REGS.patch
  0005-x86-stackprotector.h-misc-update.patch
  0006-stackprotector-update-make-rules.patch
  0007-x86-no-stack-protector-for-vdso.patch
  0008-x86-use-asm-.macro-instead-of-cpp-define-in-entry_.patch
  0009-x86-add-gs-accessors-for-x86_32.patch
  0010-x86-make-lazy-gs-optional-on-x86_32.patch
  0011-x86-implement-x86_32-stack-protector.patch

0001 is a misc fix.  0002-0003 fixes math_emu register frame access.
0004-0008 preps for stack protector changes.  0009-0010 makes lazy %gs
handling optional.  0011 implements stack protector support for
x86_32.

Jeremy, Rusty, can you guys please take a look at patch #0010 and
#0011 and see whether xen and lguest are okay?  I don't think anything
is broken for those although stackp might not work but haven't tested
them.  I'll try to learn xen and lguest and test them in the future.

This patchset is against the current x86/master[1].  If acked, please
pull from the following git branch

  git://git.kernel.org/pub/scm/linux/kernel/git/tj/misc.git tj-stackp32

to receive the following changes.

 Makefile                                  |    3 
 arch/x86/Kconfig                          |    5 
 arch/x86/Makefile                         |   17 -
 arch/x86/include/asm/a.out-core.h         |    4 
 arch/x86/include/asm/elf.h                |   15 -
 arch/x86/include/asm/math_emu.h           |   29 --
 arch/x86/include/asm/mmu_context.h        |    2 
 arch/x86/include/asm/processor.h          |    6 
 arch/x86/include/asm/ptrace.h             |    4 
 arch/x86/include/asm/segment.h            |    9 
 arch/x86/include/asm/stackprotector.h     |   96 ++++++
 arch/x86/include/asm/system.h             |   40 ++
 arch/x86/include/asm/traps.h              |    4 
 arch/x86/kernel/Makefile                  |   18 +
 arch/x86/kernel/asm-offsets_32.c          |    1 
 arch/x86/kernel/cpu/common.c              |   17 -
 arch/x86/kernel/entry_32.S                |  423 ++++++++++++++++++------------
 arch/x86/kernel/head_32.S                 |   20 +
 arch/x86/kernel/process_32.c              |   11 
 arch/x86/kernel/ptrace.c                  |   19 -
 arch/x86/kernel/setup_percpu.c            |    2 
 arch/x86/kernel/signal.c                  |   41 +-
 arch/x86/kernel/traps.c                   |   15 -
 arch/x86/kernel/vm86_32.c                 |    4 
 arch/x86/lguest/boot.c                    |    2 
 arch/x86/math-emu/fpu_entry.c             |    6 
 arch/x86/math-emu/fpu_proto.h             |    4 
 arch/x86/math-emu/fpu_system.h            |   16 -
 arch/x86/math-emu/get_address.c           |   75 ++---
 arch/x86/vdso/Makefile                    |    2 
 arch/x86/xen/enlighten.c                  |   17 -
 include/linux/elfcore.h                   |    9 
 kernel/kexec.c                            |    2 
 kernel/panic.c                            |    4 
 scripts/gcc-x86_32-has-stack-protector.sh |    8 
 scripts/gcc-x86_64-has-stack-protector.sh |    4 
 36 files changed, 619 insertions(+), 335 deletions(-)

Thanks.

--
tejun

[1] 2076fe22811d836936b80ad1c55997f70bb0ae8d

^ permalink raw reply	[flat|nested] 48+ messages in thread

end of thread, other threads:[~2009-02-11 14:20 UTC | newest]

Thread overview: 48+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2009-02-09 13:39 [PATCHSET x86/master] add stack protector support for x86_32 Tejun Heo
2009-02-09 13:39 ` [PATCH 01/11] x86: include correct %gs in a.out core dump Tejun Heo
2009-02-09 17:12   ` Jeremy Fitzhardinge
2009-02-09 13:39 ` [PATCH 02/11] x86: math_emu info cleanup Tejun Heo
2009-02-09 13:42   ` Ingo Molnar
2009-02-09 13:45     ` Ingo Molnar
2009-02-09 13:52       ` Tejun Heo
2009-02-09 13:39 ` [PATCH 03/11] x86: fix math_emu register frame access Tejun Heo
2009-02-09 17:13   ` Brian Gerst
2009-02-09 23:40     ` Ingo Molnar
2009-02-10  1:08     ` Tejun Heo
2009-02-09 13:39 ` [PATCH 04/11] elf: add ELF_CORE_COPY_KERNEL_REGS() Tejun Heo
2009-02-09 13:39 ` [PATCH 05/11] x86: stackprotector.h misc update Tejun Heo
2009-02-09 13:39 ` [PATCH 06/11] stackprotector: update make rules Tejun Heo
2009-02-09 13:39 ` [PATCH 07/11] x86: no stack protector for vdso Tejun Heo
2009-02-09 13:39 ` [PATCH 08/11] x86: use asm .macro instead of cpp #define in entry_32.S Tejun Heo
2009-02-09 18:34   ` Jeremy Fitzhardinge
2009-02-10  1:14     ` Tejun Heo
2009-02-10  1:18       ` Jeremy Fitzhardinge
2009-02-10 11:11         ` Ingo Molnar
2009-02-09 13:39 ` [PATCH 09/11] x86: add %gs accessors for x86_32 Tejun Heo
2009-02-09 13:39 ` [PATCH 10/11] x86: make lazy %gs optional on x86_32 Tejun Heo
2009-02-09 18:12   ` Jeremy Fitzhardinge
2009-02-10  1:27     ` Tejun Heo
2009-02-10  1:51       ` Jeremy Fitzhardinge
2009-02-09 13:39 ` [PATCH 11/11] x86: implement x86_32 stack protector Tejun Heo
2009-02-10 15:25   ` Brian Gerst
2009-02-10 15:39     ` Tejun Heo
2009-02-11  7:31       ` [PATCH x86#core/percpu] x86: fix x86_32 stack protector bugs Tejun Heo
2009-02-11 10:34         ` Ingo Molnar
2009-02-11 14:18           ` Tejun Heo
2009-02-09 13:55 ` [PATCHSET x86/master] add stack protector support for x86_32 Ingo Molnar
2009-02-09 14:06   ` Ingo Molnar
2009-02-09 20:30     ` Ingo Molnar
2009-02-10 13:56       ` Tejun Heo
2009-02-10 14:16         ` Ingo Molnar
2009-02-09 14:12   ` Ingo Molnar
2009-02-10 13:54     ` Tejun Heo
2009-02-10 14:16       ` Tejun Heo
2009-02-10 14:20         ` Ingo Molnar
2009-02-10 14:26           ` Tejun Heo
2009-02-11 10:57             ` Ingo Molnar
2009-02-11 11:18               ` [PATCH] stackprotector: fix multi-word cross-builds Ingo Molnar
2009-02-11 14:19                 ` Tejun Heo
2009-02-10 14:19       ` [PATCHSET x86/master] add stack protector support for x86_32 Ingo Molnar
2009-02-09 14:09 ` Brian Gerst
2009-02-09 14:15   ` Ingo Molnar
2009-02-10  1:36     ` Tejun Heo

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.