From owner-dev-commits-src-all@freebsd.org Fri Apr 2 12:49:50 2021 Return-Path: Delivered-To: dev-commits-src-all@mailman.nyi.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mailman.nyi.freebsd.org (Postfix) with ESMTP id DC7E75CE67D; Fri, 2 Apr 2021 12:49:50 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from mxrelay.nyi.freebsd.org (mxrelay.nyi.freebsd.org [IPv6:2610:1c1:1:606c::19:3]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 client-signature RSA-PSS (4096 bits) client-digest SHA256) (Client CN "mxrelay.nyi.freebsd.org", Issuer "R3" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 4FBfyk5vvDz4qhd; Fri, 2 Apr 2021 12:49:50 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (Client did not present a certificate) by mxrelay.nyi.freebsd.org (Postfix) with ESMTPS id B8F93201B0; Fri, 2 Apr 2021 12:49:50 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from gitrepo.freebsd.org ([127.0.1.44]) by gitrepo.freebsd.org (8.16.1/8.16.1) with ESMTP id 132CnoR2061380; Fri, 2 Apr 2021 12:49:50 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.16.1/8.16.1/Submit) id 132CnoXQ061379; Fri, 2 Apr 2021 12:49:50 GMT (envelope-from git) Date: Fri, 2 Apr 2021 12:49:50 GMT Message-Id: <202104021249.132CnoXQ061379@gitrepo.freebsd.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org From: Konstantin Belousov Subject: git: aa3ea612be36 - main - x86: remove gcov kernel support MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: kib X-Git-Repository: src X-Git-Refname: refs/heads/main X-Git-Reftype: branch X-Git-Commit: aa3ea612be3659881392251e91912682b038ce78 Auto-Submitted: auto-generated X-BeenThere: dev-commits-src-all@freebsd.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: Commit messages for all branches of the src repository List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 02 Apr 2021 12:49:50 -0000 The branch main has been updated by kib: URL: https://cgit.FreeBSD.org/src/commit/?id=aa3ea612be3659881392251e91912682b038ce78 commit aa3ea612be3659881392251e91912682b038ce78 Author: Konstantin Belousov AuthorDate: 2021-03-31 21:04:55 +0000 Commit: Konstantin Belousov CommitDate: 2021-04-02 12:41:51 +0000 x86: remove gcov kernel support Reviewed by: jhb Sponsored by: The FreeBSD Foundation Differential revision: https://reviews.freebsd.org/D29529 --- sys/amd64/amd64/apic_vector.S | 14 -- sys/amd64/amd64/atpic_vector.S | 2 - sys/amd64/amd64/exception.S | 25 +- sys/amd64/amd64/locore.S | 10 +- sys/amd64/amd64/prof_machdep.c | 323 ------------------------ sys/amd64/amd64/sigtramp.S | 2 +- sys/amd64/amd64/support.S | 1 - sys/amd64/amd64/xen-locore.S | 6 +- sys/amd64/conf/NOTES | 4 - sys/amd64/ia32/ia32_exception.S | 2 - sys/amd64/include/asmacros.h | 82 +----- sys/amd64/include/profile.h | 81 +----- sys/amd64/linux/linux_locore.asm | 10 +- sys/amd64/linux32/linux32_locore.asm | 6 +- sys/cddl/dev/dtrace/amd64/dtrace_asm.S | 3 +- sys/conf/Makefile.arm | 2 +- sys/conf/files | 27 +- sys/conf/files.amd64 | 1 - sys/conf/files.arm | 2 +- sys/conf/files.arm64 | 18 +- sys/conf/files.i386 | 1 - sys/conf/files.x86 | 10 +- sys/conf/kern.post.mk | 3 - sys/conf/kern.pre.mk | 42 +--- sys/conf/options.i386 | 1 - sys/dev/hyperv/vmbus/amd64/vmbus_vector.S | 2 - sys/dev/hyperv/vmbus/i386/vmbus_vector.S | 2 - sys/i386/conf/NOTES | 5 - sys/i386/i386/apic_vector.s | 14 -- sys/i386/i386/atpic_vector.s | 2 - sys/i386/i386/exception.s | 30 +-- sys/i386/i386/locore.s | 4 +- sys/i386/i386/mpboot.s | 4 +- sys/i386/i386/prof_machdep.c | 404 ------------------------------ sys/i386/i386/sigtramp.s | 2 +- sys/i386/i386/support.s | 2 - sys/i386/i386/vm86bios.s | 1 - sys/i386/include/asmacros.h | 82 +----- sys/i386/include/profile.h | 94 +------ sys/i386/linux/linux_locore.asm | 6 +- sys/kern/subr_prof.c | 345 ------------------------- sys/libkern/mcount.c | 316 ----------------------- 42 files changed, 79 insertions(+), 1914 deletions(-) diff --git a/sys/amd64/amd64/apic_vector.S b/sys/amd64/amd64/apic_vector.S index 4de39283f92f..21696a93fc5f 100644 --- a/sys/amd64/amd64/apic_vector.S +++ b/sys/amd64/amd64/apic_vector.S @@ -81,7 +81,6 @@ as_lapic_eoi: */ .macro ISR_VEC index, vec_name INTR_HANDLER \vec_name - FAKE_MCOUNT(TF_RIP(%rsp)) cmpl $0,x2apic_mode je 1f movl $(MSR_APIC_ISR0 + \index),%ecx @@ -98,7 +97,6 @@ as_lapic_eoi: movl %eax, %edi /* pass the IRQ */ call lapic_handle_intr 3: - MEXITCOUNT jmp doreti .endm @@ -127,28 +125,22 @@ IDTVEC(spuriousint) * Local APIC periodic timer handler. */ INTR_HANDLER timerint - FAKE_MCOUNT(TF_RIP(%rsp)) movq %rsp, %rdi call lapic_handle_timer - MEXITCOUNT jmp doreti /* * Local APIC CMCI handler. */ INTR_HANDLER cmcint - FAKE_MCOUNT(TF_RIP(%rsp)) call lapic_handle_cmc - MEXITCOUNT jmp doreti /* * Local APIC error interrupt handler. */ INTR_HANDLER errorint - FAKE_MCOUNT(TF_RIP(%rsp)) call lapic_handle_error - MEXITCOUNT jmp doreti #ifdef XENHVM @@ -157,10 +149,8 @@ IDTVEC(spuriousint) * Only used when the hypervisor supports direct vector callbacks. */ INTR_HANDLER xen_intr_upcall - FAKE_MCOUNT(TF_RIP(%rsp)) movq %rsp, %rdi call xen_intr_handle_upcall - MEXITCOUNT jmp doreti #endif @@ -184,9 +174,7 @@ IDTVEC(spuriousint) */ INTR_HANDLER ipi_intr_bitmap_handler call as_lapic_eoi - FAKE_MCOUNT(TF_RIP(%rsp)) call ipi_bitmap_handler - MEXITCOUNT jmp doreti /* @@ -210,9 +198,7 @@ IDTVEC(spuriousint) */ INTR_HANDLER ipi_swi call as_lapic_eoi - FAKE_MCOUNT(TF_RIP(%rsp)) call ipi_swi_handler - MEXITCOUNT jmp doreti /* diff --git a/sys/amd64/amd64/atpic_vector.S b/sys/amd64/amd64/atpic_vector.S index d82ffd30e1c9..d76331a887ad 100644 --- a/sys/amd64/amd64/atpic_vector.S +++ b/sys/amd64/amd64/atpic_vector.S @@ -44,11 +44,9 @@ */ .macro INTR irq_num, vec_name INTR_HANDLER \vec_name - FAKE_MCOUNT(TF_RIP(%rsp)) movq %rsp, %rsi movl $\irq_num, %edi /* pass the IRQ */ call atpic_handle_intr - MEXITCOUNT jmp doreti .endm diff --git a/sys/amd64/amd64/exception.S b/sys/amd64/amd64/exception.S index 3fb518179406..4716ca8cd7c2 100644 --- a/sys/amd64/amd64/exception.S +++ b/sys/amd64/amd64/exception.S @@ -101,9 +101,6 @@ dtrace_invop_calltrap_addr: * registers are reloaded on return to the usermode. */ -MCOUNT_LABEL(user) -MCOUNT_LABEL(btrap) - /* Traps that we leave interrupts disabled for. */ .macro TRAP_NOEN l, trapno PTI_ENTRY \l,\l\()_pti_k,\l\()_pti_u @@ -257,7 +254,6 @@ alltraps_pushregs_no_rax: pushfq andq $~(PSL_D | PSL_AC),(%rsp) popfq - FAKE_MCOUNT(TF_RIP(%rsp)) #ifdef KDTRACE_HOOKS /* * DTrace Function Boundary Trace (fbt) probes are triggered @@ -288,7 +284,6 @@ alltraps_pushregs_no_rax: calltrap: movq %rsp,%rdi call trap_check - MEXITCOUNT jmp doreti /* Handle any pending ASTs */ /* @@ -576,7 +571,6 @@ fast_syscall_common: movq %r14,TF_R14(%rsp) /* C preserved */ movq %r15,TF_R15(%rsp) /* C preserved */ movl $TF_HASSEGS,TF_FLAGS(%rsp) - FAKE_MCOUNT(TF_RIP(%rsp)) movq PCPU(CURTHREAD),%rdi movq %rsp,TD_FRAME(%rdi) movl TF_RFLAGS(%rsp),%esi @@ -594,7 +588,6 @@ fast_syscall_common: call handle_ibrs_exit callq *mds_handler /* Restore preserved registers. */ - MEXITCOUNT movq TF_RDI(%rsp),%rdi /* bonus; preserve arg 1 */ movq TF_RSI(%rsp),%rsi /* bonus: preserve arg 2 */ movq TF_RDX(%rsp),%rdx /* return value 2 */ @@ -621,7 +614,6 @@ fast_syscall_common: jmp 1b 4: /* Requested full context restore, use doreti for that. */ - MEXITCOUNT jmp doreti /* @@ -692,10 +684,8 @@ IDTVEC(dbg) rdmsr movl %eax,%r14d call handle_ibrs_entry -2: FAKE_MCOUNT(TF_RIP(%rsp)) - movq %rsp,%rdi +2: movq %rsp,%rdi call trap - MEXITCOUNT testl $CPUID_STDEXT3_IBPB,cpu_stdext_feature3(%rip) je 3f movl %r14d,%eax @@ -866,10 +856,8 @@ nmi_fromuserspace: 3: /* Note: this label is also used by ddb and gdb: */ nmi_calltrap: - FAKE_MCOUNT(TF_RIP(%rsp)) movq %rsp,%rdi call trap - MEXITCOUNT #ifdef HWPMC_HOOKS /* * Capture a userspace callchain if needed. @@ -1055,10 +1043,8 @@ mchk_fromuserspace: 1: call handle_ibrs_entry /* Note: this label is also used by ddb and gdb: */ mchk_calltrap: - FAKE_MCOUNT(TF_RIP(%rsp)) movq %rsp,%rdi call mca_intr - MEXITCOUNT testl %ebx,%ebx /* %ebx != 0 => return to userland */ jnz doreti_exit /* @@ -1089,7 +1075,6 @@ ENTRY(fork_trampoline) movq %rbx,%rsi /* arg1 */ movq %rsp,%rdx /* trapframe pointer */ call fork_exit - MEXITCOUNT jmp doreti /* Handle any ASTs */ /* @@ -1115,8 +1100,6 @@ ENTRY(fork_trampoline) .p2align 4 .text SUPERALIGN_TEXT -MCOUNT_LABEL(bintr) - #include #ifdef DEV_ATPIC @@ -1128,9 +1111,6 @@ MCOUNT_LABEL(bintr) #include #endif - .text -MCOUNT_LABEL(eintr) - /* * void doreti(struct trapframe) * @@ -1141,7 +1121,6 @@ MCOUNT_LABEL(eintr) .type doreti,@function .globl doreti doreti: - FAKE_MCOUNT($bintr) /* init "from" bintr -> doreti */ /* * Check if ASTs can be handled now. */ @@ -1171,7 +1150,6 @@ doreti_ast: * registers. The fault is handled in trap.c. */ doreti_exit: - MEXITCOUNT movq PCPU(CURPCB),%r8 /* @@ -1332,7 +1310,6 @@ doreti_iret_fault: movl $T_PROTFLT,TF_TRAPNO(%rsp) movq $0,TF_ERR(%rsp) /* XXX should be the error code */ movq $0,TF_ADDR(%rsp) - FAKE_MCOUNT(TF_RIP(%rsp)) jmp calltrap ALIGN_TEXT diff --git a/sys/amd64/amd64/locore.S b/sys/amd64/amd64/locore.S index 3addc3fb10cd..4f6283b88bd2 100644 --- a/sys/amd64/amd64/locore.S +++ b/sys/amd64/amd64/locore.S @@ -54,7 +54,7 @@ * * We are already in long mode, on a 64 bit %cs and running at KERNBASE. */ -NON_GPROF_ENTRY(btext) +ENTRY(btext) /* Tell the bios to warmboot next time */ movw $0x1234,0x472 @@ -79,7 +79,7 @@ NON_GPROF_ENTRY(btext) jmp 0b /* la57_trampoline(%rdi pml5) */ -NON_GPROF_ENTRY(la57_trampoline) +ENTRY(la57_trampoline) movq %rsp,%r11 movq %rbx,%r10 leaq la57_trampoline_end(%rip),%rsp @@ -118,11 +118,11 @@ l2: movq %r11,%rsp movq %r10,%rbx retq .p2align 4,0 -NON_GPROF_ENTRY(la57_trampoline_gdt_desc) +ENTRY(la57_trampoline_gdt_desc) .word la57_trampoline_end - la57_trampoline_gdt .long 0 /* filled by pmap_bootstrap_la57 */ .p2align 4,0 -NON_GPROF_ENTRY(la57_trampoline_gdt) +ENTRY(la57_trampoline_gdt) .long 0x00000000 /* null desc */ .long 0x00000000 .long 0x00000000 /* 64bit code */ @@ -132,7 +132,7 @@ NON_GPROF_ENTRY(la57_trampoline_gdt) .long 0x0000ffff /* universal data */ .long 0x00cf9300 .dcb.l 16,0 -NON_GPROF_ENTRY(la57_trampoline_end) +ENTRY(la57_trampoline_end) .bss ALIGN_DATA /* just to be sure */ diff --git a/sys/amd64/amd64/prof_machdep.c b/sys/amd64/amd64/prof_machdep.c deleted file mode 100644 index 72b18faef028..000000000000 --- a/sys/amd64/amd64/prof_machdep.c +++ /dev/null @@ -1,323 +0,0 @@ -/*- - * SPDX-License-Identifier: BSD-2-Clause-FreeBSD - * - * Copyright (c) 1996 Bruce D. Evans. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#include -__FBSDID("$FreeBSD$"); - -#ifdef GUPROF - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include - -#define CPUTIME_CLOCK_UNINITIALIZED 0 -#define CPUTIME_CLOCK_I8254 1 -#define CPUTIME_CLOCK_TSC 2 -#define CPUTIME_CLOCK_I8254_SHIFT 7 - -int cputime_bias = 1; /* initialize for locality of reference */ - -static int cputime_clock = CPUTIME_CLOCK_UNINITIALIZED; -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\ - \n\ - .text \n\ - .p2align 4,0x90 \n\ - .globl __mcount \n\ - .type __mcount,@function \n\ -__mcount: \n\ - # \n\ - # Check that we are profiling. Do it early for speed. \n\ - # \n\ - cmpl $GMON_PROF_OFF,_gmonparam+GM_STATE \n\ - je .mcount_exit \n\ - # \n\ - # __mcount is the same as [.]mcount except the caller \n\ - # hasn't changed the stack except to call here, so the \n\ - # caller's raddr is above our raddr. \n\ - # \n\ - pushq %rax \n\ - pushq %rdx \n\ - pushq %rcx \n\ - pushq %rsi \n\ - pushq %rdi \n\ - pushq %r8 \n\ - pushq %r9 \n\ - movq 7*8+8(%rsp),%rdi \n\ - jmp .got_frompc \n\ - \n\ - .p2align 4,0x90 \n\ - .globl .mcount \n\ -.mcount: \n\ - cmpl $GMON_PROF_OFF,_gmonparam+GM_STATE \n\ - je .mcount_exit \n\ - # \n\ - # The caller's stack frame has already been built, so \n\ - # %rbp is the caller's frame pointer. The caller's \n\ - # raddr is in the caller's frame following the caller's \n\ - # caller's frame pointer. \n\ - # \n\ - pushq %rax \n\ - pushq %rdx \n\ - pushq %rcx \n\ - pushq %rsi \n\ - pushq %rdi \n\ - pushq %r8 \n\ - pushq %r9 \n\ - movq 8(%rbp),%rdi \n\ -.got_frompc: \n\ - # \n\ - # Our raddr is the caller's pc. \n\ - # \n\ - movq 7*8(%rsp),%rsi \n\ - \n\ - pushfq \n\ - cli \n" - MPLOCK " \n\ - call mcount \n" - MPUNLOCK " \n\ - popfq \n\ - popq %r9 \n\ - popq %r8 \n\ - popq %rdi \n\ - popq %rsi \n\ - popq %rcx \n\ - popq %rdx \n\ - popq %rax \n\ -.mcount_exit: \n\ - ret $0 \n\ -"); -#else /* !__GNUCLIKE_ASM */ -#error "this file needs to be ported to your compiler" -#endif /* __GNUCLIKE_ASM */ - -#ifdef GUPROF -/* - * [.]mexitcount saves the return register(s), loads selfpc and calls - * mexitcount(selfpc) to do the work. Someday it should be in a machine - * dependent file together with cputime(), __mcount and [.]mcount. cputime() - * can't just be put in machdep.c because it has to be compiled without -pg. - */ -#ifdef __GNUCLIKE_ASM -__asm(" \n\ - .text \n\ -# \n\ -# Dummy label to be seen when gprof -u hides [.]mexitcount. \n\ -# \n\ - .p2align 4,0x90 \n\ - .globl __mexitcount \n\ - .type __mexitcount,@function \n\ -__mexitcount: \n\ - nop \n\ - \n\ -GMON_PROF_HIRES = 4 \n\ - \n\ - .p2align 4,0x90 \n\ - .globl .mexitcount \n\ -.mexitcount: \n\ - cmpl $GMON_PROF_HIRES,_gmonparam+GM_STATE \n\ - jne .mexitcount_exit \n\ - pushq %rax \n\ - pushq %rdx \n\ - pushq %rcx \n\ - pushq %rsi \n\ - pushq %rdi \n\ - pushq %r8 \n\ - pushq %r9 \n\ - movq 7*8(%rsp),%rdi \n\ - pushfq \n\ - cli \n" - MPLOCK " \n\ - call mexitcount \n" - MPUNLOCK " \n\ - popfq \n\ - popq %r9 \n\ - popq %r8 \n\ - popq %rdi \n\ - popq %rsi \n\ - popq %rcx \n\ - popq %rdx \n\ - popq %rax \n\ -.mexitcount_exit: \n\ - ret $0 \n\ -"); -#endif /* __GNUCLIKE_ASM */ - -/* - * Return the time elapsed since the last call. The units are machine- - * dependent. - */ -int -cputime() -{ - u_int count; - int delta; - u_char high, low; - static u_int prev_count; - - if (cputime_clock == CPUTIME_CLOCK_TSC) { - /* - * Scale the TSC a little to make cputime()'s frequency - * fit in an int, assuming that the TSC frequency fits - * in a u_int. Use a fixed scale since dynamic scaling - * would be slower and we can't really use the low bit - * of precision. - */ - count = (u_int)rdtsc() & ~1u; - delta = (int)(count - prev_count) >> 1; - prev_count = count; - return (delta); - } - - /* - * Read the current value of the 8254 timer counter 0. - */ - outb(TIMER_MODE, TIMER_SEL0 | TIMER_LATCH); - low = inb(TIMER_CNTR0); - high = inb(TIMER_CNTR0); - count = ((high << 8) | low) << CPUTIME_CLOCK_I8254_SHIFT; - - /* - * The timer counts down from TIMER_CNTR0_MAX to 0 and then resets. - * While profiling is enabled, this routine is called at least twice - * per timer reset (for mcounting and mexitcounting hardclock()), - * so at most one reset has occurred since the last call, and one - * has occurred iff the current count is larger than the previous - * count. This allows counter underflow to be detected faster - * than in microtime(). - */ - delta = prev_count - count; - prev_count = count; - if ((int) delta <= 0) - return (delta + (i8254_max_count << CPUTIME_CLOCK_I8254_SHIFT)); - return (delta); -} - -static int -sysctl_machdep_cputime_clock(SYSCTL_HANDLER_ARGS) -{ - int clock; - int error; - - clock = cputime_clock; - error = sysctl_handle_opaque(oidp, &clock, sizeof clock, req); - if (error == 0 && req->newptr != NULL) { - if (clock < 0 || clock > CPUTIME_CLOCK_TSC) - return (EINVAL); - cputime_clock = clock; - } - return (error); -} - -SYSCTL_PROC(_machdep, OID_AUTO, cputime_clock, - CTLTYPE_INT | CTLFLAG_RW | CTLFLAG_NEEDGIANT, 0, sizeof(u_int), - sysctl_machdep_cputime_clock, "I", - ""); - -/* - * The start and stop routines need not be here since we turn off profiling - * before calling them. They are here for convenience. - */ - -void -startguprof(gp) - struct gmonparam *gp; -{ - uint64_t freq; - - freq = atomic_load_acq_64(&tsc_freq); - if (cputime_clock == CPUTIME_CLOCK_UNINITIALIZED) { - if (freq != 0 && mp_ncpus == 1) - cputime_clock = CPUTIME_CLOCK_TSC; - else - cputime_clock = CPUTIME_CLOCK_I8254; - } - if (cputime_clock == CPUTIME_CLOCK_TSC) { - gp->profrate = freq >> 1; - cputime_prof_active = 1; - } else - gp->profrate = i8254_freq << CPUTIME_CLOCK_I8254_SHIFT; - cputime_bias = 0; - cputime(); -} - -void -stopguprof(gp) - struct gmonparam *gp; -{ - if (cputime_clock == CPUTIME_CLOCK_TSC) - cputime_prof_active = 0; -} - -/* If the cpu frequency changed while profiling, report a warning. */ -static void -tsc_freq_changed(void *arg, const struct cf_level *level, int status) -{ - - /* - * If there was an error during the transition or - * TSC is P-state invariant, don't do anything. - */ - if (status != 0 || tsc_is_invariant) - return; - if (cputime_prof_active && cputime_clock == CPUTIME_CLOCK_TSC) - printf("warning: cpu freq changed while profiling active\n"); -} - -EVENTHANDLER_DEFINE(cpufreq_post_change, tsc_freq_changed, NULL, - EVENTHANDLER_PRI_ANY); - -#endif /* GUPROF */ diff --git a/sys/amd64/amd64/sigtramp.S b/sys/amd64/amd64/sigtramp.S index a249a1a646f2..9983edf229a3 100644 --- a/sys/amd64/amd64/sigtramp.S +++ b/sys/amd64/amd64/sigtramp.S @@ -38,7 +38,7 @@ * Signal trampoline, copied to top of user stack * */ -NON_GPROF_ENTRY(sigcode) +ENTRY(sigcode) call *SIGF_HANDLER(%rsp) /* call signal handler */ lea SIGF_UC(%rsp),%rdi /* get ucontext_t */ pushq $0 /* junk to fake return addr. */ diff --git a/sys/amd64/amd64/support.S b/sys/amd64/amd64/support.S index 4c0f7da87ef8..0db6f2f04099 100644 --- a/sys/amd64/amd64/support.S +++ b/sys/amd64/amd64/support.S @@ -1490,7 +1490,6 @@ ENTRY(lgdt) popq %rax pushq $KCSEL pushq %rax - MEXITCOUNT lretq END(lgdt) diff --git a/sys/amd64/amd64/xen-locore.S b/sys/amd64/amd64/xen-locore.S index 7c7707a3864e..97d81711a051 100644 --- a/sys/amd64/amd64/xen-locore.S +++ b/sys/amd64/amd64/xen-locore.S @@ -69,11 +69,11 @@ .text .p2align PAGE_SHIFT, 0x90 /* Hypercall_page needs to be PAGE aligned */ -NON_GPROF_ENTRY(hypercall_page) +ENTRY(hypercall_page) .skip 0x1000, 0x90 /* Fill with "nop"s */ /* Legacy PVH entry point, to be removed. */ -NON_GPROF_ENTRY(xen_start) +ENTRY(xen_start) /* Don't trust what the loader gives for rflags. */ pushq $PSL_KERNEL popfq @@ -97,7 +97,7 @@ NON_GPROF_ENTRY(xen_start) /* PVH entry point. */ .code32 -NON_GPROF_ENTRY(xen_start32) +ENTRY(xen_start32) /* Load flat GDT */ movl $VTOP(gdtdesc32), %eax diff --git a/sys/amd64/conf/NOTES b/sys/amd64/conf/NOTES index 60d171721cf1..5627ce5377d3 100644 --- a/sys/amd64/conf/NOTES +++ b/sys/amd64/conf/NOTES @@ -7,10 +7,6 @@ # $FreeBSD$ # -# -# We want LINT to cover profiling as well. -profile 2 - # # Enable the kernel DTrace hooks which are required to load the DTrace # kernel modules. diff --git a/sys/amd64/ia32/ia32_exception.S b/sys/amd64/ia32/ia32_exception.S index c7bfb02f0281..a1c40ced168f 100644 --- a/sys/amd64/ia32/ia32_exception.S +++ b/sys/amd64/ia32/ia32_exception.S @@ -73,8 +73,6 @@ int0x80_syscall_common: pushfq andq $~(PSL_D | PSL_AC),(%rsp) popfq - FAKE_MCOUNT(TF_RIP(%rsp)) movq %rsp, %rdi call ia32_syscall - MEXITCOUNT jmp doreti diff --git a/sys/amd64/include/asmacros.h b/sys/amd64/include/asmacros.h index b8541bed310c..438f4ec26f61 100644 --- a/sys/amd64/include/asmacros.h +++ b/sys/amd64/include/asmacros.h @@ -55,92 +55,14 @@ #define CNAME(csym) csym #define ALIGN_DATA .p2align 3 /* 8 byte alignment, zero filled */ -#ifdef GPROF #define ALIGN_TEXT .p2align 4,0x90 /* 16-byte alignment, nop filled */ -#else -#define ALIGN_TEXT .p2align 4,0x90 /* 16-byte alignment, nop filled */ -#endif #define SUPERALIGN_TEXT .p2align 4,0x90 /* 16-byte alignment, nop filled */ #define GEN_ENTRY(name) ALIGN_TEXT; .globl CNAME(name); \ .type CNAME(name),@function; CNAME(name): -#define NON_GPROF_ENTRY(name) GEN_ENTRY(name) -#define NON_GPROF_RET .byte 0xc3 /* opcode for `ret' */ - -#define END(name) .size name, . - name - -#ifdef GPROF -/* - * __mcount is like [.]mcount except that doesn't require its caller to set - * up a frame pointer. It must be called before pushing anything onto the - * stack. gcc should eventually generate code to call __mcount in most - * cases. This would make -pg in combination with -fomit-frame-pointer - * useful. gcc has a configuration variable PROFILE_BEFORE_PROLOGUE to - * allow profiling before setting up the frame pointer, but this is - * inadequate for good handling of special cases, e.g., -fpic works best - * with profiling after the prologue. - * - * [.]mexitcount is a new function to support non-statistical profiling if an - * accurate clock is available. For C sources, calls to it are generated - * by the FreeBSD extension `-mprofiler-epilogue' to gcc. It is best to - * call [.]mexitcount at the end of a function like the MEXITCOUNT macro does, - * but gcc currently generates calls to it at the start of the epilogue to - * avoid problems with -fpic. - * - * [.]mcount and __mcount may clobber the call-used registers and %ef. - * [.]mexitcount may clobber %ecx and %ef. - * - * Cross-jumping makes non-statistical profiling timing more complicated. - * It is handled in many cases by calling [.]mexitcount before jumping. It - * is handled for conditional jumps using CROSSJUMP() and CROSSJUMP_LABEL(). - * It is handled for some fault-handling jumps by not sharing the exit - * routine. - * - * ALTENTRY() must be before a corresponding ENTRY() so that it can jump to - * the main entry point. Note that alt entries are counted twice. They - * have to be counted as ordinary entries for gprof to get the call times - * right for the ordinary entries. - * - * High local labels are used in macros to avoid clashes with local labels - * in functions. - * - * Ordinary `ret' is used instead of a macro `RET' because there are a lot - * of `ret's. 0xc3 is the opcode for `ret' (`#define ret ... ret' can't - * be used because this file is sometimes preprocessed in traditional mode). - * `ret' clobbers eflags but this doesn't matter. - */ -#define ALTENTRY(name) GEN_ENTRY(name) ; MCOUNT ; MEXITCOUNT ; jmp 9f -#define CROSSJUMP(jtrue, label, jfalse) \ - jfalse 8f; MEXITCOUNT; jmp __CONCAT(to,label); 8: -#define CROSSJUMPTARGET(label) \ - ALIGN_TEXT; __CONCAT(to,label): ; MCOUNT; jmp label -#define ENTRY(name) GEN_ENTRY(name) ; 9: ; MCOUNT -#define FAKE_MCOUNT(caller) pushq caller ; call __mcount ; popq %rcx -#define MCOUNT call __mcount -#define MCOUNT_LABEL(name) GEN_ENTRY(name) ; nop ; ALIGN_TEXT -#ifdef GUPROF -#define MEXITCOUNT call .mexitcount -#define ret MEXITCOUNT ; NON_GPROF_RET -#else -#define MEXITCOUNT -#endif - -#else /* !GPROF */ -/* - * ALTENTRY() has to align because it is before a corresponding ENTRY(). - * ENTRY() has to align to because there may be no ALTENTRY() before it. - * If there is a previous ALTENTRY() then the alignment code for ENTRY() - * is empty. - */ -#define ALTENTRY(name) GEN_ENTRY(name) -#define CROSSJUMP(jtrue, label, jfalse) jtrue label -#define CROSSJUMPTARGET(label) #define ENTRY(name) GEN_ENTRY(name) -#define FAKE_MCOUNT(caller) -#define MCOUNT -#define MCOUNT_LABEL(name) -#define MEXITCOUNT -#endif /* GPROF */ +#define ALTENTRY(name) GEN_ENTRY(name) +#define END(name) .size name, . - name /* * Convenience for adding frame pointers to hand-coded ASM. Useful for diff --git a/sys/amd64/include/profile.h b/sys/amd64/include/profile.h index 2e19918cfb76..b0fb469f5354 100644 --- a/sys/amd64/include/profile.h +++ b/sys/amd64/include/profile.h @@ -35,74 +35,9 @@ #ifndef _MACHINE_PROFILE_H_ #define _MACHINE_PROFILE_H_ -#ifndef _SYS_CDEFS_H_ -#error this file needs sys/cdefs.h as a prerequisite -#endif - -#ifdef _KERNEL - -/* - * Config generates something to tell the compiler to align functions on 16 - * byte boundaries. A strict alignment is good for keeping the tables small. - */ -#define FUNCTION_ALIGNMENT 16 - -/* - * The kernel uses assembler stubs instead of unportable inlines. - * This is mainly to save a little time when profiling is not enabled, - * which is the usual case for the kernel. - */ -#define _MCOUNT_DECL void mcount -#define MCOUNT - -#ifdef GUPROF -#define MCOUNT_DECL(s) -#define MCOUNT_ENTER(s) -#define MCOUNT_EXIT(s) -#ifdef __GNUCLIKE_ASM -#define MCOUNT_OVERHEAD(label) \ - __asm __volatile("pushq %0; call __mcount; popq %%rcx" \ - : \ - : "i" (label) \ - : "cx", "r10", "r11", "memory") -#define MEXITCOUNT_OVERHEAD() \ - __asm __volatile("call .mexitcount; 1:" \ - : : \ - : "r10", "r11", "memory") -#define MEXITCOUNT_OVERHEAD_GETLABEL(labelp) \ - __asm __volatile("movq $1b,%0" : "=rm" (labelp)) -#else -#error this file needs to be ported to your compiler -#endif /* !__GNUCLIKE_ASM */ -#else /* !GUPROF */ -#define MCOUNT_DECL(s) register_t s; -#ifdef SMP -extern int mcount_lock; -#define MCOUNT_ENTER(s) { s = intr_disable(); \ - while (!atomic_cmpset_acq_int(&mcount_lock, 0, 1)) \ - /* nothing */ ; } -#define MCOUNT_EXIT(s) { atomic_store_rel_int(&mcount_lock, 0); \ - intr_restore(s); } -#else -#define MCOUNT_ENTER(s) { s = intr_disable(); } -#define MCOUNT_EXIT(s) (intr_restore(s)) -#endif -#endif /* GUPROF */ - -void bintr(void); -void btrap(void); -void eintr(void); -void user(void); - -#define MCOUNT_FROMPC_USER(pc) \ - ((pc < (uintfptr_t)VM_MAXUSER_ADDRESS) ? (uintfptr_t)user : pc) +#ifndef _KERNEL -#define MCOUNT_FROMPC_INTR(pc) \ - ((pc >= (uintfptr_t)btrap && pc < (uintfptr_t)eintr) ? \ - ((pc >= (uintfptr_t)bintr) ? (uintfptr_t)bintr : \ - (uintfptr_t)btrap) : ~0UL) - -#else /* !_KERNEL */ +#include #define FUNCTION_ALIGNMENT 4 @@ -172,28 +107,18 @@ mcount() \ typedef u_long uintfptr_t; -#endif /* _KERNEL */ - /* * An unsigned integral type that can hold non-negative difference between * function pointers. */ typedef u_long fptrdiff_t; -#ifdef _KERNEL - -void mcount(uintfptr_t frompc, uintfptr_t selfpc); - -#else /* !_KERNEL */ - -#include - __BEGIN_DECLS #ifdef __GNUCLIKE_ASM void mcount(void) __asm(".mcount"); #endif __END_DECLS -#endif /* _KERNEL */ +#endif /* !_KERNEL */ #endif /* !_MACHINE_PROFILE_H_ */ diff --git a/sys/amd64/linux/linux_locore.asm b/sys/amd64/linux/linux_locore.asm index 1bcf05bc57dd..4e358f583a45 100644 --- a/sys/amd64/linux/linux_locore.asm +++ b/sys/amd64/linux/linux_locore.asm @@ -17,7 +17,7 @@ linux_platform: * To avoid excess stack frame the signal trampoline code emulates * the 'call' instruction. */ -NON_GPROF_ENTRY(linux_rt_sigcode) +ENTRY(linux_rt_sigcode) movq %rsp, %rbx /* preserve sigframe */ call .getip .getip: @@ -32,28 +32,28 @@ NON_GPROF_ENTRY(linux_rt_sigcode) .endrtsigcode: 0: jmp 0b -NON_GPROF_ENTRY(__vdso_clock_gettime) +ENTRY(__vdso_clock_gettime) movq $LINUX_SYS_linux_clock_gettime,%rax syscall ret .weak clock_gettime .set clock_gettime, __vdso_clock_gettime -NON_GPROF_ENTRY(__vdso_time) +ENTRY(__vdso_time) movq $LINUX_SYS_linux_time,%rax *** 2138 LINES SKIPPED ***