From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-oi1-x230.google.com (mail-oi1-x230.google.com [IPv6:2607:f8b0:4864:20::230]) by sourceware.org (Postfix) with ESMTPS id 8CFC83858403 for ; Thu, 4 Jul 2024 09:22:08 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 8CFC83858403 Authentication-Results: sourceware.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=gmail.com ARC-Filter: OpenARC Filter v1.0.0 sourceware.org 8CFC83858403 Authentication-Results: server2.sourceware.org; arc=none smtp.remote-ip=2607:f8b0:4864:20::230 ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1720084944; cv=none; b=qBY4x7TH6OhuLIzmQRKTj2Cnaz/xz15HrDGqKTJzoLjBTTYtiyahpHf/TCMklcCEFWtxiKbkLzP3iDvOOrqqIDhJghdFeFxarXoKOQhAIcNTCgO4MSnbkikT6aGlmm5PAfs0Y75MNGrYMs8LELsNXmSS+VYD1IupOX+ahAJH08g= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1720084944; c=relaxed/simple; bh=aehLSot3PBM7OjWdkHYjTPUiNAjBD7qyp/QObUvsw8c=; h=DKIM-Signature:MIME-Version:From:Date:Message-ID:Subject:To; b=m0dczS13WKbtey91XTX9QFRtkU0ylqlNJwiZqi2nG+WOMC8fLZXjhL+4U7VJkCKbYlvefMDcye79MSyQshZHKks1fFAgeKipMkWan8tU+WnpIcd6wCXu8/SiDrfYVZiZ5H1qSULgqWNFKhzhOMAyX5vsU60sVrnNPNVo3WGt8cA= ARC-Authentication-Results: i=1; server2.sourceware.org Received: by mail-oi1-x230.google.com with SMTP id 5614622812f47-3d562b35fb6so242114b6e.3 for ; Thu, 04 Jul 2024 02:22:08 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1720084928; x=1720689728; darn=sourceware.org; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:from:to:cc:subject:date:message-id:reply-to; bh=w2Ht10USg8uwWiyXHSdY60pTt9mc4Cemfxd9UTZKvkI=; b=BKysrackP+sP1RMorniK4xqlx4UPo3/lk/kjWUfQCgKrnK7DxeTibGr12+KcIk/pS3 S5fDtRpepxVCd72nIEAtHK5BQ7Jr2M9FI+55H8x5wNvz3ujHM/i7c6Cht3T5+C0qlVul LCm4PfOgQ5ayTJdTYp5KitQHgoBhvDFtsYfljfW3Z4T9hXoCoTT/s+f5d5/VDljLTKwO lOAUmPqJSEa6zjbj6Z2g1DKRs/Qdz+bqSrETBCVdDgfOirxE7BFX0v3Zd6ikbqHkwuLo bxlMiQE7JeXJAFafXHbLuSwInZKzikEAo0kDuv+Bd7jvxbxPFBAPUVf3J4T+RI9ehEm5 vCWQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1720084928; x=1720689728; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=w2Ht10USg8uwWiyXHSdY60pTt9mc4Cemfxd9UTZKvkI=; b=HumR7XlQo0MRjH/sD+LNmuDEaGp7jxRkm5kaf2yl2RDZhzzDgzLqVekhYXYNmzH77n xHPTtP/Oj7MAi8Fxr5HY3f6W/Gd6QF1cjWz0RNZrxZYsAP4aslhJj0BmgtjjtA8JyPtf njOB3gUxQqn6UbRK2u0xGjIcHqDbrXi5TZ8Gmi+jyPoSYsvZGm/nrMD9d2Qqk63STOFI cNyyPBm37gx8MckozNZFjbPwvOhr9g58ipy4S5XQznYFgmRdFvHONGOgvSrHLmiZS9yH MeDykqmpdQVPt/WhOO3q2UOQfUA0N8/tGQISuPqa46ctb/zr0W4swD6GDk4l64DPO2Nc xyzA== X-Gm-Message-State: AOJu0YzBPJ4+4cFXUiSQtrdF29O4tunXinKjZ9Je0o8U10ujUdR4Ni4T H2Acd5ugNJfC4YtThRyI85IVI0NCqDacVDPo7YqfoVTL51kRWKTpR7B+Odiuni/1Dfez7SWrd6w XuooMxFrykhh0xzESyJmIX8Qbjuw= X-Google-Smtp-Source: AGHT+IGzd2oM7Yimtcz5tkA2whRrENgQshQHIbthhO/YVdM2C7Zuk45oDkhexJIbKldKku+z7nBkN8AdmFhe9nqPp5s= X-Received: by 2002:a05:6870:a11e:b0:25d:fb57:db43 with SMTP id 586e51a60fabf-25e2b8d5f55mr1001330fac.12.1720084927663; Thu, 04 Jul 2024 02:22:07 -0700 (PDT) MIME-Version: 1.0 References: <20240630093702.7955-1-oriachiuan@gmail.com> <6c887255-4fc0-a6c1-6dda-e21ea2d734a8@oracle.com> In-Reply-To: From: Yixuan Chen Date: Thu, 4 Jul 2024 17:21:56 +0800 Message-ID: Subject: Re: [PATCH] [RFC]RISC-V:[gprofng] Mimal support gprofng for riscv To: Vladimir Mezentsev Cc: binutils@sourceware.org, ruud.vanderpas@oracle.com, jiawei@iscas.ac.cn, shihua@iscas.ac.cn, shiyulong@iscas.ac.cn Content-Type: multipart/alternative; boundary="00000000000018d660061c687b86" X-Spam-Status: No, score=-8.5 required=5.0 tests=BAYES_00,BODY_8BITS,DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,FREEMAIL_FROM,GIT_PATCH_0,HTML_MESSAGE,KAM_SHORT,RCVD_IN_DNSWL_NONE,SPF_HELO_NONE,SPF_PASS,TXREP autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org List-Id: --00000000000018d660061c687b86 Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable It works well with your method. I sent a patch v2, fixing the format issue and removing the useless definition. Thank you so much! Best regards, Yixuan Chen Vladimir Mezentsev =E4=BA=8E2024=E5=B9=B47= =E6=9C=884=E6=97=A5=E5=91=A8=E5=9B=9B 04:10=E5=86=99=E9=81=93=EF=BC=9A > Hi Yixuan Chen, > > On 7/3/24 05:38, Yixuan Chen wrote: > > Hi Vladimir, > > Thank you very much for your guide. > > Now I use the binutils-gdb master branch to port. But the `Collector > version : `2.41.50'` doesn't change with binutils-gdb version. > The third line of the log could see the binutils version. > > Here comes the log: > ``` > Making all in gp-display-html > make[4]: Entering directory > '/home/xyenchi/binutils-gdb/build/gprofng/gp-display-html' > sed -e 's/BINUTILS_VERSION/2.42.50/' < ../../../gprofng/gp-display-html/ > gp-display-html.in > gp-display-html > chmod +x gp-display-html > make[4]: Leaving directory > '/home/xyenchi/binutils-gdb/build/gprofng/gp-display-html' > Making all in doc > make[4]: Entering directory '/home/xyenchi/binutils-gdb/build/gprofng/doc' > make[4]: Nothing to be done for 'all'. > make[4]: Leaving directory '/home/xyenchi/binutils-gdb/build/gprofng/doc' > make[4]: Entering directory '/home/xyenchi/binutils-gdb/build/gprofng' > make[4]: Leaving directory '/home/xyenchi/binutils-gdb/build/gprofng' > make[3]: Leaving directory '/home/xyenchi/binutils-gdb/build/gprofng' > make[2]: Leaving directory '/home/xyenchi/binutils-gdb/build/gprofng' > make[1]: Leaving directory '/home/xyenchi/binutils-gdb/build' > [xyenchi@qemu-riscv build]$ rm -rf test.1.er/ > [xyenchi@qemu-riscv build]$ ./gprofng/src/gp-collect-app echo 1 > > > This is wrong. > You are using the built version of gprofng. But you must use the installed > version. > For example: > cd /home/xyenchi/binutils-gdb/build/ > rm -rf * > ../configure --prefix=3D`pwd`/INSTALL [THE_OTHER_CONFIGURE_OPTIONS] > make > make install > /home/xyenchi/binutils-gdb/build/INSTALL/bin/gprofng collect app -O > test.1.er echo 1 > *We recommend using `gprofng collect app` instead of calling > gp-collect-app directly.* > /home/xyenchi/binutils-gdb/build/INSTALL/bin/gprofng display text -func > -exp -head test.1.er/ > > > The problem is: > gp-collect-app sets > LD_PRELOAD=3D/libgp-collector.so before starting= the > user application. > It looks like you did the installation for the old sources and did not > reinstall gprofng. > In this case, you used the old libgp-collector.so (2.41.50). > > > Thank you for fixing gprofng. > -Vladimir > > > Creating experiment directory test.1.er (Process ID: 127275) ... > 1 > ./gprofng/src/gp-display-text -func -exp > -head test.1.er/v build]$ ./gprofng/src/gp-display-text -func -exp -head > test.1.er/ > Functions sorted by metric: Exclusive Total CPU Time > > Excl. Total Incl. Total Name > CPU CPU > sec. % sec. % > 0. 0. 0. 0. > > ID Sel PID Experiment > =3D=3D =3D=3D=3D =3D=3D=3D=3D=3D=3D =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D > 1 yes 127275 test.1.er/ > Experiment: test.1.er/ > No errors > No warnings > No archive command run > > Target command (64-bit): 'echo 1' > Process pid 127275, ppid 399, pgrp 127275, sid 391 > Current working directory: /home/xyenchi/binutils-gdb/build > Collector version: `2.41.50'; experiment version 12.4 (64-bit) > Host `qemu-riscv', OS `Linux 6.7.0-rc8', page size 4096, architecture > `riscv64' > 0 CPUs, clock speed 0 MHz. > Memory: 4096267 pages @ 4096 =3D 16001 MB. > Data collection parameters: > Clock-profiling, interval =3D 10007 microsecs. > Periodic sampling, 1 secs. > Follow descendant processes from: fork|exec|combo > > Experiment started Wed Jul 3 20:09:17 2024 > > Experiment Ended: 0.022871300 > Data Collection Duration: 0.022871300 > ``` > > I only find this code to change the collector version: > https://github.com/bminor/binutils-gdb/blob/afa87be0fc751c158d666a48a9077= d26d6ec8666/gprofng/src/Experiment.cc#L1224 > but I don't known how to fix, could you give me some suggestion? > > Best regards, > Yixuan Chen > > Vladimir Mezentsev =E4=BA=8E2024=E5=B9=B4= 7=E6=9C=882=E6=97=A5=E5=91=A8=E4=BA=8C 03:39=E5=86=99=E9=81=93=EF=BC=9A > >> Thank you for your work on gprofng. >> See my comments below. >> >> >> On 6/30/24 02:37, XYenChi wrote: >> >> Minimal support RISC-V. Test with qemu. >> >> Result show: >> [xyenchi@qemu-riscv build]$ ./gprofng/src/gp-display-text -fu1.er/p -hea= d test.2.er/ >> Functions sorted by metric: Exclusive Total CPU Time >> >> Excl. Total Incl. Total Name >> CPU CPU >> sec. % sec. % >> 0. 0. 0. 0. >> >> ID Sel PID Experiment >> =3D=3D =3D=3D=3D =3D=3D=3D=3D=3D=3D =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D >> 1 yes 145674 test.1.er/ >> Experiment: test.1.er/ >> No errors >> No warnings >> No archive command run >> >> Target command (64-bit): 'echo 1' >> Process pid 145674, ppid 399, pgrp 145674, sid 392 >> Current working directory: /home/xyenchi/binutils-gdb/build >> Collector version: `2.41.50'; experiment version 12.4 (64-bit) >> >> >> It looks like you are using an old version of the binutils-gdb source. >> The current version is 2.42.50. >> >> >> Host `qemu-riscv', OS `Linux 6.7.0-rc8', page size 4096, architecture `r= iscv64' >> 0 CPUs, clock speed 0 MHz. >> Memory: 4096267 pages @ 4096 =3D 16001 MB. >> Data collection parameters: >> Clock-profiling, interval =3D 10007 microsecs. >> Periodic sampling, 1 secs. >> Follow descendant processes from: fork|exec|combo >> >> Experiment started Thu Jun 27 16:23:20 2024 >> >> Experiment Ended: 0.040909200 >> Data Collection Duration: 0.040909200 >> >> If build with `allow_undefined_flag=3Dtrue`, result will be: >> >> [xyenchi@qemu-riscv build]$ ./gprofng/src/gp-display-text -fu1.er/p -hea= d test.2.er/ >> Functions sorted by metric: Exclusive Total CPU Time >> >> Excl. Total Incl. Total Name >> CPU CPU >> sec. % sec. % >> 0. 0. 0. 0. >> >> ID Sel PID Experiment >> =3D=3D =3D=3D=3D =3D=3D=3D=3D=3D=3D =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D >> 1 yes 145674 test.1.er/ >> Experiment: test.1.er/ >> No errors >> No warnings >> No archive command run >> >> Target command (64-bit): 'echo 1' >> Process pid 145674, ppid 399, pgrp 145674, sid 392 >> Current working directory: /home/xyenchi/binutils-gdb/build >> Collector version: `2.41.50'; experiment version 12.4 (64-bit) >> Host `qemu-riscv', OS `Linux 6.7.0-rc8', page size 4096, architecture `r= iscv64' >> 0 CPUs, clock speed 0 MHz. >> Memory: 4096267 pages @ 4096 =3D 16001 MB. >> Data collection parameters: >> Clock-profiling, interval =3D 10007 microsecs. >> Periodic sampling, 1 secs. >> Follow descendant processes from: fork|exec|combo >> >> Experiment started Thu Jun 27 16:23:20 2024 >> >> Experiment Ended: 0.040909200 >> Data Collection Duration: 0.040909200 >> >> ChangeLog: >> Minimal support gprofng for RISC-V. >> >> 2024-06-28 Yixuan Chen >> >> * configure: Add RISC-V configure. >> * configure.ac: Add RISC-V configure. >> >> Unknown ChangeLog: >> >> 2024-06-28 Yixuan Chen >> >> * gprofng/common/core_pcbe.c (core_pcbe_init): Add RISC-V vendor. >> (defined): Add RISC-V condition. >> * gprofng/common/cpuid.c (defined): Add head file to use hwprobe. >> (my_cpuid): Add riscv hwprobe. >> * gprofng/common/gp-defs.h (TOK_A_RISCV): Add RISC-V. >> (defined): Add RISC-V. >> (ARCH_RISCV): Add RISC-V. >> * gprofng/common/hwc_cpus.h: Add RISC-V vendor id. >> * gprofng/common/hwcfuncs.h (HW_INTERVAL_TYPE): fix typo. >> * gprofng/configure: Add RISC-V. >> * gprofng/configure.ac: Add RISC-V. >> * gprofng/libcollector/hwprofile.h (ARCH): Add riscv register ca= lling. >> (CONTEXT_PC): Add riscv register calling. >> (CONTEXT_FP): Add riscv register calling. >> (CONTEXT_SP): Add riscv register calling. >> (SETFUNCTIONCONTEXT): Add riscv uc_mcontext calling. >> * gprofng/libcollector/libcol_util.c (__collector_util_init): fi= x libc calling >> * gprofng/libcollector/libcol_util.h (__collector_cas_32): Add R= ISC-V. >> (ARCH): >> * gprofng/libcollector/unwind.c (ARCH): Add RISC-V. >> (GET_PC): Add riscv register calling. >> (GET_SP): Add riscv register calling. >> (GET_FP): Add riscv register calling. >> (FILL_CONTEXT): Add riscv uc_mcontext calling. >> * gprofng/src/DbeSession.cc (ARCH): >> * gprofng/src/Disasm.cc (Disasm::disasm_open): Add RISC-V. >> * gprofng/src/Experiment.cc (Experiment::ExperimentHandler::star= tElement): Add RISC-V. >> * gprofng/src/checks.cc (ARCH): Add RISC-V. >> * gprofng/src/collctrl.cc (_SC_CPUID_MAX): Add if not define _SC= _CPUID_MAX condition. Set CPU frequency as 1000 to test but now not show at= the test result, will fix with better way to get cpu frequency. >> (Coll_Ctrl::Coll_Ctrl): >> (defined): >> * gprofng/src/dbe_types.h (enum Platform_t):Add RISC-V. >> * gprofng/testsuite/gprofng.display/mttest/gethrtime.c: Add RISC= -V. >> >> --- >> configure | 2 +- >> configure.ac | 2 +- >> gprofng/common/core_pcbe.c | 5 ++- >> gprofng/common/cpuid.c | 31 +++++++++++++++++-- >> gprofng/common/gp-defs.h | 5 ++- >> gprofng/common/hwc_cpus.h | 7 +++++ >> gprofng/common/hwcfuncs.h | 2 +- >> gprofng/configure | 4 +++ >> gprofng/configure.ac | 4 +++ >> gprofng/libcollector/hwprofile.h | 10 ++++++ >> gprofng/libcollector/libcol_util.c | 11 ++++++- >> gprofng/libcollector/libcol_util.h | 10 +++--- >> gprofng/libcollector/unwind.c | 16 ++++++++-- >> gprofng/src/DbeSession.cc | 2 ++ >> gprofng/src/Disasm.cc | 2 ++ >> gprofng/src/Experiment.cc | 2 ++ >> gprofng/src/checks.cc | 4 +++ >> gprofng/src/collctrl.cc | 26 +++++++++------- >> gprofng/src/dbe_types.h | 3 +- >> .../gprofng.display/mttest/gethrtime.c | 2 ++ >> 20 files changed, 123 insertions(+), 27 deletions(-) >> >> diff --git a/configure b/configure >> index dd743c58663..e3cbad5752b 100755 >> --- a/configure >> +++ b/configure >> @@ -3145,7 +3145,7 @@ fi >> >> if test "$enable_gprofng" =3D "yes"; then >> case "${target}" in >> - x86_64-*-linux* | i?86-*-linux* | aarch64-*-linux*) >> + x86_64-*-linux* | i?86-*-linux* | aarch64-*-linux* | riscv64-*-linu= x*) >> configdirs=3D"$configdirs gprofng" >> ;; >> esac >> diff --git a/configure.ac b/configure.ac >> index 01cfd017273..e63f27e6a29 100644 >> --- a/configure.ac >> +++ b/configure.ac >> @@ -412,7 +412,7 @@ enable_gprofng=3D$enableval, >> enable_gprofng=3Dyes) >> if test "$enable_gprofng" =3D "yes"; then >> case "${target}" in >> - x86_64-*-linux* | i?86-*-linux* | aarch64-*-linux*) >> + x86_64-*-linux* | i?86-*-linux* | aarch64-*-linux* | riscv64-*-linu= x*) >> configdirs=3D"$configdirs gprofng" >> ;; >> esac >> diff --git a/gprofng/common/core_pcbe.c b/gprofng/common/core_pcbe.c >> index b71d46f4e31..ef2a3f83d42 100644 >> --- a/gprofng/common/core_pcbe.c >> +++ b/gprofng/common/core_pcbe.c >> @@ -2754,6 +2754,9 @@ core_pcbe_init (void) >> return 0; >> case X86_VENDOR_Intel: >> break; >> + case ANDES_VENDOR_ID: >> >> >> The formatting is wrong. >> See a coding standard: >> https://sourceware.org/gdb/wiki/Internals%20GDB-C-Coding-Standards#White= spaces >> * Code indentation* >> >> * Lines should be indented with a mix of tabs and spaces. 8 spaces >> should be replaced with Tab. Vim users could add the following to their >> ~/.vimrc:* >> * set autoindent tabstop=3D8 shiftwidth=3D2* >> >> >> + case SIFIVE_VENDOR_ID: >> + case THEAD_VENDOR_ID: >> default: >> return -1; >> } >> @@ -2915,7 +2918,7 @@ core_pcbe_impl_name (void) >> static const char * >> core_pcbe_cpuref (void) >> { >> -#if defined(__aarch64__) >> +#if defined(__aarch64__) || defined(__riscv) >> return ""; >> #elif defined(__i386__) || defined(__x86_64) >> switch (cpuid_getmodel ()) >> diff --git a/gprofng/common/cpuid.c b/gprofng/common/cpuid.c >> index fd98b30c639..c29b6612afe 100644 >> --- a/gprofng/common/cpuid.c >> +++ b/gprofng/common/cpuid.c >> @@ -42,6 +42,11 @@ __get_cpuid (unsigned int op ATTRIBUTE_UNUSED, unsign= ed int *eax, >> Tprintf (DBG_LT0, "cpuid.c:%d read_cpuid_id() MIDR_EL1=3D0x%016x\n", = __LINE__, *eax); >> return res; >> } >> +#elif defined(__riscv) >> +#include >> +#include >> +#include >> +#include >> #endif >> >> /* >> @@ -104,7 +109,7 @@ my_cpuid (unsigned int op, cpuid_regs_t *regs) >> TprintfT (DBG_LT1, "my_cpuid: __get_cpuid(0x%x, 0x%x, 0x%x, 0x%x, 0x%= x) returns %d\n", >> op, regs->eax, regs->ebx, regs->ecx, regs->edx, ret); >> return ret; >> -} >> +} >> #endif >> >> static cpuid_info_t * >> @@ -180,8 +185,30 @@ get_cpuid_info () >> cpi->cpi_model +=3D CPI_MODEL_XTD (regs.eax) << 4; >> break; >> } >> +#elif defined(__riscv) >> + #ifndef __riscv_hwprobe >> + cpi->cpi_vendor =3D 0; >> + cpi->cpi_family =3D 0; >> + cpi->cpi_model =3D 0; >> + #else >> + struct riscv_hwprobe res; >> + res.key =3D RISCV_HWPROBE_KEY_MVENDORID; >> + cpu_set_t cpu_set; >> + int __riscv_hwprobe (struct riscv_hwprobe *pairs, \ >> + long pair_count, long cpu_count, \ >> + unsigned long *cpus, unsigned long flags) \ >> + { >> + return syscall(__NR_riscv_hwprobe, pairs, pair_count, c= pu_count, cpus, flags); >> + } >> + CPU_ZERO(&cpu_set); >> + CPU_SET(0, &cpu_set); >> + long ret =3D __riscv_hwprobe(&res, 1, 1, &cpu_set, 0); >> + cpi->cpi_vendor =3D res.value; >> + cpi->cpi_family =3D 0; >> + cpi->cpi_model =3D 0; >> + #endif >> #endif >> - return cpi; >> + return cpi; >> } >> >> >> Could you also add a code into read_cpuinfo() (gprofng/src/collctrl.cc >> line ~85) >> to read cpu_model, cpu_family, etc from /proc/cpu_info. >> >> >> >> static inline uint_t >> diff --git a/gprofng/common/gp-defs.h b/gprofng/common/gp-defs.h >> index 7cef5550696..891c4d32cf1 100644 >> --- a/gprofng/common/gp-defs.h >> +++ b/gprofng/common/gp-defs.h >> @@ -32,6 +32,7 @@ >> */ >> #define ARCH(x) TOK_A_##x(ARCH) >> #define TOK_A_Aarch64(x) x##_Aarch64 >> +#define TOK_A_RISCV(x) x##_RISCV >> #define TOK_A_SPARC(x) x##_SPARC >> #define TOK_A_Intel(x) x##_Intel >> >> @@ -45,11 +46,13 @@ >> #define ARCH_Intel 1 >> #elif defined(__aarch64__) >> #define ARCH_Aarch64 1 >> +#elif defined(riscv) || defined(__riscv) >> +#define ARCH_RISCV 1 >> #else >> #error "Undefined platform" >> #endif >> >> -#if defined(__sparcv9) || defined(__x86_64) || defined(__aarch64__) >> +#if defined(__sparcv9) || defined(__x86_64) || defined(__aarch64__) || = defined(__riscv) >> #define WSIZE_64 1 >> #else >> #define WSIZE_32 1 >> diff --git a/gprofng/common/hwc_cpus.h b/gprofng/common/hwc_cpus.h >> index be820819dd3..b121e4bfb97 100644 >> --- a/gprofng/common/hwc_cpus.h >> +++ b/gprofng/common/hwc_cpus.h >> @@ -111,6 +111,13 @@ enum { >> ARM_CPU_IMP_QCOM =3D 0x51 >> }; >> >> +// rscv Constants from arch/riscv/include/asm/vendorid_list.h >> +enum { >> + ANDES_VENDOR_ID =3D0x31e, >> + SIFIVE_VENDOR_ID =3D0x489, >> + THEAD_VENDOR_ID =3D0x5b7 >> +}; >> + >> #define AARCH64_VENDORSTR_ARM "ARM" >> >> /* strings below must match those returned by cpc_getcpuver() */ >> diff --git a/gprofng/common/hwcfuncs.h b/gprofng/common/hwcfuncs.h >> index a5f64f2a33f..1a6ee7e30ca 100644 >> --- a/gprofng/common/hwcfuncs.h >> +++ b/gprofng/common/hwcfuncs.h >> @@ -98,7 +98,7 @@ typedef struct { /* sup= plementary data fields */ >> >> #define HW_INTERVAL_MAX UINT64_MAX >> #define HW_INTERVAL_PRESET(x) (HW_INTERVAL_MAX - ((uint64_t)(x) - 1)) >> -#define HW_INTERVAL_TYPE(x) ((uint64_t) (x) >> +#define HW_INTERVAL_TYPE(x) ((uint64_t) (x)) >> >> >> HW_INTERVAL_TYPE is not used. Just remove this line. >> >> >> >> >> /* parsing */ >> #define HWCFUNCS_MAX_ATTRS 20 >> diff --git a/gprofng/configure b/gprofng/configure >> index 1c6a99291be..9ac7a651809 100755 >> --- a/gprofng/configure >> +++ b/gprofng/configure >> @@ -15788,6 +15788,10 @@ build_src=3D >> build_src=3Dtrue >> build_collector=3Dtrue >> ;; >> + riscv*-*-linux*) >> + build_src=3Dtrue >> + build_collector=3Dtrue >> + ;; >> esac >> # Check whether --enable-gprofng-tools was given. >> if test "${enable_gprofng_tools+set}" =3D set; then : >> diff --git a/gprofng/configure.ac b/gprofng/configure.ac >> index 6b8fe262748..b4f2981a487 100644 >> --- a/gprofng/configure.ac >> +++ b/gprofng/configure.ac >> @@ -63,6 +63,10 @@ build_src=3D >> build_src=3Dtrue >> build_collector=3Dtrue >> ;; >> + riscv*-*-linux*) >> + build_src=3Dtrue >> + build_collector=3Dtrue >> + ;; >> esac >> AC_ARG_ENABLE(gprofng-tools, >> AS_HELP_STRING([--disable-gprofng-tools], [do not build gprofng/src= directory]), >> diff --git a/gprofng/libcollector/hwprofile.h b/gprofng/libcollector/hwp= rofile.h >> index 23422dd51fa..6517452eef7 100644 >> --- a/gprofng/libcollector/hwprofile.h >> +++ b/gprofng/libcollector/hwprofile.h >> @@ -84,6 +84,16 @@ typedef struct MHwcntr_packet >> (ucp)->uc_mcontext.regs[CONTEXT_PC] =3D (greg_t)(funcp); \ >> (ucp)->uc_mcontext.regs[CONTEXT_SP] =3D 0; \ >> (ucp)->uc_mcontext.regs[CONTEXT_FP] =3D 0; >> + >> +#elif ARCH(RISCV) >> +#define CONTEXT_PC REG_PC >> +#define CONTEXT_FP 8 >> +#define CONTEXT_SP 2 >> +#define SETFUNCTIONCONTEXT(ucp,funcp) \ >> + (ucp)->uc_mcontext.__gregs[CONTEXT_PC] =3D (greg_t)(funcp); \ >> + (ucp)->uc_mcontext.__gregs[CONTEXT_FP] =3D 0; \ >> + (ucp)->uc_mcontext.__gregs[CONTEXT_SP] =3D 0; >> + >> #endif /* ARCH() */ >> >> #endif >> diff --git a/gprofng/libcollector/libcol_util.c b/gprofng/libcollector/l= ibcol_util.c >> index a8802d4a9b0..8ee1c56ff45 100644 >> --- a/gprofng/libcollector/libcol_util.c >> +++ b/gprofng/libcollector/libcol_util.c >> @@ -91,7 +91,7 @@ __collector_gettid () >> #endif >> __asm__ __volatile__(syscall_instr >> : "=3Da" (r) : "0" (__NR_gettid) >> - : syscall_clobber); >> + : syscall_clobber); >> #else >> r =3D syscall (__NR_gettid); >> #endif >> @@ -1459,7 +1459,10 @@ __collector_util_init () >> else if ((ptr =3D dlvsym (libc, "fopen", "GLIBC_2.0")) !=3D NULL) >> __collector_util_funcs.fopen =3D ptr; >> else >> + { >> ptr =3D dlsym (libc, "fopen"); >> + if(ptr) __collector_util_funcs.fopen =3D ptr; >> + } >> if (__collector_util_funcs.fopen =3D=3D NULL) >> { >> CALL_UTIL (fprintf)(stderr, "COL_ERROR_UTIL_INIT fopen: %s\n", dl= error ()); >> @@ -1475,7 +1478,10 @@ __collector_util_init () >> else if ((ptr =3D dlvsym (libc, "popen", "GLIBC_2.0")) !=3D NULL) >> __collector_util_funcs.popen =3D ptr; >> else >> + { >> ptr =3D dlsym (libc, "popen"); >> + if(ptr) __collector_util_funcs.popen =3D ptr; >> + } >> if (__collector_util_funcs.popen =3D=3D NULL) >> { >> CALL_UTIL (fprintf)(stderr, "COL_ERROR_UTIL_INIT popen: %s\n", dl= error ()); >> @@ -1491,7 +1497,10 @@ __collector_util_init () >> else if ((ptr =3D dlvsym (libc, "fclose", "GLIBC_2.0")) !=3D NULL) >> __collector_util_funcs.fclose =3D ptr; >> else >> + { >> ptr =3D dlsym (libc, "fclose"); >> + if(ptr) __collector_util_funcs.fclose =3D ptr; >> + } >> if (__collector_util_funcs.fclose =3D=3D NULL) >> { >> CALL_UTIL (fprintf)(stderr, "COL_ERROR_UTIL_INIT fclose: %s\n", d= lerror ()); >> diff --git a/gprofng/libcollector/libcol_util.h b/gprofng/libcollector/l= ibcol_util.h >> index c21b4a46c4b..6ac84db05ab 100644 >> --- a/gprofng/libcollector/libcol_util.h >> +++ b/gprofng/libcollector/libcol_util.h >> @@ -209,10 +209,10 @@ static __attribute__ ((always_inline)) inline uint= 32_t >> __collector_cas_32 (volatile uint32_t *pdata, uint32_t old, uint32_t ne= w) >> { >> uint32_t r; >> - __asm__ __volatile__("lock; cmpxchgl %2, %1" >> - : "=3Da" (r), "=3Dm" (*pdata) : "r" (new), >> - "a" (old), "m" (*pdata)); >> - return r; >> + __asm__ __volatile__("lock; cmpxchgl %2, %1" >> + : "=3Da" (r), "=3Dm" (*pdata) : "r" (new), >> + "a" (old), "m" (*pdata)); >> + return r; >> } >> /** >> * This function enables a compare and swap operation to occur atomical= ly. >> @@ -270,7 +270,7 @@ __collector_cas_ptr (void *mem, void *cmp, void *new) >> return r; >> } >> >> -#elif ARCH(Aarch64) >> +#elif ARCH(Aarch64) || ARCH(RISCV) >> static __attribute__ ((always_inline)) inline uint32_t >> __collector_inc_32 (volatile uint32_t *ptr) >> { >> diff --git a/gprofng/libcollector/unwind.c b/gprofng/libcollector/unwind= .c >> index ff2f7aa9a7e..1244a453457 100644 >> --- a/gprofng/libcollector/unwind.c >> +++ b/gprofng/libcollector/unwind.c >> @@ -186,8 +186,14 @@ memory_error_func (int status ATTRIBUTE_UNUSED, bfd= _vma addr ATTRIBUTE_UNUSED, >> #define GET_PC(ctx) (((ucontext_t*)ctx)->uc_mcontext.regs[15]) >> #define GET_SP(ctx) (((ucontext_t*)ctx)->uc_mcontext.regs[13]) >> #define GET_FP(ctx) (((ucontext_t*)ctx)->uc_mcontext.regs[14]) >> + >> +#elif ARCH(RISCV) >> +#define GET_PC(ctx) (((ucontext_t*)ctx)->uc_mcontext.__gregs[REG_PC]) >> +#define GET_SP(ctx) (((ucontext_t*)ctx)->uc_mcontext.__gregs[2]) >> +#define GET_FP(ctx) (((ucontext_t*)ctx)->uc_mcontext.__gregs[8]) >> #endif /* ARCH() */ >> >> + >> /* >> * FILL_CONTEXT() for all platforms >> * Could use getcontext() except: >> @@ -230,13 +236,19 @@ memory_error_func (int status ATTRIBUTE_UNUSED, bf= d_vma addr ATTRIBUTE_UNUSED, >> context->uc_stack.ss_size =3D 0x100000; \ >> } >> >> -#elif ARCH(Aarch64) >> +#elif ARCH(Aarch64) >> #define FILL_CONTEXT(context) \ >> { CALL_UTIL (getcontext) (context); \ >> context->uc_mcontext.sp =3D (__u64) __builtin_frame_address(0); \ >> } >> >> -#endif /* ARCH() */ >> +#elif ARCH(RISCV) >> +#define FILL_CONTEXT(context) \ >> + { CALL_UTIL(getcontext)(context); \ >> + context->uc_mcontext.__gregs[2] =3D (uint64_t) __builtin_frame_addre= ss(0); \=09 >> + } >> + >> +#endif/* ARCH() */ >> >> static int >> getByteInstruction (unsigned char *p) >> diff --git a/gprofng/src/DbeSession.cc b/gprofng/src/DbeSession.cc >> index 86541d97f2e..3c218b5fc91 100644 >> --- a/gprofng/src/DbeSession.cc >> +++ b/gprofng/src/DbeSession.cc >> @@ -94,6 +94,8 @@ Platform_t DbeSession::platform =3D >> Sparc; >> #elif ARCH(Aarch64) >> Aarch64; >> +#elif ARCH(RISCV) >> + RISCV; >> #else // ARCH(Intel) >> Intel; >> #endif >> diff --git a/gprofng/src/Disasm.cc b/gprofng/src/Disasm.cc >> index 9c7e59a590b..19e6f15ff6f 100644 >> --- a/gprofng/src/Disasm.cc >> +++ b/gprofng/src/Disasm.cc >> @@ -208,6 +208,7 @@ Disasm::disasm_open () >> case Amd64: >> need_swap_endian =3D (DbeSession::platform =3D=3D Sparc); >> break; >> + case RISCV: >> case Sparcv8plus: >> case Sparcv9: >> case Sparc: >> @@ -246,6 +247,7 @@ Disasm::disasm_open () >> dis_info.arch =3D bfd_arch_i386; >> dis_info.mach =3D bfd_mach_x86_64; >> break; >> + case RISCV: >> case Sparcv8plus: >> case Sparcv9: >> case Sparc: >> diff --git a/gprofng/src/Experiment.cc b/gprofng/src/Experiment.cc >> index 1378ad5ce07..ac78276d23c 100644 >> --- a/gprofng/src/Experiment.cc >> +++ b/gprofng/src/Experiment.cc >> @@ -542,6 +542,8 @@ Experiment::ExperimentHandler::startElement (char*, = char*, char *qName, Attribut >> exp->platform =3D Intel; >> else if (strcmp (str, "aarch64") =3D=3D 0) >> exp->platform =3D Aarch64; >> + else if (strcmp (str, "riscv64") =3D=3D 0) >> + exp->platform =3D RISCV; >> >> >> The formatting is wrong. >> It looks like in your environment the tab size is 4 spaces, but in the >> GNU standard it is 8. >> >> else >> exp->platform =3D Sparc; >> exp->need_swap_endian =3D (DbeSession::platform =3D=3D Sparc) ? >> diff --git a/gprofng/src/checks.cc b/gprofng/src/checks.cc >> index 094c3bbc60a..2f9fbd7f714 100644 >> --- a/gprofng/src/checks.cc >> +++ b/gprofng/src/checks.cc >> @@ -332,6 +332,10 @@ collect::check_executable_arch (Elf *elf) >> case EM_AARCH64: >> is_64 =3D true; >> break; >> +#elif ARCH(RISCV) >> + case EM_RISCV: >> + is_64 =3D true; >> + break; >> >> >> Again formatting. >> >> >> #endif >> default: >> return EXEC_ELF_ARCH; >> diff --git a/gprofng/src/collctrl.cc b/gprofng/src/collctrl.cc >> index 5d68b689a64..1b04e52b5cc 100644 >> --- a/gprofng/src/collctrl.cc >> +++ b/gprofng/src/collctrl.cc >> @@ -51,9 +51,9 @@ extern const char *strsignal (int); >> #endif >> >> // _SC_CPUID_MAX is not available on 2.6/2.7 >> -#ifndef _SC_CPUID_MAX >> -#define _SC_CPUID_MAX 517 >> -#endif >> + >> +// #define _SC_CPUID_MAX 517 >> +// #endif >> >> >> These lines are missing in latest sources. >> The latest sources are here: https://sourceware.org/git/binutils-gdb.git. >> >> >> The 2.43 release will be on Sunday 14th July. >> It will be good if your fixes are included in this release. >> >> -Vladimir >> >> >> >> const char *get_fstype (char *); >> >> @@ -74,15 +74,16 @@ Coll_Ctrl::Coll_Ctrl (int _interactive, bool _defHWC= , bool _kernelHWC) >> default_stem =3D strdup ("test"); >> >> /* get CPU count and processor clock rate */ >> + #ifndef _SC_CPUID_MAX >> + ncpus =3D sysconf (_SC_NPROCESSORS_CONF); >> + /* add 2048 to count, since on some systems CPUID does not start at z= ero */ >> + ncpumax =3D ncpus + 2048; >> + #elif >> ncpumax =3D sysconf (_SC_CPUID_MAX); >> - if (ncpumax =3D=3D -1) >> - { >> - ncpus =3D sysconf (_SC_NPROCESSORS_CONF); >> - /* add 2048 to count, since on some systems CPUID does not start = at zero */ >> - ncpumax =3D ncpus + 2048; >> - } >> - ncpus =3D 0; >> - cpu_clk_freq =3D 0; >> + #endif >> + >> + //ncpus =3D 0; >> + //cpu_clk_freq =3D 0; >> >> // On Linux, read /proc/cpuinfo to get CPU count and clock rate >> // Note that parsing is different on SPARC and x86 >> @@ -115,6 +116,9 @@ Coll_Ctrl::Coll_Ctrl (int _interactive, bool _defHWC= , bool _kernelHWC) >> #elif defined(__aarch64__) >> asm volatile("mrs %0, cntfrq_el0" : "=3Dr" (cpu_clk_freq)); >> >> +#elif defined(__riscv) >> + cpu_clk_freq =3D 1000; >> + >> #else >> FILE *procf =3D fopen ("/proc/cpuinfo", "r"); >> if (procf !=3D NULL) >> diff --git a/gprofng/src/dbe_types.h b/gprofng/src/dbe_types.h >> index 9fa842ce85d..c67d421566e 100644 >> --- a/gprofng/src/dbe_types.h >> +++ b/gprofng/src/dbe_types.h >> @@ -42,7 +42,8 @@ enum Platform_t >> Sparcv8plus, >> Java, >> Amd64, >> - Aarch64 >> + Aarch64, >> + RISCV >> }; >> >> enum WSize_t >> diff --git a/gprofng/testsuite/gprofng.display/mttest/gethrtime.c b/gpro= fng/testsuite/gprofng.display/mttest/gethrtime.c >> index da39821027f..5e2cc3dc97b 100644 >> --- a/gprofng/testsuite/gprofng.display/mttest/gethrtime.c >> +++ b/gprofng/testsuite/gprofng.display/mttest/gethrtime.c >> @@ -32,6 +32,8 @@ >> #define SPARC 1 >> #elif defined(__aarch64__) >> #define Aarch64 1 >> +#elif defined(__riscv) >> +#define RISCV 1 >> #else >> #define Intel 1 >> #endif >> >> >> > --00000000000018d660061c687b86--