From: Andrew Jones <andrew.jones@linux.dev>
To: kvm@vger.kernel.org, kvm-riscv@lists.infradead.org,
kvmarm@lists.linux.dev
Cc: ajones@ventanamicro.com, anup@brainfault.org,
atishp@atishpatra.org, pbonzini@redhat.com, thuth@redhat.com,
alexandru.elisei@arm.com, eric.auger@redhat.com
Subject: [kvm-unit-tests PATCH 22/24] riscv: Add isa string parsing
Date: Wed, 24 Jan 2024 08:18:38 +0100 [thread overview]
Message-ID: <20240124071815.6898-48-andrew.jones@linux.dev> (raw)
In-Reply-To: <20240124071815.6898-26-andrew.jones@linux.dev>
We can probably get away with just assuming several important
and popular extensions (at least everything covered by G), but
we'll also want to use some extensions which we should ensure
are present by parsing the isa string. Add a parser and already
apply it to Sstc.
Signed-off-by: Andrew Jones <andrew.jones@linux.dev>
---
lib/riscv/asm/isa.h | 18 +++++++++
lib/riscv/asm/processor.h | 1 +
lib/riscv/processor.c | 84 +++++++++++++++++++++++++++++++++++++++
3 files changed, 103 insertions(+)
create mode 100644 lib/riscv/asm/isa.h
diff --git a/lib/riscv/asm/isa.h b/lib/riscv/asm/isa.h
new file mode 100644
index 000000000000..4cb467b77077
--- /dev/null
+++ b/lib/riscv/asm/isa.h
@@ -0,0 +1,18 @@
+/* SPDX-License-Identifier: GPL-2.0-only */
+#ifndef _ASMRISCV_ISA_H_
+#define _ASMRISCV_ISA_H_
+#include <bitops.h>
+#include <asm/setup.h>
+
+enum {
+ ISA_SSTC,
+ ISA_MAX,
+};
+_Static_assert(ISA_MAX <= __riscv_xlen, "Need to increase thread_info.isa");
+
+static inline bool cpu_has_extension(int cpu, int ext)
+{
+ return test_bit(ext, cpus[cpu].isa);
+}
+
+#endif /* _ASMRISCV_ISA_H_ */
diff --git a/lib/riscv/asm/processor.h b/lib/riscv/asm/processor.h
index d8b7018c9102..928a988b471a 100644
--- a/lib/riscv/asm/processor.h
+++ b/lib/riscv/asm/processor.h
@@ -11,6 +11,7 @@ typedef void (*exception_fn)(struct pt_regs *);
struct thread_info {
int cpu;
unsigned long hartid;
+ unsigned long isa[1];
exception_fn exception_handlers[EXCEPTION_CAUSE_MAX];
};
diff --git a/lib/riscv/processor.c b/lib/riscv/processor.c
index 7248cf4c5ca6..02ac35890ded 100644
--- a/lib/riscv/processor.c
+++ b/lib/riscv/processor.c
@@ -3,7 +3,11 @@
* Copyright (C) 2023, Ventana Micro Systems Inc., Andrew Jones <ajones@ventanamicro.com>
*/
#include <libcflat.h>
+#include <bitops.h>
+#include <devicetree.h>
+#include <string.h>
#include <asm/csr.h>
+#include <asm/isa.h>
#include <asm/processor.h>
#include <asm/setup.h>
@@ -53,10 +57,90 @@ void install_exception_handler(unsigned long cause, void (*handler)(struct pt_re
info->exception_handlers[cause] = handler;
}
+static int isa_bit(const char *name, int len)
+{
+ /*
+ * We assume and use several extensions, such as Zicsr and Zifencei.
+ * Here we only look for extensions which we don't assume and still
+ * may want to use.
+ */
+#define ISA_CMP(name, len, ext) \
+ ((len) == sizeof(ext) - 1 && !strncasecmp(name, ext, len))
+
+ if (ISA_CMP(name, len, "sstc"))
+ return ISA_SSTC;
+
+#undef ISA_CMP
+ return ISA_MAX;
+}
+
+static void isa_parse(unsigned long *isa, const char *isa_string, int len)
+{
+ assert(isa_string[0] == 'r' && isa_string[1] == 'v');
+#if __riscv_xlen == 32
+ assert(isa_string[2] == '3' && isa_string[3] == '2');
+#else
+ assert(isa_string[2] == '6' && isa_string[3] == '4');
+#endif
+
+ for (int i = 4; i < len; ++i) {
+ int nr;
+
+ if (isa_string[i] == '_') {
+ const char *multi = &isa_string[++i];
+ int start = i;
+
+ while (i < len && isa_string[i] != '_')
+ ++i;
+ nr = isa_bit(multi, i - start);
+ if (i < len)
+ --i;
+ } else {
+ nr = isa_bit(&isa_string[i], 1);
+ }
+
+ if (nr < ISA_MAX)
+ set_bit(nr, isa);
+ }
+}
+
+static void isa_init_fdt(int cpu_node, u64 hartid, void *data)
+{
+ struct thread_info *info = (struct thread_info *)data;
+ const struct fdt_property *prop;
+ int len;
+
+ if (hartid != info->hartid)
+ return;
+
+ prop = fdt_get_property(dt_fdt(), cpu_node, "riscv,isa", &len);
+ assert(prop);
+
+ isa_parse(info->isa, prop->data, len);
+}
+
+static void isa_init_acpi(void)
+{
+ assert_msg(false, "ACPI not available");
+}
+
+static void isa_init(struct thread_info *info)
+{
+ int ret;
+
+ if (dt_available()) {
+ ret = dt_for_each_cpu_node(isa_init_fdt, info);
+ assert(ret == 0);
+ } else {
+ isa_init_acpi();
+ }
+}
+
void thread_info_init(void)
{
unsigned long hartid = csr_read(CSR_SSCRATCH);
int cpu = hartid_to_cpu(hartid);
+ isa_init(&cpus[cpu]);
csr_write(CSR_SSCRATCH, &cpus[cpu]);
}
--
2.43.0
next prev parent reply other threads:[~2024-01-24 7:19 UTC|newest]
Thread overview: 33+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-01-24 7:18 [kvm-unit-tests PATCH 00/24] Introduce RISC-V Andrew Jones
2024-01-24 7:18 ` [kvm-unit-tests PATCH 01/24] configure: Add ARCH_LIBDIR Andrew Jones
2024-01-24 9:33 ` Thomas Huth
2024-01-24 7:18 ` [kvm-unit-tests PATCH 02/24] riscv: Initial port, hello world Andrew Jones
2024-01-24 7:18 ` [kvm-unit-tests PATCH 03/24] arm/arm64: Move cpumask.h to common lib Andrew Jones
2024-01-24 9:52 ` Thomas Huth
2024-01-24 7:18 ` [kvm-unit-tests PATCH 04/24] arm/arm64: Share cpu online, present and idle masks Andrew Jones
2024-01-24 9:53 ` Thomas Huth
2024-01-24 7:18 ` [kvm-unit-tests PATCH 05/24] riscv: Add DT parsing Andrew Jones
2024-01-24 7:18 ` [kvm-unit-tests PATCH 06/24] riscv: Add initial SBI support Andrew Jones
2024-01-24 7:18 ` [kvm-unit-tests PATCH 07/24] riscv: Add run script and unittests.cfg Andrew Jones
2024-01-24 7:18 ` [kvm-unit-tests PATCH 08/24] riscv: Add riscv32 support Andrew Jones
2024-01-24 7:18 ` [kvm-unit-tests PATCH 09/24] riscv: Add exception handling Andrew Jones
2024-01-24 7:18 ` [kvm-unit-tests PATCH 10/24] riscv: Add backtrace support Andrew Jones
2024-01-24 7:18 ` [kvm-unit-tests PATCH 11/24] arm/arm64: Generalize wfe/sev names in smp.c Andrew Jones
2024-01-24 7:18 ` [kvm-unit-tests PATCH 12/24] arm/arm64: Remove spinlocks from on_cpu_async Andrew Jones
2024-01-24 7:18 ` [kvm-unit-tests PATCH 13/24] arm/arm64: Share on_cpus Andrew Jones
2024-01-24 7:18 ` [kvm-unit-tests PATCH 14/24] riscv: Compile with march Andrew Jones
2024-01-24 7:18 ` [kvm-unit-tests PATCH 15/24] riscv: Add SMP support Andrew Jones
2024-01-24 7:18 ` [kvm-unit-tests PATCH 16/24] arm/arm64: Share memregions Andrew Jones
2024-01-24 7:18 ` [kvm-unit-tests PATCH 17/24] riscv: Populate memregions and switch to page allocator Andrew Jones
2024-01-24 7:18 ` [kvm-unit-tests PATCH 18/24] riscv: Add MMU support Andrew Jones
2024-01-24 7:18 ` [kvm-unit-tests PATCH 19/24] riscv: Enable the MMU in secondaries Andrew Jones
2024-01-24 7:18 ` [kvm-unit-tests PATCH 20/24] riscv: Enable vmalloc Andrew Jones
2024-01-24 7:18 ` [kvm-unit-tests PATCH 21/24] lib: Add strcasecmp and strncasecmp Andrew Jones
2024-01-24 9:41 ` Thomas Huth
2024-01-24 7:18 ` Andrew Jones [this message]
2024-01-24 7:18 ` [kvm-unit-tests PATCH 23/24] gitlab-ci: Add riscv64 tests Andrew Jones
2024-01-24 9:45 ` Thomas Huth
2024-01-24 10:21 ` Andrew Jones
2024-01-24 7:18 ` [kvm-unit-tests PATCH 24/24] MAINTAINERS: Add riscv Andrew Jones
2024-01-24 9:46 ` Thomas Huth
2024-01-24 9:58 ` [kvm-unit-tests PATCH 00/24] Introduce RISC-V Thomas Huth
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20240124071815.6898-48-andrew.jones@linux.dev \
--to=andrew.jones@linux.dev \
--cc=ajones@ventanamicro.com \
--cc=alexandru.elisei@arm.com \
--cc=anup@brainfault.org \
--cc=atishp@atishpatra.org \
--cc=eric.auger@redhat.com \
--cc=kvm-riscv@lists.infradead.org \
--cc=kvm@vger.kernel.org \
--cc=kvmarm@lists.linux.dev \
--cc=pbonzini@redhat.com \
--cc=thuth@redhat.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox