kernel_optimize_test/arch/sparc/kernel
David S. Miller 2f6c9bf31a sparc: Improve VDSO instruction patching.
The current VDSO patch mechanism has several problems:

1) It assumes how gcc will emit a function, with a register
   window, an initial save instruction and then immediately
   the %tick read when compiling vread_tick().

   There is no such guarantees, code generation could change
   at any time, gcc could put a nop between the save and
   the %tick read, etc.

   So this is extremely fragile and would fail some day.

2) It disallows us to properly inline vread_tick() into the callers
   and thus get the best possible code sequences.

So fix this to patch properly, with location based annotations.

We have to be careful because we cannot do it the way we do
patches elsewhere in the kernel.  Those use a sequence like:

	1:
	insn
	.section	.whatever_patch, "ax"
	.word		1b
	replacement_insn
	.previous

This is a dynamic shared object, so that .word cannot be resolved at
build time, and thus cannot be used to execute the patches when the
kernel initializes the images.

Even trying to use label difference equations doesn't work in the
above kind of scheme:

	1:
	insn
	.section	.whatever_patch, "ax"
	.word		. - 1b
	replacement_insn
	.previous

The assembler complains that it cannot resolve that computation.
The issue is that this is contained in an executable section.

Borrow the sequence used by x86 alternatives, which is:

	1:
	insn
	.pushsection	.whatever_patch, "a"
	.word		. - 1b, . - 1f
	.popsection
	.pushsection	.whatever_patch_replacements, "ax"
	1:
	replacement_insn
	.previous

This works, allows us to inline vread_tick() as much as we like, and
can be used for arbitrary kinds of VDSO patching in the future.

Also, reverse the condition for patching.  Most systems are %stick
based, so if we only patch on %tick systems the patching code will
get little or no testing.

