From 31b1128daaff24cc45605d62e0c3bc6aaff04e87 Mon Sep 17 00:00:00 2001 From: Kesavan Yogeswaran Date: Tue, 3 Jun 2025 13:27:05 -0400 Subject: [PATCH 1/2] Add awareness of some Armv8.1-M branch instructions Armv8.1-M adds some new direct branch instructions. This commit adds support for parsing WLS, WLSTP, LE, and LETP instructions. The branch future (BF) family of instructions is not handled by this commit. --- decoder/source/i_dec/trc_idec_arminst.cpp | 30 +++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/decoder/source/i_dec/trc_idec_arminst.cpp b/decoder/source/i_dec/trc_idec_arminst.cpp index aba781cf2128..60e2cdc0eec2 100644 --- a/decoder/source/i_dec/trc_idec_arminst.cpp +++ b/decoder/source/i_dec/trc_idec_arminst.cpp @@ -163,6 +163,16 @@ int inst_Thumb_is_direct_branch_link(uint32_t inst, uint8_t *is_link, uint8_t *i } else if ((inst & 0xf5000000) == 0xb1000000) { /* CB(NZ) */ *is_cond = 1; + } else if ((inst & 0xfffff001) == 0xf00fc001) { + /* LE (encoding T1) */ + } else if ((inst & 0xfffff001) == 0xf02fc001) { + /* LE (encoding T2) */ + } else if ((inst & 0xfffff001) == 0xf01fc001) { + /* LETP (encoding T3) */ + } else if ((inst & 0xfff0f001) == 0xf040c001) { + /* WLS (encoding T1) */ + } else if ((inst & 0xffc0f001) == 0xf000c001) { + /* WLSTP (encoding T3) */ } else { is_direct_branch = 0; } @@ -503,6 +513,26 @@ int inst_Thumb_branch_destination(uint32_t addr, uint32_t inst, uint32_t *pnpc) npc = addr + 4 + ((((inst & 0x02000000) << 6) | ((inst & 0x00f80000) << 7)) >> 25); npc |= 1; + } else if ((inst & 0xfffff001) == 0xf00fc001) { + /* LE (encoding T1) */ + npc = addr + 4 - (((inst & 0x000007fe) << 1) | ((inst & 0x00000800) >> 10)); + npc |= 1; + } else if ((inst & 0xfffff001) == 0xf02fc001) { + /* LE (encoding T2) */ + npc = addr + 4 - (((inst & 0x000007fe) << 1) | ((inst & 0x00000800) >> 10)); + npc |= 1; + } else if ((inst & 0xfffff001) == 0xf01fc001) { + /* LETP (encoding T3) */ + npc = addr + 4 - (((inst & 0x000007fe) << 1) | ((inst & 0x00000800) >> 10)); + npc |= 1; + } else if ((inst & 0xfff0f001) == 0xf040c001) { + /* WLS (encoding T1) */ + npc = addr + 4 + (((inst & 0x000007fe) << 1) | ((inst & 0x00000800) >> 10)); + npc |= 1; + } else if ((inst & 0xffc0f001) == 0xf000c001) { + /* WLSTP (encoding T3) */ + npc = addr + 4 + (((inst & 0x000007fe) << 1) | ((inst & 0x00000800) >> 10)); + npc |= 1; } else { is_direct_branch = 0; } From 46703aae5f8531009209971d8a2c43e8554d4822 Mon Sep 17 00:00:00 2001 From: Kesavan Yogeswaran Date: Tue, 23 Dec 2025 16:10:25 +0000 Subject: [PATCH 2/2] Add armv8_1m_branches snapshot Add snapshot that contains test data with Armv8.1-M branch instruction --- decoder/source/trc_core_arch_map.cpp | 1 + decoder/tests/run_pkt_decode_tests.bash | 18 ++++++++++-------- .../snapshots/armv8_1m_branches/cpu_0.ini | 18 ++++++++++++++++++ .../snapshots/armv8_1m_branches/etm_0.ini | 18 ++++++++++++++++++ .../snapshots/armv8_1m_branches/range1.bin | Bin 0 -> 436 bytes .../snapshots/armv8_1m_branches/range2.bin | Bin 0 -> 2776 bytes .../snapshots/armv8_1m_branches/snapshot.ini | 9 +++++++++ .../snapshots/armv8_1m_branches/trace.bin | Bin 0 -> 33 bytes .../snapshots/armv8_1m_branches/trace.ini | 13 +++++++++++++ 9 files changed, 69 insertions(+), 8 deletions(-) create mode 100644 decoder/tests/snapshots/armv8_1m_branches/cpu_0.ini create mode 100644 decoder/tests/snapshots/armv8_1m_branches/etm_0.ini create mode 100644 decoder/tests/snapshots/armv8_1m_branches/range1.bin create mode 100644 decoder/tests/snapshots/armv8_1m_branches/range2.bin create mode 100644 decoder/tests/snapshots/armv8_1m_branches/snapshot.ini create mode 100644 decoder/tests/snapshots/armv8_1m_branches/trace.bin create mode 100644 decoder/tests/snapshots/armv8_1m_branches/trace.ini diff --git a/decoder/source/trc_core_arch_map.cpp b/decoder/source/trc_core_arch_map.cpp index f25ab1e5ddfa..71645477ccd6 100644 --- a/decoder/source/trc_core_arch_map.cpp +++ b/decoder/source/trc_core_arch_map.cpp @@ -65,6 +65,7 @@ static ap_map_elem_t ap_map_array[] = { "Cortex-R5", { ARCH_V7, profile_CortexR } }, { "Cortex-R4", { ARCH_V7, profile_CortexR } }, { "Cortex-M33", { ARCH_V8, profile_CortexM } }, + { "Cortex-M55", { ARCH_V8, profile_CortexM } }, { "Cortex-M23", { ARCH_V8, profile_CortexM } }, { "Cortex-M0", { ARCH_V7, profile_CortexM } }, { "Cortex-M0+", { ARCH_V7, profile_CortexM } }, diff --git a/decoder/tests/run_pkt_decode_tests.bash b/decoder/tests/run_pkt_decode_tests.bash index 0f9388ca0058..f6752733a229 100755 --- a/decoder/tests/run_pkt_decode_tests.bash +++ b/decoder/tests/run_pkt_decode_tests.bash @@ -51,23 +51,25 @@ SNAPSHOT_DIR=./snapshots BIN_DIR=./bin/linux64/rel/ # directories for tests using full decode -declare -a test_dirs_decode=( "juno-ret-stck" +declare -a test_dirs_decode=( + "Snowball" + "TC2" "a57_single_step" + "armv8_1m_branches" "bugfix-exact-match" + "itm_only_csformat" + "itm_only_raw" + "juno-ret-stck" "juno-uname-001" "juno-uname-002" "juno_r1_1" - "tc2-ptm-rstk-t32" - "trace_cov_a15" + "stm-issue-27" "stm_only" "stm_only-2" "stm_only-juno" - "stm-issue-27" - "TC2" - "Snowball" + "tc2-ptm-rstk-t32" "test-file-mem-offsets" - "itm_only_raw" - "itm_only_csformat" + "trace_cov_a15" ) diff --git a/decoder/tests/snapshots/armv8_1m_branches/cpu_0.ini b/decoder/tests/snapshots/armv8_1m_branches/cpu_0.ini new file mode 100644 index 000000000000..5d47ffdea43a --- /dev/null +++ b/decoder/tests/snapshots/armv8_1m_branches/cpu_0.ini @@ -0,0 +1,18 @@ +[device] +name=cpu_0 +class=core +type=Cortex-M55 + +[regs] +PC(size:32)=0x4F9A02 +SP(size:32)=0 +SCTLR_EL1=0x1007 +CPSR=0x1C5 + +[dump.text1] +file=range1.bin +address=0x1E008 + +[dump.text2] +file=range2.bin +address=0x4F9A02 diff --git a/decoder/tests/snapshots/armv8_1m_branches/etm_0.ini b/decoder/tests/snapshots/armv8_1m_branches/etm_0.ini new file mode 100644 index 000000000000..f5cc1697d7db --- /dev/null +++ b/decoder/tests/snapshots/armv8_1m_branches/etm_0.ini @@ -0,0 +1,18 @@ +[device] +name=etm_0 +class=trace_source +type=ETM4 + +[regs] +TRCCONFIGR(0x004)=0x00000001 +TRCTRACEIDR(0x010)=0x00000000 +TRCAUTHSTATUS(0x3EE)=0x000000CC +TRCIDR0(0x078)=0x280006E1 +TRCIDR1(0x079)=0x4100F454 +TRCIDR2(0x07A)=0x00000004 +TRCIDR8(0x060)=0x00000000 +TRCIDR9(0x061)=0x00000000 +TRCIDR10(0x062)=0x00000000 +TRCIDR11(0x063)=0x00000000 +TRCIDR12(0x064)=0x00000001 +TRCIDR13(0x065)=0x00000000 diff --git a/decoder/tests/snapshots/armv8_1m_branches/range1.bin b/decoder/tests/snapshots/armv8_1m_branches/range1.bin new file mode 100644 index 0000000000000000000000000000000000000000..7ded8b8cdc8fac4da7b23ef8d867483ee7dc14ba GIT binary patch literal 436 zcmXYqze^)Q7=~vi>&|4B5WOOV%gC5JTRf^+fqu^H-WlKMq z^Z}~!mv3WFt_ge&uHy(kGf+8$E0!_1fn@AHE&9YdnOE`OM_+@qihmfl~xh#JF(|4Ot zFA6SsaozZ8%oxBueSrGO1I+X_WBQ2LNHV2%*8uJr2g$t)Dm=0iKkC_zOev@CDJl(R z9=B9SG+48h!^qlg*FEr?mI}r#`^Og=Hy#>U8P{$|2$}3ew28iJsV%|x%OPyVH`J|I zFpo8{ZAH9T7QCe#-m*EKsGQ%kzq$60;avOqQ?2y}?DvX9g_hcWYg_nN)K)**MEmmc E71C3;Jpcdz literal 0 HcmV?d00001 diff --git a/decoder/tests/snapshots/armv8_1m_branches/range2.bin b/decoder/tests/snapshots/armv8_1m_branches/range2.bin new file mode 100644 index 0000000000000000000000000000000000000000..53b0a4f240af68359b0aa3090e180eab4f3f6757 GIT binary patch literal 2776 zcmb7Ge{2)y8UDWW#dgjKxrC-o&#;~yRGf673ED`%2{o$YQj2$avJqH-68hBPQ?Gc+|Y|^%!F^hvUNLIKvDJ-YWKH1LWbaX80SlOigrrECuoWYC5U#Sx3Asj+BI2Do-_!*?z$v4{Ucd#x@Fz1=Q55ERN!%hz8g+6 zfuOn$_EIwACwE!oU_*XF*q_D*TrWRF9%-vHJ)fcF#>8f+$~H(&wGBptdk4uUZG$8T z(GPJM;&X@=h)r!LiLTi zE?-JslddOUv?2SucZ|U+lWZprUb(C7cgQx`mHNqS)nt)nJX(NVsg_y4QovPB=2QH+ zW6Emz12YxSCjpk$s4?AS@mrY?hRaIlJ_WGquShZ%fJ7oI{Ci`E=bUGkfl!(EJ~I z^x85qQdJh!YK{cmz>%o-aYi{z!mLNh=KKl+VGxjQmkj;NK`#k|Q7d05FSGT?KG~yi zoJX+;m8mzUnl!_r>{BSzOjv6@;jMX^X#k1aWDo2s=Tx?KJpB<|A;*^RN8~L;{$kYI z*kv|Ru1u|(LL#>11W*WWvA-hUJ`zO-yYw%odn1oBH_m5vyKh8`4AsdqtzRTr+iP~lDD_j?`)q1uvKu;c z#}AN=DPA1NinpV+vR6Su4Ri`U4Hklvc#U5{r8z&ctA^4Fl@anZ%Mb&ZxPo0}C~-sf z#OUIH>H49&CiL|Dgu;BbKb(dTodyiSKo}rC7<>M%Wkvp4;IY0;F?RL_&#MEVGt$vQ zIZqC%&JI>?(h!HAM|zHVgqZt0B*)pWHU{Vv2h~RI$78wrl57tVogT8onX8*~*mJ@e zicTX;jR}wzIN)Xn)_imSS?3{}`)bCp$ex2WNC=cec8xqjkQcH8ChgNS<)mCbrYz-9 zsE}YQ>`1^R<`6}rZxX|)a|bBm6x*VQ$O10&$W~<5zke96{{+zuJfeHmxfJ8y!}leC zh_Mq8IY_nCmHI>a*qwzdcN(4%=%=~?FTkUwJy@ogI}ZgZ3KWqZxllGjzuucej)pMx z1x}lT>uT`7an?B1yY1Oy*ujK`qo@VJ#B#L?^z*C${$au;;BbP`dtR+71#|_El2uwV z>QK!A2^{VuI9v@>|8j;-)Fe3EFb6IttV`T)l@bpm>Tg#Qd)__)PRCfg^djgZ-+k~y40qwC!t2-9ieLfy({aHNX0?%W>^O(be zOV35jKauDm1t{w@8>oa1Y~VMx*nU;&pdHu?N;(MND|Q~L#y0`0 z$hY|lF!GqM`1IbnZ}XL5BBDpW;?ob$H6&JH@S^5x3B48BeYzXg5z6XQ2zv36^VWdg z{CWnQ_y5-96^R8+Hl`Px_kT6{_Vkm^YrkWLE;fJTyj7q>$ET_DeidcGc|U|-UXMHP z((mBBPa<;Fzn6LFyf8!5Z`T&GvKPABRe$3Kf0314b}#g{7reWh)bRtR zCe4M4LQVJkoT#KZR^S$E>4ejchdG<>R#wbk^H)JUC;ZWE!5Y z4fEPW=auR72EC+*M|zvtt1Rls@@8K!EHj=%%i*`#Teszt{f$JqQ48x(ycq literal 0 HcmV?d00001 diff --git a/decoder/tests/snapshots/armv8_1m_branches/trace.ini b/decoder/tests/snapshots/armv8_1m_branches/trace.ini new file mode 100644 index 000000000000..a77769cb379a --- /dev/null +++ b/decoder/tests/snapshots/armv8_1m_branches/trace.ini @@ -0,0 +1,13 @@ +[trace_buffers] +buffers=buffer0 + +[buffer0] +name=etr_0 +file=trace.bin +format=source_data + +[source_buffers] +etm_0=etr_0 + +[core_trace_sources] +cpu_0=etm_0