Commit 257dc723 authored by Philipp Tomsich's avatar Philipp Tomsich Committed by Chen Jun
Browse files

arm64:ilp32: add vdso-ilp32 and use for signal return

maillist inclusion
category: feature
bugzilla: 46790
CVE: NA

Reference: https://github.com/norov/linux/commits/ilp32-5.2



--------------------------------

ILP32 VDSO exports following symbols:
 __kernel_rt_sigreturn;
 __kernel_gettimeofday;
 __kernel_clock_gettime;
 __kernel_clock_getres.

What shared object to use, kernel selects depending on result of
is_ilp32_compat_task() in arch/arm64/kernel/vdso.c, so it substitutes
correct pages and spec.

Adjusted to move the data page before code pages in sync with
commit 601255ae ("arm64: vdso: move data page before code pages")

Signed-off-by: default avatarPhilipp Tomsich <philipp.tomsich@theobroma-systems.com>
Signed-off-by: default avatarChristoph Muellner <christoph.muellner@theobroma-systems.com>
Signed-off-by: default avatarYury Norov <ynorov@caviumnetworks.com>
Signed-off-by: default avatarBamvor Jian Zhang <bamv2005@gmail.com>
Signed-off-by: default avatarYury Norov <ynorov@marvell.com>

 Conflicts:
	arch/arm64/Makefile
	arch/arm64/kernel/Makefile
	arch/arm64/kernel/asm-offsets.c
	arch/arm64/kernel/vdso.c
	arch/arm64/kernel/vdso/gettimeofday.S
[wangxiongfeng: rewrite vdso-ilp32/Makefile according to vdso/Makefile]
Signed-off-by: default avatarXiongfeng Wang <wangxiongfeng2@huawei.com>
Acked-by: default avatarXie XiuQi <xiexiuqi@huawei.com>
Signed-off-by: default avatarChen Jun <chenjun102@huawei.com>
parent 7d74a927
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
@@ -183,6 +183,9 @@ vdso_prepare: prepare0
	$(if $(CONFIG_COMPAT_VDSO),$(Q)$(MAKE) \
		$(build)=arch/arm64/kernel/vdso32  \
		include/generated/vdso32-offsets.h)
ifeq ($(CONFIG_ARM64_ILP32), y)
	$(Q)$(MAKE) $(build)=arch/arm64/kernel/vdso-ilp32 include/generated/vdso-ilp32-offsets.h
endif
endif

define archhelp
+6 −0
Original line number Diff line number Diff line
@@ -21,6 +21,12 @@
#include <generated/vdso32-offsets.h>
#endif

#ifdef CONFIG_ARM64_ILP32
#include <generated/vdso-ilp32-offsets.h>
#else
#define vdso_offset_sigtramp_ilp32	({ BUILD_BUG(); 0; })
#endif

#define VDSO_SYMBOL(base, name)						   \
({									   \
	(void *)(vdso_offset_##name - VDSO_LBASE + (unsigned long)(base)); \
+1 −0
Original line number Diff line number Diff line
@@ -66,6 +66,7 @@ obj-$(CONFIG_ARM64_MTE) += mte.o

obj-y					+= vdso/ probes/
obj-$(CONFIG_COMPAT_VDSO)		+= vdso32/
obj-$(CONFIG_ARM64_ILP32)		+= vdso-ilp32/
head-y					:= head.o
extra-y					+= $(head-y) vmlinux.lds

+7 −0
Original line number Diff line number Diff line
@@ -94,6 +94,13 @@ int main(void)
  BLANK();
  DEFINE(PREEMPT_DISABLE_OFFSET, PREEMPT_DISABLE_OFFSET);
  BLANK();
#ifdef CONFIG_COMPAT
  DEFINE(COMPAT_TVAL_TV_SEC,	offsetof(struct old_timeval32, tv_sec));
  DEFINE(COMPAT_TVAL_TV_USEC,	offsetof(struct old_timeval32, tv_usec));
  DEFINE(COMPAT_TSPEC_TV_SEC,	offsetof(struct old_timespec32, tv_sec));
  DEFINE(COMPAT_TSPEC_TV_NSEC,	offsetof(struct old_timespec32, tv_nsec));
  BLANK();
#endif
  DEFINE(CPU_BOOT_STACK,	offsetof(struct secondary_data, stack));
  DEFINE(CPU_BOOT_TASK,		offsetof(struct secondary_data, task));
  BLANK();
+2 −0
Original line number Diff line number Diff line
vdso-ilp32.lds
vdso-ilp32-offsets.h
Loading