Commit 8b239236 authored by Michael Holzheu's avatar Michael Holzheu Committed by Pavel Emelyanov

s390:compel: Enable s390 in compel/

Add s390 parts to common code files.

Patch history
-------------
v2->v3:

 * Add: s390: Consolidate -msoft-float into Makefile.compel
Reviewed-by: 's avatarAlice Frosi <alice@linux.vnet.ibm.com>
Signed-off-by: 's avatarMichael Holzheu <holzheu@linux.vnet.ibm.com>
Reviewed-by: 's avatarDmitry Safonov <dsafonov@virtuozzo.com>
Signed-off-by: 's avatarAndrei Vagin <avagin@virtuozzo.com>
parent 7ce8f56b
......@@ -70,3 +70,11 @@ compel/$(LIBCOMPEL_SO): compel/$(LIBCOMPEL_A)
compel-install-targets += compel/$(LIBCOMPEL_SO)
compel-install-targets += compel/compel
compel-install-targets += $(compel-plugins)
# We assume that compel code does not change floating point registers.
# On s390 gcc uses fprs to cache gprs. Therefore disable floating point
# with -msoft-float.
ifeq ($(ARCH),s390)
CFLAGS += -msoft-float
HOSTCFLAGS += -msoft-float
endif
arch/x86/plugins/std/sys-exec-tbl-64.c
arch/x86/plugins/std/syscalls-64.S
arch/arm/plugins/std/syscalls/syscalls.S
arch/s390/plugins/std/syscalls/syscalls.S
include/version.h
plugins/include/uapi/std/asm/syscall-types.h
plugins/include/uapi/std/syscall-64.h
......
......@@ -542,6 +542,31 @@ int __handle_elf(void *mem, size_t size)
break;
#endif
#ifdef ELF_S390
/*
* See also arch/s390/kernel/module.c/apply_rela():
* A PLT reads the GOT (global offest table). We can handle it like
* R_390_PC32DBL because we have linked statically.
*/
case R_390_PLT32DBL: /* PC relative on a PLT (predure link table) */
pr_debug("\t\t\t\tR_390_PLT32DBL at 0x%-4lx val 0x%x\n", place, value32 + addend32);
*((int32_t *)where) = (value64 + addend64 - place) >> 1;
break;
case R_390_PC32DBL: /* PC relative on a symbol */
pr_debug("\t\t\t\tR_390_PC32DBL at 0x%-4lx val 0x%x\n", place, value32 + addend32);
*((int32_t *)where) = (value64 + addend64 - place) >> 1;
break;
case R_390_64: /* 64 bit absolute address */
pr_debug("\t\t\t\tR_390_64 at 0x%-4lx val 0x%lx\n", place, (long)value64);
pr_out(" { .offset = 0x%-8x, .type = COMPEL_TYPE_LONG, "
".addend = %-8ld, .value = 0x%-16lx, }, /* R_390_64 */\n",
(unsigned int)place, (long)addend64, (long)value64);
break;
case R_390_PC64: /* 64 bit relative address */
*((int64_t *)where) = value64 + addend64 - place;
pr_debug("\t\t\t\tR_390_PC64 at 0x%-4lx val 0x%lx\n", place, (long)value64);
break;
#endif
default:
pr_err("Unsupported relocation of type %lu\n",
(unsigned long)ELF_R_TYPE(r->rel.r_info));
......
......@@ -52,6 +52,9 @@ static const flags_t flags = {
#elif defined CONFIG_PPC64
.arch = "ppc64",
.cflags = COMPEL_CFLAGS_PIE,
#elif defined CONFIG_S390
.arch = "s390",
.cflags = COMPEL_CFLAGS_PIE,
#else
#error "CONFIG_<ARCH> not defined, or unsupported ARCH"
#endif
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment