From nobody Mon Sep 05 12:39:28 2022 X-Original-To: dev-commits-src-main@mlmmj.nyi.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mlmmj.nyi.freebsd.org (Postfix) with ESMTP id 4MLp4K1c1Qz4cKTq; Mon, 5 Sep 2022 12:39:29 +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 4MLp4K10vnz3fGn; Mon, 5 Sep 2022 12:39:29 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1662381569; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=JTriXCl0Nx9UR/p5E90ernEHQwRBsDVCQ9xTpID9w2U=; b=CgwNegTdXckO1OPSJkyv9zXGm7GoWMyTCmO/2rTU75FGMKejC+b8nhVNq6bwe+44GIySua XdnvdAmXPzVIJDVueHcCe2u072XmxWIPuvcGQi4QAay3/WZm3lW2KFqc66YZ3NyYpSz0pm WpJs86+Y+yR9qEImmGEIblKjxNNu4fzdqt2tGtiWP9pJg5BCQePHGDhAzsBVI79sr7C0w3 ulSmSmcnTd8A8lZ5xNmil4CKcjxHZM2zrma3TAxW5P2cHY1Q3PYIkfTw2007jXW7x4PBtz jXnFZfCyLfPZxdoIvgaC33Gy88HVmwlVspSWru1p0O+NG5viVPMjtoTRKvFeAg== 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 4MLp4K03mZzqTg; Mon, 5 Sep 2022 12:39:29 +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 285CdSKZ026687; Mon, 5 Sep 2022 12:39:28 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.16.1/8.16.1/Submit) id 285CdSLH026686; Mon, 5 Sep 2022 12:39:28 GMT (envelope-from git) Date: Mon, 5 Sep 2022 12:39:28 GMT Message-Id: <202209051239.285CdSLH026686@gitrepo.freebsd.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org From: Toomas Soome Subject: git: 1f5679569dd4 - main - libpmc: pmc_init() should avoid overflowing pmc_class_table List-Id: Commit messages for the main branch of the src repository List-Archive: https://lists.freebsd.org/archives/dev-commits-src-main List-Help: List-Post: List-Subscribe: List-Unsubscribe: Sender: owner-dev-commits-src-main@freebsd.org X-BeenThere: dev-commits-src-main@freebsd.org MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: tsoome X-Git-Repository: src X-Git-Refname: refs/heads/main X-Git-Reftype: branch X-Git-Commit: 1f5679569dd42a9e431f0a40c820bc0d40f51ba5 Auto-Submitted: auto-generated ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1662381569; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=JTriXCl0Nx9UR/p5E90ernEHQwRBsDVCQ9xTpID9w2U=; b=I+EY/PokuZxcDgIZYXm5dlK2V4hBvW2mmMdtVWp2W/ThMmZM4rxZx5C77nn2Zabi1/mQol P7fHfWZHcoXR0CRDvRa5hqNh+G92V7zFu35Etj+DlDHN4KRC9+hM/Lz/GNSuWEGMRfor37 FsV8+c47+v8yOzF+DVwQg9OPfknCte/vc7XJSfRWaf7WdioZgSHYj/ewVmZ3r0U31lucil otq9XbMWSSqs6LJ7KXs390284pHUaYgkThUAFQyP5KTjq3cQjoYm6YUPUsS2J9Imd7Pgyn pdQv362cbkxfzXYv/vF1K8yCE1Xqap0JNLEvFNDq++agYnC3MTlU6EtfhaxbJw== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1662381569; a=rsa-sha256; cv=none; b=Aaxc/6iGPIEON0/rXUpoqOaT1R1vkuJHwEtzTCfsujaIorcGa1HZJxd8itTLsSDjh7hVFk QH6Ji5GTVQWpD4LbCpkXEk3cawHvI30pyUgY4VlC6zXR1qrhsjicLcYkZz7AzSffdRR0FR ainLx+EfDjsgLGwDee0pNZWaAUqDUkSwlxVSiGmBZ8o4uv3YTwXAZ1Rumcif8zucqdxTBG yxJ4cNeQhnUEAsJ4zghjT2CPRI5HeqbaSFhHG4MQshb23c6ASs6XqmfilbtbEO2pidYbiM dAYd8ax6zO0yX+BqUBm9xOXwD/+Nh2Ok9BTOvgHE/sstrEZbLYsXGW4u2Yctfg== ARC-Authentication-Results: i=1; mx1.freebsd.org; none X-ThisMailContainsUnwantedMimeParts: N The branch main has been updated by tsoome: URL: https://cgit.FreeBSD.org/src/commit/?id=1f5679569dd42a9e431f0a40c820bc0d40f51ba5 commit 1f5679569dd42a9e431f0a40c820bc0d40f51ba5 Author: Toomas Soome AuthorDate: 2022-08-31 08:09:18 +0000 Commit: Toomas Soome CommitDate: 2022-09-05 12:23:20 +0000 libpmc: pmc_init() should avoid overflowing pmc_class_table Use calloc(). Walk the class list we get from kernel, so we will not add something the kernel does not know about. Avoid picking headers from /usr/include. Differential Revision: https://reviews.freebsd.org/D36401 --- lib/libpmc/Makefile | 2 +- lib/libpmc/libpmc.c | 108 ++++++++++++++++++++++++++++++++++++++++++---------- 2 files changed, 88 insertions(+), 22 deletions(-) diff --git a/lib/libpmc/Makefile b/lib/libpmc/Makefile index 46b2622653a7..d33567e5b3f8 100644 --- a/lib/libpmc/Makefile +++ b/lib/libpmc/Makefile @@ -43,7 +43,7 @@ SRCS+= libpmc_events.c WARNS?= 3 -CFLAGS+= -I${.CURDIR} +CFLAGS+= -I${.CURDIR} -I${SRCTOP}/sys CWARNFLAGS.gcc+= -Wno-shadow -Wno-cast-align # Silence warnings about usage of deprecated std::auto_ptr diff --git a/lib/libpmc/libpmc.c b/lib/libpmc/libpmc.c index 581c05e0f8ef..d5b5c115a38f 100644 --- a/lib/libpmc/libpmc.c +++ b/lib/libpmc/libpmc.c @@ -1440,15 +1440,12 @@ pmc_init(void) memcpy(&cpu_info.pm_classes[n], &op_cpu_info.pm_classes[n], sizeof(cpu_info.pm_classes[n])); - pmc_class_table = malloc(PMC_CLASS_TABLE_SIZE * + pmc_class_table = calloc(PMC_CLASS_TABLE_SIZE, sizeof(struct pmc_class_descr *)); if (pmc_class_table == NULL) return (-1); - for (n = 0; n < PMC_CLASS_TABLE_SIZE; n++) - pmc_class_table[n] = NULL; - /* * Get soft events list. */ @@ -1472,20 +1469,98 @@ pmc_init(void) * Fill in the class table. */ n = 0; + for (unsigned i = 0; i < PMC_CLASS_TABLE_SIZE; i++) { + switch (cpu_info.pm_classes[i].pm_class) { +#if defined(__amd64__) || defined(__i386__) + case PMC_CLASS_TSC: + pmc_class_table[n++] = &tsc_class_table_descr; + break; + + case PMC_CLASS_K8: + pmc_class_table[n++] = &k8_class_table_descr; + break; +#endif + + case PMC_CLASS_SOFT: + pmc_class_table[n++] = &soft_class_table_descr; + break; - /* Fill soft events information. */ - pmc_class_table[n++] = &soft_class_table_descr; +#if defined(__arm__) + case PMC_CLASS_ARMV7: + switch (cpu_info.pm_cputype) { + case PMC_CPU_ARMV7_CORTEX_A8: + pmc_class_table[n++] = + &cortex_a8_class_table_descr; + break; + case PMC_CPU_ARMV7_CORTEX_A9: + pmc_class_table[n++] = + &cortex_a9_class_table_descr; + break; + default: + errno = ENXIO; + return (pmc_syscall = -1); + } + break; +#endif #if defined(__aarch64__) - pmc_class_table[n++] = &cmn600_pmu_class_table_descr; - pmc_class_table[n++] = &dmc620_pmu_cd2_class_table_descr; - pmc_class_table[n++] = &dmc620_pmu_c_class_table_descr; + case PMC_CLASS_ARMV8: + switch (cpu_info.pm_cputype) { + case PMC_CPU_ARMV8_CORTEX_A53: + pmc_class_table[n++] = + &cortex_a53_class_table_descr; + break; + case PMC_CPU_ARMV8_CORTEX_A57: + pmc_class_table[n++] = + &cortex_a57_class_table_descr; + break; + case PMC_CPU_ARMV8_CORTEX_A76: + pmc_class_table[n++] = + &cortex_a76_class_table_descr; + break; + default: + errno = ENXIO; + return (pmc_syscall = -1); + } + break; + + case PMC_CLASS_DMC620_PMU_CD2: + pmc_class_table[n++] = + &dmc620_pmu_cd2_class_table_descr; + break; + + case PMC_CLASS_DMC620_PMU_C: + pmc_class_table[n++] = &dmc620_pmu_c_class_table_descr; + break; + + case PMC_CLASS_CMN600_PMU: + pmc_class_table[n++] = &cmn600_pmu_class_table_descr; + break; #endif -#if defined(__amd64__) || defined(__i386__) - if (cpu_info.pm_cputype != PMC_CPU_GENERIC) - pmc_class_table[n++] = &tsc_class_table_descr; + +#if defined(__powerpc__) + case PMC_CLASS_PPC7450: + pmc_class_table[n++] = &ppc7450_class_table_descr; + break; + + case PMC_CLASS_PPC970: + pmc_class_table[n++] = &ppc970_class_table_descr; + break; + + case PMC_CLASS_E500: + pmc_class_table[n++] = &e500_class_table_descr; + break; #endif + default: +#if defined(DEBUG) + printf("pm_class: 0x%x\n", + cpu_info.pm_classes[i].pm_class); +#endif + break; + } + } + #define PMC_MDEP_INIT(C) pmc_mdep_event_aliases = C##_aliases /* Configure the event name parser. */ @@ -1493,7 +1568,6 @@ pmc_init(void) #if defined(__amd64__) || defined(__i386__) case PMC_CPU_AMD_K8: PMC_MDEP_INIT(k8); - pmc_class_table[n] = &k8_class_table_descr; break; #endif case PMC_CPU_GENERIC: @@ -1502,39 +1576,31 @@ pmc_init(void) #if defined(__arm__) case PMC_CPU_ARMV7_CORTEX_A8: PMC_MDEP_INIT(cortex_a8); - pmc_class_table[n] = &cortex_a8_class_table_descr; break; case PMC_CPU_ARMV7_CORTEX_A9: PMC_MDEP_INIT(cortex_a9); - pmc_class_table[n] = &cortex_a9_class_table_descr; break; #endif #if defined(__aarch64__) case PMC_CPU_ARMV8_CORTEX_A53: PMC_MDEP_INIT(cortex_a53); - pmc_class_table[n] = &cortex_a53_class_table_descr; break; case PMC_CPU_ARMV8_CORTEX_A57: PMC_MDEP_INIT(cortex_a57); - pmc_class_table[n] = &cortex_a57_class_table_descr; break; case PMC_CPU_ARMV8_CORTEX_A76: PMC_MDEP_INIT(cortex_a76); - pmc_class_table[n] = &cortex_a76_class_table_descr; break; #endif #if defined(__powerpc__) case PMC_CPU_PPC_7450: PMC_MDEP_INIT(ppc7450); - pmc_class_table[n] = &ppc7450_class_table_descr; break; case PMC_CPU_PPC_970: PMC_MDEP_INIT(ppc970); - pmc_class_table[n] = &ppc970_class_table_descr; break; case PMC_CPU_PPC_E500: PMC_MDEP_INIT(e500); - pmc_class_table[n] = &e500_class_table_descr; break; #endif default: