aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrew Waterman <andrew@sifive.com>2020-01-13 12:14:04 -0800
committerAndrew Waterman <andrew@sifive.com>2020-01-13 12:14:04 -0800
commit6fa3555cc501ab1dfb034061e991e065e2e54253 (patch)
tree05c9e0209dd5fb26383f453fdb38bccba5218852
parent77a5df569451571d608650a34183d53df99790ec (diff)
downloadpk-6fa3555cc501ab1dfb034061e991e065e2e54253.zip
pk-6fa3555cc501ab1dfb034061e991e065e2e54253.tar.gz
pk-6fa3555cc501ab1dfb034061e991e065e2e54253.tar.bz2
Enable vector unit if present (continuation of 77a5df569451571d608650a34183d53df99790ec)
-rw-r--r--machine/encoding.h1
-rw-r--r--machine/minit.c8
-rw-r--r--pk/pk.c2
3 files changed, 8 insertions, 3 deletions
diff --git a/machine/encoding.h b/machine/encoding.h
index 20c44b9..1953f56 100644
--- a/machine/encoding.h
+++ b/machine/encoding.h
@@ -33,6 +33,7 @@
#define SSTATUS_UPIE 0x00000010
#define SSTATUS_SPIE 0x00000020
#define SSTATUS_SPP 0x00000100
+#define SSTATUS_VS 0x01800000
#define SSTATUS_FS 0x00006000
#define SSTATUS_XS 0x00018000
#define SSTATUS_SUM 0x00040000
diff --git a/machine/minit.c b/machine/minit.c
index 8c98e2b..a1befd1 100644
--- a/machine/minit.c
+++ b/machine/minit.c
@@ -23,13 +23,17 @@ void* kernel_end;
static void mstatus_init()
{
+ uintptr_t mstatus = 0;
+
// Enable FPU
if (supports_extension('F'))
- write_csr(mstatus, MSTATUS_FS);
+ mstatus |= MSTATUS_FS;
// Enable vector extension
if (supports_extension('V'))
- write_csr(mstatus, MSTATUS_VS);
+ mstatus |= MSTATUS_VS;
+
+ write_csr(mstatus, mstatus);
// Enable user/supervisor use of perf counters
if (supports_extension('S'))
diff --git a/pk/pk.c b/pk/pk.c
index a2be365..bce11a5 100644
--- a/pk/pk.c
+++ b/pk/pk.c
@@ -187,7 +187,7 @@ void boot_loader(uintptr_t dtb)
write_csr(stvec, &trap_entry);
write_csr(sscratch, 0);
write_csr(sie, 0);
- set_csr(sstatus, SSTATUS_SUM | SSTATUS_FS);
+ set_csr(sstatus, SSTATUS_SUM | SSTATUS_FS | SSTATUS_VS);
file_init();
enter_supervisor_mode(rest_of_boot_loader, pk_vm_init(), 0);