String optimizations and call support in alternatives

A patchset in state Mainline for linux-kernel

From: Heiko Stuebner <heiko@...> Date: Fri, 4 Nov 2022 23:31:43 +0100

Hi all, this is sort of a "where I'm at" with optimizing str* and mem* when taking into account possible multiple variants due to various extensions being available. There are essentially two parts to handle: - making str* functions able to replace what they do performantly for possible multiple variants This is done by inlining the core functions and then using alternatives to call the actual variant. This of course will also need a more intelligent selection mechanism in the future and as you can see also involves the EFI stub in a tiny way. - actually allowing calls in alternatives Function calls use auipc + jalr to reach those 32bit relative addresses but when they're compiled the offset will be wrong as alternatives live in a different section, so when the patch got applied the address will point to the wrong location. So similar to arm64 the target addresses need to be updated. As you can see the zbb part itself is not ready yet, as I lost way too much time on the offset fixes so far, so my replacement functions are actually "just" copies of the generic ones so far. But the effect is similar. Without the offset fix, the function addresses are wrong as expected and the fix seems to point things correctly in all my tests, both in the kernel and modules. So this is my try to get some eyeballs on all the things I may be missing and as similar topics came up in different threads, to also allow me to point to something. Thanks Heiko Heiko Stuebner (9): string: allow override for strstarts() efi/riscv: libstub: mark when compiling libstub RISC-V: add auipc elements to parse_asm header RISC-V: add U-type imm parsing to parse_asm header RISC-V: add rd reg parsing to parse_asm header RISC-V: fix auipc-jalr addresses in patched alternatives RISC-V: add infrastructure to allow different str* implementations HACK: RISC-V: add zbb support to string functions HACK: disable strchr call in overlay-fs arch/riscv/Kconfig | 23 +++++++ arch/riscv/include/asm/errata_list.h | 3 +- arch/riscv/include/asm/hwcap.h | 1 + arch/riscv/include/asm/parse_asm.h | 21 ++++++ arch/riscv/include/asm/string.h | 96 +++++++++++++++++++++++++++ arch/riscv/kernel/cpu.c | 1 + arch/riscv/kernel/cpufeature.c | 96 ++++++++++++++++++++++++++- arch/riscv/kernel/image-vars.h | 6 +- arch/riscv/lib/Makefile | 10 +++ arch/riscv/lib/strcmp.S | 25 +++++++ arch/riscv/lib/strcmp_tmp.S | 25 +++++++ arch/riscv/lib/strcmp_zbb.S | 70 +++++++++++++++++++ arch/riscv/lib/string.c | 20 ++++++ arch/riscv/lib/strlen.S | 17 +++++ arch/riscv/lib/strlen_tmp.S | 17 +++++ arch/riscv/lib/strlen_zbb.S | 80 ++++++++++++++++++++++ arch/riscv/lib/strncmp.S | 27 ++++++++ arch/riscv/lib/strncmp_tmp.S | 27 ++++++++ arch/riscv/lib/strncmp_zbb.S | 85 ++++++++++++++++++++++++ drivers/firmware/efi/libstub/Makefile | 2 +- fs/overlayfs/super.c | 3 +- include/linux/string.h | 2 + 22 files changed, 649 insertions(+), 8 deletions(-) create mode 100644 arch/riscv/lib/strcmp.S create mode 100644 arch/riscv/lib/strcmp_tmp.S create mode 100644 arch/riscv/lib/strcmp_zbb.S create mode 100644 arch/riscv/lib/string.c create mode 100644 arch/riscv/lib/strlen.S create mode 100644 arch/riscv/lib/strlen_tmp.S create mode 100644 arch/riscv/lib/strlen_zbb.S create mode 100644 arch/riscv/lib/strncmp.S create mode 100644 arch/riscv/lib/strncmp_tmp.S create mode 100644 arch/riscv/lib/strncmp_zbb.S -- 2.35.1

Patches in this set

Statistics

  • 9 individual patches
  • 653 lines added
  • 12 lines removed
 

Recent Patches

About Us

Sed lacus. Donec lectus. Nullam pretium nibh ut turpis. Nam bibendum. In nulla tortor, elementum vel, tempor at, varius non, purus. Mauris vitae nisl nec metus placerat consectetuer.

Read More...