<aside>
⚠️ 本文所使用的 QEMU 版本為:v4.2.0
</aside>
延續 Part 1 一文,本文將繼續介紹 Decodetree 中的 Patterns 及 Pattern Groups 語法。
Pattern 實際定義了一個指令的 decode 方式。Decodetree 會根據 Patterns 的定義,來動態產生出對應的 switch-case decode 判斷式。
pat_def := identifier ( pat_elt )+
pat_elt := fixedbit_elt | field_elt | field_ref | args_ref | fmt_ref | const_elt
fmt_ref := '@' identifier
const_elt := identifier '=' number
其語法由使用者所定義的 identifier,隨後緊接著一個以上的 pat_elt。
identifier 可由開發者自訂,如:addl_r、addli ... 等。pat_elt 則可以採用以下不同的語法:
fixedbit_elt 與在 Format 中 fixedbit_elt 的定義相同。field_elt 與在 Format 中 field_elt 的定義相同。field_ref 與在 Format 中 field_ref 的定義相同。args_ref 與在 Format 中 args_ref 的定義相同。fmt_ref 直接參考一個被定義過的 Format。const_elt 可以直接指定某一個 argument 的值。由於 Pattern 實際定義了一個指令的 decode 方式,因此 所有的 bits 及 arguments (如果有參考 args_ref 的話) 都必須明確的被定義,如果在搭配了所有的 pat_elt 後還有未定義的 bits 或是 arguments 的話,Decodetree 便會報錯。
此外,Pattern 所產生出來的 decoder,最後還會呼叫對應的 translator function。
translator function 需開發者自行定義。addl_i 010000 ..... ..... .... 0000000 ..... @opi
定義了 addl_i 這個指令的 Pattern,其中:
010000。0000000。@opi 這個 Format。Pattern 的 所有 bits 都必須明確的被定義,因此 @opi 必須包含其餘 insn[25:12] 及 insn[4:0] 的格式定義,否則 Decodetree 便會報錯。最後 addl_i 的 decoder 還會呼叫 trans_addl_i() 這個 translator function。