Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit fbe9c961 authored by Roman Zippel's avatar Roman Zippel Committed by Linus Torvalds
Browse files

m68k: runtime patching infrastructure



Add the basic infrastructure to allow runtime patching of kernel and modules
to optimize a few functions with parameters, which are only calculated once
during bootup and are otherwise constant.  Use this for the conversion between
virtual and physical addresses.

Signed-off-by: default avatarRoman Zippel <zippel@linux-m68k.org>
Signed-off-by: default avatarGeert Uytterhoeven <geert@linux-m68k.org>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent 1fc799e1
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -19,6 +19,7 @@ COMPILE_ARCH = $(shell uname -m)
# override top level makefile
AS += -m68020
LDFLAGS := -m m68kelf
LDFLAGS_MODULE += -T $(srctree)/arch/m68k/kernel/module.lds
ifneq ($(COMPILE_ARCH),$(ARCH))
	# prefix for cross-compiling binaries
	CROSS_COMPILE = m68k-linux-gnu-
+1 −2
Original line number Diff line number Diff line
@@ -9,13 +9,12 @@ else
endif
extra-y	+= vmlinux.lds

obj-y	:= entry.o process.o traps.o ints.o signal.o ptrace.o \
obj-y	:= entry.o process.o traps.o ints.o signal.o ptrace.o module.o \
	   sys_m68k.o time.o semaphore.o setup.o m68k_ksyms.o devres.o

devres-y = ../../../kernel/irq/devres.o

obj-$(CONFIG_PCI)	+= bios32.o
obj-$(CONFIG_MODULES)	+= module.o
obj-y$(CONFIG_MMU_SUN3) += dma.o	# no, it's not a typo

EXTRA_AFLAGS := -traditional
+27 −1
Original line number Diff line number Diff line
/*
 * This file is subject to the terms and conditions of the GNU General Public
 * License.  See the file COPYING in the main directory of this archive
 * for more details.
 */

#include <linux/moduleloader.h>
#include <linux/elf.h>
#include <linux/vmalloc.h>
@@ -11,6 +17,8 @@
#define DEBUGP(fmt...)
#endif

#ifdef CONFIG_MODULES

void *module_alloc(unsigned long size)
{
	if (size == 0)
@@ -118,11 +126,29 @@ int apply_relocate_add(Elf32_Shdr *sechdrs,

int module_finalize(const Elf_Ehdr *hdr,
		    const Elf_Shdr *sechdrs,
		    struct module *me)
		    struct module *mod)
{
	module_fixup(mod, mod->arch.fixup_start, mod->arch.fixup_end);

	return 0;
}

void module_arch_cleanup(struct module *mod)
{
}

#endif /* CONFIG_MODULES */

void module_fixup(struct module *mod, struct m68k_fixup_info *start,
		  struct m68k_fixup_info *end)
{
	struct m68k_fixup_info *fixup;

	for (fixup = start; fixup < end; fixup++) {
		switch (fixup->type) {
		case m68k_fixup_memoffset:
			*(u32 *)fixup->addr = m68k_memoffset;
			break;
		}
	}
}
+7 −0
Original line number Diff line number Diff line
SECTIONS {
	.m68k_fixup : {
		__start_fixup = .;
		*(.m68k_fixup)
		__stop_fixup = .;
	}
}
+5 −0
Original line number Diff line number Diff line
@@ -60,6 +60,11 @@ SECTIONS
  __con_initcall_start = .;
  .con_initcall.init : { *(.con_initcall.init) }
  __con_initcall_end = .;
  .m68k_fixup : {
	__start_fixup = .;
	*(.m68k_fixup)
	__stop_fixup = .;
  }
  SECURITY_INIT
#ifdef CONFIG_BLK_DEV_INITRD
  . = ALIGN(8192);
Loading