|
|
|
@ -24,7 +24,7 @@ void* kernel_end; |
|
|
|
static void mstatus_init() |
|
|
|
{ |
|
|
|
// Enable FPU
|
|
|
|
if (supports_extension('D') || supports_extension('F')) |
|
|
|
if (supports_extension('F')) |
|
|
|
write_csr(mstatus, MSTATUS_FS); |
|
|
|
|
|
|
|
// Enable user/supervisor use of perf counters
|
|
|
|
@ -64,7 +64,7 @@ static void delegate_traps() |
|
|
|
|
|
|
|
static void fp_init() |
|
|
|
{ |
|
|
|
if (!supports_extension('D') && !supports_extension('F')) |
|
|
|
if (!supports_extension('F')) |
|
|
|
return; |
|
|
|
|
|
|
|
assert(read_csr(mstatus) & MSTATUS_FS); |
|
|
|
@ -73,6 +73,13 @@ static void fp_init() |
|
|
|
for (int i = 0; i < 32; i++) |
|
|
|
init_fp_reg(i); |
|
|
|
write_csr(fcsr, 0); |
|
|
|
|
|
|
|
# if __riscv_flen == 32 |
|
|
|
uintptr_t d_mask = 1 << ('D' - 'A'); |
|
|
|
clear_csr(misa, d_mask); |
|
|
|
assert(!(read_csr(misa) & d_mask)); |
|
|
|
# endif |
|
|
|
|
|
|
|
#else |
|
|
|
uintptr_t fd_mask = (1 << ('F' - 'A')) | (1 << ('D' - 'A')); |
|
|
|
clear_csr(misa, fd_mask); |
|
|
|
|