diff --git a/.gitignore b/.gitignore new file mode 100644 index 000000000..9869d33eb --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +/.idea +/cmake-* diff --git a/portable/GCC/RISC-V/chip_specific_extensions/Thead_common/freertos_risc_v_chip_specific_extensions.h b/portable/GCC/RISC-V/chip_specific_extensions/Thead_common/freertos_risc_v_chip_specific_extensions.h index 7c3e67307..2ba5729c8 100644 --- a/portable/GCC/RISC-V/chip_specific_extensions/Thead_common/freertos_risc_v_chip_specific_extensions.h +++ b/portable/GCC/RISC-V/chip_specific_extensions/Thead_common/freertos_risc_v_chip_specific_extensions.h @@ -53,152 +53,106 @@ #ifndef __FREERTOS_RISC_V_EXTENSIONS_H__ #define __FREERTOS_RISC_V_EXTENSIONS_H__ -#define portasmHANDLE_INTERRUPT Default_IRQHandler #define portasmHAS_SIFIVE_CLINT 1 #define portasmHAS_MTIME 1 -#define portasmADDITIONAL_CONTEXT_SIZE 32 /* Must be even number on 32-bit cores. */ + +/* 32 fp, 1 fcsr, 1 padding */ +#define portasmADDITIONAL_CONTEXT_SIZE 34 /* Must be even number on 32-bit cores. */ + +/* C906: lp64d, E907: ilp32f, so __riscv_flen matches with portWORD_SIZE */ +#if __riscv_flen == 64 + #define FS fsd + #define FL fld +#elif __riscv_flen == 32 + #define FS fsw + #define FL flw +#endif .macro portasmSAVE_ADDITIONAL_REGISTERS /* save float registers */ + /* alloc stack */ addi sp, sp, -(portasmADDITIONAL_CONTEXT_SIZE * portWORD_SIZE) -#if __riscv_flen == 64 - fsd f31, 32 * portWORD_SIZE( sp ) - fsd f30, 31 * portWORD_SIZE( sp ) - fsd f29, 30 * portWORD_SIZE( sp ) - fsd f28, 29 * portWORD_SIZE( sp ) - fsd f27, 28 * portWORD_SIZE( sp ) - fsd f26, 27 * portWORD_SIZE( sp ) - fsd f25, 26 * portWORD_SIZE( sp ) - fsd f24, 25 * portWORD_SIZE( sp ) - fsd f23, 24 * portWORD_SIZE( sp ) - fsd f22, 23 * portWORD_SIZE( sp ) - fsd f21, 22 * portWORD_SIZE( sp ) - fsd f20, 21 * portWORD_SIZE( sp ) - fsd f19, 20 * portWORD_SIZE( sp ) - fsd f18, 19 * portWORD_SIZE( sp ) - fsd f17, 18 * portWORD_SIZE( sp ) - fsd f16, 17 * portWORD_SIZE( sp ) - fsd f15, 16 * portWORD_SIZE( sp ) - fsd f14, 15 * portWORD_SIZE( sp ) - fsd f13, 14 * portWORD_SIZE( sp ) - fsd f12, 13 * portWORD_SIZE( sp ) - fsd f11, 12 * portWORD_SIZE( sp ) - fsd f10, 11 * portWORD_SIZE( sp ) - fsd f9, 10 * portWORD_SIZE( sp ) - fsd f8, 9 * portWORD_SIZE( sp ) - fsd f7, 8 * portWORD_SIZE( sp ) - fsd f6, 7 * portWORD_SIZE( sp ) - fsd f5, 6 * portWORD_SIZE( sp ) - fsd f4, 5 * portWORD_SIZE( sp ) - fsd f3, 4 * portWORD_SIZE( sp ) - fsd f2, 3 * portWORD_SIZE( sp ) - fsd f1, 2 * portWORD_SIZE( sp ) - fsd f0, 1 * portWORD_SIZE( sp ) -#elif __riscv_flen == 32 - fsw f31, 32 * portWORD_SIZE( sp ) - fsw f30, 31 * portWORD_SIZE( sp ) - fsw f29, 30 * portWORD_SIZE( sp ) - fsw f28, 29 * portWORD_SIZE( sp ) - fsw f27, 28 * portWORD_SIZE( sp ) - fsw f26, 27 * portWORD_SIZE( sp ) - fsw f25, 26 * portWORD_SIZE( sp ) - fsw f24, 25 * portWORD_SIZE( sp ) - fsw f23, 24 * portWORD_SIZE( sp ) - fsw f22, 23 * portWORD_SIZE( sp ) - fsw f21, 22 * portWORD_SIZE( sp ) - fsw f20, 21 * portWORD_SIZE( sp ) - fsw f19, 20 * portWORD_SIZE( sp ) - fsw f18, 19 * portWORD_SIZE( sp ) - fsw f17, 18 * portWORD_SIZE( sp ) - fsw f16, 17 * portWORD_SIZE( sp ) - fsw f15, 16 * portWORD_SIZE( sp ) - fsw f14, 15 * portWORD_SIZE( sp ) - fsw f13, 14 * portWORD_SIZE( sp ) - fsw f12, 13 * portWORD_SIZE( sp ) - fsw f11, 12 * portWORD_SIZE( sp ) - fsw f10, 11 * portWORD_SIZE( sp ) - fsw f9, 10 * portWORD_SIZE( sp ) - fsw f8, 9 * portWORD_SIZE( sp ) - fsw f7, 8 * portWORD_SIZE( sp ) - fsw f6, 7 * portWORD_SIZE( sp ) - fsw f5, 6 * portWORD_SIZE( sp ) - fsw f4, 5 * portWORD_SIZE( sp ) - fsw f3, 4 * portWORD_SIZE( sp ) - fsw f2, 3 * portWORD_SIZE( sp ) - fsw f1, 2 * portWORD_SIZE( sp ) - fsw f0, 1 * portWORD_SIZE( sp ) -#endif + + /* save fcsr */ + frcsr t0 + sw t0, 33 * portWORD_SIZE( sp ) + + /* save fpr */ + FS f31, 32 * portWORD_SIZE( sp ) + FS f30, 31 * portWORD_SIZE( sp ) + FS f29, 30 * portWORD_SIZE( sp ) + FS f28, 29 * portWORD_SIZE( sp ) + FS f27, 28 * portWORD_SIZE( sp ) + FS f26, 27 * portWORD_SIZE( sp ) + FS f25, 26 * portWORD_SIZE( sp ) + FS f24, 25 * portWORD_SIZE( sp ) + FS f23, 24 * portWORD_SIZE( sp ) + FS f22, 23 * portWORD_SIZE( sp ) + FS f21, 22 * portWORD_SIZE( sp ) + FS f20, 21 * portWORD_SIZE( sp ) + FS f19, 20 * portWORD_SIZE( sp ) + FS f18, 19 * portWORD_SIZE( sp ) + FS f17, 18 * portWORD_SIZE( sp ) + FS f16, 17 * portWORD_SIZE( sp ) + FS f15, 16 * portWORD_SIZE( sp ) + FS f14, 15 * portWORD_SIZE( sp ) + FS f13, 14 * portWORD_SIZE( sp ) + FS f12, 13 * portWORD_SIZE( sp ) + FS f11, 12 * portWORD_SIZE( sp ) + FS f10, 11 * portWORD_SIZE( sp ) + FS f9, 10 * portWORD_SIZE( sp ) + FS f8, 9 * portWORD_SIZE( sp ) + FS f7, 8 * portWORD_SIZE( sp ) + FS f6, 7 * portWORD_SIZE( sp ) + FS f5, 6 * portWORD_SIZE( sp ) + FS f4, 5 * portWORD_SIZE( sp ) + FS f3, 4 * portWORD_SIZE( sp ) + FS f2, 3 * portWORD_SIZE( sp ) + FS f1, 2 * portWORD_SIZE( sp ) + FS f0, 1 * portWORD_SIZE( sp ) .endm .macro portasmRESTORE_ADDITIONAL_REGISTERS /* load float registers */ -#if __riscv_flen == 64 - fld f31, 32 * portWORD_SIZE( sp ) - fld f30, 31 * portWORD_SIZE( sp ) - fld f29, 30 * portWORD_SIZE( sp ) - fld f28, 29 * portWORD_SIZE( sp ) - fld f27, 28 * portWORD_SIZE( sp ) - fld f26, 27 * portWORD_SIZE( sp ) - fld f25, 26 * portWORD_SIZE( sp ) - fld f24, 25 * portWORD_SIZE( sp ) - fld f23, 24 * portWORD_SIZE( sp ) - fld f22, 23 * portWORD_SIZE( sp ) - fld f21, 22 * portWORD_SIZE( sp ) - fld f20, 21 * portWORD_SIZE( sp ) - fld f19, 20 * portWORD_SIZE( sp ) - fld f18, 19 * portWORD_SIZE( sp ) - fld f17, 18 * portWORD_SIZE( sp ) - fld f16, 17 * portWORD_SIZE( sp ) - fld f15, 16 * portWORD_SIZE( sp ) - fld f14, 15 * portWORD_SIZE( sp ) - fld f13, 14 * portWORD_SIZE( sp ) - fld f12, 13 * portWORD_SIZE( sp ) - fld f11, 12 * portWORD_SIZE( sp ) - fld f10, 11 * portWORD_SIZE( sp ) - fld f9, 10 * portWORD_SIZE( sp ) - fld f8, 9 * portWORD_SIZE( sp ) - fld f7, 8 * portWORD_SIZE( sp ) - fld f6, 7 * portWORD_SIZE( sp ) - fld f5, 6 * portWORD_SIZE( sp ) - fld f4, 5 * portWORD_SIZE( sp ) - fld f3, 4 * portWORD_SIZE( sp ) - fld f2, 3 * portWORD_SIZE( sp ) - fld f1, 2 * portWORD_SIZE( sp ) - fld f0, 1 * portWORD_SIZE( sp ) -#elif __riscv_flen == 32 - flw f31, 32 * portWORD_SIZE( sp ) - flw f30, 31 * portWORD_SIZE( sp ) - flw f29, 30 * portWORD_SIZE( sp ) - flw f28, 29 * portWORD_SIZE( sp ) - flw f27, 28 * portWORD_SIZE( sp ) - flw f26, 27 * portWORD_SIZE( sp ) - flw f25, 26 * portWORD_SIZE( sp ) - flw f24, 25 * portWORD_SIZE( sp ) - flw f23, 24 * portWORD_SIZE( sp ) - flw f22, 23 * portWORD_SIZE( sp ) - flw f21, 22 * portWORD_SIZE( sp ) - flw f20, 21 * portWORD_SIZE( sp ) - flw f19, 20 * portWORD_SIZE( sp ) - flw f18, 19 * portWORD_SIZE( sp ) - flw f17, 18 * portWORD_SIZE( sp ) - flw f16, 17 * portWORD_SIZE( sp ) - flw f15, 16 * portWORD_SIZE( sp ) - flw f14, 15 * portWORD_SIZE( sp ) - flw f13, 14 * portWORD_SIZE( sp ) - flw f12, 13 * portWORD_SIZE( sp ) - flw f11, 12 * portWORD_SIZE( sp ) - flw f10, 11 * portWORD_SIZE( sp ) - flw f9, 10 * portWORD_SIZE( sp ) - flw f8, 9 * portWORD_SIZE( sp ) - flw f7, 8 * portWORD_SIZE( sp ) - flw f6, 7 * portWORD_SIZE( sp ) - flw f5, 6 * portWORD_SIZE( sp ) - flw f4, 5 * portWORD_SIZE( sp ) - flw f3, 4 * portWORD_SIZE( sp ) - flw f2, 3 * portWORD_SIZE( sp ) - flw f1, 2 * portWORD_SIZE( sp ) - flw f0, 1 * portWORD_SIZE( sp ) -#endif + /* load fcsr */ + lw t0, 33 * portWORD_SIZE( sp ) + fscsr t0 + + /* load fpr */ + FL f31, 32 * portWORD_SIZE( sp ) + FL f30, 31 * portWORD_SIZE( sp ) + FL f29, 30 * portWORD_SIZE( sp ) + FL f28, 29 * portWORD_SIZE( sp ) + FL f27, 28 * portWORD_SIZE( sp ) + FL f26, 27 * portWORD_SIZE( sp ) + FL f25, 26 * portWORD_SIZE( sp ) + FL f24, 25 * portWORD_SIZE( sp ) + FL f23, 24 * portWORD_SIZE( sp ) + FL f22, 23 * portWORD_SIZE( sp ) + FL f21, 22 * portWORD_SIZE( sp ) + FL f20, 21 * portWORD_SIZE( sp ) + FL f19, 20 * portWORD_SIZE( sp ) + FL f18, 19 * portWORD_SIZE( sp ) + FL f17, 18 * portWORD_SIZE( sp ) + FL f16, 17 * portWORD_SIZE( sp ) + FL f15, 16 * portWORD_SIZE( sp ) + FL f14, 15 * portWORD_SIZE( sp ) + FL f13, 14 * portWORD_SIZE( sp ) + FL f12, 13 * portWORD_SIZE( sp ) + FL f11, 12 * portWORD_SIZE( sp ) + FL f10, 11 * portWORD_SIZE( sp ) + FL f9, 10 * portWORD_SIZE( sp ) + FL f8, 9 * portWORD_SIZE( sp ) + FL f7, 8 * portWORD_SIZE( sp ) + FL f6, 7 * portWORD_SIZE( sp ) + FL f5, 6 * portWORD_SIZE( sp ) + FL f4, 5 * portWORD_SIZE( sp ) + FL f3, 4 * portWORD_SIZE( sp ) + FL f2, 3 * portWORD_SIZE( sp ) + FL f1, 2 * portWORD_SIZE( sp ) + FL f0, 1 * portWORD_SIZE( sp ) + + /* free stack */ addi sp, sp, (portasmADDITIONAL_CONTEXT_SIZE * portWORD_SIZE) .endm