8347343: RISC-V: Unchecked zicntr csr reads
Reviewed-by: fyang, mli
This commit is contained in:
parent
ca8ba5c890
commit
1f0efc0091
@ -1333,22 +1333,11 @@ void MacroAssembler::cmov_gtu(Register cmp1, Register cmp2, Register dst, Regist
|
|||||||
|
|
||||||
#undef INSN
|
#undef INSN
|
||||||
|
|
||||||
|
|
||||||
#define INSN(NAME, CSR) \
|
|
||||||
void MacroAssembler::NAME(Register Rd) { \
|
|
||||||
csrr(Rd, CSR); \
|
|
||||||
}
|
|
||||||
|
|
||||||
INSN(rdinstret, CSR_INSTRET);
|
|
||||||
INSN(rdcycle, CSR_CYCLE);
|
|
||||||
INSN(rdtime, CSR_TIME);
|
|
||||||
INSN(frcsr, CSR_FCSR);
|
|
||||||
INSN(frrm, CSR_FRM);
|
|
||||||
INSN(frflags, CSR_FFLAGS);
|
|
||||||
|
|
||||||
#undef INSN
|
|
||||||
|
|
||||||
void MacroAssembler::csrr(Register Rd, unsigned csr) {
|
void MacroAssembler::csrr(Register Rd, unsigned csr) {
|
||||||
|
// These three are specified in zicntr and are unused.
|
||||||
|
// Before adding use-cases add the appropriate hwprobe and flag.
|
||||||
|
assert(csr != CSR_INSTRET && csr != CSR_CYCLE && csr != CSR_TIME,
|
||||||
|
"Not intended for use without enabling zicntr.");
|
||||||
csrrs(Rd, csr, x0);
|
csrrs(Rd, csr, x0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -626,9 +626,6 @@ class MacroAssembler: public Assembler {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Control and status pseudo instructions
|
// Control and status pseudo instructions
|
||||||
void rdinstret(Register Rd); // read instruction-retired counter
|
|
||||||
void rdcycle(Register Rd); // read cycle counter
|
|
||||||
void rdtime(Register Rd); // read time
|
|
||||||
void csrr(Register Rd, unsigned csr); // read csr
|
void csrr(Register Rd, unsigned csr); // read csr
|
||||||
void csrw(unsigned csr, Register Rs); // write csr
|
void csrw(unsigned csr, Register Rs); // write csr
|
||||||
void csrs(unsigned csr, Register Rs); // set bits in csr
|
void csrs(unsigned csr, Register Rs); // set bits in csr
|
||||||
@ -636,19 +633,23 @@ class MacroAssembler: public Assembler {
|
|||||||
void csrwi(unsigned csr, unsigned imm);
|
void csrwi(unsigned csr, unsigned imm);
|
||||||
void csrsi(unsigned csr, unsigned imm);
|
void csrsi(unsigned csr, unsigned imm);
|
||||||
void csrci(unsigned csr, unsigned imm);
|
void csrci(unsigned csr, unsigned imm);
|
||||||
void frcsr(Register Rd); // read float-point csr
|
void frcsr(Register Rd) { csrr(Rd, CSR_FCSR); }; // read float-point csr
|
||||||
void fscsr(Register Rd, Register Rs); // swap float-point csr
|
void fscsr(Register Rd, Register Rs); // swap float-point csr
|
||||||
void fscsr(Register Rs); // write float-point csr
|
void fscsr(Register Rs); // write float-point csr
|
||||||
void frrm(Register Rd); // read float-point rounding mode
|
void frrm(Register Rd) { csrr(Rd, CSR_FRM); }; // read float-point rounding mode
|
||||||
void fsrm(Register Rd, Register Rs); // swap float-point rounding mode
|
void fsrm(Register Rd, Register Rs); // swap float-point rounding mode
|
||||||
void fsrm(Register Rs); // write float-point rounding mode
|
void fsrm(Register Rs); // write float-point rounding mode
|
||||||
void fsrmi(Register Rd, unsigned imm);
|
void fsrmi(Register Rd, unsigned imm);
|
||||||
void fsrmi(unsigned imm);
|
void fsrmi(unsigned imm);
|
||||||
void frflags(Register Rd); // read float-point exception flags
|
void frflags(Register Rd) { csrr(Rd, CSR_FFLAGS); }; // read float-point exception flags
|
||||||
void fsflags(Register Rd, Register Rs); // swap float-point exception flags
|
void fsflags(Register Rd, Register Rs); // swap float-point exception flags
|
||||||
void fsflags(Register Rs); // write float-point exception flags
|
void fsflags(Register Rs); // write float-point exception flags
|
||||||
void fsflagsi(Register Rd, unsigned imm);
|
void fsflagsi(Register Rd, unsigned imm);
|
||||||
void fsflagsi(unsigned imm);
|
void fsflagsi(unsigned imm);
|
||||||
|
// Requires Zicntr
|
||||||
|
void rdinstret(Register Rd) { csrr(Rd, CSR_INSTRET); }; // read instruction-retired counter
|
||||||
|
void rdcycle(Register Rd) { csrr(Rd, CSR_CYCLE); }; // read cycle counter
|
||||||
|
void rdtime(Register Rd) { csrr(Rd, CSR_TIME); }; // read time
|
||||||
|
|
||||||
// Restore cpu control state after JNI call
|
// Restore cpu control state after JNI call
|
||||||
void restore_cpu_control_state_after_jni(Register tmp);
|
void restore_cpu_control_state_after_jni(Register tmp);
|
||||||
|
@ -158,6 +158,7 @@ class VM_Version : public Abstract_VM_Version {
|
|||||||
decl(ext_Zcb , "Zcb" , RV_NO_FLAG_BIT, true , UPDATE_DEFAULT(UseZcb)) \
|
decl(ext_Zcb , "Zcb" , RV_NO_FLAG_BIT, true , UPDATE_DEFAULT(UseZcb)) \
|
||||||
decl(ext_Zfh , "Zfh" , RV_NO_FLAG_BIT, true , UPDATE_DEFAULT(UseZfh)) \
|
decl(ext_Zfh , "Zfh" , RV_NO_FLAG_BIT, true , UPDATE_DEFAULT(UseZfh)) \
|
||||||
decl(ext_Zicsr , "Zicsr" , RV_NO_FLAG_BIT, true , NO_UPDATE_DEFAULT) \
|
decl(ext_Zicsr , "Zicsr" , RV_NO_FLAG_BIT, true , NO_UPDATE_DEFAULT) \
|
||||||
|
decl(ext_Zicntr , "Zicntr" , RV_NO_FLAG_BIT, true , NO_UPDATE_DEFAULT) \
|
||||||
decl(ext_Zifencei , "Zifencei" , RV_NO_FLAG_BIT, true , NO_UPDATE_DEFAULT) \
|
decl(ext_Zifencei , "Zifencei" , RV_NO_FLAG_BIT, true , NO_UPDATE_DEFAULT) \
|
||||||
decl(ext_Zic64b , "Zic64b" , RV_NO_FLAG_BIT, true , UPDATE_DEFAULT(UseZic64b)) \
|
decl(ext_Zic64b , "Zic64b" , RV_NO_FLAG_BIT, true , UPDATE_DEFAULT(UseZic64b)) \
|
||||||
decl(ext_Ztso , "Ztso" , RV_NO_FLAG_BIT, true , UPDATE_DEFAULT(UseZtso)) \
|
decl(ext_Ztso , "Ztso" , RV_NO_FLAG_BIT, true , UPDATE_DEFAULT(UseZtso)) \
|
||||||
|
Loading…
x
Reference in New Issue
Block a user