mbox series

[RFC,V3,00/18] objtool: Add support for arm64

Message ID 20190624095548.8578-1-raphael.gault@arm.com (mailing list archive)
Headers show
Series objtool: Add support for arm64 | expand

Message

Raphael Gault June 24, 2019, 9:55 a.m. UTC
As of now, objtool only supports the x86_64 architecture but the
groundwork has already been done in order to add support for other
architectures without too much effort.

This series of patches adds support for the arm64 architecture
based on the Armv8.5 Architecture Reference Manual.

Objtool will be a valuable tool to progress and provide more guarentees
on live patching which is a work in progress for arm64.

Once we have the base of objtool working the next steps will be to
port Peter Z's uaccess validation for arm64.

Changes since previous version:
* Rebased on tip/master: Note that I had to re-expose the
`struct alternative` using check.h because it is now used outside of
check.c.
* Reorder commits for a more coherent progression
* Introduce GCC plugin to help detect switch-tables for arm64
This plugins could be improve: It plugs in after the RTL control flow
graph passes but only extract information about the switch tables. I
originally intended for it to introduce new code_label/note within the
RTL representation in order to reference them and thus get the address
of the branch instruction. However I did not manage to do it properly
using gen_rtx_CODE_LABEL/emit_label_before/after. If anyone has some
experience with RTL plugins I am all ears for advices.

Raphael Gault (18):
  objtool: Add abstraction for computation of symbols offsets
  objtool: orc: Refactor ORC API for other architectures to implement.
  objtool: Move registers and control flow to arch-dependent code
  objtool: arm64: Add required implementation for supporting the aarch64
    architecture in objtool.
  objtool: special: Adapt special section handling
  objtool: arm64: Adapt the stack frame checks for arm architecture
  objtool: Introduce INSN_UNKNOWN type
  objtool: Refactor switch-tables code to support other architectures
  gcc-plugins: objtool: Add plugin to detect switch table on arm64
  objtool: arm64: Implement functions to add switch tables alternatives
  arm64: alternative: Mark .altinstr_replacement as containing
    executable instructions
  arm64: assembler: Add macro to annotate asm function having non
    standard stack-frame.
  arm64: sleep: Prevent stack frame warnings from objtool
  arm64: kvm: Annotate non-standard stack frame functions
  arm64: kernel: Add exception on kuser32 to prevent stack analysis
  arm64: crypto: Add exceptions for crypto object to prevent stack
    analysis
  arm64: kernel: Annotate non-standard stack frame functions
  objtool: arm64: Enable stack validation for arm64

 arch/arm64/Kconfig                            |    1 +
 arch/arm64/crypto/Makefile                    |    3 +
 arch/arm64/include/asm/alternative.h          |    2 +-
 arch/arm64/include/asm/assembler.h            |   13 +
 arch/arm64/kernel/Makefile                    |    3 +
 arch/arm64/kernel/hyp-stub.S                  |    2 +
 arch/arm64/kernel/sleep.S                     |    4 +
 arch/arm64/kvm/hyp-init.S                     |    2 +
 arch/arm64/kvm/hyp/entry.S                    |    2 +
 scripts/Makefile.gcc-plugins                  |    2 +
 scripts/gcc-plugins/Kconfig                   |    9 +
 .../arm64_switch_table_detection_plugin.c     |   58 +
 tools/objtool/Build                           |    2 -
 tools/objtool/arch.h                          |   21 +-
 tools/objtool/arch/arm64/Build                |    8 +
 tools/objtool/arch/arm64/arch_special.c       |  173 +
 tools/objtool/arch/arm64/bit_operations.c     |   67 +
 tools/objtool/arch/arm64/decode.c             | 2809 +++++++++++++++++
 .../objtool/arch/arm64/include/arch_special.h |   52 +
 .../arch/arm64/include/asm/orc_types.h        |   96 +
 .../arch/arm64/include/bit_operations.h       |   24 +
 tools/objtool/arch/arm64/include/cfi.h        |   74 +
 .../objtool/arch/arm64/include/insn_decode.h  |  210 ++
 tools/objtool/arch/arm64/orc_dump.c           |   26 +
 tools/objtool/arch/arm64/orc_gen.c            |   40 +
 tools/objtool/arch/x86/Build                  |    3 +
 tools/objtool/arch/x86/arch_special.c         |  101 +
 tools/objtool/arch/x86/decode.c               |   16 +
 tools/objtool/arch/x86/include/arch_special.h |   45 +
 tools/objtool/{ => arch/x86/include}/cfi.h    |    0
 tools/objtool/{ => arch/x86}/orc_dump.c       |    4 +-
 tools/objtool/{ => arch/x86}/orc_gen.c        |  104 +-
 tools/objtool/check.c                         |  309 +-
 tools/objtool/check.h                         |   10 +
 tools/objtool/elf.c                           |    3 +-
 tools/objtool/orc.h                           |    4 +-
 tools/objtool/special.c                       |   28 +-
 tools/objtool/special.h                       |   13 +-
 38 files changed, 4119 insertions(+), 224 deletions(-)
 create mode 100644 scripts/gcc-plugins/arm64_switch_table_detection_plugin.c
 create mode 100644 tools/objtool/arch/arm64/Build
 create mode 100644 tools/objtool/arch/arm64/arch_special.c
 create mode 100644 tools/objtool/arch/arm64/bit_operations.c
 create mode 100644 tools/objtool/arch/arm64/decode.c
 create mode 100644 tools/objtool/arch/arm64/include/arch_special.h
 create mode 100644 tools/objtool/arch/arm64/include/asm/orc_types.h
 create mode 100644 tools/objtool/arch/arm64/include/bit_operations.h
 create mode 100644 tools/objtool/arch/arm64/include/cfi.h
 create mode 100644 tools/objtool/arch/arm64/include/insn_decode.h
 create mode 100644 tools/objtool/arch/arm64/orc_dump.c
 create mode 100644 tools/objtool/arch/arm64/orc_gen.c
 create mode 100644 tools/objtool/arch/x86/arch_special.c
 create mode 100644 tools/objtool/arch/x86/include/arch_special.h
 rename tools/objtool/{ => arch/x86/include}/cfi.h (100%)
 rename tools/objtool/{ => arch/x86}/orc_dump.c (98%)
 rename tools/objtool/{ => arch/x86}/orc_gen.c (66%)

Comments

Raphael Gault July 10, 2019, 7:31 a.m. UTC | #1
Hi all,

Just a gentle ping to see if anyone has comments to make about this 
version :)

On 6/24/19 10:55 AM, Raphael Gault wrote:
> As of now, objtool only supports the x86_64 architecture but the
> groundwork has already been done in order to add support for other
> architectures without too much effort.
> 
> This series of patches adds support for the arm64 architecture
> based on the Armv8.5 Architecture Reference Manual.
> 
> Objtool will be a valuable tool to progress and provide more guarentees
> on live patching which is a work in progress for arm64.
> 
> Once we have the base of objtool working the next steps will be to
> port Peter Z's uaccess validation for arm64.
> 
> Changes since previous version:
> * Rebased on tip/master: Note that I had to re-expose the
> `struct alternative` using check.h because it is now used outside of
> check.c.
> * Reorder commits for a more coherent progression
> * Introduce GCC plugin to help detect switch-tables for arm64
> This plugins could be improve: It plugs in after the RTL control flow
> graph passes but only extract information about the switch tables. I
> originally intended for it to introduce new code_label/note within the
> RTL representation in order to reference them and thus get the address
> of the branch instruction. However I did not manage to do it properly
> using gen_rtx_CODE_LABEL/emit_label_before/after. If anyone has some
> experience with RTL plugins I am all ears for advices.
> 
> Raphael Gault (18):
>    objtool: Add abstraction for computation of symbols offsets
>    objtool: orc: Refactor ORC API for other architectures to implement.
>    objtool: Move registers and control flow to arch-dependent code
>    objtool: arm64: Add required implementation for supporting the aarch64
>      architecture in objtool.
>    objtool: special: Adapt special section handling
>    objtool: arm64: Adapt the stack frame checks for arm architecture
>    objtool: Introduce INSN_UNKNOWN type
>    objtool: Refactor switch-tables code to support other architectures
>    gcc-plugins: objtool: Add plugin to detect switch table on arm64
>    objtool: arm64: Implement functions to add switch tables alternatives
>    arm64: alternative: Mark .altinstr_replacement as containing
>      executable instructions
>    arm64: assembler: Add macro to annotate asm function having non
>      standard stack-frame.
>    arm64: sleep: Prevent stack frame warnings from objtool
>    arm64: kvm: Annotate non-standard stack frame functions
>    arm64: kernel: Add exception on kuser32 to prevent stack analysis
>    arm64: crypto: Add exceptions for crypto object to prevent stack
>      analysis
>    arm64: kernel: Annotate non-standard stack frame functions
>    objtool: arm64: Enable stack validation for arm64
> 
>   arch/arm64/Kconfig                            |    1 +
>   arch/arm64/crypto/Makefile                    |    3 +
>   arch/arm64/include/asm/alternative.h          |    2 +-
>   arch/arm64/include/asm/assembler.h            |   13 +
>   arch/arm64/kernel/Makefile                    |    3 +
>   arch/arm64/kernel/hyp-stub.S                  |    2 +
>   arch/arm64/kernel/sleep.S                     |    4 +
>   arch/arm64/kvm/hyp-init.S                     |    2 +
>   arch/arm64/kvm/hyp/entry.S                    |    2 +
>   scripts/Makefile.gcc-plugins                  |    2 +
>   scripts/gcc-plugins/Kconfig                   |    9 +
>   .../arm64_switch_table_detection_plugin.c     |   58 +
>   tools/objtool/Build                           |    2 -
>   tools/objtool/arch.h                          |   21 +-
>   tools/objtool/arch/arm64/Build                |    8 +
>   tools/objtool/arch/arm64/arch_special.c       |  173 +
>   tools/objtool/arch/arm64/bit_operations.c     |   67 +
>   tools/objtool/arch/arm64/decode.c             | 2809 +++++++++++++++++
>   .../objtool/arch/arm64/include/arch_special.h |   52 +
>   .../arch/arm64/include/asm/orc_types.h        |   96 +
>   .../arch/arm64/include/bit_operations.h       |   24 +
>   tools/objtool/arch/arm64/include/cfi.h        |   74 +
>   .../objtool/arch/arm64/include/insn_decode.h  |  210 ++
>   tools/objtool/arch/arm64/orc_dump.c           |   26 +
>   tools/objtool/arch/arm64/orc_gen.c            |   40 +
>   tools/objtool/arch/x86/Build                  |    3 +
>   tools/objtool/arch/x86/arch_special.c         |  101 +
>   tools/objtool/arch/x86/decode.c               |   16 +
>   tools/objtool/arch/x86/include/arch_special.h |   45 +
>   tools/objtool/{ => arch/x86/include}/cfi.h    |    0
>   tools/objtool/{ => arch/x86}/orc_dump.c       |    4 +-
>   tools/objtool/{ => arch/x86}/orc_gen.c        |  104 +-
>   tools/objtool/check.c                         |  309 +-
>   tools/objtool/check.h                         |   10 +
>   tools/objtool/elf.c                           |    3 +-
>   tools/objtool/orc.h                           |    4 +-
>   tools/objtool/special.c                       |   28 +-
>   tools/objtool/special.h                       |   13 +-
>   38 files changed, 4119 insertions(+), 224 deletions(-)
>   create mode 100644 scripts/gcc-plugins/arm64_switch_table_detection_plugin.c
>   create mode 100644 tools/objtool/arch/arm64/Build
>   create mode 100644 tools/objtool/arch/arm64/arch_special.c
>   create mode 100644 tools/objtool/arch/arm64/bit_operations.c
>   create mode 100644 tools/objtool/arch/arm64/decode.c
>   create mode 100644 tools/objtool/arch/arm64/include/arch_special.h
>   create mode 100644 tools/objtool/arch/arm64/include/asm/orc_types.h
>   create mode 100644 tools/objtool/arch/arm64/include/bit_operations.h
>   create mode 100644 tools/objtool/arch/arm64/include/cfi.h
>   create mode 100644 tools/objtool/arch/arm64/include/insn_decode.h
>   create mode 100644 tools/objtool/arch/arm64/orc_dump.c
>   create mode 100644 tools/objtool/arch/arm64/orc_gen.c
>   create mode 100644 tools/objtool/arch/x86/arch_special.c
>   create mode 100644 tools/objtool/arch/x86/include/arch_special.h
>   rename tools/objtool/{ => arch/x86/include}/cfi.h (100%)
>   rename tools/objtool/{ => arch/x86}/orc_dump.c (98%)
>   rename tools/objtool/{ => arch/x86}/orc_gen.c (66%)
> 

Cheers,
Josh Poimboeuf July 10, 2019, 2:33 p.m. UTC | #2
On Wed, Jul 10, 2019 at 08:31:28AM +0100, Raphael Gault wrote:
> Hi all,
> 
> Just a gentle ping to see if anyone has comments to make about this version
> :)

Hi Raphael,

Sorry for the delay.  I haven't forgotten about these patches.  I hope
to do a proper review in the next week or so.