Merge pull request #80 from Fishwaldo/develop

Add FENCE.TSO Emulation to opensbi
This commit is contained in:
Carbon
2024-04-15 03:37:25 +00:00
committed by GitHub
2 changed files with 17 additions and 1 deletions

View File

@ -625,6 +625,9 @@
#define INSN_MASK_WFI 0xffffff00 #define INSN_MASK_WFI 0xffffff00
#define INSN_MATCH_WFI 0x10500000 #define INSN_MATCH_WFI 0x10500000
#define INSN_MASK_FENCE_TSO 0xffffffff
#define INSN_MATCH_FENCE_TSO 0x8330000f
#define INSN_16BIT_MASK 0x3 #define INSN_16BIT_MASK 0x3
#define INSN_32BIT_MASK 0x1c #define INSN_32BIT_MASK 0x1c

View File

@ -8,6 +8,7 @@
*/ */
#include <sbi/riscv_asm.h> #include <sbi/riscv_asm.h>
#include <sbi/riscv_barrier.h>
#include <sbi/riscv_encoding.h> #include <sbi/riscv_encoding.h>
#include <sbi/sbi_bitops.h> #include <sbi/sbi_bitops.h>
#include <sbi/sbi_emulate_csr.h> #include <sbi/sbi_emulate_csr.h>
@ -31,6 +32,18 @@ static int truly_illegal_insn(ulong insn, struct sbi_trap_regs *regs)
return sbi_trap_redirect(regs, &trap); return sbi_trap_redirect(regs, &trap);
} }
static int misc_mem_opcode_insn(ulong insn, struct sbi_trap_regs *regs)
{
/* Errata workaround: emulate `fence.tso` as `fence rw, rw`. */
if ((insn & INSN_MASK_FENCE_TSO) == INSN_MATCH_FENCE_TSO) {
smp_mb();
regs->mepc += 4;
return 0;
}
return truly_illegal_insn(insn, regs);
}
static int system_opcode_insn(ulong insn, struct sbi_trap_regs *regs) static int system_opcode_insn(ulong insn, struct sbi_trap_regs *regs)
{ {
int do_write, rs1_num = (insn >> 15) & 0x1f; int do_write, rs1_num = (insn >> 15) & 0x1f;
@ -83,7 +96,7 @@ static illegal_insn_func illegal_insn_table[32] = {
truly_illegal_insn, /* 0 */ truly_illegal_insn, /* 0 */
truly_illegal_insn, /* 1 */ truly_illegal_insn, /* 1 */
truly_illegal_insn, /* 2 */ truly_illegal_insn, /* 2 */
truly_illegal_insn, /* 3 */ misc_mem_opcode_insn, /* 3 */
truly_illegal_insn, /* 4 */ truly_illegal_insn, /* 4 */
truly_illegal_insn, /* 5 */ truly_illegal_insn, /* 5 */
truly_illegal_insn, /* 6 */ truly_illegal_insn, /* 6 */