Signed-off-by: David S. Miller <davem@davemloft.net>
2018-10-22 15:22:14 -07:00
..
.gitignore
adi_64.c sparc64: Add support for ADI (Application Data Integrity) 2018-03-18 07:38:48 -07:00
apc.c
asm-offsets.c
audit.c
auxio_32.c
auxio_64.c Revert "sparc: Convert to using %pOFn instead of device_node.name" 2018-10-15 18:32:54 -07:00
btext.c
central.c
cherrs.S
chmc.c
compat_audit.c
cpu.c
cpumap.c
cpumap.h
devices.c
ds.c
dtlb_miss.S
dtlb_prot.S
ebus.c
entry.h sparc64: Add support for ADI register fields, ASIs and traps 2018-03-18 07:38:45 -07:00
entry.S sparc: get rid of asm wrapper for nis_syscall() 2018-03-20 12:05:17 -04:00
etrap_32.S
etrap_64.S sparc64: Add support for ADI (Application Data Integrity) 2018-03-18 07:38:48 -07:00
fpu_traps.S
ftrace.c
getsetcc.S
head_32.S
head_64.S sparc64: Add support for ADI register fields, ASIs and traps 2018-03-18 07:38:45 -07:00
helpers.S
hvapi.c
hvcalls.S
hvtramp.S
idprom.c
iommu_common.h
iommu-common.c iommu-common: move to arch/sparc 2018-05-09 06:54:27 +02:00
iommu.c iommu-common: move to arch/sparc 2018-05-09 06:54:27 +02:00
ioport.c sparc: use generic dma_noncoherent_ops 2018-08-21 12:37:16 -07:00
irq_32.c
irq_64.c headers: untangle kmemleak.h from mm.h 2018-04-05 21:36:27 -07:00
irq.h
itlb_miss.S
ivec.S
jump_label.c
kernel.h
kgdb_32.c sparc32: fix fall-through annotation 2018-10-07 22:42:02 -07:00
kgdb_64.c sparc64: fix fall-through annotation 2018-10-07 22:42:02 -07:00
kprobes.c bpf/error-inject/kprobes: Clear current_kprobe and enable preempt in kprobe 2018-06-21 12:33:19 +02:00
kstack.h
ktlb.S
ldc.c iommu-common: move to arch/sparc 2018-05-09 06:54:27 +02:00
led.c
leon_kernel.c
leon_pci_grpci1.c
leon_pci_grpci2.c
leon_pci.c sparc/PCI: Use dev_printk() when possible 2018-05-22 07:54:06 -05:00
leon_pmc.c
leon_smp.c
Makefile iommu-common: move to arch/sparc 2018-05-09 06:54:27 +02:00
mdesc.c sparc64: Add auxiliary vectors to report platform ADI properties 2018-03-18 07:38:46 -07:00
misctrap.S
module.c
nmi.c treewide: kmalloc() -> kmalloc_array() 2018-06-12 16:19:22 -07:00
of_device_32.c sparc: set a default 32-bit dma mask for OF devices 2018-09-02 10:02:04 +02:00
of_device_64.c sparc: set a default 32-bit dma mask for OF devices 2018-09-02 10:02:04 +02:00
of_device_common.c
of_device_common.h
pci_common.c sparc/PCI: Use dev_printk() when possible 2018-05-22 07:54:06 -05:00
pci_fire.c
pci_impl.h
pci_msi.c sparc/PCI: Use dev_printk() when possible 2018-05-22 07:54:06 -05:00
pci_psycho.c
pci_sabre.c
pci_schizo.c
pci_sun4v_asm.S
pci_sun4v.c iommu-common: move to arch/sparc 2018-05-09 06:54:27 +02:00
pci_sun4v.h
pci.c sparc/PCI: Use dev_printk() when possible 2018-05-22 07:54:06 -05:00
pcic.c sparc/PCI: Use dev_printk() when possible 2018-05-22 07:54:06 -05:00
pcr.c
perf_event.c sparc: Throttle perf events properly. 2018-10-12 10:33:20 -07:00
pmc.c
power.c Revert "sparc: Convert to using %pOFn instead of device_node.name" 2018-10-15 18:32:54 -07:00
process_32.c
process_64.c signal/sparc: Use force_sig_fault where appropriate 2018-04-25 10:44:10 -05:00
prom_32.c Revert "sparc: Convert to using %pOFn instead of device_node.name" 2018-10-15 18:32:54 -07:00
prom_64.c Revert "sparc: Convert to using %pOFn instead of device_node.name" 2018-10-15 18:32:54 -07:00
prom_common.c
prom_irqtrans.c
prom.h
psycho_common.c
psycho_common.h
ptrace_32.c
ptrace_64.c
reboot.c
rtrap_32.S
rtrap_64.S sparc64: Set %l4 properly on trap return after handling signals. 2018-10-14 20:22:28 -07:00
sbus.c
setup_32.c fs: add ksys_sync() helper; remove in-kernel calls to sys_sync() 2018-04-02 20:16:05 +02:00
setup_64.c sparc64: Add support for ADI (Application Data Integrity) 2018-03-18 07:38:48 -07:00
signal_32.c
signal_64.c
signal32.c
sigutil_32.c
sigutil_64.c
sigutil.h
smp_32.c
smp_64.c mm: fix races between swapoff and flush dcache 2018-04-05 21:36:26 -07:00
sparc_ksyms.c
spiterrs.S
sstate.c
stacktrace.c
starfire.c
sun4d_irq.c
sun4d_smp.c
sun4m_irq.c
sun4m_smp.c
sun4v_ivec.S
sun4v_mcd.S sparc64: Add support for ADI register fields, ASIs and traps 2018-03-18 07:38:45 -07:00
sun4v_tlb_miss.S
sys_sparc_32.c sys: don't hold uts_sem while accessing userspace memory 2018-08-11 02:05:53 -05:00
sys_sparc_64.c sys: don't hold uts_sem while accessing userspace memory 2018-08-11 02:05:53 -05:00
sys_sparc32.c Merge branch 'misc.sparc' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs 2018-04-07 14:30:28 -07:00
sys32.S sparc: get rid of remaining SIGN... wrappers 2018-03-20 12:01:23 -04:00
syscalls.S sparc: get rid of asm wrapper for nis_syscall() 2018-03-20 12:05:17 -04:00
sysfs.c
systbls_32.S sparc: Wire up io_pgetevents system call. 2018-10-09 16:52:38 -07:00
systbls_64.S sparc: Wire up io_pgetevents system call. 2018-10-09 16:52:38 -07:00
systbls.h sparc: get rid of asm wrapper for nis_syscall() 2018-03-20 12:05:17 -04:00
time_32.c
time_64.c sparc: Improve VDSO instruction patching. 2018-10-22 15:22:14 -07:00
trampoline_32.S
trampoline_64.S
traps_32.c signal/sparc: Use force_sig_fault where appropriate 2018-04-25 10:44:10 -05:00
traps_64.c signal/sparc: Use force_sig_fault where appropriate 2018-04-25 10:44:10 -05:00
tsb.S
ttable_32.S
ttable_64.S sparc64: Add support for ADI register fields, ASIs and traps 2018-03-18 07:38:45 -07:00
una_asm_32.S
una_asm_64.S
unaligned_32.c signal/sparc: Use send_sig_fault where appropriate 2018-04-25 10:44:09 -05:00
unaligned_64.c
uprobes.c
urtt_fill.S sparc64: Add support for ADI (Application Data Integrity) 2018-03-18 07:38:48 -07:00
utrap.S
vdso.c
vio.c sparc: vio: use put_device() instead of kfree() 2018-04-30 16:09:34 -04:00
viohs.c sparc64: viohs: Remove VLA usage 2018-10-07 22:42:00 -07:00
visemul.c
vmlinux.lds.S sparc64: Add support for ADI (Application Data Integrity) 2018-03-18 07:38:48 -07:00
windows.c
winfixup.S
wof.S
wuf.S