-
Notifications
You must be signed in to change notification settings - Fork 167
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Add support for cmo extensions except prefetch.* instructions
(They will be overlapped by ORI instruciton).
- Loading branch information
liweiwei
committed
May 30, 2023
1 parent
3fca4c8
commit ab52bc3
Showing
26 changed files
with
239 additions
and
11 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,73 @@ | ||
union clause ast = RISCV_ZICBOM : (cbop_zicbom, regidx) | ||
|
||
mapping encdec_cbop : cbop_zicbom <-> bits(12) = { | ||
CBO_CLEAN <-> 0b000000000001, | ||
CBO_FLUSH <-> 0b000000000010, | ||
CBO_INVAL <-> 0b000000000000 | ||
} | ||
|
||
mapping clause encdec = RISCV_ZICBOM(cbop, rs1) if haveZicbom() | ||
<-> encdec_cbop(cbop) @ rs1 @ 0b010 @ 0b00000 @ 0b0001111 if haveZicbom() | ||
|
||
mapping cbop_mnemonic : cbop_zicbom <-> string = { | ||
CBO_CLEAN <-> "cbo.clean", | ||
CBO_FLUSH <-> "cbo.flush", | ||
CBO_INVAL <-> "cbo.inval" | ||
} | ||
|
||
mapping clause assembly = RISCV_ZICBOM(cbop, rs1) | ||
<-> cbop_mnemonic(cbop) ^ spc() ^ "(" ^ reg_name(rs1) ^ ")" | ||
|
||
val process_clean_inval : (regidx, cbop_zicbom) -> Retired effect {escape, rmem, rmemt, rreg, wmv, wmvt, wreg} | ||
function process_clean_inval(rs1, cbop) = { | ||
let rs1_val = X(rs1); | ||
let cache_block_size = plat_cache_block_size(); | ||
let begin_addr = rs1_val & ~(cache_block_size - EXTZ(0b1)); | ||
let offset = begin_addr - rs1_val; | ||
match ext_data_get_addr(rs1, offset, Read(Data), cache_block_size) { | ||
Ext_DataAddr_Error(e) => { ext_handle_data_check_error(e); RETIRE_FAIL }, | ||
Ext_DataAddr_OK(vaddr) => { | ||
let res: option(ExceptionType) = match translateAddr(vaddr, Read(Data)) { | ||
TR_Address(paddr, _) => pmpCheck_xlen(paddr, cache_block_size, Read(Data), cur_privilege), | ||
TR_Failure(e, _) => Some(e) | ||
}; | ||
match res { | ||
None() => RETIRE_SUCCESS, // do nothing for cbop currently | ||
Some(e) => { | ||
match (e) { | ||
E_Load_Access_Fault() => { handle_mem_exception(vaddr, E_SAMO_Access_Fault()); RETIRE_FAIL }, | ||
E_Load_Page_Fault() => { handle_mem_exception(vaddr, E_SAMO_Page_Fault()); RETIRE_FAIL } | ||
} | ||
} | ||
} | ||
} | ||
} | ||
} | ||
|
||
function cbo_clean_flush_enable(p : Privilege) -> bool = | ||
~((p != Machine & menvcfg.CBCFE() == 0b0) | (p == User & senvcfg.CBCFE() == 0b0)) | ||
|
||
function cbop_for_cbo_inval(p : Privilege) -> option(cbop_zicbom) = { | ||
let illegal = ((p != Machine) & (menvcfg.CBIE() == 0b00)) | | ||
((p == User) & (senvcfg.CBIE() == 0b00)); | ||
let flush = ((p != Machine) & (menvcfg.CBIE() == 0b01)) | | ||
((p == User) & (senvcfg.CBIE() == 0b01)); | ||
if illegal then None() | ||
else if flush then Some(CBO_FLUSH) | ||
else Some(CBO_INVAL) | ||
} | ||
|
||
function clause execute(RISCV_ZICBOM(cbop, rs1)) = { | ||
let cbcfe = cbo_clean_flush_enable(cur_privilege); | ||
let final_op : option(cbop_zicbom) = match (cbop, cbcfe) { | ||
(CBO_CLEAN, true) => Some(CBO_CLEAN), | ||
(CBO_CLEAN, false) => None(), | ||
(CBO_FLUSH, true) => Some(CBO_FLUSH), | ||
(CBO_FLUSH, false) => None(), | ||
(CBO_INVAL, _) => cbop_for_cbo_inval(cur_privilege) | ||
}; | ||
match final_op { | ||
None() => { handle_illegal(); RETIRE_FAIL }, | ||
Some(cbop) => process_clean_inval(rs1, cbop) | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,55 @@ | ||
union clause ast = RISCV_ZICBOZ : (regidx) | ||
|
||
mapping clause encdec = RISCV_ZICBOZ(rs1) if haveZicboz() | ||
<-> 0b000000000100 @ rs1 @ 0b010 @ 0b00000 @ 0b0001111 if haveZicboz() | ||
|
||
mapping clause assembly = RISCV_ZICBOZ(rs1) | ||
<-> "cbo.zero" ^ spc() ^ "(" ^ reg_name(rs1) ^ ")" | ||
|
||
function get_envcfg_cbze(p : Privilege) -> bool = | ||
~((p != Machine & menvcfg.CBZE() == 0b0) | (p == User & senvcfg.CBZE() == 0b0)) | ||
|
||
val process_cbo_zero : (regidx) -> Retired effect {eamem, escape, rmem, rmemt, rreg, wmv, wmvt, wreg} | ||
function process_cbo_zero(rs1) = { | ||
let rs1_val = X(rs1); | ||
let cache_block_size = plat_cache_block_size(); | ||
let begin_addr = rs1_val & ~(cache_block_size - EXTZ(0b1)); | ||
let offset = begin_addr - rs1_val; | ||
index : xlenbits = zeros(); | ||
failed : bool = false; | ||
match ext_data_get_addr(rs1, offset, Write(Data), cache_block_size) { | ||
Ext_DataAddr_Error(e) => { ext_handle_data_check_error(e); failed = true }, | ||
Ext_DataAddr_OK(vaddr) => | ||
while (index <_u cache_block_size) & (failed == false) do { | ||
let addr = vaddr + index; | ||
match translateAddr(addr, Write(Data)) { | ||
TR_Failure(e, _) => { handle_mem_exception(vaddr, e); failed = true }, | ||
TR_Address(paddr, _) => { | ||
let eares : MemoryOpResult(unit) = mem_write_ea(paddr, 1, false, false, false); | ||
match (eares) { | ||
MemException(e) => { handle_mem_exception(vaddr, e); failed = true }, | ||
MemValue(_) => { | ||
let res : MemoryOpResult(bool) = mem_write_value(paddr, 1, zeros(), false, false, false); | ||
match (res) { | ||
MemValue(true) => index = index + EXTZ(0b1), | ||
MemValue(false) => internal_error(__FILE__, __LINE__, "store got false from mem_write_value"), | ||
MemException(e) => { handle_mem_exception(vaddr, e); failed = true } | ||
} | ||
} | ||
} | ||
} | ||
} | ||
} | ||
}; | ||
if failed then RETIRE_FAIL | ||
else RETIRE_SUCCESS | ||
} | ||
|
||
function clause execute(RISCV_ZICBOZ(rs1)) = { | ||
if get_envcfg_cbze(cur_privilege) then | ||
process_cbo_zero(rs1) | ||
else { | ||
handle_illegal(); | ||
RETIRE_FAIL | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.