Every year or so, I make an attempt at contributing assembler macros
that encapsulate PC-relative references, including loads and stores,
and updating existing assembler code to make it more readable and
concise.

Patch #1 implements adr_l, ldr_l and str_l macros that emit PC-relative
references with unlimited range. For v7 and later, relative movw/movt
pairs are used (avoiding the need for loading literals via the D-cache).
For older CPUs, a literal containing a relative offset wrt the instruction
that adds the value of PC is emitted into a subsection, which works around
the objections given last time around, regarding the limited range of
PC-relative group relocations, and the fact that they are EABI only. In
this case, the range is unlimited, although the subsection needs to be
emitted within 4 K of the ldr instruction. (This limit can be extended
but that is currently unnecessary: .text sizes of objects built from .S
files never exceed 4 K in size. Please refer to the list below, after
the diffstat, for the sizes of the .text sections of all such objects
that are built as part of a multi_v7_defconfig kernel)

All patches beyond #1 are independent, but obviously all depend on the
first one. I understand there may be concerns about churn, but some of
these cleanups are really quite nice so please don't dismiss the series
wholesale for that reason.

Ard Biesheuvel (15):
  ARM: assembler: introduce adr_l, ldr_l and str_l macros
  ARM: head-common.S: use PC-relative insn sequence for __proc_info
  ARM: head-common.S: use PC-relative insn sequence for __turn_mmu_on
  ARM: head.S: use PC-relative insn sequence for secondary_data
  ARM: head: use PC-relative insn sequence for __smp_alt
  ARM: sleep.S: use PC-relative insn sequence for
    sleep_save_sp/mpidr_hash
  ARM: head.S: use PC-relative insn sequences for __fixup_pv_table
  ARM: head.S: use PC relative insn sequence to calculate PHYS_OFFSET
  ARM: kvm: replace open coded VA->PA calculations with adr_l call
  arm-soc: exynos: replace open coded VA->PA conversions
  arm-soc: mvebu: replace open coded VA->PA conversion
  arm-soc: omap: replace open coded VA->PA calculations
  arm-soc: various: replace open coded VA->PA calculation of pen_release
  arm-soc: shmobile: replace open coded VA->PA calculation
  ARM: l2c: replace open coded VA->PA calculation

 arch/arm/boot/compressed/head.S    | 15 +---
 arch/arm/include/asm/assembler.h   | 70 +++++++++++++++++
 arch/arm/kernel/head-common.S      | 22 ++----
 arch/arm/kernel/head.S             | 80 +++++---------------
 arch/arm/kernel/hyp-stub.S         | 33 +++-----
 arch/arm/kernel/sleep.S            | 16 +---
 arch/arm/kvm/init.S                |  8 +-
 arch/arm/mach-exynos/headsmp.S     |  9 +--
 arch/arm/mach-exynos/sleep.S       | 26 ++-----
 arch/arm/mach-mvebu/coherency_ll.S |  8 +-
 arch/arm/mach-omap2/sleep34xx.S    | 21 +----
 arch/arm/mach-omap2/sleep44xx.S    | 12 +--
 arch/arm/mach-prima2/headsmp.S     | 11 +--
 arch/arm/mach-shmobile/headsmp.S   | 14 +---
 arch/arm/mach-spear/headsmp.S      | 11 +--
 arch/arm/mach-sti/headsmp.S        | 10 +--
 arch/arm/mm/l2c-l2x0-resume.S      |  7 +-
 arch/arm/plat-versatile/headsmp.S  |  9 +--
 18 files changed, 140 insertions(+)

-- 
2.11.0

   text    data     bss     dec     hex  filename
    240       0       0     240      f0  linux-arm-build/arch/arm/lib/div64.o
   1608       0       0    1608     648  
linux-arm-build/arch/arm/lib/copy_to_user.o
    892       0       0     892     37c  
linux-arm-build/arch/arm/lib/csumpartialcopy.o
    288       0       0     288     120  
linux-arm-build/arch/arm/lib/io-writesb.o
     28       0       0      28      1c  linux-arm-build/arch/arm/lib/ashldi3.o
    104       0       0     104      68  
linux-arm-build/arch/arm/lib/testclearbit.o
     44       0       0      44      2c  linux-arm-build/arch/arm/lib/ucmpdi2.o
    204       0       0     204      cc  
