git: fc4c39c54fc2 - main - kldxref: handle R_RISCV_64 relocation

From: Mitchell Horne <mhorne_at_FreeBSD.org>
Date: Thu, 20 Oct 2022 15:04:28 UTC
The branch main has been updated by mhorne:

URL: https://cgit.FreeBSD.org/src/commit/?id=fc4c39c54fc240af424ae249b75057d2977ef8f2

commit fc4c39c54fc240af424ae249b75057d2977ef8f2
Author:     Mitchell Horne <mhorne@FreeBSD.org>
AuthorDate: 2022-10-20 14:56:01 +0000
Commit:     Mitchell Horne <mhorne@FreeBSD.org>
CommitDate: 2022-10-20 15:01:29 +0000

    kldxref: handle R_RISCV_64 relocation
    
    These are emitted in at least two kmods, and kldxref prints a warning.
    While here, remove the unneeded local variable 'val'.
    
    Reviewed by:    jrtc27, imp, emaste
    MFC after:      1 week
    Sponsored by:   The FreeBSD Foundation
    Differential Revision:  https://reviews.freebsd.org/D37038
---
 usr.sbin/kldxref/ef_riscv.c | 12 ++++++++----
 1 file changed, 8 insertions(+), 4 deletions(-)

diff --git a/usr.sbin/kldxref/ef_riscv.c b/usr.sbin/kldxref/ef_riscv.c
index e0caae3bd286..b94b37b3a92f 100644
--- a/usr.sbin/kldxref/ef_riscv.c
+++ b/usr.sbin/kldxref/ef_riscv.c
@@ -45,10 +45,10 @@ int
 ef_reloc(struct elf_file *ef, const void *reldata, int reltype, Elf_Off relbase,
     Elf_Off dataoff, size_t len, void *dest)
 {
-	Elf_Addr *where, val;
+	Elf_Addr *where;
 	const Elf_Rela *rela;
 	Elf_Addr addend, addr;
-	Elf_Size rtype;
+	Elf_Size rtype, symidx;
 
 	switch (reltype) {
 	case EF_RELOC_RELA:
@@ -57,6 +57,7 @@ ef_reloc(struct elf_file *ef, const void *reldata, int reltype, Elf_Off relbase,
 		    dataoff);
 		addend = rela->r_addend;
 		rtype = ELF_R_TYPE(rela->r_info);
+		symidx = ELF_R_SYM(rela->r_info);
 		break;
 	default:
 		return (EINVAL);
@@ -66,10 +67,13 @@ ef_reloc(struct elf_file *ef, const void *reldata, int reltype, Elf_Off relbase,
 		return (0);
 
 	switch (rtype) {
+	case R_RISCV_64:	/* S + A */
+		addr = EF_SYMADDR(ef, symidx) + addend;
+		*where = addr;
+		break;
 	case R_RISCV_RELATIVE:	/* B + A */
 		addr = addend + relbase;
-		val = addr;
-		*where = val;
+		*where = addr;
 		break;
 	default:
 		warnx("unhandled relocation type %d", (int)rtype);