From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from simark.ca by simark.ca with LMTP id 8NReE4WvKmCIMwAAWB0awg (envelope-from ) for ; Mon, 15 Feb 2021 12:29:41 -0500 Received: by simark.ca (Postfix, from userid 112) id 46BF01EF78; Mon, 15 Feb 2021 12:29:41 -0500 (EST) X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on simark.ca X-Spam-Level: X-Spam-Status: No, score=-0.9 required=5.0 tests=DKIM_SIGNED, MAILING_LIST_MULTI,T_DKIM_INVALID,URIBL_BLOCKED autolearn=ham autolearn_force=no version=3.4.2 Received: from sourceware.org (server2.sourceware.org [8.43.85.97]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by simark.ca (Postfix) with ESMTPS id 8E9131E54D for ; Mon, 15 Feb 2021 12:29:38 -0500 (EST) Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 29BA7396EC47; Mon, 15 Feb 2021 17:29:31 +0000 (GMT) Received: from mail-wr1-x432.google.com (mail-wr1-x432.google.com [IPv6:2a00:1450:4864:20::432]) by sourceware.org (Postfix) with ESMTPS id DB253396AC32 for ; Mon, 15 Feb 2021 17:29:26 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.3.2 sourceware.org DB253396AC32 Authentication-Results: sourceware.org; dmarc=none (p=none dis=none) header.from=embecosm.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=andrew.burgess@embecosm.com Received: by mail-wr1-x432.google.com with SMTP id 7so9945578wrz.0 for ; Mon, 15 Feb 2021 09:29:26 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=embecosm.com; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=PnXnkW0mFBfBfy4iwSDDGv7FKF00PCa+YxrDjsEc8Nw=; b=HAkVM+kallTYV3nMiGjfKXCUSufbUyhXhahH22USQhER1h3EmvubJQyFqx3zo/c2wn J8txJwvc9pBkz91K+l+yyC3MORJk4AZ49tiN5ASvW6hBE9jaYwjxbgc3mGCkT1fEYqd0 46RBJgtKm1cfdQuEG7M7tclA0K51tF2PJk+OL1wGuptoORWXLm3Q2QkOBfI0gCzVqRrl 94fmoFVIo46YYAvtpyU6leIkBE51BOfW6nsPCU95gNmNwdFoj/cd+TjC1cN5rNB0Dq1n 8n0DT1TfSGUZwT0zAeR6dzY1xnud7kgDcqrLQJtSczrdrSMZVRTX3XsQerQipFLeFxBK NroQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=PnXnkW0mFBfBfy4iwSDDGv7FKF00PCa+YxrDjsEc8Nw=; b=oNIu0P4lQ3iumbnOcF2Lrt9Qyg9SeCrf0muYmYxRrV87J7sNBB8tA8ZoHXu+3i7yet GQ4R8t7ons1CphiTct7avr0kXWBZqj4AXCz11MkzgwWwvk5jDXxTWxLrAfvV8Ib7CQMY 0zg1aAbtad8ct16LCmjysVMymv89+bD+jwMdLth+tiib+3f8NxbTS1pMXg483EIc9TbI HBueHq7ewi9CCZ0NRXhGyR6oMjrFE2UqnA9TQgbL8peCBYwxl+MIfCmPINw/ekM+Bo00 cQMlJTcmCCMXvIcNIm7UKiVtW+YKMFQe78hlWqCsB+KYhbADXBpfO+pJ8BlDUqXijtks XCPg== X-Gm-Message-State: AOAM531NkkW4wPll/V0y7saWGVn6BuRlzf9CloeqjiBP2f4pM2n0ZmpK +7EQeEDnuarfSVX0paXGA4ihOOLNjTf91Q== X-Google-Smtp-Source: ABdhPJzDpunvqcIlFGLidV4eqbBdRguizxEZG1CilhRS8M5HNQgJTzC23sTZkIsxawFuyhYF1IWrNw== X-Received: by 2002:adf:a196:: with SMTP id u22mr19401428wru.416.1613410165734; Mon, 15 Feb 2021 09:29:25 -0800 (PST) Received: from localhost (host86-186-80-154.range86-186.btcentralplus.com. [86.186.80.154]) by smtp.gmail.com with ESMTPSA id i10sm32219208wrp.0.2021.02.15.09.29.25 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 15 Feb 2021 09:29:25 -0800 (PST) From: Andrew Burgess To: gdb-patches@sourceware.org, binutils@sourceware.org Subject: [PATCHv3 6/9] bfd/binutils: add support for RISC-V CSRs in core files Date: Mon, 15 Feb 2021 17:29:09 +0000 Message-Id: <2175060020b8c67092b601da15ca462b48312e84.1613410057.git.andrew.burgess@embecosm.com> X-Mailer: git-send-email 2.25.4 In-Reply-To: References: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-BeenThere: gdb-patches@sourceware.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gdb-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: gdb-patches-bounces@sourceware.org Sender: "Gdb-patches" Adds support for including RISC-V control and status registers into core files. The value for the define NT_RISCV_CSR is set to 0x900, this corresponds to a patch I have proposed for the Linux kernel here: http://lists.infradead.org/pipermail/linux-riscv/2020-December/003910.html As I have not yet heard if the above patch will be accepted into the kernel or not I have set the note name string to "GDB", and the note type to NT_RISCV_CSR. This means that if the above patch is rejected from the kernel, and the note type number 0x900 is assigned to some other note type, we will still be able to distinguish between the GDB produced NT_RISCV_CSR, and the kernel produced notes, where the name would be set to "CORE". bfd/ChangeLog: * elf-bfd.h (elfcore_write_riscv_csr): Declare. * elf.c (elfcore_grok_riscv_csr): New function. (elfcore_grok_note): Handle NT_RISCV_CSR. (elfcore_write_riscv_csr): New function. (elfcore_write_register_note): Handle '.reg-riscv-csr'. binutils/ChangeLog: * readelf.c (get_note_type): Handle NT_RISCV_CSR. include/ChangeLog: * elf/common.h (NT_RISCV_CSR): Define. --- bfd/ChangeLog | 9 +++++++++ bfd/elf-bfd.h | 2 ++ bfd/elf.c | 35 +++++++++++++++++++++++++++++++++++ binutils/ChangeLog | 5 +++++ binutils/readelf.c | 2 ++ include/ChangeLog | 5 +++++ include/elf/common.h | 2 ++ 7 files changed, 60 insertions(+) diff --git a/bfd/elf-bfd.h b/bfd/elf-bfd.h index 8b989e71580..e4cf481965f 100644 --- a/bfd/elf-bfd.h +++ b/bfd/elf-bfd.h @@ -2796,6 +2796,8 @@ extern char *elfcore_write_aarch_pauth (bfd *, char *, int *, const void *, int); extern char *elfcore_write_arc_v2 (bfd *, char *, int *, const void *, int); +extern char *elfcore_write_riscv_csr + (bfd *, char *, int *, const void *, int); extern char *elfcore_write_gdb_tdesc (bfd *, char *, int *, const void *, int); extern char *elfcore_write_lwpstatus diff --git a/bfd/elf.c b/bfd/elf.c index 2d66e9b999f..553fa65a118 100644 --- a/bfd/elf.c +++ b/bfd/elf.c @@ -9912,6 +9912,15 @@ elfcore_grok_arc_v2 (bfd *abfd, Elf_Internal_Note *note) return elfcore_make_note_pseudosection (abfd, ".reg-arc-v2", note); } +/* Convert NOTE into a bfd_section called ".reg-riscv-csr". Return TRUE if + successful otherwise, return FALSE. */ + +static bfd_boolean +elfcore_grok_riscv_csr (bfd *abfd, Elf_Internal_Note *note) +{ + return elfcore_make_note_pseudosection (abfd, ".reg-riscv-csr", note); +} + /* Convert NOTE into a bfd_section called ".gdb-tdesc". Return TRUE if successful otherwise, return FALSE. */ @@ -10586,6 +10595,13 @@ elfcore_grok_note (bfd *abfd, Elf_Internal_Note *note) else return TRUE; + case NT_RISCV_CSR: + if (note->namesz == 4 + && strcmp (note->namedata, "GDB") == 0) + return elfcore_grok_riscv_csr (abfd, note); + else + return TRUE; + case NT_PRPSINFO: case NT_PSINFO: if (bed->elf_backend_grok_psinfo) @@ -11967,6 +11983,23 @@ elfcore_write_arc_v2 (bfd *abfd, note_name, NT_ARC_V2, arc_v2, size); } +/* Write the buffer of csr values in CSRS (length SIZE) into the note + buffer BUF and update *BUFSIZ. ABFD is the bfd the note is being + written into. Return a pointer to the new start of the note buffer, to + replace BUF which may no longer be valid. */ + +char * +elfcore_write_riscv_csr (bfd *abfd, + char *buf, + int *bufsiz, + const void *csrs, + int size) +{ + const char *note_name = "GDB"; + return elfcore_write_note (abfd, buf, bufsiz, + note_name, NT_RISCV_CSR, csrs, size); +} + /* Write the target description (a string) pointed to by TDESC, length SIZE, into the note buffer BUF, and update *BUFSIZ. ABFD is the bfd the note is being written into. Return a pointer to the new start of the @@ -12070,6 +12103,8 @@ elfcore_write_register_note (bfd *abfd, return elfcore_write_arc_v2 (abfd, buf, bufsiz, data, size); if (strcmp (section, ".gdb-tdesc") == 0) return elfcore_write_gdb_tdesc (abfd, buf, bufsiz, data, size); + if (strcmp (section, ".reg-riscv-csr") == 0) + return elfcore_write_riscv_csr (abfd, buf, bufsiz, data, size); return NULL; } diff --git a/binutils/readelf.c b/binutils/readelf.c index 277fcd3bc5a..ba624788633 100644 --- a/binutils/readelf.c +++ b/binutils/readelf.c @@ -18396,6 +18396,8 @@ get_note_type (Filedata * filedata, unsigned e_type) return _("NT_ARM_HW_WATCH (AArch hardware watchpoint registers)"); case NT_ARC_V2: return _("NT_ARC_V2 (ARC HS accumulator/extra registers)"); + case NT_RISCV_CSR: + return _("NT_RISCV_CSR (RISC-V control and status registers)"); case NT_PSTATUS: return _("NT_PSTATUS (pstatus structure)"); case NT_FPREGS: diff --git a/include/elf/common.h b/include/elf/common.h index e6e9c278faa..4cb3748e4fd 100644 --- a/include/elf/common.h +++ b/include/elf/common.h @@ -674,6 +674,8 @@ /* note name must be "LINUX". */ #define NT_ARC_V2 0x600 /* ARC HS accumulator/extra registers. */ /* note name must be "LINUX". */ +#define NT_RISCV_CSR 0x900 /* RISC-V Control and Status Registers */ + /* note name must be "CORE". */ #define NT_SIGINFO 0x53494749 /* Fields of siginfo_t. */ #define NT_FILE 0x46494c45 /* Description of mapped files. */ -- 2.25.4