linux-arm-build/arch/arm/lib/io-writesw-armv4.o
     52       0       0      52      34  linux-arm-build/arch/arm/lib/csumipv6.o
    900       0       0     900     384  linux-arm-build/arch/arm/lib/memmove.o
    764       0       0     764     2fc  
linux-arm-build/arch/arm/lib/lib1funcs.o
     68       0       0      68      44  
linux-arm-build/arch/arm/lib/changebit.o
    104       0       0     104      68  
linux-arm-build/arch/arm/lib/testsetbit.o
    188       0       0     188      bc  
linux-arm-build/arch/arm/lib/io-readsl.o
   1476       0       0    1476     5c4  
linux-arm-build/arch/arm/lib/csumpartialcopyuser.o
     12       0       0      12       c  
linux-arm-build/arch/arm/lib/bswapsdi2.o
     48       0       0      48      30  
linux-arm-build/arch/arm/lib/delay-loop.o
    144       0       0     144      90  linux-arm-build/arch/arm/lib/putuser.o
     28       0       0      28      1c  linux-arm-build/arch/arm/lib/ashrdi3.o
    172       0       0     172      ac  linux-arm-build/arch/arm/lib/findbit.o
   1616       0       0    1616     650  
linux-arm-build/arch/arm/lib/copy_from_user.o
    148       0       0     148      94  linux-arm-build/arch/arm/lib/getuser.o
    212       0       0     212      d4  
linux-arm-build/arch/arm/lib/clear_user.o
    228       0       0     228      e4  
linux-arm-build/arch/arm/lib/io-readsw-armv4.o
    176       0       0     176      b0  linux-arm-build/arch/arm/lib/memzero.o
      4       0       0       4       4  
linux-arm-build/arch/arm/lib/backtrace.o
    104       0       0     104      68  
linux-arm-build/arch/arm/lib/testchangebit.o
    232       0       0     232      e8  
linux-arm-build/arch/arm/lib/csumpartial.o
     28       0       0      28      1c  linux-arm-build/arch/arm/lib/strrchr.o
    184       0       0     184      b8  linux-arm-build/arch/arm/lib/memset.o
     68       0       0      68      44  linux-arm-build/arch/arm/lib/setbit.o
     32       0       0      32      20  linux-arm-build/arch/arm/lib/strchr.o
     60       0       0      60      3c  linux-arm-build/arch/arm/lib/muldi3.o
     24       0       0      24      18  linux-arm-build/arch/arm/lib/memchr.o
    320       0       0     320     140  
linux-arm-build/arch/arm/lib/io-readsb.o
     28       0       0      28      1c  linux-arm-build/arch/arm/lib/lshrdi3.o
     32       0       0      32      20  
linux-arm-build/arch/arm/lib/call_with_stack.o
    112       0       0     112      70  
linux-arm-build/arch/arm/lib/copy_page.o
    156       0       0     156      9c  
linux-arm-build/arch/arm/lib/io-writesl.o
     68       0       0      68      44  linux-arm-build/arch/arm/lib/clearbit.o
    884       0       0     884     374  linux-arm-build/arch/arm/lib/memcpy.o
    104       0       0     104      68  linux-arm-build/arch/arm/common/vlock.o
    280       0     260     540     21c  
linux-arm-build/arch/arm/common/mcpm_head.o
   2760       0    4096    6856    1ac8  
linux-arm-build/arch/arm/boot/compressed/head.o
7324164       0       0 7324164  6fc204  
linux-arm-build/arch/arm/boot/compressed/piggy.o
      4       0       0       4       4  
linux-arm-build/arch/arm/mach-berlin/headsmp.o
    116       0     192     308     134  
linux-arm-build/arch/arm/mach-shmobile/headsmp.o
     32       0       0      32      20  
linux-arm-build/arch/arm/mach-shmobile/headsmp-scu.o
     16       0       0      16      10  
linux-arm-build/arch/arm/mach-exynos/exynos-smc.o
    168       8       0     176      b0  
linux-arm-build/arch/arm/mach-exynos/sleep.o
     28       0       0      28      1c  
linux-arm-build/arch/arm/mach-exynos/headsmp.o
     12       0       0      12       c  
linux-arm-build/arch/arm/mach-keystone/smc.o
    676       0       0     676     2a4  
linux-arm-build/arch/arm/mach-at91/pm_suspend.o
      8       0       0       8       8  
linux-arm-build/arch/arm/mach-zynq/headsmp.o
     20       0       0      20      14  
