udb 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.data/cfgs/MC100-32.yaml +23 -0
- data/.data/cfgs/_.yaml +8 -0
- data/.data/cfgs/example_rv64_with_overlay.yaml +618 -0
- data/.data/cfgs/mc100-32-full-example.yaml +91 -0
- data/.data/cfgs/memmap.json +76 -0
- data/.data/cfgs/prm_demo_rv32.yaml +28 -0
- data/.data/cfgs/profile/RVA20S64.yaml +73 -0
- data/.data/cfgs/profile/RVA20U64.yaml +53 -0
- data/.data/cfgs/profile/RVA22S64.yaml +123 -0
- data/.data/cfgs/profile/RVA22U64.yaml +85 -0
- data/.data/cfgs/profile/RVA23M64.yaml +161 -0
- data/.data/cfgs/profile/RVA23S64.yaml +151 -0
- data/.data/cfgs/profile/RVA23U64.yaml +131 -0
- data/.data/cfgs/profile/RVB23M64.yaml +151 -0
- data/.data/cfgs/profile/RVB23S64.yaml +147 -0
- data/.data/cfgs/profile/RVB23U64.yaml +141 -0
- data/.data/cfgs/profile/RVI20U32.yaml +41 -0
- data/.data/cfgs/profile/RVI20U64.yaml +41 -0
- data/.data/cfgs/qc_iu.yaml +153 -0
- data/.data/cfgs/regress.yaml +9 -0
- data/.data/cfgs/rv32-riscv-tests.yaml +208 -0
- data/.data/cfgs/rv32-vector.yaml +246 -0
- data/.data/cfgs/rv32.yaml +15 -0
- data/.data/cfgs/rv64-riscv-tests.yaml +202 -0
- data/.data/cfgs/rv64-vector.yaml +245 -0
- data/.data/cfgs/rv64.yaml +14 -0
- data/.data/spec/custom/isa/example/csr/marchid.yaml +8 -0
- data/.data/spec/custom/isa/example/csr/mcustom0.yaml +18 -0
- data/.data/spec/custom/isa/example/ext/Xcustom.yaml +15 -0
- data/.data/spec/custom/isa/qc_iu/csr/Xqci/gen_mcliciX.rb +188 -0
- data/.data/spec/custom/isa/qc_iu/csr/Xqci/qc.mcause.yaml +85 -0
- data/.data/spec/custom/isa/qc_iu/csr/Xqci/qc.mclicie0.yaml +181 -0
- data/.data/spec/custom/isa/qc_iu/csr/Xqci/qc.mclicie1.yaml +181 -0
- data/.data/spec/custom/isa/qc_iu/csr/Xqci/qc.mclicie2.yaml +181 -0
- data/.data/spec/custom/isa/qc_iu/csr/Xqci/qc.mclicie3.yaml +181 -0
- data/.data/spec/custom/isa/qc_iu/csr/Xqci/qc.mclicie4.yaml +181 -0
- data/.data/spec/custom/isa/qc_iu/csr/Xqci/qc.mclicie5.yaml +181 -0
- data/.data/spec/custom/isa/qc_iu/csr/Xqci/qc.mclicie6.yaml +181 -0
- data/.data/spec/custom/isa/qc_iu/csr/Xqci/qc.mclicie7.yaml +181 -0
- data/.data/spec/custom/isa/qc_iu/csr/Xqci/qc.mclicilvl00.yaml +62 -0
- data/.data/spec/custom/isa/qc_iu/csr/Xqci/qc.mclicilvl01.yaml +62 -0
- data/.data/spec/custom/isa/qc_iu/csr/Xqci/qc.mclicilvl02.yaml +62 -0
- data/.data/spec/custom/isa/qc_iu/csr/Xqci/qc.mclicilvl03.yaml +62 -0
- data/.data/spec/custom/isa/qc_iu/csr/Xqci/qc.mclicilvl04.yaml +62 -0
- data/.data/spec/custom/isa/qc_iu/csr/Xqci/qc.mclicilvl05.yaml +62 -0
- data/.data/spec/custom/isa/qc_iu/csr/Xqci/qc.mclicilvl06.yaml +62 -0
- data/.data/spec/custom/isa/qc_iu/csr/Xqci/qc.mclicilvl07.yaml +62 -0
- data/.data/spec/custom/isa/qc_iu/csr/Xqci/qc.mclicilvl08.yaml +62 -0
- data/.data/spec/custom/isa/qc_iu/csr/Xqci/qc.mclicilvl09.yaml +62 -0
- data/.data/spec/custom/isa/qc_iu/csr/Xqci/qc.mclicilvl10.yaml +62 -0
- data/.data/spec/custom/isa/qc_iu/csr/Xqci/qc.mclicilvl11.yaml +62 -0
- data/.data/spec/custom/isa/qc_iu/csr/Xqci/qc.mclicilvl12.yaml +62 -0
- data/.data/spec/custom/isa/qc_iu/csr/Xqci/qc.mclicilvl13.yaml +62 -0
- data/.data/spec/custom/isa/qc_iu/csr/Xqci/qc.mclicilvl14.yaml +62 -0
- data/.data/spec/custom/isa/qc_iu/csr/Xqci/qc.mclicilvl15.yaml +62 -0
- data/.data/spec/custom/isa/qc_iu/csr/Xqci/qc.mclicilvl16.yaml +62 -0
- data/.data/spec/custom/isa/qc_iu/csr/Xqci/qc.mclicilvl17.yaml +62 -0
- data/.data/spec/custom/isa/qc_iu/csr/Xqci/qc.mclicilvl18.yaml +62 -0
- data/.data/spec/custom/isa/qc_iu/csr/Xqci/qc.mclicilvl19.yaml +62 -0
- data/.data/spec/custom/isa/qc_iu/csr/Xqci/qc.mclicilvl20.yaml +62 -0
- data/.data/spec/custom/isa/qc_iu/csr/Xqci/qc.mclicilvl21.yaml +62 -0
- data/.data/spec/custom/isa/qc_iu/csr/Xqci/qc.mclicilvl22.yaml +62 -0
- data/.data/spec/custom/isa/qc_iu/csr/Xqci/qc.mclicilvl23.yaml +62 -0
- data/.data/spec/custom/isa/qc_iu/csr/Xqci/qc.mclicilvl24.yaml +62 -0
- data/.data/spec/custom/isa/qc_iu/csr/Xqci/qc.mclicilvl25.yaml +62 -0
- data/.data/spec/custom/isa/qc_iu/csr/Xqci/qc.mclicilvl26.yaml +62 -0
- data/.data/spec/custom/isa/qc_iu/csr/Xqci/qc.mclicilvl27.yaml +62 -0
- data/.data/spec/custom/isa/qc_iu/csr/Xqci/qc.mclicilvl28.yaml +62 -0
- data/.data/spec/custom/isa/qc_iu/csr/Xqci/qc.mclicilvl29.yaml +62 -0
- data/.data/spec/custom/isa/qc_iu/csr/Xqci/qc.mclicilvl30.yaml +62 -0
- data/.data/spec/custom/isa/qc_iu/csr/Xqci/qc.mclicilvl31.yaml +62 -0
- data/.data/spec/custom/isa/qc_iu/csr/Xqci/qc.mclicip0.yaml +181 -0
- data/.data/spec/custom/isa/qc_iu/csr/Xqci/qc.mclicip1.yaml +181 -0
- data/.data/spec/custom/isa/qc_iu/csr/Xqci/qc.mclicip2.yaml +181 -0
- data/.data/spec/custom/isa/qc_iu/csr/Xqci/qc.mclicip3.yaml +181 -0
- data/.data/spec/custom/isa/qc_iu/csr/Xqci/qc.mclicip4.yaml +181 -0
- data/.data/spec/custom/isa/qc_iu/csr/Xqci/qc.mclicip5.yaml +181 -0
- data/.data/spec/custom/isa/qc_iu/csr/Xqci/qc.mclicip6.yaml +181 -0
- data/.data/spec/custom/isa/qc_iu/csr/Xqci/qc.mclicip7.yaml +181 -0
- data/.data/spec/custom/isa/qc_iu/csr/Xqci/qc.mmcr.yaml +42 -0
- data/.data/spec/custom/isa/qc_iu/csr/Xqci/qc.mntvec.yaml +28 -0
- data/.data/spec/custom/isa/qc_iu/csr/Xqci/qc.mstkbottomaddr.yaml +33 -0
- data/.data/spec/custom/isa/qc_iu/csr/Xqci/qc.mstktopaddr.yaml +33 -0
- data/.data/spec/custom/isa/qc_iu/csr/Xqci/qc.mthreadptr.yaml +27 -0
- data/.data/spec/custom/isa/qc_iu/csr/Xqci/qc.mwpendaddr0.yaml +27 -0
- data/.data/spec/custom/isa/qc_iu/csr/Xqci/qc.mwpendaddr1.yaml +27 -0
- data/.data/spec/custom/isa/qc_iu/csr/Xqci/qc.mwpendaddr2.yaml +27 -0
- data/.data/spec/custom/isa/qc_iu/csr/Xqci/qc.mwpendaddr3.yaml +27 -0
- data/.data/spec/custom/isa/qc_iu/csr/Xqci/qc.mwpstartaddr0.yaml +27 -0
- data/.data/spec/custom/isa/qc_iu/csr/Xqci/qc.mwpstartaddr1.yaml +27 -0
- data/.data/spec/custom/isa/qc_iu/csr/Xqci/qc.mwpstartaddr2.yaml +27 -0
- data/.data/spec/custom/isa/qc_iu/csr/Xqci/qc.mwpstartaddr3.yaml +27 -0
- data/.data/spec/custom/isa/qc_iu/exception_code/ExecWatchpoint.yaml +13 -0
- data/.data/spec/custom/isa/qc_iu/exception_code/IllegalStackPointer.yaml +13 -0
- data/.data/spec/custom/isa/qc_iu/exception_code/ReadWatchpoint.yaml +13 -0
- data/.data/spec/custom/isa/qc_iu/exception_code/SpOutOfRange.yaml +13 -0
- data/.data/spec/custom/isa/qc_iu/exception_code/WriteWatchpoint.yaml +13 -0
- data/.data/spec/custom/isa/qc_iu/ext/Xqccmp.yaml +160 -0
- data/.data/spec/custom/isa/qc_iu/ext/Xqci.yaml +778 -0
- data/.data/spec/custom/isa/qc_iu/ext/Xqcia.yaml +111 -0
- data/.data/spec/custom/isa/qc_iu/ext/Xqciac.yaml +66 -0
- data/.data/spec/custom/isa/qc_iu/ext/Xqcibi.yaml +50 -0
- data/.data/spec/custom/isa/qc_iu/ext/Xqcibm.yaml +146 -0
- data/.data/spec/custom/isa/qc_iu/ext/Xqcicli.yaml +57 -0
- data/.data/spec/custom/isa/qc_iu/ext/Xqcicm.yaml +50 -0
- data/.data/spec/custom/isa/qc_iu/ext/Xqcics.yaml +44 -0
- data/.data/spec/custom/isa/qc_iu/ext/Xqcicsr.yaml +68 -0
- data/.data/spec/custom/isa/qc_iu/ext/Xqciint.yaml +173 -0
- data/.data/spec/custom/isa/qc_iu/ext/Xqciio.yaml +32 -0
- data/.data/spec/custom/isa/qc_iu/ext/Xqcilb.yaml +46 -0
- data/.data/spec/custom/isa/qc_iu/ext/Xqcili.yaml +49 -0
- data/.data/spec/custom/isa/qc_iu/ext/Xqcilia.yaml +47 -0
- data/.data/spec/custom/isa/qc_iu/ext/Xqcilo.yaml +59 -0
- data/.data/spec/custom/isa/qc_iu/ext/Xqcilsm.yaml +94 -0
- data/.data/spec/custom/isa/qc_iu/ext/Xqcisim.yaml +48 -0
- data/.data/spec/custom/isa/qc_iu/ext/Xqcisls.yaml +44 -0
- data/.data/spec/custom/isa/qc_iu/ext/Xqcisync.yaml +62 -0
- data/.data/spec/custom/isa/qc_iu/inst/C/c.slli.yaml +6 -0
- data/.data/spec/custom/isa/qc_iu/inst/C/c.srai.yaml +5 -0
- data/.data/spec/custom/isa/qc_iu/inst/C/c.srli.yaml +5 -0
- data/.data/spec/custom/isa/qc_iu/inst/I/slti.yaml +15 -0
- data/.data/spec/custom/isa/qc_iu/inst/I/sltiu.yaml +8 -0
- data/.data/spec/custom/isa/qc_iu/inst/Xqccmp/qc.cm.mva01s.yaml +36 -0
- data/.data/spec/custom/isa/qc_iu/inst/Xqccmp/qc.cm.mvsa01.yaml +38 -0
- data/.data/spec/custom/isa/qc_iu/inst/Xqccmp/qc.cm.pop.yaml +87 -0
- data/.data/spec/custom/isa/qc_iu/inst/Xqccmp/qc.cm.popret.yaml +88 -0
- data/.data/spec/custom/isa/qc_iu/inst/Xqccmp/qc.cm.popretz.yaml +88 -0
- data/.data/spec/custom/isa/qc_iu/inst/Xqccmp/qc.cm.push.yaml +87 -0
- data/.data/spec/custom/isa/qc_iu/inst/Xqccmp/qc.cm.pushfp.yaml +89 -0
- data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.addsat.yaml +51 -0
- data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.addusat.yaml +44 -0
- data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.beqi.yaml +40 -0
- data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.bgei.yaml +40 -0
- data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.bgeui.yaml +40 -0
- data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.blti.yaml +40 -0
- data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.bltui.yaml +40 -0
- data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.bnei.yaml +40 -0
- data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.brev32.yaml +41 -0
- data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.c.bexti.yaml +36 -0
- data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.c.bseti.yaml +36 -0
- data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.c.clrint.yaml +36 -0
- data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.c.delay.yaml +31 -0
- data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.c.di.yaml +30 -0
- data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.c.dir.yaml +36 -0
- data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.c.ei.yaml +30 -0
- data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.c.eir.yaml +35 -0
- data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.c.extu.yaml +36 -0
- data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.c.mienter.nest.yaml +61 -0
- data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.c.mienter.yaml +59 -0
- data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.c.mileaveret.yaml +106 -0
- data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.c.mnret.yaml +50 -0
- data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.c.mret.yaml +53 -0
- data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.c.muliadd.yaml +37 -0
- data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.c.mveqz.yaml +35 -0
- data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.c.ptrace.yaml +31 -0
- data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.c.setint.yaml +36 -0
- data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.c.sync.yaml +46 -0
- data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.c.syncr.yaml +46 -0
- data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.c.syncwf.yaml +46 -0
- data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.c.syncwl.yaml +46 -0
- data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.clo.yaml +38 -0
- data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.clrinti.yaml +35 -0
- data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.compress2.yaml +37 -0
- data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.compress3.yaml +37 -0
- data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.csrrwr.yaml +52 -0
- data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.csrrwri.yaml +48 -0
- data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.cto.yaml +38 -0
- data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.e.addai.yaml +33 -0
- data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.e.addi.yaml +37 -0
- data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.e.andai.yaml +33 -0
- data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.e.andi.yaml +37 -0
- data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.e.beqi.yaml +40 -0
- data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.e.bgei.yaml +40 -0
- data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.e.bgeui.yaml +40 -0
- data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.e.blti.yaml +40 -0
- data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.e.bltui.yaml +40 -0
- data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.e.bnei.yaml +40 -0
- data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.e.j.yaml +32 -0
- data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.e.jal.yaml +35 -0
- data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.e.lb.yaml +37 -0
- data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.e.lbu.yaml +37 -0
- data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.e.lh.yaml +37 -0
- data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.e.lhu.yaml +37 -0
- data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.e.li.yaml +33 -0
- data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.e.lw.yaml +37 -0
- data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.e.orai.yaml +33 -0
- data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.e.ori.yaml +37 -0
- data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.e.sb.yaml +36 -0
- data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.e.sh.yaml +36 -0
- data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.e.sw.yaml +36 -0
- data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.e.xorai.yaml +33 -0
- data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.e.xori.yaml +37 -0
- data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.expand2.yaml +39 -0
- data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.expand3.yaml +39 -0
- data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.ext.yaml +42 -0
- data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.extd.yaml +42 -0
- data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.extdpr.yaml +49 -0
- data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.extdprh.yaml +49 -0
- data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.extdr.yaml +49 -0
- data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.extdu.yaml +42 -0
- data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.extdupr.yaml +49 -0
- data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.extduprh.yaml +49 -0
- data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.extdur.yaml +49 -0
- data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.extu.yaml +41 -0
- data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.insb.yaml +42 -0
- data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.insbh.yaml +51 -0
- data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.insbhr.yaml +53 -0
- data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.insbi.yaml +43 -0
- data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.insbpr.yaml +47 -0
- data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.insbprh.yaml +47 -0
- data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.insbr.yaml +47 -0
- data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.insbri.yaml +48 -0
- data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.inw.yaml +38 -0
- data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.li.yaml +33 -0
- data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.lieq.yaml +41 -0
- data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.lieqi.yaml +40 -0
- data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.lige.yaml +41 -0
- data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.ligei.yaml +40 -0
- data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.ligeu.yaml +41 -0
- data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.ligeui.yaml +40 -0
- data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.lilt.yaml +41 -0
- data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.lilti.yaml +40 -0
- data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.liltu.yaml +41 -0
- data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.liltui.yaml +40 -0
- data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.line.yaml +41 -0
- data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.linei.yaml +40 -0
- data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.lrb.yaml +40 -0
- data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.lrbu.yaml +39 -0
- data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.lrh.yaml +40 -0
- data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.lrhu.yaml +39 -0
- data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.lrw.yaml +39 -0
- data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.lwm.yaml +46 -0
- data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.lwmi.yaml +45 -0
- data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.muliadd.yaml +37 -0
- data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.mveq.yaml +42 -0
- data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.mveqi.yaml +41 -0
- data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.mvge.yaml +42 -0
- data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.mvgei.yaml +41 -0
- data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.mvgeu.yaml +42 -0
- data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.mvgeui.yaml +41 -0
- data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.mvlt.yaml +42 -0
- data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.mvlti.yaml +41 -0
- data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.mvltu.yaml +42 -0
- data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.mvltui.yaml +41 -0
- data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.mvne.yaml +42 -0
- data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.mvnei.yaml +41 -0
- data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.norm.yaml +41 -0
- data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.normeu.yaml +40 -0
- data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.normu.yaml +40 -0
- data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.outw.yaml +38 -0
- data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.pcoredump.yaml +32 -0
- data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.pexit.yaml +33 -0
- data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.ppreg.yaml +33 -0
- data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.ppregs.yaml +31 -0
- data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.pputc.yaml +33 -0
- data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.pputci.yaml +33 -0
- data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.pputs.yaml +34 -0
- data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.psyscall.yaml +34 -0
- data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.psyscalli.yaml +34 -0
- data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.selecteqi.yaml +44 -0
- data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.selectieq.yaml +44 -0
- data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.selectieqi.yaml +43 -0
- data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.selectiieq.yaml +43 -0
- data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.selectiine.yaml +43 -0
- data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.selectine.yaml +44 -0
- data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.selectinei.yaml +43 -0
- data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.selectnei.yaml +44 -0
- data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.setinti.yaml +35 -0
- data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.setwm.yaml +45 -0
- data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.setwmi.yaml +44 -0
- data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.shladd.yaml +43 -0
- data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.shlsat.yaml +48 -0
- data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.shlusat.yaml +45 -0
- data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.srb.yaml +39 -0
- data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.srh.yaml +39 -0
- data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.srw.yaml +39 -0
- data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.subsat.yaml +53 -0
- data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.subusat.yaml +37 -0
- data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.swm.yaml +46 -0
- data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.swmi.yaml +45 -0
- data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.sync.yaml +34 -0
- data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.syncr.yaml +34 -0
- data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.syncwf.yaml +34 -0
- data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.syncwl.yaml +34 -0
- data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.wrap.yaml +43 -0
- data/.data/spec/custom/isa/qc_iu/inst/Xqci/qc.wrapi.yaml +47 -0
- data/.data/spec/custom/isa/qc_iu/isa/globals.isa +83 -0
- data/.data/spec/custom/isa/regress/manual_version/isa/regress/isa_regress.yaml +222 -0
- data/.data/spec/schemas/README.adoc +87 -0
- data/.data/spec/schemas/config_schema.json +198 -0
- data/.data/spec/schemas/csr_schema.json +319 -0
- data/.data/spec/schemas/exception_code_schema.json +33 -0
- data/.data/spec/schemas/ext_schema.json +168 -0
- data/.data/spec/schemas/inst_opcode_schema.json +37 -0
- data/.data/spec/schemas/inst_schema.json +503 -0
- data/.data/spec/schemas/inst_subtype_schema.json +190 -0
- data/.data/spec/schemas/inst_type_schema.json +69 -0
- data/.data/spec/schemas/inst_var_schema.json +93 -0
- data/.data/spec/schemas/inst_var_type_schema.json +45 -0
- data/.data/spec/schemas/inst_variable_metadatas.json +10 -0
- data/.data/spec/schemas/interrupt_code_schema.json +33 -0
- data/.data/spec/schemas/json-schema-draft-07.json +242 -0
- data/.data/spec/schemas/manual_schema.json +44 -0
- data/.data/spec/schemas/manual_version_schema.json +129 -0
- data/.data/spec/schemas/mmr_schema.json +74 -0
- data/.data/spec/schemas/non_isa_schema.json +102 -0
- data/.data/spec/schemas/param_schema.json +48 -0
- data/.data/spec/schemas/prm_schema.json +203 -0
- data/.data/spec/schemas/proc_cert_class_schema.json +35 -0
- data/.data/spec/schemas/proc_cert_model_schema.json +336 -0
- data/.data/spec/schemas/profile_family_schema.json +54 -0
- data/.data/spec/schemas/profile_release_schema.json +22 -0
- data/.data/spec/schemas/profile_schema.json +139 -0
- data/.data/spec/schemas/register_file_schema.json +123 -0
- data/.data/spec/schemas/schema_defs.json +905 -0
- data/.data/spec/std/isa/README.adoc +295 -0
- data/.data/spec/std/isa/csr/F/fcsr.yaml +190 -0
- data/.data/spec/std/isa/csr/F/fflags.yaml +95 -0
- data/.data/spec/std/isa/csr/F/frm.yaml +57 -0
- data/.data/spec/std/isa/csr/H/hcounteren.layout +178 -0
- data/.data/spec/std/isa/csr/H/hcounteren.yaml +1215 -0
- data/.data/spec/std/isa/csr/H/henvcfg.yaml +307 -0
- data/.data/spec/std/isa/csr/H/henvcfgh.yaml +120 -0
- data/.data/spec/std/isa/csr/H/hgatp.yaml +242 -0
- data/.data/spec/std/isa/csr/H/htimedelta.yaml +32 -0
- data/.data/spec/std/isa/csr/H/htimedeltah.yaml +32 -0
- data/.data/spec/std/isa/csr/H/htinst.yaml +50 -0
- data/.data/spec/std/isa/csr/H/htval.yaml +42 -0
- data/.data/spec/std/isa/csr/H/mtinst.yaml +50 -0
- data/.data/spec/std/isa/csr/H/mtval2.yaml +43 -0
- data/.data/spec/std/isa/csr/H/vsatp.yaml +149 -0
- data/.data/spec/std/isa/csr/I/mcounteren.layout +192 -0
- data/.data/spec/std/isa/csr/I/mcounteren.yaml +1061 -0
- data/.data/spec/std/isa/csr/I/pmpaddr0.yaml +79 -0
- data/.data/spec/std/isa/csr/I/pmpaddr1.yaml +79 -0
- data/.data/spec/std/isa/csr/I/pmpaddr10.yaml +79 -0
- data/.data/spec/std/isa/csr/I/pmpaddr11.yaml +79 -0
- data/.data/spec/std/isa/csr/I/pmpaddr12.yaml +79 -0
- data/.data/spec/std/isa/csr/I/pmpaddr13.yaml +79 -0
- data/.data/spec/std/isa/csr/I/pmpaddr14.yaml +79 -0
- data/.data/spec/std/isa/csr/I/pmpaddr15.yaml +79 -0
- data/.data/spec/std/isa/csr/I/pmpaddr16.yaml +79 -0
- data/.data/spec/std/isa/csr/I/pmpaddr17.yaml +79 -0
- data/.data/spec/std/isa/csr/I/pmpaddr18.yaml +79 -0
- data/.data/spec/std/isa/csr/I/pmpaddr19.yaml +79 -0
- data/.data/spec/std/isa/csr/I/pmpaddr2.yaml +79 -0
- data/.data/spec/std/isa/csr/I/pmpaddr20.yaml +79 -0
- data/.data/spec/std/isa/csr/I/pmpaddr21.yaml +79 -0
- data/.data/spec/std/isa/csr/I/pmpaddr22.yaml +79 -0
- data/.data/spec/std/isa/csr/I/pmpaddr23.yaml +79 -0
- data/.data/spec/std/isa/csr/I/pmpaddr24.yaml +79 -0
- data/.data/spec/std/isa/csr/I/pmpaddr25.yaml +79 -0
- data/.data/spec/std/isa/csr/I/pmpaddr26.yaml +79 -0
- data/.data/spec/std/isa/csr/I/pmpaddr27.yaml +79 -0
- data/.data/spec/std/isa/csr/I/pmpaddr28.yaml +79 -0
- data/.data/spec/std/isa/csr/I/pmpaddr29.yaml +79 -0
- data/.data/spec/std/isa/csr/I/pmpaddr3.yaml +79 -0
- data/.data/spec/std/isa/csr/I/pmpaddr30.yaml +79 -0
- data/.data/spec/std/isa/csr/I/pmpaddr31.yaml +79 -0
- data/.data/spec/std/isa/csr/I/pmpaddr32.yaml +79 -0
- data/.data/spec/std/isa/csr/I/pmpaddr33.yaml +79 -0
- data/.data/spec/std/isa/csr/I/pmpaddr34.yaml +79 -0
- data/.data/spec/std/isa/csr/I/pmpaddr35.yaml +79 -0
- data/.data/spec/std/isa/csr/I/pmpaddr36.yaml +79 -0
- data/.data/spec/std/isa/csr/I/pmpaddr37.yaml +79 -0
- data/.data/spec/std/isa/csr/I/pmpaddr38.yaml +79 -0
- data/.data/spec/std/isa/csr/I/pmpaddr39.yaml +79 -0
- data/.data/spec/std/isa/csr/I/pmpaddr4.yaml +79 -0
- data/.data/spec/std/isa/csr/I/pmpaddr40.yaml +79 -0
- data/.data/spec/std/isa/csr/I/pmpaddr41.yaml +79 -0
- data/.data/spec/std/isa/csr/I/pmpaddr42.yaml +79 -0
- data/.data/spec/std/isa/csr/I/pmpaddr43.yaml +79 -0
- data/.data/spec/std/isa/csr/I/pmpaddr44.yaml +79 -0
- data/.data/spec/std/isa/csr/I/pmpaddr45.yaml +79 -0
- data/.data/spec/std/isa/csr/I/pmpaddr46.yaml +79 -0
- data/.data/spec/std/isa/csr/I/pmpaddr47.yaml +79 -0
- data/.data/spec/std/isa/csr/I/pmpaddr48.yaml +79 -0
- data/.data/spec/std/isa/csr/I/pmpaddr49.yaml +79 -0
- data/.data/spec/std/isa/csr/I/pmpaddr5.yaml +79 -0
- data/.data/spec/std/isa/csr/I/pmpaddr50.yaml +79 -0
- data/.data/spec/std/isa/csr/I/pmpaddr51.yaml +79 -0
- data/.data/spec/std/isa/csr/I/pmpaddr52.yaml +79 -0
- data/.data/spec/std/isa/csr/I/pmpaddr53.yaml +79 -0
- data/.data/spec/std/isa/csr/I/pmpaddr54.yaml +79 -0
- data/.data/spec/std/isa/csr/I/pmpaddr55.yaml +79 -0
- data/.data/spec/std/isa/csr/I/pmpaddr56.yaml +79 -0
- data/.data/spec/std/isa/csr/I/pmpaddr57.yaml +79 -0
- data/.data/spec/std/isa/csr/I/pmpaddr58.yaml +79 -0
- data/.data/spec/std/isa/csr/I/pmpaddr59.yaml +79 -0
- data/.data/spec/std/isa/csr/I/pmpaddr6.yaml +79 -0
- data/.data/spec/std/isa/csr/I/pmpaddr60.yaml +79 -0
- data/.data/spec/std/isa/csr/I/pmpaddr61.yaml +79 -0
- data/.data/spec/std/isa/csr/I/pmpaddr62.yaml +79 -0
- data/.data/spec/std/isa/csr/I/pmpaddr63.yaml +79 -0
- data/.data/spec/std/isa/csr/I/pmpaddr7.yaml +79 -0
- data/.data/spec/std/isa/csr/I/pmpaddr8.yaml +79 -0
- data/.data/spec/std/isa/csr/I/pmpaddr9.yaml +79 -0
- data/.data/spec/std/isa/csr/I/pmpaddrN.layout +81 -0
- data/.data/spec/std/isa/csr/I/pmpcfg0.yaml +493 -0
- data/.data/spec/std/isa/csr/I/pmpcfg1.yaml +255 -0
- data/.data/spec/std/isa/csr/I/pmpcfg10.yaml +493 -0
- data/.data/spec/std/isa/csr/I/pmpcfg11.yaml +255 -0
- data/.data/spec/std/isa/csr/I/pmpcfg12.yaml +493 -0
- data/.data/spec/std/isa/csr/I/pmpcfg13.yaml +255 -0
- data/.data/spec/std/isa/csr/I/pmpcfg14.yaml +493 -0
- data/.data/spec/std/isa/csr/I/pmpcfg15.yaml +255 -0
- data/.data/spec/std/isa/csr/I/pmpcfg2.yaml +493 -0
- data/.data/spec/std/isa/csr/I/pmpcfg3.yaml +255 -0
- data/.data/spec/std/isa/csr/I/pmpcfg4.yaml +493 -0
- data/.data/spec/std/isa/csr/I/pmpcfg5.yaml +255 -0
- data/.data/spec/std/isa/csr/I/pmpcfg6.yaml +493 -0
- data/.data/spec/std/isa/csr/I/pmpcfg7.yaml +255 -0
- data/.data/spec/std/isa/csr/I/pmpcfg8.yaml +493 -0
- data/.data/spec/std/isa/csr/I/pmpcfg9.yaml +255 -0
- data/.data/spec/std/isa/csr/I/pmpcfgN.layout +90 -0
- data/.data/spec/std/isa/csr/S/scounteren.layout +103 -0
- data/.data/spec/std/isa/csr/S/scounteren.yaml +692 -0
- data/.data/spec/std/isa/csr/Smcntrpmf/mcyclecfg.yaml +97 -0
- data/.data/spec/std/isa/csr/Smcntrpmf/mcyclecfgh.yaml +69 -0
- data/.data/spec/std/isa/csr/Smcntrpmf/minstretcfg.yaml +94 -0
- data/.data/spec/std/isa/csr/Smcntrpmf/minstretcfgh.yaml +69 -0
- data/.data/spec/std/isa/csr/Smcsrind/mireg.yaml +63 -0
- data/.data/spec/std/isa/csr/Smcsrind/mireg2.yaml +63 -0
- data/.data/spec/std/isa/csr/Smcsrind/mireg3.yaml +63 -0
- data/.data/spec/std/isa/csr/Smcsrind/mireg4.yaml +63 -0
- data/.data/spec/std/isa/csr/Smcsrind/mireg5.yaml +63 -0
- data/.data/spec/std/isa/csr/Smcsrind/mireg6.yaml +63 -0
- data/.data/spec/std/isa/csr/Smcsrind/miselect.yaml +47 -0
- data/.data/spec/std/isa/csr/Smcsrind/sireg.yaml +63 -0
- data/.data/spec/std/isa/csr/Smcsrind/sireg2.yaml +63 -0
- data/.data/spec/std/isa/csr/Smcsrind/sireg3.yaml +63 -0
- data/.data/spec/std/isa/csr/Smcsrind/sireg4.yaml +63 -0
- data/.data/spec/std/isa/csr/Smcsrind/sireg5.yaml +63 -0
- data/.data/spec/std/isa/csr/Smcsrind/sireg6.yaml +63 -0
- data/.data/spec/std/isa/csr/Smcsrind/siselect.yaml +41 -0
- data/.data/spec/std/isa/csr/Smcsrind/vsireg.yaml +63 -0
- data/.data/spec/std/isa/csr/Smcsrind/vsireg2.yaml +62 -0
- data/.data/spec/std/isa/csr/Smcsrind/vsireg3.yaml +61 -0
- data/.data/spec/std/isa/csr/Smcsrind/vsireg4.yaml +61 -0
- data/.data/spec/std/isa/csr/Smcsrind/vsireg5.yaml +62 -0
- data/.data/spec/std/isa/csr/Smcsrind/vsireg6.yaml +62 -0
- data/.data/spec/std/isa/csr/Smcsrind/vsiselect.yaml +47 -0
- data/.data/spec/std/isa/csr/Smctr/mctrctl.yaml +223 -0
- data/.data/spec/std/isa/csr/Smctr/sctrctl.yaml +224 -0
- data/.data/spec/std/isa/csr/Smctr/vsctrctl.yaml +228 -0
- data/.data/spec/std/isa/csr/Smrnmi/mncause.yaml +49 -0
- data/.data/spec/std/isa/csr/Smrnmi/mnepc.yaml +54 -0
- data/.data/spec/std/isa/csr/Smrnmi/mnscratch.yaml +26 -0
- data/.data/spec/std/isa/csr/Smrnmi/mnstatus.yaml +109 -0
- data/.data/spec/std/isa/csr/Sscofpmf/scountovf.layout +64 -0
- data/.data/spec/std/isa/csr/Sscofpmf/scountovf.yaml +455 -0
- data/.data/spec/std/isa/csr/Ssqosid/srmcfg.yaml +116 -0
- data/.data/spec/std/isa/csr/V/vcsr.yaml +36 -0
- data/.data/spec/std/isa/csr/V/vl.yaml +33 -0
- data/.data/spec/std/isa/csr/V/vlenb.yaml +27 -0
- data/.data/spec/std/isa/csr/V/vstart.yaml +81 -0
- data/.data/spec/std/isa/csr/V/vtype.yaml +125 -0
- data/.data/spec/std/isa/csr/V/vxrm.yaml +48 -0
- data/.data/spec/std/isa/csr/V/vxsat.yaml +33 -0
- data/.data/spec/std/isa/csr/Zicntr/mcountinhibit.layout +86 -0
- data/.data/spec/std/isa/csr/Zicntr/mcountinhibit.yaml +507 -0
- data/.data/spec/std/isa/csr/Zihpm/hpmcounter10.yaml +67 -0
- data/.data/spec/std/isa/csr/Zihpm/hpmcounter10h.yaml +69 -0
- data/.data/spec/std/isa/csr/Zihpm/hpmcounter11.yaml +67 -0
- data/.data/spec/std/isa/csr/Zihpm/hpmcounter11h.yaml +69 -0
- data/.data/spec/std/isa/csr/Zihpm/hpmcounter12.yaml +67 -0
- data/.data/spec/std/isa/csr/Zihpm/hpmcounter12h.yaml +69 -0
- data/.data/spec/std/isa/csr/Zihpm/hpmcounter13.yaml +67 -0
- data/.data/spec/std/isa/csr/Zihpm/hpmcounter13h.yaml +69 -0
- data/.data/spec/std/isa/csr/Zihpm/hpmcounter14.yaml +67 -0
- data/.data/spec/std/isa/csr/Zihpm/hpmcounter14h.yaml +69 -0
- data/.data/spec/std/isa/csr/Zihpm/hpmcounter15.yaml +67 -0
- data/.data/spec/std/isa/csr/Zihpm/hpmcounter15h.yaml +69 -0
- data/.data/spec/std/isa/csr/Zihpm/hpmcounter16.yaml +67 -0
- data/.data/spec/std/isa/csr/Zihpm/hpmcounter16h.yaml +69 -0
- data/.data/spec/std/isa/csr/Zihpm/hpmcounter17.yaml +67 -0
- data/.data/spec/std/isa/csr/Zihpm/hpmcounter17h.yaml +69 -0
- data/.data/spec/std/isa/csr/Zihpm/hpmcounter18.yaml +67 -0
- data/.data/spec/std/isa/csr/Zihpm/hpmcounter18h.yaml +69 -0
- data/.data/spec/std/isa/csr/Zihpm/hpmcounter19.yaml +67 -0
- data/.data/spec/std/isa/csr/Zihpm/hpmcounter19h.yaml +69 -0
- data/.data/spec/std/isa/csr/Zihpm/hpmcounter20.yaml +67 -0
- data/.data/spec/std/isa/csr/Zihpm/hpmcounter20h.yaml +69 -0
- data/.data/spec/std/isa/csr/Zihpm/hpmcounter21.yaml +67 -0
- data/.data/spec/std/isa/csr/Zihpm/hpmcounter21h.yaml +69 -0
- data/.data/spec/std/isa/csr/Zihpm/hpmcounter22.yaml +67 -0
- data/.data/spec/std/isa/csr/Zihpm/hpmcounter22h.yaml +69 -0
- data/.data/spec/std/isa/csr/Zihpm/hpmcounter23.yaml +67 -0
- data/.data/spec/std/isa/csr/Zihpm/hpmcounter23h.yaml +69 -0
- data/.data/spec/std/isa/csr/Zihpm/hpmcounter24.yaml +67 -0
- data/.data/spec/std/isa/csr/Zihpm/hpmcounter24h.yaml +69 -0
- data/.data/spec/std/isa/csr/Zihpm/hpmcounter25.yaml +67 -0
- data/.data/spec/std/isa/csr/Zihpm/hpmcounter25h.yaml +69 -0
- data/.data/spec/std/isa/csr/Zihpm/hpmcounter26.yaml +67 -0
- data/.data/spec/std/isa/csr/Zihpm/hpmcounter26h.yaml +69 -0
- data/.data/spec/std/isa/csr/Zihpm/hpmcounter27.yaml +67 -0
- data/.data/spec/std/isa/csr/Zihpm/hpmcounter27h.yaml +69 -0
- data/.data/spec/std/isa/csr/Zihpm/hpmcounter28.yaml +67 -0
- data/.data/spec/std/isa/csr/Zihpm/hpmcounter28h.yaml +69 -0
- data/.data/spec/std/isa/csr/Zihpm/hpmcounter29.yaml +67 -0
- data/.data/spec/std/isa/csr/Zihpm/hpmcounter29h.yaml +69 -0
- data/.data/spec/std/isa/csr/Zihpm/hpmcounter3.yaml +67 -0
- data/.data/spec/std/isa/csr/Zihpm/hpmcounter30.yaml +67 -0
- data/.data/spec/std/isa/csr/Zihpm/hpmcounter30h.yaml +69 -0
- data/.data/spec/std/isa/csr/Zihpm/hpmcounter31.yaml +67 -0
- data/.data/spec/std/isa/csr/Zihpm/hpmcounter31h.yaml +69 -0
- data/.data/spec/std/isa/csr/Zihpm/hpmcounter3h.yaml +69 -0
- data/.data/spec/std/isa/csr/Zihpm/hpmcounter4.yaml +67 -0
- data/.data/spec/std/isa/csr/Zihpm/hpmcounter4h.yaml +69 -0
- data/.data/spec/std/isa/csr/Zihpm/hpmcounter5.yaml +67 -0
- data/.data/spec/std/isa/csr/Zihpm/hpmcounter5h.yaml +69 -0
- data/.data/spec/std/isa/csr/Zihpm/hpmcounter6.yaml +67 -0
- data/.data/spec/std/isa/csr/Zihpm/hpmcounter6h.yaml +69 -0
- data/.data/spec/std/isa/csr/Zihpm/hpmcounter7.yaml +67 -0
- data/.data/spec/std/isa/csr/Zihpm/hpmcounter7h.yaml +69 -0
- data/.data/spec/std/isa/csr/Zihpm/hpmcounter8.yaml +67 -0
- data/.data/spec/std/isa/csr/Zihpm/hpmcounter8h.yaml +69 -0
- data/.data/spec/std/isa/csr/Zihpm/hpmcounter9.yaml +67 -0
- data/.data/spec/std/isa/csr/Zihpm/hpmcounter9h.yaml +69 -0
- data/.data/spec/std/isa/csr/Zihpm/hpmcounterN.layout +65 -0
- data/.data/spec/std/isa/csr/Zihpm/hpmcounterNh.layout +67 -0
- data/.data/spec/std/isa/csr/Zihpm/mhpmcounter10.yaml +106 -0
- data/.data/spec/std/isa/csr/Zihpm/mhpmcounter10h.yaml +85 -0
- data/.data/spec/std/isa/csr/Zihpm/mhpmcounter11.yaml +106 -0
- data/.data/spec/std/isa/csr/Zihpm/mhpmcounter11h.yaml +85 -0
- data/.data/spec/std/isa/csr/Zihpm/mhpmcounter12.yaml +106 -0
- data/.data/spec/std/isa/csr/Zihpm/mhpmcounter12h.yaml +85 -0
- data/.data/spec/std/isa/csr/Zihpm/mhpmcounter13.yaml +106 -0
- data/.data/spec/std/isa/csr/Zihpm/mhpmcounter13h.yaml +85 -0
- data/.data/spec/std/isa/csr/Zihpm/mhpmcounter14.yaml +106 -0
- data/.data/spec/std/isa/csr/Zihpm/mhpmcounter14h.yaml +85 -0
- data/.data/spec/std/isa/csr/Zihpm/mhpmcounter15.yaml +106 -0
- data/.data/spec/std/isa/csr/Zihpm/mhpmcounter15h.yaml +85 -0
- data/.data/spec/std/isa/csr/Zihpm/mhpmcounter16.yaml +106 -0
- data/.data/spec/std/isa/csr/Zihpm/mhpmcounter16h.yaml +85 -0
- data/.data/spec/std/isa/csr/Zihpm/mhpmcounter17.yaml +106 -0
- data/.data/spec/std/isa/csr/Zihpm/mhpmcounter17h.yaml +85 -0
- data/.data/spec/std/isa/csr/Zihpm/mhpmcounter18.yaml +106 -0
- data/.data/spec/std/isa/csr/Zihpm/mhpmcounter18h.yaml +85 -0
- data/.data/spec/std/isa/csr/Zihpm/mhpmcounter19.yaml +106 -0
- data/.data/spec/std/isa/csr/Zihpm/mhpmcounter19h.yaml +85 -0
- data/.data/spec/std/isa/csr/Zihpm/mhpmcounter20.yaml +106 -0
- data/.data/spec/std/isa/csr/Zihpm/mhpmcounter20h.yaml +85 -0
- data/.data/spec/std/isa/csr/Zihpm/mhpmcounter21.yaml +106 -0
- data/.data/spec/std/isa/csr/Zihpm/mhpmcounter21h.yaml +85 -0
- data/.data/spec/std/isa/csr/Zihpm/mhpmcounter22.yaml +106 -0
- data/.data/spec/std/isa/csr/Zihpm/mhpmcounter22h.yaml +85 -0
- data/.data/spec/std/isa/csr/Zihpm/mhpmcounter23.yaml +106 -0
- data/.data/spec/std/isa/csr/Zihpm/mhpmcounter23h.yaml +85 -0
- data/.data/spec/std/isa/csr/Zihpm/mhpmcounter24.yaml +106 -0
- data/.data/spec/std/isa/csr/Zihpm/mhpmcounter24h.yaml +85 -0
- data/.data/spec/std/isa/csr/Zihpm/mhpmcounter25.yaml +106 -0
- data/.data/spec/std/isa/csr/Zihpm/mhpmcounter25h.yaml +85 -0
- data/.data/spec/std/isa/csr/Zihpm/mhpmcounter26.yaml +106 -0
- data/.data/spec/std/isa/csr/Zihpm/mhpmcounter26h.yaml +85 -0
- data/.data/spec/std/isa/csr/Zihpm/mhpmcounter27.yaml +106 -0
- data/.data/spec/std/isa/csr/Zihpm/mhpmcounter27h.yaml +85 -0
- data/.data/spec/std/isa/csr/Zihpm/mhpmcounter28.yaml +106 -0
- data/.data/spec/std/isa/csr/Zihpm/mhpmcounter28h.yaml +85 -0
- data/.data/spec/std/isa/csr/Zihpm/mhpmcounter29.yaml +106 -0
- data/.data/spec/std/isa/csr/Zihpm/mhpmcounter29h.yaml +85 -0
- data/.data/spec/std/isa/csr/Zihpm/mhpmcounter3.yaml +106 -0
- data/.data/spec/std/isa/csr/Zihpm/mhpmcounter30.yaml +106 -0
- data/.data/spec/std/isa/csr/Zihpm/mhpmcounter30h.yaml +85 -0
- data/.data/spec/std/isa/csr/Zihpm/mhpmcounter31.yaml +106 -0
- data/.data/spec/std/isa/csr/Zihpm/mhpmcounter31h.yaml +85 -0
- data/.data/spec/std/isa/csr/Zihpm/mhpmcounter3h.yaml +85 -0
- data/.data/spec/std/isa/csr/Zihpm/mhpmcounter4.yaml +106 -0
- data/.data/spec/std/isa/csr/Zihpm/mhpmcounter4h.yaml +85 -0
- data/.data/spec/std/isa/csr/Zihpm/mhpmcounter5.yaml +106 -0
- data/.data/spec/std/isa/csr/Zihpm/mhpmcounter5h.yaml +85 -0
- data/.data/spec/std/isa/csr/Zihpm/mhpmcounter6.yaml +106 -0
- data/.data/spec/std/isa/csr/Zihpm/mhpmcounter6h.yaml +85 -0
- data/.data/spec/std/isa/csr/Zihpm/mhpmcounter7.yaml +106 -0
- data/.data/spec/std/isa/csr/Zihpm/mhpmcounter7h.yaml +85 -0
- data/.data/spec/std/isa/csr/Zihpm/mhpmcounter8.yaml +106 -0
- data/.data/spec/std/isa/csr/Zihpm/mhpmcounter8h.yaml +85 -0
- data/.data/spec/std/isa/csr/Zihpm/mhpmcounter9.yaml +106 -0
- data/.data/spec/std/isa/csr/Zihpm/mhpmcounter9h.yaml +85 -0
- data/.data/spec/std/isa/csr/Zihpm/mhpmcounterN.layout +104 -0
- data/.data/spec/std/isa/csr/Zihpm/mhpmcounterNh.layout +83 -0
- data/.data/spec/std/isa/csr/Zihpm/mhpmevent10.yaml +170 -0
- data/.data/spec/std/isa/csr/Zihpm/mhpmevent10h.yaml +163 -0
- data/.data/spec/std/isa/csr/Zihpm/mhpmevent11.yaml +170 -0
- data/.data/spec/std/isa/csr/Zihpm/mhpmevent11h.yaml +163 -0
- data/.data/spec/std/isa/csr/Zihpm/mhpmevent12.yaml +170 -0
- data/.data/spec/std/isa/csr/Zihpm/mhpmevent12h.yaml +163 -0
- data/.data/spec/std/isa/csr/Zihpm/mhpmevent13.yaml +170 -0
- data/.data/spec/std/isa/csr/Zihpm/mhpmevent13h.yaml +163 -0
- data/.data/spec/std/isa/csr/Zihpm/mhpmevent14.yaml +170 -0
- data/.data/spec/std/isa/csr/Zihpm/mhpmevent14h.yaml +163 -0
- data/.data/spec/std/isa/csr/Zihpm/mhpmevent15.yaml +170 -0
- data/.data/spec/std/isa/csr/Zihpm/mhpmevent15h.yaml +163 -0
- data/.data/spec/std/isa/csr/Zihpm/mhpmevent16.yaml +170 -0
- data/.data/spec/std/isa/csr/Zihpm/mhpmevent16h.yaml +163 -0
- data/.data/spec/std/isa/csr/Zihpm/mhpmevent17.yaml +170 -0
- data/.data/spec/std/isa/csr/Zihpm/mhpmevent17h.yaml +163 -0
- data/.data/spec/std/isa/csr/Zihpm/mhpmevent18.yaml +170 -0
- data/.data/spec/std/isa/csr/Zihpm/mhpmevent18h.yaml +163 -0
- data/.data/spec/std/isa/csr/Zihpm/mhpmevent19.yaml +170 -0
- data/.data/spec/std/isa/csr/Zihpm/mhpmevent19h.yaml +163 -0
- data/.data/spec/std/isa/csr/Zihpm/mhpmevent20.yaml +170 -0
- data/.data/spec/std/isa/csr/Zihpm/mhpmevent20h.yaml +163 -0
- data/.data/spec/std/isa/csr/Zihpm/mhpmevent21.yaml +170 -0
- data/.data/spec/std/isa/csr/Zihpm/mhpmevent21h.yaml +163 -0
- data/.data/spec/std/isa/csr/Zihpm/mhpmevent22.yaml +170 -0
- data/.data/spec/std/isa/csr/Zihpm/mhpmevent22h.yaml +163 -0
- data/.data/spec/std/isa/csr/Zihpm/mhpmevent23.yaml +170 -0
- data/.data/spec/std/isa/csr/Zihpm/mhpmevent23h.yaml +163 -0
- data/.data/spec/std/isa/csr/Zihpm/mhpmevent24.yaml +170 -0
- data/.data/spec/std/isa/csr/Zihpm/mhpmevent24h.yaml +163 -0
- data/.data/spec/std/isa/csr/Zihpm/mhpmevent25.yaml +170 -0
- data/.data/spec/std/isa/csr/Zihpm/mhpmevent25h.yaml +163 -0
- data/.data/spec/std/isa/csr/Zihpm/mhpmevent26.yaml +170 -0
- data/.data/spec/std/isa/csr/Zihpm/mhpmevent26h.yaml +163 -0
- data/.data/spec/std/isa/csr/Zihpm/mhpmevent27.yaml +170 -0
- data/.data/spec/std/isa/csr/Zihpm/mhpmevent27h.yaml +163 -0
- data/.data/spec/std/isa/csr/Zihpm/mhpmevent28.yaml +170 -0
- data/.data/spec/std/isa/csr/Zihpm/mhpmevent28h.yaml +163 -0
- data/.data/spec/std/isa/csr/Zihpm/mhpmevent29.yaml +170 -0
- data/.data/spec/std/isa/csr/Zihpm/mhpmevent29h.yaml +163 -0
- data/.data/spec/std/isa/csr/Zihpm/mhpmevent3.yaml +170 -0
- data/.data/spec/std/isa/csr/Zihpm/mhpmevent30.yaml +170 -0
- data/.data/spec/std/isa/csr/Zihpm/mhpmevent30h.yaml +163 -0
- data/.data/spec/std/isa/csr/Zihpm/mhpmevent31.yaml +170 -0
- data/.data/spec/std/isa/csr/Zihpm/mhpmevent31h.yaml +163 -0
- data/.data/spec/std/isa/csr/Zihpm/mhpmevent3h.yaml +163 -0
- data/.data/spec/std/isa/csr/Zihpm/mhpmevent4.yaml +170 -0
- data/.data/spec/std/isa/csr/Zihpm/mhpmevent4h.yaml +163 -0
- data/.data/spec/std/isa/csr/Zihpm/mhpmevent5.yaml +170 -0
- data/.data/spec/std/isa/csr/Zihpm/mhpmevent5h.yaml +163 -0
- data/.data/spec/std/isa/csr/Zihpm/mhpmevent6.yaml +170 -0
- data/.data/spec/std/isa/csr/Zihpm/mhpmevent6h.yaml +163 -0
- data/.data/spec/std/isa/csr/Zihpm/mhpmevent7.yaml +170 -0
- data/.data/spec/std/isa/csr/Zihpm/mhpmevent7h.yaml +163 -0
- data/.data/spec/std/isa/csr/Zihpm/mhpmevent8.yaml +170 -0
- data/.data/spec/std/isa/csr/Zihpm/mhpmevent8h.yaml +163 -0
- data/.data/spec/std/isa/csr/Zihpm/mhpmevent9.yaml +170 -0
- data/.data/spec/std/isa/csr/Zihpm/mhpmevent9h.yaml +163 -0
- data/.data/spec/std/isa/csr/Zihpm/mhpmeventN.layout +168 -0
- data/.data/spec/std/isa/csr/Zihpm/mhpmeventNh.layout +161 -0
- data/.data/spec/std/isa/csr/cycle.yaml +79 -0
- data/.data/spec/std/isa/csr/cycleh.yaml +86 -0
- data/.data/spec/std/isa/csr/dcsr.yaml +293 -0
- data/.data/spec/std/isa/csr/dpc.yaml +45 -0
- data/.data/spec/std/isa/csr/dscratch0.yaml +28 -0
- data/.data/spec/std/isa/csr/dscratch1.yaml +28 -0
- data/.data/spec/std/isa/csr/hcontext.yaml +64 -0
- data/.data/spec/std/isa/csr/hedeleg.yaml +243 -0
- data/.data/spec/std/isa/csr/hedelegh.yaml +23 -0
- data/.data/spec/std/isa/csr/hstateen0.yaml +220 -0
- data/.data/spec/std/isa/csr/hstateen0h.yaml +159 -0
- data/.data/spec/std/isa/csr/hstateen1.yaml +70 -0
- data/.data/spec/std/isa/csr/hstateen1h.yaml +47 -0
- data/.data/spec/std/isa/csr/hstateen2.yaml +70 -0
- data/.data/spec/std/isa/csr/hstateen2h.yaml +47 -0
- data/.data/spec/std/isa/csr/hstateen3.yaml +70 -0
- data/.data/spec/std/isa/csr/hstateen3h.yaml +47 -0
- data/.data/spec/std/isa/csr/hstatus.yaml +246 -0
- data/.data/spec/std/isa/csr/instret.yaml +77 -0
- data/.data/spec/std/isa/csr/instreth.yaml +81 -0
- data/.data/spec/std/isa/csr/jvt.yaml +89 -0
- data/.data/spec/std/isa/csr/marchid.yaml +58 -0
- data/.data/spec/std/isa/csr/mcause.yaml +94 -0
- data/.data/spec/std/isa/csr/mconfigptr.yaml +61 -0
- data/.data/spec/std/isa/csr/mcontext.yaml +55 -0
- data/.data/spec/std/isa/csr/mcycle.yaml +67 -0
- data/.data/spec/std/isa/csr/mcycleh.yaml +40 -0
- data/.data/spec/std/isa/csr/medeleg.yaml +672 -0
- data/.data/spec/std/isa/csr/medelegh.yaml +22 -0
- data/.data/spec/std/isa/csr/menvcfg.yaml +305 -0
- data/.data/spec/std/isa/csr/menvcfgh.yaml +59 -0
- data/.data/spec/std/isa/csr/mepc.yaml +54 -0
- data/.data/spec/std/isa/csr/mhartid.yaml +26 -0
- data/.data/spec/std/isa/csr/mideleg.yaml +204 -0
- data/.data/spec/std/isa/csr/mie.yaml +105 -0
- data/.data/spec/std/isa/csr/mimpid.yaml +41 -0
- data/.data/spec/std/isa/csr/minstret.yaml +54 -0
- data/.data/spec/std/isa/csr/minstreth.yaml +39 -0
- data/.data/spec/std/isa/csr/mip.yaml +434 -0
- data/.data/spec/std/isa/csr/misa.yaml +263 -0
- data/.data/spec/std/isa/csr/mscontext.yaml +42 -0
- data/.data/spec/std/isa/csr/mscratch.yaml +24 -0
- data/.data/spec/std/isa/csr/mseccfg.yaml +25 -0
- data/.data/spec/std/isa/csr/mseccfgh.yaml +28 -0
- data/.data/spec/std/isa/csr/mstateen0.yaml +182 -0
- data/.data/spec/std/isa/csr/mstateen0h.yaml +151 -0
- data/.data/spec/std/isa/csr/mstateen1.yaml +65 -0
- data/.data/spec/std/isa/csr/mstateen1h.yaml +37 -0
- data/.data/spec/std/isa/csr/mstateen2.yaml +65 -0
- data/.data/spec/std/isa/csr/mstateen2h.yaml +37 -0
- data/.data/spec/std/isa/csr/mstateen3.yaml +65 -0
- data/.data/spec/std/isa/csr/mstateen3h.yaml +37 -0
- data/.data/spec/std/isa/csr/mstatus.yaml +626 -0
- data/.data/spec/std/isa/csr/mstatush.yaml +88 -0
- data/.data/spec/std/isa/csr/mtval.yaml +105 -0
- data/.data/spec/std/isa/csr/mtvec.yaml +111 -0
- data/.data/spec/std/isa/csr/mvendorid.yaml +28 -0
- data/.data/spec/std/isa/csr/satp.yaml +184 -0
- data/.data/spec/std/isa/csr/scause.yaml +96 -0
- data/.data/spec/std/isa/csr/schema.adoc +223 -0
- data/.data/spec/std/isa/csr/scontext.yaml +52 -0
- data/.data/spec/std/isa/csr/senvcfg.yaml +157 -0
- data/.data/spec/std/isa/csr/sepc.yaml +51 -0
- data/.data/spec/std/isa/csr/sie.yaml +49 -0
- data/.data/spec/std/isa/csr/sip.yaml +160 -0
- data/.data/spec/std/isa/csr/sscratch.yaml +23 -0
- data/.data/spec/std/isa/csr/sstateen0.yaml +134 -0
- data/.data/spec/std/isa/csr/sstateen1.yaml +96 -0
- data/.data/spec/std/isa/csr/sstateen2.yaml +96 -0
- data/.data/spec/std/isa/csr/sstateen3.yaml +96 -0
- data/.data/spec/std/isa/csr/sstatus.yaml +149 -0
- data/.data/spec/std/isa/csr/stval.yaml +103 -0
- data/.data/spec/std/isa/csr/stvec.yaml +54 -0
- data/.data/spec/std/isa/csr/tdata1.yaml +68 -0
- data/.data/spec/std/isa/csr/tdata2.yaml +32 -0
- data/.data/spec/std/isa/csr/tdata3.yaml +32 -0
- data/.data/spec/std/isa/csr/time.yaml +89 -0
- data/.data/spec/std/isa/csr/timeh.yaml +90 -0
- data/.data/spec/std/isa/csr/tselect.yaml +36 -0
- data/.data/spec/std/isa/csr/vscause.yaml +97 -0
- data/.data/spec/std/isa/csr/vsepc.yaml +52 -0
- data/.data/spec/std/isa/csr/vsstatus.yaml +232 -0
- data/.data/spec/std/isa/csr/vstval.yaml +105 -0
- data/.data/spec/std/isa/csr/vstvec.yaml +55 -0
- data/.data/spec/std/isa/exception_code/Breakpoint.yaml +13 -0
- data/.data/spec/std/isa/exception_code/DoubleTrap.yaml +13 -0
- data/.data/spec/std/isa/exception_code/HardwareError.yaml +14 -0
- data/.data/spec/std/isa/exception_code/IllegalInstruction.yaml +13 -0
- data/.data/spec/std/isa/exception_code/InstructionAccessFault.yaml +13 -0
- data/.data/spec/std/isa/exception_code/InstructionAddressMisaligned.yaml +13 -0
- data/.data/spec/std/isa/exception_code/InstructionGuestPageFault.yaml +13 -0
- data/.data/spec/std/isa/exception_code/InstructionPageFault.yaml +13 -0
- data/.data/spec/std/isa/exception_code/LoadAccessFault.yaml +13 -0
- data/.data/spec/std/isa/exception_code/LoadAddressMisaligned.yaml +13 -0
- data/.data/spec/std/isa/exception_code/LoadGuestPageFault.yaml +13 -0
- data/.data/spec/std/isa/exception_code/LoadPageFault.yaml +13 -0
- data/.data/spec/std/isa/exception_code/Mcall.yaml +13 -0
- data/.data/spec/std/isa/exception_code/Scall.yaml +13 -0
- data/.data/spec/std/isa/exception_code/SoftwareCheck.yaml +14 -0
- data/.data/spec/std/isa/exception_code/StoreAmoAccessFault.yaml +13 -0
- data/.data/spec/std/isa/exception_code/StoreAmoAddressMisaligned.yaml +13 -0
- data/.data/spec/std/isa/exception_code/StoreAmoGuestPageFault.yaml +13 -0
- data/.data/spec/std/isa/exception_code/StoreAmoPageFault.yaml +13 -0
- data/.data/spec/std/isa/exception_code/Ucall.yaml +13 -0
- data/.data/spec/std/isa/exception_code/VScall.yaml +13 -0
- data/.data/spec/std/isa/exception_code/VirtualInstruction.yaml +13 -0
- data/.data/spec/std/isa/ext/A.yaml +79 -0
- data/.data/spec/std/isa/ext/B.yaml +41 -0
- data/.data/spec/std/isa/ext/C.yaml +318 -0
- data/.data/spec/std/isa/ext/D.yaml +109 -0
- data/.data/spec/std/isa/ext/F.yaml +243 -0
- data/.data/spec/std/isa/ext/H.yaml +126 -0
- data/.data/spec/std/isa/ext/I.yaml +18 -0
- data/.data/spec/std/isa/ext/M.yaml +26 -0
- data/.data/spec/std/isa/ext/Q.yaml +26 -0
- data/.data/spec/std/isa/ext/S.yaml +41 -0
- data/.data/spec/std/isa/ext/Sdext.yaml +16 -0
- data/.data/spec/std/isa/ext/Sdtrig.yaml +33 -0
- data/.data/spec/std/isa/ext/Sha.yaml +69 -0
- data/.data/spec/std/isa/ext/Shcounterenw.yaml +29 -0
- data/.data/spec/std/isa/ext/Shgatpa.yaml +42 -0
- data/.data/spec/std/isa/ext/Shtvala.yaml +29 -0
- data/.data/spec/std/isa/ext/Shvsatpa.yaml +19 -0
- data/.data/spec/std/isa/ext/Shvstvala.yaml +61 -0
- data/.data/spec/std/isa/ext/Shvstvecd.yaml +26 -0
- data/.data/spec/std/isa/ext/Sm.yaml +104 -0
- data/.data/spec/std/isa/ext/Smaia.yaml +16 -0
- data/.data/spec/std/isa/ext/Smcdeleg.yaml +40 -0
- data/.data/spec/std/isa/ext/Smcntrpmf.yaml +16 -0
- data/.data/spec/std/isa/ext/Smcsrind.yaml +45 -0
- data/.data/spec/std/isa/ext/Smctr.yaml +58 -0
- data/.data/spec/std/isa/ext/Smdbltrp.yaml +25 -0
- data/.data/spec/std/isa/ext/Smepmp.yaml +36 -0
- data/.data/spec/std/isa/ext/Smhpm.yaml +29 -0
- data/.data/spec/std/isa/ext/Smmpm.yaml +16 -0
- data/.data/spec/std/isa/ext/Smnpm.yaml +17 -0
- data/.data/spec/std/isa/ext/Smpmp.yaml +42 -0
- data/.data/spec/std/isa/ext/Smrnmi.yaml +24 -0
- data/.data/spec/std/isa/ext/Smstateen.yaml +28 -0
- data/.data/spec/std/isa/ext/Ssaia.yaml +20 -0
- data/.data/spec/std/isa/ext/Ssccfg.yaml +16 -0
- data/.data/spec/std/isa/ext/Ssccptr.yaml +26 -0
- data/.data/spec/std/isa/ext/Sscofpmf.yaml +19 -0
- data/.data/spec/std/isa/ext/Sscounterenw.yaml +30 -0
- data/.data/spec/std/isa/ext/Sscsrind.yaml +48 -0
- data/.data/spec/std/isa/ext/Ssctr.yaml +23 -0
- data/.data/spec/std/isa/ext/Ssdbltrp.yaml +25 -0
- data/.data/spec/std/isa/ext/Ssnpm.yaml +17 -0
- data/.data/spec/std/isa/ext/Sspm.yaml +23 -0
- data/.data/spec/std/isa/ext/Ssqosid.yaml +40 -0
- data/.data/spec/std/isa/ext/Ssstateen.yaml +31 -0
- data/.data/spec/std/isa/ext/Ssstrict.yaml +52 -0
- data/.data/spec/std/isa/ext/Sstc.yaml +16 -0
- data/.data/spec/std/isa/ext/Sstvala.yaml +57 -0
- data/.data/spec/std/isa/ext/Sstvecd.yaml +29 -0
- data/.data/spec/std/isa/ext/Sstvecv.yaml +30 -0
- data/.data/spec/std/isa/ext/Ssu32xl.yaml +22 -0
- data/.data/spec/std/isa/ext/Ssu64xl.yaml +23 -0
- data/.data/spec/std/isa/ext/Ssube.yaml +25 -0
- data/.data/spec/std/isa/ext/Supm.yaml +23 -0
- data/.data/spec/std/isa/ext/Sv32.yaml +34 -0
- data/.data/spec/std/isa/ext/Sv39.yaml +34 -0
- data/.data/spec/std/isa/ext/Sv48.yaml +34 -0
- data/.data/spec/std/isa/ext/Sv57.yaml +34 -0
- data/.data/spec/std/isa/ext/Svade.yaml +53 -0
- data/.data/spec/std/isa/ext/Svadu.yaml +136 -0
- data/.data/spec/std/isa/ext/Svbare.yaml +28 -0
- data/.data/spec/std/isa/ext/Svinval.yaml +86 -0
- data/.data/spec/std/isa/ext/Svnapot.yaml +183 -0
- data/.data/spec/std/isa/ext/Svpbmt.yaml +29 -0
- data/.data/spec/std/isa/ext/Svrsw60t59b.yaml +39 -0
- data/.data/spec/std/isa/ext/Svvptc.yaml +37 -0
- data/.data/spec/std/isa/ext/U.yaml +17 -0
- data/.data/spec/std/isa/ext/V.yaml +21 -0
- data/.data/spec/std/isa/ext/Xmock.yaml +30 -0
- data/.data/spec/std/isa/ext/Za128rs.yaml +30 -0
- data/.data/spec/std/isa/ext/Za64rs.yaml +32 -0
- data/.data/spec/std/isa/ext/Zaamo.yaml +136 -0
- data/.data/spec/std/isa/ext/Zabha.yaml +19 -0
- data/.data/spec/std/isa/ext/Zacas.yaml +19 -0
- data/.data/spec/std/isa/ext/Zalasr.yaml +16 -0
- data/.data/spec/std/isa/ext/Zalrsc.yaml +316 -0
- data/.data/spec/std/isa/ext/Zama16b.yaml +24 -0
- data/.data/spec/std/isa/ext/Zawrs.yaml +25 -0
- data/.data/spec/std/isa/ext/Zba.yaml +66 -0
- data/.data/spec/std/isa/ext/Zbb.yaml +54 -0
- data/.data/spec/std/isa/ext/Zbc.yaml +54 -0
- data/.data/spec/std/isa/ext/Zbkb.yaml +18 -0
- data/.data/spec/std/isa/ext/Zbkc.yaml +23 -0
- data/.data/spec/std/isa/ext/Zbkx.yaml +24 -0
- data/.data/spec/std/isa/ext/Zbs.yaml +59 -0
- data/.data/spec/std/isa/ext/Zca.yaml +46 -0
- data/.data/spec/std/isa/ext/Zcb.yaml +45 -0
- data/.data/spec/std/isa/ext/Zcd.yaml +47 -0
- data/.data/spec/std/isa/ext/Zce.yaml +99 -0
- data/.data/spec/std/isa/ext/Zcf.yaml +46 -0
- data/.data/spec/std/isa/ext/Zclsd.yaml +28 -0
- data/.data/spec/std/isa/ext/Zcmop.yaml +58 -0
- data/.data/spec/std/isa/ext/Zcmp.yaml +100 -0
- data/.data/spec/std/isa/ext/Zcmt.yaml +75 -0
- data/.data/spec/std/isa/ext/Zdinx.yaml +49 -0
- data/.data/spec/std/isa/ext/Zfa.yaml +24 -0
- data/.data/spec/std/isa/ext/Zfbfmin.yaml +27 -0
- data/.data/spec/std/isa/ext/Zfh.yaml +24 -0
- data/.data/spec/std/isa/ext/Zfhmin.yaml +55 -0
- data/.data/spec/std/isa/ext/Zfinx.yaml +56 -0
- data/.data/spec/std/isa/ext/Zhinx.yaml +26 -0
- data/.data/spec/std/isa/ext/Zhinxmin.yaml +29 -0
- data/.data/spec/std/isa/ext/Zic64b.yaml +31 -0
- data/.data/spec/std/isa/ext/Zicbom.yaml +15 -0
- data/.data/spec/std/isa/ext/Zicbop.yaml +15 -0
- data/.data/spec/std/isa/ext/Zicboz.yaml +15 -0
- data/.data/spec/std/isa/ext/Ziccamoa.yaml +19 -0
- data/.data/spec/std/isa/ext/Ziccamoc.yaml +23 -0
- data/.data/spec/std/isa/ext/Ziccif.yaml +21 -0
- data/.data/spec/std/isa/ext/Zicclsm.yaml +31 -0
- data/.data/spec/std/isa/ext/Ziccrse.yaml +19 -0
- data/.data/spec/std/isa/ext/Zicfilp.yaml +16 -0
- data/.data/spec/std/isa/ext/Zicfiss.yaml +16 -0
- data/.data/spec/std/isa/ext/Zicntr.yaml +20 -0
- data/.data/spec/std/isa/ext/Zicond.yaml +24 -0
- data/.data/spec/std/isa/ext/Zicsr.yaml +15 -0
- data/.data/spec/std/isa/ext/Zifencei.yaml +75 -0
- data/.data/spec/std/isa/ext/Zihintntl.yaml +201 -0
- data/.data/spec/std/isa/ext/Zihintpause.yaml +76 -0
- data/.data/spec/std/isa/ext/Zihpm.yaml +18 -0
- data/.data/spec/std/isa/ext/Zilsd.yaml +20 -0
- data/.data/spec/std/isa/ext/Zimop.yaml +70 -0
- data/.data/spec/std/isa/ext/Zk.yaml +42 -0
- data/.data/spec/std/isa/ext/Zkn.yaml +57 -0
- data/.data/spec/std/isa/ext/Zknd.yaml +19 -0
- data/.data/spec/std/isa/ext/Zkne.yaml +19 -0
- data/.data/spec/std/isa/ext/Zknh.yaml +19 -0
- data/.data/spec/std/isa/ext/Zkr.yaml +20 -0
- data/.data/spec/std/isa/ext/Zks.yaml +53 -0
- data/.data/spec/std/isa/ext/Zksed.yaml +20 -0
- data/.data/spec/std/isa/ext/Zksh.yaml +19 -0
- data/.data/spec/std/isa/ext/Zkt.yaml +365 -0
- data/.data/spec/std/isa/ext/Zmmul.yaml +28 -0
- data/.data/spec/std/isa/ext/Ztso.yaml +23 -0
- data/.data/spec/std/isa/ext/Zvbb.yaml +20 -0
- data/.data/spec/std/isa/ext/Zvbc.yaml +19 -0
- data/.data/spec/std/isa/ext/Zve32f.yaml +34 -0
- data/.data/spec/std/isa/ext/Zve32x.yaml +38 -0
- data/.data/spec/std/isa/ext/Zve64d.yaml +35 -0
- data/.data/spec/std/isa/ext/Zve64f.yaml +33 -0
- data/.data/spec/std/isa/ext/Zve64x.yaml +35 -0
- data/.data/spec/std/isa/ext/Zvfbfmin.yaml +23 -0
- data/.data/spec/std/isa/ext/Zvfbfwma.yaml +23 -0
- data/.data/spec/std/isa/ext/Zvfh.yaml +43 -0
- data/.data/spec/std/isa/ext/Zvfhmin.yaml +26 -0
- data/.data/spec/std/isa/ext/Zvkb.yaml +16 -0
- data/.data/spec/std/isa/ext/Zvkg.yaml +26 -0
- data/.data/spec/std/isa/ext/Zvkn.yaml +32 -0
- data/.data/spec/std/isa/ext/Zvknc.yaml +27 -0
- data/.data/spec/std/isa/ext/Zvkned.yaml +22 -0
- data/.data/spec/std/isa/ext/Zvkng.yaml +27 -0
- data/.data/spec/std/isa/ext/Zvknha.yaml +17 -0
- data/.data/spec/std/isa/ext/Zvknhb.yaml +21 -0
- data/.data/spec/std/isa/ext/Zvks.yaml +32 -0
- data/.data/spec/std/isa/ext/Zvksc.yaml +27 -0
- data/.data/spec/std/isa/ext/Zvksed.yaml +24 -0
- data/.data/spec/std/isa/ext/Zvksg.yaml +27 -0
- data/.data/spec/std/isa/ext/Zvksh.yaml +20 -0
- data/.data/spec/std/isa/ext/Zvkt.yaml +28 -0
- data/.data/spec/std/isa/ext/Zvl1024b.yaml +30 -0
- data/.data/spec/std/isa/ext/Zvl128b.yaml +31 -0
- data/.data/spec/std/isa/ext/Zvl256b.yaml +30 -0
- data/.data/spec/std/isa/ext/Zvl32b.yaml +28 -0
- data/.data/spec/std/isa/ext/Zvl512b.yaml +30 -0
- data/.data/spec/std/isa/ext/Zvl64b.yaml +31 -0
- data/.data/spec/std/isa/inst/B/andn.yaml +69 -0
- data/.data/spec/std/isa/inst/B/clmul.yaml +66 -0
- data/.data/spec/std/isa/inst/B/clmulh.yaml +66 -0
- data/.data/spec/std/isa/inst/B/orn.yaml +68 -0
- data/.data/spec/std/isa/inst/B/rev8.yaml +77 -0
- data/.data/spec/std/isa/inst/B/rol.yaml +70 -0
- data/.data/spec/std/isa/inst/B/rolw.yaml +65 -0
- data/.data/spec/std/isa/inst/B/ror.yaml +70 -0
- data/.data/spec/std/isa/inst/B/rori.yaml +66 -0
- data/.data/spec/std/isa/inst/B/roriw.yaml +58 -0
- data/.data/spec/std/isa/inst/B/rorw.yaml +65 -0
- data/.data/spec/std/isa/inst/B/xnor.yaml +68 -0
- data/.data/spec/std/isa/inst/C/c.add.yaml +52 -0
- data/.data/spec/std/isa/inst/C/c.addi.yaml +38 -0
- data/.data/spec/std/isa/inst/C/c.addi16sp.yaml +36 -0
- data/.data/spec/std/isa/inst/C/c.addi4spn.yaml +38 -0
- data/.data/spec/std/isa/inst/C/c.addiw.yaml +39 -0
- data/.data/spec/std/isa/inst/C/c.addw.yaml +55 -0
- data/.data/spec/std/isa/inst/C/c.and.yaml +64 -0
- data/.data/spec/std/isa/inst/C/c.andi.yaml +53 -0
- data/.data/spec/std/isa/inst/C/c.beqz.yaml +75 -0
- data/.data/spec/std/isa/inst/C/c.bnez.yaml +75 -0
- data/.data/spec/std/isa/inst/C/c.ebreak.yaml +53 -0
- data/.data/spec/std/isa/inst/C/c.j.yaml +34 -0
- data/.data/spec/std/isa/inst/C/c.jal.yaml +39 -0
- data/.data/spec/std/isa/inst/C/c.jalr.yaml +37 -0
- data/.data/spec/std/isa/inst/C/c.jr.yaml +33 -0
- data/.data/spec/std/isa/inst/C/c.ld.yaml +101 -0
- data/.data/spec/std/isa/inst/C/c.ldsp.yaml +64 -0
- data/.data/spec/std/isa/inst/C/c.li.yaml +36 -0
- data/.data/spec/std/isa/inst/C/c.lui.yaml +38 -0
- data/.data/spec/std/isa/inst/C/c.lw.yaml +74 -0
- data/.data/spec/std/isa/inst/C/c.lwsp.yaml +41 -0
- data/.data/spec/std/isa/inst/C/c.mv.yaml +48 -0
- data/.data/spec/std/isa/inst/C/c.nop.yaml +26 -0
- data/.data/spec/std/isa/inst/C/c.or.yaml +64 -0
- data/.data/spec/std/isa/inst/C/c.sd.yaml +67 -0
- data/.data/spec/std/isa/inst/C/c.sdsp.yaml +63 -0
- data/.data/spec/std/isa/inst/C/c.slli.yaml +65 -0
- data/.data/spec/std/isa/inst/C/c.srai.yaml +66 -0
- data/.data/spec/std/isa/inst/C/c.srli.yaml +66 -0
- data/.data/spec/std/isa/inst/C/c.sub.yaml +64 -0
- data/.data/spec/std/isa/inst/C/c.subw.yaml +55 -0
- data/.data/spec/std/isa/inst/C/c.sw.yaml +41 -0
- data/.data/spec/std/isa/inst/C/c.swsp.yaml +39 -0
- data/.data/spec/std/isa/inst/C/c.xor.yaml +64 -0
- data/.data/spec/std/isa/inst/D/fadd.d.yaml +36 -0
- data/.data/spec/std/isa/inst/D/fclass.d.yaml +53 -0
- data/.data/spec/std/isa/inst/D/fcvt.d.l.yaml +36 -0
- data/.data/spec/std/isa/inst/D/fcvt.d.lu.yaml +36 -0
- data/.data/spec/std/isa/inst/D/fcvt.d.s.yaml +36 -0
- data/.data/spec/std/isa/inst/D/fcvt.d.w.yaml +35 -0
- data/.data/spec/std/isa/inst/D/fcvt.d.wu.yaml +35 -0
- data/.data/spec/std/isa/inst/D/fcvt.l.d.yaml +36 -0
- data/.data/spec/std/isa/inst/D/fcvt.lu.d.yaml +36 -0
- data/.data/spec/std/isa/inst/D/fcvt.s.d.yaml +36 -0
- data/.data/spec/std/isa/inst/D/fcvt.w.d.yaml +34 -0
- data/.data/spec/std/isa/inst/D/fcvt.wu.d.yaml +34 -0
- data/.data/spec/std/isa/inst/D/fcvtmod.w.d.yaml +42 -0
- data/.data/spec/std/isa/inst/D/fdiv.d.yaml +36 -0
- data/.data/spec/std/isa/inst/D/feq.d.yaml +34 -0
- data/.data/spec/std/isa/inst/D/fld.yaml +34 -0
- data/.data/spec/std/isa/inst/D/fle.d.yaml +34 -0
- data/.data/spec/std/isa/inst/D/fleq.d.yaml +34 -0
- data/.data/spec/std/isa/inst/D/fli.d.yaml +32 -0
- data/.data/spec/std/isa/inst/D/flt.d.yaml +34 -0
- data/.data/spec/std/isa/inst/D/fltq.d.yaml +34 -0
- data/.data/spec/std/isa/inst/D/fmadd.d.yaml +37 -0
- data/.data/spec/std/isa/inst/D/fmax.d.yaml +36 -0
- data/.data/spec/std/isa/inst/D/fmaxm.d.yaml +34 -0
- data/.data/spec/std/isa/inst/D/fmin.d.yaml +36 -0
- data/.data/spec/std/isa/inst/D/fminm.d.yaml +34 -0
- data/.data/spec/std/isa/inst/D/fmsub.d.yaml +37 -0
- data/.data/spec/std/isa/inst/D/fmul.d.yaml +37 -0
- data/.data/spec/std/isa/inst/D/fmv.d.x.yaml +32 -0
- data/.data/spec/std/isa/inst/D/fmv.x.d.yaml +32 -0
- data/.data/spec/std/isa/inst/D/fmvh.x.d.yaml +35 -0
- data/.data/spec/std/isa/inst/D/fmvp.d.x.yaml +37 -0
- data/.data/spec/std/isa/inst/D/fnmadd.d.yaml +38 -0
- data/.data/spec/std/isa/inst/D/fnmsub.d.yaml +38 -0
- data/.data/spec/std/isa/inst/D/fround.d.yaml +38 -0
- data/.data/spec/std/isa/inst/D/froundnx.d.yaml +34 -0
- data/.data/spec/std/isa/inst/D/fsd.yaml +33 -0
- data/.data/spec/std/isa/inst/D/fsgnj.d.yaml +36 -0
- data/.data/spec/std/isa/inst/D/fsgnjn.d.yaml +36 -0
- data/.data/spec/std/isa/inst/D/fsgnjx.d.yaml +36 -0
- data/.data/spec/std/isa/inst/D/fsqrt.d.yaml +35 -0
- data/.data/spec/std/isa/inst/D/fsub.d.yaml +36 -0
- data/.data/spec/std/isa/inst/F/fadd.s.yaml +63 -0
- data/.data/spec/std/isa/inst/F/fclass.s.yaml +90 -0
- data/.data/spec/std/isa/inst/F/fcvt.l.s.yaml +56 -0
- data/.data/spec/std/isa/inst/F/fcvt.lu.s.yaml +56 -0
- data/.data/spec/std/isa/inst/F/fcvt.s.l.yaml +56 -0
- data/.data/spec/std/isa/inst/F/fcvt.s.lu.yaml +55 -0
- data/.data/spec/std/isa/inst/F/fcvt.s.w.yaml +67 -0
- data/.data/spec/std/isa/inst/F/fcvt.s.wu.yaml +66 -0
- data/.data/spec/std/isa/inst/F/fcvt.w.s.yaml +85 -0
- data/.data/spec/std/isa/inst/F/fcvt.wu.s.yaml +83 -0
- data/.data/spec/std/isa/inst/F/fdiv.s.yaml +60 -0
- data/.data/spec/std/isa/inst/F/feq.s.yaml +68 -0
- data/.data/spec/std/isa/inst/F/fle.s.yaml +68 -0
- data/.data/spec/std/isa/inst/F/fleq.s.yaml +50 -0
- data/.data/spec/std/isa/inst/F/flt.s.yaml +70 -0
- data/.data/spec/std/isa/inst/F/fltq.s.yaml +50 -0
- data/.data/spec/std/isa/inst/F/flw.yaml +80 -0
- data/.data/spec/std/isa/inst/F/fmadd.s.yaml +63 -0
- data/.data/spec/std/isa/inst/F/fmax.s.yaml +59 -0
- data/.data/spec/std/isa/inst/F/fmin.s.yaml +59 -0
- data/.data/spec/std/isa/inst/F/fmsub.s.yaml +63 -0
- data/.data/spec/std/isa/inst/F/fmul.s.yaml +60 -0
- data/.data/spec/std/isa/inst/F/fmv.w.x.yaml +55 -0
- data/.data/spec/std/isa/inst/F/fmv.x.w.yaml +48 -0
- data/.data/spec/std/isa/inst/F/fnmadd.s.yaml +64 -0
- data/.data/spec/std/isa/inst/F/fnmsub.s.yaml +64 -0
- data/.data/spec/std/isa/inst/F/fsgnj.s.yaml +68 -0
- data/.data/spec/std/isa/inst/F/fsgnjn.s.yaml +67 -0
- data/.data/spec/std/isa/inst/F/fsgnjx.s.yaml +66 -0
- data/.data/spec/std/isa/inst/F/fsqrt.s.yaml +53 -0
- data/.data/spec/std/isa/inst/F/fsub.s.yaml +61 -0
- data/.data/spec/std/isa/inst/F/fsw.yaml +82 -0
- data/.data/spec/std/isa/inst/H/hfence.gvma.yaml +33 -0
- data/.data/spec/std/isa/inst/H/hfence.vvma.yaml +34 -0
- data/.data/spec/std/isa/inst/H/hlv.b.yaml +30 -0
- data/.data/spec/std/isa/inst/H/hlv.bu.yaml +30 -0
- data/.data/spec/std/isa/inst/H/hlv.d.yaml +32 -0
- data/.data/spec/std/isa/inst/H/hlv.h.yaml +30 -0
- data/.data/spec/std/isa/inst/H/hlv.hu.yaml +30 -0
- data/.data/spec/std/isa/inst/H/hlv.w.yaml +30 -0
- data/.data/spec/std/isa/inst/H/hlv.wu.yaml +32 -0
- data/.data/spec/std/isa/inst/H/hlvx.hu.yaml +32 -0
- data/.data/spec/std/isa/inst/H/hlvx.wu.yaml +32 -0
- data/.data/spec/std/isa/inst/H/hsv.b.yaml +30 -0
- data/.data/spec/std/isa/inst/H/hsv.d.yaml +32 -0
- data/.data/spec/std/isa/inst/H/hsv.h.yaml +30 -0
- data/.data/spec/std/isa/inst/H/hsv.w.yaml +30 -0
- data/.data/spec/std/isa/inst/I/add.yaml +68 -0
- data/.data/spec/std/isa/inst/I/addi.yaml +58 -0
- data/.data/spec/std/isa/inst/I/addiw.yaml +50 -0
- data/.data/spec/std/isa/inst/I/addw.yaml +57 -0
- data/.data/spec/std/isa/inst/I/and.yaml +61 -0
- data/.data/spec/std/isa/inst/I/andi.yaml +54 -0
- data/.data/spec/std/isa/inst/I/auipc.yaml +47 -0
- data/.data/spec/std/isa/inst/I/beq.yaml +82 -0
- data/.data/spec/std/isa/inst/I/bge.yaml +84 -0
- data/.data/spec/std/isa/inst/I/bgeu.yaml +79 -0
- data/.data/spec/std/isa/inst/I/blt.yaml +84 -0
- data/.data/spec/std/isa/inst/I/bltu.yaml +79 -0
- data/.data/spec/std/isa/inst/I/bne.yaml +82 -0
- data/.data/spec/std/isa/inst/I/ebreak.yaml +50 -0
- data/.data/spec/std/isa/inst/I/ecall.yaml +81 -0
- data/.data/spec/std/isa/inst/I/fence.tso.yaml +52 -0
- data/.data/spec/std/isa/inst/I/fence.yaml +224 -0
- data/.data/spec/std/isa/inst/I/jal.yaml +69 -0
- data/.data/spec/std/isa/inst/I/jalr.yaml +79 -0
- data/.data/spec/std/isa/inst/I/lb.yaml +68 -0
- data/.data/spec/std/isa/inst/I/lbu.yaml +68 -0
- data/.data/spec/std/isa/inst/I/ld.yaml +98 -0
- data/.data/spec/std/isa/inst/I/lh.yaml +68 -0
- data/.data/spec/std/isa/inst/I/lhu.yaml +68 -0
- data/.data/spec/std/isa/inst/I/lui.yaml +45 -0
- data/.data/spec/std/isa/inst/I/lw.yaml +68 -0
- data/.data/spec/std/isa/inst/I/lwu.yaml +70 -0
- data/.data/spec/std/isa/inst/I/mret.yaml +61 -0
- data/.data/spec/std/isa/inst/I/or.yaml +61 -0
- data/.data/spec/std/isa/inst/I/ori.yaml +56 -0
- data/.data/spec/std/isa/inst/I/sb.yaml +82 -0
- data/.data/spec/std/isa/inst/I/sd.yaml +110 -0
- data/.data/spec/std/isa/inst/I/sh.yaml +82 -0
- data/.data/spec/std/isa/inst/I/sll.yaml +67 -0
- data/.data/spec/std/isa/inst/I/slli.yaml +66 -0
- data/.data/spec/std/isa/inst/I/slliw.yaml +53 -0
- data/.data/spec/std/isa/inst/I/sllw.yaml +53 -0
- data/.data/spec/std/isa/inst/I/slt.yaml +72 -0
- data/.data/spec/std/isa/inst/I/slti.yaml +54 -0
- data/.data/spec/std/isa/inst/I/sltiu.yaml +62 -0
- data/.data/spec/std/isa/inst/I/sltu.yaml +67 -0
- data/.data/spec/std/isa/inst/I/sra.yaml +67 -0
- data/.data/spec/std/isa/inst/I/srai.yaml +68 -0
- data/.data/spec/std/isa/inst/I/sraiw.yaml +54 -0
- data/.data/spec/std/isa/inst/I/sraw.yaml +56 -0
- data/.data/spec/std/isa/inst/I/srl.yaml +67 -0
- data/.data/spec/std/isa/inst/I/srli.yaml +65 -0
- data/.data/spec/std/isa/inst/I/srliw.yaml +55 -0
- data/.data/spec/std/isa/inst/I/srlw.yaml +53 -0
- data/.data/spec/std/isa/inst/I/sub.yaml +67 -0
- data/.data/spec/std/isa/inst/I/subw.yaml +60 -0
- data/.data/spec/std/isa/inst/I/sw.yaml +82 -0
- data/.data/spec/std/isa/inst/I/wfi.yaml +131 -0
- data/.data/spec/std/isa/inst/I/xor.yaml +61 -0
- data/.data/spec/std/isa/inst/I/xori.yaml +56 -0
- data/.data/spec/std/isa/inst/M/div.yaml +82 -0
- data/.data/spec/std/isa/inst/M/divu.yaml +71 -0
- data/.data/spec/std/isa/inst/M/divuw.yaml +78 -0
- data/.data/spec/std/isa/inst/M/divw.yaml +85 -0
- data/.data/spec/std/isa/inst/M/mul.yaml +95 -0
- data/.data/spec/std/isa/inst/M/mulh.yaml +80 -0
- data/.data/spec/std/isa/inst/M/mulhsu.yaml +77 -0
- data/.data/spec/std/isa/inst/M/mulhu.yaml +76 -0
- data/.data/spec/std/isa/inst/M/mulw.yaml +79 -0
- data/.data/spec/std/isa/inst/M/rem.yaml +76 -0
- data/.data/spec/std/isa/inst/M/remu.yaml +66 -0
- data/.data/spec/std/isa/inst/M/remuw.yaml +79 -0
- data/.data/spec/std/isa/inst/M/remw.yaml +84 -0
- data/.data/spec/std/isa/inst/Q/fadd.q.yaml +34 -0
- data/.data/spec/std/isa/inst/Q/fclass.q.yaml +53 -0
- data/.data/spec/std/isa/inst/Q/fcvt.d.q.yaml +31 -0
- data/.data/spec/std/isa/inst/Q/fcvt.h.q.yaml +33 -0
- data/.data/spec/std/isa/inst/Q/fcvt.l.q.yaml +33 -0
- data/.data/spec/std/isa/inst/Q/fcvt.lu.q.yaml +33 -0
- data/.data/spec/std/isa/inst/Q/fcvt.q.d.yaml +31 -0
- data/.data/spec/std/isa/inst/Q/fcvt.q.h.yaml +33 -0
- data/.data/spec/std/isa/inst/Q/fcvt.q.l.yaml +33 -0
- data/.data/spec/std/isa/inst/Q/fcvt.q.lu.yaml +33 -0
- data/.data/spec/std/isa/inst/Q/fcvt.q.s.yaml +31 -0
- data/.data/spec/std/isa/inst/Q/fcvt.q.w.yaml +31 -0
- data/.data/spec/std/isa/inst/Q/fcvt.q.wu.yaml +31 -0
- data/.data/spec/std/isa/inst/Q/fcvt.s.q.yaml +31 -0
- data/.data/spec/std/isa/inst/Q/fcvt.w.q.yaml +31 -0
- data/.data/spec/std/isa/inst/Q/fcvt.wu.q.yaml +31 -0
- data/.data/spec/std/isa/inst/Q/fdiv.q.yaml +40 -0
- data/.data/spec/std/isa/inst/Q/feq.q.yaml +37 -0
- data/.data/spec/std/isa/inst/Q/fle.q.yaml +37 -0
- data/.data/spec/std/isa/inst/Q/fleq.q.yaml +38 -0
- data/.data/spec/std/isa/inst/Q/fli.q.yaml +33 -0
- data/.data/spec/std/isa/inst/Q/flq.yaml +37 -0
- data/.data/spec/std/isa/inst/Q/flt.q.yaml +38 -0
- data/.data/spec/std/isa/inst/Q/fltq.q.yaml +38 -0
- data/.data/spec/std/isa/inst/Q/fmadd.q.yaml +40 -0
- data/.data/spec/std/isa/inst/Q/fmax.q.yaml +35 -0
- data/.data/spec/std/isa/inst/Q/fmaxm.q.yaml +38 -0
- data/.data/spec/std/isa/inst/Q/fmin.q.yaml +35 -0
- data/.data/spec/std/isa/inst/Q/fminm.q.yaml +38 -0
- data/.data/spec/std/isa/inst/Q/fmsub.q.yaml +36 -0
- data/.data/spec/std/isa/inst/Q/fmul.q.yaml +33 -0
- data/.data/spec/std/isa/inst/Q/fmvh.x.q.yaml +37 -0
- data/.data/spec/std/isa/inst/Q/fmvp.q.x.yaml +39 -0
- data/.data/spec/std/isa/inst/Q/fnmadd.q.yaml +37 -0
- data/.data/spec/std/isa/inst/Q/fnmsub.q.yaml +37 -0
- data/.data/spec/std/isa/inst/Q/fround.q.yaml +38 -0
- data/.data/spec/std/isa/inst/Q/froundnx.q.yaml +34 -0
- data/.data/spec/std/isa/inst/Q/fsgnj.q.yaml +36 -0
- data/.data/spec/std/isa/inst/Q/fsgnjn.q.yaml +36 -0
- data/.data/spec/std/isa/inst/Q/fsgnjx.q.yaml +36 -0
- data/.data/spec/std/isa/inst/Q/fsq.yaml +36 -0
- data/.data/spec/std/isa/inst/Q/fsqrt.q.yaml +31 -0
- data/.data/spec/std/isa/inst/Q/fsub.q.yaml +34 -0
- data/.data/spec/std/isa/inst/README.md +78 -0
- data/.data/spec/std/isa/inst/S/sfence.vma.yaml +331 -0
- data/.data/spec/std/isa/inst/S/sret.yaml +166 -0
- data/.data/spec/std/isa/inst/Sdext/dret.yaml +25 -0
- data/.data/spec/std/isa/inst/Smdbltrp/sctrclr.yaml +47 -0
- data/.data/spec/std/isa/inst/Smrnmi/mnret.yaml +51 -0
- data/.data/spec/std/isa/inst/Svinval/hinval.gvma.yaml +91 -0
- data/.data/spec/std/isa/inst/Svinval/hinval.vvma.yaml +91 -0
- data/.data/spec/std/isa/inst/Svinval/sfence.inval.ir.yaml +44 -0
- data/.data/spec/std/isa/inst/Svinval/sfence.w.inval.yaml +45 -0
- data/.data/spec/std/isa/inst/Svinval/sinval.vma.yaml +102 -0
- data/.data/spec/std/isa/inst/V/vaadd.vv.yaml +116 -0
- data/.data/spec/std/isa/inst/V/vaadd.vx.yaml +125 -0
- data/.data/spec/std/isa/inst/V/vaaddu.vv.yaml +116 -0
- data/.data/spec/std/isa/inst/V/vaaddu.vx.yaml +125 -0
- data/.data/spec/std/isa/inst/V/vadc.vim.yaml +75 -0
- data/.data/spec/std/isa/inst/V/vadc.vvm.yaml +76 -0
- data/.data/spec/std/isa/inst/V/vadc.vxm.yaml +76 -0
- data/.data/spec/std/isa/inst/V/vadd.vi.yaml +101 -0
- data/.data/spec/std/isa/inst/V/vadd.vv.yaml +158 -0
- data/.data/spec/std/isa/inst/V/vadd.vx.yaml +117 -0
- data/.data/spec/std/isa/inst/V/vand.vi.yaml +101 -0
- data/.data/spec/std/isa/inst/V/vand.vv.yaml +134 -0
- data/.data/spec/std/isa/inst/V/vand.vx.yaml +117 -0
- data/.data/spec/std/isa/inst/V/vasub.vv.yaml +116 -0
- data/.data/spec/std/isa/inst/V/vasub.vx.yaml +125 -0
- data/.data/spec/std/isa/inst/V/vasubu.vv.yaml +116 -0
- data/.data/spec/std/isa/inst/V/vasubu.vx.yaml +125 -0
- data/.data/spec/std/isa/inst/V/vcompress.vm.yaml +85 -0
- data/.data/spec/std/isa/inst/V/vcpop.m.yaml +31 -0
- data/.data/spec/std/isa/inst/V/vdiv.vv.yaml +116 -0
- data/.data/spec/std/isa/inst/V/vdiv.vx.yaml +125 -0
- data/.data/spec/std/isa/inst/V/vdivu.vv.yaml +116 -0
- data/.data/spec/std/isa/inst/V/vdivu.vx.yaml +125 -0
- data/.data/spec/std/isa/inst/V/vfadd.vf.yaml +92 -0
- data/.data/spec/std/isa/inst/V/vfadd.vv.yaml +81 -0
- data/.data/spec/std/isa/inst/V/vfclass.v.yaml +97 -0
- data/.data/spec/std/isa/inst/V/vfcvt.f.x.v.yaml +122 -0
- data/.data/spec/std/isa/inst/V/vfcvt.f.xu.v.yaml +122 -0
- data/.data/spec/std/isa/inst/V/vfcvt.rtz.x.f.v.yaml +122 -0
- data/.data/spec/std/isa/inst/V/vfcvt.rtz.xu.f.v.yaml +122 -0
- data/.data/spec/std/isa/inst/V/vfcvt.x.f.v.yaml +122 -0
- data/.data/spec/std/isa/inst/V/vfcvt.xu.f.v.yaml +122 -0
- data/.data/spec/std/isa/inst/V/vfdiv.vf.yaml +92 -0
- data/.data/spec/std/isa/inst/V/vfdiv.vv.yaml +81 -0
- data/.data/spec/std/isa/inst/V/vfirst.m.yaml +66 -0
- data/.data/spec/std/isa/inst/V/vfmacc.vf.yaml +80 -0
- data/.data/spec/std/isa/inst/V/vfmacc.vv.yaml +80 -0
- data/.data/spec/std/isa/inst/V/vfmadd.vf.yaml +80 -0
- data/.data/spec/std/isa/inst/V/vfmadd.vv.yaml +80 -0
- data/.data/spec/std/isa/inst/V/vfmax.vf.yaml +92 -0
- data/.data/spec/std/isa/inst/V/vfmax.vv.yaml +81 -0
- data/.data/spec/std/isa/inst/V/vfmerge.vfm.yaml +78 -0
- data/.data/spec/std/isa/inst/V/vfmin.vf.yaml +92 -0
- data/.data/spec/std/isa/inst/V/vfmin.vv.yaml +81 -0
- data/.data/spec/std/isa/inst/V/vfmsac.vf.yaml +80 -0
- data/.data/spec/std/isa/inst/V/vfmsac.vv.yaml +80 -0
- data/.data/spec/std/isa/inst/V/vfmsub.vf.yaml +80 -0
- data/.data/spec/std/isa/inst/V/vfmsub.vv.yaml +80 -0
- data/.data/spec/std/isa/inst/V/vfmul.vf.yaml +92 -0
- data/.data/spec/std/isa/inst/V/vfmul.vv.yaml +81 -0
- data/.data/spec/std/isa/inst/V/vfmv.f.s.yaml +58 -0
- data/.data/spec/std/isa/inst/V/vfmv.s.f.yaml +71 -0
- data/.data/spec/std/isa/inst/V/vfmv.v.f.yaml +64 -0
- data/.data/spec/std/isa/inst/V/vfncvt.f.f.w.yaml +145 -0
- data/.data/spec/std/isa/inst/V/vfncvt.f.x.w.yaml +145 -0
- data/.data/spec/std/isa/inst/V/vfncvt.f.xu.w.yaml +145 -0
- data/.data/spec/std/isa/inst/V/vfncvt.rod.f.f.w.yaml +145 -0
- data/.data/spec/std/isa/inst/V/vfncvt.rtz.x.f.w.yaml +145 -0
- data/.data/spec/std/isa/inst/V/vfncvt.rtz.xu.f.w.yaml +145 -0
- data/.data/spec/std/isa/inst/V/vfncvt.x.f.w.yaml +145 -0
- data/.data/spec/std/isa/inst/V/vfncvt.xu.f.w.yaml +145 -0
- data/.data/spec/std/isa/inst/V/vfnmacc.vf.yaml +80 -0
- data/.data/spec/std/isa/inst/V/vfnmacc.vv.yaml +80 -0
- data/.data/spec/std/isa/inst/V/vfnmadd.vf.yaml +80 -0
- data/.data/spec/std/isa/inst/V/vfnmadd.vv.yaml +80 -0
- data/.data/spec/std/isa/inst/V/vfnmsac.vf.yaml +80 -0
- data/.data/spec/std/isa/inst/V/vfnmsac.vv.yaml +80 -0
- data/.data/spec/std/isa/inst/V/vfnmsub.vf.yaml +80 -0
- data/.data/spec/std/isa/inst/V/vfnmsub.vv.yaml +80 -0
- data/.data/spec/std/isa/inst/V/vfrdiv.vf.yaml +92 -0
- data/.data/spec/std/isa/inst/V/vfrec7.v.yaml +97 -0
- data/.data/spec/std/isa/inst/V/vfredmax.vs.yaml +50 -0
- data/.data/spec/std/isa/inst/V/vfredmin.vs.yaml +50 -0
- data/.data/spec/std/isa/inst/V/vfredosum.vs.yaml +50 -0
- data/.data/spec/std/isa/inst/V/vfredusum.vs.yaml +50 -0
- data/.data/spec/std/isa/inst/V/vfrsqrt7.v.yaml +97 -0
- data/.data/spec/std/isa/inst/V/vfrsub.vf.yaml +92 -0
- data/.data/spec/std/isa/inst/V/vfsgnj.vf.yaml +92 -0
- data/.data/spec/std/isa/inst/V/vfsgnj.vv.yaml +81 -0
- data/.data/spec/std/isa/inst/V/vfsgnjn.vf.yaml +92 -0
- data/.data/spec/std/isa/inst/V/vfsgnjn.vv.yaml +81 -0
- data/.data/spec/std/isa/inst/V/vfsgnjx.vf.yaml +92 -0
- data/.data/spec/std/isa/inst/V/vfsgnjx.vv.yaml +81 -0
- data/.data/spec/std/isa/inst/V/vfslide1down.vf.yaml +92 -0
- data/.data/spec/std/isa/inst/V/vfslide1up.vf.yaml +92 -0
- data/.data/spec/std/isa/inst/V/vfsqrt.v.yaml +97 -0
- data/.data/spec/std/isa/inst/V/vfsub.vf.yaml +92 -0
- data/.data/spec/std/isa/inst/V/vfsub.vv.yaml +81 -0
- data/.data/spec/std/isa/inst/V/vfwadd.vf.yaml +80 -0
- data/.data/spec/std/isa/inst/V/vfwadd.vv.yaml +81 -0
- data/.data/spec/std/isa/inst/V/vfwadd.wf.yaml +78 -0
- data/.data/spec/std/isa/inst/V/vfwadd.wv.yaml +79 -0
- data/.data/spec/std/isa/inst/V/vfwcvt.f.f.v.yaml +137 -0
- data/.data/spec/std/isa/inst/V/vfwcvt.f.x.v.yaml +137 -0
- data/.data/spec/std/isa/inst/V/vfwcvt.f.xu.v.yaml +137 -0
- data/.data/spec/std/isa/inst/V/vfwcvt.rtz.x.f.v.yaml +137 -0
- data/.data/spec/std/isa/inst/V/vfwcvt.rtz.xu.f.v.yaml +137 -0
- data/.data/spec/std/isa/inst/V/vfwcvt.x.f.v.yaml +137 -0
- data/.data/spec/std/isa/inst/V/vfwcvt.xu.f.v.yaml +137 -0
- data/.data/spec/std/isa/inst/V/vfwmacc.vf.yaml +81 -0
- data/.data/spec/std/isa/inst/V/vfwmacc.vv.yaml +82 -0
- data/.data/spec/std/isa/inst/V/vfwmsac.vf.yaml +81 -0
- data/.data/spec/std/isa/inst/V/vfwmsac.vv.yaml +82 -0
- data/.data/spec/std/isa/inst/V/vfwmul.vf.yaml +80 -0
- data/.data/spec/std/isa/inst/V/vfwmul.vv.yaml +81 -0
- data/.data/spec/std/isa/inst/V/vfwnmacc.vf.yaml +81 -0
- data/.data/spec/std/isa/inst/V/vfwnmacc.vv.yaml +82 -0
- data/.data/spec/std/isa/inst/V/vfwnmsac.vf.yaml +81 -0
- data/.data/spec/std/isa/inst/V/vfwnmsac.vv.yaml +82 -0
- data/.data/spec/std/isa/inst/V/vfwredosum.vs.yaml +50 -0
- data/.data/spec/std/isa/inst/V/vfwredusum.vs.yaml +50 -0
- data/.data/spec/std/isa/inst/V/vfwsub.vf.yaml +80 -0
- data/.data/spec/std/isa/inst/V/vfwsub.vv.yaml +81 -0
- data/.data/spec/std/isa/inst/V/vfwsub.wf.yaml +78 -0
- data/.data/spec/std/isa/inst/V/vfwsub.wv.yaml +79 -0
- data/.data/spec/std/isa/inst/V/vid.v.yaml +61 -0
- data/.data/spec/std/isa/inst/V/viota.m.yaml +69 -0
- data/.data/spec/std/isa/inst/V/vl1re16.v.yaml +29 -0
- data/.data/spec/std/isa/inst/V/vl1re32.v.yaml +29 -0
- data/.data/spec/std/isa/inst/V/vl1re64.v.yaml +29 -0
- data/.data/spec/std/isa/inst/V/vl1re8.v.yaml +29 -0
- data/.data/spec/std/isa/inst/V/vl2re16.v.yaml +29 -0
- data/.data/spec/std/isa/inst/V/vl2re32.v.yaml +29 -0
- data/.data/spec/std/isa/inst/V/vl2re64.v.yaml +29 -0
- data/.data/spec/std/isa/inst/V/vl2re8.v.yaml +29 -0
- data/.data/spec/std/isa/inst/V/vl4re16.v.yaml +29 -0
- data/.data/spec/std/isa/inst/V/vl4re32.v.yaml +29 -0
- data/.data/spec/std/isa/inst/V/vl4re64.v.yaml +29 -0
- data/.data/spec/std/isa/inst/V/vl4re8.v.yaml +29 -0
- data/.data/spec/std/isa/inst/V/vl8re16.v.yaml +29 -0
- data/.data/spec/std/isa/inst/V/vl8re32.v.yaml +29 -0
- data/.data/spec/std/isa/inst/V/vl8re64.v.yaml +29 -0
- data/.data/spec/std/isa/inst/V/vl8re8.v.yaml +29 -0
- data/.data/spec/std/isa/inst/V/vle16.v.yaml +52 -0
- data/.data/spec/std/isa/inst/V/vle16ff.v.yaml +52 -0
- data/.data/spec/std/isa/inst/V/vle32.v.yaml +52 -0
- data/.data/spec/std/isa/inst/V/vle32ff.v.yaml +52 -0
- data/.data/spec/std/isa/inst/V/vle64.v.yaml +52 -0
- data/.data/spec/std/isa/inst/V/vle64ff.v.yaml +52 -0
- data/.data/spec/std/isa/inst/V/vle8.v.yaml +64 -0
- data/.data/spec/std/isa/inst/V/vle8ff.v.yaml +52 -0
- data/.data/spec/std/isa/inst/V/vlm.v.yaml +48 -0
- data/.data/spec/std/isa/inst/V/vloxei16.v.yaml +54 -0
- data/.data/spec/std/isa/inst/V/vloxei32.v.yaml +54 -0
- data/.data/spec/std/isa/inst/V/vloxei64.v.yaml +54 -0
- data/.data/spec/std/isa/inst/V/vloxei8.v.yaml +54 -0
- data/.data/spec/std/isa/inst/V/vloxseg2ei16.v.yaml +33 -0
- data/.data/spec/std/isa/inst/V/vloxseg2ei32.v.yaml +33 -0
- data/.data/spec/std/isa/inst/V/vloxseg2ei64.v.yaml +33 -0
- data/.data/spec/std/isa/inst/V/vloxseg2ei8.v.yaml +33 -0
- data/.data/spec/std/isa/inst/V/vloxseg3ei16.v.yaml +33 -0
- data/.data/spec/std/isa/inst/V/vloxseg3ei32.v.yaml +33 -0
- data/.data/spec/std/isa/inst/V/vloxseg3ei64.v.yaml +33 -0
- data/.data/spec/std/isa/inst/V/vloxseg3ei8.v.yaml +33 -0
- data/.data/spec/std/isa/inst/V/vloxseg4ei16.v.yaml +33 -0
- data/.data/spec/std/isa/inst/V/vloxseg4ei32.v.yaml +33 -0
- data/.data/spec/std/isa/inst/V/vloxseg4ei64.v.yaml +33 -0
- data/.data/spec/std/isa/inst/V/vloxseg4ei8.v.yaml +33 -0
- data/.data/spec/std/isa/inst/V/vloxseg5ei16.v.yaml +33 -0
- data/.data/spec/std/isa/inst/V/vloxseg5ei32.v.yaml +33 -0
- data/.data/spec/std/isa/inst/V/vloxseg5ei64.v.yaml +33 -0
- data/.data/spec/std/isa/inst/V/vloxseg5ei8.v.yaml +33 -0
- data/.data/spec/std/isa/inst/V/vloxseg6ei16.v.yaml +33 -0
- data/.data/spec/std/isa/inst/V/vloxseg6ei32.v.yaml +33 -0
- data/.data/spec/std/isa/inst/V/vloxseg6ei64.v.yaml +33 -0
- data/.data/spec/std/isa/inst/V/vloxseg6ei8.v.yaml +33 -0
- data/.data/spec/std/isa/inst/V/vloxseg7ei16.v.yaml +33 -0
- data/.data/spec/std/isa/inst/V/vloxseg7ei32.v.yaml +33 -0
- data/.data/spec/std/isa/inst/V/vloxseg7ei64.v.yaml +33 -0
- data/.data/spec/std/isa/inst/V/vloxseg7ei8.v.yaml +33 -0
- data/.data/spec/std/isa/inst/V/vloxseg8ei16.v.yaml +33 -0
- data/.data/spec/std/isa/inst/V/vloxseg8ei32.v.yaml +33 -0
- data/.data/spec/std/isa/inst/V/vloxseg8ei64.v.yaml +33 -0
- data/.data/spec/std/isa/inst/V/vloxseg8ei8.v.yaml +33 -0
- data/.data/spec/std/isa/inst/V/vlse16.v.yaml +54 -0
- data/.data/spec/std/isa/inst/V/vlse32.v.yaml +54 -0
- data/.data/spec/std/isa/inst/V/vlse64.v.yaml +54 -0
- data/.data/spec/std/isa/inst/V/vlse8.v.yaml +54 -0
- data/.data/spec/std/isa/inst/V/vlseg2e16.v.yaml +31 -0
- data/.data/spec/std/isa/inst/V/vlseg2e16ff.v.yaml +31 -0
- data/.data/spec/std/isa/inst/V/vlseg2e32.v.yaml +31 -0
- data/.data/spec/std/isa/inst/V/vlseg2e32ff.v.yaml +31 -0
- data/.data/spec/std/isa/inst/V/vlseg2e64.v.yaml +31 -0
- data/.data/spec/std/isa/inst/V/vlseg2e64ff.v.yaml +31 -0
- data/.data/spec/std/isa/inst/V/vlseg2e8.v.yaml +31 -0
- data/.data/spec/std/isa/inst/V/vlseg2e8ff.v.yaml +31 -0
- data/.data/spec/std/isa/inst/V/vlseg3e16.v.yaml +31 -0
- data/.data/spec/std/isa/inst/V/vlseg3e16ff.v.yaml +31 -0
- data/.data/spec/std/isa/inst/V/vlseg3e32.v.yaml +31 -0
- data/.data/spec/std/isa/inst/V/vlseg3e32ff.v.yaml +31 -0
- data/.data/spec/std/isa/inst/V/vlseg3e64.v.yaml +31 -0
- data/.data/spec/std/isa/inst/V/vlseg3e64ff.v.yaml +31 -0
- data/.data/spec/std/isa/inst/V/vlseg3e8.v.yaml +31 -0
- data/.data/spec/std/isa/inst/V/vlseg3e8ff.v.yaml +31 -0
- data/.data/spec/std/isa/inst/V/vlseg4e16.v.yaml +31 -0
- data/.data/spec/std/isa/inst/V/vlseg4e16ff.v.yaml +31 -0
- data/.data/spec/std/isa/inst/V/vlseg4e32.v.yaml +31 -0
- data/.data/spec/std/isa/inst/V/vlseg4e32ff.v.yaml +31 -0
- data/.data/spec/std/isa/inst/V/vlseg4e64.v.yaml +31 -0
- data/.data/spec/std/isa/inst/V/vlseg4e64ff.v.yaml +31 -0
- data/.data/spec/std/isa/inst/V/vlseg4e8.v.yaml +31 -0
- data/.data/spec/std/isa/inst/V/vlseg4e8ff.v.yaml +31 -0
- data/.data/spec/std/isa/inst/V/vlseg5e16.v.yaml +31 -0
- data/.data/spec/std/isa/inst/V/vlseg5e16ff.v.yaml +31 -0
- data/.data/spec/std/isa/inst/V/vlseg5e32.v.yaml +31 -0
- data/.data/spec/std/isa/inst/V/vlseg5e32ff.v.yaml +31 -0
- data/.data/spec/std/isa/inst/V/vlseg5e64.v.yaml +31 -0
- data/.data/spec/std/isa/inst/V/vlseg5e64ff.v.yaml +31 -0
- data/.data/spec/std/isa/inst/V/vlseg5e8.v.yaml +31 -0
- data/.data/spec/std/isa/inst/V/vlseg5e8ff.v.yaml +31 -0
- data/.data/spec/std/isa/inst/V/vlseg6e16.v.yaml +31 -0
- data/.data/spec/std/isa/inst/V/vlseg6e16ff.v.yaml +31 -0
- data/.data/spec/std/isa/inst/V/vlseg6e32.v.yaml +31 -0
- data/.data/spec/std/isa/inst/V/vlseg6e32ff.v.yaml +31 -0
- data/.data/spec/std/isa/inst/V/vlseg6e64.v.yaml +31 -0
- data/.data/spec/std/isa/inst/V/vlseg6e64ff.v.yaml +31 -0
- data/.data/spec/std/isa/inst/V/vlseg6e8.v.yaml +31 -0
- data/.data/spec/std/isa/inst/V/vlseg6e8ff.v.yaml +31 -0
- data/.data/spec/std/isa/inst/V/vlseg7e16.v.yaml +31 -0
- data/.data/spec/std/isa/inst/V/vlseg7e16ff.v.yaml +31 -0
- data/.data/spec/std/isa/inst/V/vlseg7e32.v.yaml +31 -0
- data/.data/spec/std/isa/inst/V/vlseg7e32ff.v.yaml +31 -0
- data/.data/spec/std/isa/inst/V/vlseg7e64.v.yaml +31 -0
- data/.data/spec/std/isa/inst/V/vlseg7e64ff.v.yaml +31 -0
- data/.data/spec/std/isa/inst/V/vlseg7e8.v.yaml +31 -0
- data/.data/spec/std/isa/inst/V/vlseg7e8ff.v.yaml +31 -0
- data/.data/spec/std/isa/inst/V/vlseg8e16.v.yaml +31 -0
- data/.data/spec/std/isa/inst/V/vlseg8e16ff.v.yaml +31 -0
- data/.data/spec/std/isa/inst/V/vlseg8e32.v.yaml +31 -0
- data/.data/spec/std/isa/inst/V/vlseg8e32ff.v.yaml +31 -0
- data/.data/spec/std/isa/inst/V/vlseg8e64.v.yaml +31 -0
- data/.data/spec/std/isa/inst/V/vlseg8e64ff.v.yaml +31 -0
- data/.data/spec/std/isa/inst/V/vlseg8e8.v.yaml +31 -0
- data/.data/spec/std/isa/inst/V/vlseg8e8ff.v.yaml +31 -0
- data/.data/spec/std/isa/inst/V/vlsseg2e16.v.yaml +33 -0
- data/.data/spec/std/isa/inst/V/vlsseg2e32.v.yaml +33 -0
- data/.data/spec/std/isa/inst/V/vlsseg2e64.v.yaml +33 -0
- data/.data/spec/std/isa/inst/V/vlsseg2e8.v.yaml +33 -0
- data/.data/spec/std/isa/inst/V/vlsseg3e16.v.yaml +33 -0
- data/.data/spec/std/isa/inst/V/vlsseg3e32.v.yaml +33 -0
- data/.data/spec/std/isa/inst/V/vlsseg3e64.v.yaml +33 -0
- data/.data/spec/std/isa/inst/V/vlsseg3e8.v.yaml +33 -0
- data/.data/spec/std/isa/inst/V/vlsseg4e16.v.yaml +33 -0
- data/.data/spec/std/isa/inst/V/vlsseg4e32.v.yaml +33 -0
- data/.data/spec/std/isa/inst/V/vlsseg4e64.v.yaml +33 -0
- data/.data/spec/std/isa/inst/V/vlsseg4e8.v.yaml +33 -0
- data/.data/spec/std/isa/inst/V/vlsseg5e16.v.yaml +33 -0
- data/.data/spec/std/isa/inst/V/vlsseg5e32.v.yaml +33 -0
- data/.data/spec/std/isa/inst/V/vlsseg5e64.v.yaml +33 -0
- data/.data/spec/std/isa/inst/V/vlsseg5e8.v.yaml +33 -0
- data/.data/spec/std/isa/inst/V/vlsseg6e16.v.yaml +33 -0
- data/.data/spec/std/isa/inst/V/vlsseg6e32.v.yaml +33 -0
- data/.data/spec/std/isa/inst/V/vlsseg6e64.v.yaml +33 -0
- data/.data/spec/std/isa/inst/V/vlsseg6e8.v.yaml +33 -0
- data/.data/spec/std/isa/inst/V/vlsseg7e16.v.yaml +33 -0
- data/.data/spec/std/isa/inst/V/vlsseg7e32.v.yaml +33 -0
- data/.data/spec/std/isa/inst/V/vlsseg7e64.v.yaml +33 -0
- data/.data/spec/std/isa/inst/V/vlsseg7e8.v.yaml +33 -0
- data/.data/spec/std/isa/inst/V/vlsseg8e16.v.yaml +33 -0
- data/.data/spec/std/isa/inst/V/vlsseg8e32.v.yaml +33 -0
- data/.data/spec/std/isa/inst/V/vlsseg8e64.v.yaml +33 -0
- data/.data/spec/std/isa/inst/V/vlsseg8e8.v.yaml +33 -0
- data/.data/spec/std/isa/inst/V/vluxei16.v.yaml +54 -0
- data/.data/spec/std/isa/inst/V/vluxei32.v.yaml +54 -0
- data/.data/spec/std/isa/inst/V/vluxei64.v.yaml +54 -0
- data/.data/spec/std/isa/inst/V/vluxei8.v.yaml +54 -0
- data/.data/spec/std/isa/inst/V/vluxseg2ei16.v.yaml +33 -0
- data/.data/spec/std/isa/inst/V/vluxseg2ei32.v.yaml +33 -0
- data/.data/spec/std/isa/inst/V/vluxseg2ei64.v.yaml +33 -0
- data/.data/spec/std/isa/inst/V/vluxseg2ei8.v.yaml +33 -0
- data/.data/spec/std/isa/inst/V/vluxseg3ei16.v.yaml +33 -0
- data/.data/spec/std/isa/inst/V/vluxseg3ei32.v.yaml +33 -0
- data/.data/spec/std/isa/inst/V/vluxseg3ei64.v.yaml +33 -0
- data/.data/spec/std/isa/inst/V/vluxseg3ei8.v.yaml +33 -0
- data/.data/spec/std/isa/inst/V/vluxseg4ei16.v.yaml +33 -0
- data/.data/spec/std/isa/inst/V/vluxseg4ei32.v.yaml +33 -0
- data/.data/spec/std/isa/inst/V/vluxseg4ei64.v.yaml +33 -0
- data/.data/spec/std/isa/inst/V/vluxseg4ei8.v.yaml +33 -0
- data/.data/spec/std/isa/inst/V/vluxseg5ei16.v.yaml +33 -0
- data/.data/spec/std/isa/inst/V/vluxseg5ei32.v.yaml +33 -0
- data/.data/spec/std/isa/inst/V/vluxseg5ei64.v.yaml +33 -0
- data/.data/spec/std/isa/inst/V/vluxseg5ei8.v.yaml +33 -0
- data/.data/spec/std/isa/inst/V/vluxseg6ei16.v.yaml +33 -0
- data/.data/spec/std/isa/inst/V/vluxseg6ei32.v.yaml +33 -0
- data/.data/spec/std/isa/inst/V/vluxseg6ei64.v.yaml +33 -0
- data/.data/spec/std/isa/inst/V/vluxseg6ei8.v.yaml +33 -0
- data/.data/spec/std/isa/inst/V/vluxseg7ei16.v.yaml +33 -0
- data/.data/spec/std/isa/inst/V/vluxseg7ei32.v.yaml +33 -0
- data/.data/spec/std/isa/inst/V/vluxseg7ei64.v.yaml +33 -0
- data/.data/spec/std/isa/inst/V/vluxseg7ei8.v.yaml +33 -0
- data/.data/spec/std/isa/inst/V/vluxseg8ei16.v.yaml +33 -0
- data/.data/spec/std/isa/inst/V/vluxseg8ei32.v.yaml +33 -0
- data/.data/spec/std/isa/inst/V/vluxseg8ei64.v.yaml +33 -0
- data/.data/spec/std/isa/inst/V/vluxseg8ei8.v.yaml +33 -0
- data/.data/spec/std/isa/inst/V/vmacc.vv.yaml +74 -0
- data/.data/spec/std/isa/inst/V/vmacc.vx.yaml +74 -0
- data/.data/spec/std/isa/inst/V/vmadc.vi.yaml +69 -0
- data/.data/spec/std/isa/inst/V/vmadc.vim.yaml +70 -0
- data/.data/spec/std/isa/inst/V/vmadc.vv.yaml +70 -0
- data/.data/spec/std/isa/inst/V/vmadc.vvm.yaml +71 -0
- data/.data/spec/std/isa/inst/V/vmadc.vx.yaml +70 -0
- data/.data/spec/std/isa/inst/V/vmadc.vxm.yaml +71 -0
- data/.data/spec/std/isa/inst/V/vmadd.vv.yaml +74 -0
- data/.data/spec/std/isa/inst/V/vmadd.vx.yaml +74 -0
- data/.data/spec/std/isa/inst/V/vmand.mm.yaml +75 -0
- data/.data/spec/std/isa/inst/V/vmandn.mm.yaml +31 -0
- data/.data/spec/std/isa/inst/V/vmax.vv.yaml +134 -0
- data/.data/spec/std/isa/inst/V/vmax.vx.yaml +117 -0
- data/.data/spec/std/isa/inst/V/vmaxu.vv.yaml +134 -0
- data/.data/spec/std/isa/inst/V/vmaxu.vx.yaml +117 -0
- data/.data/spec/std/isa/inst/V/vmerge.vim.yaml +76 -0
- data/.data/spec/std/isa/inst/V/vmerge.vvm.yaml +76 -0
- data/.data/spec/std/isa/inst/V/vmerge.vxm.yaml +76 -0
- data/.data/spec/std/isa/inst/V/vmfeq.vf.yaml +79 -0
- data/.data/spec/std/isa/inst/V/vmfeq.vv.yaml +77 -0
- data/.data/spec/std/isa/inst/V/vmfge.vf.yaml +79 -0
- data/.data/spec/std/isa/inst/V/vmfgt.vf.yaml +79 -0
- data/.data/spec/std/isa/inst/V/vmfle.vf.yaml +79 -0
- data/.data/spec/std/isa/inst/V/vmfle.vv.yaml +77 -0
- data/.data/spec/std/isa/inst/V/vmflt.vf.yaml +79 -0
- data/.data/spec/std/isa/inst/V/vmflt.vv.yaml +77 -0
- data/.data/spec/std/isa/inst/V/vmfne.vf.yaml +79 -0
- data/.data/spec/std/isa/inst/V/vmfne.vv.yaml +77 -0
- data/.data/spec/std/isa/inst/V/vmin.vv.yaml +134 -0
- data/.data/spec/std/isa/inst/V/vmin.vx.yaml +117 -0
- data/.data/spec/std/isa/inst/V/vminu.vv.yaml +134 -0
- data/.data/spec/std/isa/inst/V/vminu.vx.yaml +117 -0
- data/.data/spec/std/isa/inst/V/vmnand.mm.yaml +75 -0
- data/.data/spec/std/isa/inst/V/vmnor.mm.yaml +75 -0
- data/.data/spec/std/isa/inst/V/vmor.mm.yaml +75 -0
- data/.data/spec/std/isa/inst/V/vmorn.mm.yaml +31 -0
- data/.data/spec/std/isa/inst/V/vmsbc.vv.yaml +70 -0
- data/.data/spec/std/isa/inst/V/vmsbc.vvm.yaml +71 -0
- data/.data/spec/std/isa/inst/V/vmsbc.vx.yaml +70 -0
- data/.data/spec/std/isa/inst/V/vmsbc.vxm.yaml +71 -0
- data/.data/spec/std/isa/inst/V/vmsbf.m.yaml +69 -0
- data/.data/spec/std/isa/inst/V/vmseq.vi.yaml +77 -0
- data/.data/spec/std/isa/inst/V/vmseq.vv.yaml +77 -0
- data/.data/spec/std/isa/inst/V/vmseq.vx.yaml +79 -0
- data/.data/spec/std/isa/inst/V/vmsgt.vi.yaml +77 -0
- data/.data/spec/std/isa/inst/V/vmsgt.vx.yaml +79 -0
- data/.data/spec/std/isa/inst/V/vmsgtu.vi.yaml +77 -0
- data/.data/spec/std/isa/inst/V/vmsgtu.vx.yaml +79 -0
- data/.data/spec/std/isa/inst/V/vmsif.m.yaml +69 -0
- data/.data/spec/std/isa/inst/V/vmsle.vi.yaml +77 -0
- data/.data/spec/std/isa/inst/V/vmsle.vv.yaml +77 -0
- data/.data/spec/std/isa/inst/V/vmsle.vx.yaml +79 -0
- data/.data/spec/std/isa/inst/V/vmsleu.vi.yaml +77 -0
- data/.data/spec/std/isa/inst/V/vmsleu.vv.yaml +77 -0
- data/.data/spec/std/isa/inst/V/vmsleu.vx.yaml +79 -0
- data/.data/spec/std/isa/inst/V/vmslt.vv.yaml +77 -0
- data/.data/spec/std/isa/inst/V/vmslt.vx.yaml +79 -0
- data/.data/spec/std/isa/inst/V/vmsltu.vv.yaml +77 -0
- data/.data/spec/std/isa/inst/V/vmsltu.vx.yaml +79 -0
- data/.data/spec/std/isa/inst/V/vmsne.vi.yaml +77 -0
- data/.data/spec/std/isa/inst/V/vmsne.vv.yaml +77 -0
- data/.data/spec/std/isa/inst/V/vmsne.vx.yaml +79 -0
- data/.data/spec/std/isa/inst/V/vmsof.m.yaml +73 -0
- data/.data/spec/std/isa/inst/V/vmul.vv.yaml +116 -0
- data/.data/spec/std/isa/inst/V/vmul.vx.yaml +125 -0
- data/.data/spec/std/isa/inst/V/vmulh.vv.yaml +116 -0
- data/.data/spec/std/isa/inst/V/vmulh.vx.yaml +125 -0
- data/.data/spec/std/isa/inst/V/vmulhsu.vv.yaml +116 -0
- data/.data/spec/std/isa/inst/V/vmulhsu.vx.yaml +125 -0
- data/.data/spec/std/isa/inst/V/vmulhu.vv.yaml +116 -0
- data/.data/spec/std/isa/inst/V/vmulhu.vx.yaml +125 -0
- data/.data/spec/std/isa/inst/V/vmv.s.x.yaml +70 -0
- data/.data/spec/std/isa/inst/V/vmv.v.i.yaml +105 -0
- data/.data/spec/std/isa/inst/V/vmv.v.v.yaml +62 -0
- data/.data/spec/std/isa/inst/V/vmv.v.x.yaml +62 -0
- data/.data/spec/std/isa/inst/V/vmv.x.s.yaml +64 -0
- data/.data/spec/std/isa/inst/V/vmv1r.v.yaml +62 -0
- data/.data/spec/std/isa/inst/V/vmv2r.v.yaml +62 -0
- data/.data/spec/std/isa/inst/V/vmv4r.v.yaml +62 -0
- data/.data/spec/std/isa/inst/V/vmv8r.v.yaml +62 -0
- data/.data/spec/std/isa/inst/V/vmxnor.mm.yaml +75 -0
- data/.data/spec/std/isa/inst/V/vmxor.mm.yaml +75 -0
- data/.data/spec/std/isa/inst/V/vnclip.wi.yaml +87 -0
- data/.data/spec/std/isa/inst/V/vnclip.wv.yaml +87 -0
- data/.data/spec/std/isa/inst/V/vnclip.wx.yaml +87 -0
- data/.data/spec/std/isa/inst/V/vnclipu.wi.yaml +87 -0
- data/.data/spec/std/isa/inst/V/vnclipu.wv.yaml +87 -0
- data/.data/spec/std/isa/inst/V/vnclipu.wx.yaml +87 -0
- data/.data/spec/std/isa/inst/V/vnmsac.vv.yaml +74 -0
- data/.data/spec/std/isa/inst/V/vnmsac.vx.yaml +74 -0
- data/.data/spec/std/isa/inst/V/vnmsub.vv.yaml +74 -0
- data/.data/spec/std/isa/inst/V/vnmsub.vx.yaml +74 -0
- data/.data/spec/std/isa/inst/V/vnsra.wi.yaml +86 -0
- data/.data/spec/std/isa/inst/V/vnsra.wv.yaml +86 -0
- data/.data/spec/std/isa/inst/V/vnsra.wx.yaml +86 -0
- data/.data/spec/std/isa/inst/V/vnsrl.wi.yaml +86 -0
- data/.data/spec/std/isa/inst/V/vnsrl.wv.yaml +86 -0
- data/.data/spec/std/isa/inst/V/vnsrl.wx.yaml +86 -0
- data/.data/spec/std/isa/inst/V/vor.vi.yaml +101 -0
- data/.data/spec/std/isa/inst/V/vor.vv.yaml +134 -0
- data/.data/spec/std/isa/inst/V/vor.vx.yaml +117 -0
- data/.data/spec/std/isa/inst/V/vredand.vs.yaml +81 -0
- data/.data/spec/std/isa/inst/V/vredmax.vs.yaml +81 -0
- data/.data/spec/std/isa/inst/V/vredmaxu.vs.yaml +81 -0
- data/.data/spec/std/isa/inst/V/vredmin.vs.yaml +81 -0
- data/.data/spec/std/isa/inst/V/vredminu.vs.yaml +81 -0
- data/.data/spec/std/isa/inst/V/vredor.vs.yaml +81 -0
- data/.data/spec/std/isa/inst/V/vredsum.vs.yaml +81 -0
- data/.data/spec/std/isa/inst/V/vredxor.vs.yaml +81 -0
- data/.data/spec/std/isa/inst/V/vrem.vv.yaml +116 -0
- data/.data/spec/std/isa/inst/V/vrem.vx.yaml +125 -0
- data/.data/spec/std/isa/inst/V/vremu.vv.yaml +116 -0
- data/.data/spec/std/isa/inst/V/vremu.vx.yaml +125 -0
- data/.data/spec/std/isa/inst/V/vrgather.vi.yaml +87 -0
- data/.data/spec/std/isa/inst/V/vrgather.vv.yaml +134 -0
- data/.data/spec/std/isa/inst/V/vrgather.vx.yaml +87 -0
- data/.data/spec/std/isa/inst/V/vrgatherei16.vv.yaml +134 -0
- data/.data/spec/std/isa/inst/V/vrsub.vi.yaml +101 -0
- data/.data/spec/std/isa/inst/V/vrsub.vx.yaml +117 -0
- data/.data/spec/std/isa/inst/V/vs1r.v.yaml +29 -0
- data/.data/spec/std/isa/inst/V/vs2r.v.yaml +29 -0
- data/.data/spec/std/isa/inst/V/vs4r.v.yaml +29 -0
- data/.data/spec/std/isa/inst/V/vs8r.v.yaml +29 -0
- data/.data/spec/std/isa/inst/V/vsadd.vi.yaml +101 -0
- data/.data/spec/std/isa/inst/V/vsadd.vv.yaml +134 -0
- data/.data/spec/std/isa/inst/V/vsadd.vx.yaml +117 -0
- data/.data/spec/std/isa/inst/V/vsaddu.vi.yaml +101 -0
- data/.data/spec/std/isa/inst/V/vsaddu.vv.yaml +134 -0
- data/.data/spec/std/isa/inst/V/vsaddu.vx.yaml +117 -0
- data/.data/spec/std/isa/inst/V/vsbc.vvm.yaml +76 -0
- data/.data/spec/std/isa/inst/V/vsbc.vxm.yaml +76 -0
- data/.data/spec/std/isa/inst/V/vse16.v.yaml +52 -0
- data/.data/spec/std/isa/inst/V/vse32.v.yaml +52 -0
- data/.data/spec/std/isa/inst/V/vse64.v.yaml +52 -0
- data/.data/spec/std/isa/inst/V/vse8.v.yaml +60 -0
- data/.data/spec/std/isa/inst/V/vsetivli.yaml +122 -0
- data/.data/spec/std/isa/inst/V/vsetvl.yaml +147 -0
- data/.data/spec/std/isa/inst/V/vsetvli.yaml +174 -0
- data/.data/spec/std/isa/inst/V/vsext.vf2.yaml +75 -0
- data/.data/spec/std/isa/inst/V/vsext.vf4.yaml +75 -0
- data/.data/spec/std/isa/inst/V/vsext.vf8.yaml +75 -0
- data/.data/spec/std/isa/inst/V/vslide1down.vx.yaml +125 -0
- data/.data/spec/std/isa/inst/V/vslide1up.vx.yaml +125 -0
- data/.data/spec/std/isa/inst/V/vslidedown.vi.yaml +87 -0
- data/.data/spec/std/isa/inst/V/vslidedown.vx.yaml +87 -0
- data/.data/spec/std/isa/inst/V/vslideup.vi.yaml +87 -0
- data/.data/spec/std/isa/inst/V/vslideup.vx.yaml +87 -0
- data/.data/spec/std/isa/inst/V/vsll.vi.yaml +101 -0
- data/.data/spec/std/isa/inst/V/vsll.vv.yaml +134 -0
- data/.data/spec/std/isa/inst/V/vsll.vx.yaml +117 -0
- data/.data/spec/std/isa/inst/V/vsm.v.yaml +48 -0
- data/.data/spec/std/isa/inst/V/vsmul.vv.yaml +134 -0
- data/.data/spec/std/isa/inst/V/vsmul.vx.yaml +117 -0
- data/.data/spec/std/isa/inst/V/vsoxei16.v.yaml +54 -0
- data/.data/spec/std/isa/inst/V/vsoxei32.v.yaml +54 -0
- data/.data/spec/std/isa/inst/V/vsoxei64.v.yaml +54 -0
- data/.data/spec/std/isa/inst/V/vsoxei8.v.yaml +54 -0
- data/.data/spec/std/isa/inst/V/vsoxseg2ei16.v.yaml +33 -0
- data/.data/spec/std/isa/inst/V/vsoxseg2ei32.v.yaml +33 -0
- data/.data/spec/std/isa/inst/V/vsoxseg2ei64.v.yaml +33 -0
- data/.data/spec/std/isa/inst/V/vsoxseg2ei8.v.yaml +33 -0
- data/.data/spec/std/isa/inst/V/vsoxseg3ei16.v.yaml +33 -0
- data/.data/spec/std/isa/inst/V/vsoxseg3ei32.v.yaml +33 -0
- data/.data/spec/std/isa/inst/V/vsoxseg3ei64.v.yaml +33 -0
- data/.data/spec/std/isa/inst/V/vsoxseg3ei8.v.yaml +33 -0
- data/.data/spec/std/isa/inst/V/vsoxseg4ei16.v.yaml +33 -0
- data/.data/spec/std/isa/inst/V/vsoxseg4ei32.v.yaml +33 -0
- data/.data/spec/std/isa/inst/V/vsoxseg4ei64.v.yaml +33 -0
- data/.data/spec/std/isa/inst/V/vsoxseg4ei8.v.yaml +33 -0
- data/.data/spec/std/isa/inst/V/vsoxseg5ei16.v.yaml +33 -0
- data/.data/spec/std/isa/inst/V/vsoxseg5ei32.v.yaml +33 -0
- data/.data/spec/std/isa/inst/V/vsoxseg5ei64.v.yaml +33 -0
- data/.data/spec/std/isa/inst/V/vsoxseg5ei8.v.yaml +33 -0
- data/.data/spec/std/isa/inst/V/vsoxseg6ei16.v.yaml +33 -0
- data/.data/spec/std/isa/inst/V/vsoxseg6ei32.v.yaml +33 -0
- data/.data/spec/std/isa/inst/V/vsoxseg6ei64.v.yaml +33 -0
- data/.data/spec/std/isa/inst/V/vsoxseg6ei8.v.yaml +33 -0
- data/.data/spec/std/isa/inst/V/vsoxseg7ei16.v.yaml +33 -0
- data/.data/spec/std/isa/inst/V/vsoxseg7ei32.v.yaml +33 -0
- data/.data/spec/std/isa/inst/V/vsoxseg7ei64.v.yaml +33 -0
- data/.data/spec/std/isa/inst/V/vsoxseg7ei8.v.yaml +33 -0
- data/.data/spec/std/isa/inst/V/vsoxseg8ei16.v.yaml +33 -0
- data/.data/spec/std/isa/inst/V/vsoxseg8ei32.v.yaml +33 -0
- data/.data/spec/std/isa/inst/V/vsoxseg8ei64.v.yaml +33 -0
- data/.data/spec/std/isa/inst/V/vsoxseg8ei8.v.yaml +33 -0
- data/.data/spec/std/isa/inst/V/vsra.vi.yaml +101 -0
- data/.data/spec/std/isa/inst/V/vsra.vv.yaml +134 -0
- data/.data/spec/std/isa/inst/V/vsra.vx.yaml +117 -0
- data/.data/spec/std/isa/inst/V/vsrl.vi.yaml +101 -0
- data/.data/spec/std/isa/inst/V/vsrl.vv.yaml +134 -0
- data/.data/spec/std/isa/inst/V/vsrl.vx.yaml +117 -0
- data/.data/spec/std/isa/inst/V/vsse16.v.yaml +54 -0
- data/.data/spec/std/isa/inst/V/vsse32.v.yaml +54 -0
- data/.data/spec/std/isa/inst/V/vsse64.v.yaml +54 -0
- data/.data/spec/std/isa/inst/V/vsse8.v.yaml +54 -0
- data/.data/spec/std/isa/inst/V/vsseg2e16.v.yaml +31 -0
- data/.data/spec/std/isa/inst/V/vsseg2e32.v.yaml +31 -0
- data/.data/spec/std/isa/inst/V/vsseg2e64.v.yaml +31 -0
- data/.data/spec/std/isa/inst/V/vsseg2e8.v.yaml +31 -0
- data/.data/spec/std/isa/inst/V/vsseg3e16.v.yaml +31 -0
- data/.data/spec/std/isa/inst/V/vsseg3e32.v.yaml +31 -0
- data/.data/spec/std/isa/inst/V/vsseg3e64.v.yaml +31 -0
- data/.data/spec/std/isa/inst/V/vsseg3e8.v.yaml +31 -0
- data/.data/spec/std/isa/inst/V/vsseg4e16.v.yaml +31 -0
- data/.data/spec/std/isa/inst/V/vsseg4e32.v.yaml +31 -0
- data/.data/spec/std/isa/inst/V/vsseg4e64.v.yaml +31 -0
- data/.data/spec/std/isa/inst/V/vsseg4e8.v.yaml +31 -0
- data/.data/spec/std/isa/inst/V/vsseg5e16.v.yaml +31 -0
- data/.data/spec/std/isa/inst/V/vsseg5e32.v.yaml +31 -0
- data/.data/spec/std/isa/inst/V/vsseg5e64.v.yaml +31 -0
- data/.data/spec/std/isa/inst/V/vsseg5e8.v.yaml +31 -0
- data/.data/spec/std/isa/inst/V/vsseg6e16.v.yaml +31 -0
- data/.data/spec/std/isa/inst/V/vsseg6e32.v.yaml +31 -0
- data/.data/spec/std/isa/inst/V/vsseg6e64.v.yaml +31 -0
- data/.data/spec/std/isa/inst/V/vsseg6e8.v.yaml +31 -0
- data/.data/spec/std/isa/inst/V/vsseg7e16.v.yaml +31 -0
- data/.data/spec/std/isa/inst/V/vsseg7e32.v.yaml +31 -0
- data/.data/spec/std/isa/inst/V/vsseg7e64.v.yaml +31 -0
- data/.data/spec/std/isa/inst/V/vsseg7e8.v.yaml +31 -0
- data/.data/spec/std/isa/inst/V/vsseg8e16.v.yaml +31 -0
- data/.data/spec/std/isa/inst/V/vsseg8e32.v.yaml +31 -0
- data/.data/spec/std/isa/inst/V/vsseg8e64.v.yaml +31 -0
- data/.data/spec/std/isa/inst/V/vsseg8e8.v.yaml +31 -0
- data/.data/spec/std/isa/inst/V/vssra.vi.yaml +101 -0
- data/.data/spec/std/isa/inst/V/vssra.vv.yaml +134 -0
- data/.data/spec/std/isa/inst/V/vssra.vx.yaml +117 -0
- data/.data/spec/std/isa/inst/V/vssrl.vi.yaml +101 -0
- data/.data/spec/std/isa/inst/V/vssrl.vv.yaml +134 -0
- data/.data/spec/std/isa/inst/V/vssrl.vx.yaml +117 -0
- data/.data/spec/std/isa/inst/V/vssseg2e16.v.yaml +33 -0
- data/.data/spec/std/isa/inst/V/vssseg2e32.v.yaml +33 -0
- data/.data/spec/std/isa/inst/V/vssseg2e64.v.yaml +33 -0
- data/.data/spec/std/isa/inst/V/vssseg2e8.v.yaml +33 -0
- data/.data/spec/std/isa/inst/V/vssseg3e16.v.yaml +33 -0
- data/.data/spec/std/isa/inst/V/vssseg3e32.v.yaml +33 -0
- data/.data/spec/std/isa/inst/V/vssseg3e64.v.yaml +33 -0
- data/.data/spec/std/isa/inst/V/vssseg3e8.v.yaml +33 -0
- data/.data/spec/std/isa/inst/V/vssseg4e16.v.yaml +33 -0
- data/.data/spec/std/isa/inst/V/vssseg4e32.v.yaml +33 -0
- data/.data/spec/std/isa/inst/V/vssseg4e64.v.yaml +33 -0
- data/.data/spec/std/isa/inst/V/vssseg4e8.v.yaml +33 -0
- data/.data/spec/std/isa/inst/V/vssseg5e16.v.yaml +33 -0
- data/.data/spec/std/isa/inst/V/vssseg5e32.v.yaml +33 -0
- data/.data/spec/std/isa/inst/V/vssseg5e64.v.yaml +33 -0
- data/.data/spec/std/isa/inst/V/vssseg5e8.v.yaml +33 -0
- data/.data/spec/std/isa/inst/V/vssseg6e16.v.yaml +33 -0
- data/.data/spec/std/isa/inst/V/vssseg6e32.v.yaml +33 -0
- data/.data/spec/std/isa/inst/V/vssseg6e64.v.yaml +33 -0
- data/.data/spec/std/isa/inst/V/vssseg6e8.v.yaml +33 -0
- data/.data/spec/std/isa/inst/V/vssseg7e16.v.yaml +33 -0
- data/.data/spec/std/isa/inst/V/vssseg7e32.v.yaml +33 -0
- data/.data/spec/std/isa/inst/V/vssseg7e64.v.yaml +33 -0
- data/.data/spec/std/isa/inst/V/vssseg7e8.v.yaml +33 -0
- data/.data/spec/std/isa/inst/V/vssseg8e16.v.yaml +33 -0
- data/.data/spec/std/isa/inst/V/vssseg8e32.v.yaml +33 -0
- data/.data/spec/std/isa/inst/V/vssseg8e64.v.yaml +33 -0
- data/.data/spec/std/isa/inst/V/vssseg8e8.v.yaml +33 -0
- data/.data/spec/std/isa/inst/V/vssub.vv.yaml +134 -0
- data/.data/spec/std/isa/inst/V/vssub.vx.yaml +117 -0
- data/.data/spec/std/isa/inst/V/vssubu.vv.yaml +134 -0
- data/.data/spec/std/isa/inst/V/vssubu.vx.yaml +117 -0
- data/.data/spec/std/isa/inst/V/vsub.vv.yaml +134 -0
- data/.data/spec/std/isa/inst/V/vsub.vx.yaml +117 -0
- data/.data/spec/std/isa/inst/V/vsuxei16.v.yaml +54 -0
- data/.data/spec/std/isa/inst/V/vsuxei32.v.yaml +54 -0
- data/.data/spec/std/isa/inst/V/vsuxei64.v.yaml +54 -0
- data/.data/spec/std/isa/inst/V/vsuxei8.v.yaml +54 -0
- data/.data/spec/std/isa/inst/V/vsuxseg2ei16.v.yaml +33 -0
- data/.data/spec/std/isa/inst/V/vsuxseg2ei32.v.yaml +33 -0
- data/.data/spec/std/isa/inst/V/vsuxseg2ei64.v.yaml +33 -0
- data/.data/spec/std/isa/inst/V/vsuxseg2ei8.v.yaml +33 -0
- data/.data/spec/std/isa/inst/V/vsuxseg3ei16.v.yaml +33 -0
- data/.data/spec/std/isa/inst/V/vsuxseg3ei32.v.yaml +33 -0
- data/.data/spec/std/isa/inst/V/vsuxseg3ei64.v.yaml +33 -0
- data/.data/spec/std/isa/inst/V/vsuxseg3ei8.v.yaml +33 -0
- data/.data/spec/std/isa/inst/V/vsuxseg4ei16.v.yaml +33 -0
- data/.data/spec/std/isa/inst/V/vsuxseg4ei32.v.yaml +33 -0
- data/.data/spec/std/isa/inst/V/vsuxseg4ei64.v.yaml +33 -0
- data/.data/spec/std/isa/inst/V/vsuxseg4ei8.v.yaml +33 -0
- data/.data/spec/std/isa/inst/V/vsuxseg5ei16.v.yaml +33 -0
- data/.data/spec/std/isa/inst/V/vsuxseg5ei32.v.yaml +33 -0
- data/.data/spec/std/isa/inst/V/vsuxseg5ei64.v.yaml +33 -0
- data/.data/spec/std/isa/inst/V/vsuxseg5ei8.v.yaml +33 -0
- data/.data/spec/std/isa/inst/V/vsuxseg6ei16.v.yaml +33 -0
- data/.data/spec/std/isa/inst/V/vsuxseg6ei32.v.yaml +33 -0
- data/.data/spec/std/isa/inst/V/vsuxseg6ei64.v.yaml +33 -0
- data/.data/spec/std/isa/inst/V/vsuxseg6ei8.v.yaml +33 -0
- data/.data/spec/std/isa/inst/V/vsuxseg7ei16.v.yaml +33 -0
- data/.data/spec/std/isa/inst/V/vsuxseg7ei32.v.yaml +33 -0
- data/.data/spec/std/isa/inst/V/vsuxseg7ei64.v.yaml +33 -0
- data/.data/spec/std/isa/inst/V/vsuxseg7ei8.v.yaml +33 -0
- data/.data/spec/std/isa/inst/V/vsuxseg8ei16.v.yaml +33 -0
- data/.data/spec/std/isa/inst/V/vsuxseg8ei32.v.yaml +33 -0
- data/.data/spec/std/isa/inst/V/vsuxseg8ei64.v.yaml +33 -0
- data/.data/spec/std/isa/inst/V/vsuxseg8ei8.v.yaml +33 -0
- data/.data/spec/std/isa/inst/V/vwadd.vv.yaml +83 -0
- data/.data/spec/std/isa/inst/V/vwadd.vx.yaml +82 -0
- data/.data/spec/std/isa/inst/V/vwadd.wv.yaml +79 -0
- data/.data/spec/std/isa/inst/V/vwadd.wx.yaml +78 -0
- data/.data/spec/std/isa/inst/V/vwaddu.vv.yaml +83 -0
- data/.data/spec/std/isa/inst/V/vwaddu.vx.yaml +82 -0
- data/.data/spec/std/isa/inst/V/vwaddu.wv.yaml +79 -0
- data/.data/spec/std/isa/inst/V/vwaddu.wx.yaml +78 -0
- data/.data/spec/std/isa/inst/V/vwmacc.vv.yaml +79 -0
- data/.data/spec/std/isa/inst/V/vwmacc.vx.yaml +79 -0
- data/.data/spec/std/isa/inst/V/vwmaccsu.vv.yaml +79 -0
- data/.data/spec/std/isa/inst/V/vwmaccsu.vx.yaml +79 -0
- data/.data/spec/std/isa/inst/V/vwmaccu.vv.yaml +79 -0
- data/.data/spec/std/isa/inst/V/vwmaccu.vx.yaml +79 -0
- data/.data/spec/std/isa/inst/V/vwmaccus.vx.yaml +79 -0
- data/.data/spec/std/isa/inst/V/vwmul.vv.yaml +83 -0
- data/.data/spec/std/isa/inst/V/vwmul.vx.yaml +82 -0
- data/.data/spec/std/isa/inst/V/vwmulsu.vv.yaml +83 -0
- data/.data/spec/std/isa/inst/V/vwmulsu.vx.yaml +82 -0
- data/.data/spec/std/isa/inst/V/vwmulu.vv.yaml +83 -0
- data/.data/spec/std/isa/inst/V/vwmulu.vx.yaml +82 -0
- data/.data/spec/std/isa/inst/V/vwredsum.vs.yaml +79 -0
- data/.data/spec/std/isa/inst/V/vwredsumu.vs.yaml +79 -0
- data/.data/spec/std/isa/inst/V/vwsub.vv.yaml +83 -0
- data/.data/spec/std/isa/inst/V/vwsub.vx.yaml +82 -0
- data/.data/spec/std/isa/inst/V/vwsub.wv.yaml +79 -0
- data/.data/spec/std/isa/inst/V/vwsub.wx.yaml +78 -0
- data/.data/spec/std/isa/inst/V/vwsubu.vv.yaml +83 -0
- data/.data/spec/std/isa/inst/V/vwsubu.vx.yaml +82 -0
- data/.data/spec/std/isa/inst/V/vwsubu.wv.yaml +79 -0
- data/.data/spec/std/isa/inst/V/vwsubu.wx.yaml +78 -0
- data/.data/spec/std/isa/inst/V/vxor.vi.yaml +101 -0
- data/.data/spec/std/isa/inst/V/vxor.vv.yaml +134 -0
- data/.data/spec/std/isa/inst/V/vxor.vx.yaml +117 -0
- data/.data/spec/std/isa/inst/V/vzext.vf2.yaml +75 -0
- data/.data/spec/std/isa/inst/V/vzext.vf4.yaml +75 -0
- data/.data/spec/std/isa/inst/V/vzext.vf8.yaml +75 -0
- data/.data/spec/std/isa/inst/Zaamo/amoadd.SIZE.AQRL.layout +181 -0
- data/.data/spec/std/isa/inst/Zaamo/amoadd.d.aq.yaml +145 -0
- data/.data/spec/std/isa/inst/Zaamo/amoadd.d.aqrl.yaml +147 -0
- data/.data/spec/std/isa/inst/Zaamo/amoadd.d.rl.yaml +145 -0
- data/.data/spec/std/isa/inst/Zaamo/amoadd.d.yaml +143 -0
- data/.data/spec/std/isa/inst/Zaamo/amoadd.w.aq.yaml +143 -0
- data/.data/spec/std/isa/inst/Zaamo/amoadd.w.aqrl.yaml +145 -0
- data/.data/spec/std/isa/inst/Zaamo/amoadd.w.rl.yaml +143 -0
- data/.data/spec/std/isa/inst/Zaamo/amoadd.w.yaml +141 -0
- data/.data/spec/std/isa/inst/Zaamo/amoand.SIZE.AQRL.layout +181 -0
- data/.data/spec/std/isa/inst/Zaamo/amoand.d.aq.yaml +145 -0
- data/.data/spec/std/isa/inst/Zaamo/amoand.d.aqrl.yaml +147 -0
- data/.data/spec/std/isa/inst/Zaamo/amoand.d.rl.yaml +145 -0
- data/.data/spec/std/isa/inst/Zaamo/amoand.d.yaml +143 -0
- data/.data/spec/std/isa/inst/Zaamo/amoand.w.aq.yaml +143 -0
- data/.data/spec/std/isa/inst/Zaamo/amoand.w.aqrl.yaml +145 -0
- data/.data/spec/std/isa/inst/Zaamo/amoand.w.rl.yaml +143 -0
- data/.data/spec/std/isa/inst/Zaamo/amoand.w.yaml +141 -0
- data/.data/spec/std/isa/inst/Zaamo/amomax.SIZE.AQRL.layout +181 -0
- data/.data/spec/std/isa/inst/Zaamo/amomax.d.aq.yaml +145 -0
- data/.data/spec/std/isa/inst/Zaamo/amomax.d.aqrl.yaml +147 -0
- data/.data/spec/std/isa/inst/Zaamo/amomax.d.rl.yaml +145 -0
- data/.data/spec/std/isa/inst/Zaamo/amomax.d.yaml +143 -0
- data/.data/spec/std/isa/inst/Zaamo/amomax.w.aq.yaml +143 -0
- data/.data/spec/std/isa/inst/Zaamo/amomax.w.aqrl.yaml +145 -0
- data/.data/spec/std/isa/inst/Zaamo/amomax.w.rl.yaml +143 -0
- data/.data/spec/std/isa/inst/Zaamo/amomax.w.yaml +141 -0
- data/.data/spec/std/isa/inst/Zaamo/amomaxu.SIZE.AQRL.layout +181 -0
- data/.data/spec/std/isa/inst/Zaamo/amomaxu.d.aq.yaml +145 -0
- data/.data/spec/std/isa/inst/Zaamo/amomaxu.d.aqrl.yaml +147 -0
- data/.data/spec/std/isa/inst/Zaamo/amomaxu.d.rl.yaml +145 -0
- data/.data/spec/std/isa/inst/Zaamo/amomaxu.d.yaml +143 -0
- data/.data/spec/std/isa/inst/Zaamo/amomaxu.w.aq.yaml +143 -0
- data/.data/spec/std/isa/inst/Zaamo/amomaxu.w.aqrl.yaml +145 -0
- data/.data/spec/std/isa/inst/Zaamo/amomaxu.w.rl.yaml +143 -0
- data/.data/spec/std/isa/inst/Zaamo/amomaxu.w.yaml +141 -0
- data/.data/spec/std/isa/inst/Zaamo/amomin.SIZE.AQRL.layout +181 -0
- data/.data/spec/std/isa/inst/Zaamo/amomin.d.aq.yaml +145 -0
- data/.data/spec/std/isa/inst/Zaamo/amomin.d.aqrl.yaml +147 -0
- data/.data/spec/std/isa/inst/Zaamo/amomin.d.rl.yaml +145 -0
- data/.data/spec/std/isa/inst/Zaamo/amomin.d.yaml +143 -0
- data/.data/spec/std/isa/inst/Zaamo/amomin.w.aq.yaml +143 -0
- data/.data/spec/std/isa/inst/Zaamo/amomin.w.aqrl.yaml +145 -0
- data/.data/spec/std/isa/inst/Zaamo/amomin.w.rl.yaml +143 -0
- data/.data/spec/std/isa/inst/Zaamo/amomin.w.yaml +141 -0
- data/.data/spec/std/isa/inst/Zaamo/amominu.SIZE.AQRL.layout +181 -0
- data/.data/spec/std/isa/inst/Zaamo/amominu.d.aq.yaml +145 -0
- data/.data/spec/std/isa/inst/Zaamo/amominu.d.aqrl.yaml +147 -0
- data/.data/spec/std/isa/inst/Zaamo/amominu.d.rl.yaml +145 -0
- data/.data/spec/std/isa/inst/Zaamo/amominu.d.yaml +143 -0
- data/.data/spec/std/isa/inst/Zaamo/amominu.w.aq.yaml +143 -0
- data/.data/spec/std/isa/inst/Zaamo/amominu.w.aqrl.yaml +145 -0
- data/.data/spec/std/isa/inst/Zaamo/amominu.w.rl.yaml +143 -0
- data/.data/spec/std/isa/inst/Zaamo/amominu.w.yaml +141 -0
- data/.data/spec/std/isa/inst/Zaamo/amoor.SIZE.AQRL.layout +181 -0
- data/.data/spec/std/isa/inst/Zaamo/amoor.d.aq.yaml +145 -0
- data/.data/spec/std/isa/inst/Zaamo/amoor.d.aqrl.yaml +147 -0
- data/.data/spec/std/isa/inst/Zaamo/amoor.d.rl.yaml +145 -0
- data/.data/spec/std/isa/inst/Zaamo/amoor.d.yaml +143 -0
- data/.data/spec/std/isa/inst/Zaamo/amoor.w.aq.yaml +143 -0
- data/.data/spec/std/isa/inst/Zaamo/amoor.w.aqrl.yaml +145 -0
- data/.data/spec/std/isa/inst/Zaamo/amoor.w.rl.yaml +143 -0
- data/.data/spec/std/isa/inst/Zaamo/amoor.w.yaml +141 -0
- data/.data/spec/std/isa/inst/Zaamo/amoswap.SIZE.AQRL.layout +180 -0
- data/.data/spec/std/isa/inst/Zaamo/amoswap.d.aq.yaml +144 -0
- data/.data/spec/std/isa/inst/Zaamo/amoswap.d.aqrl.yaml +146 -0
- data/.data/spec/std/isa/inst/Zaamo/amoswap.d.rl.yaml +144 -0
- data/.data/spec/std/isa/inst/Zaamo/amoswap.d.yaml +142 -0
- data/.data/spec/std/isa/inst/Zaamo/amoswap.w.aq.yaml +142 -0
- data/.data/spec/std/isa/inst/Zaamo/amoswap.w.aqrl.yaml +144 -0
- data/.data/spec/std/isa/inst/Zaamo/amoswap.w.rl.yaml +142 -0
- data/.data/spec/std/isa/inst/Zaamo/amoswap.w.yaml +140 -0
- data/.data/spec/std/isa/inst/Zaamo/amoxor.SIZE.AQRL.layout +181 -0
- data/.data/spec/std/isa/inst/Zaamo/amoxor.d.aq.yaml +145 -0
- data/.data/spec/std/isa/inst/Zaamo/amoxor.d.aqrl.yaml +147 -0
- data/.data/spec/std/isa/inst/Zaamo/amoxor.d.rl.yaml +145 -0
- data/.data/spec/std/isa/inst/Zaamo/amoxor.d.yaml +143 -0
- data/.data/spec/std/isa/inst/Zaamo/amoxor.w.aq.yaml +143 -0
- data/.data/spec/std/isa/inst/Zaamo/amoxor.w.aqrl.yaml +145 -0
- data/.data/spec/std/isa/inst/Zaamo/amoxor.w.rl.yaml +143 -0
- data/.data/spec/std/isa/inst/Zaamo/amoxor.w.yaml +141 -0
- data/.data/spec/std/isa/inst/Zabha/amoadd.b.aq.yaml +143 -0
- data/.data/spec/std/isa/inst/Zabha/amoadd.b.aqrl.yaml +145 -0
- data/.data/spec/std/isa/inst/Zabha/amoadd.b.rl.yaml +143 -0
- data/.data/spec/std/isa/inst/Zabha/amoadd.b.yaml +141 -0
- data/.data/spec/std/isa/inst/Zabha/amoadd.h.aq.yaml +143 -0
- data/.data/spec/std/isa/inst/Zabha/amoadd.h.aqrl.yaml +145 -0
- data/.data/spec/std/isa/inst/Zabha/amoadd.h.rl.yaml +143 -0
- data/.data/spec/std/isa/inst/Zabha/amoadd.h.yaml +141 -0
- data/.data/spec/std/isa/inst/Zabha/amoand.b.aq.yaml +143 -0
- data/.data/spec/std/isa/inst/Zabha/amoand.b.aqrl.yaml +145 -0
- data/.data/spec/std/isa/inst/Zabha/amoand.b.rl.yaml +143 -0
- data/.data/spec/std/isa/inst/Zabha/amoand.b.yaml +141 -0
- data/.data/spec/std/isa/inst/Zabha/amoand.h.aq.yaml +143 -0
- data/.data/spec/std/isa/inst/Zabha/amoand.h.aqrl.yaml +145 -0
- data/.data/spec/std/isa/inst/Zabha/amoand.h.rl.yaml +143 -0
- data/.data/spec/std/isa/inst/Zabha/amoand.h.yaml +141 -0
- data/.data/spec/std/isa/inst/Zabha/amocas.b.aq.yaml +135 -0
- data/.data/spec/std/isa/inst/Zabha/amocas.b.aqrl.yaml +137 -0
- data/.data/spec/std/isa/inst/Zabha/amocas.b.rl.yaml +135 -0
- data/.data/spec/std/isa/inst/Zabha/amocas.b.yaml +133 -0
- data/.data/spec/std/isa/inst/Zabha/amocas.h.aq.yaml +135 -0
- data/.data/spec/std/isa/inst/Zabha/amocas.h.aqrl.yaml +137 -0
- data/.data/spec/std/isa/inst/Zabha/amocas.h.rl.yaml +135 -0
- data/.data/spec/std/isa/inst/Zabha/amocas.h.yaml +133 -0
- data/.data/spec/std/isa/inst/Zabha/amomax.b.aq.yaml +143 -0
- data/.data/spec/std/isa/inst/Zabha/amomax.b.aqrl.yaml +145 -0
- data/.data/spec/std/isa/inst/Zabha/amomax.b.rl.yaml +143 -0
- data/.data/spec/std/isa/inst/Zabha/amomax.b.yaml +141 -0
- data/.data/spec/std/isa/inst/Zabha/amomax.h.aq.yaml +143 -0
- data/.data/spec/std/isa/inst/Zabha/amomax.h.aqrl.yaml +145 -0
- data/.data/spec/std/isa/inst/Zabha/amomax.h.rl.yaml +143 -0
- data/.data/spec/std/isa/inst/Zabha/amomax.h.yaml +141 -0
- data/.data/spec/std/isa/inst/Zabha/amomaxu.b.aq.yaml +143 -0
- data/.data/spec/std/isa/inst/Zabha/amomaxu.b.aqrl.yaml +145 -0
- data/.data/spec/std/isa/inst/Zabha/amomaxu.b.rl.yaml +143 -0
- data/.data/spec/std/isa/inst/Zabha/amomaxu.b.yaml +141 -0
- data/.data/spec/std/isa/inst/Zabha/amomaxu.h.aq.yaml +143 -0
- data/.data/spec/std/isa/inst/Zabha/amomaxu.h.aqrl.yaml +145 -0
- data/.data/spec/std/isa/inst/Zabha/amomaxu.h.rl.yaml +143 -0
- data/.data/spec/std/isa/inst/Zabha/amomaxu.h.yaml +141 -0
- data/.data/spec/std/isa/inst/Zabha/amomin.b.aq.yaml +143 -0
- data/.data/spec/std/isa/inst/Zabha/amomin.b.aqrl.yaml +145 -0
- data/.data/spec/std/isa/inst/Zabha/amomin.b.rl.yaml +143 -0
- data/.data/spec/std/isa/inst/Zabha/amomin.b.yaml +141 -0
- data/.data/spec/std/isa/inst/Zabha/amomin.h.aq.yaml +143 -0
- data/.data/spec/std/isa/inst/Zabha/amomin.h.aqrl.yaml +145 -0
- data/.data/spec/std/isa/inst/Zabha/amomin.h.rl.yaml +143 -0
- data/.data/spec/std/isa/inst/Zabha/amomin.h.yaml +141 -0
- data/.data/spec/std/isa/inst/Zabha/amominu.b.aq.yaml +143 -0
- data/.data/spec/std/isa/inst/Zabha/amominu.b.aqrl.yaml +145 -0
- data/.data/spec/std/isa/inst/Zabha/amominu.b.rl.yaml +143 -0
- data/.data/spec/std/isa/inst/Zabha/amominu.b.yaml +141 -0
- data/.data/spec/std/isa/inst/Zabha/amominu.h.aq.yaml +143 -0
- data/.data/spec/std/isa/inst/Zabha/amominu.h.aqrl.yaml +145 -0
- data/.data/spec/std/isa/inst/Zabha/amominu.h.rl.yaml +143 -0
- data/.data/spec/std/isa/inst/Zabha/amominu.h.yaml +141 -0
- data/.data/spec/std/isa/inst/Zabha/amoor.b.aq.yaml +143 -0
- data/.data/spec/std/isa/inst/Zabha/amoor.b.aqrl.yaml +145 -0
- data/.data/spec/std/isa/inst/Zabha/amoor.b.rl.yaml +143 -0
- data/.data/spec/std/isa/inst/Zabha/amoor.b.yaml +141 -0
- data/.data/spec/std/isa/inst/Zabha/amoor.h.aq.yaml +143 -0
- data/.data/spec/std/isa/inst/Zabha/amoor.h.aqrl.yaml +145 -0
- data/.data/spec/std/isa/inst/Zabha/amoor.h.rl.yaml +143 -0
- data/.data/spec/std/isa/inst/Zabha/amoor.h.yaml +141 -0
- data/.data/spec/std/isa/inst/Zabha/amoswap.b.aq.yaml +142 -0
- data/.data/spec/std/isa/inst/Zabha/amoswap.b.aqrl.yaml +144 -0
- data/.data/spec/std/isa/inst/Zabha/amoswap.b.rl.yaml +142 -0
- data/.data/spec/std/isa/inst/Zabha/amoswap.b.yaml +140 -0
- data/.data/spec/std/isa/inst/Zabha/amoswap.h.aq.yaml +142 -0
- data/.data/spec/std/isa/inst/Zabha/amoswap.h.aqrl.yaml +144 -0
- data/.data/spec/std/isa/inst/Zabha/amoswap.h.rl.yaml +142 -0
- data/.data/spec/std/isa/inst/Zabha/amoswap.h.yaml +140 -0
- data/.data/spec/std/isa/inst/Zabha/amoxor.b.aq.yaml +143 -0
- data/.data/spec/std/isa/inst/Zabha/amoxor.b.aqrl.yaml +145 -0
- data/.data/spec/std/isa/inst/Zabha/amoxor.b.rl.yaml +143 -0
- data/.data/spec/std/isa/inst/Zabha/amoxor.b.yaml +141 -0
- data/.data/spec/std/isa/inst/Zabha/amoxor.h.aq.yaml +143 -0
- data/.data/spec/std/isa/inst/Zabha/amoxor.h.aqrl.yaml +145 -0
- data/.data/spec/std/isa/inst/Zabha/amoxor.h.rl.yaml +143 -0
- data/.data/spec/std/isa/inst/Zabha/amoxor.h.yaml +141 -0
- data/.data/spec/std/isa/inst/Zacas/amocas.SIZE.AQRL.layout +174 -0
- data/.data/spec/std/isa/inst/Zacas/amocas.d.aq.yaml +135 -0
- data/.data/spec/std/isa/inst/Zacas/amocas.d.aqrl.yaml +137 -0
- data/.data/spec/std/isa/inst/Zacas/amocas.d.rl.yaml +135 -0
- data/.data/spec/std/isa/inst/Zacas/amocas.d.yaml +133 -0
- data/.data/spec/std/isa/inst/Zacas/amocas.q.aq.yaml +137 -0
- data/.data/spec/std/isa/inst/Zacas/amocas.q.aqrl.yaml +139 -0
- data/.data/spec/std/isa/inst/Zacas/amocas.q.rl.yaml +137 -0
- data/.data/spec/std/isa/inst/Zacas/amocas.q.yaml +135 -0
- data/.data/spec/std/isa/inst/Zacas/amocas.w.aq.yaml +135 -0
- data/.data/spec/std/isa/inst/Zacas/amocas.w.aqrl.yaml +137 -0
- data/.data/spec/std/isa/inst/Zacas/amocas.w.rl.yaml +135 -0
- data/.data/spec/std/isa/inst/Zacas/amocas.w.yaml +133 -0
- data/.data/spec/std/isa/inst/Zalasr/lSIZE.AQRL.layout +80 -0
- data/.data/spec/std/isa/inst/Zalasr/lb.aq.yaml +65 -0
- data/.data/spec/std/isa/inst/Zalasr/lb.aqrl.yaml +65 -0
- data/.data/spec/std/isa/inst/Zalasr/ld.aq.yaml +65 -0
- data/.data/spec/std/isa/inst/Zalasr/ld.aqrl.yaml +65 -0
- data/.data/spec/std/isa/inst/Zalasr/lh.aq.yaml +65 -0
- data/.data/spec/std/isa/inst/Zalasr/lh.aqrl.yaml +65 -0
- data/.data/spec/std/isa/inst/Zalasr/lw.aq.yaml +65 -0
- data/.data/spec/std/isa/inst/Zalasr/lw.aqrl.yaml +65 -0
- data/.data/spec/std/isa/inst/Zalasr/sSIZE.AQRL.layout +95 -0
- data/.data/spec/std/isa/inst/Zalasr/sb.aqrl.yaml +80 -0
- data/.data/spec/std/isa/inst/Zalasr/sb.rl.yaml +80 -0
- data/.data/spec/std/isa/inst/Zalasr/sd.aqrl.yaml +80 -0
- data/.data/spec/std/isa/inst/Zalasr/sd.rl.yaml +80 -0
- data/.data/spec/std/isa/inst/Zalasr/sh.aqrl.yaml +80 -0
- data/.data/spec/std/isa/inst/Zalasr/sh.rl.yaml +80 -0
- data/.data/spec/std/isa/inst/Zalasr/sw.aqrl.yaml +80 -0
- data/.data/spec/std/isa/inst/Zalasr/sw.rl.yaml +80 -0
- data/.data/spec/std/isa/inst/Zalrsc/lr.SIZE.AQRL.layout +205 -0
- data/.data/spec/std/isa/inst/Zalrsc/lr.d.aq.yaml +151 -0
- data/.data/spec/std/isa/inst/Zalrsc/lr.d.aqrl.yaml +151 -0
- data/.data/spec/std/isa/inst/Zalrsc/lr.d.rl.yaml +151 -0
- data/.data/spec/std/isa/inst/Zalrsc/lr.d.yaml +151 -0
- data/.data/spec/std/isa/inst/Zalrsc/lr.w.aq.yaml +158 -0
- data/.data/spec/std/isa/inst/Zalrsc/lr.w.aqrl.yaml +158 -0
- data/.data/spec/std/isa/inst/Zalrsc/lr.w.rl.yaml +158 -0
- data/.data/spec/std/isa/inst/Zalrsc/lr.w.yaml +158 -0
- data/.data/spec/std/isa/inst/Zalrsc/sc.SIZE.AQRL.layout +288 -0
- data/.data/spec/std/isa/inst/Zalrsc/sc.d.aq.yaml +245 -0
- data/.data/spec/std/isa/inst/Zalrsc/sc.d.aqrl.yaml +245 -0
- data/.data/spec/std/isa/inst/Zalrsc/sc.d.rl.yaml +245 -0
- data/.data/spec/std/isa/inst/Zalrsc/sc.d.yaml +245 -0
- data/.data/spec/std/isa/inst/Zalrsc/sc.w.aq.yaml +247 -0
- data/.data/spec/std/isa/inst/Zalrsc/sc.w.aqrl.yaml +247 -0
- data/.data/spec/std/isa/inst/Zalrsc/sc.w.rl.yaml +247 -0
- data/.data/spec/std/isa/inst/Zalrsc/sc.w.yaml +247 -0
- data/.data/spec/std/isa/inst/Zawrs/wrs.nto.yaml +77 -0
- data/.data/spec/std/isa/inst/Zawrs/wrs.sto.yaml +57 -0
- data/.data/spec/std/isa/inst/Zba/add.uw.yaml +63 -0
- data/.data/spec/std/isa/inst/Zba/sh1add.uw.yaml +59 -0
- data/.data/spec/std/isa/inst/Zba/sh1add.yaml +54 -0
- data/.data/spec/std/isa/inst/Zba/sh2add.uw.yaml +59 -0
- data/.data/spec/std/isa/inst/Zba/sh2add.yaml +54 -0
- data/.data/spec/std/isa/inst/Zba/sh3add.uw.yaml +59 -0
- data/.data/spec/std/isa/inst/Zba/sh3add.yaml +54 -0
- data/.data/spec/std/isa/inst/Zba/slli.uw.yaml +54 -0
- data/.data/spec/std/isa/inst/Zbb/clz.yaml +54 -0
- data/.data/spec/std/isa/inst/Zbb/clzw.yaml +55 -0
- data/.data/spec/std/isa/inst/Zbb/cpop.yaml +69 -0
- data/.data/spec/std/isa/inst/Zbb/cpopw.yaml +71 -0
- data/.data/spec/std/isa/inst/Zbb/ctz.yaml +59 -0
- data/.data/spec/std/isa/inst/Zbb/ctzw.yaml +57 -0
- data/.data/spec/std/isa/inst/Zbb/max.yaml +71 -0
- data/.data/spec/std/isa/inst/Zbb/maxu.yaml +63 -0
- data/.data/spec/std/isa/inst/Zbb/min.yaml +63 -0
- data/.data/spec/std/isa/inst/Zbb/minu.yaml +63 -0
- data/.data/spec/std/isa/inst/Zbb/orc.b.yaml +59 -0
- data/.data/spec/std/isa/inst/Zbb/sext.b.yaml +55 -0
- data/.data/spec/std/isa/inst/Zbb/sext.h.yaml +55 -0
- data/.data/spec/std/isa/inst/Zbb/zext.h.yaml +69 -0
- data/.data/spec/std/isa/inst/Zbc/clmulr.yaml +61 -0
- data/.data/spec/std/isa/inst/Zbkb/brev8.yaml +51 -0
- data/.data/spec/std/isa/inst/Zbkb/pack.yaml +34 -0
- data/.data/spec/std/isa/inst/Zbkb/packh.yaml +31 -0
- data/.data/spec/std/isa/inst/Zbkb/packw.yaml +36 -0
- data/.data/spec/std/isa/inst/Zbkb/unzip.yaml +53 -0
- data/.data/spec/std/isa/inst/Zbkb/zip.yaml +53 -0
- data/.data/spec/std/isa/inst/Zbkx/xperm4.yaml +64 -0
- data/.data/spec/std/isa/inst/Zbkx/xperm8.yaml +64 -0
- data/.data/spec/std/isa/inst/Zbs/bclr.yaml +59 -0
- data/.data/spec/std/isa/inst/Zbs/bclri.yaml +69 -0
- data/.data/spec/std/isa/inst/Zbs/bext.yaml +59 -0
- data/.data/spec/std/isa/inst/Zbs/bexti.yaml +69 -0
- data/.data/spec/std/isa/inst/Zbs/binv.yaml +59 -0
- data/.data/spec/std/isa/inst/Zbs/binvi.yaml +69 -0
- data/.data/spec/std/isa/inst/Zbs/bset.yaml +59 -0
- data/.data/spec/std/isa/inst/Zbs/bseti.yaml +69 -0
- data/.data/spec/std/isa/inst/Zcb/c.lbu.yaml +72 -0
- data/.data/spec/std/isa/inst/Zcb/c.lh.yaml +73 -0
- data/.data/spec/std/isa/inst/Zcb/c.lhu.yaml +73 -0
- data/.data/spec/std/isa/inst/Zcb/c.mul.yaml +53 -0
- data/.data/spec/std/isa/inst/Zcb/c.not.yaml +45 -0
- data/.data/spec/std/isa/inst/Zcb/c.sb.yaml +39 -0
- data/.data/spec/std/isa/inst/Zcb/c.sext.b.yaml +60 -0
- data/.data/spec/std/isa/inst/Zcb/c.sext.h.yaml +60 -0
- data/.data/spec/std/isa/inst/Zcb/c.sh.yaml +40 -0
- data/.data/spec/std/isa/inst/Zcb/c.zext.b.yaml +60 -0
- data/.data/spec/std/isa/inst/Zcb/c.zext.h.yaml +60 -0
- data/.data/spec/std/isa/inst/Zcb/c.zext.w.yaml +61 -0
- data/.data/spec/std/isa/inst/Zcd/c.fld.yaml +41 -0
- data/.data/spec/std/isa/inst/Zcd/c.fldsp.yaml +42 -0
- data/.data/spec/std/isa/inst/Zcd/c.fsd.yaml +41 -0
- data/.data/spec/std/isa/inst/Zcd/c.fsdsp.yaml +42 -0
- data/.data/spec/std/isa/inst/Zcf/c.flw.yaml +41 -0
- data/.data/spec/std/isa/inst/Zcf/c.flwsp.yaml +42 -0
- data/.data/spec/std/isa/inst/Zcf/c.fsw.yaml +41 -0
- data/.data/spec/std/isa/inst/Zcf/c.fswsp.yaml +42 -0
- data/.data/spec/std/isa/inst/Zcmop/c.mop.1.yaml +31 -0
- data/.data/spec/std/isa/inst/Zcmop/c.mop.11.yaml +31 -0
- data/.data/spec/std/isa/inst/Zcmop/c.mop.13.yaml +31 -0
- data/.data/spec/std/isa/inst/Zcmop/c.mop.15.yaml +31 -0
- data/.data/spec/std/isa/inst/Zcmop/c.mop.3.yaml +31 -0
- data/.data/spec/std/isa/inst/Zcmop/c.mop.5.yaml +31 -0
- data/.data/spec/std/isa/inst/Zcmop/c.mop.7.yaml +31 -0
- data/.data/spec/std/isa/inst/Zcmop/c.mop.9.yaml +31 -0
- data/.data/spec/std/isa/inst/Zcmop/c.mop.N.layout +45 -0
- data/.data/spec/std/isa/inst/Zcmp/cm.mva01s.yaml +36 -0
- data/.data/spec/std/isa/inst/Zcmp/cm.mvsa01.yaml +38 -0
- data/.data/spec/std/isa/inst/Zcmp/cm.pop.yaml +86 -0
- data/.data/spec/std/isa/inst/Zcmp/cm.popret.yaml +87 -0
- data/.data/spec/std/isa/inst/Zcmp/cm.popretz.yaml +88 -0
- data/.data/spec/std/isa/inst/Zcmp/cm.push.yaml +87 -0
- data/.data/spec/std/isa/inst/Zcmt/cm.jalt.yaml +65 -0
- data/.data/spec/std/isa/inst/Zcmt/cm.jt.yaml +60 -0
- data/.data/spec/std/isa/inst/Zfa/fli.s.yaml +74 -0
- data/.data/spec/std/isa/inst/Zfa/fmaxm.s.yaml +55 -0
- data/.data/spec/std/isa/inst/Zfa/fminm.s.yaml +55 -0
- data/.data/spec/std/isa/inst/Zfa/fround.s.yaml +63 -0
- data/.data/spec/std/isa/inst/Zfa/froundnx.s.yaml +53 -0
- data/.data/spec/std/isa/inst/Zfbfmin/fcvt.bf16.s.yaml +31 -0
- data/.data/spec/std/isa/inst/Zfbfmin/fcvt.s.bf16.yaml +31 -0
- data/.data/spec/std/isa/inst/Zfh/fadd.h.yaml +35 -0
- data/.data/spec/std/isa/inst/Zfh/fclass.h.yaml +31 -0
- data/.data/spec/std/isa/inst/Zfh/fcvt.d.h.yaml +37 -0
- data/.data/spec/std/isa/inst/Zfh/fcvt.h.d.yaml +37 -0
- data/.data/spec/std/isa/inst/Zfh/fcvt.h.l.yaml +35 -0
- data/.data/spec/std/isa/inst/Zfh/fcvt.h.lu.yaml +35 -0
- data/.data/spec/std/isa/inst/Zfh/fcvt.h.s.yaml +94 -0
- data/.data/spec/std/isa/inst/Zfh/fcvt.h.w.yaml +33 -0
- data/.data/spec/std/isa/inst/Zfh/fcvt.h.wu.yaml +33 -0
- data/.data/spec/std/isa/inst/Zfh/fcvt.l.h.yaml +35 -0
- data/.data/spec/std/isa/inst/Zfh/fcvt.lu.h.yaml +35 -0
- data/.data/spec/std/isa/inst/Zfh/fcvt.s.h.yaml +91 -0
- data/.data/spec/std/isa/inst/Zfh/fcvt.w.h.yaml +33 -0
- data/.data/spec/std/isa/inst/Zfh/fcvt.wu.h.yaml +33 -0
- data/.data/spec/std/isa/inst/Zfh/fdiv.h.yaml +35 -0
- data/.data/spec/std/isa/inst/Zfh/feq.h.yaml +33 -0
- data/.data/spec/std/isa/inst/Zfh/fle.h.yaml +33 -0
- data/.data/spec/std/isa/inst/Zfh/fleq.h.yaml +33 -0
- data/.data/spec/std/isa/inst/Zfh/flh.yaml +78 -0
- data/.data/spec/std/isa/inst/Zfh/fli.h.yaml +31 -0
- data/.data/spec/std/isa/inst/Zfh/flt.h.yaml +33 -0
- data/.data/spec/std/isa/inst/Zfh/fltq.h.yaml +33 -0
- data/.data/spec/std/isa/inst/Zfh/fmadd.h.yaml +37 -0
- data/.data/spec/std/isa/inst/Zfh/fmax.h.yaml +33 -0
- data/.data/spec/std/isa/inst/Zfh/fmaxm.h.yaml +33 -0
- data/.data/spec/std/isa/inst/Zfh/fmin.h.yaml +33 -0
- data/.data/spec/std/isa/inst/Zfh/fminm.h.yaml +33 -0
- data/.data/spec/std/isa/inst/Zfh/fmsub.h.yaml +37 -0
- data/.data/spec/std/isa/inst/Zfh/fmul.h.yaml +35 -0
- data/.data/spec/std/isa/inst/Zfh/fmv.h.x.yaml +51 -0
- data/.data/spec/std/isa/inst/Zfh/fmv.x.h.yaml +51 -0
- data/.data/spec/std/isa/inst/Zfh/fnmadd.h.yaml +37 -0
- data/.data/spec/std/isa/inst/Zfh/fnmsub.h.yaml +37 -0
- data/.data/spec/std/isa/inst/Zfh/fround.h.yaml +33 -0
- data/.data/spec/std/isa/inst/Zfh/froundnx.h.yaml +33 -0
- data/.data/spec/std/isa/inst/Zfh/fsgnj.h.yaml +33 -0
- data/.data/spec/std/isa/inst/Zfh/fsgnjn.h.yaml +33 -0
- data/.data/spec/std/isa/inst/Zfh/fsgnjx.h.yaml +33 -0
- data/.data/spec/std/isa/inst/Zfh/fsh.yaml +89 -0
- data/.data/spec/std/isa/inst/Zfh/fsqrt.h.yaml +33 -0
- data/.data/spec/std/isa/inst/Zfh/fsub.h.yaml +35 -0
- data/.data/spec/std/isa/inst/Zicbom/cbo.clean.yaml +77 -0
- data/.data/spec/std/isa/inst/Zicbom/cbo.flush.yaml +75 -0
- data/.data/spec/std/isa/inst/Zicbom/cbo.inval.yaml +116 -0
- data/.data/spec/std/isa/inst/Zicbop/prefetch.i.yaml +34 -0
- data/.data/spec/std/isa/inst/Zicbop/prefetch.r.yaml +34 -0
- data/.data/spec/std/isa/inst/Zicbop/prefetch.w.yaml +34 -0
- data/.data/spec/std/isa/inst/Zicboz/cbo.zero.yaml +107 -0
- data/.data/spec/std/isa/inst/Zicfilp/lpad.yaml +28 -0
- data/.data/spec/std/isa/inst/Zicfiss/ssamoswap.d.yaml +35 -0
- data/.data/spec/std/isa/inst/Zicfiss/ssamoswap.w.yaml +35 -0
- data/.data/spec/std/isa/inst/Zicfiss/sspopchk.x1.yaml +25 -0
- data/.data/spec/std/isa/inst/Zicfiss/sspopchk.x5.yaml +25 -0
- data/.data/spec/std/isa/inst/Zicfiss/sspush.x1.yaml +25 -0
- data/.data/spec/std/isa/inst/Zicfiss/sspush.x5.yaml +25 -0
- data/.data/spec/std/isa/inst/Zicfiss/ssrdp.yaml +28 -0
- data/.data/spec/std/isa/inst/Zicond/czero.eqz.yaml +50 -0
- data/.data/spec/std/isa/inst/Zicond/czero.nez.yaml +50 -0
- data/.data/spec/std/isa/inst/Zicsr/csrrc.yaml +68 -0
- data/.data/spec/std/isa/inst/Zicsr/csrrci.yaml +62 -0
- data/.data/spec/std/isa/inst/Zicsr/csrrs.yaml +114 -0
- data/.data/spec/std/isa/inst/Zicsr/csrrsi.yaml +62 -0
- data/.data/spec/std/isa/inst/Zicsr/csrrw.yaml +90 -0
- data/.data/spec/std/isa/inst/Zicsr/csrrwi.yaml +88 -0
- data/.data/spec/std/isa/inst/Zifencei/fence.i.yaml +65 -0
- data/.data/spec/std/isa/inst/Zihintntl/c.ntl.all.yaml +27 -0
- data/.data/spec/std/isa/inst/Zihintntl/c.ntl.p1.yaml +27 -0
- data/.data/spec/std/isa/inst/Zihintntl/c.ntl.pall.yaml +27 -0
- data/.data/spec/std/isa/inst/Zihintntl/c.ntl.s1.yaml +27 -0
- data/.data/spec/std/isa/inst/Zihintntl/ntl.all.yaml +25 -0
- data/.data/spec/std/isa/inst/Zihintntl/ntl.p1.yaml +25 -0
- data/.data/spec/std/isa/inst/Zihintntl/ntl.pall.yaml +25 -0
- data/.data/spec/std/isa/inst/Zihintntl/ntl.s1.yaml +25 -0
- data/.data/spec/std/isa/inst/Zihintpause/pause.yaml +76 -0
- data/.data/spec/std/isa/inst/Zimop/mop.r.0.yaml +36 -0
- data/.data/spec/std/isa/inst/Zimop/mop.r.1.yaml +36 -0
- data/.data/spec/std/isa/inst/Zimop/mop.r.10.yaml +36 -0
- data/.data/spec/std/isa/inst/Zimop/mop.r.11.yaml +36 -0
- data/.data/spec/std/isa/inst/Zimop/mop.r.12.yaml +36 -0
- data/.data/spec/std/isa/inst/Zimop/mop.r.13.yaml +36 -0
- data/.data/spec/std/isa/inst/Zimop/mop.r.14.yaml +36 -0
- data/.data/spec/std/isa/inst/Zimop/mop.r.15.yaml +36 -0
- data/.data/spec/std/isa/inst/Zimop/mop.r.16.yaml +36 -0
- data/.data/spec/std/isa/inst/Zimop/mop.r.17.yaml +36 -0
- data/.data/spec/std/isa/inst/Zimop/mop.r.18.yaml +36 -0
- data/.data/spec/std/isa/inst/Zimop/mop.r.19.yaml +36 -0
- data/.data/spec/std/isa/inst/Zimop/mop.r.2.yaml +36 -0
- data/.data/spec/std/isa/inst/Zimop/mop.r.20.yaml +36 -0
- data/.data/spec/std/isa/inst/Zimop/mop.r.21.yaml +36 -0
- data/.data/spec/std/isa/inst/Zimop/mop.r.22.yaml +36 -0
- data/.data/spec/std/isa/inst/Zimop/mop.r.23.yaml +36 -0
- data/.data/spec/std/isa/inst/Zimop/mop.r.24.yaml +36 -0
- data/.data/spec/std/isa/inst/Zimop/mop.r.25.yaml +36 -0
- data/.data/spec/std/isa/inst/Zimop/mop.r.26.yaml +36 -0
- data/.data/spec/std/isa/inst/Zimop/mop.r.27.yaml +36 -0
- data/.data/spec/std/isa/inst/Zimop/mop.r.28.yaml +40 -0
- data/.data/spec/std/isa/inst/Zimop/mop.r.29.yaml +36 -0
- data/.data/spec/std/isa/inst/Zimop/mop.r.3.yaml +36 -0
- data/.data/spec/std/isa/inst/Zimop/mop.r.30.yaml +36 -0
- data/.data/spec/std/isa/inst/Zimop/mop.r.31.yaml +36 -0
- data/.data/spec/std/isa/inst/Zimop/mop.r.4.yaml +36 -0
- data/.data/spec/std/isa/inst/Zimop/mop.r.5.yaml +36 -0
- data/.data/spec/std/isa/inst/Zimop/mop.r.6.yaml +36 -0
- data/.data/spec/std/isa/inst/Zimop/mop.r.7.yaml +36 -0
- data/.data/spec/std/isa/inst/Zimop/mop.r.8.yaml +36 -0
- data/.data/spec/std/isa/inst/Zimop/mop.r.9.yaml +36 -0
- data/.data/spec/std/isa/inst/Zimop/mop.r.N.layout +58 -0
- data/.data/spec/std/isa/inst/Zimop/mop.rr.0.yaml +39 -0
- data/.data/spec/std/isa/inst/Zimop/mop.rr.1.yaml +39 -0
- data/.data/spec/std/isa/inst/Zimop/mop.rr.2.yaml +39 -0
- data/.data/spec/std/isa/inst/Zimop/mop.rr.3.yaml +39 -0
- data/.data/spec/std/isa/inst/Zimop/mop.rr.4.yaml +39 -0
- data/.data/spec/std/isa/inst/Zimop/mop.rr.5.yaml +39 -0
- data/.data/spec/std/isa/inst/Zimop/mop.rr.6.yaml +39 -0
- data/.data/spec/std/isa/inst/Zimop/mop.rr.7.yaml +42 -0
- data/.data/spec/std/isa/inst/Zimop/mop.rr.N.layout +58 -0
- data/.data/spec/std/isa/inst/Zkn/aes64ks1i.yaml +37 -0
- data/.data/spec/std/isa/inst/Zkn/aes64ks2.yaml +36 -0
- data/.data/spec/std/isa/inst/Zknd/aes32dsi.yaml +37 -0
- data/.data/spec/std/isa/inst/Zknd/aes32dsmi.yaml +38 -0
- data/.data/spec/std/isa/inst/Zknd/aes64ds.yaml +34 -0
- data/.data/spec/std/isa/inst/Zknd/aes64dsm.yaml +34 -0
- data/.data/spec/std/isa/inst/Zknd/aes64im.yaml +33 -0
- data/.data/spec/std/isa/inst/Zkne/aes32esi.yaml +35 -0
- data/.data/spec/std/isa/inst/Zkne/aes32esmi.yaml +35 -0
- data/.data/spec/std/isa/inst/Zkne/aes64es.yaml +34 -0
- data/.data/spec/std/isa/inst/Zkne/aes64esm.yaml +34 -0
- data/.data/spec/std/isa/inst/Zknh/sha256sig0.yaml +29 -0
- data/.data/spec/std/isa/inst/Zknh/sha256sig1.yaml +29 -0
- data/.data/spec/std/isa/inst/Zknh/sha256sum0.yaml +29 -0
- data/.data/spec/std/isa/inst/Zknh/sha256sum1.yaml +29 -0
- data/.data/spec/std/isa/inst/Zknh/sha512sig0.yaml +31 -0
- data/.data/spec/std/isa/inst/Zknh/sha512sig0h.yaml +33 -0
- data/.data/spec/std/isa/inst/Zknh/sha512sig0l.yaml +33 -0
- data/.data/spec/std/isa/inst/Zknh/sha512sig1.yaml +31 -0
- data/.data/spec/std/isa/inst/Zknh/sha512sig1h.yaml +33 -0
- data/.data/spec/std/isa/inst/Zknh/sha512sig1l.yaml +33 -0
- data/.data/spec/std/isa/inst/Zknh/sha512sum0.yaml +31 -0
- data/.data/spec/std/isa/inst/Zknh/sha512sum0r.yaml +33 -0
- data/.data/spec/std/isa/inst/Zknh/sha512sum1.yaml +31 -0
- data/.data/spec/std/isa/inst/Zknh/sha512sum1r.yaml +33 -0
- data/.data/spec/std/isa/inst/Zks/sm3p0.yaml +29 -0
- data/.data/spec/std/isa/inst/Zks/sm3p1.yaml +29 -0
- data/.data/spec/std/isa/inst/Zks/sm4ed.yaml +33 -0
- data/.data/spec/std/isa/inst/Zks/sm4ks.yaml +33 -0
- data/.data/spec/std/isa/inst/Zvbb/vandn.vv.yaml +33 -0
- data/.data/spec/std/isa/inst/Zvbb/vandn.vx.yaml +33 -0
- data/.data/spec/std/isa/inst/Zvbb/vbrev.v.yaml +31 -0
- data/.data/spec/std/isa/inst/Zvbb/vbrev8.v.yaml +31 -0
- data/.data/spec/std/isa/inst/Zvbb/vclz.v.yaml +31 -0
- data/.data/spec/std/isa/inst/Zvbb/vcpop.v.yaml +31 -0
- data/.data/spec/std/isa/inst/Zvbb/vctz.v.yaml +31 -0
- data/.data/spec/std/isa/inst/Zvbb/vrev8.v.yaml +31 -0
- data/.data/spec/std/isa/inst/Zvbb/vrol.vv.yaml +33 -0
- data/.data/spec/std/isa/inst/Zvbb/vrol.vx.yaml +33 -0
- data/.data/spec/std/isa/inst/Zvbb/vror.vi.yaml +33 -0
- data/.data/spec/std/isa/inst/Zvbb/vror.vv.yaml +33 -0
- data/.data/spec/std/isa/inst/Zvbb/vror.vx.yaml +33 -0
- data/.data/spec/std/isa/inst/Zvbb/vwsll.vi.yaml +33 -0
- data/.data/spec/std/isa/inst/Zvbb/vwsll.vv.yaml +33 -0
- data/.data/spec/std/isa/inst/Zvbb/vwsll.vx.yaml +33 -0
- data/.data/spec/std/isa/inst/Zvbc/vclmul.vv.yaml +33 -0
- data/.data/spec/std/isa/inst/Zvbc/vclmul.vx.yaml +33 -0
- data/.data/spec/std/isa/inst/Zvbc/vclmulh.vv.yaml +33 -0
- data/.data/spec/std/isa/inst/Zvbc/vclmulh.vx.yaml +33 -0
- data/.data/spec/std/isa/inst/Zvfbfmin/vfncvtbf16.f.f.w.yaml +31 -0
- data/.data/spec/std/isa/inst/Zvfbfmin/vfwcvtbf16.f.f.v.yaml +31 -0
- data/.data/spec/std/isa/inst/Zvfbfwma/vfwmaccbf16.vf.yaml +33 -0
- data/.data/spec/std/isa/inst/Zvfbfwma/vfwmaccbf16.vv.yaml +33 -0
- data/.data/spec/std/isa/inst/Zvkg/vghsh.vv.yaml +31 -0
- data/.data/spec/std/isa/inst/Zvkg/vgmul.vv.yaml +29 -0
- data/.data/spec/std/isa/inst/Zvkned/vaesdf.vs.yaml +29 -0
- data/.data/spec/std/isa/inst/Zvkned/vaesdf.vv.yaml +29 -0
- data/.data/spec/std/isa/inst/Zvkned/vaesdm.vs.yaml +29 -0
- data/.data/spec/std/isa/inst/Zvkned/vaesdm.vv.yaml +29 -0
- data/.data/spec/std/isa/inst/Zvkned/vaesef.vs.yaml +29 -0
- data/.data/spec/std/isa/inst/Zvkned/vaesef.vv.yaml +29 -0
- data/.data/spec/std/isa/inst/Zvkned/vaesem.vs.yaml +29 -0
- data/.data/spec/std/isa/inst/Zvkned/vaesem.vv.yaml +29 -0
- data/.data/spec/std/isa/inst/Zvkned/vaeskf1.vi.yaml +31 -0
- data/.data/spec/std/isa/inst/Zvkned/vaeskf2.vi.yaml +31 -0
- data/.data/spec/std/isa/inst/Zvkned/vaesz.vs.yaml +29 -0
- data/.data/spec/std/isa/inst/Zvknha/vsha2ch.vv.yaml +31 -0
- data/.data/spec/std/isa/inst/Zvknha/vsha2cl.vv.yaml +31 -0
- data/.data/spec/std/isa/inst/Zvknha/vsha2ms.vv.yaml +31 -0
- data/.data/spec/std/isa/inst/Zvks/vsm3c.vi.yaml +31 -0
- data/.data/spec/std/isa/inst/Zvks/vsm3me.vv.yaml +31 -0
- data/.data/spec/std/isa/inst/Zvks/vsm4k.vi.yaml +31 -0
- data/.data/spec/std/isa/inst/Zvks/vsm4r.vs.yaml +29 -0
- data/.data/spec/std/isa/inst/Zvks/vsm4r.vv.yaml +31 -0
- data/.data/spec/std/isa/inst_opcode/OP-32.yaml +12 -0
- data/.data/spec/std/isa/inst_opcode/OP.yaml +12 -0
- data/.data/spec/std/isa/inst_subtype/I/I-x-x.yaml +21 -0
- data/.data/spec/std/isa/inst_subtype/R/R-x.yaml +21 -0
- data/.data/spec/std/isa/inst_type/I.yaml +22 -0
- data/.data/spec/std/isa/inst_type/R.yaml +24 -0
- data/.data/spec/std/isa/inst_var/I-imm.yaml +12 -0
- data/.data/spec/std/isa/inst_var/xd.yaml +12 -0
- data/.data/spec/std/isa/inst_var/xs1.yaml +12 -0
- data/.data/spec/std/isa/inst_var/xs2.yaml +12 -0
- data/.data/spec/std/isa/inst_var_type/imm.yaml +9 -0
- data/.data/spec/std/isa/inst_var_type/x_dst_reg.yaml +11 -0
- data/.data/spec/std/isa/inst_var_type/x_src_reg.yaml +11 -0
- data/.data/spec/std/isa/interrupt_code/LocalCounterOverflow.yaml +14 -0
- data/.data/spec/std/isa/interrupt_code/MachineExternal.yaml +13 -0
- data/.data/spec/std/isa/interrupt_code/MachineSoftware.yaml +13 -0
- data/.data/spec/std/isa/interrupt_code/MachineTimer.yaml +13 -0
- data/.data/spec/std/isa/interrupt_code/SupervisorExternal.yaml +13 -0
- data/.data/spec/std/isa/interrupt_code/SupervisorGuestExternal.yaml +13 -0
- data/.data/spec/std/isa/interrupt_code/SupervisorSoftware.yaml +13 -0
- data/.data/spec/std/isa/interrupt_code/SupervisorTimer.yaml +13 -0
- data/.data/spec/std/isa/interrupt_code/VirtualSupervisorExternal.yaml +13 -0
- data/.data/spec/std/isa/interrupt_code/VirtualSupervisorSoftware.yaml +13 -0
- data/.data/spec/std/isa/interrupt_code/VirtualSupervisorTimer.yaml +13 -0
- data/.data/spec/std/isa/isa/builtin_functions.idl +671 -0
- data/.data/spec/std/isa/isa/fetch.idl +74 -0
- data/.data/spec/std/isa/isa/fp.idl +1238 -0
- data/.data/spec/std/isa/isa/globals.isa +3124 -0
- data/.data/spec/std/isa/isa/interrupts.idl +391 -0
- data/.data/spec/std/isa/isa/util.idl +224 -0
- data/.data/spec/std/isa/isa/vec.idl +55 -0
- data/.data/spec/std/isa/manual/isa.yaml +16 -0
- data/.data/spec/std/isa/manual_version/isa/20240411/isa_20240411.yaml +222 -0
- data/.data/spec/std/isa/param/ARCH_ID_VALUE.yaml +32 -0
- data/.data/spec/std/isa/param/ASID_WIDTH.yaml +23 -0
- data/.data/spec/std/isa/param/CACHE_BLOCK_SIZE.yaml +22 -0
- data/.data/spec/std/isa/param/CONFIG_PTR_ADDRESS.yaml +28 -0
- data/.data/spec/std/isa/param/COUNTINHIBIT_EN.yaml +30 -0
- data/.data/spec/std/isa/param/DBG_HCONTEXT_WIDTH.yaml +18 -0
- data/.data/spec/std/isa/param/DBG_SCONTEXT_WIDTH.yaml +18 -0
- data/.data/spec/std/isa/param/DCSR_MPRVEN_TYPE.yaml +23 -0
- data/.data/spec/std/isa/param/DCSR_STEPIE_TYPE.yaml +23 -0
- data/.data/spec/std/isa/param/DCSR_STOPCOUNT_TYPE.yaml +23 -0
- data/.data/spec/std/isa/param/DCSR_STOPTIME_TYPE.yaml +23 -0
- data/.data/spec/std/isa/param/ELEN.yaml +20 -0
- data/.data/spec/std/isa/param/FOLLOW_VTYPE_RESET_RECOMMENDATION.yaml +18 -0
- data/.data/spec/std/isa/param/FORCE_UPGRADE_CBO_INVAL_TO_FLUSH.yaml +20 -0
- data/.data/spec/std/isa/param/GSTAGE_MODE_BARE.yaml +24 -0
- data/.data/spec/std/isa/param/HCONTEXT_AVAILABLE.yaml +19 -0
- data/.data/spec/std/isa/param/HCOUNTENABLE_EN.yaml +27 -0
- data/.data/spec/std/isa/param/HPM_COUNTER_EN.yaml +29 -0
- data/.data/spec/std/isa/param/HPM_EVENTS.yaml +23 -0
- data/.data/spec/std/isa/param/HSTATEEN_AIA_TYPE.yaml +34 -0
- data/.data/spec/std/isa/param/HSTATEEN_CONTEXT_TYPE.yaml +35 -0
- data/.data/spec/std/isa/param/HSTATEEN_CSRIND_TYPE.yaml +34 -0
- data/.data/spec/std/isa/param/HSTATEEN_ENVCFG_TYPE.yaml +36 -0
- data/.data/spec/std/isa/param/HSTATEEN_IMSIC_TYPE.yaml +34 -0
- data/.data/spec/std/isa/param/HSTATEEN_JVT_TYPE.yaml +33 -0
- data/.data/spec/std/isa/param/HW_MSTATUS_FS_DIRTY_UPDATE.yaml +30 -0
- data/.data/spec/std/isa/param/HW_MSTATUS_VS_DIRTY_UPDATE.yaml +30 -0
- data/.data/spec/std/isa/param/IGNORE_INVALID_VSATP_MODE_WRITES_WHEN_V_EQ_ZERO.yaml +18 -0
- data/.data/spec/std/isa/param/IMPRECISE_VECTOR_TRAP_SETTABLE.yaml +19 -0
- data/.data/spec/std/isa/param/IMP_ID_VALUE.yaml +25 -0
- data/.data/spec/std/isa/param/JVT_BASE_MASK.yaml +28 -0
- data/.data/spec/std/isa/param/JVT_BASE_TYPE.yaml +20 -0
- data/.data/spec/std/isa/param/JVT_READ_ONLY.yaml +16 -0
- data/.data/spec/std/isa/param/LEGAL_VSTART.yaml +21 -0
- data/.data/spec/std/isa/param/LRSC_FAIL_ON_NON_EXACT_LRSC.yaml +18 -0
- data/.data/spec/std/isa/param/LRSC_FAIL_ON_VA_SYNONYM.yaml +17 -0
- data/.data/spec/std/isa/param/LRSC_MISALIGNED_BEHAVIOR.yaml +24 -0
- data/.data/spec/std/isa/param/LRSC_RESERVATION_STRATEGY.yaml +26 -0
- data/.data/spec/std/isa/param/MARCHID_IMPLEMENTED.yaml +17 -0
- data/.data/spec/std/isa/param/MCID_WIDTH.yaml +19 -0
- data/.data/spec/std/isa/param/MCONTEXT_AVAILABLE.yaml +16 -0
- data/.data/spec/std/isa/param/MCOUNTENABLE_EN.yaml +32 -0
- data/.data/spec/std/isa/param/MCTRCTL_CORSWAPINH_IMPLEMENTED.yaml +18 -0
- data/.data/spec/std/isa/param/MCTRCTL_CUSTOM_IMPLEMENTED.yaml +18 -0
- data/.data/spec/std/isa/param/MCTRCTL_DIRCALLINH_IMPLEMENTED.yaml +18 -0
- data/.data/spec/std/isa/param/MCTRCTL_DIRJMPINH_IMPLEMENTED.yaml +18 -0
- data/.data/spec/std/isa/param/MCTRCTL_DIRLJMPINH_IMPLEMENTED.yaml +18 -0
- data/.data/spec/std/isa/param/MCTRCTL_EXCINH_IMPLEMENTED.yaml +18 -0
- data/.data/spec/std/isa/param/MCTRCTL_INDCALLINH_IMPLEMENTED.yaml +18 -0
- data/.data/spec/std/isa/param/MCTRCTL_INDJMPINH_IMPLEMENTED.yaml +18 -0
- data/.data/spec/std/isa/param/MCTRCTL_INDLJMPINH_IMPLEMENTED.yaml +18 -0
- data/.data/spec/std/isa/param/MCTRCTL_INTRINH_IMPLEMENTED.yaml +18 -0
- data/.data/spec/std/isa/param/MCTRCTL_MTE_IMPLEMENTED.yaml +18 -0
- data/.data/spec/std/isa/param/MCTRCTL_NTBREN_IMPLEMENTED.yaml +18 -0
- data/.data/spec/std/isa/param/MCTRCTL_RASEMU_IMPLEMENTED.yaml +18 -0
- data/.data/spec/std/isa/param/MCTRCTL_RETINH_IMPLEMENTED.yaml +18 -0
- data/.data/spec/std/isa/param/MCTRCTL_STE_IMPLEMENTED.yaml +18 -0
- data/.data/spec/std/isa/param/MCTRCTL_TKBRINH_IMPLEMENTED.yaml +18 -0
- data/.data/spec/std/isa/param/MCTRCTL_TRETINH_IMPLEMENTED.yaml +18 -0
- data/.data/spec/std/isa/param/MIMPID_IMPLEMENTED.yaml +17 -0
- data/.data/spec/std/isa/param/MISALIGNED_AMO.yaml +17 -0
- data/.data/spec/std/isa/param/MISALIGNED_LDST.yaml +18 -0
- data/.data/spec/std/isa/param/MISALIGNED_LDST_EXCEPTION_PRIORITY.yaml +39 -0
- data/.data/spec/std/isa/param/MISALIGNED_MAX_ATOMICITY_GRANULE_SIZE.yaml +40 -0
- data/.data/spec/std/isa/param/MISALIGNED_SPLIT_STRATEGY.yaml +29 -0
- data/.data/spec/std/isa/param/MISA_CSR_IMPLEMENTED.yaml +23 -0
- data/.data/spec/std/isa/param/MOCK_1_BIT_INT.yaml +17 -0
- data/.data/spec/std/isa/param/MOCK_25_BIT_INT.yaml +17 -0
- data/.data/spec/std/isa/param/MOCK_2_BIT_INT.yaml +17 -0
- data/.data/spec/std/isa/param/MOCK_32_BIT_INT.yaml +17 -0
- data/.data/spec/std/isa/param/MOCK_64_BIT_INT.yaml +17 -0
- data/.data/spec/std/isa/param/MOCK_ARRAY_BOOL_ARRAY_OF_8_FIRST_2_FALSE.yaml +22 -0
- data/.data/spec/std/isa/param/MOCK_ARRAY_INT_ENUM.yaml +23 -0
- data/.data/spec/std/isa/param/MOCK_ARRAY_MAX_ONLY.yaml +21 -0
- data/.data/spec/std/isa/param/MOCK_ARRAY_MIN_ONLY.yaml +21 -0
- data/.data/spec/std/isa/param/MOCK_ARRAY_STRING_ENUM1.yaml +21 -0
- data/.data/spec/std/isa/param/MOCK_ARRAY_STRING_ENUM2.yaml +21 -0
- data/.data/spec/std/isa/param/MOCK_BOOL_1.yaml +15 -0
- data/.data/spec/std/isa/param/MOCK_BOOL_2.yaml +15 -0
- data/.data/spec/std/isa/param/MOCK_ENUM_2_INTS.yaml +18 -0
- data/.data/spec/std/isa/param/MOCK_ENUM_2_STRINGS.yaml +18 -0
- data/.data/spec/std/isa/param/MOCK_INT_RANGE_0_TO_1023.yaml +17 -0
- data/.data/spec/std/isa/param/MOCK_INT_RANGE_0_TO_127.yaml +17 -0
- data/.data/spec/std/isa/param/MOCK_INT_RANGE_0_TO_128.yaml +17 -0
- data/.data/spec/std/isa/param/MOCK_INT_RANGE_0_TO_2.yaml +17 -0
- data/.data/spec/std/isa/param/MOCK_INT_RANGE_0_TO_999.yaml +17 -0
- data/.data/spec/std/isa/param/MOCK_INT_RANGE_1000_TO_2048.yaml +17 -0
- data/.data/spec/std/isa/param/MOCK_INT_RANGE_1_TO_128.yaml +17 -0
- data/.data/spec/std/isa/param/MSTATEEN_AIA_TYPE.yaml +27 -0
- data/.data/spec/std/isa/param/MSTATEEN_CONTEXT_TYPE.yaml +26 -0
- data/.data/spec/std/isa/param/MSTATEEN_CSRIND_TYPE.yaml +26 -0
- data/.data/spec/std/isa/param/MSTATEEN_ENVCFG_TYPE.yaml +26 -0
- data/.data/spec/std/isa/param/MSTATEEN_IMSIC_TYPE.yaml +27 -0
- data/.data/spec/std/isa/param/MSTATEEN_JVT_TYPE.yaml +27 -0
- data/.data/spec/std/isa/param/MSTATUS_FS_LEGAL_VALUES.yaml +41 -0
- data/.data/spec/std/isa/param/MSTATUS_TVM_IMPLEMENTED.yaml +18 -0
- data/.data/spec/std/isa/param/MSTATUS_VS_LEGAL_VALUES.yaml +45 -0
- data/.data/spec/std/isa/param/MTVAL_WIDTH.yaml +88 -0
- data/.data/spec/std/isa/param/MTVEC_ACCESS.yaml +24 -0
- data/.data/spec/std/isa/param/MTVEC_BASE_ALIGNMENT_DIRECT.yaml +96 -0
- data/.data/spec/std/isa/param/MTVEC_BASE_ALIGNMENT_VECTORED.yaml +96 -0
- data/.data/spec/std/isa/param/MTVEC_ILLEGAL_WRITE_BEHAVIOR.yaml +25 -0
- data/.data/spec/std/isa/param/MTVEC_MODES.yaml +35 -0
- data/.data/spec/std/isa/param/MUTABLE_MISA_A.yaml +19 -0
- data/.data/spec/std/isa/param/MUTABLE_MISA_B.yaml +18 -0
- data/.data/spec/std/isa/param/MUTABLE_MISA_C.yaml +21 -0
- data/.data/spec/std/isa/param/MUTABLE_MISA_D.yaml +21 -0
- data/.data/spec/std/isa/param/MUTABLE_MISA_F.yaml +21 -0
- data/.data/spec/std/isa/param/MUTABLE_MISA_H.yaml +26 -0
- data/.data/spec/std/isa/param/MUTABLE_MISA_M.yaml +21 -0
- data/.data/spec/std/isa/param/MUTABLE_MISA_Q.yaml +21 -0
- data/.data/spec/std/isa/param/MUTABLE_MISA_S.yaml +26 -0
- data/.data/spec/std/isa/param/MUTABLE_MISA_U.yaml +21 -0
- data/.data/spec/std/isa/param/MUTABLE_MISA_V.yaml +17 -0
- data/.data/spec/std/isa/param/MXLEN.yaml +54 -0
- data/.data/spec/std/isa/param/M_MODE_ENDIANNESS.yaml +26 -0
- data/.data/spec/std/isa/param/NUM_EXTERNAL_GUEST_INTERRUPTS.yaml +24 -0
- data/.data/spec/std/isa/param/NUM_PMP_ENTRIES.yaml +42 -0
- data/.data/spec/std/isa/param/PHYS_ADDR_WIDTH.yaml +24 -0
- data/.data/spec/std/isa/param/PMA_GRANULARITY.yaml +21 -0
- data/.data/spec/std/isa/param/PMLEN.yaml +20 -0
- data/.data/spec/std/isa/param/PMP_GRANULARITY.yaml +25 -0
- data/.data/spec/std/isa/param/PRECISE_SYNCHRONOUS_EXCEPTIONS.yaml +17 -0
- data/.data/spec/std/isa/param/RCID_WIDTH.yaml +19 -0
- data/.data/spec/std/isa/param/REPORT_CAUSE_IN_MTVAL_ON_LANDING_PAD_SOFTWARE_CHECK.yaml +18 -0
- data/.data/spec/std/isa/param/REPORT_CAUSE_IN_MTVAL_ON_SHADOW_STACK_SOFTWARE_CHECK.yaml +18 -0
- data/.data/spec/std/isa/param/REPORT_CAUSE_IN_STVAL_ON_LANDING_PAD_SOFTWARE_CHECK.yaml +18 -0
- data/.data/spec/std/isa/param/REPORT_CAUSE_IN_STVAL_ON_SHADOW_STACK_SOFTWARE_CHECK.yaml +18 -0
- data/.data/spec/std/isa/param/REPORT_CAUSE_IN_VSTVAL_ON_LANDING_PAD_SOFTWARE_CHECK.yaml +18 -0
- data/.data/spec/std/isa/param/REPORT_CAUSE_IN_VSTVAL_ON_SHADOW_STACK_SOFTWARE_CHECK.yaml +18 -0
- data/.data/spec/std/isa/param/REPORT_ENCODING_IN_MTVAL_ON_ILLEGAL_INSTRUCTION.yaml +21 -0
- data/.data/spec/std/isa/param/REPORT_ENCODING_IN_STVAL_ON_ILLEGAL_INSTRUCTION.yaml +19 -0
- data/.data/spec/std/isa/param/REPORT_ENCODING_IN_VSTVAL_ON_ILLEGAL_INSTRUCTION.yaml +19 -0
- data/.data/spec/std/isa/param/REPORT_ENCODING_IN_VSTVAL_ON_VIRTUAL_INSTRUCTION.yaml +19 -0
- data/.data/spec/std/isa/param/REPORT_GPA_IN_HTVAL_ON_GUEST_PAGE_FAULT.yaml +19 -0
- data/.data/spec/std/isa/param/REPORT_GPA_IN_TVAL_ON_INSTRUCTION_GUEST_PAGE_FAULT.yaml +18 -0
- data/.data/spec/std/isa/param/REPORT_GPA_IN_TVAL_ON_INTERMEDIATE_GUEST_PAGE_FAULT.yaml +19 -0
- data/.data/spec/std/isa/param/REPORT_GPA_IN_TVAL_ON_LOAD_GUEST_PAGE_FAULT.yaml +18 -0
- data/.data/spec/std/isa/param/REPORT_GPA_IN_TVAL_ON_STORE_AMO_GUEST_PAGE_FAULT.yaml +18 -0
- data/.data/spec/std/isa/param/REPORT_VA_IN_MTVAL_ON_BREAKPOINT.yaml +23 -0
- data/.data/spec/std/isa/param/REPORT_VA_IN_MTVAL_ON_INSTRUCTION_ACCESS_FAULT.yaml +21 -0
- data/.data/spec/std/isa/param/REPORT_VA_IN_MTVAL_ON_INSTRUCTION_MISALIGNED.yaml +21 -0
- data/.data/spec/std/isa/param/REPORT_VA_IN_MTVAL_ON_INSTRUCTION_PAGE_FAULT.yaml +20 -0
- data/.data/spec/std/isa/param/REPORT_VA_IN_MTVAL_ON_LOAD_ACCESS_FAULT.yaml +21 -0
- data/.data/spec/std/isa/param/REPORT_VA_IN_MTVAL_ON_LOAD_MISALIGNED.yaml +21 -0
- data/.data/spec/std/isa/param/REPORT_VA_IN_MTVAL_ON_LOAD_PAGE_FAULT.yaml +19 -0
- data/.data/spec/std/isa/param/REPORT_VA_IN_MTVAL_ON_STORE_AMO_ACCESS_FAULT.yaml +21 -0
- data/.data/spec/std/isa/param/REPORT_VA_IN_MTVAL_ON_STORE_AMO_MISALIGNED.yaml +21 -0
- data/.data/spec/std/isa/param/REPORT_VA_IN_MTVAL_ON_STORE_AMO_PAGE_FAULT.yaml +19 -0
- data/.data/spec/std/isa/param/REPORT_VA_IN_STVAL_ON_BREAKPOINT.yaml +20 -0
- data/.data/spec/std/isa/param/REPORT_VA_IN_STVAL_ON_INSTRUCTION_ACCESS_FAULT.yaml +20 -0
- data/.data/spec/std/isa/param/REPORT_VA_IN_STVAL_ON_INSTRUCTION_MISALIGNED.yaml +21 -0
- data/.data/spec/std/isa/param/REPORT_VA_IN_STVAL_ON_INSTRUCTION_PAGE_FAULT.yaml +20 -0
- data/.data/spec/std/isa/param/REPORT_VA_IN_STVAL_ON_LOAD_ACCESS_FAULT.yaml +19 -0
- data/.data/spec/std/isa/param/REPORT_VA_IN_STVAL_ON_LOAD_MISALIGNED.yaml +20 -0
- data/.data/spec/std/isa/param/REPORT_VA_IN_STVAL_ON_LOAD_PAGE_FAULT.yaml +19 -0
- data/.data/spec/std/isa/param/REPORT_VA_IN_STVAL_ON_STORE_AMO_ACCESS_FAULT.yaml +19 -0
- data/.data/spec/std/isa/param/REPORT_VA_IN_STVAL_ON_STORE_AMO_MISALIGNED.yaml +20 -0
- data/.data/spec/std/isa/param/REPORT_VA_IN_STVAL_ON_STORE_AMO_PAGE_FAULT.yaml +19 -0
- data/.data/spec/std/isa/param/REPORT_VA_IN_VSTVAL_ON_BREAKPOINT.yaml +20 -0
- data/.data/spec/std/isa/param/REPORT_VA_IN_VSTVAL_ON_INSTRUCTION_ACCESS_FAULT.yaml +20 -0
- data/.data/spec/std/isa/param/REPORT_VA_IN_VSTVAL_ON_INSTRUCTION_MISALIGNED.yaml +21 -0
- data/.data/spec/std/isa/param/REPORT_VA_IN_VSTVAL_ON_INSTRUCTION_PAGE_FAULT.yaml +20 -0
- data/.data/spec/std/isa/param/REPORT_VA_IN_VSTVAL_ON_LOAD_ACCESS_FAULT.yaml +19 -0
- data/.data/spec/std/isa/param/REPORT_VA_IN_VSTVAL_ON_LOAD_MISALIGNED.yaml +20 -0
- data/.data/spec/std/isa/param/REPORT_VA_IN_VSTVAL_ON_LOAD_PAGE_FAULT.yaml +19 -0
- data/.data/spec/std/isa/param/REPORT_VA_IN_VSTVAL_ON_STORE_AMO_ACCESS_FAULT.yaml +19 -0
- data/.data/spec/std/isa/param/REPORT_VA_IN_VSTVAL_ON_STORE_AMO_MISALIGNED.yaml +20 -0
- data/.data/spec/std/isa/param/REPORT_VA_IN_VSTVAL_ON_STORE_AMO_PAGE_FAULT.yaml +19 -0
- data/.data/spec/std/isa/param/RESERVED_VSET_X0X0_VILL_SET.yaml +21 -0
- data/.data/spec/std/isa/param/RESERVED_VSET_X0X0_VLMAX_CHANGE.yaml +20 -0
- data/.data/spec/std/isa/param/RVV_VL_WHEN_AVL_LT_DOUBLE_VLMAX.yaml +17 -0
- data/.data/spec/std/isa/param/SATP_MODE_BARE.yaml +17 -0
- data/.data/spec/std/isa/param/SCOUNTENABLE_EN.yaml +46 -0
- data/.data/spec/std/isa/param/SEW_MIN.yaml +27 -0
- data/.data/spec/std/isa/param/SSTATEEN_JVT_TYPE.yaml +37 -0
- data/.data/spec/std/isa/param/STVAL_WIDTH.yaml +19 -0
- data/.data/spec/std/isa/param/STVEC_MODE_DIRECT.yaml +21 -0
- data/.data/spec/std/isa/param/STVEC_MODE_VECTORED.yaml +19 -0
- data/.data/spec/std/isa/param/SUPPORT_FRACTIONAL_LMUL_BEYOND_REQUIRED.yaml +21 -0
- data/.data/spec/std/isa/param/SV32X4_TRANSLATION.yaml +24 -0
- data/.data/spec/std/isa/param/SV32_VSMODE_TRANSLATION.yaml +27 -0
- data/.data/spec/std/isa/param/SV39X4_TRANSLATION.yaml +23 -0
- data/.data/spec/std/isa/param/SV39_VSMODE_TRANSLATION.yaml +27 -0
- data/.data/spec/std/isa/param/SV48X4_TRANSLATION.yaml +27 -0
- data/.data/spec/std/isa/param/SV48_VSMODE_TRANSLATION.yaml +27 -0
- data/.data/spec/std/isa/param/SV57X4_TRANSLATION.yaml +25 -0
- data/.data/spec/std/isa/param/SV57_VSMODE_TRANSLATION.yaml +27 -0
- data/.data/spec/std/isa/param/SXLEN.yaml +31 -0
- data/.data/spec/std/isa/param/S_MODE_ENDIANNESS.yaml +25 -0
- data/.data/spec/std/isa/param/TIME_CSR_IMPLEMENTED.yaml +28 -0
- data/.data/spec/std/isa/param/TINST_VALUE_ON_BREAKPOINT.yaml +23 -0
- data/.data/spec/std/isa/param/TINST_VALUE_ON_FINAL_INSTRUCTION_GUEST_PAGE_FAULT.yaml +23 -0
- data/.data/spec/std/isa/param/TINST_VALUE_ON_FINAL_LOAD_GUEST_PAGE_FAULT.yaml +27 -0
- data/.data/spec/std/isa/param/TINST_VALUE_ON_FINAL_STORE_AMO_GUEST_PAGE_FAULT.yaml +27 -0
- data/.data/spec/std/isa/param/TINST_VALUE_ON_INSTRUCTION_ADDRESS_MISALIGNED.yaml +23 -0
- data/.data/spec/std/isa/param/TINST_VALUE_ON_LOAD_ACCESS_FAULT.yaml +25 -0
- data/.data/spec/std/isa/param/TINST_VALUE_ON_LOAD_ADDRESS_MISALIGNED.yaml +25 -0
- data/.data/spec/std/isa/param/TINST_VALUE_ON_LOAD_PAGE_FAULT.yaml +25 -0
- data/.data/spec/std/isa/param/TINST_VALUE_ON_MCALL.yaml +23 -0
- data/.data/spec/std/isa/param/TINST_VALUE_ON_SCALL.yaml +23 -0
- data/.data/spec/std/isa/param/TINST_VALUE_ON_STORE_AMO_ACCESS_FAULT.yaml +25 -0
- data/.data/spec/std/isa/param/TINST_VALUE_ON_STORE_AMO_ADDRESS_MISALIGNED.yaml +25 -0
- data/.data/spec/std/isa/param/TINST_VALUE_ON_STORE_AMO_PAGE_FAULT.yaml +25 -0
- data/.data/spec/std/isa/param/TINST_VALUE_ON_UCALL.yaml +23 -0
- data/.data/spec/std/isa/param/TINST_VALUE_ON_VIRTUAL_INSTRUCTION.yaml +23 -0
- data/.data/spec/std/isa/param/TINST_VALUE_ON_VSCALL.yaml +23 -0
- data/.data/spec/std/isa/param/TRAP_ON_EBREAK.yaml +17 -0
- data/.data/spec/std/isa/param/TRAP_ON_ECALL_FROM_M.yaml +17 -0
- data/.data/spec/std/isa/param/TRAP_ON_ECALL_FROM_S.yaml +20 -0
- data/.data/spec/std/isa/param/TRAP_ON_ECALL_FROM_U.yaml +20 -0
- data/.data/spec/std/isa/param/TRAP_ON_ECALL_FROM_VS.yaml +20 -0
- data/.data/spec/std/isa/param/TRAP_ON_ILLEGAL_WLRL.yaml +21 -0
- data/.data/spec/std/isa/param/TRAP_ON_RESERVED_INSTRUCTION.yaml +24 -0
- data/.data/spec/std/isa/param/TRAP_ON_SFENCE_VMA_WHEN_SATP_MODE_IS_READ_ONLY.yaml +31 -0
- data/.data/spec/std/isa/param/TRAP_ON_UNIMPLEMENTED_CSR.yaml +21 -0
- data/.data/spec/std/isa/param/TRAP_ON_UNIMPLEMENTED_INSTRUCTION.yaml +23 -0
- data/.data/spec/std/isa/param/UXLEN.yaml +31 -0
- data/.data/spec/std/isa/param/U_MODE_ENDIANNESS.yaml +25 -0
- data/.data/spec/std/isa/param/VECTOR_FF_NO_EXCEPTION_TRIM.yaml +19 -0
- data/.data/spec/std/isa/param/VECTOR_FF_SEG_EXCEPTION_PARTIAL_LOAD.yaml +22 -0
- data/.data/spec/std/isa/param/VECTOR_FF_UPDATE_PAST_TRIM.yaml +22 -0
- data/.data/spec/std/isa/param/VECTOR_LOAD_PAST_TRAP.yaml +19 -0
- data/.data/spec/std/isa/param/VECTOR_LOAD_SEG_FF_OVERWRITE_ELEMENTS_AFTER_FAULT.yaml +21 -0
- data/.data/spec/std/isa/param/VECTOR_LS_INDEX_MAX_EEW.yaml +28 -0
- data/.data/spec/std/isa/param/VECTOR_LS_MISALIGNED_LEGAL.yaml +19 -0
- data/.data/spec/std/isa/param/VECTOR_LS_SEG_PARTIAL_ACCESS.yaml +19 -0
- data/.data/spec/std/isa/param/VECTOR_LS_WHOLEREG_MISALIGNED_LEGAL.yaml +20 -0
- data/.data/spec/std/isa/param/VENDOR_ID_BANK.yaml +20 -0
- data/.data/spec/std/isa/param/VENDOR_ID_OFFSET.yaml +18 -0
- data/.data/spec/std/isa/param/VFREDUSUM_FINAL_NODE_ELEMENT_BEHAVIOR.yaml +20 -0
- data/.data/spec/std/isa/param/VFREDUSUM_INACTIVE_NODE_ELEMENT_BEHAVIOR.yaml +21 -0
- data/.data/spec/std/isa/param/VFREDUSUM_NAN.yaml +22 -0
- data/.data/spec/std/isa/param/VFREDUSUM_NODE_ROUNDING_BEHAVIOR.yaml +23 -0
- data/.data/spec/std/isa/param/VILL_SET_ON_RESERVED_VTYPE.yaml +20 -0
- data/.data/spec/std/isa/param/VLEN.yaml +20 -0
- data/.data/spec/std/isa/param/VMID_WIDTH.yaml +25 -0
- data/.data/spec/std/isa/param/VSSTAGE_MODE_BARE.yaml +24 -0
- data/.data/spec/std/isa/param/VSSTATUS_VS_EXISTS.yaml +19 -0
- data/.data/spec/std/isa/param/VSTVEC_MODE_DIRECT.yaml +21 -0
- data/.data/spec/std/isa/param/VSTVEC_MODE_VECTORED.yaml +21 -0
- data/.data/spec/std/isa/param/VSXLEN.yaml +33 -0
- data/.data/spec/std/isa/param/VS_MODE_ENDIANNESS.yaml +25 -0
- data/.data/spec/std/isa/param/VUXLEN.yaml +30 -0
- data/.data/spec/std/isa/param/VU_MODE_ENDIANNESS.yaml +25 -0
- data/.data/spec/std/isa/proc_cert_class/AC.yaml +13 -0
- data/.data/spec/std/isa/proc_cert_class/MC.yaml +13 -0
- data/.data/spec/std/isa/proc_cert_class/MockProcessor.yaml +13 -0
- data/.data/spec/std/isa/proc_cert_class/RVI.yaml +16 -0
- data/.data/spec/std/isa/proc_cert_model/AC100.yaml +72 -0
- data/.data/spec/std/isa/proc_cert_model/AC200.yaml +58 -0
- data/.data/spec/std/isa/proc_cert_model/MC100-32.yaml +155 -0
- data/.data/spec/std/isa/proc_cert_model/MC100-64.yaml +21 -0
- data/.data/spec/std/isa/proc_cert_model/MC200-32.yaml +60 -0
- data/.data/spec/std/isa/proc_cert_model/MC200-64.yaml +21 -0
- data/.data/spec/std/isa/proc_cert_model/MC300-32.yaml +40 -0
- data/.data/spec/std/isa/proc_cert_model/MC300-64.yaml +21 -0
- data/.data/spec/std/isa/proc_cert_model/RVI20-32.yaml +39 -0
- data/.data/spec/std/isa/proc_cert_model/RVI20-64.yaml +19 -0
- data/.data/spec/std/isa/profile/RVA20S64.yaml +76 -0
- data/.data/spec/std/isa/profile/RVA20U64.yaml +108 -0
- data/.data/spec/std/isa/profile/RVA22S64.yaml +80 -0
- data/.data/spec/std/isa/profile/RVA22U64.yaml +140 -0
- data/.data/spec/std/isa/profile/RVA23M64.yaml +24 -0
- data/.data/spec/std/isa/profile/RVA23S64.yaml +55 -0
- data/.data/spec/std/isa/profile/RVA23U64.yaml +70 -0
- data/.data/spec/std/isa/profile/RVB23M64.yaml +89 -0
- data/.data/spec/std/isa/profile/RVB23S64.yaml +299 -0
- data/.data/spec/std/isa/profile/RVB23U64.yaml +273 -0
- data/.data/spec/std/isa/profile/RVI20U32.yaml +83 -0
- data/.data/spec/std/isa/profile/RVI20U64.yaml +12 -0
- data/.data/spec/std/isa/profile_family/Mock.yaml +24 -0
- data/.data/spec/std/isa/profile_family/RVA.yaml +154 -0
- data/.data/spec/std/isa/profile_family/RVB.yaml +59 -0
- data/.data/spec/std/isa/profile_family/RVI.yaml +37 -0
- data/.data/spec/std/isa/profile_release/RVA20.yaml +44 -0
- data/.data/spec/std/isa/profile_release/RVA22.yaml +44 -0
- data/.data/spec/std/isa/profile_release/RVA23.yaml +40 -0
- data/.data/spec/std/isa/profile_release/RVB23.yaml +40 -0
- data/.data/spec/std/isa/profile_release/RVI20.yaml +31 -0
- data/.data/spec/std/isa/prose/interrupts.adoc +185 -0
- data/.data/spec/std/isa/register_file/F.yaml +165 -0
- data/.data/spec/std/isa/register_file/V.yaml +146 -0
- data/.data/spec/std/isa/register_file/X.yaml +201 -0
- data/LICENSE +26 -0
- data/bin/udb +11 -0
- data/ext/udb_download/extconf.rb +238 -0
- data/lib/tapioca/dsl/compilers/cfg_arch_compiler.rb +38 -0
- data/lib/udb/EQNTOTT_VERSION +1 -0
- data/lib/udb/ESPRESSO_VERSION +1 -0
- data/lib/udb/MUST_VERSION +1 -0
- data/lib/udb/Z3_VERSION +1 -0
- data/lib/udb/architecture.rb +345 -0
- data/lib/udb/cert_normative_rule.rb +41 -0
- data/lib/udb/cfg_arch.rb +1679 -0
- data/lib/udb/cli.rb +424 -0
- data/lib/udb/condition.rb +2143 -0
- data/lib/udb/config.rb +363 -0
- data/lib/udb/dep_paths.rb +109 -0
- data/lib/udb/dep_versions.rb +12 -0
- data/lib/udb/doc_link.rb +49 -0
- data/lib/udb/eqn.rb +204 -0
- data/lib/udb/eqn_parser.rb +804 -0
- data/lib/udb/external_documentation_renderer.rb +466 -0
- data/lib/udb/idl/condition_to_udb.rb +386 -0
- data/lib/udb/log.rb +147 -0
- data/lib/udb/logic.rb +3636 -0
- data/lib/udb/obj/certifiable_obj.rb +21 -0
- data/lib/udb/obj/certificate.rb +230 -0
- data/lib/udb/obj/csr.rb +603 -0
- data/lib/udb/obj/csr_field.rb +877 -0
- data/lib/udb/obj/database_obj.rb +556 -0
- data/lib/udb/obj/exception_code.rb +98 -0
- data/lib/udb/obj/extension.rb +1734 -0
- data/lib/udb/obj/has_fields.rb +151 -0
- data/lib/udb/obj/instruction.rb +1328 -0
- data/lib/udb/obj/manual.rb +208 -0
- data/lib/udb/obj/mmr.rb +104 -0
- data/lib/udb/obj/non_isa_specification.rb +382 -0
- data/lib/udb/obj/parameter.rb +148 -0
- data/lib/udb/obj/portfolio.rb +972 -0
- data/lib/udb/obj/prm.rb +52 -0
- data/lib/udb/obj/profile.rb +284 -0
- data/lib/udb/obj/register_file.rb +118 -0
- data/lib/udb/portfolio_design.rb +256 -0
- data/lib/udb/presence.rb +101 -0
- data/lib/udb/prm_generator.rb +763 -0
- data/lib/udb/proc_cert_design.rb +77 -0
- data/lib/udb/resolver.rb +425 -0
- data/lib/udb/schema.rb +305 -0
- data/lib/udb/version.rb +8 -0
- data/lib/udb/version_spec.rb +334 -0
- data/lib/udb/yaml/comment_parser.rb +422 -0
- data/lib/udb/yaml/preserving_emitter.rb +339 -0
- data/lib/udb/yaml/yaml_resolver.rb +1039 -0
- data/lib/udb/z3.rb +1218 -0
- data/lib/udb/z3_loader.rb +97 -0
- data/lib/udb.rb +25 -0
- metadata +3125 -0
|
@@ -0,0 +1,3124 @@
|
|
|
1
|
+
# Copyright (c) Qualcomm Technologies, Inc. and/or its subsidiaries.
|
|
2
|
+
# SPDX-License-Identifier: BSD-3-Clause-Clear
|
|
3
|
+
|
|
4
|
+
%version: 1.0
|
|
5
|
+
|
|
6
|
+
include "builtin_functions.idl"
|
|
7
|
+
include "interrupts.idl"
|
|
8
|
+
include "fetch.idl"
|
|
9
|
+
include "util.idl"
|
|
10
|
+
include "fp.idl"
|
|
11
|
+
include "vec.idl"
|
|
12
|
+
|
|
13
|
+
# global state
|
|
14
|
+
|
|
15
|
+
# general purpose register file
|
|
16
|
+
# is BUILTIN storage.
|
|
17
|
+
# This is to accommodate the zero register (x0) without
|
|
18
|
+
# needed ISL language support or hard-to-read function calls
|
|
19
|
+
# on any x register read/write
|
|
20
|
+
# Bits<MXLEN> X[31];
|
|
21
|
+
|
|
22
|
+
############################################################
|
|
23
|
+
# constants used to indicate special values
|
|
24
|
+
############################################################
|
|
25
|
+
|
|
26
|
+
# CSR field value is undefined, but whatever it is, it must be legal for the field
|
|
27
|
+
Bits<MXLEN> UNDEFINED_LEGAL;
|
|
28
|
+
|
|
29
|
+
# CSR field value is undefined, but whateer it is, it must be legal for the field and it
|
|
30
|
+
# must be the same value if the same sequence of instructions leading to the read is executed
|
|
31
|
+
Bits<MXLEN> UNDEFINED_LEGAL_DETERMINISTIC;
|
|
32
|
+
|
|
33
|
+
# Signals an illegal write of a WLRL field
|
|
34
|
+
Bits<67> ILLEGAL_WLRL = 67'h40000000000000000;
|
|
35
|
+
|
|
36
|
+
# maximum instruction encoding size
|
|
37
|
+
U32 INSTR_ENC_SIZE = 32;
|
|
38
|
+
|
|
39
|
+
# encoding defined by concatenation of { D, MPV, MPP }:
|
|
40
|
+
# - D : debug mode (1b)
|
|
41
|
+
# - MPV: mstatus.MPV (1b)
|
|
42
|
+
# - MPP: mstatus.MPP (2b)
|
|
43
|
+
enum PrivilegeMode {
|
|
44
|
+
M 0b0011
|
|
45
|
+
S 0b0001
|
|
46
|
+
HS 0b0001 # alias for S when H extension is used
|
|
47
|
+
U 0b0000
|
|
48
|
+
VS 0b0101
|
|
49
|
+
VU 0b0100
|
|
50
|
+
D 0b1011
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
enum MemoryOperation {
|
|
54
|
+
Read
|
|
55
|
+
Write
|
|
56
|
+
ReadModifyWrite
|
|
57
|
+
Fetch
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
# Types of Atomic Read-modify-write operations
|
|
61
|
+
enum AmoOperation {
|
|
62
|
+
Swap
|
|
63
|
+
Add
|
|
64
|
+
And
|
|
65
|
+
Or
|
|
66
|
+
Xor
|
|
67
|
+
Max
|
|
68
|
+
Maxu
|
|
69
|
+
Min
|
|
70
|
+
Minu
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
enum PmaAttribute {
|
|
74
|
+
RsrvNone # LR/SC not allowed
|
|
75
|
+
RsrvNonEventual # LR/SC allowed, but no guarantee it will ever succeed
|
|
76
|
+
RsrvEventual # LR/SC with forward-progress guarantees
|
|
77
|
+
|
|
78
|
+
MAG16 # Misaligned Atomicity Granule = 16-byte
|
|
79
|
+
MAG8 # Misaligned Atomicity Granule = 8-byte
|
|
80
|
+
MAG4 # Misaligned Atomicity Granule = 4-byte
|
|
81
|
+
MAG2 # Misaligned Atomicity Granule = 2-byte
|
|
82
|
+
|
|
83
|
+
AmoNone # No AMOs allowed
|
|
84
|
+
AmoSwap # amoswap is allowed
|
|
85
|
+
AmoLogical # amoswap, amoand, amoor, and amoxor are allowed
|
|
86
|
+
AmoArithmetic # All amos are allowed
|
|
87
|
+
|
|
88
|
+
# page walk permissions
|
|
89
|
+
HardwarePageTableRead # permission to read during a page walk
|
|
90
|
+
HardwarePageTableWrite # permission to write during a page walk
|
|
91
|
+
|
|
92
|
+
# Memory types
|
|
93
|
+
MainMemory # Main memory region
|
|
94
|
+
IO # I/O region
|
|
95
|
+
Cacheable # Cacheable memory region
|
|
96
|
+
Coherent # Coherent memory region
|
|
97
|
+
Idempotent # Idempotent memory region
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
enum Pbmt {
|
|
101
|
+
PMA 0 # Use underlying PMA
|
|
102
|
+
NC 1 # Non-cacheable, idempotent, weakly-ordered (RVWMO), main memory
|
|
103
|
+
IO 2 # Non-cacheable, non-idempotent, strongly (channel 0) ordered, I/O
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
# do not change these values!! the compiler assumes them
|
|
107
|
+
enum CsrFieldType {
|
|
108
|
+
RO 0
|
|
109
|
+
ROH 1
|
|
110
|
+
RW 2
|
|
111
|
+
RWR 3
|
|
112
|
+
RWH 4
|
|
113
|
+
RWRH 5
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
# generated from extension information in arch definition
|
|
117
|
+
generated enum ExtensionName;
|
|
118
|
+
|
|
119
|
+
# generated from extension information in arch definition
|
|
120
|
+
generated enum ExceptionCode;
|
|
121
|
+
|
|
122
|
+
# XLEN encoding, as defined in CSR[mstatus].mxl, etc.
|
|
123
|
+
enum XRegWidth {
|
|
124
|
+
XLEN32 1
|
|
125
|
+
XLEN64 2
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
# enum ExceptionCode {
|
|
129
|
+
# None 0xffff
|
|
130
|
+
# InstructionAddressMisaligned 0
|
|
131
|
+
# InstructionAccessFault 1
|
|
132
|
+
# IllegalInstruction 2
|
|
133
|
+
# Breakpoint 3
|
|
134
|
+
# LoadAddressMisaligned 4
|
|
135
|
+
# LoadAccessFault 5
|
|
136
|
+
# StoreAmoAddressMisaligned 6
|
|
137
|
+
# StoreAmoAccessFault 7
|
|
138
|
+
# Ucall 8
|
|
139
|
+
# Scall 9
|
|
140
|
+
# # reserved 10
|
|
141
|
+
# Mcall 11
|
|
142
|
+
# InstructionPageFault 12
|
|
143
|
+
# LoadPageFault 13
|
|
144
|
+
# # reserved 14
|
|
145
|
+
# StoreAmoPageFault 15
|
|
146
|
+
# # reserved 16-17
|
|
147
|
+
# SoftwareCheck 18
|
|
148
|
+
# HardwareError 19
|
|
149
|
+
# InstructionGuestPageFault 20
|
|
150
|
+
# LoadGuestPageFault 21
|
|
151
|
+
# VirtualInstruction 22
|
|
152
|
+
# StoreAmoGuestPageFault 23
|
|
153
|
+
# }
|
|
154
|
+
|
|
155
|
+
enum SatpMode {
|
|
156
|
+
Bare 0
|
|
157
|
+
Sv32 1
|
|
158
|
+
Sv39 8
|
|
159
|
+
Sv48 9
|
|
160
|
+
Sv57 10
|
|
161
|
+
Reserved 15
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
enum HgatpMode {
|
|
165
|
+
Bare 0
|
|
166
|
+
Sv32x4 1
|
|
167
|
+
Sv39x4 8
|
|
168
|
+
Sv48x4 9
|
|
169
|
+
Sv57x4 10
|
|
170
|
+
Reserved 15
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
bitfield (10) PteFlags {
|
|
174
|
+
RSW 9-8 # reserved
|
|
175
|
+
D 7 # dirty
|
|
176
|
+
A 6 # access
|
|
177
|
+
G 5 # global
|
|
178
|
+
U 4 # userspace permission
|
|
179
|
+
X 3 # execute permission
|
|
180
|
+
W 2 # write permission
|
|
181
|
+
R 1 # read permission
|
|
182
|
+
V 0 # valid
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
struct TranslationResult {
|
|
186
|
+
Bits<PHYS_ADDR_WIDTH> paddr;
|
|
187
|
+
Pbmt pbmt;
|
|
188
|
+
PteFlags pte_flags;
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
struct CachedTranslationResult {
|
|
192
|
+
Boolean valid;
|
|
193
|
+
TranslationResult result;
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
# options associated with a translation (TLB) invalidation
|
|
197
|
+
struct VmaOrderType {
|
|
198
|
+
Boolean global; # include global mappings?
|
|
199
|
+
Boolean smode; # include smode (satp-based) mappings?
|
|
200
|
+
Boolean vsmode; # include vsmode (vsatp-based) mappings?
|
|
201
|
+
Boolean gstage; # include gstage (hgatp-based) mappings?
|
|
202
|
+
|
|
203
|
+
Boolean single_vmid; # Only order a single VMID?
|
|
204
|
+
Bits<14> vmid; # when single_vmid is true, the VMID to order
|
|
205
|
+
Boolean single_asid; # Only order a single ASID?
|
|
206
|
+
Bits<16> asid; # when single_asid is true, the ASID to order
|
|
207
|
+
Boolean single_vaddr; # Only order a single virtual address?
|
|
208
|
+
XReg vaddr; # when single_vaddr is true, the virtual address to order
|
|
209
|
+
Boolean single_gpaddr; # Only order a single guest physical address?
|
|
210
|
+
XReg gpaddr; # when single_gpaddr is true, the guest physical address to order
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
bitfield (64) Sv39PageTableEntry {
|
|
214
|
+
N 63
|
|
215
|
+
PBMT 62-61
|
|
216
|
+
Reserved 60-54
|
|
217
|
+
PPN2 53-28
|
|
218
|
+
PPN1 27-19
|
|
219
|
+
PPN0 18-10
|
|
220
|
+
PPN 53-10 # in addition to the components, we define the entire PPN
|
|
221
|
+
RSW 9-8
|
|
222
|
+
D 7
|
|
223
|
+
A 6
|
|
224
|
+
G 5
|
|
225
|
+
U 4
|
|
226
|
+
X 3
|
|
227
|
+
W 2
|
|
228
|
+
R 1
|
|
229
|
+
V 0
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
PrivilegeMode current_mode = PrivilegeMode::M;
|
|
233
|
+
|
|
234
|
+
function mode {
|
|
235
|
+
returns PrivilegeMode
|
|
236
|
+
description {
|
|
237
|
+
Returns the current active privilege mode.
|
|
238
|
+
}
|
|
239
|
+
body {
|
|
240
|
+
if ((!implemented?(ExtensionName::S)) &&
|
|
241
|
+
(!implemented?(ExtensionName::U)) &&
|
|
242
|
+
(!implemented?(ExtensionName::H))) {
|
|
243
|
+
return PrivilegeMode::M;
|
|
244
|
+
} else {
|
|
245
|
+
return current_mode;
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
|
|
251
|
+
function set_mode_no_refresh {
|
|
252
|
+
arguments PrivilegeMode new_mode
|
|
253
|
+
description {
|
|
254
|
+
Set the current privilege mode to `new_mode`, but don't refresh interrupts
|
|
255
|
+
}
|
|
256
|
+
body {
|
|
257
|
+
if (new_mode != current_mode) {
|
|
258
|
+
notify_mode_change(new_mode, current_mode);
|
|
259
|
+
current_mode = new_mode;
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
function set_mode {
|
|
265
|
+
arguments PrivilegeMode new_mode
|
|
266
|
+
description {
|
|
267
|
+
Set the current privilege mode to `new_mode`
|
|
268
|
+
}
|
|
269
|
+
body {
|
|
270
|
+
if (new_mode != current_mode) {
|
|
271
|
+
notify_mode_change(new_mode, current_mode);
|
|
272
|
+
current_mode = new_mode;
|
|
273
|
+
refresh_pending_interrupts();
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
function compatible_mode? {
|
|
279
|
+
returns Boolean
|
|
280
|
+
arguments
|
|
281
|
+
PrivilegeMode target_mode,
|
|
282
|
+
PrivilegeMode actual_mode
|
|
283
|
+
description {
|
|
284
|
+
Returns true if +target_mode+ is more privileged than +actual_mode+.
|
|
285
|
+
}
|
|
286
|
+
body {
|
|
287
|
+
if (target_mode == PrivilegeMode::M) {
|
|
288
|
+
return actual_mode == PrivilegeMode::M;
|
|
289
|
+
} else if (target_mode == PrivilegeMode::S) {
|
|
290
|
+
return
|
|
291
|
+
(actual_mode == PrivilegeMode::M) ||
|
|
292
|
+
(actual_mode == PrivilegeMode::S);
|
|
293
|
+
} else if (target_mode == PrivilegeMode::U) {
|
|
294
|
+
return
|
|
295
|
+
(actual_mode == PrivilegeMode::M) ||
|
|
296
|
+
(actual_mode == PrivilegeMode::S) ||
|
|
297
|
+
(actual_mode == PrivilegeMode::U);
|
|
298
|
+
} else if (target_mode == PrivilegeMode::VS) {
|
|
299
|
+
return
|
|
300
|
+
(actual_mode == PrivilegeMode::M) ||
|
|
301
|
+
(actual_mode == PrivilegeMode::S) ||
|
|
302
|
+
(actual_mode == PrivilegeMode::VS);
|
|
303
|
+
} else if (target_mode == PrivilegeMode::VU) {
|
|
304
|
+
return
|
|
305
|
+
(actual_mode == PrivilegeMode::M) ||
|
|
306
|
+
(actual_mode == PrivilegeMode::S) ||
|
|
307
|
+
(actual_mode == PrivilegeMode::VS) ||
|
|
308
|
+
(actual_mode == PrivilegeMode::VU);
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
|
|
313
|
+
function exception_handling_mode {
|
|
314
|
+
returns PrivilegeMode
|
|
315
|
+
arguments ExceptionCode exception_code
|
|
316
|
+
description {
|
|
317
|
+
Returns the target privilege mode that will handle synchronous exception `exception_code`
|
|
318
|
+
}
|
|
319
|
+
body {
|
|
320
|
+
if (mode() == PrivilegeMode::M) {
|
|
321
|
+
# exceptions can never be taken in a less-privileged mode, so if the current
|
|
322
|
+
# mode is M, the value of medeleg is irrelevant
|
|
323
|
+
return PrivilegeMode::M;
|
|
324
|
+
} else if (implemented?(ExtensionName::S) && ((mode() == PrivilegeMode::HS) || (mode() == PrivilegeMode::U))) {
|
|
325
|
+
if (($bits(CSR[medeleg]) & (MXLEN'1 << $bits(exception_code))) != 0) {
|
|
326
|
+
return PrivilegeMode::HS;
|
|
327
|
+
} else {
|
|
328
|
+
return PrivilegeMode::M;
|
|
329
|
+
}
|
|
330
|
+
} else {
|
|
331
|
+
assert(implemented?(ExtensionName::H) && ((mode() == PrivilegeMode::VS) || (mode() == PrivilegeMode::VU)), "Unexpected mode");
|
|
332
|
+
if (($bits(CSR[medeleg]) & (MXLEN'1 << $bits(exception_code))) != 0) {
|
|
333
|
+
if (($bits(CSR[hedeleg]) & (MXLEN'1 << $bits(exception_code))) != 0) {
|
|
334
|
+
return PrivilegeMode::VS;
|
|
335
|
+
} else {
|
|
336
|
+
return PrivilegeMode::HS;
|
|
337
|
+
}
|
|
338
|
+
} else {
|
|
339
|
+
# if an exception is not delegated to HS-mode, it can't be delegated to VS-mode
|
|
340
|
+
return PrivilegeMode::M;
|
|
341
|
+
}
|
|
342
|
+
}
|
|
343
|
+
}
|
|
344
|
+
}
|
|
345
|
+
|
|
346
|
+
function creg2reg {
|
|
347
|
+
returns Bits<5> # X register index
|
|
348
|
+
arguments Bits<3> creg_idx
|
|
349
|
+
description {
|
|
350
|
+
Maps a C register index (_e.g._, `rs1'` in the specification) to an X register index. From the
|
|
351
|
+
specification:
|
|
352
|
+
|
|
353
|
+
.Registers specified by the three-bit _rs1_′, _rs2_′, and _rd_′ fields of the CIW, CL, CS, CA, and CB formats.
|
|
354
|
+
//[cols="20%,10%,10%,10%,10%,10%,10%,10%,10%"]
|
|
355
|
+
[float="center",align="center",cols="1a, 1a",frame="none",grid="none"]
|
|
356
|
+
|===
|
|
357
|
+
|
|
|
358
|
+
[%autowidth,cols="<",frame="none",grid="none",options="noheader"]
|
|
359
|
+
!===
|
|
360
|
+
!RVC Register Number
|
|
361
|
+
!Integer Register Number
|
|
362
|
+
!Integer Register ABI Name
|
|
363
|
+
!Floating-Point Register Number
|
|
364
|
+
!Floating-Point Register ABI Name
|
|
365
|
+
!===
|
|
366
|
+
|
|
|
367
|
+
|
|
368
|
+
[%autowidth,cols="^,^,^,^,^,^,^,^",options="noheader"]
|
|
369
|
+
!===
|
|
370
|
+
!`000` !`001` !`010` !`011` !`100` !`101` !`110` !`111`
|
|
371
|
+
!`x8` !`x9` !`x10` !`x11` !`x12` !`x13` !`x14`!`x15`
|
|
372
|
+
!`s0` !`s1` !`a0` !`a1` !`a2` !`a3` !`a4`!`a5`
|
|
373
|
+
!`f8` !`f9` !`f10` !`f11` !`f12` !`f13`!`f14` !`f15`
|
|
374
|
+
!`fs0` !`fs1` !`fa0` !`fa1` !`fa2` !`fa3` !`fa4` !`fa5`
|
|
375
|
+
!===
|
|
376
|
+
|===
|
|
377
|
+
}
|
|
378
|
+
body {
|
|
379
|
+
return {2'b01, creg_idx};
|
|
380
|
+
}
|
|
381
|
+
}
|
|
382
|
+
|
|
383
|
+
function reserved_instruction {
|
|
384
|
+
arguments Bits<INSTR_ENC_SIZE> encoding
|
|
385
|
+
description {
|
|
386
|
+
Either raises an IllegalInstruction exception or enters unpredictable state,
|
|
387
|
+
depending on the setting of the TRAP_ON_UNIMPLEMENTED_INSTRUCTION parameter.
|
|
388
|
+
|
|
389
|
+
This should be called when an instruction is architecturally defined but
|
|
390
|
+
has been disabled at runtime (_e.g._, by clearing misa.A).
|
|
391
|
+
}
|
|
392
|
+
body {
|
|
393
|
+
if (TRAP_ON_UNIMPLEMENTED_INSTRUCTION) {
|
|
394
|
+
raise(ExceptionCode::IllegalInstruction, mode(), encoding);
|
|
395
|
+
} else {
|
|
396
|
+
unpredictable("Unimplemented instruction that does not trap");
|
|
397
|
+
}
|
|
398
|
+
}
|
|
399
|
+
}
|
|
400
|
+
|
|
401
|
+
function unimplemented_csr {
|
|
402
|
+
arguments Bits<INSTR_ENC_SIZE> encoding
|
|
403
|
+
description {
|
|
404
|
+
Either raises an IllegalInstruction exception or enters unpredictable state,
|
|
405
|
+
depending on the setting of the TRAP_ON_UNIMPLEMENTED_CSR parameter.
|
|
406
|
+
}
|
|
407
|
+
body {
|
|
408
|
+
if (TRAP_ON_UNIMPLEMENTED_CSR) {
|
|
409
|
+
raise(ExceptionCode::IllegalInstruction, mode(), encoding);
|
|
410
|
+
} else {
|
|
411
|
+
unpredictable("Accessing an unimplmented CSR");
|
|
412
|
+
}
|
|
413
|
+
}
|
|
414
|
+
}
|
|
415
|
+
|
|
416
|
+
function mtval_readonly? {
|
|
417
|
+
returns Boolean
|
|
418
|
+
description {
|
|
419
|
+
Returns whether or not CSR[mtval] is read-only based on implementation options
|
|
420
|
+
}
|
|
421
|
+
body {
|
|
422
|
+
return !(
|
|
423
|
+
REPORT_VA_IN_MTVAL_ON_BREAKPOINT ||
|
|
424
|
+
REPORT_VA_IN_MTVAL_ON_LOAD_MISALIGNED ||
|
|
425
|
+
REPORT_VA_IN_MTVAL_ON_STORE_AMO_MISALIGNED ||
|
|
426
|
+
REPORT_VA_IN_MTVAL_ON_INSTRUCTION_MISALIGNED ||
|
|
427
|
+
REPORT_VA_IN_MTVAL_ON_LOAD_ACCESS_FAULT ||
|
|
428
|
+
REPORT_VA_IN_MTVAL_ON_STORE_AMO_ACCESS_FAULT ||
|
|
429
|
+
REPORT_VA_IN_MTVAL_ON_INSTRUCTION_ACCESS_FAULT ||
|
|
430
|
+
REPORT_VA_IN_MTVAL_ON_LOAD_PAGE_FAULT ||
|
|
431
|
+
REPORT_VA_IN_MTVAL_ON_STORE_AMO_PAGE_FAULT ||
|
|
432
|
+
REPORT_VA_IN_MTVAL_ON_INSTRUCTION_PAGE_FAULT ||
|
|
433
|
+
REPORT_ENCODING_IN_MTVAL_ON_ILLEGAL_INSTRUCTION ||
|
|
434
|
+
REPORT_CAUSE_IN_MTVAL_ON_SHADOW_STACK_SOFTWARE_CHECK ||
|
|
435
|
+
REPORT_CAUSE_IN_MTVAL_ON_LANDING_PAD_SOFTWARE_CHECK
|
|
436
|
+
# || implemented?(ExtensionName::Sdext)
|
|
437
|
+
);
|
|
438
|
+
}
|
|
439
|
+
}
|
|
440
|
+
|
|
441
|
+
function stval_readonly? {
|
|
442
|
+
returns Boolean
|
|
443
|
+
description {
|
|
444
|
+
Returns whether or not CSR[stval] is read-only based on implementation options
|
|
445
|
+
}
|
|
446
|
+
body {
|
|
447
|
+
if (implemented?(ExtensionName::S)) {
|
|
448
|
+
return !(
|
|
449
|
+
REPORT_VA_IN_STVAL_ON_BREAKPOINT ||
|
|
450
|
+
REPORT_VA_IN_STVAL_ON_LOAD_MISALIGNED ||
|
|
451
|
+
REPORT_VA_IN_STVAL_ON_STORE_AMO_MISALIGNED ||
|
|
452
|
+
REPORT_VA_IN_STVAL_ON_INSTRUCTION_MISALIGNED ||
|
|
453
|
+
REPORT_VA_IN_STVAL_ON_LOAD_ACCESS_FAULT ||
|
|
454
|
+
REPORT_VA_IN_STVAL_ON_STORE_AMO_ACCESS_FAULT ||
|
|
455
|
+
REPORT_VA_IN_STVAL_ON_INSTRUCTION_ACCESS_FAULT ||
|
|
456
|
+
REPORT_VA_IN_STVAL_ON_LOAD_PAGE_FAULT ||
|
|
457
|
+
REPORT_VA_IN_STVAL_ON_STORE_AMO_PAGE_FAULT ||
|
|
458
|
+
REPORT_VA_IN_STVAL_ON_INSTRUCTION_PAGE_FAULT ||
|
|
459
|
+
REPORT_ENCODING_IN_STVAL_ON_ILLEGAL_INSTRUCTION ||
|
|
460
|
+
REPORT_CAUSE_IN_STVAL_ON_SHADOW_STACK_SOFTWARE_CHECK ||
|
|
461
|
+
REPORT_CAUSE_IN_STVAL_ON_LANDING_PAD_SOFTWARE_CHECK
|
|
462
|
+
# || implemented?(ExtensionName::Sdext)
|
|
463
|
+
);
|
|
464
|
+
} else {
|
|
465
|
+
return true;
|
|
466
|
+
}
|
|
467
|
+
}
|
|
468
|
+
}
|
|
469
|
+
|
|
470
|
+
function vstval_readonly? {
|
|
471
|
+
returns Boolean
|
|
472
|
+
description {
|
|
473
|
+
Returns whether or not CSR[vstval] is read-only based on implementation options
|
|
474
|
+
}
|
|
475
|
+
body {
|
|
476
|
+
if (implemented?(ExtensionName::H)) {
|
|
477
|
+
return !(
|
|
478
|
+
REPORT_VA_IN_VSTVAL_ON_BREAKPOINT ||
|
|
479
|
+
REPORT_VA_IN_VSTVAL_ON_LOAD_MISALIGNED ||
|
|
480
|
+
REPORT_VA_IN_VSTVAL_ON_STORE_AMO_MISALIGNED ||
|
|
481
|
+
REPORT_VA_IN_VSTVAL_ON_INSTRUCTION_MISALIGNED ||
|
|
482
|
+
REPORT_VA_IN_VSTVAL_ON_LOAD_ACCESS_FAULT ||
|
|
483
|
+
REPORT_VA_IN_VSTVAL_ON_STORE_AMO_ACCESS_FAULT ||
|
|
484
|
+
REPORT_VA_IN_VSTVAL_ON_INSTRUCTION_ACCESS_FAULT ||
|
|
485
|
+
REPORT_VA_IN_VSTVAL_ON_LOAD_PAGE_FAULT ||
|
|
486
|
+
REPORT_VA_IN_VSTVAL_ON_STORE_AMO_PAGE_FAULT ||
|
|
487
|
+
REPORT_VA_IN_VSTVAL_ON_INSTRUCTION_PAGE_FAULT ||
|
|
488
|
+
REPORT_ENCODING_IN_VSTVAL_ON_ILLEGAL_INSTRUCTION ||
|
|
489
|
+
REPORT_CAUSE_IN_VSTVAL_ON_SHADOW_STACK_SOFTWARE_CHECK ||
|
|
490
|
+
REPORT_CAUSE_IN_VSTVAL_ON_LANDING_PAD_SOFTWARE_CHECK
|
|
491
|
+
# || implemented?(ExtensionName::Sdext)
|
|
492
|
+
);
|
|
493
|
+
} else {
|
|
494
|
+
return true;
|
|
495
|
+
}
|
|
496
|
+
}
|
|
497
|
+
}
|
|
498
|
+
|
|
499
|
+
function mtval_for {
|
|
500
|
+
returns XReg
|
|
501
|
+
arguments ExceptionCode exception_code, XReg tval
|
|
502
|
+
description {
|
|
503
|
+
Given an exception code and a *legal* non-zero value for mtval,
|
|
504
|
+
returns the value to be written in mtval considering implementation options
|
|
505
|
+
}
|
|
506
|
+
body {
|
|
507
|
+
if (exception_code == ExceptionCode::Breakpoint) {
|
|
508
|
+
return REPORT_VA_IN_MTVAL_ON_BREAKPOINT ? tval : 0;
|
|
509
|
+
} else if (exception_code == ExceptionCode::LoadAddressMisaligned) {
|
|
510
|
+
return REPORT_VA_IN_MTVAL_ON_LOAD_MISALIGNED ? tval : 0;
|
|
511
|
+
} else if (exception_code == ExceptionCode::StoreAmoAddressMisaligned) {
|
|
512
|
+
return REPORT_VA_IN_MTVAL_ON_STORE_AMO_MISALIGNED ? tval : 0;
|
|
513
|
+
} else if (exception_code == ExceptionCode::InstructionAddressMisaligned) {
|
|
514
|
+
return REPORT_VA_IN_MTVAL_ON_INSTRUCTION_MISALIGNED ? tval : 0;
|
|
515
|
+
} else if (exception_code == ExceptionCode::LoadAccessFault) {
|
|
516
|
+
return REPORT_VA_IN_MTVAL_ON_LOAD_ACCESS_FAULT ? tval : 0;
|
|
517
|
+
} else if (exception_code == ExceptionCode::StoreAmoAccessFault) {
|
|
518
|
+
return REPORT_VA_IN_MTVAL_ON_STORE_AMO_ACCESS_FAULT ? tval : 0;
|
|
519
|
+
} else if (exception_code == ExceptionCode::InstructionAccessFault) {
|
|
520
|
+
return REPORT_VA_IN_MTVAL_ON_INSTRUCTION_ACCESS_FAULT ? tval : 0;
|
|
521
|
+
} else if (exception_code == ExceptionCode::LoadPageFault) {
|
|
522
|
+
return REPORT_VA_IN_MTVAL_ON_LOAD_PAGE_FAULT ? tval : 0;
|
|
523
|
+
} else if (exception_code == ExceptionCode::StoreAmoPageFault) {
|
|
524
|
+
return REPORT_VA_IN_MTVAL_ON_STORE_AMO_PAGE_FAULT ? tval : 0;
|
|
525
|
+
} else if (exception_code == ExceptionCode::InstructionPageFault) {
|
|
526
|
+
return REPORT_VA_IN_MTVAL_ON_INSTRUCTION_PAGE_FAULT ? tval : 0;
|
|
527
|
+
} else if (exception_code == ExceptionCode::IllegalInstruction) {
|
|
528
|
+
return REPORT_ENCODING_IN_MTVAL_ON_ILLEGAL_INSTRUCTION ? tval : 0;
|
|
529
|
+
} else if (exception_code == ExceptionCode::SoftwareCheck) {
|
|
530
|
+
# software check options are more fine-grained (per-software-check type), so always use tval,
|
|
531
|
+
# which must be config-checked at the call site
|
|
532
|
+
return tval;
|
|
533
|
+
} else {
|
|
534
|
+
return 0;
|
|
535
|
+
}
|
|
536
|
+
}
|
|
537
|
+
}
|
|
538
|
+
|
|
539
|
+
function stval_for {
|
|
540
|
+
returns XReg
|
|
541
|
+
arguments ExceptionCode exception_code, XReg tval
|
|
542
|
+
description {
|
|
543
|
+
Given an exception code and a *legal* non-zero value for stval,
|
|
544
|
+
returns the value to be written in stval considering implementation options
|
|
545
|
+
}
|
|
546
|
+
body {
|
|
547
|
+
if (exception_code == ExceptionCode::Breakpoint) {
|
|
548
|
+
return REPORT_VA_IN_STVAL_ON_BREAKPOINT ? tval : 0;
|
|
549
|
+
} else if (exception_code == ExceptionCode::LoadAddressMisaligned) {
|
|
550
|
+
return REPORT_VA_IN_STVAL_ON_LOAD_MISALIGNED ? tval : 0;
|
|
551
|
+
} else if (exception_code == ExceptionCode::StoreAmoAddressMisaligned) {
|
|
552
|
+
return REPORT_VA_IN_STVAL_ON_STORE_AMO_MISALIGNED ? tval : 0;
|
|
553
|
+
} else if (exception_code == ExceptionCode::InstructionAddressMisaligned) {
|
|
554
|
+
return REPORT_VA_IN_STVAL_ON_INSTRUCTION_MISALIGNED ? tval : 0;
|
|
555
|
+
} else if (exception_code == ExceptionCode::LoadAccessFault) {
|
|
556
|
+
return REPORT_VA_IN_STVAL_ON_LOAD_ACCESS_FAULT ? tval : 0;
|
|
557
|
+
} else if (exception_code == ExceptionCode::StoreAmoAccessFault) {
|
|
558
|
+
return REPORT_VA_IN_STVAL_ON_STORE_AMO_ACCESS_FAULT ? tval : 0;
|
|
559
|
+
} else if (exception_code == ExceptionCode::InstructionAccessFault) {
|
|
560
|
+
return REPORT_VA_IN_STVAL_ON_INSTRUCTION_ACCESS_FAULT ? tval : 0;
|
|
561
|
+
} else if (exception_code == ExceptionCode::LoadPageFault) {
|
|
562
|
+
return REPORT_VA_IN_STVAL_ON_LOAD_PAGE_FAULT ? tval : 0;
|
|
563
|
+
} else if (exception_code == ExceptionCode::StoreAmoPageFault) {
|
|
564
|
+
return REPORT_VA_IN_STVAL_ON_STORE_AMO_PAGE_FAULT ? tval : 0;
|
|
565
|
+
} else if (exception_code == ExceptionCode::InstructionPageFault) {
|
|
566
|
+
return REPORT_VA_IN_STVAL_ON_INSTRUCTION_PAGE_FAULT ? tval : 0;
|
|
567
|
+
} else if (exception_code == ExceptionCode::IllegalInstruction) {
|
|
568
|
+
return REPORT_ENCODING_IN_STVAL_ON_ILLEGAL_INSTRUCTION ? tval : 0;
|
|
569
|
+
} else if (exception_code == ExceptionCode::SoftwareCheck) {
|
|
570
|
+
# software checks have a fine-grained implementation option (per-software-check type), so always use tval,
|
|
571
|
+
# which must be config-checked at the call site
|
|
572
|
+
return tval;
|
|
573
|
+
} else {
|
|
574
|
+
return 0;
|
|
575
|
+
}
|
|
576
|
+
}
|
|
577
|
+
}
|
|
578
|
+
|
|
579
|
+
function vstval_for {
|
|
580
|
+
returns XReg
|
|
581
|
+
arguments ExceptionCode exception_code, XReg tval
|
|
582
|
+
description {
|
|
583
|
+
Given an exception code and a *legal* non-zero value for vstval,
|
|
584
|
+
returns the value to be written in vstval considering implementation options
|
|
585
|
+
}
|
|
586
|
+
body {
|
|
587
|
+
if (exception_code == ExceptionCode::Breakpoint) {
|
|
588
|
+
return REPORT_VA_IN_VSTVAL_ON_BREAKPOINT ? tval : 0;
|
|
589
|
+
} else if (exception_code == ExceptionCode::LoadAddressMisaligned) {
|
|
590
|
+
return REPORT_VA_IN_VSTVAL_ON_LOAD_MISALIGNED ? tval : 0;
|
|
591
|
+
} else if (exception_code == ExceptionCode::StoreAmoAddressMisaligned) {
|
|
592
|
+
return REPORT_VA_IN_VSTVAL_ON_STORE_AMO_MISALIGNED ? tval : 0;
|
|
593
|
+
} else if (exception_code == ExceptionCode::InstructionAddressMisaligned) {
|
|
594
|
+
return REPORT_VA_IN_VSTVAL_ON_INSTRUCTION_MISALIGNED ? tval : 0;
|
|
595
|
+
} else if (exception_code == ExceptionCode::LoadAccessFault) {
|
|
596
|
+
return REPORT_VA_IN_VSTVAL_ON_LOAD_ACCESS_FAULT ? tval : 0;
|
|
597
|
+
} else if (exception_code == ExceptionCode::StoreAmoAccessFault) {
|
|
598
|
+
return REPORT_VA_IN_VSTVAL_ON_STORE_AMO_ACCESS_FAULT ? tval : 0;
|
|
599
|
+
} else if (exception_code == ExceptionCode::InstructionAccessFault) {
|
|
600
|
+
return REPORT_VA_IN_VSTVAL_ON_INSTRUCTION_ACCESS_FAULT ? tval : 0;
|
|
601
|
+
} else if (exception_code == ExceptionCode::LoadPageFault) {
|
|
602
|
+
return REPORT_VA_IN_VSTVAL_ON_LOAD_PAGE_FAULT ? tval : 0;
|
|
603
|
+
} else if (exception_code == ExceptionCode::StoreAmoPageFault) {
|
|
604
|
+
return REPORT_VA_IN_VSTVAL_ON_STORE_AMO_PAGE_FAULT ? tval : 0;
|
|
605
|
+
} else if (exception_code == ExceptionCode::InstructionPageFault) {
|
|
606
|
+
return REPORT_VA_IN_VSTVAL_ON_INSTRUCTION_PAGE_FAULT ? tval : 0;
|
|
607
|
+
} else if (exception_code == ExceptionCode::IllegalInstruction) {
|
|
608
|
+
return REPORT_ENCODING_IN_VSTVAL_ON_ILLEGAL_INSTRUCTION ? tval : 0;
|
|
609
|
+
} else if (exception_code == ExceptionCode::SoftwareCheck) {
|
|
610
|
+
# software checks have a fine-grained implementation option (per-software-check type), so always use tval,
|
|
611
|
+
# which must be config-checked at the call site
|
|
612
|
+
return tval;
|
|
613
|
+
} else {
|
|
614
|
+
return 0;
|
|
615
|
+
}
|
|
616
|
+
}
|
|
617
|
+
}
|
|
618
|
+
|
|
619
|
+
function raise_guest_page_fault {
|
|
620
|
+
arguments
|
|
621
|
+
MemoryOperation op, # op type
|
|
622
|
+
XReg gpa, # guest physical address
|
|
623
|
+
XReg gva, # guest virtual address
|
|
624
|
+
XReg tinst_value, # value for *tinst
|
|
625
|
+
PrivilegeMode from_mode # effective privilege mode for reporting
|
|
626
|
+
description {
|
|
627
|
+
Raise a guest page fault exception.
|
|
628
|
+
}
|
|
629
|
+
body {
|
|
630
|
+
ExceptionCode code;
|
|
631
|
+
Boolean write_gpa_in_tval; # whether or not to write GPA >> 2 into htval/mtval2
|
|
632
|
+
|
|
633
|
+
if (op == MemoryOperation::Read) {
|
|
634
|
+
code = ExceptionCode::LoadGuestPageFault;
|
|
635
|
+
write_gpa_in_tval = REPORT_GPA_IN_TVAL_ON_LOAD_GUEST_PAGE_FAULT;
|
|
636
|
+
} else if (op == MemoryOperation::Write || op == MemoryOperation::ReadModifyWrite) {
|
|
637
|
+
code = ExceptionCode::StoreAmoGuestPageFault;
|
|
638
|
+
write_gpa_in_tval = REPORT_GPA_IN_TVAL_ON_STORE_AMO_GUEST_PAGE_FAULT;
|
|
639
|
+
} else {
|
|
640
|
+
assert(op == MemoryOperation::Fetch, "unexpected memory operation");
|
|
641
|
+
code = ExceptionCode::InstructionGuestPageFault;
|
|
642
|
+
write_gpa_in_tval = REPORT_GPA_IN_TVAL_ON_INSTRUCTION_GUEST_PAGE_FAULT;
|
|
643
|
+
}
|
|
644
|
+
|
|
645
|
+
PrivilegeMode handling_mode = exception_handling_mode(code);
|
|
646
|
+
|
|
647
|
+
if (handling_mode == PrivilegeMode::S) {
|
|
648
|
+
CSR[htval].VALUE = write_gpa_in_tval ? (gpa >> 2) : 0;
|
|
649
|
+
CSR[htinst].VALUE = tinst_value;
|
|
650
|
+
CSR[sepc].PC = $pc;
|
|
651
|
+
if (!stval_readonly?()) {
|
|
652
|
+
CSR[stval].VALUE = stval_for(code, gva);
|
|
653
|
+
}
|
|
654
|
+
$pc = {CSR[stvec].BASE, 2'b00};
|
|
655
|
+
CSR[scause].INT = 1'b0;
|
|
656
|
+
CSR[scause].CODE = $bits(code);
|
|
657
|
+
CSR[hstatus].GVA = 1;
|
|
658
|
+
CSR[hstatus].SPV = 1; # guest page faults always come from a virtual mode
|
|
659
|
+
CSR[hstatus].SPVP = $bits(from_mode)[0];
|
|
660
|
+
CSR[mstatus].SPP = $bits(from_mode)[0];
|
|
661
|
+
} else {
|
|
662
|
+
assert(handling_mode == PrivilegeMode::M, "unexpected privilege mode");
|
|
663
|
+
CSR[mtval2].VALUE = write_gpa_in_tval ? (gpa >> 2) : 0;
|
|
664
|
+
CSR[mtinst].VALUE = tinst_value;
|
|
665
|
+
CSR[mstatus].MPP = $bits(from_mode)[1:0];
|
|
666
|
+
if (MXLEN == 64) {
|
|
667
|
+
CSR[mstatus].MPV = 1;
|
|
668
|
+
} else {
|
|
669
|
+
CSR[mstatush].MPV = 1;
|
|
670
|
+
}
|
|
671
|
+
}
|
|
672
|
+
|
|
673
|
+
# abort the current instruction, and start to refetch from PC
|
|
674
|
+
set_mode(handling_mode);
|
|
675
|
+
abort_current_instruction();
|
|
676
|
+
}
|
|
677
|
+
}
|
|
678
|
+
|
|
679
|
+
function raise {
|
|
680
|
+
arguments
|
|
681
|
+
ExceptionCode exception_code, # exception code to raise
|
|
682
|
+
PrivilegeMode from_mode, # the effective mode to raise from (may be different than actual current mode)
|
|
683
|
+
XReg tval # value to write into tval
|
|
684
|
+
description {
|
|
685
|
+
Raise synchronous exception number `exception_code`.
|
|
686
|
+
|
|
687
|
+
The exception may be imprecise, and will cause execution to enter an
|
|
688
|
+
unpredictable state, if PRECISE_SYNCHRONOUS_EXCEPTIONS is false.
|
|
689
|
+
|
|
690
|
+
Otherwise, the exception will be precise.
|
|
691
|
+
}
|
|
692
|
+
body {
|
|
693
|
+
if (!PRECISE_SYNCHRONOUS_EXCEPTIONS) {
|
|
694
|
+
unpredictable("Imprecise synchronous exception");
|
|
695
|
+
} else {
|
|
696
|
+
raise_precise(exception_code, from_mode, tval);
|
|
697
|
+
}
|
|
698
|
+
}
|
|
699
|
+
}
|
|
700
|
+
|
|
701
|
+
function raise_precise {
|
|
702
|
+
arguments
|
|
703
|
+
ExceptionCode exception_code, # exception code to raise
|
|
704
|
+
PrivilegeMode from_mode, # the effective mode to raise from (may be different than actual current mode)
|
|
705
|
+
XReg tval # value to write into tval
|
|
706
|
+
description {
|
|
707
|
+
Raise synchronous exception number `exception_code`.
|
|
708
|
+
}
|
|
709
|
+
body {
|
|
710
|
+
PrivilegeMode handling_mode = exception_handling_mode(exception_code);
|
|
711
|
+
|
|
712
|
+
if (handling_mode == PrivilegeMode::M) {
|
|
713
|
+
CSR[mepc].PC = $pc;
|
|
714
|
+
if (!mtval_readonly?()) {
|
|
715
|
+
CSR[mtval].VALUE = mtval_for(exception_code, tval);
|
|
716
|
+
}
|
|
717
|
+
$pc = {CSR[mtvec].BASE, 2'b00};
|
|
718
|
+
CSR[mcause].INT = 1'b0;
|
|
719
|
+
CSR[mcause].CODE = $bits(exception_code);
|
|
720
|
+
if (CSR[misa].H == 1) {
|
|
721
|
+
# write zero into mtval2 and minst
|
|
722
|
+
# (when these are non-zero values, raise_guest_page_fault should be callecd)
|
|
723
|
+
CSR[mtval2].VALUE = 0;
|
|
724
|
+
CSR[mtinst].VALUE = 0;
|
|
725
|
+
if (from_mode == PrivilegeMode::VU || from_mode == PrivilegeMode::VS) {
|
|
726
|
+
if (MXLEN == 32) {
|
|
727
|
+
CSR[mstatush].MPV = 1;
|
|
728
|
+
} else {
|
|
729
|
+
CSR[mstatus].MPV = 1;
|
|
730
|
+
}
|
|
731
|
+
} else {
|
|
732
|
+
if (MXLEN == 32) {
|
|
733
|
+
CSR[mstatush].MPV = 0;
|
|
734
|
+
} else {
|
|
735
|
+
CSR[mstatus].MPV = 0;
|
|
736
|
+
}
|
|
737
|
+
}
|
|
738
|
+
}
|
|
739
|
+
CSR[mstatus].MPP = $bits(from_mode);
|
|
740
|
+
} else if (CSR[misa].S == 1 && (handling_mode == PrivilegeMode::S)) {
|
|
741
|
+
CSR[sepc].PC = $pc;
|
|
742
|
+
if (!stval_readonly?()) {
|
|
743
|
+
CSR[stval].VALUE = stval_for(exception_code, tval);
|
|
744
|
+
}
|
|
745
|
+
$pc = {CSR[stvec].BASE, 2'b00};
|
|
746
|
+
CSR[scause].INT = 1'b0;
|
|
747
|
+
CSR[scause].CODE = $bits(exception_code);
|
|
748
|
+
CSR[mstatus].SPP = $bits(from_mode)[0];
|
|
749
|
+
if (CSR[misa].H == 1) {
|
|
750
|
+
# write zero into htval and hinst
|
|
751
|
+
# (when these are non-zero values, raise_guest_page_fault should be callecd)
|
|
752
|
+
CSR[htval].VALUE = 0;
|
|
753
|
+
CSR[htinst].VALUE = 0;
|
|
754
|
+
CSR[hstatus].SPV = $bits(from_mode)[2];
|
|
755
|
+
if (from_mode == PrivilegeMode::VU || from_mode == PrivilegeMode::VS) {
|
|
756
|
+
CSR[hstatus].SPV = 1;
|
|
757
|
+
if ( ((exception_code == ExceptionCode::Breakpoint) && (REPORT_VA_IN_STVAL_ON_BREAKPOINT))
|
|
758
|
+
|| ((exception_code == ExceptionCode::LoadAddressMisaligned) && (REPORT_VA_IN_STVAL_ON_LOAD_MISALIGNED))
|
|
759
|
+
|| ((exception_code == ExceptionCode::StoreAmoAddressMisaligned) && (REPORT_VA_IN_STVAL_ON_STORE_AMO_MISALIGNED))
|
|
760
|
+
|| ((exception_code == ExceptionCode::InstructionAddressMisaligned) && (REPORT_VA_IN_STVAL_ON_INSTRUCTION_MISALIGNED))
|
|
761
|
+
|| ((exception_code == ExceptionCode::LoadAccessFault) && (REPORT_VA_IN_STVAL_ON_LOAD_ACCESS_FAULT))
|
|
762
|
+
|| ((exception_code == ExceptionCode::StoreAmoAccessFault) && (REPORT_VA_IN_STVAL_ON_STORE_AMO_ACCESS_FAULT))
|
|
763
|
+
|| ((exception_code == ExceptionCode::InstructionAccessFault) && (REPORT_VA_IN_STVAL_ON_INSTRUCTION_ACCESS_FAULT))
|
|
764
|
+
|| ((exception_code == ExceptionCode::LoadPageFault) && (REPORT_VA_IN_STVAL_ON_LOAD_PAGE_FAULT))
|
|
765
|
+
|| ((exception_code == ExceptionCode::StoreAmoPageFault) && (REPORT_VA_IN_STVAL_ON_STORE_AMO_PAGE_FAULT))
|
|
766
|
+
|| ((exception_code == ExceptionCode::InstructionPageFault) && (REPORT_VA_IN_STVAL_ON_INSTRUCTION_PAGE_FAULT))) {
|
|
767
|
+
# note: guest page faults handled through raise_guest_page_fault
|
|
768
|
+
CSR[hstatus].GVA = 1;
|
|
769
|
+
} else {
|
|
770
|
+
CSR[hstatus].GVA = 0;
|
|
771
|
+
}
|
|
772
|
+
CSR[hstatus].SPVP = $bits(from_mode)[0];
|
|
773
|
+
} else {
|
|
774
|
+
CSR[hstatus].SPV = 0;
|
|
775
|
+
CSR[hstatus].GVA = 0;
|
|
776
|
+
}
|
|
777
|
+
}
|
|
778
|
+
} else if (CSR[misa].H == 1 && (handling_mode == PrivilegeMode::VS)) {
|
|
779
|
+
CSR[vsepc].PC = $pc;
|
|
780
|
+
if (!vstval_readonly?()) {
|
|
781
|
+
CSR[vstval].VALUE = vstval_for(exception_code, tval);
|
|
782
|
+
}
|
|
783
|
+
$pc = {CSR[vstvec].BASE, 2'b00};
|
|
784
|
+
CSR[vscause].INT = 1'b0;
|
|
785
|
+
CSR[vscause].CODE = $bits(exception_code);
|
|
786
|
+
CSR[vsstatus].SPP = $bits(from_mode)[0];
|
|
787
|
+
}
|
|
788
|
+
|
|
789
|
+
# abort the current instruction, and start to refetch from PC
|
|
790
|
+
set_mode(handling_mode);
|
|
791
|
+
abort_current_instruction();
|
|
792
|
+
}
|
|
793
|
+
}
|
|
794
|
+
|
|
795
|
+
function ialign {
|
|
796
|
+
returns Bits<6>
|
|
797
|
+
description {
|
|
798
|
+
Returns IALIGN, the smallest instruction encoding size, in bits.
|
|
799
|
+
}
|
|
800
|
+
body {
|
|
801
|
+
if (implemented?(ExtensionName::C) && (CSR[misa].C == 0x1)) {
|
|
802
|
+
return 16;
|
|
803
|
+
} else {
|
|
804
|
+
return 32;
|
|
805
|
+
}
|
|
806
|
+
}
|
|
807
|
+
}
|
|
808
|
+
|
|
809
|
+
function jump {
|
|
810
|
+
arguments XReg target_addr
|
|
811
|
+
description {
|
|
812
|
+
Jump to virtual address `target_addr`.
|
|
813
|
+
|
|
814
|
+
If target address is misaligned, raise a `MisalignedAddress` exception.
|
|
815
|
+
}
|
|
816
|
+
body {
|
|
817
|
+
# raise a misaligned exception if address is not aligned to IALIGN
|
|
818
|
+
if ((ialign() == 16) && ((target_addr & 0x1) != 0)) {
|
|
819
|
+
# the target PC is not halfword-aligned
|
|
820
|
+
raise(ExceptionCode::InstructionAddressMisaligned, mode(), target_addr);
|
|
821
|
+
} else if ((ialign() == 32) && (target_addr & 0x3) != 0) {
|
|
822
|
+
# the target PC is not word-aligned
|
|
823
|
+
raise(ExceptionCode::InstructionAddressMisaligned, mode(), target_addr);
|
|
824
|
+
}
|
|
825
|
+
|
|
826
|
+
$pc = target_addr;
|
|
827
|
+
}
|
|
828
|
+
}
|
|
829
|
+
|
|
830
|
+
function jump_halfword {
|
|
831
|
+
arguments XReg target_hw_addr
|
|
832
|
+
description {
|
|
833
|
+
Jump to virtual halfword address `target_hw_addr`.
|
|
834
|
+
|
|
835
|
+
If target address is misaligned, raise a `MisalignedAddress` exception.
|
|
836
|
+
}
|
|
837
|
+
body {
|
|
838
|
+
# ensure that the target address is really a halfword address
|
|
839
|
+
assert((target_hw_addr & 0x1) == 0x0, "Expected halfword-aligned address in jump_halfword");
|
|
840
|
+
|
|
841
|
+
if (ialign() != 16) {
|
|
842
|
+
if ((target_hw_addr & 0x3) != 0) {
|
|
843
|
+
# the target PC is not word-aligned
|
|
844
|
+
raise(ExceptionCode::InstructionAddressMisaligned, mode(), target_hw_addr);
|
|
845
|
+
}
|
|
846
|
+
}
|
|
847
|
+
|
|
848
|
+
$pc = target_hw_addr;
|
|
849
|
+
}
|
|
850
|
+
}
|
|
851
|
+
|
|
852
|
+
function valid_interrupt_code? {
|
|
853
|
+
returns Boolean
|
|
854
|
+
arguments XReg code
|
|
855
|
+
description {
|
|
856
|
+
Returns true if _code_ is a legal interrupt number.
|
|
857
|
+
}
|
|
858
|
+
body {
|
|
859
|
+
if (code > ((1 `<< $enum_element_size(InterruptCode)) - 1)) {
|
|
860
|
+
# code is too large
|
|
861
|
+
return false;
|
|
862
|
+
}
|
|
863
|
+
if ($array_includes?($enum_to_a(InterruptCode), code)) {
|
|
864
|
+
return true;
|
|
865
|
+
} else {
|
|
866
|
+
return false;
|
|
867
|
+
}
|
|
868
|
+
}
|
|
869
|
+
}
|
|
870
|
+
|
|
871
|
+
function valid_exception_code? {
|
|
872
|
+
returns Boolean
|
|
873
|
+
arguments XReg code
|
|
874
|
+
description {
|
|
875
|
+
Returns true if _code_ is a legal exception number.
|
|
876
|
+
}
|
|
877
|
+
body {
|
|
878
|
+
if (code > ((1 `<< $enum_element_size(ExceptionCode)) - 1)) {
|
|
879
|
+
# code is too large
|
|
880
|
+
return false;
|
|
881
|
+
}
|
|
882
|
+
if ($array_includes?($enum_to_a(ExceptionCode), code)) {
|
|
883
|
+
return true;
|
|
884
|
+
} else {
|
|
885
|
+
return false;
|
|
886
|
+
}
|
|
887
|
+
}
|
|
888
|
+
}
|
|
889
|
+
|
|
890
|
+
function xlen {
|
|
891
|
+
returns Bits<8>
|
|
892
|
+
description {
|
|
893
|
+
Returns the effective XLEN for the current privilege mode.
|
|
894
|
+
}
|
|
895
|
+
body {
|
|
896
|
+
if (MXLEN == 32) {
|
|
897
|
+
return 32;
|
|
898
|
+
} else {
|
|
899
|
+
if (mode() == PrivilegeMode::M) {
|
|
900
|
+
if (CSR[misa].MXL == $bits(XRegWidth::XLEN32)) {
|
|
901
|
+
return 32;
|
|
902
|
+
} else if (CSR[misa].MXL == $bits(XRegWidth::XLEN64)) {
|
|
903
|
+
return 64;
|
|
904
|
+
} else {
|
|
905
|
+
unreachable();
|
|
906
|
+
}
|
|
907
|
+
} else if (implemented?(ExtensionName::S) && mode() == PrivilegeMode::S) {
|
|
908
|
+
if (CSR[mstatus].SXL == $bits(XRegWidth::XLEN32)) {
|
|
909
|
+
return 32;
|
|
910
|
+
} else if (CSR[mstatus].SXL == $bits(XRegWidth::XLEN64)) {
|
|
911
|
+
return 64;
|
|
912
|
+
} else {
|
|
913
|
+
unreachable();
|
|
914
|
+
}
|
|
915
|
+
} else if (implemented?(ExtensionName::U) && mode() == PrivilegeMode::U) {
|
|
916
|
+
if (CSR[mstatus].UXL == $bits(XRegWidth::XLEN32)) {
|
|
917
|
+
return 32;
|
|
918
|
+
} else if (CSR[mstatus].UXL == $bits(XRegWidth::XLEN64)) {
|
|
919
|
+
return 64;
|
|
920
|
+
} else {
|
|
921
|
+
unreachable();
|
|
922
|
+
}
|
|
923
|
+
} else if (implemented?(ExtensionName::H) && mode() == PrivilegeMode::VS) {
|
|
924
|
+
if (CSR[hstatus].VSXL == $bits(XRegWidth::XLEN32)) {
|
|
925
|
+
return 32;
|
|
926
|
+
} else if (CSR[hstatus].VSXL == $bits(XRegWidth::XLEN64)) {
|
|
927
|
+
return 64;
|
|
928
|
+
} else {
|
|
929
|
+
unreachable();
|
|
930
|
+
}
|
|
931
|
+
} else if (implemented?(ExtensionName::H) && mode() == PrivilegeMode::VU) {
|
|
932
|
+
if (CSR[vsstatus].UXL == $bits(XRegWidth::XLEN32)) {
|
|
933
|
+
return 32;
|
|
934
|
+
} else if (CSR[vsstatus].UXL == $bits(XRegWidth::XLEN64)) {
|
|
935
|
+
return 64;
|
|
936
|
+
} else {
|
|
937
|
+
unreachable();
|
|
938
|
+
}
|
|
939
|
+
}
|
|
940
|
+
}
|
|
941
|
+
}
|
|
942
|
+
}
|
|
943
|
+
|
|
944
|
+
function virtual_mode? {
|
|
945
|
+
returns Boolean
|
|
946
|
+
description {
|
|
947
|
+
Returns True if the current mode is virtual (VS or VU).
|
|
948
|
+
}
|
|
949
|
+
body {
|
|
950
|
+
return (mode() == PrivilegeMode::VS) || (mode() == PrivilegeMode::VU);
|
|
951
|
+
}
|
|
952
|
+
}
|
|
953
|
+
|
|
954
|
+
function mask_eaddr {
|
|
955
|
+
returns XReg
|
|
956
|
+
arguments XReg eaddr
|
|
957
|
+
description {
|
|
958
|
+
Mask upper N bits of an effective address if pointer masking is enabled
|
|
959
|
+
}
|
|
960
|
+
body {
|
|
961
|
+
#if (implemented?(ExtensionName::Zjpm)) {
|
|
962
|
+
# if (mode() == PrivilegeMode::M) {
|
|
963
|
+
# if (CSR[mpm].menable) {
|
|
964
|
+
# # ignore upper mbits of effective address
|
|
965
|
+
# return sext(xlen() - CSR[mpm].mbits, eaddr);
|
|
966
|
+
# }
|
|
967
|
+
# } else if (mode() == PrivilegeMode::S) { # also applies to HS mode
|
|
968
|
+
# if (CSR[spm].senable) {
|
|
969
|
+
# # ignore upper sbits of effective address
|
|
970
|
+
# return sext(xlen() - CSR[spm].sbits, eaddr);
|
|
971
|
+
# }
|
|
972
|
+
# } else if (mode() == PrivilegeMode::U || mode() == PrivilegeMode::VU) {
|
|
973
|
+
# if (CSR[upm].uenable) {
|
|
974
|
+
# # ignore upper ubits of effective address
|
|
975
|
+
# return sext(xlen() - CSR[upm].ubits, eaddr);
|
|
976
|
+
# }
|
|
977
|
+
# }
|
|
978
|
+
#}
|
|
979
|
+
|
|
980
|
+
# by default, eaddr == vaddr
|
|
981
|
+
return eaddr;
|
|
982
|
+
}
|
|
983
|
+
}
|
|
984
|
+
|
|
985
|
+
|
|
986
|
+
bitfield (8) PmpCfg {
|
|
987
|
+
L 7
|
|
988
|
+
Rsvd 6-5
|
|
989
|
+
A 4-3
|
|
990
|
+
X 2
|
|
991
|
+
W 1
|
|
992
|
+
R 0
|
|
993
|
+
}
|
|
994
|
+
|
|
995
|
+
enum PmpCfg_A {
|
|
996
|
+
OFF 0
|
|
997
|
+
TOR 1
|
|
998
|
+
NA4 2
|
|
999
|
+
NAPOT 3
|
|
1000
|
+
}
|
|
1001
|
+
|
|
1002
|
+
enum PmpMatchResult {
|
|
1003
|
+
NoMatch 0
|
|
1004
|
+
FullMatch 1
|
|
1005
|
+
PartialMatch 2
|
|
1006
|
+
}
|
|
1007
|
+
|
|
1008
|
+
function pmp_match_64 {
|
|
1009
|
+
returns PmpMatchResult, PmpCfg
|
|
1010
|
+
arguments Bits<PHYS_ADDR_WIDTH> paddr, U32 access_size
|
|
1011
|
+
description {
|
|
1012
|
+
Given a physical address, see if any PMP entry matches.
|
|
1013
|
+
|
|
1014
|
+
If there is a complete match, return the PmpCfg that guards the region.
|
|
1015
|
+
If there is no match or a partial match, report that result.
|
|
1016
|
+
}
|
|
1017
|
+
body {
|
|
1018
|
+
Bits<12> pmpcfg0_addr = 0x3a0;
|
|
1019
|
+
Bits<12> pmpaddr0_addr = 0x3b0;
|
|
1020
|
+
|
|
1021
|
+
for (U32 i=0; i<NUM_PMP_ENTRIES; i++) {
|
|
1022
|
+
# get the registers for this PMP entry
|
|
1023
|
+
Bits<12> pmpcfg_idx = pmpcfg0_addr + (i/8)*2;
|
|
1024
|
+
Bits<6> shamt = (i % 8)*8;
|
|
1025
|
+
|
|
1026
|
+
Csr pmpcfg_csr = direct_csr_lookup(pmpcfg_idx);
|
|
1027
|
+
PmpCfg cfg = (csr_hw_read(pmpcfg_csr) >> shamt)[7:0];
|
|
1028
|
+
|
|
1029
|
+
Bits<12> pmpaddr_idx = pmpaddr0_addr + i;
|
|
1030
|
+
Csr pmpaddr_csr = direct_csr_lookup(pmpaddr_idx);
|
|
1031
|
+
Bits<64> pmpaddr_csr_value = csr_sw_read(pmpaddr_csr);
|
|
1032
|
+
|
|
1033
|
+
# set up the default range limits, which will result in NoMatch when
|
|
1034
|
+
# compared to the access
|
|
1035
|
+
Bits<PHYS_ADDR_WIDTH> range_base = 0;
|
|
1036
|
+
Bits<PHYS_ADDR_WIDTH> range_limit = 0;
|
|
1037
|
+
|
|
1038
|
+
if (cfg.A == $bits(PmpCfg_A::TOR)) {
|
|
1039
|
+
if (i == 0) {
|
|
1040
|
+
# when entry zero is TOR, zero is the lower address bound
|
|
1041
|
+
range_base = 0;
|
|
1042
|
+
} else {
|
|
1043
|
+
# otherwise, it's the address in the next lowest pmpaddr register
|
|
1044
|
+
Csr tor_pmpaddr_csr = direct_csr_lookup(pmpaddr_idx - 1);
|
|
1045
|
+
range_base = (csr_sw_read(tor_pmpaddr_csr))[PHYS_ADDR_WIDTH-1:0];
|
|
1046
|
+
}
|
|
1047
|
+
range_limit = (pmpaddr_csr_value)[PHYS_ADDR_WIDTH-1:0] - 1;
|
|
1048
|
+
|
|
1049
|
+
} else if (cfg.A == $bits(PmpCfg_A::NAPOT)) {
|
|
1050
|
+
# Example pmpaddr: 0b00010101111
|
|
1051
|
+
# ^--- last 0 dictates region size & alignment
|
|
1052
|
+
# pmpaddr + 1: 0b00010110000
|
|
1053
|
+
# mask: 0b00000011111
|
|
1054
|
+
# ~mask: 0b11111100000
|
|
1055
|
+
# len = mask + 1: 0b00000100000
|
|
1056
|
+
Bits<PHYS_ADDR_WIDTH-1> pmpaddr_value = pmpaddr_csr_value[PHYS_ADDR_WIDTH-1:0];
|
|
1057
|
+
Bits<PHYS_ADDR_WIDTH-1> mask = pmpaddr_value ^ (pmpaddr_value + 1);
|
|
1058
|
+
range_base = (pmpaddr_value & ~mask);
|
|
1059
|
+
range_limit = range_base + mask;
|
|
1060
|
+
|
|
1061
|
+
} else if (cfg.A == $bits(PmpCfg_A::NA4)) {
|
|
1062
|
+
range_base = pmpaddr_csr_value[PHYS_ADDR_WIDTH-1:0];
|
|
1063
|
+
range_limit = range_base + 3;
|
|
1064
|
+
}
|
|
1065
|
+
|
|
1066
|
+
if (((paddr >> 2) >= range_base) && (((paddr + (access_size/8) - 1) >> 2) <= range_limit)) {
|
|
1067
|
+
# full match
|
|
1068
|
+
return PmpMatchResult::FullMatch, cfg;
|
|
1069
|
+
} else if (!(((paddr + (access_size/8) - 1) < range_base) || (paddr >= range_limit))) {
|
|
1070
|
+
# this is a partial match. By definition, the access must fail, regardless
|
|
1071
|
+
# of the pmp cfg settings
|
|
1072
|
+
return PmpMatchResult::PartialMatch, -;
|
|
1073
|
+
}
|
|
1074
|
+
}
|
|
1075
|
+
# fall-through: there was no match
|
|
1076
|
+
return PmpMatchResult::NoMatch, -;
|
|
1077
|
+
}
|
|
1078
|
+
}
|
|
1079
|
+
|
|
1080
|
+
function pmp_match_32 {
|
|
1081
|
+
returns PmpMatchResult, PmpCfg
|
|
1082
|
+
arguments Bits<PHYS_ADDR_WIDTH> paddr, U32 access_size
|
|
1083
|
+
description {
|
|
1084
|
+
Given a physical address, see if any PMP entry matches.
|
|
1085
|
+
|
|
1086
|
+
If there is a complete match, return the PmpCfg that guards the region.
|
|
1087
|
+
If there is no match or a partial match, report that result.
|
|
1088
|
+
}
|
|
1089
|
+
body {
|
|
1090
|
+
Bits<12> pmpcfg0_addr = 0x3a0;
|
|
1091
|
+
Bits<12> pmpaddr0_addr = 0x3b0;
|
|
1092
|
+
|
|
1093
|
+
for (U32 i=0; i<NUM_PMP_ENTRIES; i++) {
|
|
1094
|
+
# get the registers for this PMP entry
|
|
1095
|
+
Bits<12> pmpcfg_idx = pmpcfg0_addr + (i/4);
|
|
1096
|
+
Bits<6> shamt = (i % 4)*8;
|
|
1097
|
+
|
|
1098
|
+
Csr pmpcfg_csr = direct_csr_lookup(pmpcfg_idx);
|
|
1099
|
+
PmpCfg cfg = (csr_hw_read(pmpcfg_csr) >> shamt)[7:0];
|
|
1100
|
+
|
|
1101
|
+
Bits<12> pmpaddr_idx = pmpaddr0_addr + i;
|
|
1102
|
+
Csr pmpaddr_csr = direct_csr_lookup(pmpaddr_idx);
|
|
1103
|
+
Bits<32> pmpaddr_csr_value = csr_sw_read(pmpaddr_csr);
|
|
1104
|
+
|
|
1105
|
+
# set up the default range limits, which will result in NoMatch when
|
|
1106
|
+
# compared to the access
|
|
1107
|
+
Bits<PHYS_ADDR_WIDTH> range_base = 0;
|
|
1108
|
+
Bits<PHYS_ADDR_WIDTH> range_limit = 0;
|
|
1109
|
+
|
|
1110
|
+
if (cfg.A == $bits(PmpCfg_A::TOR)) {
|
|
1111
|
+
if (i == 0) {
|
|
1112
|
+
# when entry zero is TOR, zero is the lower address bound
|
|
1113
|
+
range_base = 0;
|
|
1114
|
+
} else {
|
|
1115
|
+
# otherwise, it's the address in the next lowest pmpaddr register
|
|
1116
|
+
Csr tor_pmpaddr_csr = direct_csr_lookup(pmpaddr_idx - 1);
|
|
1117
|
+
range_base = csr_sw_read(tor_pmpaddr_csr)[PHYS_ADDR_WIDTH-1:0];
|
|
1118
|
+
}
|
|
1119
|
+
range_limit = (pmpaddr_csr_value)[PHYS_ADDR_WIDTH-1:0] - 1;
|
|
1120
|
+
|
|
1121
|
+
} else if (cfg.A == $bits(PmpCfg_A::NAPOT)) {
|
|
1122
|
+
# Example pmpaddr: 0b00010101111
|
|
1123
|
+
# ^--- last 0 dictates region size & alignment
|
|
1124
|
+
# pmpaddr + 1: 0b00010110000
|
|
1125
|
+
# mask: 0b00000011111
|
|
1126
|
+
# ~mask: 0b11111100000
|
|
1127
|
+
# len = mask + 1: 0b00000100000
|
|
1128
|
+
Bits<PHYS_ADDR_WIDTH-1> pmpaddr_value = pmpaddr_csr_value[PHYS_ADDR_WIDTH-3:0];
|
|
1129
|
+
Bits<PHYS_ADDR_WIDTH-1> mask = pmpaddr_value ^ (pmpaddr_value + 1);
|
|
1130
|
+
range_base = pmpaddr_value & ~mask;
|
|
1131
|
+
range_limit = range_base + mask;
|
|
1132
|
+
|
|
1133
|
+
} else if (cfg.A == $bits(PmpCfg_A::NA4)) {
|
|
1134
|
+
range_base = pmpaddr_csr_value[PHYS_ADDR_WIDTH-1:0];
|
|
1135
|
+
range_limit = range_base + 3;
|
|
1136
|
+
}
|
|
1137
|
+
|
|
1138
|
+
if (((paddr >> 2) >= range_base) && (((paddr + (access_size/8) - 1) >> 2) <= range_limit)) {
|
|
1139
|
+
# full match
|
|
1140
|
+
return PmpMatchResult::FullMatch, cfg;
|
|
1141
|
+
} else if (!(((paddr + (access_size/8) - 1) < range_base) || (paddr >= range_limit))) {
|
|
1142
|
+
# this is a partial match. By definition, the access must fail, regardless
|
|
1143
|
+
# of the pmp cfg settings
|
|
1144
|
+
return PmpMatchResult::PartialMatch, -;
|
|
1145
|
+
}
|
|
1146
|
+
}
|
|
1147
|
+
# fall-through: there was no match
|
|
1148
|
+
return PmpMatchResult::NoMatch, -;
|
|
1149
|
+
}
|
|
1150
|
+
}
|
|
1151
|
+
|
|
1152
|
+
function pmp_match {
|
|
1153
|
+
returns PmpMatchResult, PmpCfg
|
|
1154
|
+
arguments Bits<PHYS_ADDR_WIDTH> paddr, U32 access_size
|
|
1155
|
+
description {
|
|
1156
|
+
Given a physical address, see if any PMP entry matches.
|
|
1157
|
+
|
|
1158
|
+
If there is a complete match, return the PmpCfg that guards the region.
|
|
1159
|
+
If there is no match or a partial match, report that result.
|
|
1160
|
+
}
|
|
1161
|
+
body {
|
|
1162
|
+
if (MXLEN == 64) {
|
|
1163
|
+
return pmp_match_64(paddr, access_size);
|
|
1164
|
+
} else {
|
|
1165
|
+
return pmp_match_32(paddr, access_size);
|
|
1166
|
+
}
|
|
1167
|
+
}
|
|
1168
|
+
}
|
|
1169
|
+
|
|
1170
|
+
function mpv {
|
|
1171
|
+
returns Bits<1>
|
|
1172
|
+
description {
|
|
1173
|
+
Returns the current value of CSR[mstatus].MPV (when MXLEN == 64) of CSR[mstatush].MPV (when MXLEN == 32)
|
|
1174
|
+
}
|
|
1175
|
+
body {
|
|
1176
|
+
if (implemented?(ExtensionName::H)) {
|
|
1177
|
+
return (MXLEN == 32) ? CSR[mstatush].MPV : CSR[mstatus].MPV;
|
|
1178
|
+
} else {
|
|
1179
|
+
assert(false, "TODO");
|
|
1180
|
+
}
|
|
1181
|
+
}
|
|
1182
|
+
}
|
|
1183
|
+
|
|
1184
|
+
|
|
1185
|
+
function effective_ldst_mode {
|
|
1186
|
+
returns PrivilegeMode
|
|
1187
|
+
description {
|
|
1188
|
+
Returns the effective privilege mode for normal explicit loads and stores, taking into account
|
|
1189
|
+
the current actual privilege mode and modifications from `mstatus.MPRV`.
|
|
1190
|
+
}
|
|
1191
|
+
body {
|
|
1192
|
+
# when the mode is M, loads and stores can be executed as if they were done from any other mode
|
|
1193
|
+
# with the use of mstatus.MPRV
|
|
1194
|
+
if (mode() == PrivilegeMode::M) {
|
|
1195
|
+
if (CSR[misa].U == 1 && CSR[mstatus].MPRV == 1) {
|
|
1196
|
+
if (CSR[mstatus].MPP == 0b00) {
|
|
1197
|
+
if (CSR[misa].H == 1 && mpv() == 0b1) {
|
|
1198
|
+
return PrivilegeMode::VU;
|
|
1199
|
+
} else {
|
|
1200
|
+
return PrivilegeMode::U;
|
|
1201
|
+
}
|
|
1202
|
+
} else if (CSR[misa].S == 1 && CSR[mstatus].MPP == 0b01) {
|
|
1203
|
+
if (CSR[misa].H == 1 && mpv() == 0b1) {
|
|
1204
|
+
return PrivilegeMode::VS;
|
|
1205
|
+
} else {
|
|
1206
|
+
return PrivilegeMode::S;
|
|
1207
|
+
}
|
|
1208
|
+
}
|
|
1209
|
+
}
|
|
1210
|
+
}
|
|
1211
|
+
|
|
1212
|
+
# no modifiers were found, return actual mode
|
|
1213
|
+
return mode();
|
|
1214
|
+
}
|
|
1215
|
+
}
|
|
1216
|
+
|
|
1217
|
+
|
|
1218
|
+
function pmp_check {
|
|
1219
|
+
returns Boolean
|
|
1220
|
+
arguments Bits<PHYS_ADDR_WIDTH> paddr, U32 access_size, MemoryOperation type
|
|
1221
|
+
description {
|
|
1222
|
+
Given a physical address and operation type, return whether or not the access is allowed by PMP.
|
|
1223
|
+
}
|
|
1224
|
+
body {
|
|
1225
|
+
PrivilegeMode mode = effective_ldst_mode();
|
|
1226
|
+
PmpMatchResult match_result;
|
|
1227
|
+
PmpCfg cfg;
|
|
1228
|
+
|
|
1229
|
+
(match_result, cfg) = pmp_match(paddr, access_size);
|
|
1230
|
+
|
|
1231
|
+
if (match_result == PmpMatchResult::FullMatch) {
|
|
1232
|
+
if (mode == PrivilegeMode::M && (cfg.L == 0)) {
|
|
1233
|
+
# when the region is not locked, all M-mode access pass
|
|
1234
|
+
return true;
|
|
1235
|
+
}
|
|
1236
|
+
|
|
1237
|
+
# this is either an HS, VS, VU, or U mode access, or an M mode access with cfg.L set
|
|
1238
|
+
# the RWX settings in cfg apply
|
|
1239
|
+
if (type == MemoryOperation::Write && (cfg.W == 0)) {
|
|
1240
|
+
return false;
|
|
1241
|
+
} else if (type == MemoryOperation::Read && (cfg.R == 0)) {
|
|
1242
|
+
return false;
|
|
1243
|
+
} else if (type == MemoryOperation::Fetch && (cfg.X == 0)) {
|
|
1244
|
+
return false;
|
|
1245
|
+
}
|
|
1246
|
+
} else if (match_result == PmpMatchResult::NoMatch) {
|
|
1247
|
+
# with no matched, M-mode passes and everything else fails
|
|
1248
|
+
if (mode == PrivilegeMode::M) {
|
|
1249
|
+
return true;
|
|
1250
|
+
} else {
|
|
1251
|
+
return false;
|
|
1252
|
+
}
|
|
1253
|
+
} else {
|
|
1254
|
+
assert(match_result == PmpMatchResult::PartialMatch, "PMP matching logic error");
|
|
1255
|
+
|
|
1256
|
+
# by definition, any partial match fails the access, regardless of the config settings
|
|
1257
|
+
return false;
|
|
1258
|
+
}
|
|
1259
|
+
|
|
1260
|
+
# fall-through passes
|
|
1261
|
+
return true;
|
|
1262
|
+
}
|
|
1263
|
+
}
|
|
1264
|
+
|
|
1265
|
+
function access_check {
|
|
1266
|
+
arguments
|
|
1267
|
+
Bits<PHYS_ADDR_WIDTH> paddr,
|
|
1268
|
+
U32 access_size,
|
|
1269
|
+
XReg vaddr,
|
|
1270
|
+
MemoryOperation type,
|
|
1271
|
+
ExceptionCode fault_type,
|
|
1272
|
+
PrivilegeMode from_mode
|
|
1273
|
+
description {
|
|
1274
|
+
Checks if the physical address paddr is able to access memory, and raises
|
|
1275
|
+
the appropriate exception if not.
|
|
1276
|
+
}
|
|
1277
|
+
body {
|
|
1278
|
+
# check if this is a valid physical address
|
|
1279
|
+
if (paddr > ((1 `<< PHYS_ADDR_WIDTH) - access_size)) {
|
|
1280
|
+
raise(fault_type, from_mode, vaddr);
|
|
1281
|
+
}
|
|
1282
|
+
|
|
1283
|
+
# check PMP
|
|
1284
|
+
if (implemented?(ExtensionName::Smpmp)) {
|
|
1285
|
+
if (!pmp_check(paddr[PHYS_ADDR_WIDTH-1:0], access_size, type)) {
|
|
1286
|
+
raise(fault_type, from_mode, vaddr);
|
|
1287
|
+
}
|
|
1288
|
+
}
|
|
1289
|
+
}
|
|
1290
|
+
}
|
|
1291
|
+
|
|
1292
|
+
function base32? {
|
|
1293
|
+
returns Boolean
|
|
1294
|
+
description {
|
|
1295
|
+
return True iff current effective XLEN == 32
|
|
1296
|
+
}
|
|
1297
|
+
body {
|
|
1298
|
+
if (MXLEN == 32) {
|
|
1299
|
+
return true;
|
|
1300
|
+
} else {
|
|
1301
|
+
XRegWidth xlen32 = XRegWidth::XLEN32;
|
|
1302
|
+
if (mode() == PrivilegeMode::M) {
|
|
1303
|
+
return CSR[misa].MXL == $bits(xlen32);
|
|
1304
|
+
} else if (implemented?(ExtensionName::S) && mode() == PrivilegeMode::S) {
|
|
1305
|
+
return CSR[mstatus].SXL == $bits(xlen32);
|
|
1306
|
+
} else if (implemented?(ExtensionName::U) && mode() == PrivilegeMode::U) {
|
|
1307
|
+
return CSR[mstatus].UXL == $bits(xlen32);
|
|
1308
|
+
} else if (implemented?(ExtensionName::H) && mode() == PrivilegeMode::VS) {
|
|
1309
|
+
return CSR[hstatus].VSXL == $bits(xlen32);
|
|
1310
|
+
} else {
|
|
1311
|
+
assert(implemented?(ExtensionName::H) && mode() == PrivilegeMode::VU, "Unexpected mode");
|
|
1312
|
+
return CSR[vsstatus].UXL == $bits(xlen32);
|
|
1313
|
+
}
|
|
1314
|
+
}
|
|
1315
|
+
}
|
|
1316
|
+
}
|
|
1317
|
+
|
|
1318
|
+
function base64? {
|
|
1319
|
+
returns Boolean
|
|
1320
|
+
description {
|
|
1321
|
+
return True iff current effective XLEN == 64
|
|
1322
|
+
}
|
|
1323
|
+
body {
|
|
1324
|
+
return xlen() == 64;
|
|
1325
|
+
}
|
|
1326
|
+
}
|
|
1327
|
+
|
|
1328
|
+
function current_translation_mode {
|
|
1329
|
+
returns SatpMode
|
|
1330
|
+
arguments
|
|
1331
|
+
PrivilegeMode mode
|
|
1332
|
+
description {
|
|
1333
|
+
Returns the current first-stage translation mode for an explicit load or store
|
|
1334
|
+
from +mode+ given the machine state (e.g., value of `satp` or `vsatp` csr).
|
|
1335
|
+
|
|
1336
|
+
Returns SatpMode::Reserved if the setting found in `satp` or `vsatp` is invalid.
|
|
1337
|
+
}
|
|
1338
|
+
body {
|
|
1339
|
+
PrivilegeMode effective_mode = effective_ldst_mode();
|
|
1340
|
+
|
|
1341
|
+
if (effective_mode == PrivilegeMode::M) {
|
|
1342
|
+
return SatpMode::Bare;
|
|
1343
|
+
}
|
|
1344
|
+
|
|
1345
|
+
if (CSR[misa].H == 1'b1) {
|
|
1346
|
+
if (effective_mode == PrivilegeMode::VS || effective_mode == PrivilegeMode::VU) {
|
|
1347
|
+
Bits<4> mode_val = CSR[vsatp].MODE;
|
|
1348
|
+
if (mode_val == $bits(SatpMode::Bare)) {
|
|
1349
|
+
return SatpMode::Bare;
|
|
1350
|
+
} else if (mode_val == $bits(SatpMode::Sv32)) {
|
|
1351
|
+
# Sv32 is only defined when XLEN == 32
|
|
1352
|
+
if (MXLEN == 64) {
|
|
1353
|
+
if ((effective_mode == PrivilegeMode::VS) && (CSR[hstatus].VSXL != $bits(XRegWidth::XLEN32))) {
|
|
1354
|
+
# not supported in this XLEN
|
|
1355
|
+
return SatpMode::Reserved;
|
|
1356
|
+
}
|
|
1357
|
+
if ((effective_mode == PrivilegeMode::VU) && (CSR[vsstatus].UXL != $bits(XRegWidth::XLEN32))) {
|
|
1358
|
+
# not supported in this XLEN
|
|
1359
|
+
return SatpMode::Reserved;
|
|
1360
|
+
}
|
|
1361
|
+
}
|
|
1362
|
+
if (!SV32_VSMODE_TRANSLATION) {
|
|
1363
|
+
# not supported in this configuration
|
|
1364
|
+
return SatpMode::Reserved;
|
|
1365
|
+
}
|
|
1366
|
+
|
|
1367
|
+
# OK
|
|
1368
|
+
return SatpMode::Sv32;
|
|
1369
|
+
} else if ((MXLEN == 64) && (mode_val == $bits(SatpMode::Sv39))) {
|
|
1370
|
+
# Sv39 is only defined when XLEN == 64
|
|
1371
|
+
if (effective_mode == PrivilegeMode::VS && CSR[hstatus].VSXL != $bits(XRegWidth::XLEN64)) {
|
|
1372
|
+
# not supported in this XLEN
|
|
1373
|
+
return SatpMode::Reserved;
|
|
1374
|
+
}
|
|
1375
|
+
if (effective_mode == PrivilegeMode::VU && CSR[vsstatus].UXL != $bits(XRegWidth::XLEN64)) {
|
|
1376
|
+
# not supported in this XLEN
|
|
1377
|
+
return SatpMode::Reserved;
|
|
1378
|
+
}
|
|
1379
|
+
if (!SV39_VSMODE_TRANSLATION) {
|
|
1380
|
+
# not supported in this configuration
|
|
1381
|
+
return SatpMode::Reserved;
|
|
1382
|
+
}
|
|
1383
|
+
|
|
1384
|
+
# OK
|
|
1385
|
+
return SatpMode::Sv39;
|
|
1386
|
+
} else if ((MXLEN == 64) && (mode_val == $bits(SatpMode::Sv48))) {
|
|
1387
|
+
# Sv48 is only defined when XLEN == 64
|
|
1388
|
+
if (effective_mode == PrivilegeMode::VS && CSR[hstatus].VSXL != $bits(XRegWidth::XLEN64)) {
|
|
1389
|
+
# not supported in this XLEN
|
|
1390
|
+
return SatpMode::Reserved;
|
|
1391
|
+
}
|
|
1392
|
+
if (effective_mode == PrivilegeMode::VU && CSR[vsstatus].UXL != $bits(XRegWidth::XLEN64)) {
|
|
1393
|
+
# not supported in this XLEN
|
|
1394
|
+
return SatpMode::Reserved;
|
|
1395
|
+
}
|
|
1396
|
+
if (!SV48_VSMODE_TRANSLATION) {
|
|
1397
|
+
# not supported in this configuration
|
|
1398
|
+
return SatpMode::Reserved;
|
|
1399
|
+
}
|
|
1400
|
+
|
|
1401
|
+
# OK
|
|
1402
|
+
return SatpMode::Sv48;
|
|
1403
|
+
} else if ((MXLEN == 64) && (mode_val == $bits(SatpMode::Sv57))) {
|
|
1404
|
+
# Sv57 is only defined when XLEN == 64
|
|
1405
|
+
if (effective_mode == PrivilegeMode::VS && CSR[hstatus].VSXL != $bits(XRegWidth::XLEN64)) {
|
|
1406
|
+
# not supported in this XLEN
|
|
1407
|
+
return SatpMode::Reserved;
|
|
1408
|
+
}
|
|
1409
|
+
if (effective_mode == PrivilegeMode::VU && CSR[vsstatus].UXL != $bits(XRegWidth::XLEN64)) {
|
|
1410
|
+
# not supported in this XLEN
|
|
1411
|
+
return SatpMode::Reserved;
|
|
1412
|
+
}
|
|
1413
|
+
if (!SV57_VSMODE_TRANSLATION) {
|
|
1414
|
+
# not supported in this configuration
|
|
1415
|
+
return SatpMode::Reserved;
|
|
1416
|
+
}
|
|
1417
|
+
|
|
1418
|
+
# OK
|
|
1419
|
+
return SatpMode::Sv57;
|
|
1420
|
+
} else {
|
|
1421
|
+
return SatpMode::Reserved;
|
|
1422
|
+
}
|
|
1423
|
+
} else {
|
|
1424
|
+
return SatpMode::Reserved;
|
|
1425
|
+
}
|
|
1426
|
+
} else if (CSR[misa].S == 1'b1) {
|
|
1427
|
+
|
|
1428
|
+
# if we reach here, then the effective mode is S or U
|
|
1429
|
+
assert(effective_mode == PrivilegeMode::S || effective_mode == PrivilegeMode::U, "unexpected priv mode");
|
|
1430
|
+
Bits<4> mode_val = CSR[satp].MODE;
|
|
1431
|
+
if (mode_val == $bits(SatpMode::Bare)) {
|
|
1432
|
+
return SatpMode::Bare;
|
|
1433
|
+
} else if (mode_val == $bits(SatpMode::Sv32)) {
|
|
1434
|
+
# Sv32 is only defined when XLEN == 32
|
|
1435
|
+
if (MXLEN == 64) {
|
|
1436
|
+
if (effective_mode == PrivilegeMode::S && CSR[mstatus].SXL != $bits(XRegWidth::XLEN32)) {
|
|
1437
|
+
# not supported in this XLEN
|
|
1438
|
+
return SatpMode::Reserved;
|
|
1439
|
+
}
|
|
1440
|
+
if (effective_mode == PrivilegeMode::U && CSR[sstatus].UXL != $bits(XRegWidth::XLEN32)) {
|
|
1441
|
+
# not supported in this XLEN
|
|
1442
|
+
return SatpMode::Reserved;
|
|
1443
|
+
}
|
|
1444
|
+
}
|
|
1445
|
+
if (!implemented?(ExtensionName::Sv32)) {
|
|
1446
|
+
# not supported in this configuration
|
|
1447
|
+
return SatpMode::Reserved;
|
|
1448
|
+
}
|
|
1449
|
+
# OK
|
|
1450
|
+
return SatpMode::Sv32;
|
|
1451
|
+
} else if ((MXLEN == 64) && (mode_val == $bits(SatpMode::Sv39))) {
|
|
1452
|
+
# Sv39 is only defined when XLEN == 64
|
|
1453
|
+
if (effective_mode == PrivilegeMode::S && CSR[mstatus].SXL != $bits(XRegWidth::XLEN64)) {
|
|
1454
|
+
# not supported in this XLEN
|
|
1455
|
+
return SatpMode::Reserved;
|
|
1456
|
+
}
|
|
1457
|
+
if (effective_mode == PrivilegeMode::U && CSR[sstatus].UXL != $bits(XRegWidth::XLEN64)) {
|
|
1458
|
+
# not supported in this XLEN
|
|
1459
|
+
return SatpMode::Reserved;
|
|
1460
|
+
}
|
|
1461
|
+
if (!implemented?(ExtensionName::Sv39)) {
|
|
1462
|
+
# not supported in this configuration
|
|
1463
|
+
return SatpMode::Reserved;
|
|
1464
|
+
}
|
|
1465
|
+
# OK
|
|
1466
|
+
return SatpMode::Sv39;
|
|
1467
|
+
} else if ((MXLEN == 64) && (mode_val == $bits(SatpMode::Sv48))) {
|
|
1468
|
+
# Sv48 is only defined when XLEN == 64
|
|
1469
|
+
if (effective_mode == PrivilegeMode::S && CSR[mstatus].SXL != $bits(XRegWidth::XLEN64)) {
|
|
1470
|
+
# not supported in this XLEN
|
|
1471
|
+
return SatpMode::Reserved;
|
|
1472
|
+
}
|
|
1473
|
+
if (effective_mode == PrivilegeMode::U && CSR[sstatus].UXL != $bits(XRegWidth::XLEN64)) {
|
|
1474
|
+
# not supported in this XLEN
|
|
1475
|
+
return SatpMode::Reserved;
|
|
1476
|
+
}
|
|
1477
|
+
if (!implemented?(ExtensionName::Sv48)) {
|
|
1478
|
+
# not supported in this configuration
|
|
1479
|
+
return SatpMode::Reserved;
|
|
1480
|
+
}
|
|
1481
|
+
# OK
|
|
1482
|
+
return SatpMode::Sv48;
|
|
1483
|
+
} else if ((MXLEN == 64) && (mode_val == $bits(SatpMode::Sv57))) {
|
|
1484
|
+
# Sv57 is only defined when XLEN == 64
|
|
1485
|
+
if (effective_mode == PrivilegeMode::S && CSR[mstatus].SXL != $bits(XRegWidth::XLEN64)) {
|
|
1486
|
+
# not supported in this XLEN
|
|
1487
|
+
return SatpMode::Reserved;
|
|
1488
|
+
}
|
|
1489
|
+
if (effective_mode == PrivilegeMode::U && CSR[sstatus].UXL != $bits(XRegWidth::XLEN64)) {
|
|
1490
|
+
# not supported in this XLEN
|
|
1491
|
+
return SatpMode::Reserved;
|
|
1492
|
+
}
|
|
1493
|
+
if (!implemented?(ExtensionName::Sv57)) {
|
|
1494
|
+
# not supported in this configuration
|
|
1495
|
+
return SatpMode::Reserved;
|
|
1496
|
+
}
|
|
1497
|
+
# OK
|
|
1498
|
+
return SatpMode::Sv57;
|
|
1499
|
+
} else {
|
|
1500
|
+
return SatpMode::Reserved;
|
|
1501
|
+
}
|
|
1502
|
+
} else {
|
|
1503
|
+
return SatpMode::Reserved;
|
|
1504
|
+
}
|
|
1505
|
+
}
|
|
1506
|
+
}
|
|
1507
|
+
|
|
1508
|
+
function current_gstage_translation_mode {
|
|
1509
|
+
returns HgatpMode
|
|
1510
|
+
description {
|
|
1511
|
+
Returns the current second-stage translation mode for a load or store
|
|
1512
|
+
from VS-mode or VU-mode.
|
|
1513
|
+
}
|
|
1514
|
+
body {
|
|
1515
|
+
return $enum(HgatpMode, CSR[hgatp].MODE);
|
|
1516
|
+
}
|
|
1517
|
+
}
|
|
1518
|
+
|
|
1519
|
+
function translate_gstage {
|
|
1520
|
+
returns TranslationResult # physical address, which is *not* access checked
|
|
1521
|
+
arguments
|
|
1522
|
+
XReg gpaddr, # Guest physical address
|
|
1523
|
+
XReg vaddr, # original virtual address
|
|
1524
|
+
MemoryOperation op, # operation type
|
|
1525
|
+
PrivilegeMode effective_mode, # mode for the translation
|
|
1526
|
+
Bits<INSTR_ENC_SIZE> encoding # encoding of the instruction causing this access
|
|
1527
|
+
description {
|
|
1528
|
+
Translates a guest physical address to a physical address.
|
|
1529
|
+
}
|
|
1530
|
+
body {
|
|
1531
|
+
TranslationResult result;
|
|
1532
|
+
|
|
1533
|
+
if (effective_mode == PrivilegeMode::S || effective_mode == PrivilegeMode::U) {
|
|
1534
|
+
# there is no gstage page walk
|
|
1535
|
+
result.paddr = gpaddr;
|
|
1536
|
+
return result;
|
|
1537
|
+
}
|
|
1538
|
+
|
|
1539
|
+
# mstatus.MXR affects G-stage XR, but not hstatus.MXR
|
|
1540
|
+
Boolean mxr = CSR[mstatus].MXR == 1;
|
|
1541
|
+
|
|
1542
|
+
if (GSTAGE_MODE_BARE && CSR[hgatp].MODE == $bits(HgatpMode::Bare)) {
|
|
1543
|
+
# bare mode
|
|
1544
|
+
result.paddr = gpaddr;
|
|
1545
|
+
return result;
|
|
1546
|
+
} else if (SV32X4_TRANSLATION && CSR[hgatp].MODE == $bits(HgatpMode::Sv32x4)) {
|
|
1547
|
+
# Sv39
|
|
1548
|
+
return gstage_page_walk<32, 34, 32, 2>(gpaddr, vaddr, op, effective_mode, false, encoding);
|
|
1549
|
+
} else if (SV39X4_TRANSLATION && CSR[hgatp].MODE == $bits(HgatpMode::Sv39x4)) {
|
|
1550
|
+
# Sv39
|
|
1551
|
+
return gstage_page_walk<39, 56, 64, 3>(gpaddr, vaddr, op, effective_mode, false, encoding);
|
|
1552
|
+
} else if (SV48X4_TRANSLATION && CSR[hgatp].MODE == $bits(HgatpMode::Sv48x4)) {
|
|
1553
|
+
# Sv48
|
|
1554
|
+
return gstage_page_walk<48, 56, 64, 4>(gpaddr, vaddr, op, effective_mode, false, encoding);
|
|
1555
|
+
} else if (SV57X4_TRANSLATION && CSR[hgatp].MODE == $bits(HgatpMode::Sv57x4)) {
|
|
1556
|
+
# Sv57
|
|
1557
|
+
return gstage_page_walk<57, 56, 64, 5>(gpaddr, vaddr, op, effective_mode, false, encoding);
|
|
1558
|
+
} else {
|
|
1559
|
+
# Invalid mode
|
|
1560
|
+
if (op == MemoryOperation::Read) {
|
|
1561
|
+
raise_guest_page_fault(op, gpaddr, vaddr, tinst_value_for_guest_page_fault(op, encoding, true), effective_mode);
|
|
1562
|
+
} else if (op == MemoryOperation::Write || op == MemoryOperation::ReadModifyWrite) {
|
|
1563
|
+
raise_guest_page_fault(op, gpaddr, vaddr, tinst_value_for_guest_page_fault(op, encoding, true), effective_mode);
|
|
1564
|
+
} else {
|
|
1565
|
+
assert(op == MemoryOperation::Fetch, "unexpected memory op");
|
|
1566
|
+
raise_guest_page_fault(op, gpaddr, vaddr, tinst_value_for_guest_page_fault(op, encoding, true), effective_mode);
|
|
1567
|
+
}
|
|
1568
|
+
}
|
|
1569
|
+
}
|
|
1570
|
+
}
|
|
1571
|
+
|
|
1572
|
+
function tinst_value_for_guest_page_fault {
|
|
1573
|
+
returns
|
|
1574
|
+
XReg # tinst value
|
|
1575
|
+
arguments
|
|
1576
|
+
MemoryOperation op,
|
|
1577
|
+
Bits<INSTR_ENC_SIZE> encoding,
|
|
1578
|
+
Boolean for_final_vs_pte
|
|
1579
|
+
description {
|
|
1580
|
+
Returns the value of htinst/mtinst for a Guest Page Fault
|
|
1581
|
+
}
|
|
1582
|
+
body {
|
|
1583
|
+
if (for_final_vs_pte) {
|
|
1584
|
+
if (op == MemoryOperation::Fetch) {
|
|
1585
|
+
if (TINST_VALUE_ON_FINAL_INSTRUCTION_GUEST_PAGE_FAULT == "always zero") {
|
|
1586
|
+
return 0;
|
|
1587
|
+
} else {
|
|
1588
|
+
assert(TINST_VALUE_ON_FINAL_INSTRUCTION_GUEST_PAGE_FAULT == "always pseudoinstruction",
|
|
1589
|
+
"Instruction guest page faults can only report zero/pseudo instruction in tval");
|
|
1590
|
+
return 0x00002000;
|
|
1591
|
+
}
|
|
1592
|
+
} else if (op == MemoryOperation::Read) {
|
|
1593
|
+
if (TINST_VALUE_ON_FINAL_LOAD_GUEST_PAGE_FAULT == "always zero") {
|
|
1594
|
+
return 0;
|
|
1595
|
+
} else if (TINST_VALUE_ON_FINAL_LOAD_GUEST_PAGE_FAULT == "always pseudoinstruction") {
|
|
1596
|
+
if (($array_size(VSXLEN) == 1 && VSXLEN[0] == 32) || ((MXLEN == 64) && (CSR[hstatus].VSXL == $bits(XRegWidth::XLEN32)))) {
|
|
1597
|
+
return 0x00002000;
|
|
1598
|
+
} else {
|
|
1599
|
+
return 0x00003000;
|
|
1600
|
+
}
|
|
1601
|
+
} else if (TINST_VALUE_ON_FINAL_LOAD_GUEST_PAGE_FAULT == "always transformed standard instruction") {
|
|
1602
|
+
return tinst_transform(encoding, 0); # all guest page faults are aligned
|
|
1603
|
+
} else {
|
|
1604
|
+
unpredictable("Custom value written into htinst/mtinst");
|
|
1605
|
+
}
|
|
1606
|
+
} else if (op == MemoryOperation::Write || op == MemoryOperation::ReadModifyWrite) {
|
|
1607
|
+
if (TINST_VALUE_ON_FINAL_STORE_AMO_GUEST_PAGE_FAULT == "always zero") {
|
|
1608
|
+
return 0;
|
|
1609
|
+
} else if (TINST_VALUE_ON_FINAL_STORE_AMO_GUEST_PAGE_FAULT == "always pseudoinstruction") {
|
|
1610
|
+
if (($array_size(VSXLEN) == 1 && VSXLEN[0] == 32) || ((MXLEN == 64) && (CSR[hstatus].VSXL == $bits(XRegWidth::XLEN32)))) {
|
|
1611
|
+
return 0x00002020;
|
|
1612
|
+
} else {
|
|
1613
|
+
return 0x00003020;
|
|
1614
|
+
}
|
|
1615
|
+
} else if (TINST_VALUE_ON_FINAL_STORE_AMO_GUEST_PAGE_FAULT == "always transformed standard instruction") {
|
|
1616
|
+
return tinst_transform(encoding, 0); # all guest page faults are aligned
|
|
1617
|
+
} else {
|
|
1618
|
+
unpredictable("Custom value written into htinst/mtinst");
|
|
1619
|
+
}
|
|
1620
|
+
}
|
|
1621
|
+
} else {
|
|
1622
|
+
if (REPORT_GPA_IN_TVAL_ON_INTERMEDIATE_GUEST_PAGE_FAULT) {
|
|
1623
|
+
# spec states hardware must write the pseduo-instruction values to *tinst
|
|
1624
|
+
if (($array_size(VSXLEN) == 1 && VSXLEN[0] == 32) || ((MXLEN == 64) && (CSR[hstatus].VSXL == $bits(XRegWidth::XLEN32)))) {
|
|
1625
|
+
return 0x00002000;
|
|
1626
|
+
} else if (($array_size(VSXLEN) == 1 && VSXLEN[0] == 64) || ((MXLEN == 64) && (CSR[hstatus].VSXL == $bits(XRegWidth::XLEN64)))) {
|
|
1627
|
+
return 0x00003000;
|
|
1628
|
+
}
|
|
1629
|
+
}
|
|
1630
|
+
}
|
|
1631
|
+
}
|
|
1632
|
+
}
|
|
1633
|
+
|
|
1634
|
+
function tinst_transform {
|
|
1635
|
+
returns Bits<INSTR_ENC_SIZE> # transformed value
|
|
1636
|
+
arguments
|
|
1637
|
+
Bits<INSTR_ENC_SIZE> encoding,
|
|
1638
|
+
Bits<5> addr_offset # the offset between the faulting address and the start of the operation (only non-zero for misaligned load/store)
|
|
1639
|
+
description {
|
|
1640
|
+
Returns the standard transformation of an encoding for htinst/mtinst
|
|
1641
|
+
}
|
|
1642
|
+
body {
|
|
1643
|
+
if (encoding[1:0] == 0b11) {
|
|
1644
|
+
if (encoding[6:2] == 5'b00001) {
|
|
1645
|
+
# 32-bit load instruction
|
|
1646
|
+
return {{12{1'b0}}, addr_offset, encoding[14:0]};
|
|
1647
|
+
} else if (encoding[6:2] == 5'b01000) {
|
|
1648
|
+
# 32-bit store instruction
|
|
1649
|
+
return {{7{1'b0}}, encoding[24:20], addr_offset, encoding[14:12], {5{1'b0}}, encoding[6:0]};
|
|
1650
|
+
} else if (encoding[6:2] == 5'b01011) {
|
|
1651
|
+
# 32-bit atomic instruction
|
|
1652
|
+
return {encoding[31:20], addr_offset, encoding[14:0]};
|
|
1653
|
+
} else if (encoding[6:2] == 5'b00011) {
|
|
1654
|
+
# 32-bit virtual machine load/store
|
|
1655
|
+
return {encoding[31:20], addr_offset, encoding[14:0]};
|
|
1656
|
+
} else {
|
|
1657
|
+
assert(false, "Bad transform");
|
|
1658
|
+
}
|
|
1659
|
+
} else {
|
|
1660
|
+
assert(false, "TODO: compressed instruction");
|
|
1661
|
+
}
|
|
1662
|
+
}
|
|
1663
|
+
}
|
|
1664
|
+
|
|
1665
|
+
function transformed_standard_instruction_for_tinst {
|
|
1666
|
+
returns
|
|
1667
|
+
Bits<INSTR_ENC_SIZE> # transformed instruction encoding
|
|
1668
|
+
arguments
|
|
1669
|
+
Bits<INSTR_ENC_SIZE> original # original instruction encoding
|
|
1670
|
+
description {
|
|
1671
|
+
Transforms an instruction encoding for htinst.
|
|
1672
|
+
}
|
|
1673
|
+
body {
|
|
1674
|
+
assert(false, "TODO");
|
|
1675
|
+
return 0;
|
|
1676
|
+
}
|
|
1677
|
+
}
|
|
1678
|
+
|
|
1679
|
+
function tinst_value {
|
|
1680
|
+
returns
|
|
1681
|
+
XReg # tinst value
|
|
1682
|
+
arguments
|
|
1683
|
+
ExceptionCode code, # expect type
|
|
1684
|
+
Bits<INSTR_ENC_SIZE> encoding # instruction encoding, needed when tinst value might be the encoding
|
|
1685
|
+
description {
|
|
1686
|
+
Returns the value of htinst/mtinst for the given exception code.
|
|
1687
|
+
}
|
|
1688
|
+
body {
|
|
1689
|
+
if (code == ExceptionCode::InstructionAddressMisaligned) {
|
|
1690
|
+
if (TINST_VALUE_ON_INSTRUCTION_ADDRESS_MISALIGNED == "always zero") {
|
|
1691
|
+
return 0;
|
|
1692
|
+
} else {
|
|
1693
|
+
unpredictable("An unpredictable value is written into tinst in response to an InstructionAddressMisaligned exception");
|
|
1694
|
+
}
|
|
1695
|
+
} else if (code == ExceptionCode::InstructionAccessFault) {
|
|
1696
|
+
# always zero
|
|
1697
|
+
return 0;
|
|
1698
|
+
} else if (code == ExceptionCode::IllegalInstruction) {
|
|
1699
|
+
# always zero
|
|
1700
|
+
return 0;
|
|
1701
|
+
} else if (code == ExceptionCode::Breakpoint) {
|
|
1702
|
+
if (TINST_VALUE_ON_BREAKPOINT == "always zero") {
|
|
1703
|
+
return 0;
|
|
1704
|
+
} else {
|
|
1705
|
+
unpredictable("An unpredictable value is written into tinst in response to a Breakpoint exception");
|
|
1706
|
+
}
|
|
1707
|
+
} else if (code == ExceptionCode::VirtualInstruction) {
|
|
1708
|
+
if (TINST_VALUE_ON_VIRTUAL_INSTRUCTION == "always zero") {
|
|
1709
|
+
return 0;
|
|
1710
|
+
} else {
|
|
1711
|
+
unpredictable("An unpredictable value is written into tinst in response to a VirtualInstruction exception");
|
|
1712
|
+
}
|
|
1713
|
+
} else if (code == ExceptionCode::LoadAddressMisaligned) {
|
|
1714
|
+
if (TINST_VALUE_ON_LOAD_ADDRESS_MISALIGNED == "always zero") {
|
|
1715
|
+
return 0;
|
|
1716
|
+
} else if (TINST_VALUE_ON_LOAD_ADDRESS_MISALIGNED == "always transformed standard instruction") {
|
|
1717
|
+
return transformed_standard_instruction_for_tinst(encoding);
|
|
1718
|
+
} else {
|
|
1719
|
+
unpredictable("An unpredictable value is written into tinst in response to a LoadAddressMisaligned exception");
|
|
1720
|
+
}
|
|
1721
|
+
} else if (code == ExceptionCode::LoadAccessFault) {
|
|
1722
|
+
if (TINST_VALUE_ON_LOAD_ACCESS_FAULT == "always zero") {
|
|
1723
|
+
return 0;
|
|
1724
|
+
} else if (TINST_VALUE_ON_LOAD_ACCESS_FAULT == "always transformed standard instruction") {
|
|
1725
|
+
return transformed_standard_instruction_for_tinst(encoding);
|
|
1726
|
+
} else {
|
|
1727
|
+
unpredictable("An unpredictable value is written into tinst in response to a LoadAccessFault exception");
|
|
1728
|
+
}
|
|
1729
|
+
} else if (code == ExceptionCode::StoreAmoAddressMisaligned) {
|
|
1730
|
+
if (TINST_VALUE_ON_STORE_AMO_ADDRESS_MISALIGNED == "always zero") {
|
|
1731
|
+
return 0;
|
|
1732
|
+
} else if (TINST_VALUE_ON_STORE_AMO_ADDRESS_MISALIGNED == "always transformed standard instruction") {
|
|
1733
|
+
return transformed_standard_instruction_for_tinst(encoding);
|
|
1734
|
+
} else {
|
|
1735
|
+
unpredictable("An unpredictable value is written into tinst in response to a StoreAmoAddressMisaligned exception");
|
|
1736
|
+
}
|
|
1737
|
+
} else if (code == ExceptionCode::StoreAmoAccessFault) {
|
|
1738
|
+
if (TINST_VALUE_ON_STORE_AMO_ACCESS_FAULT == "always zero") {
|
|
1739
|
+
return 0;
|
|
1740
|
+
} else if (TINST_VALUE_ON_STORE_AMO_ACCESS_FAULT == "always transformed standard instruction") {
|
|
1741
|
+
return transformed_standard_instruction_for_tinst(encoding);
|
|
1742
|
+
} else {
|
|
1743
|
+
unpredictable("An unpredictable value is written into tinst in response to a StoreAmoAccessFault exception");
|
|
1744
|
+
}
|
|
1745
|
+
} else if (code == ExceptionCode::Ucall) {
|
|
1746
|
+
if (TINST_VALUE_ON_UCALL == "always zero") {
|
|
1747
|
+
return 0;
|
|
1748
|
+
} else {
|
|
1749
|
+
unpredictable("An unpredictable value is written into tinst in response to a UCall exception");
|
|
1750
|
+
}
|
|
1751
|
+
} else if (code == ExceptionCode::Scall) {
|
|
1752
|
+
if (TINST_VALUE_ON_SCALL == "always zero") {
|
|
1753
|
+
return 0;
|
|
1754
|
+
} else {
|
|
1755
|
+
unpredictable("An unpredictable value is written into tinst in response to a SCall exception");
|
|
1756
|
+
}
|
|
1757
|
+
} else if (code == ExceptionCode::Mcall) {
|
|
1758
|
+
if (TINST_VALUE_ON_MCALL == "always zero") {
|
|
1759
|
+
return 0;
|
|
1760
|
+
} else {
|
|
1761
|
+
unpredictable("An unpredictable value is written into tinst in response to a MCall exception");
|
|
1762
|
+
}
|
|
1763
|
+
} else if (code == ExceptionCode::VScall) {
|
|
1764
|
+
if (TINST_VALUE_ON_VSCALL == "always zero") {
|
|
1765
|
+
return 0;
|
|
1766
|
+
} else {
|
|
1767
|
+
unpredictable("An unpredictable value is written into tinst in response to a VSCall exception");
|
|
1768
|
+
}
|
|
1769
|
+
} else if (code == ExceptionCode::InstructionPageFault) {
|
|
1770
|
+
return 0;
|
|
1771
|
+
} else if (code == ExceptionCode::LoadPageFault) {
|
|
1772
|
+
if (TINST_VALUE_ON_LOAD_PAGE_FAULT == "always zero") {
|
|
1773
|
+
return 0;
|
|
1774
|
+
} else if (TINST_VALUE_ON_LOAD_PAGE_FAULT == "always transformed standard instruction") {
|
|
1775
|
+
return transformed_standard_instruction_for_tinst(encoding);
|
|
1776
|
+
} else {
|
|
1777
|
+
unpredictable("An unpredictable value is written into tinst in response to a LoadPageFault exception");
|
|
1778
|
+
}
|
|
1779
|
+
} else if (code == ExceptionCode::StoreAmoPageFault) {
|
|
1780
|
+
if (TINST_VALUE_ON_STORE_AMO_PAGE_FAULT == "always zero") {
|
|
1781
|
+
return 0;
|
|
1782
|
+
} else if (TINST_VALUE_ON_STORE_AMO_PAGE_FAULT == "always transformed standard instruction") {
|
|
1783
|
+
return transformed_standard_instruction_for_tinst(encoding);
|
|
1784
|
+
} else {
|
|
1785
|
+
unpredictable("An unpredictable value is written into tinst in response to a StoreAmoPageFault exception");
|
|
1786
|
+
}
|
|
1787
|
+
} else {
|
|
1788
|
+
assert(false, "Unhandled exception type");
|
|
1789
|
+
}
|
|
1790
|
+
}
|
|
1791
|
+
}
|
|
1792
|
+
|
|
1793
|
+
function gstage_page_walk {
|
|
1794
|
+
template
|
|
1795
|
+
U32 VA_SIZE, # virtual address size (Sv32 = 32, Sv39 = 39, Sv48 = 48, Sv57 = 57)
|
|
1796
|
+
U32 PA_SIZE, # physical address size (Sv32 = 34, Sv39 = 56, Sv48 = 56, Sv57 = 56)
|
|
1797
|
+
U32 PTESIZE, # length, in bits, of a Page Table Entry (Sv32 = 32, others = 64)
|
|
1798
|
+
U32 LEVELS # levels in the page table (Sv32 = 2, Sv39 = 3, Sv48 = 4, Sv57 = 5)
|
|
1799
|
+
returns
|
|
1800
|
+
TranslationResult # the translated address and attributes
|
|
1801
|
+
arguments
|
|
1802
|
+
XReg gpaddr, # the guest physical address to translate
|
|
1803
|
+
XReg vaddr, # the original virtual address to translate
|
|
1804
|
+
MemoryOperation op, # the operation type
|
|
1805
|
+
PrivilegeMode effective_mode, # the mode for this walk (usually effective_ldst_mode(), though different for HLV/HLX/HSV)
|
|
1806
|
+
Boolean for_final_vs_pte, # true when this walk is for a final translation, rather than an intermediate VS-stage translation to get the paddr of a guest PTE
|
|
1807
|
+
Bits<INSTR_ENC_SIZE> encoding # encoding of the instruction causing this access
|
|
1808
|
+
description {
|
|
1809
|
+
Translate guest physical address to physical address through a page walk.
|
|
1810
|
+
|
|
1811
|
+
May raise a Guest Page Fault if an error involving the page table structure occurs along the walk.
|
|
1812
|
+
|
|
1813
|
+
Implicit reads of the page table are accessed check, and may raise Access Faults.
|
|
1814
|
+
Implicit writes (updates of A/D) are also accessed checked, and may raise Access Faults
|
|
1815
|
+
|
|
1816
|
+
The translated address _is not_ accessed checked.
|
|
1817
|
+
|
|
1818
|
+
Returns the translated physical address.
|
|
1819
|
+
}
|
|
1820
|
+
body {
|
|
1821
|
+
Bits<PA_SIZE> ppn;
|
|
1822
|
+
TranslationResult result;
|
|
1823
|
+
|
|
1824
|
+
# the VPN size is 10 bits in Sv32, and 9 bits in all others
|
|
1825
|
+
U32 VPN_SIZE = (LEVELS == 2) ? 10 : 9;
|
|
1826
|
+
|
|
1827
|
+
# if there is an exception, set up the correct type
|
|
1828
|
+
ExceptionCode access_fault_code =
|
|
1829
|
+
op == MemoryOperation::Read ?
|
|
1830
|
+
ExceptionCode::LoadAccessFault :
|
|
1831
|
+
( op == MemoryOperation::Fetch ?
|
|
1832
|
+
ExceptionCode::InstructionAccessFault :
|
|
1833
|
+
ExceptionCode::StoreAmoAccessFault );
|
|
1834
|
+
|
|
1835
|
+
ExceptionCode page_fault_code =
|
|
1836
|
+
op == MemoryOperation::Read ?
|
|
1837
|
+
ExceptionCode::LoadGuestPageFault :
|
|
1838
|
+
( op == MemoryOperation::Fetch ?
|
|
1839
|
+
ExceptionCode::InstructionGuestPageFault :
|
|
1840
|
+
ExceptionCode::StoreAmoGuestPageFault );
|
|
1841
|
+
|
|
1842
|
+
Boolean mxr = for_final_vs_pte && (CSR[mstatus].MXR == 1);
|
|
1843
|
+
Boolean pbmte = implemented?(ExtensionName::Svpbmt) && CSR[menvcfg].PBMTE == 1;
|
|
1844
|
+
Boolean adue = implemented?(ExtensionName::Svadu) && CSR[menvcfg].ADUE == 1;
|
|
1845
|
+
|
|
1846
|
+
# set up the value that will be written into mtinst/htinst, if required
|
|
1847
|
+
Bits<32> tinst = tinst_value_for_guest_page_fault(op, encoding, for_final_vs_pte);
|
|
1848
|
+
|
|
1849
|
+
U32 max_gpa_width = LEVELS * VPN_SIZE + 2 + 12;
|
|
1850
|
+
if (gpaddr >> max_gpa_width != 0) {
|
|
1851
|
+
# Guest physical address is too large for the page table
|
|
1852
|
+
raise_guest_page_fault(op, gpaddr, vaddr, tinst, effective_mode);
|
|
1853
|
+
}
|
|
1854
|
+
|
|
1855
|
+
ppn = CSR[hgatp].PPN;
|
|
1856
|
+
|
|
1857
|
+
for (U32 i = (LEVELS - 1); i >= 0; i--) {
|
|
1858
|
+
# first level is x4 for G-stage, so add two bits to the vpn size
|
|
1859
|
+
U32 this_vpn_size = (i == (LEVELS - 1)) ? VPN_SIZE + 2 : VPN_SIZE;
|
|
1860
|
+
U32 vpn = (gpaddr >> (12 + VPN_SIZE*i)) & ((1 << this_vpn_size) - 1);
|
|
1861
|
+
|
|
1862
|
+
Bits<PA_SIZE> pte_paddr = (ppn << 12) + (vpn * (PTESIZE/8));
|
|
1863
|
+
|
|
1864
|
+
# check hw page table access permission
|
|
1865
|
+
if (!pma_applies?(PmaAttribute::HardwarePageTableRead, pte_paddr, PTESIZE)) {
|
|
1866
|
+
raise (access_fault_code, PrivilegeMode::U, vaddr);
|
|
1867
|
+
}
|
|
1868
|
+
access_check(pte_paddr, PTESIZE, vaddr, MemoryOperation::Read, access_fault_code, effective_mode);
|
|
1869
|
+
|
|
1870
|
+
Bits<PTESIZE> pte = read_physical_memory<PTESIZE>(pte_paddr);
|
|
1871
|
+
PteFlags pte_flags = pte[9:0];
|
|
1872
|
+
|
|
1873
|
+
# check if any reserved bits are set
|
|
1874
|
+
# Sv32 has no reserved bits, and Sv39/48/57 all have reserved bits at 58:54
|
|
1875
|
+
if ((VA_SIZE != 32) && (pte[58:54] != 0)) {
|
|
1876
|
+
raise_guest_page_fault(op, gpaddr, vaddr, tinst, effective_mode);
|
|
1877
|
+
}
|
|
1878
|
+
if (!implemented?(ExtensionName::Svrsw60t59b)) {
|
|
1879
|
+
if ((PTESIZE >= 64) && pte[60:59] != 0) {
|
|
1880
|
+
# 60:59 are reserved if Svrsw60t59b is not supported
|
|
1881
|
+
raise_guest_page_fault(op, gpaddr, vaddr, tinst, effective_mode);
|
|
1882
|
+
}
|
|
1883
|
+
}
|
|
1884
|
+
if (!implemented?(ExtensionName::Svnapot)) {
|
|
1885
|
+
if ((PTESIZE >= 64) && pte[63] != 0) {
|
|
1886
|
+
# N is reserved if Svnapot is not supported
|
|
1887
|
+
raise_guest_page_fault(op, gpaddr, vaddr, tinst, effective_mode);
|
|
1888
|
+
}
|
|
1889
|
+
}
|
|
1890
|
+
if ((PTESIZE >= 64) && !pbmte && (pte[62:61] != 0)) {
|
|
1891
|
+
# PBMTE is reserved when Svpbmt is not enabled
|
|
1892
|
+
raise_guest_page_fault(op, gpaddr, vaddr, tinst, effective_mode);
|
|
1893
|
+
}
|
|
1894
|
+
if ((PTESIZE >= 64) && pbmte && (pte[62:61] == 3)) {
|
|
1895
|
+
# PBMTE == 3 is reserved
|
|
1896
|
+
raise_guest_page_fault(op, gpaddr, vaddr, tinst, effective_mode);
|
|
1897
|
+
}
|
|
1898
|
+
|
|
1899
|
+
if (pte_flags.V == 0) {
|
|
1900
|
+
# page table entry is not valid
|
|
1901
|
+
raise_guest_page_fault(op, gpaddr, vaddr, tinst, effective_mode);
|
|
1902
|
+
}
|
|
1903
|
+
|
|
1904
|
+
if (pte_flags.R == 0 && pte_flags.W == 1) {
|
|
1905
|
+
# Writable pages must also be readable
|
|
1906
|
+
raise_guest_page_fault(op, gpaddr, vaddr, tinst, effective_mode);
|
|
1907
|
+
}
|
|
1908
|
+
|
|
1909
|
+
if (pte_flags.R == 1 || pte_flags.X == 1) {
|
|
1910
|
+
# leaf page table
|
|
1911
|
+
if (pte_flags.U == 0) {
|
|
1912
|
+
# all g-stage tables *must* be user mode accessible
|
|
1913
|
+
# since all g-stage accesses appear like U-mode accesses
|
|
1914
|
+
raise_guest_page_fault(op, gpaddr, vaddr, tinst, effective_mode);
|
|
1915
|
+
}
|
|
1916
|
+
|
|
1917
|
+
if (((op == MemoryOperation::Write) || (op == MemoryOperation::ReadModifyWrite))
|
|
1918
|
+
&& (pte_flags.W == 0)) {
|
|
1919
|
+
# not write permission for store
|
|
1920
|
+
raise_guest_page_fault(op, gpaddr, vaddr, tinst, effective_mode);
|
|
1921
|
+
} else if ((op == MemoryOperation::Fetch)
|
|
1922
|
+
&& (pte_flags.X == 0)) {
|
|
1923
|
+
# no execute permission
|
|
1924
|
+
raise_guest_page_fault(op, gpaddr, vaddr, tinst, effective_mode);
|
|
1925
|
+
} else if ((op == MemoryOperation::Read) || (op == MemoryOperation::ReadModifyWrite)) {
|
|
1926
|
+
if (((!mxr) && (pte_flags.R == 0))
|
|
1927
|
+
|| ((mxr) && (pte_flags.X == 0 && pte_flags.R == 0))) {
|
|
1928
|
+
# no read permission
|
|
1929
|
+
raise_guest_page_fault(op, gpaddr, vaddr, tinst, effective_mode);
|
|
1930
|
+
}
|
|
1931
|
+
}
|
|
1932
|
+
|
|
1933
|
+
# ensure remaining PPN bits are zero, otherwise there is a misaligned super page
|
|
1934
|
+
if ((i > 0) && (pte[(i-1)*VPN_SIZE:0] != 0)) {
|
|
1935
|
+
raise_guest_page_fault(op, gpaddr, vaddr, tinst, effective_mode);
|
|
1936
|
+
}
|
|
1937
|
+
|
|
1938
|
+
# check access and dirty bits
|
|
1939
|
+
if ((pte_flags.A == 0) # access is clear
|
|
1940
|
+
|| ((pte_flags.D == 0) # or dirty is clear and this is a (read-modify-)write
|
|
1941
|
+
&& ((op == MemoryOperation::Write)
|
|
1942
|
+
|| (op == MemoryOperation::ReadModifyWrite)))) {
|
|
1943
|
+
|
|
1944
|
+
# check for hardware update of A/D bits
|
|
1945
|
+
if (adue) {
|
|
1946
|
+
# Svadu requires page tables to be located in memory with hardware page-table write access
|
|
1947
|
+
# and RsrvEventual PMA
|
|
1948
|
+
if (!pma_applies?(PmaAttribute::RsrvEventual, pte_paddr, PTESIZE)) {
|
|
1949
|
+
raise (access_fault_code, PrivilegeMode::U, vaddr);
|
|
1950
|
+
}
|
|
1951
|
+
if (!pma_applies?(PmaAttribute::HardwarePageTableWrite, pte_paddr, PTESIZE)) {
|
|
1952
|
+
raise (access_fault_code, PrivilegeMode::U, vaddr);
|
|
1953
|
+
}
|
|
1954
|
+
|
|
1955
|
+
access_check(pte_paddr, PTESIZE, vaddr, MemoryOperation::Write, access_fault_code, effective_mode);
|
|
1956
|
+
|
|
1957
|
+
Boolean success;
|
|
1958
|
+
Bits<PTESIZE> updated_pte;
|
|
1959
|
+
if (pte_flags.D == 0 && (op == MemoryOperation::Write || op == MemoryOperation::ReadModifyWrite)) {
|
|
1960
|
+
# try to set both A and D bits
|
|
1961
|
+
updated_pte = pte | 0b11000000;
|
|
1962
|
+
} else {
|
|
1963
|
+
# try to set the A bit
|
|
1964
|
+
updated_pte = pte | 0b01000000;
|
|
1965
|
+
}
|
|
1966
|
+
|
|
1967
|
+
if (PTESIZE == 32) {
|
|
1968
|
+
success = atomic_check_then_write_32(pte_paddr, pte, updated_pte);
|
|
1969
|
+
} else if (PTESIZE == 64) {
|
|
1970
|
+
success = atomic_check_then_write_64(pte_paddr, pte, updated_pte);
|
|
1971
|
+
} else {
|
|
1972
|
+
assert(false, "Unexpected PTESIZE");
|
|
1973
|
+
}
|
|
1974
|
+
|
|
1975
|
+
|
|
1976
|
+
if (!success) {
|
|
1977
|
+
# the PTE changed between the read during the walk and the attempted atomic update
|
|
1978
|
+
# roll back, and try this level again
|
|
1979
|
+
i = i + 1;
|
|
1980
|
+
} else {
|
|
1981
|
+
# successful translation and update
|
|
1982
|
+
result.paddr = pte_paddr;
|
|
1983
|
+
if (PTESIZE >= 64) {
|
|
1984
|
+
result.pbmt = $enum(Pbmt, pte[62:61]);
|
|
1985
|
+
}
|
|
1986
|
+
result.pte_flags = pte_flags;
|
|
1987
|
+
return result;
|
|
1988
|
+
}
|
|
1989
|
+
} else {
|
|
1990
|
+
# A or D bit needs updated
|
|
1991
|
+
raise_guest_page_fault(op, gpaddr, vaddr, tinst, effective_mode);
|
|
1992
|
+
}
|
|
1993
|
+
}
|
|
1994
|
+
|
|
1995
|
+
} else {
|
|
1996
|
+
# pointer to next level
|
|
1997
|
+
if (i == 0) {
|
|
1998
|
+
# a pointer can't exist on the last level
|
|
1999
|
+
raise_guest_page_fault(op, gpaddr, vaddr, tinst, effective_mode);
|
|
2000
|
+
}
|
|
2001
|
+
|
|
2002
|
+
if (pte_flags.D == 1 || pte_flags.A == 1 || pte_flags.U == 1) {
|
|
2003
|
+
# D, A, and U are reserved in non-leaf PTEs
|
|
2004
|
+
raise_guest_page_fault(op, gpaddr, vaddr, tinst, effective_mode);
|
|
2005
|
+
}
|
|
2006
|
+
|
|
2007
|
+
if ((VA_SIZE != 32) && (pte[62:61] != 0)) {
|
|
2008
|
+
# PBMT must be zero in a pointer PTE
|
|
2009
|
+
raise_guest_page_fault(op, gpaddr, vaddr, tinst, effective_mode);
|
|
2010
|
+
}
|
|
2011
|
+
|
|
2012
|
+
if ((VA_SIZE != 32) && pte[63] != 0) {
|
|
2013
|
+
# N must be zero in a pointer PTE
|
|
2014
|
+
raise_guest_page_fault(op, gpaddr, vaddr, tinst, effective_mode);
|
|
2015
|
+
}
|
|
2016
|
+
|
|
2017
|
+
# fall through to next level
|
|
2018
|
+
ppn = pte[PA_SIZE-3:10] << 12;
|
|
2019
|
+
}
|
|
2020
|
+
}
|
|
2021
|
+
}
|
|
2022
|
+
}
|
|
2023
|
+
|
|
2024
|
+
|
|
2025
|
+
function stage1_page_walk {
|
|
2026
|
+
template
|
|
2027
|
+
U32 VA_SIZE, # virtual address size (Sv32 = 32, Sv39 = 39, Sv48 = 48, Sv57 = 57)
|
|
2028
|
+
U32 PA_SIZE, # physical address size (Sv32 = 34, Sv39 = 56, Sv48 = 56, Sv57 = 56)
|
|
2029
|
+
U32 PTESIZE, # length, in bits, of a Page Table Entry (Sv32 = 4, others = 8)
|
|
2030
|
+
U32 LEVELS # levels in the page table (Sv32 = 2, Sv39 = 3, Sv48 = 4, Sv57 = 5)
|
|
2031
|
+
returns
|
|
2032
|
+
TranslationResult # the translated address and attributes
|
|
2033
|
+
arguments
|
|
2034
|
+
Bits<MXLEN> vaddr, # the virtual address to translate
|
|
2035
|
+
MemoryOperation op, # the operation type
|
|
2036
|
+
PrivilegeMode effective_mode, # the mode for this walk (usually effective_ldst_mode(), though different for HLV/HLX/HSV)
|
|
2037
|
+
Bits<INSTR_ENC_SIZE> encoding # encoding of the instruction causing this access
|
|
2038
|
+
description {
|
|
2039
|
+
Translate virtual address to physical address through a page walk.
|
|
2040
|
+
|
|
2041
|
+
May raise a Page Fault if an error involving the page table structure occurs along the walk.
|
|
2042
|
+
|
|
2043
|
+
Implicit reads of the page table are accessed check, and may raise Access Faults.
|
|
2044
|
+
Implicit writes (updates of A/D) are also accessed checked, and may raise Access Faults
|
|
2045
|
+
|
|
2046
|
+
The translated address _is not_ accessed checked.
|
|
2047
|
+
|
|
2048
|
+
Returns the translated guest physical address.
|
|
2049
|
+
}
|
|
2050
|
+
body {
|
|
2051
|
+
Bits<PA_SIZE> ppn;
|
|
2052
|
+
TranslationResult result;
|
|
2053
|
+
|
|
2054
|
+
# the VPN size is 10 bits in Sv32, and 9 bits in all others
|
|
2055
|
+
U32 VPN_SIZE = (LEVELS == 2) ? 10 : 9;
|
|
2056
|
+
|
|
2057
|
+
# if there is an exception, set up the correct type
|
|
2058
|
+
ExceptionCode access_fault_code =
|
|
2059
|
+
op == MemoryOperation::Read ?
|
|
2060
|
+
ExceptionCode::LoadAccessFault :
|
|
2061
|
+
( op == MemoryOperation::Fetch ?
|
|
2062
|
+
ExceptionCode::InstructionAccessFault :
|
|
2063
|
+
ExceptionCode::StoreAmoAccessFault );
|
|
2064
|
+
|
|
2065
|
+
ExceptionCode page_fault_code =
|
|
2066
|
+
op == MemoryOperation::Read ?
|
|
2067
|
+
ExceptionCode::LoadPageFault :
|
|
2068
|
+
( op == MemoryOperation::Fetch ?
|
|
2069
|
+
ExceptionCode::InstructionPageFault :
|
|
2070
|
+
ExceptionCode::StoreAmoPageFault );
|
|
2071
|
+
|
|
2072
|
+
# shadow stacks enabled?
|
|
2073
|
+
Boolean sse = false;
|
|
2074
|
+
# if (CSR[misa].H == 1 && effective_mode == PrivilegeMode::VS) {
|
|
2075
|
+
# sse = CSR[henvcfg].SSE == 1;
|
|
2076
|
+
# } else if (CSR[misa].H == 1 && effective_mode == PrivilegeMode::VU) {
|
|
2077
|
+
# sse = CSR[senvcfg].SSE == 1;
|
|
2078
|
+
# } else if (CSR[misa].U == 1 && effective_mode == PrivilegeMode::U) {
|
|
2079
|
+
# sse = CSR[senvcfg].SSE == 1;
|
|
2080
|
+
# } else if (CSR[misa].S == 1 && effective_mode == PrivilegeMode::S) {
|
|
2081
|
+
# sse = CSR[menvcfg].SSE == 1;
|
|
2082
|
+
# } else {
|
|
2083
|
+
# # M-mode
|
|
2084
|
+
# sse = false;
|
|
2085
|
+
# }
|
|
2086
|
+
|
|
2087
|
+
# access/dirty bit hardware update enable?
|
|
2088
|
+
Boolean adue;
|
|
2089
|
+
if (CSR[misa].H == 1 && (effective_mode == PrivilegeMode::VS || effective_mode == PrivilegeMode::VU)) {
|
|
2090
|
+
adue = implemented?(ExtensionName::Svadu) && CSR[henvcfg].ADUE == 1;
|
|
2091
|
+
} else {
|
|
2092
|
+
adue = implemented?(ExtensionName::Svadu) && CSR[menvcfg].ADUE == 1;
|
|
2093
|
+
}
|
|
2094
|
+
|
|
2095
|
+
# Page-based memory type enable?
|
|
2096
|
+
Boolean pbmte;
|
|
2097
|
+
if (VA_SIZE == 32) {
|
|
2098
|
+
# not Sv32 (PBMT is not defined for Sv32)
|
|
2099
|
+
pbmte = false;
|
|
2100
|
+
} else {
|
|
2101
|
+
if (CSR[misa].H == 1 && (effective_mode == PrivilegeMode::VS || effective_mode == PrivilegeMode::VU)) {
|
|
2102
|
+
pbmte = implemented?(ExtensionName::Svpbmt) && CSR[henvcfg].PBMTE == 1;
|
|
2103
|
+
} else {
|
|
2104
|
+
pbmte = implemented?(ExtensionName::Svpbmt) && CSR[menvcfg].PBMTE == 1;
|
|
2105
|
+
}
|
|
2106
|
+
}
|
|
2107
|
+
|
|
2108
|
+
# make execute readable?
|
|
2109
|
+
Boolean mxr;
|
|
2110
|
+
if (CSR[misa].H == 1 && (effective_mode == PrivilegeMode::VS || effective_mode == PrivilegeMode::VU)) {
|
|
2111
|
+
# HS-level sstatus.MXR makes execute-only pages readable for both stages of address translation
|
|
2112
|
+
# (VS-stage and G-stage), whereas vsstatus.MXR affects only the first translation stage (VS-stage)
|
|
2113
|
+
mxr = (CSR[mstatus].MXR == 1) || (CSR[vsstatus].MXR == 1);
|
|
2114
|
+
ppn = CSR[vsatp].PPN;
|
|
2115
|
+
} else {
|
|
2116
|
+
mxr = CSR[mstatus].MXR == 1;
|
|
2117
|
+
ppn = CSR[satp].PPN;
|
|
2118
|
+
}
|
|
2119
|
+
|
|
2120
|
+
# Supervisor access user page?
|
|
2121
|
+
Boolean sum;
|
|
2122
|
+
if (CSR[misa].H == 1 && (effective_mode == PrivilegeMode::VS)) {
|
|
2123
|
+
sum = CSR[vsstatus].SUM == 1;
|
|
2124
|
+
} else {
|
|
2125
|
+
sum = CSR[mstatus].SUM == 1;
|
|
2126
|
+
}
|
|
2127
|
+
|
|
2128
|
+
if ((VA_SIZE < xlen()) && (vaddr[xlen()-1:VA_SIZE] != {xlen()-VA_SIZE{vaddr[VA_SIZE - 1]}})) {
|
|
2129
|
+
# non-canonical virtual address raises a page fault
|
|
2130
|
+
# note that if pointer masking is enabled,
|
|
2131
|
+
# vaddr has already been transformed before reaching here
|
|
2132
|
+
raise (page_fault_code, mode(), vaddr);
|
|
2133
|
+
}
|
|
2134
|
+
|
|
2135
|
+
for (U32 I = (LEVELS - 1); I >= 0; I--) {
|
|
2136
|
+
U32 vpn = (vaddr >> (12 + VPN_SIZE*I)) & ((1 `<< VPN_SIZE) - 1);
|
|
2137
|
+
|
|
2138
|
+
Bits<PA_SIZE> pte_gpaddr = (ppn << 12) + (vpn * (PTESIZE/8));
|
|
2139
|
+
|
|
2140
|
+
TranslationResult pte_phys =
|
|
2141
|
+
translate_gstage(
|
|
2142
|
+
pte_gpaddr,
|
|
2143
|
+
vaddr,
|
|
2144
|
+
MemoryOperation::Read,
|
|
2145
|
+
effective_mode,
|
|
2146
|
+
encoding
|
|
2147
|
+
);
|
|
2148
|
+
|
|
2149
|
+
# check hw page table access permission
|
|
2150
|
+
if (!pma_applies?(PmaAttribute::HardwarePageTableRead, pte_phys.paddr, PTESIZE)) {
|
|
2151
|
+
raise (access_fault_code, mode(), vaddr);
|
|
2152
|
+
}
|
|
2153
|
+
|
|
2154
|
+
# perform access check on the physical address of pte before it's used
|
|
2155
|
+
access_check(pte_phys.paddr, PTESIZE, vaddr, MemoryOperation::Read, access_fault_code, effective_mode);
|
|
2156
|
+
|
|
2157
|
+
Bits<PTESIZE> pte = read_physical_memory<PTESIZE>(pte_phys.paddr);
|
|
2158
|
+
PteFlags pte_flags = pte[9:0];
|
|
2159
|
+
|
|
2160
|
+
# shadow stack page?
|
|
2161
|
+
Boolean ss_page = (pte_flags.R == 0) && (pte_flags.W == 1) && (pte_flags.X == 0);
|
|
2162
|
+
|
|
2163
|
+
# check if any reserved bits are set
|
|
2164
|
+
# Sv32 has no reserved bits, and Sv39/48/57 all have reserved bits at 58:54
|
|
2165
|
+
if ((VA_SIZE != 32) && (pte[58:54] != 0)) {
|
|
2166
|
+
raise(page_fault_code, mode(), vaddr);
|
|
2167
|
+
}
|
|
2168
|
+
|
|
2169
|
+
if (pte_flags.V == 0) {
|
|
2170
|
+
# invalid entry
|
|
2171
|
+
raise (page_fault_code, mode(), vaddr);
|
|
2172
|
+
}
|
|
2173
|
+
|
|
2174
|
+
if (!sse) {
|
|
2175
|
+
if ((pte_flags.R == 0) && (pte_flags.W == 1)) {
|
|
2176
|
+
# write permission must also have read permission
|
|
2177
|
+
raise (page_fault_code, mode(), vaddr);
|
|
2178
|
+
}
|
|
2179
|
+
}
|
|
2180
|
+
|
|
2181
|
+
if (pbmte) {
|
|
2182
|
+
# PBMT == 3 is reserved
|
|
2183
|
+
if (pte[62:61] == 3) {
|
|
2184
|
+
raise (page_fault_code, mode(), vaddr);
|
|
2185
|
+
}
|
|
2186
|
+
} else {
|
|
2187
|
+
# PBMT is reserved if Svpbmt is not supported)
|
|
2188
|
+
if ((PTESIZE >= 64) && (pte[62:61] != 0)) {
|
|
2189
|
+
raise (page_fault_code, mode(), vaddr);
|
|
2190
|
+
}
|
|
2191
|
+
}
|
|
2192
|
+
|
|
2193
|
+
if (!implemented?(ExtensionName::Svrsw60t59b)) {
|
|
2194
|
+
if ((PTESIZE >= 64) && pte[60:59] != 0) {
|
|
2195
|
+
# 60:59 are reserved if Svrsw60t59b is not supported
|
|
2196
|
+
raise (page_fault_code, mode(), vaddr);
|
|
2197
|
+
}
|
|
2198
|
+
}
|
|
2199
|
+
|
|
2200
|
+
if (!implemented?(ExtensionName::Svnapot)) {
|
|
2201
|
+
if ((PTESIZE >= 64) && (pte[63] != 0)) {
|
|
2202
|
+
# N is reserved if Svnapot is not supported
|
|
2203
|
+
raise (page_fault_code, mode(), vaddr);
|
|
2204
|
+
}
|
|
2205
|
+
}
|
|
2206
|
+
|
|
2207
|
+
if (pte_flags.R == 1 || pte_flags.X == 1) {
|
|
2208
|
+
# found a leaf PTE
|
|
2209
|
+
Bits<PA_SIZE> paddr_base = pte[PA_SIZE-3:I*VPN_SIZE + 10] `<< (I*VPN_SIZE + 12);
|
|
2210
|
+
Bits<PA_SIZE> offset = vaddr[I*VPN_SIZE + 11:0];
|
|
2211
|
+
|
|
2212
|
+
# see if there is permission to perform the access
|
|
2213
|
+
if (op == MemoryOperation::Read || op == MemoryOperation::ReadModifyWrite) {
|
|
2214
|
+
if (((!mxr) && (pte_flags.R == 0))
|
|
2215
|
+
|| ((mxr) && (pte_flags.X == 0 && pte_flags.R == 0))) {
|
|
2216
|
+
# no read permission
|
|
2217
|
+
raise (page_fault_code, mode(), vaddr);
|
|
2218
|
+
}
|
|
2219
|
+
|
|
2220
|
+
if (effective_mode == PrivilegeMode::U && pte_flags.U == 0) {
|
|
2221
|
+
# U-mode can never access supervisor page
|
|
2222
|
+
raise (page_fault_code, mode(), vaddr);
|
|
2223
|
+
} else if (CSR[misa].H == 1 && effective_mode == PrivilegeMode::VU && pte_flags.U == 0) {
|
|
2224
|
+
# VU-mode can never access supervisor page
|
|
2225
|
+
raise (page_fault_code, mode(), vaddr);
|
|
2226
|
+
} else if (effective_mode == PrivilegeMode::S && pte_flags.U == 1 && !sum) {
|
|
2227
|
+
# S-mode cannot access User page unless mstatus.SUM == 1
|
|
2228
|
+
raise (page_fault_code, mode(), vaddr);
|
|
2229
|
+
} else if (effective_mode == PrivilegeMode::VS && pte_flags.U == 1 && !sum) {
|
|
2230
|
+
# VS-mode cannot access User page unless vsstatus.SUM == 1
|
|
2231
|
+
raise (page_fault_code, mode(), vaddr);
|
|
2232
|
+
}
|
|
2233
|
+
}
|
|
2234
|
+
if (((op == MemoryOperation::Write) || (op == MemoryOperation::ReadModifyWrite))
|
|
2235
|
+
&& (pte_flags.W == 0)) {
|
|
2236
|
+
# no write permission
|
|
2237
|
+
raise (page_fault_code, mode(), vaddr);
|
|
2238
|
+
} else if ((op == MemoryOperation::Fetch) && (pte_flags.X == 0)) {
|
|
2239
|
+
# no execute permission
|
|
2240
|
+
raise (page_fault_code, mode(), vaddr);
|
|
2241
|
+
} else if ((op == MemoryOperation::Fetch) && ss_page) {
|
|
2242
|
+
# fetch from Shadow Stack never allowed
|
|
2243
|
+
raise (page_fault_code, mode(), vaddr);
|
|
2244
|
+
}
|
|
2245
|
+
|
|
2246
|
+
# ensure remaining PPN bits are zero, otherwise there is a misaligned super page
|
|
2247
|
+
raise (page_fault_code, mode(), vaddr) if ((I > 0) && (pte[I*VPN_SIZE + 10:10] != 0));
|
|
2248
|
+
|
|
2249
|
+
# check access and dirty bits
|
|
2250
|
+
if ((pte_flags.A == 0) # access is clear
|
|
2251
|
+
|| ((pte_flags.D == 0) # or dirty is clear and this is a (read-modify-)write
|
|
2252
|
+
&& ((op == MemoryOperation::Write)
|
|
2253
|
+
|| (op == MemoryOperation::ReadModifyWrite)))) {
|
|
2254
|
+
|
|
2255
|
+
# check for hardware update of A/D bits
|
|
2256
|
+
if (adue) {
|
|
2257
|
+
# translate again, this time with write permission
|
|
2258
|
+
TranslationResult pte_phys =
|
|
2259
|
+
translate_gstage(
|
|
2260
|
+
pte_gpaddr,
|
|
2261
|
+
vaddr,
|
|
2262
|
+
MemoryOperation::Write,
|
|
2263
|
+
effective_mode,
|
|
2264
|
+
encoding
|
|
2265
|
+
);
|
|
2266
|
+
|
|
2267
|
+
# Svadu requires page tables to be located in memory with hardware page-table write access
|
|
2268
|
+
# and RsrvEventual PMA
|
|
2269
|
+
if (!pma_applies?(PmaAttribute::RsrvEventual, pte_phys.paddr, PTESIZE)) {
|
|
2270
|
+
raise (access_fault_code, effective_mode, vaddr);
|
|
2271
|
+
}
|
|
2272
|
+
if (!pma_applies?(PmaAttribute::HardwarePageTableWrite, pte_phys.paddr, PTESIZE)) {
|
|
2273
|
+
raise (access_fault_code, effective_mode, vaddr);
|
|
2274
|
+
}
|
|
2275
|
+
|
|
2276
|
+
access_check(pte_phys.paddr, PTESIZE, vaddr, MemoryOperation::Write, access_fault_code, effective_mode);
|
|
2277
|
+
|
|
2278
|
+
Boolean success;
|
|
2279
|
+
Bits<PTESIZE> updated_pte;
|
|
2280
|
+
if (pte_flags.D == 0 && (op == MemoryOperation::Write || op == MemoryOperation::ReadModifyWrite)) {
|
|
2281
|
+
# try to set both A and D bits
|
|
2282
|
+
updated_pte = pte | 0b11000000;
|
|
2283
|
+
} else {
|
|
2284
|
+
# try to set the A bit
|
|
2285
|
+
updated_pte = pte | 0b01000000;
|
|
2286
|
+
}
|
|
2287
|
+
|
|
2288
|
+
if (PTESIZE == 32) {
|
|
2289
|
+
success = atomic_check_then_write_32(pte_phys.paddr, pte, updated_pte);
|
|
2290
|
+
} else if (PTESIZE == 64) {
|
|
2291
|
+
success = atomic_check_then_write_64(pte_phys.paddr, pte, updated_pte);
|
|
2292
|
+
} else {
|
|
2293
|
+
assert(false, "Unexpected PTESIZE");
|
|
2294
|
+
}
|
|
2295
|
+
|
|
2296
|
+
|
|
2297
|
+
if (!success) {
|
|
2298
|
+
# the PTE changed between the read during the walk and the attempted atomic update
|
|
2299
|
+
# roll back, and try this level again
|
|
2300
|
+
I = I + 1;
|
|
2301
|
+
} else {
|
|
2302
|
+
# successful translation and update
|
|
2303
|
+
|
|
2304
|
+
TranslationResult pte_phys = translate_gstage(
|
|
2305
|
+
paddr_base + offset,
|
|
2306
|
+
vaddr,
|
|
2307
|
+
op,
|
|
2308
|
+
effective_mode,
|
|
2309
|
+
encoding
|
|
2310
|
+
);
|
|
2311
|
+
result.paddr = pte_phys.paddr;
|
|
2312
|
+
result.pbmt = pte_phys.pbmt == Pbmt::PMA ? $enum(Pbmt, pte[62:61]) : pte_phys.pbmt;
|
|
2313
|
+
result.pte_flags = pte_flags;
|
|
2314
|
+
return result;
|
|
2315
|
+
}
|
|
2316
|
+
} else {
|
|
2317
|
+
# A or D bit needs updated
|
|
2318
|
+
raise(page_fault_code, mode(), vaddr);
|
|
2319
|
+
}
|
|
2320
|
+
}
|
|
2321
|
+
|
|
2322
|
+
# translation succeeded
|
|
2323
|
+
TranslationResult pte_phys =
|
|
2324
|
+
translate_gstage(
|
|
2325
|
+
paddr_base + offset,
|
|
2326
|
+
vaddr,
|
|
2327
|
+
op,
|
|
2328
|
+
effective_mode,
|
|
2329
|
+
encoding
|
|
2330
|
+
);
|
|
2331
|
+
result.paddr = pte_phys.paddr;
|
|
2332
|
+
if (PTESIZE >= 64) {
|
|
2333
|
+
result.pbmt = pte_phys.pbmt == Pbmt::PMA ? $enum(Pbmt, pte[62:61]) : pte_phys.pbmt;
|
|
2334
|
+
}
|
|
2335
|
+
result.pte_flags = pte_flags;
|
|
2336
|
+
return result;
|
|
2337
|
+
} else {
|
|
2338
|
+
# found a pointer to the next level
|
|
2339
|
+
|
|
2340
|
+
if (I == 0) {
|
|
2341
|
+
# a pointer can't exist on the last level
|
|
2342
|
+
raise (page_fault_code, mode(), vaddr);
|
|
2343
|
+
}
|
|
2344
|
+
|
|
2345
|
+
if (pte_flags.D == 1 || pte_flags.A == 1 || pte_flags.U == 1) {
|
|
2346
|
+
# D, A, and U are reserved in non-leaf PTEs
|
|
2347
|
+
raise (page_fault_code, mode(), vaddr);
|
|
2348
|
+
}
|
|
2349
|
+
|
|
2350
|
+
if ((VA_SIZE != 32) && (pte[62:61] != 0)) {
|
|
2351
|
+
# PBMT must be zero in a pointer PTE
|
|
2352
|
+
raise (page_fault_code, mode(), vaddr);
|
|
2353
|
+
}
|
|
2354
|
+
|
|
2355
|
+
if ((VA_SIZE != 32) && pte[63] != 0) {
|
|
2356
|
+
# N must be zero in a pointer PTE
|
|
2357
|
+
raise (page_fault_code, mode(), vaddr);
|
|
2358
|
+
}
|
|
2359
|
+
|
|
2360
|
+
# fall through to next level
|
|
2361
|
+
ppn = pte[PA_SIZE-3:10];
|
|
2362
|
+
}
|
|
2363
|
+
}
|
|
2364
|
+
}
|
|
2365
|
+
}
|
|
2366
|
+
|
|
2367
|
+
function translate {
|
|
2368
|
+
returns
|
|
2369
|
+
TranslationResult # translated physical address and PBMT value (for Svpbmt)
|
|
2370
|
+
arguments
|
|
2371
|
+
XReg vaddr,
|
|
2372
|
+
MemoryOperation op,
|
|
2373
|
+
PrivilegeMode effective_mode,
|
|
2374
|
+
Bits<INSTR_ENC_SIZE> encoding # encoding of the instruction causing this access
|
|
2375
|
+
description {
|
|
2376
|
+
Translate a virtual address for operation type +op+ that appears to execute at
|
|
2377
|
+
+effective_mode+.
|
|
2378
|
+
|
|
2379
|
+
The translation will depend on the effective privilege mode.
|
|
2380
|
+
|
|
2381
|
+
May raise a Page Fault or Access Fault.
|
|
2382
|
+
|
|
2383
|
+
The final physical address is *not* access checked (for PMP, PMA, etc., violations).
|
|
2384
|
+
(though intermediate page table reads will be)
|
|
2385
|
+
}
|
|
2386
|
+
body {
|
|
2387
|
+
|
|
2388
|
+
#####################################################################
|
|
2389
|
+
# First, check for a cached translation result
|
|
2390
|
+
#####################################################################
|
|
2391
|
+
|
|
2392
|
+
Boolean cached_translation_valid;
|
|
2393
|
+
CachedTranslationResult cached_translation_result;
|
|
2394
|
+
|
|
2395
|
+
cached_translation_result =
|
|
2396
|
+
cached_translation(vaddr, op);
|
|
2397
|
+
|
|
2398
|
+
if (cached_translation_result.valid) {
|
|
2399
|
+
return cached_translation_result.result;
|
|
2400
|
+
}
|
|
2401
|
+
|
|
2402
|
+
#####################################################################
|
|
2403
|
+
# No cached translation, so go through the full translation process
|
|
2404
|
+
#####################################################################
|
|
2405
|
+
|
|
2406
|
+
TranslationResult result;
|
|
2407
|
+
|
|
2408
|
+
if (effective_mode == PrivilegeMode::M) {
|
|
2409
|
+
# there is no translation in M-mode
|
|
2410
|
+
result.paddr = vaddr;
|
|
2411
|
+
return result;
|
|
2412
|
+
}
|
|
2413
|
+
|
|
2414
|
+
SatpMode translation_mode =
|
|
2415
|
+
current_translation_mode(effective_mode);
|
|
2416
|
+
|
|
2417
|
+
if (translation_mode == SatpMode::Reserved) {
|
|
2418
|
+
if (op == MemoryOperation::Read) {
|
|
2419
|
+
raise (ExceptionCode::LoadPageFault, mode(), vaddr);
|
|
2420
|
+
} else if (op == MemoryOperation::Write || op == MemoryOperation::ReadModifyWrite) {
|
|
2421
|
+
raise (ExceptionCode::StoreAmoPageFault, mode(), vaddr);
|
|
2422
|
+
} else {
|
|
2423
|
+
assert(op == MemoryOperation::Fetch, "Unexpected memory operation");
|
|
2424
|
+
raise (ExceptionCode::InstructionPageFault, mode(), vaddr);
|
|
2425
|
+
}
|
|
2426
|
+
}
|
|
2427
|
+
|
|
2428
|
+
|
|
2429
|
+
if (translation_mode == SatpMode::Bare) {
|
|
2430
|
+
result.paddr = vaddr;
|
|
2431
|
+
} else if (xlen() == 32 && translation_mode == SatpMode::Sv32) {
|
|
2432
|
+
# Sv32 page table walk
|
|
2433
|
+
result = stage1_page_walk<32, 34, 32, 2>(vaddr, op, effective_mode, encoding);
|
|
2434
|
+
} else if (xlen() == 64 && translation_mode == SatpMode::Sv39) {
|
|
2435
|
+
# Sv39 page table walk
|
|
2436
|
+
result = stage1_page_walk<39, 56, 64, 3>(vaddr, op, effective_mode, encoding);
|
|
2437
|
+
} else if (xlen() == 64 && translation_mode == SatpMode::Sv48) {
|
|
2438
|
+
# Sv48 page table walk
|
|
2439
|
+
result = stage1_page_walk<48, 56, 64, 4>(vaddr, op, effective_mode, encoding);
|
|
2440
|
+
} else if (xlen() == 64 && translation_mode == SatpMode::Sv57) {
|
|
2441
|
+
# Sv57 page table walk
|
|
2442
|
+
result = stage1_page_walk<57, 56, 64, 5>(vaddr, op, effective_mode, encoding);
|
|
2443
|
+
} else {
|
|
2444
|
+
assert(false, "Unexpected SatpMode");
|
|
2445
|
+
}
|
|
2446
|
+
|
|
2447
|
+
maybe_cache_translation(vaddr, op, result);
|
|
2448
|
+
return result;
|
|
2449
|
+
}
|
|
2450
|
+
}
|
|
2451
|
+
|
|
2452
|
+
function canonical_vaddr? {
|
|
2453
|
+
returns Boolean
|
|
2454
|
+
arguments XReg vaddr
|
|
2455
|
+
description {
|
|
2456
|
+
Returns whether or not _vaddr_ is a valid (_i.e._, canonical) virtual address.
|
|
2457
|
+
|
|
2458
|
+
If pointer masking (S**pm) is enabled, then vaddr will be masked before checking
|
|
2459
|
+
the canonical address.
|
|
2460
|
+
}
|
|
2461
|
+
body {
|
|
2462
|
+
if (CSR[misa].S == 1'b0) {
|
|
2463
|
+
# there is no translation, any address is canonical
|
|
2464
|
+
return true;
|
|
2465
|
+
}
|
|
2466
|
+
|
|
2467
|
+
# canonical depends on the virtual address size in the current translation mode
|
|
2468
|
+
SatpMode satp_mode;
|
|
2469
|
+
if (virtual_mode?()) {
|
|
2470
|
+
satp_mode = $enum(SatpMode, CSR[vsatp].MODE);
|
|
2471
|
+
} else {
|
|
2472
|
+
satp_mode = $enum(SatpMode, CSR[satp].MODE);
|
|
2473
|
+
}
|
|
2474
|
+
|
|
2475
|
+
# calculate the effective address after pointer masking
|
|
2476
|
+
XReg eaddr = mask_eaddr(vaddr);
|
|
2477
|
+
|
|
2478
|
+
if (SATP_MODE_BARE && (satp_mode == SatpMode::Bare)) {
|
|
2479
|
+
return true;
|
|
2480
|
+
} else if ((MXLEN == 32) && satp_mode == SatpMode::Sv32) {
|
|
2481
|
+
# Sv32 uses all 32 bits of the VA
|
|
2482
|
+
return true;
|
|
2483
|
+
} else if ((MXLEN == 64) && satp_mode == SatpMode::Sv39) {
|
|
2484
|
+
return eaddr[63:39] == {25{eaddr[38]}};
|
|
2485
|
+
} else if ((MXLEN == 64) && satp_mode == SatpMode::Sv48) {
|
|
2486
|
+
return eaddr[63:48] == {16{eaddr[47]}};
|
|
2487
|
+
} else if ((MXLEN == 64) && satp_mode == SatpMode::Sv57) {
|
|
2488
|
+
return eaddr[63:57] == {6{eaddr[56]}};
|
|
2489
|
+
}
|
|
2490
|
+
}
|
|
2491
|
+
}
|
|
2492
|
+
|
|
2493
|
+
function canonical_gpaddr? {
|
|
2494
|
+
returns Boolean
|
|
2495
|
+
arguments XReg gpaddr
|
|
2496
|
+
description {
|
|
2497
|
+
Returns whether or not +gpaddr+ is a valid (_i.e._, canonical) guest physical address.
|
|
2498
|
+
}
|
|
2499
|
+
body {
|
|
2500
|
+
|
|
2501
|
+
# canonical depends on the virtual address size in the current translation mode
|
|
2502
|
+
SatpMode satp_mode = $enum(SatpMode, CSR[satp].MODE);
|
|
2503
|
+
|
|
2504
|
+
if (satp_mode == SatpMode::Bare) {
|
|
2505
|
+
return true;
|
|
2506
|
+
} else if (satp_mode == SatpMode::Sv32) {
|
|
2507
|
+
# Sv32 uses all 32 bits of the VA
|
|
2508
|
+
return true;
|
|
2509
|
+
} else if ((MXLEN > 32) && (satp_mode == SatpMode::Sv39)) {
|
|
2510
|
+
return gpaddr[63:39] == {25{gpaddr[38]}};
|
|
2511
|
+
} else if ((MXLEN > 32) && (satp_mode == SatpMode::Sv48)) {
|
|
2512
|
+
return gpaddr[63:48] == {16{gpaddr[47]}};
|
|
2513
|
+
} else if ((MXLEN > 32) && (satp_mode == SatpMode::Sv57)) {
|
|
2514
|
+
return gpaddr[63:57] == {6{gpaddr[56]}};
|
|
2515
|
+
}
|
|
2516
|
+
}
|
|
2517
|
+
}
|
|
2518
|
+
|
|
2519
|
+
function misaligned_is_atomic? {
|
|
2520
|
+
template U32 N
|
|
2521
|
+
returns Boolean
|
|
2522
|
+
arguments Bits<PHYS_ADDR_WIDTH> physical_address
|
|
2523
|
+
description {
|
|
2524
|
+
Returns true if an access starting at +physical_address+ that is +N+ bits long is atomic.
|
|
2525
|
+
|
|
2526
|
+
This function takes into account any Atomicity Granule PMAs, so *it should not be used
|
|
2527
|
+
for load-reserved/store-conditional*, since those PMAs do not apply to those accesses.
|
|
2528
|
+
}
|
|
2529
|
+
body {
|
|
2530
|
+
# if the hart doesn't support Misligned Atomicity Granules,
|
|
2531
|
+
# then this misligned access is not atomic
|
|
2532
|
+
return false if MISALIGNED_MAX_ATOMICITY_GRANULE_SIZE == 0;
|
|
2533
|
+
|
|
2534
|
+
if (pma_applies?(PmaAttribute::MAG16, physical_address, N) &&
|
|
2535
|
+
in_naturally_aligned_region?<128>(physical_address, N)) {
|
|
2536
|
+
return true;
|
|
2537
|
+
} else if (pma_applies?(PmaAttribute::MAG8, physical_address, N) &&
|
|
2538
|
+
in_naturally_aligned_region?<64>(physical_address, N)) {
|
|
2539
|
+
return true;
|
|
2540
|
+
} else if (pma_applies?(PmaAttribute::MAG4, physical_address, N) &&
|
|
2541
|
+
in_naturally_aligned_region?<32>(physical_address, N)) {
|
|
2542
|
+
return true;
|
|
2543
|
+
} else if (pma_applies?(PmaAttribute::MAG2, physical_address, N) &&
|
|
2544
|
+
in_naturally_aligned_region?<16>(physical_address, N)) {
|
|
2545
|
+
return true;
|
|
2546
|
+
} else {
|
|
2547
|
+
# not saved by a Misaligned Atomicity Granule
|
|
2548
|
+
return false;
|
|
2549
|
+
}
|
|
2550
|
+
}
|
|
2551
|
+
}
|
|
2552
|
+
|
|
2553
|
+
function read_memory_aligned {
|
|
2554
|
+
template U32 LEN
|
|
2555
|
+
returns Bits<LEN>
|
|
2556
|
+
arguments
|
|
2557
|
+
XReg virtual_address,
|
|
2558
|
+
Bits<INSTR_ENC_SIZE> encoding # the encoding of an instruction causing this access
|
|
2559
|
+
description {
|
|
2560
|
+
Read from virtual memory using a known aligned address.
|
|
2561
|
+
}
|
|
2562
|
+
body {
|
|
2563
|
+
TranslationResult result;
|
|
2564
|
+
|
|
2565
|
+
if (CSR[misa].S == 1) {
|
|
2566
|
+
result = translate(virtual_address, MemoryOperation::Read, effective_ldst_mode(), encoding);
|
|
2567
|
+
} else {
|
|
2568
|
+
result.paddr = virtual_address;
|
|
2569
|
+
}
|
|
2570
|
+
|
|
2571
|
+
# may raise an exception
|
|
2572
|
+
access_check(result.paddr, LEN, virtual_address, MemoryOperation::Read, ExceptionCode::LoadAccessFault, effective_ldst_mode());
|
|
2573
|
+
|
|
2574
|
+
return read_physical_memory<LEN>(result.paddr);
|
|
2575
|
+
}
|
|
2576
|
+
}
|
|
2577
|
+
|
|
2578
|
+
function read_memory {
|
|
2579
|
+
template U32 LEN
|
|
2580
|
+
returns Bits<LEN>
|
|
2581
|
+
arguments
|
|
2582
|
+
XReg virtual_address,
|
|
2583
|
+
Bits<INSTR_ENC_SIZE> encoding # the encoding of an instruction causing this access, or 0 if a fetch
|
|
2584
|
+
description {
|
|
2585
|
+
Read from virtual memory.
|
|
2586
|
+
|
|
2587
|
+
}
|
|
2588
|
+
body {
|
|
2589
|
+
Boolean aligned = is_naturally_aligned<LEN>(virtual_address);
|
|
2590
|
+
XReg physical_address;
|
|
2591
|
+
|
|
2592
|
+
if (aligned) {
|
|
2593
|
+
return read_memory_aligned<LEN>(virtual_address, encoding);
|
|
2594
|
+
}
|
|
2595
|
+
|
|
2596
|
+
# access isn't naturally aligned, but it still might be atomic if this hart supports
|
|
2597
|
+
# Misliagned Atomicity Granules. We won't know that, though, until after translation since PMAs
|
|
2598
|
+
# apply to physical addresses
|
|
2599
|
+
if (MISALIGNED_MAX_ATOMICITY_GRANULE_SIZE > 0) {
|
|
2600
|
+
# sanity check that the implementation isn't expecting a Misaligned exception
|
|
2601
|
+
# before an access/page fault exception (that would be an invalid config)
|
|
2602
|
+
assert(MISALIGNED_LDST_EXCEPTION_PRIORITY == "low", "Invalid config: can't mix low-priority misaligned exceptions with large atomicity granule");
|
|
2603
|
+
|
|
2604
|
+
physical_address = (CSR[misa].S == 1)
|
|
2605
|
+
? translate(virtual_address, MemoryOperation::Read, effective_ldst_mode(), encoding).paddr
|
|
2606
|
+
: virtual_address;
|
|
2607
|
+
|
|
2608
|
+
if (misaligned_is_atomic?<LEN>(physical_address)) {
|
|
2609
|
+
access_check(physical_address, LEN, virtual_address, MemoryOperation::Read, ExceptionCode::LoadAccessFault, effective_ldst_mode());
|
|
2610
|
+
return read_physical_memory<LEN>(physical_address);
|
|
2611
|
+
}
|
|
2612
|
+
}
|
|
2613
|
+
|
|
2614
|
+
# at this point, we have a misligned access
|
|
2615
|
+
if (!MISALIGNED_LDST) {
|
|
2616
|
+
# misaligned is not supported, we'll raise either a Misaligned exception or
|
|
2617
|
+
# a page/access fault exception, depending on the configuration
|
|
2618
|
+
if (MISALIGNED_LDST_EXCEPTION_PRIORITY == "low") {
|
|
2619
|
+
# do translation to trigger any access/page faults before raising misaligned
|
|
2620
|
+
physical_address = (CSR[misa].S == 1)
|
|
2621
|
+
? translate(virtual_address, MemoryOperation::Read, effective_ldst_mode(), encoding).paddr
|
|
2622
|
+
: virtual_address;
|
|
2623
|
+
access_check(physical_address, LEN, virtual_address, MemoryOperation::Read, ExceptionCode::LoadAccessFault, effective_ldst_mode());
|
|
2624
|
+
}
|
|
2625
|
+
raise (ExceptionCode::LoadAddressMisaligned, mode(), virtual_address);
|
|
2626
|
+
} else {
|
|
2627
|
+
|
|
2628
|
+
# misaligned, must break into multiple reads
|
|
2629
|
+
if (MISALIGNED_SPLIT_STRATEGY == "sequential_bytes") {
|
|
2630
|
+
Bits<LEN> result = 0;
|
|
2631
|
+
for (U32 I = 0; I < (LEN/8); I++) {
|
|
2632
|
+
result = result | (read_memory_aligned<8>(virtual_address + I, encoding) `<< (8*I));
|
|
2633
|
+
}
|
|
2634
|
+
return result;
|
|
2635
|
+
} else if (MISALIGNED_SPLIT_STRATEGY == "custom") {
|
|
2636
|
+
unpredictable("An implementation is free to break a misaligned access any way, leading to unpredictable behavior when any part of the misaligned access causes an exception");
|
|
2637
|
+
}
|
|
2638
|
+
}
|
|
2639
|
+
}
|
|
2640
|
+
}
|
|
2641
|
+
|
|
2642
|
+
function read_memory_xlen {
|
|
2643
|
+
returns Bits<MXLEN>
|
|
2644
|
+
arguments
|
|
2645
|
+
XReg virtual_address,
|
|
2646
|
+
Bits<INSTR_ENC_SIZE> encoding
|
|
2647
|
+
description {
|
|
2648
|
+
Read XLEN bits from memory
|
|
2649
|
+
}
|
|
2650
|
+
body {
|
|
2651
|
+
if (xlen() == 32) {
|
|
2652
|
+
return read_memory<32>(virtual_address, encoding);
|
|
2653
|
+
} else {
|
|
2654
|
+
return read_memory<64>(virtual_address, encoding);
|
|
2655
|
+
}
|
|
2656
|
+
}
|
|
2657
|
+
}
|
|
2658
|
+
|
|
2659
|
+
function write_memory_xlen {
|
|
2660
|
+
arguments
|
|
2661
|
+
XReg virtual_address,
|
|
2662
|
+
Bits<MXLEN> value,
|
|
2663
|
+
Bits<INSTR_ENC_SIZE> encoding
|
|
2664
|
+
description {
|
|
2665
|
+
Read XLEN bits from memory
|
|
2666
|
+
}
|
|
2667
|
+
body {
|
|
2668
|
+
if (xlen() == 32) {
|
|
2669
|
+
return write_memory<32>(virtual_address, value, encoding);
|
|
2670
|
+
} else {
|
|
2671
|
+
return write_memory<64>(virtual_address, value, encoding);
|
|
2672
|
+
}
|
|
2673
|
+
}
|
|
2674
|
+
}
|
|
2675
|
+
|
|
2676
|
+
function read_memory_xlen_aligned {
|
|
2677
|
+
returns Bits<MXLEN>
|
|
2678
|
+
arguments
|
|
2679
|
+
XReg virtual_address,
|
|
2680
|
+
Bits<INSTR_ENC_SIZE> encoding # the encoding of an instruction causing this access, or 0 if a fetch
|
|
2681
|
+
description {
|
|
2682
|
+
Read from virtual memory XLEN (which may be runtime-determined) bits using a known aligned address.
|
|
2683
|
+
}
|
|
2684
|
+
body {
|
|
2685
|
+
TranslationResult result;
|
|
2686
|
+
|
|
2687
|
+
if (CSR[misa].S == 1) {
|
|
2688
|
+
result = translate(virtual_address, MemoryOperation::Read, effective_ldst_mode(), encoding);
|
|
2689
|
+
} else {
|
|
2690
|
+
result.paddr = virtual_address;
|
|
2691
|
+
}
|
|
2692
|
+
|
|
2693
|
+
# may raise an exception
|
|
2694
|
+
access_check(result.paddr, xlen(), virtual_address, MemoryOperation::Read, ExceptionCode::LoadAccessFault, effective_ldst_mode());
|
|
2695
|
+
|
|
2696
|
+
if (xlen() == 32) {
|
|
2697
|
+
return read_physical_memory<32>(result.paddr);
|
|
2698
|
+
} else {
|
|
2699
|
+
return read_physical_memory<64>(result.paddr);
|
|
2700
|
+
}
|
|
2701
|
+
}
|
|
2702
|
+
}
|
|
2703
|
+
|
|
2704
|
+
# hart-global state to track the local reservation set
|
|
2705
|
+
Boolean reservation_set_valid = false;
|
|
2706
|
+
XReg reservation_set_address;
|
|
2707
|
+
XReg reservation_set_size;
|
|
2708
|
+
XReg reservation_physical_address; # The exact address used by the LR.W/LR.D
|
|
2709
|
+
XReg reservation_virtual_address; # The exact address used by the LR.W/LR.D
|
|
2710
|
+
XReg reservation_size; # the size of the LR operation (32 or 64)
|
|
2711
|
+
|
|
2712
|
+
function invalidate_reservation_set {
|
|
2713
|
+
description {
|
|
2714
|
+
Invalidates any currently held reservation set.
|
|
2715
|
+
|
|
2716
|
+
[NOTE]
|
|
2717
|
+
--
|
|
2718
|
+
This function may be called by the platform, independent of any actions
|
|
2719
|
+
occurring in the local hart, for any or no reason.
|
|
2720
|
+
|
|
2721
|
+
The platform *must* call this function if an external hart or device accesses
|
|
2722
|
+
part of this reservation set while reservation_set_valid could be true.
|
|
2723
|
+
--
|
|
2724
|
+
}
|
|
2725
|
+
body {
|
|
2726
|
+
reservation_set_valid = false;
|
|
2727
|
+
}
|
|
2728
|
+
}
|
|
2729
|
+
|
|
2730
|
+
function register_reservation_set {
|
|
2731
|
+
arguments
|
|
2732
|
+
Bits<MXLEN> physical_address, # The (always aligned) physical address to reserve.
|
|
2733
|
+
Bits<MXLEN> length # minimum length of the reservation. actual reservation may be larger
|
|
2734
|
+
description {
|
|
2735
|
+
Register a reservation for a physical address range that subsumes
|
|
2736
|
+
[physical_address, physical_address + N).
|
|
2737
|
+
}
|
|
2738
|
+
body {
|
|
2739
|
+
reservation_set_valid = true;
|
|
2740
|
+
reservation_set_address = physical_address;
|
|
2741
|
+
|
|
2742
|
+
if (LRSC_RESERVATION_STRATEGY == "reserve naturally-aligned 64-byte region") {
|
|
2743
|
+
reservation_set_address = physical_address & ~MXLEN'h3f;
|
|
2744
|
+
reservation_set_size = 64;
|
|
2745
|
+
} else if (LRSC_RESERVATION_STRATEGY == "reserve naturally-aligned 128-byte region") {
|
|
2746
|
+
reservation_set_address = physical_address & ~MXLEN'h7f;
|
|
2747
|
+
reservation_set_size = 128;
|
|
2748
|
+
} else if (LRSC_RESERVATION_STRATEGY == "reserve exactly enough to cover the access") {
|
|
2749
|
+
reservation_set_address = physical_address;
|
|
2750
|
+
reservation_set_size = length;
|
|
2751
|
+
} else if (LRSC_RESERVATION_STRATEGY == "custom") {
|
|
2752
|
+
unpredictable("Implementations may set reservation sets of any size, as long as they cover the reserved accessed");
|
|
2753
|
+
} else {
|
|
2754
|
+
assert(false, "Unexpected LRSC_RESERVATION_STRATEGY");
|
|
2755
|
+
}
|
|
2756
|
+
}
|
|
2757
|
+
}
|
|
2758
|
+
|
|
2759
|
+
function load_reserved {
|
|
2760
|
+
template U32 N # the number of bits being loaded
|
|
2761
|
+
returns Bits<N> # the value of memory at virtual_address
|
|
2762
|
+
arguments
|
|
2763
|
+
Bits<MXLEN> virtual_address, # the virtual address to load
|
|
2764
|
+
Bits<1> aq, # acquire semantics? 0=no, 1=yes
|
|
2765
|
+
Bits<1> rl, # release semantics? 0=no, 1=yes
|
|
2766
|
+
Bits<INSTR_ENC_SIZE> encoding # encoding of the instruction causing this access
|
|
2767
|
+
description {
|
|
2768
|
+
Register a reservation for virtual_address at least N bits long
|
|
2769
|
+
and read the value from memory.
|
|
2770
|
+
|
|
2771
|
+
If aq is set, then also perform a memory model acquire.
|
|
2772
|
+
|
|
2773
|
+
If rl is set, then also perform a memory model release (software is discouraged from doing so).
|
|
2774
|
+
|
|
2775
|
+
This function assumes alignment checks have already occurred.
|
|
2776
|
+
}
|
|
2777
|
+
body {
|
|
2778
|
+
Bits<PHYS_ADDR_WIDTH> physical_address =
|
|
2779
|
+
(CSR[misa].S == 1)
|
|
2780
|
+
? translate(virtual_address, MemoryOperation::Read, effective_ldst_mode(), encoding).paddr
|
|
2781
|
+
: virtual_address;
|
|
2782
|
+
|
|
2783
|
+
if (pma_applies?(PmaAttribute::RsrvNone, physical_address, N)) {
|
|
2784
|
+
raise(ExceptionCode::LoadAccessFault, mode(), virtual_address);
|
|
2785
|
+
}
|
|
2786
|
+
|
|
2787
|
+
if (aq == 1) {
|
|
2788
|
+
memory_model_acquire();
|
|
2789
|
+
}
|
|
2790
|
+
if (rl == 1) {
|
|
2791
|
+
memory_model_release();
|
|
2792
|
+
}
|
|
2793
|
+
|
|
2794
|
+
register_reservation_set(physical_address, N);
|
|
2795
|
+
|
|
2796
|
+
if (CSR[misa].S ==1 && LRSC_FAIL_ON_VA_SYNONYM) {
|
|
2797
|
+
# also need to remember the virtual address
|
|
2798
|
+
reservation_virtual_address = virtual_address;
|
|
2799
|
+
}
|
|
2800
|
+
|
|
2801
|
+
return read_memory_aligned<N>(physical_address, encoding);
|
|
2802
|
+
}
|
|
2803
|
+
}
|
|
2804
|
+
|
|
2805
|
+
function store_conditional {
|
|
2806
|
+
template U32 N # number of bits being stored
|
|
2807
|
+
returns Boolean # whether or not the store conditional succeeded
|
|
2808
|
+
arguments
|
|
2809
|
+
Bits<MXLEN> virtual_address, # the virtual address to store to
|
|
2810
|
+
Bits<MXLEN> value, # the value to store
|
|
2811
|
+
Bits<1> aq, # acquire semantics? 0=no, 1=yes
|
|
2812
|
+
Bits<1> rl, # release semantics? 0=no, 1=yes
|
|
2813
|
+
Bits<INSTR_ENC_SIZE> encoding # encoding of the instruction causing this access
|
|
2814
|
+
description {
|
|
2815
|
+
Atomically check the reservation set to ensure:
|
|
2816
|
+
|
|
2817
|
+
* it is valid
|
|
2818
|
+
* it covers the region addressed by this store
|
|
2819
|
+
* the address setting the reservation set matches virtual address
|
|
2820
|
+
|
|
2821
|
+
If the preceding are met, perform the store and return 0.
|
|
2822
|
+
Otherwise, return 1.
|
|
2823
|
+
}
|
|
2824
|
+
body {
|
|
2825
|
+
Bits<PHYS_ADDR_WIDTH> physical_address =
|
|
2826
|
+
(CSR[misa].S == 1)
|
|
2827
|
+
? translate(virtual_address, MemoryOperation::Write, effective_ldst_mode(), encoding).paddr
|
|
2828
|
+
: virtual_address;
|
|
2829
|
+
|
|
2830
|
+
if (pma_applies?(PmaAttribute::RsrvNone, physical_address, N)) {
|
|
2831
|
+
raise(ExceptionCode::StoreAmoAccessFault, mode(), virtual_address);
|
|
2832
|
+
}
|
|
2833
|
+
|
|
2834
|
+
# failed SC still looks like a store to memory protection
|
|
2835
|
+
access_check(physical_address, N, virtual_address, MemoryOperation::Write, ExceptionCode::StoreAmoAccessFault, effective_ldst_mode());
|
|
2836
|
+
|
|
2837
|
+
# acquire/release occur regardless of whether or not the SC succeeds
|
|
2838
|
+
if (aq == 1) {
|
|
2839
|
+
memory_model_acquire();
|
|
2840
|
+
}
|
|
2841
|
+
if (rl == 1) {
|
|
2842
|
+
memory_model_release();
|
|
2843
|
+
}
|
|
2844
|
+
|
|
2845
|
+
if (reservation_set_valid == false) {
|
|
2846
|
+
return false;
|
|
2847
|
+
}
|
|
2848
|
+
|
|
2849
|
+
if (!contains?(reservation_set_address, reservation_set_size, physical_address, N)) {
|
|
2850
|
+
# this access is not in the reservation set
|
|
2851
|
+
invalidate_reservation_set();
|
|
2852
|
+
return false;
|
|
2853
|
+
}
|
|
2854
|
+
|
|
2855
|
+
if (LRSC_FAIL_ON_NON_EXACT_LRSC) {
|
|
2856
|
+
if (reservation_physical_address != physical_address || reservation_size != N) {
|
|
2857
|
+
# this access does not match the most recent LR
|
|
2858
|
+
invalidate_reservation_set();
|
|
2859
|
+
return false;
|
|
2860
|
+
}
|
|
2861
|
+
}
|
|
2862
|
+
|
|
2863
|
+
if (LRSC_FAIL_ON_VA_SYNONYM) {
|
|
2864
|
+
if (reservation_virtual_address != virtual_address || reservation_size != N) {
|
|
2865
|
+
# this access does not match the most recent LR
|
|
2866
|
+
invalidate_reservation_set();
|
|
2867
|
+
return false;
|
|
2868
|
+
}
|
|
2869
|
+
}
|
|
2870
|
+
|
|
2871
|
+
# success. perform the store
|
|
2872
|
+
write_physical_memory<N>(physical_address, value);
|
|
2873
|
+
|
|
2874
|
+
return true;
|
|
2875
|
+
}
|
|
2876
|
+
}
|
|
2877
|
+
|
|
2878
|
+
function amo {
|
|
2879
|
+
template U32 N # number of bits being loaded/stored
|
|
2880
|
+
returns Bits<N>
|
|
2881
|
+
arguments
|
|
2882
|
+
XReg virtual_address, # the virtual address to load from/store to
|
|
2883
|
+
Bits<N> value, # the value for the second half of the atomic operation
|
|
2884
|
+
AmoOperation op, # atomic operation to apply
|
|
2885
|
+
Bits<1> aq, # acquire semantics? 0=no, 1=yes
|
|
2886
|
+
Bits<1> rl, # release semantics? 0=no, 1=yes
|
|
2887
|
+
Bits<INSTR_ENC_SIZE> encoding # encoding of the instruction causing this access
|
|
2888
|
+
description {
|
|
2889
|
+
Atomically read-modify-write the location at virtual_address.
|
|
2890
|
+
|
|
2891
|
+
The value written to virtual_address will depend on +op+.
|
|
2892
|
+
|
|
2893
|
+
If +aq+ is 1, then the amo also acts as a memory model acquire.
|
|
2894
|
+
If +rl+ is 1, then the amo also acts as a memory model release.
|
|
2895
|
+
}
|
|
2896
|
+
body {
|
|
2897
|
+
Boolean aligned = is_naturally_aligned<N>(virtual_address);
|
|
2898
|
+
|
|
2899
|
+
if (!aligned && MISALIGNED_LDST_EXCEPTION_PRIORITY == "high") {
|
|
2900
|
+
raise(ExceptionCode::StoreAmoAddressMisaligned, mode(), virtual_address);
|
|
2901
|
+
}
|
|
2902
|
+
|
|
2903
|
+
Bits<PHYS_ADDR_WIDTH> physical_address =
|
|
2904
|
+
(CSR[misa].S == 1)
|
|
2905
|
+
? translate(virtual_address, MemoryOperation::ReadModifyWrite, effective_ldst_mode(), encoding).paddr
|
|
2906
|
+
: virtual_address;
|
|
2907
|
+
|
|
2908
|
+
# PMA Atomicity checks
|
|
2909
|
+
if (pma_applies?(PmaAttribute::AmoNone, physical_address, N)) {
|
|
2910
|
+
raise(ExceptionCode::StoreAmoAccessFault, mode(), virtual_address);
|
|
2911
|
+
} else if (((op == AmoOperation::Add || op == AmoOperation::Max || op == AmoOperation::Maxu || op == AmoOperation::Min || op == AmoOperation::Minu)) &&
|
|
2912
|
+
!pma_applies?(PmaAttribute::AmoArithmetic, physical_address, N)) {
|
|
2913
|
+
raise(ExceptionCode::StoreAmoAccessFault, mode(), virtual_address);
|
|
2914
|
+
} else if (((op == AmoOperation::And || op == AmoOperation::Or || op == AmoOperation::Xor)) &&
|
|
2915
|
+
!pma_applies?(PmaAttribute::AmoLogical, physical_address, N)) {
|
|
2916
|
+
raise(ExceptionCode::StoreAmoAccessFault, mode(), virtual_address);
|
|
2917
|
+
} else {
|
|
2918
|
+
assert(
|
|
2919
|
+
pma_applies?(PmaAttribute::AmoSwap, physical_address, N) &&
|
|
2920
|
+
op == AmoOperation::Swap,
|
|
2921
|
+
"Bad AMO operation"
|
|
2922
|
+
);
|
|
2923
|
+
}
|
|
2924
|
+
|
|
2925
|
+
# pma alignment checks
|
|
2926
|
+
if (!aligned &&
|
|
2927
|
+
!misaligned_is_atomic?<N>(physical_address)) {
|
|
2928
|
+
raise (ExceptionCode::StoreAmoAddressMisaligned, mode(), virtual_address);
|
|
2929
|
+
}
|
|
2930
|
+
|
|
2931
|
+
if (N == 32) {
|
|
2932
|
+
return atomic_read_modify_write_32(physical_address, value, op);
|
|
2933
|
+
} else {
|
|
2934
|
+
return atomic_read_modify_write_64(physical_address, value, op);
|
|
2935
|
+
}
|
|
2936
|
+
|
|
2937
|
+
}
|
|
2938
|
+
}
|
|
2939
|
+
|
|
2940
|
+
|
|
2941
|
+
|
|
2942
|
+
function write_memory_aligned {
|
|
2943
|
+
template U32 LEN
|
|
2944
|
+
arguments
|
|
2945
|
+
XReg virtual_address,
|
|
2946
|
+
Bits<LEN> value,
|
|
2947
|
+
Bits<INSTR_ENC_SIZE> encoding # encoding of the instruction causing this access
|
|
2948
|
+
description {
|
|
2949
|
+
Write to virtual memory using a known aligned address.
|
|
2950
|
+
}
|
|
2951
|
+
body {
|
|
2952
|
+
XReg physical_address;
|
|
2953
|
+
|
|
2954
|
+
physical_address = (CSR[misa].S == 1)
|
|
2955
|
+
? translate(virtual_address, MemoryOperation::Write, effective_ldst_mode(), encoding).paddr
|
|
2956
|
+
: virtual_address;
|
|
2957
|
+
|
|
2958
|
+
# may raise an exception
|
|
2959
|
+
access_check(physical_address, LEN, virtual_address, MemoryOperation::Write, ExceptionCode::StoreAmoAccessFault, effective_ldst_mode());
|
|
2960
|
+
|
|
2961
|
+
write_physical_memory<LEN>(physical_address, value);
|
|
2962
|
+
}
|
|
2963
|
+
}
|
|
2964
|
+
|
|
2965
|
+
function write_memory {
|
|
2966
|
+
template U32 LEN
|
|
2967
|
+
arguments
|
|
2968
|
+
XReg virtual_address,
|
|
2969
|
+
Bits<LEN> value,
|
|
2970
|
+
Bits<INSTR_ENC_SIZE> encoding # encoding of the instruction causing this access
|
|
2971
|
+
description {
|
|
2972
|
+
Write to virtual memory
|
|
2973
|
+
}
|
|
2974
|
+
body {
|
|
2975
|
+
Boolean aligned = is_naturally_aligned<LEN>(virtual_address);
|
|
2976
|
+
XReg physical_address;
|
|
2977
|
+
|
|
2978
|
+
if (aligned) {
|
|
2979
|
+
write_memory_aligned<LEN>(virtual_address, value, encoding);
|
|
2980
|
+
return;
|
|
2981
|
+
}
|
|
2982
|
+
|
|
2983
|
+
# access isn't naturally aligned, but it still might be atomic if this hart supports
|
|
2984
|
+
# Misliagned Atomicity Granules. We won't know that, though, until after translation since PMAs
|
|
2985
|
+
# apply to physical addresses
|
|
2986
|
+
if (MISALIGNED_MAX_ATOMICITY_GRANULE_SIZE > 0) {
|
|
2987
|
+
# sanity check that the implementation isn't expecting a Misaligned exception
|
|
2988
|
+
# before an access/page fault exception (that would be an invalid config)
|
|
2989
|
+
assert(MISALIGNED_LDST_EXCEPTION_PRIORITY == "low", "Invalid config: can't mix low-priority misaligned exceptions with large atomicity granule");
|
|
2990
|
+
|
|
2991
|
+
physical_address = (CSR[misa].S == 1)
|
|
2992
|
+
? translate(virtual_address, MemoryOperation::Write, effective_ldst_mode(), encoding).paddr
|
|
2993
|
+
: virtual_address;
|
|
2994
|
+
|
|
2995
|
+
if (misaligned_is_atomic?<LEN>(physical_address)) {
|
|
2996
|
+
access_check(physical_address, LEN, virtual_address, MemoryOperation::Write, ExceptionCode::StoreAmoAccessFault, effective_ldst_mode());
|
|
2997
|
+
write_physical_memory<LEN>(physical_address, value);
|
|
2998
|
+
return;
|
|
2999
|
+
}
|
|
3000
|
+
}
|
|
3001
|
+
|
|
3002
|
+
# at this point, we have a misligned access that must be split
|
|
3003
|
+
if (!MISALIGNED_LDST) {
|
|
3004
|
+
# misaligned is not supported, we'll raise either a Misaligned exception or
|
|
3005
|
+
# a page/access fault exception, depending on the configuration
|
|
3006
|
+
if (MISALIGNED_LDST_EXCEPTION_PRIORITY == "low") {
|
|
3007
|
+
# do translation to trigger any access/page faults before raising misaligned
|
|
3008
|
+
physical_address = (CSR[misa].S == 1)
|
|
3009
|
+
? translate(virtual_address, MemoryOperation::Write, effective_ldst_mode(), encoding).paddr
|
|
3010
|
+
: virtual_address;
|
|
3011
|
+
access_check(physical_address, LEN, virtual_address, MemoryOperation::Write, ExceptionCode::StoreAmoAccessFault, effective_ldst_mode());
|
|
3012
|
+
}
|
|
3013
|
+
raise (ExceptionCode::StoreAmoAddressMisaligned, mode(), virtual_address);
|
|
3014
|
+
} else {
|
|
3015
|
+
# misaligned, must break into multiple reads
|
|
3016
|
+
if (MISALIGNED_SPLIT_STRATEGY == "sequential_bytes") {
|
|
3017
|
+
for (U32 I = 0; I < (LEN/8); I++) {
|
|
3018
|
+
write_memory_aligned<8>(virtual_address + I, (value >> (8*I))[7:0], encoding);
|
|
3019
|
+
}
|
|
3020
|
+
} else if (MISALIGNED_SPLIT_STRATEGY == "custom") {
|
|
3021
|
+
unpredictable("An implementation is free to break a misaligned access any way, leading to unpredictable behavior when any part of the misaligned access causes an exception");
|
|
3022
|
+
}
|
|
3023
|
+
}
|
|
3024
|
+
}
|
|
3025
|
+
}
|
|
3026
|
+
|
|
3027
|
+
function write_memory_xlen_aligned {
|
|
3028
|
+
arguments
|
|
3029
|
+
XReg virtual_address,
|
|
3030
|
+
Bits<MXLEN> value,
|
|
3031
|
+
Bits<INSTR_ENC_SIZE> encoding # encoding of the instruction causing this access
|
|
3032
|
+
description {
|
|
3033
|
+
Write to virtual memory XLEN bits (which may be runtime determined) using a known aligned address.
|
|
3034
|
+
}
|
|
3035
|
+
body {
|
|
3036
|
+
XReg physical_address;
|
|
3037
|
+
|
|
3038
|
+
physical_address = (CSR[misa].S == 1)
|
|
3039
|
+
? translate(virtual_address, MemoryOperation::Write, effective_ldst_mode(), encoding).paddr
|
|
3040
|
+
: virtual_address;
|
|
3041
|
+
|
|
3042
|
+
# may raise an exception
|
|
3043
|
+
access_check(physical_address, xlen(), virtual_address, MemoryOperation::Write, ExceptionCode::StoreAmoAccessFault, effective_ldst_mode());
|
|
3044
|
+
|
|
3045
|
+
if (xlen() == 32) {
|
|
3046
|
+
write_physical_memory<32>(physical_address, value);
|
|
3047
|
+
} else {
|
|
3048
|
+
write_physical_memory<64>(physical_address, value);
|
|
3049
|
+
}
|
|
3050
|
+
}
|
|
3051
|
+
}
|
|
3052
|
+
|
|
3053
|
+
function mstatus_sd_has_known_reset
|
|
3054
|
+
{
|
|
3055
|
+
returns Boolean
|
|
3056
|
+
description {
|
|
3057
|
+
Returns true if the mstatus.SD bit has a defined reset value, as determined by various parameters.
|
|
3058
|
+
}
|
|
3059
|
+
body {
|
|
3060
|
+
# the reset value is known if both FS and VS are known
|
|
3061
|
+
|
|
3062
|
+
Boolean fs_has_single_value =
|
|
3063
|
+
((!implemented?(ExtensionName::F)) || ($array_size(MSTATUS_FS_LEGAL_VALUES) == 1));
|
|
3064
|
+
|
|
3065
|
+
Boolean vs_has_single_value =
|
|
3066
|
+
((!implemented?(ExtensionName::V)) || ($array_size(MSTATUS_VS_LEGAL_VALUES) == 1));
|
|
3067
|
+
|
|
3068
|
+
return fs_has_single_value && vs_has_single_value;
|
|
3069
|
+
}
|
|
3070
|
+
}
|
|
3071
|
+
|
|
3072
|
+
function mstatus_sd_reset_value
|
|
3073
|
+
{
|
|
3074
|
+
returns Bits<1>
|
|
3075
|
+
description {
|
|
3076
|
+
Returns the reset value of mstatus.SD when known
|
|
3077
|
+
}
|
|
3078
|
+
body {
|
|
3079
|
+
# the reset value is known if both FS and VS are known
|
|
3080
|
+
assert(mstatus_sd_has_known_reset(),
|
|
3081
|
+
"mstatus_sd_reset_value is only defined when mstatus_sd_has_known_reset() == true");
|
|
3082
|
+
|
|
3083
|
+
Bits<2> fs_value, vs_value; # defaults to 0
|
|
3084
|
+
|
|
3085
|
+
if ((!implemented?(ExtensionName::F)) || ($array_size(MSTATUS_FS_LEGAL_VALUES) == 1)) {
|
|
3086
|
+
fs_value = (!implemented?(ExtensionName::F)) ? 0 : MSTATUS_FS_LEGAL_VALUES[0];
|
|
3087
|
+
}
|
|
3088
|
+
if ((!implemented?(ExtensionName::V)) || ($array_size(MSTATUS_VS_LEGAL_VALUES) == 1)) {
|
|
3089
|
+
fs_value = (!implemented?(ExtensionName::V)) ? 0 : MSTATUS_VS_LEGAL_VALUES[0];
|
|
3090
|
+
}
|
|
3091
|
+
|
|
3092
|
+
return ((fs_value == 3) || (vs_value == 3)) ? 1 : 0;
|
|
3093
|
+
}
|
|
3094
|
+
}
|
|
3095
|
+
|
|
3096
|
+
function check_zcmt_enabled {
|
|
3097
|
+
arguments
|
|
3098
|
+
Bits<INSTR_ENC_SIZE> encoding
|
|
3099
|
+
description {
|
|
3100
|
+
If the Smstateen extension is implemented, then bit 2 in `mstateen0`, `sstateen0`, and `hstateen0` is
|
|
3101
|
+
implemented. If bit 2 of a controlling `stateen0` CSR is zero, then access to the `jvt` CSR and execution
|
|
3102
|
+
of a `cm.jalt` or `cm.jt` instruction by a lower privilege level results in an illegal-instruction trap (or, if
|
|
3103
|
+
appropriate, a virtual-instruction trap).
|
|
3104
|
+
}
|
|
3105
|
+
body {
|
|
3106
|
+
if (( mode() != PrivilegeMode::M && implemented?(ExtensionName::Smstateen)
|
|
3107
|
+
&& CSR[mstateen0].JVT == 1'b0 )
|
|
3108
|
+
||
|
|
3109
|
+
( mode() == PrivilegeMode::U && implemented?(ExtensionName::Ssstateen)
|
|
3110
|
+
&& CSR[sstateen0].JVT == 1'b0 )) {
|
|
3111
|
+
|
|
3112
|
+
raise(ExceptionCode::IllegalInstruction, mode(), encoding);
|
|
3113
|
+
}
|
|
3114
|
+
else
|
|
3115
|
+
if (( mode() == PrivilegeMode::VS && implemented?(ExtensionName::Ssstateen)
|
|
3116
|
+
&& CSR[hstateen0].JVT == 1'b0 )
|
|
3117
|
+
||
|
|
3118
|
+
( mode() == PrivilegeMode::VU && implemented?(ExtensionName::Ssstateen)
|
|
3119
|
+
&& (CSR[sstateen0].JVT == 1'b0 || CSR[hstateen0].JVT == 1'b0) )) {
|
|
3120
|
+
|
|
3121
|
+
raise(ExceptionCode::VirtualInstruction, mode(), encoding);
|
|
3122
|
+
}
|
|
3123
|
+
}
|
|
3124
|
+
}
|