teknoraver / rpms / rpm

Forked from rpms/rpm 4 months ago
Clone
Blob Blame History Raw
From cf5679397f36710a942fcb83a63c690eb25d72af Mon Sep 17 00:00:00 2001
From: "Richard W.M. Jones" <rjones@redhat.com>
Date: Thu, 11 Aug 2016 11:38:18 +0100
Subject: [PATCH 2/3] rpmrc: Convert uname.machine == "riscv" to
 "riscv32"/"riscv64"/"riscv128".

On RISC-V, the kernel can return uname.machine == "riscv" (for all bit
sizes).  I say "can" return, because that is the default, but it is
also possible to compile the kernel specially so it returns "riscv64"
etc.

GNU is using "riscv64".

This commit converts the kernel uname machine type "riscv" to a more
suitable value.

This conversion is supposed to be done by the arch_canon table.
However the arch_canon table is not populated until after the
defaultMachine function is called for the first time, making it a bit
useless.  In any case, arch_canon cannot take into account the bit
size of the architecture, but the C code here can.

Signed-off-by: Richard W.M. Jones <rjones@redhat.com>
---
 lib/rpmrc.c | 11 +++++++++++
 1 file changed, 11 insertions(+)

diff --git a/lib/rpmrc.c b/lib/rpmrc.c
index f2e0f48..eb136d8 100644
--- a/lib/rpmrc.c
+++ b/lib/rpmrc.c
@@ -1216,6 +1216,17 @@ static void defaultMachine(rpmrcCtx ctx, const char ** arch, const char ** os)
 	}
 #	endif	/* arm*-linux */
 
+#	if defined(__linux__) && defined(__riscv__)
+	if (rstreq(un.machine, "riscv")) {
+		if (sizeof(long) == 4)
+			strcpy(un.machine, "riscv32");
+		else if (sizeof(long) == 8)
+			strcpy(un.machine, "riscv64");
+		else if (sizeof(long) == 16)
+			strcpy(un.machine, "riscv128");
+	}
+#	endif	/* riscv */
+
 #	if defined(__GNUC__) && defined(__alpha__)
 	{
 	    unsigned long amask, implver;
-- 
2.7.4