On 2/8/23 20:24, Deepak Gupta wrote:
+ if (cpu->cfg.ext_cfi) { + /* + * For Forward CFI, only the expectation of a lpcll at + * the start of the block is tracked (which can only happen + * when FCFI is enabled for the current processor mode). A jump + * or call at the end of the previous TB will have updated + * env->elp to indicate the expectation. + */ + flags = FIELD_DP32(flags, TB_FLAGS, FCFI_LP_EXPECTED, + env->elp != NO_LP_EXPECTED);
You should also check cpu_fcfien here. We can completely ignore elp if the feature is disabled. Which means that the tb flag will be set if and only if we require a landing pad.
static void riscv_tr_tb_start(DisasContextBase *db, CPUState *cpu) { + DisasContext *ctx = container_of(db, DisasContext, base); + + if (ctx->fcfi_lp_expected) { + /* + * Since we can't look ahead to confirm that the first + * instruction is a legal landing pad instruction, emit + * compare-and-branch sequence that will be fixed-up in + * riscv_tr_tb_stop() to either statically hit or skip an + * illegal instruction exception depending on whether the + * flag was lowered by translation of a CJLP or JLP as + * the first instruction in the block.
You can "look ahead" by deferring this to riscv_tr_translate_insn. Compare target/arm/translate-a64.c, btype_destination_ok and uses thereof. Note that risc-v does not have the same "guarded page" bit that aa64 does. r~