Commit 80f06306 authored by Heiko Carstens's avatar Heiko Carstens
Browse files

s390/vdso: reimplement getcpu vdso syscall



Implement the previously removed getcpu vdso syscall by using the
TOD programmable field to pass the cpu number to user space.

Reviewed-by: default avatarSven Schnelle <svens@linux.ibm.com>
Signed-off-by: default avatarHeiko Carstens <hca@linux.ibm.com>
parent 062e5279
Loading
Loading
Loading
Loading
+7 −0
Original line number Diff line number Diff line
@@ -49,6 +49,13 @@ static inline void set_clock_comparator(__u64 time)
	asm volatile("sckc %0" : : "Q" (time));
}

static inline void set_tod_programmable_field(u16 val)
{
	register unsigned long reg0 asm("0") = val;

	asm volatile("sckpf" : : "d" (reg0));
}

void clock_comparator_work(void);

void __init time_early_init(void);
+2 −0
Original line number Diff line number Diff line
@@ -14,5 +14,7 @@

extern struct vdso_data *vdso_data;

void vdso_getcpu_init(void);

#endif /* __ASSEMBLY__ */
#endif /* __S390_VDSO_H__ */
+2 −0
Original line number Diff line number Diff line
@@ -54,6 +54,7 @@
#include <asm/nmi.h>
#include <asm/stacktrace.h>
#include <asm/topology.h>
#include <asm/vdso.h>
#include "entry.h"

enum {
@@ -858,6 +859,7 @@ static void smp_init_secondary(void)
	preempt_disable();
	init_cpu_timer();
	vtime_init();
	vdso_getcpu_init();
	pfault_init();
	notify_cpu_starting(cpu);
	if (topology_cpu_dedicated(cpu))
+7 −0
Original line number Diff line number Diff line
@@ -29,6 +29,7 @@
#include <asm/sections.h>
#include <asm/vdso.h>
#include <asm/facility.h>
#include <asm/timex.h>

extern char vdso64_start, vdso64_end;
static void *vdso64_kbase = &vdso64_start;
@@ -100,6 +101,11 @@ static union {
} vdso_data_store __page_aligned_data;
struct vdso_data *vdso_data = (struct vdso_data *)&vdso_data_store.data;

void vdso_getcpu_init(void)
{
	set_tod_programmable_field(smp_processor_id());
}

/*
 * This is called from binfmt_elf, we create the special vma for the
 * vDSO and insert it into the mm struct tree
@@ -170,6 +176,7 @@ static int __init vdso_init(void)
{
	int i;

	vdso_getcpu_init();
	/* Calculate the size of the 64 bit vDSO */
	vdso64_pages = ((&vdso64_end - &vdso64_start
			 + PAGE_SIZE - 1) >> PAGE_SHIFT) + 1;
+2 −1
Original line number Diff line number Diff line
@@ -7,7 +7,8 @@ ARCH_REL_TYPE_ABS += R_390_GOT|R_390_PLT

include $(srctree)/lib/vdso/Makefile
obj-vdso64 = vdso_user_wrapper.o note.o
obj-cvdso64 = vdso64_generic.o
obj-cvdso64 = vdso64_generic.o getcpu.o
CFLAGS_REMOVE_getcpu.o = -pg $(CC_FLAGS_FTRACE) $(CC_FLAGS_EXPOLINE)
CFLAGS_REMOVE_vdso64_generic.o = -pg $(CC_FLAGS_FTRACE) $(CC_FLAGS_EXPOLINE)

# Build rules
Loading