linux-arm-build/arch/arm/mach-highbank/smc.o
      0      64       0      64      40  
linux-arm-build/arch/arm/mach-rockchip/sleep.o
      8       0       0       8       8  
linux-arm-build/arch/arm/mach-rockchip/headsmp.o
     24       0       0      24      18  linux-arm-build/arch/arm/mm/abort-ev7.o
    792      44       0     836     344  linux-arm-build/arch/arm/mm/cache-v7.o
   1672     192      28    1892     764  linux-arm-build/arch/arm/mm/proc-v7.o
    140       0       0     140      8c  linux-arm-build/arch/arm/mm/tlb-v7.o
     12       0       0      12       c  linux-arm-build/arch/arm/mm/pabort-v7.o
     88       0       0      88      58  
linux-arm-build/arch/arm/mm/l2c-l2x0-resume.o
     28       0       0      28      1c  
linux-arm-build/arch/arm/mach-sti/headsmp.o
    164       0       0     164      a4  
linux-arm-build/arch/arm/mach-imx/suspend-imx53.o
    648       0       0     648     288  
linux-arm-build/arch/arm/mach-imx/suspend-imx6.o
     24       0       0      24      18  
linux-arm-build/arch/arm/mach-imx/headsmp.o
    148       0       0     148      94  
linux-arm-build/arch/arm/mach-omap2/omap-smc.o
    148       0       0     148      94  
linux-arm-build/arch/arm/mach-omap2/omap-headsmp.o
    864     124       0     988     3dc  
linux-arm-build/arch/arm/mach-omap2/sleep34xx.o
    748      12       0     760     2f8  
linux-arm-build/arch/arm/mach-omap2/sleep44xx.o
     28       0       0      28      1c  
linux-arm-build/arch/arm/plat-versatile/headsmp.o
   1156       0       0    1156     484  
linux-arm-build/arch/arm/mach-tegra/sleep-tegra20.o
    640       0       0     640     280  
linux-arm-build/arch/arm/mach-tegra/reset-handler.o
   2308       0       0    2308     904  
linux-arm-build/arch/arm/mach-tegra/sleep-tegra30.o
    284       0       0     284     11c  
linux-arm-build/arch/arm/mach-tegra/sleep.o
     76       0       0      76      4c  
linux-arm-build/arch/arm/mach-mvebu/pmsu_ll.o
    192       0       0     192      c0  
linux-arm-build/arch/arm/mach-mvebu/coherency_ll.o
      8       0       0       8       8  
linux-arm-build/arch/arm/mach-mvebu/headsmp-a9.o
     12       0       0      12       c  
linux-arm-build/arch/arm/mach-mvebu/headsmp.o
     32       0       0      32      20  
linux-arm-build/arch/arm/mach-socfpga/headsmp.o
     40       0       0      40      28  
linux-arm-build/arch/arm/mach-spear/headsmp.o
    100       0       0     100      64  
linux-arm-build/arch/arm/mach-prima2/sleep.o
     28       0       0      28      1c  
linux-arm-build/arch/arm/mach-prima2/headsmp.o
     24       0       0      24      18  
linux-arm-build/arch/arm/vdso/datapage.o
      0    4096       0    4096    1000  linux-arm-build/arch/arm/vdso/vdso.o
     36       0       0      36      24  linux-arm-build/arch/arm/vfp/entry.o
   1296       0       0    1296     510  linux-arm-build/arch/arm/vfp/vfphw.o
    356       4       0     360     168  
linux-arm-build/arch/arm/kernel/hyp-stub.o
   1096      16       0    1112     458  linux-arm-build/arch/arm/kernel/head.o
   3308      12       0    3320     cf8  
linux-arm-build/arch/arm/kernel/entry-armv.o
    644       4       0     648     288  
linux-arm-build/arch/arm/kernel/iwmmxt.o
     28       0       0      28      1c  
linux-arm-build/arch/arm/kernel/sigreturn_codes.o
   2148       0       0    2148     864  
linux-arm-build/arch/arm/kernel/entry-common.o
     64       0       0      64      40  
linux-arm-build/arch/arm/kernel/smccc-call.o
    328       8       0     336     150  linux-arm-build/arch/arm/kernel/sleep.o
    104       0       0     104      68  
linux-arm-build/arch/arm/kernel/relocate_kernel.o

Reply via email to