diff options
Diffstat (limited to 'sys')
-rw-r--r-- | sys/amd64/amd64/prof_machdep.c | 26 | ||||
-rw-r--r-- | sys/amd64/include/profile.h | 4 | ||||
-rw-r--r-- | sys/i386/i386/prof_machdep.c | 26 | ||||
-rw-r--r-- | sys/i386/include/profile.h | 4 |
4 files changed, 48 insertions, 12 deletions
diff --git a/sys/amd64/amd64/prof_machdep.c b/sys/amd64/amd64/prof_machdep.c index 895d1950b076..5b3e83977ead 100644 --- a/sys/amd64/amd64/prof_machdep.c +++ b/sys/amd64/amd64/prof_machdep.c @@ -56,6 +56,20 @@ static int cputime_prof_active; #endif /* GUPROF */ #ifdef __GNUCLIKE_ASM +#if defined(SMP) && defined(GUPROF) +#define MPLOCK " \n\ + movl $1,%edx \n\ +9: \n\ + xorl %eax,%eax \n\ + lock \n\ + cmpxchgl %edx,mcount_lock \n\ + jne 9b \n" +#define MPUNLOCK "movl $0,mcount_lock \n" +#else /* !(SMP && GUPROF) */ +#define MPLOCK +#define MPUNLOCK +#endif /* SMP && GUPROF */ + __asm(" \n\ GM_STATE = 0 \n\ GMON_PROF_OFF = 3 \n\ @@ -111,8 +125,10 @@ __mcount: \n\ movq 7*8(%rsp),%rsi \n\ \n\ pushfq \n\ - cli \n\ - call mcount \n\ + cli \n" + MPLOCK " \n\ + call mcount \n" + MPUNLOCK " \n\ popfq \n\ popq %r9 \n\ popq %r8 \n\ @@ -163,8 +179,10 @@ GMON_PROF_HIRES = 4 \n\ pushq %r9 \n\ movq 7*8(%rsp),%rdi \n\ pushfq \n\ - cli \n\ - call mexitcount \n\ + cli \n" + MPLOCK " \n\ + call mexitcount \n" + MPUNLOCK " \n\ popfq \n\ popq %r9 \n\ popq %r8 \n\ diff --git a/sys/amd64/include/profile.h b/sys/amd64/include/profile.h index 97af17d5e662..2e19918cfb76 100644 --- a/sys/amd64/include/profile.h +++ b/sys/amd64/include/profile.h @@ -64,11 +64,11 @@ __asm __volatile("pushq %0; call __mcount; popq %%rcx" \ : \ : "i" (label) \ - : "ax", "dx", "cx", "di", "si", "r8", "r9", "memory") + : "cx", "r10", "r11", "memory") #define MEXITCOUNT_OVERHEAD() \ __asm __volatile("call .mexitcount; 1:" \ : : \ - : "ax", "dx", "cx", "di", "si", "r8", "r9", "memory") + : "r10", "r11", "memory") #define MEXITCOUNT_OVERHEAD_GETLABEL(labelp) \ __asm __volatile("movq $1b,%0" : "=rm" (labelp)) #else diff --git a/sys/i386/i386/prof_machdep.c b/sys/i386/i386/prof_machdep.c index a6b4a9a24e56..9c71f49f14fe 100644 --- a/sys/i386/i386/prof_machdep.c +++ b/sys/i386/i386/prof_machdep.c @@ -67,6 +67,20 @@ static int cputime_prof_active; #endif /* GUPROF */ #ifdef __GNUCLIKE_ASM +#if defined(SMP) && defined(GUPROF) +#define MPLOCK " \n\ + movl $1,%edx \n\ +9: \n\ + xorl %eax,%eax \n\ + lock \n\ + cmpxchgl %edx,mcount_lock \n\ + jne 9b \n" +#define MPUNLOCK "movl $0,mcount_lock \n" +#else /* !(SMP && GUPROF) */ +#define MPLOCK +#define MPUNLOCK +#endif /* SMP && GUPROF */ + __asm(" \n\ GM_STATE = 0 \n\ GMON_PROF_OFF = 3 \n\ @@ -110,8 +124,10 @@ __mcount: \n\ pushfl \n\ pushl %eax \n\ pushl %edx \n\ - cli \n\ - call mcount \n\ + cli \n" + MPLOCK " \n\ + call mcount \n" + MPUNLOCK " \n\ addl $8,%esp \n\ popfl \n\ .mcount_exit: \n\ @@ -155,8 +171,10 @@ GMON_PROF_HIRES = 4 \n\ movl 8(%esp),%eax \n\ pushfl \n\ pushl %eax \n\ - cli \n\ - call mexitcount \n\ + cli \n" + MPLOCK " \n\ + call mexitcount \n" + MPUNLOCK " \n\ addl $4,%esp \n\ popfl \n\ popl %eax \n\ diff --git a/sys/i386/include/profile.h b/sys/i386/include/profile.h index 78b55a4463e1..665d5ab0ce72 100644 --- a/sys/i386/include/profile.h +++ b/sys/i386/include/profile.h @@ -64,11 +64,11 @@ __asm __volatile("pushl %0; call __mcount; popl %%ecx" \ : \ : "i" (label) \ - : "ax", "dx", "cx", "memory") + : "cx", "memory") #define MEXITCOUNT_OVERHEAD() \ __asm __volatile("call .mexitcount; 1:" \ : : \ - : "ax", "dx", "cx", "memory") + : "cx", "memory") #define MEXITCOUNT_OVERHEAD_GETLABEL(labelp) \ __asm __volatile("movl $1b,%0" : "=rm" (labelp)) #else |