From a4a806bef7e0829e71dd24a249afacb96cb0cd29 Mon Sep 17 00:00:00 2001 From: NAKAMURA Gou Date: Tue, 10 Feb 2015 15:59:23 +0900 Subject: [PATCH] support vsyscall_getcpu() vsyscall. refs #385 This version simply calls getcpu() system call, so that it's not fast. --- arch/x86/kernel/vsyscall.c | 14 ++++++++++++++ kernel/config/attached-mic.lds | 3 +++ kernel/config/builtin-mic.lds | 3 +++ kernel/config/builtin-x86.lds | 3 +++ kernel/config/smp-x86.lds | 3 +++ 5 files changed, 26 insertions(+) diff --git a/arch/x86/kernel/vsyscall.c b/arch/x86/kernel/vsyscall.c index c192e97e..98153be4 100644 --- a/arch/x86/kernel/vsyscall.c +++ b/arch/x86/kernel/vsyscall.c @@ -58,3 +58,17 @@ long vsyscall_time(void *tp) return t; } + +extern int vsyscall_getcpu(unsigned *cpup, unsigned *nodep, void *tcachep) + __attribute__ ((section (".vsyscall.getcpu"))); + +int vsyscall_getcpu(unsigned *cpup, unsigned *nodep, void *tcachep) +{ + int error; + + asm ("syscall" : "=a" (error) + : "a" (__NR_getcpu), "D" (cpup), "S" (nodep), "d" (tcachep) + : "%rcx", "%r11", "memory"); + + return error; +} diff --git a/kernel/config/attached-mic.lds b/kernel/config/attached-mic.lds index ed3f0623..3390a869 100644 --- a/kernel/config/attached-mic.lds +++ b/kernel/config/attached-mic.lds @@ -30,6 +30,9 @@ SECTIONS . = vsyscall_page + 0x400; *(.vsyscall.time) + . = vsyscall_page + 0x800; + *(.vsyscall.getcpu) + . = ALIGN(4096); } : data = 0xf4 diff --git a/kernel/config/builtin-mic.lds b/kernel/config/builtin-mic.lds index ed3f0623..3390a869 100644 --- a/kernel/config/builtin-mic.lds +++ b/kernel/config/builtin-mic.lds @@ -30,6 +30,9 @@ SECTIONS . = vsyscall_page + 0x400; *(.vsyscall.time) + . = vsyscall_page + 0x800; + *(.vsyscall.getcpu) + . = ALIGN(4096); } : data = 0xf4 diff --git a/kernel/config/builtin-x86.lds b/kernel/config/builtin-x86.lds index ed3f0623..3390a869 100644 --- a/kernel/config/builtin-x86.lds +++ b/kernel/config/builtin-x86.lds @@ -30,6 +30,9 @@ SECTIONS . = vsyscall_page + 0x400; *(.vsyscall.time) + . = vsyscall_page + 0x800; + *(.vsyscall.getcpu) + . = ALIGN(4096); } : data = 0xf4 diff --git a/kernel/config/smp-x86.lds b/kernel/config/smp-x86.lds index ed3f0623..3390a869 100644 --- a/kernel/config/smp-x86.lds +++ b/kernel/config/smp-x86.lds @@ -30,6 +30,9 @@ SECTIONS . = vsyscall_page + 0x400; *(.vsyscall.time) + . = vsyscall_page + 0x800; + *(.vsyscall.getcpu) + . = ALIGN(4096); } : data = 0xf4