aboutsummaryrefslogtreecommitdiff
path: root/riscv/extensions.cc
diff options
context:
space:
mode:
authorAndrew Waterman <waterman@cs.berkeley.edu>2015-04-03 21:53:22 -0700
committerAndrew Waterman <waterman@cs.berkeley.edu>2015-04-03 21:53:22 -0700
commitc4350ef6ef6259e48509e125fd2d051969dc6efa (patch)
tree7f6b0900717eea640d687fc677d2cd39c97a9dd2 /riscv/extensions.cc
parentd9d73d80c1b738b3b30eb40d192f61cbdb0e201f (diff)
downloadriscv-isa-sim-c4350ef6ef6259e48509e125fd2d051969dc6efa.zip
riscv-isa-sim-c4350ef6ef6259e48509e125fd2d051969dc6efa.tar.gz
riscv-isa-sim-c4350ef6ef6259e48509e125fd2d051969dc6efa.tar.bz2
Support setting ISA/subsets with --isa flag
Default is RV64IMAFDC. Can do things like --isa=RV32 (which implies IMAFDC) --isa=IM (which implies RV64) --isa=RV64IMAFDXhwacha
Diffstat (limited to 'riscv/extensions.cc')
-rw-r--r--riscv/extensions.cc35
1 files changed, 35 insertions, 0 deletions
diff --git a/riscv/extensions.cc b/riscv/extensions.cc
new file mode 100644
index 0000000..315621f
--- /dev/null
+++ b/riscv/extensions.cc
@@ -0,0 +1,35 @@
+#include "extension.h"
+#include <string>
+#include <map>
+#include <dlfcn.h>
+
+static std::map<std::string, std::function<extension_t*()>>& extensions()
+{
+ static std::map<std::string, std::function<extension_t*()>> v;
+ return v;
+}
+
+void register_extension(const char* name, std::function<extension_t*()> f)
+{
+ extensions()[name] = f;
+}
+
+std::function<extension_t*()> find_extension(const char* name)
+{
+ if (!extensions().count(name)) {
+ // try to find extension xyz by loading libxyz.so
+ std::string libname = std::string("lib") + name + ".so";
+ if (!dlopen(libname.c_str(), RTLD_LAZY)) {
+ fprintf(stderr, "couldn't find extension '%s' (or library '%s')\n",
+ name, libname.c_str());
+ exit(-1);
+ }
+ if (!extensions().count(name)) {
+ fprintf(stderr, "couldn't find extension '%s' in shared library '%s'\n",
+ name, libname.c_str());
+ exit(-1);
+ }
+ }
+
+ return extensions()[name];
+}