From 582744f31eb72e016b76a43de5944d311bda159f Mon Sep 17 00:00:00 2001 From: Michael Miller Date: Wed, 2 Dec 2020 21:40:21 -0600 Subject: [PATCH] If a specific entry has been selected and is validated but happens to be at the default image address then don't check the SHA-256. If SHA-256 was selected then it has already been validated but if SHA-256 isn't selected then the image shouldn't cause the system to halt if it doesn't have a SHA-256. --- build/bootloader_hi.bin | Bin 8112 -> 8176 bytes build/bootloader_hi.dump | 2705 ++++++++++++++++++----------------- build/bootloader_hi.elf | Bin 95600 -> 95312 bytes build/bootloader_lo.elf | Bin 20096 -> 19984 bytes build/kboot.kfpkg | Bin 5979 -> 5983 bytes src/bootloader_hi/README.md | 13 +- src/bootloader_hi/main.c | 22 +- 7 files changed, 1375 insertions(+), 1365 deletions(-) diff --git a/build/bootloader_hi.bin b/build/bootloader_hi.bin index 159ec193d5ac528e1b5c43ff4423d11ad1b5aa1c..b7d34b829f07bbae75c5214160e388ddcd9dd33e 100755 GIT binary patch delta 2731 zcmY*b4@?`^8Gq;F{ID^?t${N(X`lw2zO`DBD#Yp7#nt08+HtE_T zP0jr0dUk-Z05^Q3ID-a(LqxhUQfQQ9BkABsv?g1shE6>FuX~A z3jl*|G{To6zmC$IB$9^o(gnU4t=o!kkw_Y}CkOcwv~DjM;5Q=K`r;P`jYelkOWQ2* zWLr+bh}SV$2kLW9u!Zs_1(Oj@kF~gQ_$hux4f_06%$M!$mUM#};gd*EL2U`tk|E5+ zQ7VBBrmUfj3Dlw$K91YE66j!t@KGFXiJ>NRN@5KTtQl*$JXMw(2!D&agx7S0a5auj zCQwV7@L?Pk)=-PE&d@)VY}m&j=70evUto5dddoDqZx?qTV8g?DVhUBe_ng=mzz^56CPei7y&` zyn*oOcs&3M9{XpU9xvbZqh!qaDN~dVxM((@k3thqqEZH|Z-#1UA2cD(U%_m|DRU9e zCi~6LNq!+a+eWioC!XVeRCt3#-j?FIS0!nHfj2U1=uUM5?ST&`IO>x*oY$BkEjUKS z`lE32eetWwYYe3YGE+W$mF|OE8Oj6*iqA&eCn5*vZV4#{bQgSvp&kQt53FRUCxIIQ zFEdmVKrSya)P6~U5x)1*1sAQ4*5hFf3ZFK@{jFEy;SJR#hv%7P zU2=-cqbG@d=f`+dF_fIq-Ws-6o~@17PsWGO@HpXlLdkO8bOup9jxy0 zW%)?S26qs^+vVjh@)vvXSpqQA5cH91%$&_)WBq3X5Hkl^FxJoA^#k)^2=L)_@Xj=y zF{=*Q&wms@F<8cm^B!}S{<&hH;spYN(iCT+i2E?0D>{nkCS$H$p|pOnK0>c@kPTLEMe0SObO!x3#Q&0 zSvwqVmgRBlk9QuU=*0!Syky~?jpr59fH71f@^C(W#;FFghEPf{Y$e4k%|Fm7`r!uI zFAST=TvSWl?N!dGEpiVWV8U8pZY7oItky>H^^z6jz{5w$btpmKf2x_&*;Cflk!IwU z_OGwg2V|nr#$EKjW{eTkfaah+mezdhu0@ftr2`+&wcK6l(-JH4EjTp1(`zkm9alGD zVi%A2t6Vbf4oB3Y7v9cw^60{5rX6*$(fmfDo%@r*9;? z4D22{lk2?9HnGX5y?N85bUpX+kAc2m6EHVe(M4uHOrk5%3Z$#C%DScBN2-jfELFCb zGd!EB!n!bbHN474`IvPY5h;JTjO~Tkx;W)t3~sN9xgwJ9B(upRAFy( umrUEZPE$&^F?C#TPD$a6>kn`prf+XJync^IvOR24q$jq15PKw@^!y(!Wovi< delta 2725 zcmY*b4NwzT9)Fu<^GFCKHo)@bl^T)=h%M-uj?QQllf72wrc?y4S|^>olJVo_+MXVr zUY&fbOPVNESjp-nD(Wy%(Y6c~jtZ?%aof(>PU#e+b92YJ8m{#GxVvifX3%@Pn}jqo z%zyXy-v9Uh@ArQHx7=Oz;i`ixjHdX1=n!1XTL9qvt~-Zov1tq(uHF52mLd^mERUaU z+dAJ}9-AS}=+!iSn=eCC_mLV2xK(1^KaeOIv}aH9mFRt6<#E0o#lW^328~8%$jYjb zc=C;1Fy^)QuLt#or&*J{$fEumoE~d-XTeGQD>VqWSTJ9{w_O@Lg$a|fkb+uMs1XVi zNt8;Vr*y)1NwhJA8dY^1(eZi!raiX5aeDljy83j?`8{sV23&JKppU>Jo|)HKF3f+fS`EE%;#bs(T60Y0?-_Mk)f6Ynup66>IL9N zQ+G1d%MyU%c0jjD@ohkd;dVTl1x_dw-SRuG<*ipr&zbHLr49Hcl)J%TlusPTnMVX?IZHR58Mv7SV1vM0bjl(X#VMJaAK4`0Aa*7 z^lfs-?2<$&ZrLGI7o-!p&^M5pKrBnIb*fhy@99In!1vqOQN8mMHsOw{Wj9t%sX}vZ zEA5e-b+XB)h-jQRwDMi9*&&@=0oQB>=kG*pt)k>2NlZ81)YS1(h_xF*A7F!GSUoN+ zb@iiEr4{LgIJ+f7FfnucScq^KJy$@|j^Z)(n79}IGnq$}r{_&YBepZWVYmr&IOw15 zZ^6wvFxzM)fTli7G=LQ?1je2k_O?=TBP@)+qqGyWqIP0nndCy`J#D-oVj~Mti)gkjZT+moiJLWm>B<6% zkX>bnKQGm@o;GP%A~JSz*I_O7zVK$mb_7|LwLc;fDWyLvDTvM>;l)dVe)ZZH2Y>x) z^B(fyfx)lPH$q~ni0|ZfW)`_e=cgxjvWiuIus?5C_Efq)VAmv`FKwQq1xym{q|sg^ z%0iRWNFS%U1K+y9Uo)0o}19ZXaUiUXvw!9|uj zad+h`%80-c9!+Eh|FyxOvt`U*$D?l<7YyDbI%T306YJ^Megq7q2BWCCNK}i_Vp%u& zBh#+~KAvm7Hyc(Hvoc;8{Z%o#6}*;;z!LQg5D)s%3aed6AU7~}$AEYM#!8$#y7`&W zQHP=*dna9*Dd%vHv@9bCl<0wfIX`ridUfCkRX5NY(~#etF08(8r-QynYRS8iGS>7zzTWoKQ5a6rPh+ zD4$p+$L#oWMHOfz-I8pT)?a!ls{_;zJ68Dnfr`Yq8XmVpIo$x^(v`dsL;(xMwuwi@ zY@vL(r}n`bUN*Y3Iw5~$^tMcFwBC~A)0QR37&F5z(erRjxdfiSW&b3p5^)V3(+fJC zdfw1%qo$ABqAOUuu{Y7>)jX;UeSoUzKonSU&~mN3~q1E2JA6+E$4UG1J0q}gWcjT>vv$&z0b}gp{81^MdhL&S6xWh79>=+bPrbhIt*5qnq=|18De?8h`{Tq<8k2ti2LUc;mH+?% diff --git a/build/bootloader_hi.dump b/build/bootloader_hi.dump index 5e6e561..6a86cfc 100644 --- a/build/bootloader_hi.dump +++ b/build/bootloader_hi.dump @@ -44,7 +44,7 @@ int main(void) 805e0030: f14027f3 csrr a5,mhartid 805e0034: 2781 sext.w a5,a5 805e0036: 00002717 auipc a4,0x2 - 805e003a: f2f72523 sw a5,-214(a4) # 805e1f60 + 805e003a: f2f72d23 sw a5,-198(a4) # 805e1f70 //-------------------------------------------------------- if (i != 0) { 805e003e: 44079663 bnez a5,805e048a @@ -55,7 +55,7 @@ int main(void) // wait for synchronization with core #1 while (core0_sync == 0) { 805e0042: 00002797 auipc a5,0x2 - 805e0046: ef678793 addi a5,a5,-266 # 805e1f38 + 805e0046: f0678793 addi a5,a5,-250 # 805e1f48 805e004a: 4398 lw a4,0(a5) 805e004c: e701 bnez a4,805e0054 asm("nop"); @@ -71,7 +71,7 @@ int main(void) boot_pin = 1; 805e0054: 4785 li a5,1 805e0056: 00002717 auipc a4,0x2 - 805e005a: aaf72923 sw a5,-1358(a4) # 805e1b08 + 805e005a: acf72323 sw a5,-1338(a4) # 805e1b1c cfg_magic = cfg_flash_ptr[BOOT_CONFIG_ITEMS*8]; 805e005e: 540047b7 lui a5,0x54004 805e0062: 1007a703 lw a4,256(a5) # 54004100 <_start-0x2c5dbf00> @@ -82,17 +82,17 @@ int main(void) 805e0072: 00d036b3 snez a3,a3 cfg_magic = cfg_flash_ptr[BOOT_CONFIG_ITEMS*8]; 805e0076: 00002617 auipc a2,0x2 - 805e007a: eae62923 sw a4,-334(a2) # 805e1f28 + 805e007a: ece62123 sw a4,-318(a2) # 805e1f38 print_enabled = (cfg_magic == MAGIC_ID) ? 0 : 1; 805e007e: 00002617 auipc a2,0x2 - 805e0082: eed62523 sw a3,-278(a2) # 805e1f68 + 805e0082: eed62d23 sw a3,-262(a2) # 805e1f78 805e0086: 00002497 auipc s1,0x2 - 805e008a: ee248493 addi s1,s1,-286 # 805e1f68 + 805e008a: ef248493 addi s1,s1,-270 # 805e1f78 if (print_enabled) { - 805e008e: 00f719e3 bne a4,a5,805e08a0 + 805e008e: 00f717e3 bne a4,a5,805e089c 805e0092: 00002417 auipc s0,0x2 - 805e0096: ef643403 ld s0,-266(s0) # 805e1f88 <__TMC_END__+0x8> - LOG("\nK210 bootloader by LoBo v.1.4.1\n\n"); + 805e0096: f3643403 ld s0,-202(s0) # 805e1fc8 <__TMC_END__+0x8> + LOG("\nK210 bootloader by LoBo v.1.4.2\n\n"); LOG("* Find applications in MAIN parameters\n"); @@ -110,32 +110,32 @@ check_cfg: 805e00a0: edb88b37 lui s6,0xedb88 app_flash_start = DEFAULT_APP_ADDR; 805e00a4: 00002717 auipc a4,0x2 - 805e00a8: a2f72623 sw a5,-1492(a4) # 805e1ad0 + 805e00a8: a2f72e23 sw a5,-1476(a4) # 805e1ae0 cfg_offset = 0; 805e00ac: 4601 li a2,0 805e00ae: 00002797 auipc a5,0x2 - 805e00b2: e607af23 sw zero,-386(a5) # 805e1f2c + 805e00b2: e807a723 sw zero,-370(a5) # 805e1f3c 805e00b6: 00002c17 auipc s8,0x2 - 805e00ba: e5ac0c13 addi s8,s8,-422 # 805e1f10 + 805e00ba: e6ac0c13 addi s8,s8,-406 # 805e1f20 805e00be: 00002d97 auipc s11,0x2 - 805e00c2: e72d8d93 addi s11,s11,-398 # 805e1f30 + 805e00c2: e82d8d93 addi s11,s11,-382 # 805e1f40 805e00c6: 00002d17 auipc s10,0x2 - 805e00ca: e62d0d13 addi s10,s10,-414 # 805e1f28 + 805e00ca: e72d0d13 addi s10,s10,-398 # 805e1f38 805e00ce: 00002a97 auipc s5,0x2 - 805e00d2: e92a8a93 addi s5,s5,-366 # 805e1f60 + 805e00d2: ea2a8a93 addi s5,s5,-350 # 805e1f70 805e00d6: 00002a17 auipc s4,0x2 - 805e00da: a2aa0a13 addi s4,s4,-1494 # 805e1b00 + 805e00da: a3aa0a13 addi s4,s4,-1478 # 805e1b10 805e00de: 00002b97 auipc s7,0x2 - 805e00e2: 9f2b8b93 addi s7,s7,-1550 # 805e1ad0 + 805e00e2: a02b8b93 addi s7,s7,-1534 # 805e1ae0 805e00e6: 00002997 auipc s3,0x2 - 805e00ea: e4698993 addi s3,s3,-442 # 805e1f2c + 805e00ea: e5698993 addi s3,s3,-426 # 805e1f3c if ((cfg_magic & MAGIC_ID_MASK) == MAGIC_ID) { 805e00ee: 0c090913 addi s2,s2,192 # 5aa5d0c0 <_start-0x25b82f40> crc = (crc >> 1) ^ (0xEDB88320 & mask); - 805e00f2: 320b0b13 addi s6,s6,800 # ffffffffedb88320 + 805e00f2: 320b0b13 addi s6,s6,800 # ffffffffedb88320 for (i = 0; i < BOOT_CONFIG_ITEMS; i++) { 805e00f6: 00002797 auipc a5,0x2 - 805e00fa: e607a523 sw zero,-406(a5) # 805e1f60 + 805e00fa: e607ad23 sw zero,-390(a5) # 805e1f70 805e00fe: 4581 li a1,0 cfg_magic = cfg_flash_ptr[offset + 0]; 805e0100: 54004cb7 lui s9,0x54004 @@ -143,7 +143,7 @@ check_cfg: for (i = 0; i < BOOT_CONFIG_ITEMS; i++) { 805e0106: 2585 addiw a1,a1,1 805e0108: 00002717 auipc a4,0x2 - 805e010c: e4b72c23 sw a1,-424(a4) # 805e1f60 + 805e010c: e6b72423 sw a1,-408(a4) # 805e1f70 805e0110: 479d li a5,7 805e0112: 2eb7e063 bltu a5,a1,805e03f2 805e0116: 0009a603 lw a2,0(s3) @@ -217,76 +217,76 @@ check_cfg: cfg_info[n] = cfg_flash_bptr[offset + n]; 805e017e: 01cc86b3 add a3,s9,t3 805e0182: 00002717 auipc a4,0x2 - 805e0186: d9070b23 sb a6,-618(a4) # 805e1f18 + 805e0186: db070323 sb a6,-602(a4) # 805e1f28 805e018a: 0006ce03 lbu t3,0(a3) 805e018e: 0127869b addiw a3,a5,18 805e0192: 1682 slli a3,a3,0x20 805e0194: 9281 srli a3,a3,0x20 805e0196: 00002717 auipc a4,0x2 - 805e019a: d9c701a3 sb t3,-637(a4) # 805e1f19 + 805e019a: d9c709a3 sb t3,-621(a4) # 805e1f29 805e019e: 96e6 add a3,a3,s9 805e01a0: 0006ce03 lbu t3,0(a3) 805e01a4: 0137869b addiw a3,a5,19 805e01a8: 1682 slli a3,a3,0x20 805e01aa: 9281 srli a3,a3,0x20 805e01ac: 00002717 auipc a4,0x2 - 805e01b0: d7c70723 sb t3,-658(a4) # 805e1f1a + 805e01b0: d7c70f23 sb t3,-642(a4) # 805e1f2a 805e01b4: 96e6 add a3,a3,s9 805e01b6: 0006ce03 lbu t3,0(a3) 805e01ba: 0147869b addiw a3,a5,20 805e01be: 1682 slli a3,a3,0x20 805e01c0: 9281 srli a3,a3,0x20 805e01c2: 00002717 auipc a4,0x2 - 805e01c6: d5c70ca3 sb t3,-679(a4) # 805e1f1b + 805e01c6: d7c704a3 sb t3,-663(a4) # 805e1f2b 805e01ca: 96e6 add a3,a3,s9 805e01cc: 0006ce03 lbu t3,0(a3) 805e01d0: 0157869b addiw a3,a5,21 805e01d4: 1682 slli a3,a3,0x20 805e01d6: 9281 srli a3,a3,0x20 805e01d8: 00002717 auipc a4,0x2 - 805e01dc: d5c70223 sb t3,-700(a4) # 805e1f1c + 805e01dc: d5c70a23 sb t3,-684(a4) # 805e1f2c 805e01e0: 96e6 add a3,a3,s9 805e01e2: 0006ce03 lbu t3,0(a3) 805e01e6: 0167869b addiw a3,a5,22 805e01ea: 1682 slli a3,a3,0x20 805e01ec: 9281 srli a3,a3,0x20 805e01ee: 00002717 auipc a4,0x2 - 805e01f2: d3c707a3 sb t3,-721(a4) # 805e1f1d + 805e01f2: d3c70fa3 sb t3,-705(a4) # 805e1f2d 805e01f6: 96e6 add a3,a3,s9 805e01f8: 0006ce03 lbu t3,0(a3) 805e01fc: 0177869b addiw a3,a5,23 805e0200: 1682 slli a3,a3,0x20 805e0202: 9281 srli a3,a3,0x20 805e0204: 00002717 auipc a4,0x2 - 805e0208: d1c70d23 sb t3,-742(a4) # 805e1f1e + 805e0208: d3c70523 sb t3,-726(a4) # 805e1f2e 805e020c: 96e6 add a3,a3,s9 805e020e: 0006ce03 lbu t3,0(a3) 805e0212: 0187869b addiw a3,a5,24 805e0216: 1682 slli a3,a3,0x20 805e0218: 9281 srli a3,a3,0x20 805e021a: 00002717 auipc a4,0x2 - 805e021e: d1c702a3 sb t3,-763(a4) # 805e1f1f + 805e021e: d1c70aa3 sb t3,-747(a4) # 805e1f2f 805e0222: 96e6 add a3,a3,s9 805e0224: 0006ce03 lbu t3,0(a3) 805e0228: 0197869b addiw a3,a5,25 805e022c: 1682 slli a3,a3,0x20 805e022e: 9281 srli a3,a3,0x20 805e0230: 00002717 auipc a4,0x2 - 805e0234: cfc70823 sb t3,-784(a4) # 805e1f20 + 805e0234: d1c70023 sb t3,-768(a4) # 805e1f30 805e0238: 96e6 add a3,a3,s9 805e023a: 0006ce03 lbu t3,0(a3) 805e023e: 01a7869b addiw a3,a5,26 805e0242: 1682 slli a3,a3,0x20 805e0244: 9281 srli a3,a3,0x20 805e0246: 00002717 auipc a4,0x2 - 805e024a: cdc70da3 sb t3,-805(a4) # 805e1f21 + 805e024a: cfc705a3 sb t3,-789(a4) # 805e1f31 805e024e: 96e6 add a3,a3,s9 805e0250: 0006ce03 lbu t3,0(a3) 805e0254: 01b7869b addiw a3,a5,27 805e0258: 1682 slli a3,a3,0x20 805e025a: 9281 srli a3,a3,0x20 805e025c: 00002717 auipc a4,0x2 - 805e0260: cdc70323 sb t3,-826(a4) # 805e1f22 + 805e0260: cdc70b23 sb t3,-810(a4) # 805e1f32 805e0264: 96e6 add a3,a3,s9 805e0266: 0006ce03 lbu t3,0(a3) 805e026a: 01c7869b addiw a3,a5,28 @@ -294,47 +294,47 @@ check_cfg: 805e0270: 9281 srli a3,a3,0x20 cfg_magic = cfg_flash_ptr[offset + 0]; 805e0272: 00002717 auipc a4,0x2 - 805e0276: ca672b23 sw t1,-842(a4) # 805e1f28 + 805e0276: cc672323 sw t1,-826(a4) # 805e1f38 cfg_crc = cfg_flash_ptr[offset + 3]; 805e027a: 00002717 auipc a4,0x2 - 805e027e: c8c72d23 sw a2,-870(a4) # 805e1f14 + 805e027e: cac72523 sw a2,-854(a4) # 805e1f24 cfg_info[n] = cfg_flash_bptr[offset + n]; 805e0282: 96e6 add a3,a3,s9 cfg_address = cfg_flash_ptr[offset + 1]; 805e0284: 00002717 auipc a4,0x2 - 805e0288: c9172623 sw a7,-884(a4) # 805e1f10 + 805e0288: c9172e23 sw a7,-868(a4) # 805e1f20 cfg_size = cfg_flash_ptr[offset + 2]; 805e028c: 00002717 auipc a4,0x2 - 805e0290: caa72223 sw a0,-860(a4) # 805e1f30 + 805e0290: caa72a23 sw a0,-844(a4) # 805e1f40 key = cfg_flash_bptr[offset]; // dummy read needed to switch to 8bit XiP read 805e0294: 00002717 auipc a4,0x2 - 805e0298: cd070823 sb a6,-816(a4) # 805e1f64 + 805e0298: cf070023 sb a6,-800(a4) # 805e1f74 cfg_info[n] = cfg_flash_bptr[offset + n]; 805e029c: 00002717 auipc a4,0x2 - 805e02a0: c9c703a3 sb t3,-889(a4) # 805e1f23 + 805e02a0: c9c70ba3 sb t3,-873(a4) # 805e1f33 805e02a4: 0006c603 lbu a2,0(a3) 805e02a8: 01d7869b addiw a3,a5,29 805e02ac: 1682 slli a3,a3,0x20 805e02ae: 9281 srli a3,a3,0x20 805e02b0: 00002717 auipc a4,0x2 - 805e02b4: c6c70a23 sb a2,-908(a4) # 805e1f24 + 805e02b4: c8c70223 sb a2,-892(a4) # 805e1f34 805e02b8: 96e6 add a3,a3,s9 805e02ba: 0006c683 lbu a3,0(a3) 805e02be: 27f9 addiw a5,a5,30 805e02c0: 1782 slli a5,a5,0x20 805e02c2: 9381 srli a5,a5,0x20 805e02c4: 00002717 auipc a4,0x2 - 805e02c8: c6d700a3 sb a3,-927(a4) # 805e1f25 + 805e02c8: c6d708a3 sb a3,-911(a4) # 805e1f35 805e02cc: 97e6 add a5,a5,s9 805e02ce: 0007c783 lbu a5,0(a5) if ((cfg_magic & MAGIC_ID_MASK) == MAGIC_ID) { 805e02d2: ff037313 andi t1,t1,-16 cfg_info[15] = 0; 805e02d6: 00002717 auipc a4,0x2 - 805e02da: c40708a3 sb zero,-943(a4) # 805e1f27 + 805e02da: c60700a3 sb zero,-927(a4) # 805e1f37 cfg_info[n] = cfg_flash_bptr[offset + n]; 805e02de: 00002717 auipc a4,0x2 - 805e02e2: c4f70423 sb a5,-952(a4) # 805e1f26 + 805e02e2: c4f70c23 sb a5,-936(a4) # 805e1f36 if ((cfg_magic & MAGIC_ID_MASK) == MAGIC_ID) { 805e02e6: e32310e3 bne t1,s2,805e0106 // *** Valid configuration found @@ -343,13 +343,13 @@ check_cfg: 805e02ec: 1e078e63 beqz a5,805e04e8 805e02f0: 601c ld a5,0(s0) 805e02f2: 00002617 auipc a2,0x2 - 805e02f6: c2660613 addi a2,a2,-986 # 805e1f18 + 805e02f6: c3660613 addi a2,a2,-970 # 805e1f28 805e02fa: 00001517 auipc a0,0x1 - 805e02fe: 56e50513 addi a0,a0,1390 # 805e1868 + 805e02fe: 57e50513 addi a0,a0,1406 # 805e1878 805e0302: 9782 jalr a5 805e0304: 0c800513 li a0,200 805e0308: 00001097 auipc ra,0x1 - 805e030c: de4080e7 jalr -540(ra) # 805e10ec + 805e030c: df4080e7 jalr -524(ra) # 805e10fc // Check if the Flash address is in range (512K ~ 8MB) if ((cfg_address >= MIN_APP_FLASH_ADDR) && (cfg_address <= MAX_APP_FLASH_ADDR)) { 805e0310: 000c2583 lw a1,0(s8) @@ -370,22 +370,22 @@ check_cfg: 805e0334: cf89 beqz a5,805e034e 805e0336: 601c ld a5,0(s0) 805e0338: 00001517 auipc a0,0x1 - 805e033c: 54850513 addi a0,a0,1352 # 805e1880 + 805e033c: 55850513 addi a0,a0,1368 # 805e1890 805e0340: 9782 jalr a5 805e0342: 0c800513 li a0,200 805e0346: 00001097 auipc ra,0x1 - 805e034a: da6080e7 jalr -602(ra) # 805e10ec + 805e034a: db6080e7 jalr -586(ra) # 805e10fc /* - * Basic check passed, now we can check the application's vilidity + * Basic check passed, now we can check the application's validity * If in interractive mode, all applications are checked, - * otherwize, the application is checked only if flagged as active + * otherwise, the application is checked only if flagged as active */ if ((cfg_magic & CFG_APP_FLAG_ACTIVE) || (boot_pin == 0)) { - 805e034e: 000d2603 lw a2,0(s10) - 805e0352: 00167793 andi a5,a2,1 + 805e034e: 000d2683 lw a3,0(s10) + 805e0352: 0016f793 andi a5,a3,1 805e0356: 1a079963 bnez a5,805e0508 805e035a: 00001797 auipc a5,0x1 - 805e035e: 7ae78793 addi a5,a5,1966 # 805e1b08 + 805e035e: 7c278793 addi a5,a5,1986 # 805e1b1c 805e0362: 439c lw a5,0(a5) 805e0364: 1a078263 beqz a5,805e0508 } @@ -398,18 +398,18 @@ check_cfg: 805e036a: 16078c63 beqz a5,805e04e2 805e036e: 601c ld a5,0(s0) 805e0370: 00001517 auipc a0,0x1 - 805e0374: 57050513 addi a0,a0,1392 # 805e18e0 + 805e0374: 58050513 addi a0,a0,1408 # 805e18f0 805e0378: 9782 jalr a5 805e037a: 0c800513 li a0,200 805e037e: 00001097 auipc ra,0x1 - 805e0382: d6e080e7 jalr -658(ra) # 805e10ec + 805e0382: d7e080e7 jalr -642(ra) # 805e10fc } // ** Check if this is an active config (bit #0 set) if ((cfg_magic & CFG_APP_FLAG_ACTIVE) == 0) { 805e0386: 000d2683 lw a3,0(s10) 805e038a: 409c lw a5,0(s1) 805e038c: 8a85 andi a3,a3,1 - 805e038e: 2c068663 beqz a3,805e065a + 805e038e: 2c068563 beqz a3,805e0658 LOG("NOT "); } else { @@ -423,17 +423,17 @@ check_cfg: 805e03a0: 000c2683 lw a3,0(s8) app_size = cfg_size; 805e03a4: 00001717 auipc a4,0x1 - 805e03a8: 74c72a23 sw a2,1876(a4) # 805e1af8 + 805e03a8: 76c72223 sw a2,1892(a4) # 805e1b08 app_flash_start = cfg_address; 805e03ac: 00001717 auipc a4,0x1 - 805e03b0: 72d72223 sw a3,1828(a4) # 805e1ad0 + 805e03b0: 72d72a23 sw a3,1844(a4) # 805e1ae0 } if (boot_pin > 0) { 805e03b4: 00001717 auipc a4,0x1 - 805e03b8: 75470713 addi a4,a4,1876 # 805e1b08 + 805e03b8: 76870713 addi a4,a4,1896 # 805e1b1c 805e03bc: 4314 lw a3,0(a4) - 805e03be: 56069263 bnez a3,805e0922 - // Active application found and cheched and not in interractive mode + 805e03be: 56069063 bnez a3,805e091e + // Active application found and checked and not in interractive mode LOG("ACTIVE\n"); break; } @@ -442,76 +442,76 @@ check_cfg: 805e03c2: 12078063 beqz a5,805e04e2 805e03c6: 601c ld a5,0(s0) 805e03c8: 00001517 auipc a0,0x1 - 805e03cc: 53050513 addi a0,a0,1328 # 805e18f8 + 805e03cc: 54050513 addi a0,a0,1344 # 805e1908 805e03d0: 9782 jalr a5 805e03d2: 0c800513 li a0,200 805e03d6: 00001097 auipc ra,0x1 - 805e03da: d16080e7 jalr -746(ra) # 805e10ec + 805e03da: d26080e7 jalr -730(ra) # 805e10fc 805e03de: 000aa583 lw a1,0(s5) for (i = 0; i < BOOT_CONFIG_ITEMS; i++) { 805e03e2: 479d li a5,7 805e03e4: 2585 addiw a1,a1,1 805e03e6: 00002717 auipc a4,0x2 - 805e03ea: b6b72d23 sw a1,-1158(a4) # 805e1f60 + 805e03ea: b8b72523 sw a1,-1142(a4) # 805e1f70 805e03ee: d2b7f4e3 bleu a1,a5,805e0116 } } // check if any valid application was found - for (i = 0; i < BOOT_CONFIG_ITEMS; i++) { - if (available_apps[i]) break; + for (boot_entry = 0; boot_entry < BOOT_CONFIG_ITEMS; boot_entry++) { + if (available_apps[boot_entry]) break; 805e03f2: 000a4783 lbu a5,0(s4) - for (i = 0; i < BOOT_CONFIG_ITEMS; i++) { - 805e03f6: 00002717 auipc a4,0x2 - 805e03fa: b6072523 sw zero,-1174(a4) # 805e1f60 - if (available_apps[i]) break; - 805e03fe: 38079d63 bnez a5,805e0798 + for (boot_entry = 0; boot_entry < BOOT_CONFIG_ITEMS; boot_entry++) { + 805e03f6: 00001717 auipc a4,0x1 + 805e03fa: 72072123 sw zero,1826(a4) # 805e1b18 + if (available_apps[boot_entry]) break; + 805e03fe: 38079b63 bnez a5,805e0794 805e0402: 001a4783 lbu a5,1(s4) - for (i = 0; i < BOOT_CONFIG_ITEMS; i++) { + for (boot_entry = 0; boot_entry < BOOT_CONFIG_ITEMS; boot_entry++) { 805e0406: 4705 li a4,1 - 805e0408: 00002697 auipc a3,0x2 - 805e040c: b4e6ac23 sw a4,-1192(a3) # 805e1f60 - if (available_apps[i]) break; - 805e0410: 38079463 bnez a5,805e0798 + 805e0408: 00001697 auipc a3,0x1 + 805e040c: 70e6a823 sw a4,1808(a3) # 805e1b18 + if (available_apps[boot_entry]) break; + 805e0410: 38079263 bnez a5,805e0794 805e0414: 002a4783 lbu a5,2(s4) - 805e0418: 50079363 bnez a5,805e091e + 805e0418: 50079163 bnez a5,805e091a 805e041c: 003a4783 lbu a5,3(s4) - 805e0420: 36079763 bnez a5,805e078e + 805e0420: 36079563 bnez a5,805e078a 805e0424: 004a4783 lbu a5,4(s4) - 805e0428: 6c079d63 bnez a5,805e0b02 + 805e0428: 6e079163 bnez a5,805e0b0a 805e042c: 005a4783 lbu a5,5(s4) - 805e0430: 6c079763 bnez a5,805e0afe + 805e0430: 6c079b63 bnez a5,805e0b06 805e0434: 006a4783 lbu a5,6(s4) - 805e0438: 6c079163 bnez a5,805e0afa + 805e0438: 6c079563 bnez a5,805e0b02 805e043c: 007a4783 lbu a5,7(s4) - 805e0440: 6a079b63 bnez a5,805e0af6 + 805e0440: 6a079f63 bnez a5,805e0afe } - if ((app_flash_start == DEFAULT_APP_ADDR) && (i >= BOOT_CONFIG_ITEMS)) { + if ((app_flash_start == DEFAULT_APP_ADDR) && (boot_entry >= BOOT_CONFIG_ITEMS)) { 805e0444: 000ba703 lw a4,0(s7) 805e0448: 47a1 li a5,8 - 805e044a: 00002697 auipc a3,0x2 - 805e044e: b0f6ab23 sw a5,-1258(a3) # 805e1f60 + 805e044a: 00001697 auipc a3,0x1 + 805e044e: 6cf6a723 sw a5,1742(a3) # 805e1b18 805e0452: 67c1 lui a5,0x10 - 805e0454: 58f71363 bne a4,a5,805e09da + 805e0454: 54f71063 bne a4,a5,805e0994 // No valid application found if (cfg_offset == 0) { 805e0458: 0009a703 lw a4,0(s3) 805e045c: 409c lw a5,0(s1) - 805e045e: 6a071463 bnez a4,805e0b06 + 805e045e: 6a071863 bnez a4,805e0b0e // no valid entry found in main config sector, check the backup one LOG("\n* Find applications in BACKUP parameters\n"); 805e0462: cf89 beqz a5,805e047c 805e0464: 601c ld a5,0(s0) 805e0466: 00001517 auipc a0,0x1 - 805e046a: 4ba50513 addi a0,a0,1210 # 805e1920 + 805e046a: 4ca50513 addi a0,a0,1226 # 805e1930 805e046e: 9782 jalr a5 805e0470: 0c800513 li a0,200 805e0474: 00001097 auipc ra,0x1 - 805e0478: c78080e7 jalr -904(ra) # 805e10ec + 805e0478: c88080e7 jalr -888(ra) # 805e10fc cfg_offset = 4096; 805e047c: 6785 lui a5,0x1 805e047e: 00002717 auipc a4,0x2 - 805e0482: aaf72723 sw a5,-1362(a4) # 805e1f2c + 805e0482: aaf72f23 sw a5,-1346(a4) # 805e1f3c //if (boot_pin == 0) { // cfg_magic = cfg_flash_ptr[4096+BOOT_CONFIG_ITEMS]; // boot_pin = (cfg_magic == MAGIC_ID) ? 1 : 0; @@ -521,12 +521,12 @@ check_cfg: 805e0488: b1bd j 805e00f6 while (core1_sync == 0) { 805e048a: 00002797 auipc a5,0x2 - 805e048e: ab278793 addi a5,a5,-1358 # 805e1f3c + 805e048e: ac278793 addi a5,a5,-1342 # 805e1f4c 805e0492: 4398 lw a4,0(a5) core0_sync = 1; 805e0494: 4685 li a3,1 805e0496: 00002617 auipc a2,0x2 - 805e049a: aad62123 sw a3,-1374(a2) # 805e1f38 + 805e049a: aad62923 sw a3,-1358(a2) # 805e1f48 while (core1_sync == 0) { 805e049e: e701 bnez a4,805e04a6 asm("nop"); @@ -537,7 +537,7 @@ check_cfg: usleep(1000); 805e04a6: 3e800513 li a0,1000 805e04aa: 00001097 auipc ra,0x1 - 805e04ae: c42080e7 jalr -958(ra) # 805e10ec + 805e04ae: c52080e7 jalr -942(ra) # 805e10fc asm("fence"); // D-Cache; this may not be necessary, but it looks it doesn't hurt if it is executed 805e04b2: 0ff0000f fence asm("fence.i"); // I-Cache @@ -555,11 +555,11 @@ check_cfg: 805e04c8: cf89 beqz a5,805e04e2 805e04ca: 601c ld a5,0(s0) 805e04cc: 00001517 auipc a0,0x1 - 805e04d0: 44450513 addi a0,a0,1092 # 805e1910 + 805e04d0: 45450513 addi a0,a0,1108 # 805e1920 805e04d4: 9782 jalr a5 805e04d6: 0c800513 li a0,200 805e04da: 00001097 auipc ra,0x1 - 805e04de: c12080e7 jalr -1006(ra) # 805e10ec + 805e04de: c22080e7 jalr -990(ra) # 805e10fc 805e04e2: 000aa583 lw a1,0(s5) 805e04e6: b105 j 805e0106 if ((cfg_address >= MIN_APP_FLASH_ADDR) && (cfg_address <= MAX_APP_FLASH_ADDR)) { @@ -577,30 +577,30 @@ check_cfg: uint8_t key = app_flash_ptr[cfg_address]; // must be 0, SHA256 key NOT specified 805e0508: 000c2783 lw a5,0(s8) 805e050c: 54000837 lui a6,0x54000 - 805e0510: 02079693 slli a3,a5,0x20 - 805e0514: 9281 srli a3,a3,0x20 - 805e0516: 96c2 add a3,a3,a6 + 805e0510: 02079613 slli a2,a5,0x20 + 805e0514: 9201 srli a2,a2,0x20 + 805e0516: 9642 add a2,a2,a6 if (key != 0) return 0; - 805e0518: 0006c683 lbu a3,0(a3) - 805e051c: eeb9 bnez a3,805e057a + 805e0518: 00064603 lbu a2,0(a2) + 805e051c: ee39 bnez a2,805e057a val += app_flash_ptr[addr+2] << 16; - 805e051e: 0037869b addiw a3,a5,3 + 805e051e: 0037861b addiw a2,a5,3 val += app_flash_ptr[addr+3] << 24; 805e0522: 0047851b addiw a0,a5,4 val += app_flash_ptr[addr+2] << 16; - 805e0526: 1682 slli a3,a3,0x20 + 805e0526: 1602 slli a2,a2,0x20 val += app_flash_ptr[addr+3] << 24; 805e0528: 1502 slli a0,a0,0x20 uint32_t sz = flash2uint32(cfg_address+1); // app size 805e052a: 0017859b addiw a1,a5,1 val += app_flash_ptr[addr+2] << 16; - 805e052e: 9281 srli a3,a3,0x20 + 805e052e: 9201 srli a2,a2,0x20 val += app_flash_ptr[addr+3] << 24; 805e0530: 9101 srli a0,a0,0x20 val += app_flash_ptr[addr+1] << 8; 805e0532: 2789 addiw a5,a5,2 val += app_flash_ptr[addr+2] << 16; - 805e0534: 96c2 add a3,a3,a6 + 805e0534: 9642 add a2,a2,a6 val += app_flash_ptr[addr+3] << 24; 805e0536: 9542 add a0,a0,a6 uint32_t val = app_flash_ptr[addr]; @@ -608,1832 +608,1839 @@ check_cfg: val += app_flash_ptr[addr+1] << 8; 805e053a: 1782 slli a5,a5,0x20 val += app_flash_ptr[addr+2] << 16; - 805e053c: 0006c683 lbu a3,0(a3) + 805e053c: 00064603 lbu a2,0(a2) val += app_flash_ptr[addr+3] << 24; 805e0540: 00054503 lbu a0,0(a0) uint32_t val = app_flash_ptr[addr]; 805e0544: 9181 srli a1,a1,0x20 val += app_flash_ptr[addr+1] << 8; 805e0546: 9381 srli a5,a5,0x20 + 805e0548: 97c2 add a5,a5,a6 uint32_t val = app_flash_ptr[addr]; - 805e0548: 95c2 add a1,a1,a6 + 805e054a: 95c2 add a1,a1,a6 + 805e054c: 0005c803 lbu a6,0(a1) val += app_flash_ptr[addr+1] << 8; - 805e054a: 97c2 add a5,a5,a6 - 805e054c: 0007c783 lbu a5,0(a5) # 2fc000 <_start-0x802e4000> - uint32_t val = app_flash_ptr[addr]; - 805e0550: 0005c803 lbu a6,0(a1) + 805e0550: 0007c583 lbu a1,0(a5) # 2fc000 <_start-0x802e4000> val += app_flash_ptr[addr+2] << 16; - 805e0554: 0106969b slliw a3,a3,0x10 + 805e0554: 0106179b slliw a5,a2,0x10 val += app_flash_ptr[addr+3] << 24; - 805e0558: 0185159b slliw a1,a0,0x18 - 805e055c: 9ead addw a3,a3,a1 - 805e055e: 010686bb addw a3,a3,a6 + 805e0558: 0185161b slliw a2,a0,0x18 + 805e055c: 9fb1 addw a5,a5,a2 + 805e055e: 010787bb addw a5,a5,a6 val += app_flash_ptr[addr+1] << 8; - 805e0562: 0087979b slliw a5,a5,0x8 + 805e0562: 0085961b slliw a2,a1,0x8 val += app_flash_ptr[addr+3] << 24; - 805e0566: 9ebd addw a3,a3,a5 + 805e0566: 9fb1 addw a5,a5,a2 if ((cfg_magic & CFG_APP_FLAG_SIZE) && (cfg_size != sz)) return 0; - 805e0568: 00867593 andi a1,a2,8 + 805e0568: 0086f593 andi a1,a3,8 val += app_flash_ptr[addr+3] << 24; - 805e056c: 0006879b sext.w a5,a3 + 805e056c: 0007881b sext.w a6,a5 if ((cfg_magic & CFG_APP_FLAG_SIZE) && (cfg_size != sz)) return 0; - 805e0570: 000da803 lw a6,0(s11) + 805e0570: 000da603 lw a2,0(s11) 805e0574: c5a1 beqz a1,805e05bc - 805e0576: 07078f63 beq a5,a6,805e05f4 + 805e0576: 06c80f63 beq a6,a2,805e05f4 LOG("App CHECK failed\n"); 805e057a: 409c lw a5,0(s1) 805e057c: d3bd beqz a5,805e04e2 805e057e: 601c ld a5,0(s0) 805e0580: 00001517 auipc a0,0x1 - 805e0584: 33850513 addi a0,a0,824 # 805e18b8 + 805e0584: 34850513 addi a0,a0,840 # 805e18c8 805e0588: 9782 jalr a5 805e058a: 0c800513 li a0,200 805e058e: 00001097 auipc ra,0x1 - 805e0592: b5e080e7 jalr -1186(ra) # 805e10ec + 805e0592: b6e080e7 jalr -1170(ra) # 805e10fc 805e0596: 000aa583 lw a1,0(s5) 805e059a: b6b5 j 805e0106 LOG("size Error!\n"); 805e059c: d3b9 beqz a5,805e04e2 805e059e: 601c ld a5,0(s0) 805e05a0: 00001517 auipc a0,0x1 - 805e05a4: 36050513 addi a0,a0,864 # 805e1900 + 805e05a4: 37050513 addi a0,a0,880 # 805e1910 805e05a8: 9782 jalr a5 805e05aa: 0c800513 li a0,200 805e05ae: 00001097 auipc ra,0x1 - 805e05b2: b3e080e7 jalr -1218(ra) # 805e10ec + 805e05b2: b4e080e7 jalr -1202(ra) # 805e10fc 805e05b6: 000aa583 lw a1,0(s5) 805e05ba: b6b1 j 805e0106 else if (cfg_size != sz) { - 805e05bc: 03078c63 beq a5,a6,805e05f4 + 805e05bc: 02c80c63 beq a6,a2,805e05f4 LOG("app_size=%u, ", sz); - 805e05c0: 408c lw a1,0(s1) - 805e05c2: c585 beqz a1,805e05ea - 805e05c4: 6010 ld a2,0(s0) - 805e05c6: 85be mv a1,a5 + 805e05c0: 4090 lw a2,0(s1) + 805e05c2: c605 beqz a2,805e05ea + 805e05c4: 6014 ld a3,0(s0) + 805e05c6: 85c2 mv a1,a6 805e05c8: 00001517 auipc a0,0x1 - 805e05cc: 2d050513 addi a0,a0,720 # 805e1898 - 805e05d0: e436 sd a3,8(sp) - 805e05d2: e03e sd a5,0(sp) - 805e05d4: 9602 jalr a2 + 805e05cc: 2e050513 addi a0,a0,736 # 805e18a8 + 805e05d0: e43e sd a5,8(sp) + 805e05d2: e042 sd a6,0(sp) + 805e05d4: 9682 jalr a3 805e05d6: 0c800513 li a0,200 805e05da: 00001097 auipc ra,0x1 - 805e05de: b12080e7 jalr -1262(ra) # 805e10ec - 805e05e2: 000d2603 lw a2,0(s10) - 805e05e6: 66a2 ld a3,8(sp) - 805e05e8: 6782 ld a5,0(sp) + 805e05de: b22080e7 jalr -1246(ra) # 805e10fc + 805e05e2: 000d2683 lw a3,0(s10) + 805e05e6: 67a2 ld a5,8(sp) + 805e05e8: 6802 ld a6,0(sp) cfg_size = sz; 805e05ea: 00002717 auipc a4,0x2 - 805e05ee: 94d72323 sw a3,-1722(a4) # 805e1f30 - 805e05f2: 883e mv a6,a5 + 805e05ee: 94f72b23 sw a5,-1706(a4) # 805e1f40 + 805e05f2: 8642 mv a2,a6 if (cfg_magic & CFG_APP_FLAG_SHA256) { - 805e05f4: 00467793 andi a5,a2,4 - 805e05f8: 18079363 bnez a5,805e077e + 805e05f4: 0046f793 andi a5,a3,4 + 805e05f8: 18079163 bnez a5,805e077a if (cfg_magic & CFG_APP_FLAG_CRC32) { - 805e05fc: 00267793 andi a5,a2,2 - 805e0600: efad bnez a5,805e067a + 805e05fc: 8a89 andi a3,a3,2 + 805e05fe: eead bnez a3,805e0678 LOG("App ok, "); - 805e0602: 409c lw a5,0(s1) - 805e0604: e38d bnez a5,805e0626 + 805e0600: 409c lw a5,0(s1) + 805e0602: e38d bnez a5,805e0624 if ((cfg_magic & CFG_APP_FLAG_ACTIVE) == 0) { - 805e0606: 000d2683 lw a3,0(s10) + 805e0604: 000d2683 lw a3,0(s10) available_apps[i] = 1; - 805e060a: 00002617 auipc a2,0x2 - 805e060e: 95666603 lwu a2,-1706(a2) # 805e1f60 - 805e0612: 9652 add a2,a2,s4 - 805e0614: 4585 li a1,1 - 805e0616: 00b60023 sb a1,0(a2) + 805e0608: 00002617 auipc a2,0x2 + 805e060c: 96866603 lwu a2,-1688(a2) # 805e1f70 + 805e0610: 9652 add a2,a2,s4 + 805e0612: 4585 li a1,1 + 805e0614: 00b60023 sb a1,0(a2) if ((cfg_magic & CFG_APP_FLAG_ACTIVE) == 0) { - 805e061a: 8a85 andi a3,a3,1 - 805e061c: d6069be3 bnez a3,805e0392 - 805e0620: 000aa583 lw a1,0(s5) - 805e0624: b4cd j 805e0106 + 805e0618: 8a85 andi a3,a3,1 + 805e061a: d6069ce3 bnez a3,805e0392 + 805e061e: 000aa583 lw a1,0(s5) + 805e0622: b4d5 j 805e0106 LOG("App ok, "); - 805e0626: 601c ld a5,0(s0) - 805e0628: 00001517 auipc a0,0x1 - 805e062c: 2a850513 addi a0,a0,680 # 805e18d0 - 805e0630: 9782 jalr a5 - 805e0632: 0c800513 li a0,200 - 805e0636: 00001097 auipc ra,0x1 - 805e063a: ab6080e7 jalr -1354(ra) # 805e10ec + 805e0624: 601c ld a5,0(s0) + 805e0626: 00001517 auipc a0,0x1 + 805e062a: 2ba50513 addi a0,a0,698 # 805e18e0 + 805e062e: 9782 jalr a5 + 805e0630: 0c800513 li a0,200 + 805e0634: 00001097 auipc ra,0x1 + 805e0638: ac8080e7 jalr -1336(ra) # 805e10fc available_apps[i] = 1; - 805e063e: 00002697 auipc a3,0x2 - 805e0642: 9226e683 lwu a3,-1758(a3) # 805e1f60 - 805e0646: 96d2 add a3,a3,s4 - 805e0648: 4605 li a2,1 - 805e064a: 00c68023 sb a2,0(a3) + 805e063c: 00002697 auipc a3,0x2 + 805e0640: 9346e683 lwu a3,-1740(a3) # 805e1f70 + 805e0644: 96d2 add a3,a3,s4 + 805e0646: 4605 li a2,1 + 805e0648: 00c68023 sb a2,0(a3) if ((cfg_magic & CFG_APP_FLAG_ACTIVE) == 0) { - 805e064e: 000d2683 lw a3,0(s10) - 805e0652: 409c lw a5,0(s1) - 805e0654: 8a85 andi a3,a3,1 - 805e0656: d2069ee3 bnez a3,805e0392 + 805e064c: 000d2683 lw a3,0(s10) + 805e0650: 409c lw a5,0(s1) + 805e0652: 8a85 andi a3,a3,1 + 805e0654: d2069fe3 bnez a3,805e0392 LOG("NOT "); - 805e065a: e80784e3 beqz a5,805e04e2 - 805e065e: 601c ld a5,0(s0) - 805e0660: 00001517 auipc a0,0x1 - 805e0664: 29050513 addi a0,a0,656 # 805e18f0 - 805e0668: 9782 jalr a5 - 805e066a: 0c800513 li a0,200 - 805e066e: 00001097 auipc ra,0x1 - 805e0672: a7e080e7 jalr -1410(ra) # 805e10ec - 805e0676: 409c lw a5,0(s1) - 805e0678: b3a9 j 805e03c2 + 805e0658: e80785e3 beqz a5,805e04e2 + 805e065c: 601c ld a5,0(s0) + 805e065e: 00001517 auipc a0,0x1 + 805e0662: 2a250513 addi a0,a0,674 # 805e1900 + 805e0666: 9782 jalr a5 + 805e0668: 0c800513 li a0,200 + 805e066c: 00001097 auipc ra,0x1 + 805e0670: a90080e7 jalr -1392(ra) # 805e10fc + 805e0674: 409c lw a5,0(s1) + 805e0676: b3b1 j 805e03c2 for (uint32_t n = 5; n < (cfg_size+5); n++) { - 805e067a: 0058079b addiw a5,a6,5 - 805e067e: 4695 li a3,5 - 805e0680: 5cf6f463 bleu a5,a3,805e0c48 - 805e0684: 000c2603 lw a2,0(s8) + 805e0678: 0056079b addiw a5,a2,5 + 805e067c: 4695 li a3,5 + 805e067e: 5cf6fd63 bleu a5,a3,805e0c58 + 805e0682: 000c2683 lw a3,0(s8) uint32_t crc = 0xFFFFFFFF; - 805e0688: 57fd li a5,-1 + 805e0686: 57fd li a5,-1 byte = app_flash_ptr[cfg_address + n]; - 805e068a: 54000537 lui a0,0x54000 - 805e068e: 0056059b addiw a1,a2,5 - 805e0692: 0105863b addw a2,a1,a6 - 805e0696: 02059693 slli a3,a1,0x20 - 805e069a: 9281 srli a3,a3,0x20 - 805e069c: 96aa add a3,a3,a0 - 805e069e: 0006c683 lbu a3,0(a3) - 805e06a2: 2585 addiw a1,a1,1 + 805e0688: 54000537 lui a0,0x54000 + 805e068c: 0056859b addiw a1,a3,5 + 805e0690: 9e2d addw a2,a2,a1 + 805e0692: 02059693 slli a3,a1,0x20 + 805e0696: 9281 srli a3,a3,0x20 + 805e0698: 96aa add a3,a3,a0 + 805e069a: 0006c683 lbu a3,0(a3) + 805e069e: 2585 addiw a1,a1,1 crc = crc ^ byte; - 805e06a4: 8fb5 xor a5,a5,a3 + 805e06a0: 8fb5 xor a5,a5,a3 mask = -(crc & 1); - 805e06a6: 0017f693 andi a3,a5,1 - 805e06aa: 40d006bb negw a3,a3 + 805e06a2: 0017f693 andi a3,a5,1 + 805e06a6: 40d006bb negw a3,a3 crc = (crc >> 1) ^ (0xEDB88320 & mask); - 805e06ae: 0166f6b3 and a3,a3,s6 - 805e06b2: 0017d79b srliw a5,a5,0x1 - 805e06b6: 8fb5 xor a5,a5,a3 - 805e06b8: 0007869b sext.w a3,a5 + 805e06aa: 0166f6b3 and a3,a3,s6 + 805e06ae: 0017d79b srliw a5,a5,0x1 + 805e06b2: 8fb5 xor a5,a5,a3 + 805e06b4: 0007869b sext.w a3,a5 mask = -(crc & 1); - 805e06bc: 0016f793 andi a5,a3,1 - 805e06c0: 40f007bb negw a5,a5 + 805e06b8: 0016f793 andi a5,a3,1 + 805e06bc: 40f007bb negw a5,a5 crc = (crc >> 1) ^ (0xEDB88320 & mask); - 805e06c4: 0016d69b srliw a3,a3,0x1 - 805e06c8: 0167f7b3 and a5,a5,s6 - 805e06cc: 8fb5 xor a5,a5,a3 - 805e06ce: 2781 sext.w a5,a5 + 805e06c0: 0016d69b srliw a3,a3,0x1 + 805e06c4: 0167f7b3 and a5,a5,s6 + 805e06c8: 8fb5 xor a5,a5,a3 + 805e06ca: 2781 sext.w a5,a5 mask = -(crc & 1); - 805e06d0: 0017f693 andi a3,a5,1 - 805e06d4: 40d006bb negw a3,a3 + 805e06cc: 0017f693 andi a3,a5,1 + 805e06d0: 40d006bb negw a3,a3 crc = (crc >> 1) ^ (0xEDB88320 & mask); - 805e06d8: 0017d79b srliw a5,a5,0x1 - 805e06dc: 0166f6b3 and a3,a3,s6 - 805e06e0: 8ebd xor a3,a3,a5 - 805e06e2: 2681 sext.w a3,a3 + 805e06d4: 0017d79b srliw a5,a5,0x1 + 805e06d8: 0166f6b3 and a3,a3,s6 + 805e06dc: 8ebd xor a3,a3,a5 + 805e06de: 2681 sext.w a3,a3 mask = -(crc & 1); - 805e06e4: 0016f793 andi a5,a3,1 - 805e06e8: 40f007bb negw a5,a5 + 805e06e0: 0016f793 andi a5,a3,1 + 805e06e4: 40f007bb negw a5,a5 crc = (crc >> 1) ^ (0xEDB88320 & mask); - 805e06ec: 0016d69b srliw a3,a3,0x1 - 805e06f0: 0167f7b3 and a5,a5,s6 - 805e06f4: 8fb5 xor a5,a5,a3 - 805e06f6: 2781 sext.w a5,a5 + 805e06e8: 0016d69b srliw a3,a3,0x1 + 805e06ec: 0167f7b3 and a5,a5,s6 + 805e06f0: 8fb5 xor a5,a5,a3 + 805e06f2: 2781 sext.w a5,a5 mask = -(crc & 1); - 805e06f8: 0017f693 andi a3,a5,1 - 805e06fc: 40d006bb negw a3,a3 + 805e06f4: 0017f693 andi a3,a5,1 + 805e06f8: 40d006bb negw a3,a3 crc = (crc >> 1) ^ (0xEDB88320 & mask); - 805e0700: 0017d79b srliw a5,a5,0x1 - 805e0704: 0166f6b3 and a3,a3,s6 - 805e0708: 8ebd xor a3,a3,a5 - 805e070a: 2681 sext.w a3,a3 + 805e06fc: 0017d79b srliw a5,a5,0x1 + 805e0700: 0166f6b3 and a3,a3,s6 + 805e0704: 8ebd xor a3,a3,a5 + 805e0706: 2681 sext.w a3,a3 mask = -(crc & 1); - 805e070c: 0016f793 andi a5,a3,1 - 805e0710: 40f007bb negw a5,a5 + 805e0708: 0016f793 andi a5,a3,1 + 805e070c: 40f007bb negw a5,a5 crc = (crc >> 1) ^ (0xEDB88320 & mask); - 805e0714: 0016d69b srliw a3,a3,0x1 - 805e0718: 0167f7b3 and a5,a5,s6 - 805e071c: 8fb5 xor a5,a5,a3 - 805e071e: 2781 sext.w a5,a5 + 805e0710: 0016d69b srliw a3,a3,0x1 + 805e0714: 0167f7b3 and a5,a5,s6 + 805e0718: 8fb5 xor a5,a5,a3 + 805e071a: 2781 sext.w a5,a5 mask = -(crc & 1); - 805e0720: 0017f693 andi a3,a5,1 - 805e0724: 40d006bb negw a3,a3 + 805e071c: 0017f693 andi a3,a5,1 + 805e0720: 40d006bb negw a3,a3 crc = (crc >> 1) ^ (0xEDB88320 & mask); - 805e0728: 0017d79b srliw a5,a5,0x1 - 805e072c: 0166f6b3 and a3,a3,s6 - 805e0730: 8ebd xor a3,a3,a5 - 805e0732: 2681 sext.w a3,a3 + 805e0724: 0017d79b srliw a5,a5,0x1 + 805e0728: 0166f6b3 and a3,a3,s6 + 805e072c: 8ebd xor a3,a3,a5 + 805e072e: 2681 sext.w a3,a3 mask = -(crc & 1); - 805e0734: 0016f793 andi a5,a3,1 - 805e0738: 40f007bb negw a5,a5 + 805e0730: 0016f793 andi a5,a3,1 + 805e0734: 40f007bb negw a5,a5 crc = (crc >> 1) ^ (0xEDB88320 & mask); - 805e073c: 0016d69b srliw a3,a3,0x1 - 805e0740: 0167f7b3 and a5,a5,s6 - 805e0744: 8fb5 xor a5,a5,a3 - 805e0746: 2781 sext.w a5,a5 + 805e0738: 0016d69b srliw a3,a3,0x1 + 805e073c: 0167f7b3 and a5,a5,s6 + 805e0740: 8fb5 xor a5,a5,a3 + 805e0742: 2781 sext.w a5,a5 for (uint32_t n = 5; n < (cfg_size+5); n++) { - 805e0748: f4c597e3 bne a1,a2,805e0696 + 805e0744: f4c597e3 bne a1,a2,805e0692 if (crc32 != cfg_crc) { - 805e074c: 00001717 auipc a4,0x1 - 805e0750: 7c870713 addi a4,a4,1992 # 805e1f14 - 805e0754: 4314 lw a3,0(a4) - 805e0756: fff7c793 not a5,a5 - 805e075a: eaf684e3 beq a3,a5,805e0602 + 805e0748: 00001717 auipc a4,0x1 + 805e074c: 7dc70713 addi a4,a4,2012 # 805e1f24 + 805e0750: 4314 lw a3,0(a4) + 805e0752: fff7c793 not a5,a5 + 805e0756: eaf685e3 beq a3,a5,805e0600 LOG("CRC32 error, "); - 805e075e: 409c lw a5,0(s1) - 805e0760: d80781e3 beqz a5,805e04e2 - 805e0764: 601c ld a5,0(s0) - 805e0766: 00001517 auipc a0,0x1 - 805e076a: 14250513 addi a0,a0,322 # 805e18a8 - 805e076e: 9782 jalr a5 - 805e0770: 0c800513 li a0,200 - 805e0774: 00001097 auipc ra,0x1 - 805e0778: 978080e7 jalr -1672(ra) # 805e10ec - 805e077c: bbfd j 805e057a + 805e075a: 409c lw a5,0(s1) + 805e075c: d80783e3 beqz a5,805e04e2 + 805e0760: 601c ld a5,0(s0) + 805e0762: 00001517 auipc a0,0x1 + 805e0766: 15650513 addi a0,a0,342 # 805e18b8 + 805e076a: 9782 jalr a5 + 805e076c: 0c800513 li a0,200 + 805e0770: 00001097 auipc ra,0x1 + 805e0774: 98c080e7 jalr -1652(ra) # 805e10fc + 805e0778: b509 j 805e057a return app_sha256(); - 805e077e: 00000097 auipc ra,0x0 - 805e0782: 7dc080e7 jalr 2012(ra) # 805e0f5a - 805e0786: 2501 sext.w a0,a0 + 805e077a: 00000097 auipc ra,0x0 + 805e077e: 7f0080e7 jalr 2032(ra) # 805e0f6a + 805e0782: 2501 sext.w a0,a0 if (app_check() == 0) { - 805e0788: e6051de3 bnez a0,805e0602 - 805e078c: b3fd j 805e057a - for (i = 0; i < BOOT_CONFIG_ITEMS; i++) { - 805e078e: 478d li a5,3 - 805e0790: 00001717 auipc a4,0x1 - 805e0794: 7cf72823 sw a5,2000(a4) # 805e1f60 + 805e0784: e6051ee3 bnez a0,805e0600 + 805e0788: bbcd j 805e057a + for (boot_entry = 0; boot_entry < BOOT_CONFIG_ITEMS; boot_entry++) { + 805e078a: 478d li a5,3 + 805e078c: 00001717 auipc a4,0x1 + 805e0790: 38f72623 sw a5,908(a4) # 805e1b18 } else { LOG("\n* No app found, loading default\n"); } } else if (boot_pin == 0) { - 805e0798: 00001797 auipc a5,0x1 - 805e079c: 37078793 addi a5,a5,880 # 805e1b08 - 805e07a0: 439c lw a5,0(a5) - 805e07a2: 24078363 beqz a5,805e09e8 + 805e0794: 00001797 auipc a5,0x1 + 805e0798: 38878793 addi a5,a5,904 # 805e1b1c + 805e079c: 439c lw a5,0(a5) + 805e079e: 20078263 beqz a5,805e09a2 LOG("%c\n\n", (char)char_in); } } // If default application is selected for load, get its size and check SHA hash if (app_flash_start == DEFAULT_APP_ADDR) { - 805e07a6: 000ba703 lw a4,0(s7) - 805e07aa: 67c1 lui a5,0x10 - 805e07ac: 18f70a63 beq a4,a5,805e0940 + 805e07a2: 000ba703 lw a4,0(s7) + 805e07a6: 67c1 lui a5,0x10 + 805e07a8: 18f70a63 beq a4,a5,805e093c } } } // === Copy the application code from flash to SRAM === LOG("* Loading app from flash at 0x%08X (%u B)\n", app_flash_start, app_size); - 805e07b0: 409c lw a5,0(s1) - 805e07b2: 00001917 auipc s2,0x1 - 805e07b6: 34690913 addi s2,s2,838 # 805e1af8 - 805e07ba: c38d beqz a5,805e07dc - 805e07bc: 601c ld a5,0(s0) - 805e07be: 00092603 lw a2,0(s2) - 805e07c2: 000ba583 lw a1,0(s7) - 805e07c6: 00001517 auipc a0,0x1 - 805e07ca: 24a50513 addi a0,a0,586 # 805e1a10 - 805e07ce: 9782 jalr a5 - 805e07d0: 0c800513 li a0,200 - 805e07d4: 00001097 auipc ra,0x1 - 805e07d8: 918080e7 jalr -1768(ra) # 805e10ec + 805e07ac: 409c lw a5,0(s1) + 805e07ae: 00001917 auipc s2,0x1 + 805e07b2: 35a90913 addi s2,s2,858 # 805e1b08 + 805e07b6: c38d beqz a5,805e07d8 + 805e07b8: 601c ld a5,0(s0) + 805e07ba: 00092603 lw a2,0(s2) + 805e07be: 000ba583 lw a1,0(s7) + 805e07c2: 00001517 auipc a0,0x1 + 805e07c6: 25e50513 addi a0,a0,606 # 805e1a20 + 805e07ca: 9782 jalr a5 + 805e07cc: 0c800513 li a0,200 + 805e07d0: 00001097 auipc ra,0x1 + 805e07d4: 92c080e7 jalr -1748(ra) # 805e10fc for (i=0; i < app_size; i++) { - 805e07dc: 00092603 lw a2,0(s2) - 805e07e0: 00001797 auipc a5,0x1 - 805e07e4: 7807a023 sw zero,1920(a5) # 805e1f60 - 805e07e8: c231 beqz a2,805e082c - 805e07ea: 4785 li a5,1 - 805e07ec: fff6071b addiw a4,a2,-1 - 805e07f0: 07fe slli a5,a5,0x1f - 805e07f2: 1702 slli a4,a4,0x20 - 805e07f4: 00178693 addi a3,a5,1 + 805e07d8: 00092603 lw a2,0(s2) + 805e07dc: 00001797 auipc a5,0x1 + 805e07e0: 7807aa23 sw zero,1940(a5) # 805e1f70 + 805e07e4: c231 beqz a2,805e0828 + 805e07e6: 4785 li a5,1 + 805e07e8: fff6071b addiw a4,a2,-1 + 805e07ec: 07fe slli a5,a5,0x1f + 805e07ee: 1702 slli a4,a4,0x20 + 805e07f0: 00178693 addi a3,a5,1 app_sram_ptr[i] = app_flash_ptr[app_flash_start+i+5]; - 805e07f8: 000ba583 lw a1,0(s7) - 805e07fc: 9301 srli a4,a4,0x20 - 805e07fe: 9736 add a4,a4,a3 - 805e0800: 800006b7 lui a3,0x80000 - 805e0804: 2695 addiw a3,a3,5 - 805e0806: 9db5 addw a1,a1,a3 - 805e0808: 54000537 lui a0,0x54000 - 805e080c: 00f586bb addw a3,a1,a5 - 805e0810: 1682 slli a3,a3,0x20 - 805e0812: 9281 srli a3,a3,0x20 - 805e0814: 96aa add a3,a3,a0 - 805e0816: 0006c683 lbu a3,0(a3) # ffffffff80000000 - 805e081a: 0785 addi a5,a5,1 - 805e081c: fed78fa3 sb a3,-1(a5) + 805e07f4: 000ba583 lw a1,0(s7) + 805e07f8: 9301 srli a4,a4,0x20 + 805e07fa: 9736 add a4,a4,a3 + 805e07fc: 800006b7 lui a3,0x80000 + 805e0800: 2695 addiw a3,a3,5 + 805e0802: 9db5 addw a1,a1,a3 + 805e0804: 54000537 lui a0,0x54000 + 805e0808: 00f586bb addw a3,a1,a5 + 805e080c: 1682 slli a3,a3,0x20 + 805e080e: 9281 srli a3,a3,0x20 + 805e0810: 96aa add a3,a3,a0 + 805e0812: 0006c683 lbu a3,0(a3) # ffffffff80000000 + 805e0816: 0785 addi a5,a5,1 + 805e0818: fed78fa3 sb a3,-1(a5) for (i=0; i < app_size; i++) { - 805e0820: fee796e3 bne a5,a4,805e080c - 805e0824: 00001797 auipc a5,0x1 - 805e0828: 72c7ae23 sw a2,1852(a5) # 805e1f60 + 805e081c: fee796e3 bne a5,a4,805e0808 + 805e0820: 00001797 auipc a5,0x1 + 805e0824: 74c7a823 sw a2,1872(a5) # 805e1f70 } // === Start the application === LOG("* Starting at 0x%08X ...\n\n", app_start); - 805e082c: 409c lw a5,0(s1) - 805e082e: cf99 beqz a5,805e084c - 805e0830: 601c ld a5,0(s0) - 805e0832: 4585 li a1,1 - 805e0834: 05fe slli a1,a1,0x1f - 805e0836: 00001517 auipc a0,0x1 - 805e083a: 20a50513 addi a0,a0,522 # 805e1a40 - 805e083e: 9782 jalr a5 - 805e0840: 0c800513 li a0,200 - 805e0844: 00001097 auipc ra,0x1 - 805e0848: 8a8080e7 jalr -1880(ra) # 805e10ec + 805e0828: 409c lw a5,0(s1) + 805e082a: cf99 beqz a5,805e0848 + 805e082c: 601c ld a5,0(s0) + 805e082e: 4585 li a1,1 + 805e0830: 05fe slli a1,a1,0x1f + 805e0832: 00001517 auipc a0,0x1 + 805e0836: 21e50513 addi a0,a0,542 # 805e1a50 + 805e083a: 9782 jalr a5 + 805e083c: 0c800513 li a0,200 + 805e0840: 00001097 auipc ra,0x1 + 805e0844: 8bc080e7 jalr -1860(ra) # 805e10fc usleep(1000); - 805e084c: 3e800513 li a0,1000 - 805e0850: 00001097 auipc ra,0x1 - 805e0854: 89c080e7 jalr -1892(ra) # 805e10ec + 805e0848: 3e800513 li a0,1000 + 805e084c: 00001097 auipc ra,0x1 + 805e0850: 8b0080e7 jalr -1872(ra) # 805e10fc // Disable XIP mode sysctl->peri.spi3_xip_en = 0; - 805e0858: 504406b7 lui a3,0x50440 - 805e085c: 4ebc lw a5,88(a3) - 805e085e: 7761 lui a4,0xffff8 - 805e0860: 177d addi a4,a4,-1 - 805e0862: 8ff9 and a5,a5,a4 - 805e0864: cebc sw a5,88(a3) + 805e0854: 504406b7 lui a3,0x50440 + 805e0858: 4ebc lw a5,88(a3) + 805e085a: 7761 lui a4,0xffff8 + 805e085c: 177d addi a4,a4,-1 + 805e085e: 8ff9 and a5,a5,a4 + 805e0860: cebc sw a5,88(a3) /* * each core has separate instruction cache * we must clear it before continuing */ core1_sync = 1; - 805e0866: 4785 li a5,1 - 805e0868: 00001717 auipc a4,0x1 - 805e086c: 6cf72a23 sw a5,1748(a4) # 805e1f3c + 805e0862: 4785 li a5,1 + 805e0864: 00001717 auipc a4,0x1 + 805e0868: 6ef72423 sw a5,1768(a4) # 805e1f4c asm("fence"); // D-Cache; this may not be necessary, but it looks it doesn't hurt if it is executed - 805e0870: 0ff0000f fence + 805e086c: 0ff0000f fence asm("fence.i"); // I-Cache - 805e0874: 0000100f fence.i + 805e0870: 0000100f fence.i asm ("jr %0" : : "r"(app_start)); - 805e0878: 4785 li a5,1 - 805e087a: 07fe slli a5,a5,0x1f - 805e087c: 8782 jr a5 + 805e0874: 4785 li a5,1 + 805e0876: 07fe slli a5,a5,0x1f + 805e0878: 8782 jr a5 // This should never be reached! LOG("\nERROR, SYSTEM HALTED\n"); - 805e087e: 409c lw a5,0(s1) - 805e0880: cf89 beqz a5,805e089a - 805e0882: 601c ld a5,0(s0) - 805e0884: 00001517 auipc a0,0x1 - 805e0888: 1dc50513 addi a0,a0,476 # 805e1a60 - 805e088c: 9782 jalr a5 - 805e088e: 0c800513 li a0,200 - 805e0892: 00001097 auipc ra,0x1 - 805e0896: 85a080e7 jalr -1958(ra) # 805e10ec + 805e087a: 409c lw a5,0(s1) + 805e087c: cf89 beqz a5,805e0896 + 805e087e: 601c ld a5,0(s0) + 805e0880: 00001517 auipc a0,0x1 + 805e0884: 1f050513 addi a0,a0,496 # 805e1a70 + 805e0888: 9782 jalr a5 + 805e088a: 0c800513 li a0,200 + 805e088e: 00001097 auipc ra,0x1 + 805e0892: 86e080e7 jalr -1938(ra) # 805e10fc while (1) { asm ("nop"); - 805e089a: 0001 nop - 805e089c: 0001 nop - 805e089e: bff5 j 805e089a + 805e0896: 0001 nop + 805e0898: 0001 nop + 805e089a: bff5 j 805e0896 fpioa_set_function(BOOT_PIN, FUNC_GPIOHS2); - 805e08a0: 45e9 li a1,26 - 805e08a2: 4549 li a0,18 - 805e08a4: 00000097 auipc ra,0x0 - 805e08a8: 4c2080e7 jalr 1218(ra) # 805e0d66 + 805e089c: 45e9 li a1,26 + 805e089e: 4549 li a0,18 + 805e08a0: 00000097 auipc ra,0x0 + 805e08a4: 4d6080e7 jalr 1238(ra) # 805e0d76 gpiohs_set_drive_mode(GPIO_KEY, GPIO_DM_INPUT_PULL_UP); - 805e08ac: 4589 li a1,2 - 805e08ae: 4509 li a0,2 - 805e08b0: 00000097 auipc ra,0x0 - 805e08b4: 5bc080e7 jalr 1468(ra) # 805e0e6c + 805e08a8: 4589 li a1,2 + 805e08aa: 4509 li a0,2 + 805e08ac: 00000097 auipc ra,0x0 + 805e08b0: 5d0080e7 jalr 1488(ra) # 805e0e7c usleep(1000); - 805e08b8: 3e800513 li a0,1000 - 805e08bc: 00001097 auipc ra,0x1 - 805e08c0: 830080e7 jalr -2000(ra) # 805e10ec + 805e08b4: 3e800513 li a0,1000 + 805e08b8: 00001097 auipc ra,0x1 + 805e08bc: 844080e7 jalr -1980(ra) # 805e10fc boot_pin = gpiohs_get_pin(GPIO_KEY); - 805e08c4: 4509 li a0,2 - 805e08c6: 00000097 auipc ra,0x0 - 805e08ca: 63a080e7 jalr 1594(ra) # 805e0f00 - LOG("\nK210 bootloader by LoBo v.1.4.1\n\n"); - 805e08ce: 409c lw a5,0(s1) + 805e08c0: 4509 li a0,2 + 805e08c2: 00000097 auipc ra,0x0 + 805e08c6: 64e080e7 jalr 1614(ra) # 805e0f10 + LOG("\nK210 bootloader by LoBo v.1.4.2\n\n"); + 805e08ca: 409c lw a5,0(s1) boot_pin = gpiohs_get_pin(GPIO_KEY); - 805e08d0: 00001717 auipc a4,0x1 - 805e08d4: 22a72c23 sw a0,568(a4) # 805e1b08 - LOG("\nK210 bootloader by LoBo v.1.4.1\n\n"); - 805e08d8: 00001417 auipc s0,0x1 - 805e08dc: 6b043403 ld s0,1712(s0) # 805e1f88 <__TMC_END__+0x8> - 805e08e0: fa078d63 beqz a5,805e009a - 805e08e4: 601c ld a5,0(s0) - 805e08e6: 00001517 auipc a0,0x1 - 805e08ea: f3250513 addi a0,a0,-206 # 805e1818 - 805e08ee: 9782 jalr a5 - 805e08f0: 0c800513 li a0,200 - 805e08f4: 00000097 auipc ra,0x0 - 805e08f8: 7f8080e7 jalr 2040(ra) # 805e10ec + 805e08cc: 00001717 auipc a4,0x1 + 805e08d0: 24a72823 sw a0,592(a4) # 805e1b1c + LOG("\nK210 bootloader by LoBo v.1.4.2\n\n"); + 805e08d4: 00001417 auipc s0,0x1 + 805e08d8: 6f443403 ld s0,1780(s0) # 805e1fc8 <__TMC_END__+0x8> + 805e08dc: fa078f63 beqz a5,805e009a + 805e08e0: 601c ld a5,0(s0) + 805e08e2: 00001517 auipc a0,0x1 + 805e08e6: f4650513 addi a0,a0,-186 # 805e1828 + 805e08ea: 9782 jalr a5 + 805e08ec: 0c800513 li a0,200 + 805e08f0: 00001097 auipc ra,0x1 + 805e08f4: 80c080e7 jalr -2036(ra) # 805e10fc LOG("* Find applications in MAIN parameters\n"); - 805e08fc: 409c lw a5,0(s1) - 805e08fe: f8078e63 beqz a5,805e009a - 805e0902: 601c ld a5,0(s0) - 805e0904: 00001517 auipc a0,0x1 - 805e0908: f3c50513 addi a0,a0,-196 # 805e1840 - 805e090c: 9782 jalr a5 - 805e090e: 0c800513 li a0,200 - 805e0912: 00000097 auipc ra,0x0 - 805e0916: 7da080e7 jalr 2010(ra) # 805e10ec - 805e091a: f80ff06f j 805e009a - for (i = 0; i < BOOT_CONFIG_ITEMS; i++) { - 805e091e: 4789 li a5,2 - 805e0920: bd85 j 805e0790 + 805e08f8: 409c lw a5,0(s1) + 805e08fa: fa078063 beqz a5,805e009a + 805e08fe: 601c ld a5,0(s0) + 805e0900: 00001517 auipc a0,0x1 + 805e0904: f5050513 addi a0,a0,-176 # 805e1850 + 805e0908: 9782 jalr a5 + 805e090a: 0c800513 li a0,200 + 805e090e: 00000097 auipc ra,0x0 + 805e0912: 7ee080e7 jalr 2030(ra) # 805e10fc + 805e0916: f84ff06f j 805e009a + for (boot_entry = 0; boot_entry < BOOT_CONFIG_ITEMS; boot_entry++) { + 805e091a: 4789 li a5,2 + 805e091c: bd85 j 805e078c LOG("ACTIVE\n"); - 805e0922: ac0788e3 beqz a5,805e03f2 - 805e0926: 601c ld a5,0(s0) - 805e0928: 00001517 auipc a0,0x1 - 805e092c: fd050513 addi a0,a0,-48 # 805e18f8 - 805e0930: 9782 jalr a5 - 805e0932: 0c800513 li a0,200 - 805e0936: 00000097 auipc ra,0x0 - 805e093a: 7b6080e7 jalr 1974(ra) # 805e10ec - 805e093e: bc55 j 805e03f2 + 805e091e: ac078ae3 beqz a5,805e03f2 + 805e0922: 601c ld a5,0(s0) + 805e0924: 00001517 auipc a0,0x1 + 805e0928: fe450513 addi a0,a0,-28 # 805e1908 + 805e092c: 9782 jalr a5 + 805e092e: 0c800513 li a0,200 + 805e0932: 00000097 auipc ra,0x0 + 805e0936: 7ca080e7 jalr 1994(ra) # 805e10fc + 805e093a: bc65 j 805e03f2 app_size = flash2uint32(app_flash_start+1); // get app size - 805e0940: 6941 lui s2,0x10 + 805e093c: 6941 lui s2,0x10 key = 1; - 805e0942: 4785 li a5,1 + 805e093e: 4785 li a5,1 app_size = flash2uint32(app_flash_start+1); // get app size - 805e0944: 00190513 addi a0,s2,1 # 10001 <_start-0x805cffff> + 805e0940: 00190513 addi a0,s2,1 # 10001 <_start-0x805cffff> key = 1; - 805e0948: 00001717 auipc a4,0x1 - 805e094c: 60f70e23 sb a5,1564(a4) # 805e1f64 + 805e0944: 00001717 auipc a4,0x1 + 805e0948: 62f70823 sb a5,1584(a4) # 805e1f74 app_size = flash2uint32(app_flash_start+1); // get app size - 805e0950: 00000097 auipc ra,0x0 - 805e0954: 5be080e7 jalr 1470(ra) # 805e0f0e - 805e0958: 2501 sext.w a0,a0 - 805e095a: 00001797 auipc a5,0x1 - 805e095e: 18a7af23 sw a0,414(a5) # 805e1af8 + 805e094c: 00000097 auipc ra,0x0 + 805e0950: 5d2080e7 jalr 1490(ra) # 805e0f1e + 805e0954: 2501 sext.w a0,a0 + 805e0956: 00001797 auipc a5,0x1 + 805e095a: 1aa7a923 sw a0,434(a5) # 805e1b08 if ((app_size >= MIN_APP_FLASH_SIZE) && (app_size <= MAX_APP_FLASH_SIZE)) { - 805e0962: 77f1 lui a5,0xffffc - 805e0964: 9fa9 addw a5,a5,a0 - 805e0966: 002fc737 lui a4,0x2fc - 805e096a: 04f77463 bleu a5,a4,805e09b2 - LOG("\n* Default application check failed!\n"); - 805e096e: 601c ld a5,0(s0) - print_enabled = 1; - 805e0970: 4705 li a4,1 - LOG("\n* Default application check failed!\n"); - 805e0972: 00001517 auipc a0,0x1 - 805e0976: 05e50513 addi a0,a0,94 # 805e19d0 - print_enabled = 1; - 805e097a: 00001697 auipc a3,0x1 - 805e097e: 5ee6a723 sw a4,1518(a3) # 805e1f68 - LOG("\n* Default application check failed!\n"); - 805e0982: 9782 jalr a5 - 805e0984: 0c800513 li a0,200 - 805e0988: 00000097 auipc ra,0x0 - 805e098c: 764080e7 jalr 1892(ra) # 805e10ec - LOG("* SYSTEM HALTED\n"); - 805e0990: 409c lw a5,0(s1) - 805e0992: cf89 beqz a5,805e09ac - 805e0994: 601c ld a5,0(s0) - 805e0996: 00001517 auipc a0,0x1 - 805e099a: 06250513 addi a0,a0,98 # 805e19f8 - 805e099e: 9782 jalr a5 - 805e09a0: 0c800513 li a0,200 - 805e09a4: 00000097 auipc ra,0x0 - 805e09a8: 748080e7 jalr 1864(ra) # 805e10ec - asm ("nop"); - 805e09ac: 0001 nop - 805e09ae: 0001 nop - 805e09b0: bff5 j 805e09ac + 805e095e: 77f1 lui a5,0xffffc + 805e0960: 9fa9 addw a5,a5,a0 + 805e0962: 002fc737 lui a4,0x2fc + 805e0966: 14f76a63 bltu a4,a5,805e0aba + if ((boot_entry < BOOT_CONFIG_ITEMS) || app_sha256()) { + 805e096a: 00001797 auipc a5,0x1 + 805e096e: 1ae78793 addi a5,a5,430 # 805e1b18 + 805e0972: 4398 lw a4,0(a5) cfg_size = app_size; - 805e09b2: 00001797 auipc a5,0x1 - 805e09b6: 56a7af23 sw a0,1406(a5) # 805e1f30 + 805e0974: 00001797 auipc a5,0x1 + 805e0978: 5ca7a623 sw a0,1484(a5) # 805e1f40 cfg_address = app_flash_start; - 805e09ba: 00001797 auipc a5,0x1 - 805e09be: 5527ab23 sw s2,1366(a5) # 805e1f10 - if (app_sha256()) key = 0; - 805e09c2: 00000097 auipc ra,0x0 - 805e09c6: 598080e7 jalr 1432(ra) # 805e0f5a - 805e09ca: 2501 sext.w a0,a0 - 805e09cc: 10050e63 beqz a0,805e0ae8 - 805e09d0: 00001797 auipc a5,0x1 - 805e09d4: 58078a23 sb zero,1428(a5) # 805e1f64 + 805e097c: 00001797 auipc a5,0x1 + 805e0980: 5b27a223 sw s2,1444(a5) # 805e1f20 + if ((boot_entry < BOOT_CONFIG_ITEMS) || app_sha256()) { + 805e0984: 479d li a5,7 + 805e0986: 10e7ed63 bltu a5,a4,805e0aa0 + key = 0; + 805e098a: 00001797 auipc a5,0x1 + 805e098e: 5e078523 sb zero,1514(a5) # 805e1f74 if (key) { - 805e09d8: bbe1 j 805e07b0 + 805e0992: bd29 j 805e07ac else if (boot_pin == 0) { - 805e09da: 00001797 auipc a5,0x1 - 805e09de: 12e78793 addi a5,a5,302 # 805e1b08 - 805e09e2: 439c lw a5,0(a5) - 805e09e4: dc0796e3 bnez a5,805e07b0 + 805e0994: 00001797 auipc a5,0x1 + 805e0998: 18878793 addi a5,a5,392 # 805e1b1c + 805e099c: 439c lw a5,0(a5) + 805e099e: e00797e3 bnez a5,805e07ac boot_pin = gpiohs_get_pin(GPIO_KEY); - 805e09e8: 4509 li a0,2 - 805e09ea: 00000097 auipc ra,0x0 - 805e09ee: 516080e7 jalr 1302(ra) # 805e0f00 - 805e09f2: 0005091b sext.w s2,a0 - 805e09f6: 00001797 auipc a5,0x1 - 805e09fa: 1127a923 sw s2,274(a5) # 805e1b08 + 805e09a2: 4509 li a0,2 + 805e09a4: 00000097 auipc ra,0x0 + 805e09a8: 56c080e7 jalr 1388(ra) # 805e0f10 + 805e09ac: 0005091b sext.w s2,a0 + 805e09b0: 00001797 auipc a5,0x1 + 805e09b4: 1727a623 sw s2,364(a5) # 805e1b1c if (boot_pin == 0) { - 805e09fe: da0914e3 bnez s2,805e07a6 + 805e09b8: de0915e3 bnez s2,805e07a2 LOG("\nSelect the application number to load ["); - 805e0a02: 409c lw a5,0(s1) - 805e0a04: 24079463 bnez a5,805e0c4c + 805e09bc: 409c lw a5,0(s1) + 805e09be: 28079f63 bnez a5,805e0c5c for (i = 0; i < BOOT_CONFIG_ITEMS; i++) { - 805e0a08: 00001797 auipc a5,0x1 - 805e0a0c: 5407ac23 sw zero,1368(a5) # 805e1f60 + 805e09c2: 00001797 auipc a5,0x1 + 805e09c6: 5a07a723 sw zero,1454(a5) # 805e1f70 LOG(" %u,", i); - 805e0a10: 00001c17 auipc s8,0x1 - 805e0a14: f98c0c13 addi s8,s8,-104 # 805e19a8 + 805e09ca: 00001c17 auipc s8,0x1 + 805e09ce: feec0c13 addi s8,s8,-18 # 805e19b8 for (i = 0; i < BOOT_CONFIG_ITEMS; i++) { - 805e0a18: 4b1d li s6,7 + 805e09d2: 4b1d li s6,7 if (available_apps[i]) { - 805e0a1a: 02091793 slli a5,s2,0x20 - 805e0a1e: 9381 srli a5,a5,0x20 - 805e0a20: 97d2 add a5,a5,s4 - 805e0a22: 0007c783 lbu a5,0(a5) - 805e0a26: cf89 beqz a5,805e0a40 + 805e09d4: 02091793 slli a5,s2,0x20 + 805e09d8: 9381 srli a5,a5,0x20 + 805e09da: 97d2 add a5,a5,s4 + 805e09dc: 0007c783 lbu a5,0(a5) + 805e09e0: cf89 beqz a5,805e09fa LOG(" %u,", i); - 805e0a28: 409c lw a5,0(s1) - 805e0a2a: 85ca mv a1,s2 - 805e0a2c: 8562 mv a0,s8 - 805e0a2e: cb89 beqz a5,805e0a40 - 805e0a30: 601c ld a5,0(s0) - 805e0a32: 9782 jalr a5 - 805e0a34: 0c800513 li a0,200 - 805e0a38: 00000097 auipc ra,0x0 - 805e0a3c: 6b4080e7 jalr 1716(ra) # 805e10ec + 805e09e2: 409c lw a5,0(s1) + 805e09e4: 85ca mv a1,s2 + 805e09e6: 8562 mv a0,s8 + 805e09e8: cb89 beqz a5,805e09fa + 805e09ea: 601c ld a5,0(s0) + 805e09ec: 9782 jalr a5 + 805e09ee: 0c800513 li a0,200 + 805e09f2: 00000097 auipc ra,0x0 + 805e09f6: 70a080e7 jalr 1802(ra) # 805e10fc for (i = 0; i < BOOT_CONFIG_ITEMS; i++) { - 805e0a40: 000aa783 lw a5,0(s5) - 805e0a44: 0017891b addiw s2,a5,1 - 805e0a48: 00001717 auipc a4,0x1 - 805e0a4c: 51272c23 sw s2,1304(a4) # 805e1f60 - 805e0a50: fd2b75e3 bleu s2,s6,805e0a1a + 805e09fa: 000aa783 lw a5,0(s5) + 805e09fe: 0017891b addiw s2,a5,1 + 805e0a02: 00001717 auipc a4,0x1 + 805e0a06: 57272723 sw s2,1390(a4) # 805e1f70 + 805e0a0a: fd2b75e3 bleu s2,s6,805e09d4 LOG(" d=default ] ? "); - 805e0a54: 409c lw a5,0(s1) - 805e0a56: 1c079c63 bnez a5,805e0c2e - 805e0a5a: 00001c97 auipc s9,0x1 - 805e0a5e: 53ecbc83 ld s9,1342(s9) # 805e1f98 <__TMC_END__+0x18> + 805e0a0e: 409c lw a5,0(s1) + 805e0a10: 22079763 bnez a5,805e0c3e + 805e0a14: 00001d17 auipc s10,0x1 + 805e0a18: 5c4d3d03 ld s10,1476(s10) # 805e1fd8 <__TMC_END__+0x18> if ((char_in == 'd') || (char_in == 'D')) { - 805e0a62: 04400c13 li s8,68 + 805e0a1c: 04400c93 li s9,68 if ((char_in >= 0) && (char_in < BOOT_CONFIG_ITEMS)) { - 805e0a66: 4b1d li s6,7 + 805e0a20: 4c1d li s8,7 LOG("%c? ", char_in); - 805e0a68: 00001a97 auipc s5,0x1 - 805e0a6c: f58a8a93 addi s5,s5,-168 # 805e19c0 - 805e0a70: a005 j 805e0a90 + 805e0a22: 00001b17 auipc s6,0x1 + 805e0a26: faeb0b13 addi s6,s6,-82 # 805e19d0 + 805e0a2a: a00d j 805e0a4c char_in -= 0x30; - 805e0a72: 00001797 auipc a5,0x1 - 805e0a76: 4cd7a123 sw a3,1218(a5) # 805e1f34 + 805e0a2c: 00001797 auipc a5,0x1 + 805e0a30: 5157ac23 sw s5,1304(a5) # 805e1f44 if ((char_in >= 0) && (char_in < BOOT_CONFIG_ITEMS)) { - 805e0a7a: 00eb6563 bltu s6,a4,805e0a84 + 805e0a34: 015c6663 bltu s8,s5,805e0a40 if (available_apps[char_in]) { - 805e0a7e: 00064783 lbu a5,0(a2) - 805e0a82: efc5 bnez a5,805e0b3a + 805e0a38: 0006c783 lbu a5,0(a3) # 50440000 <_start-0x301a0000> + 805e0a3c: 10079363 bnez a5,805e0b42 LOG("%c? ", char_in); - 805e0a84: 409c lw a5,0(s1) + 805e0a40: 409c lw a5,0(s1) char_in += 0x30; - 805e0a86: 00001717 auipc a4,0x1 - 805e0a8a: 4b272723 sw s2,1198(a4) # 805e1f34 + 805e0a42: 00001717 auipc a4,0x1 + 805e0a46: 51272123 sw s2,1282(a4) # 805e1f44 LOG("%c? ", char_in); - 805e0a8e: ebd9 bnez a5,805e0b24 + 805e0a4a: e3ed bnez a5,805e0b2c char_in = rom_getchar(); - 805e0a90: 000cb783 ld a5,0(s9) - 805e0a94: 9782 jalr a5 + 805e0a4c: 000d3783 ld a5,0(s10) + 805e0a50: 9782 jalr a5 if ((char_in == 'd') || (char_in == 'D')) { - 805e0a96: fdf57793 andi a5,a0,-33 + 805e0a52: fdf57793 andi a5,a0,-33 char_in -= 0x30; - 805e0a9a: fd05069b addiw a3,a0,-48 + 805e0a56: fd050a9b addiw s5,a0,-48 char_in = rom_getchar(); - 805e0a9e: 00001717 auipc a4,0x1 - 805e0aa2: 48a72b23 sw a0,1174(a4) # 805e1f34 - char_in -= 0x30; - 805e0aa6: 0006871b sext.w a4,a3 + 805e0a5a: 00001697 auipc a3,0x1 + 805e0a5e: 4ea6a523 sw a0,1258(a3) # 805e1f44 if ((char_in == 'd') || (char_in == 'D')) { - 805e0aaa: 2781 sext.w a5,a5 + 805e0a62: 2781 sext.w a5,a5 char_in = rom_getchar(); - 805e0aac: 892a mv s2,a0 + 805e0a64: 892a mv s2,a0 if (available_apps[char_in]) { - 805e0aae: 00ea0633 add a2,s4,a4 + 805e0a66: 015a06b3 add a3,s4,s5 if ((char_in == 'd') || (char_in == 'D')) { - 805e0ab2: fd8790e3 bne a5,s8,805e0a72 + 805e0a6a: fd9791e3 bne a5,s9,805e0a2c LOG("%c\n\n", (char)char_in); - 805e0ab6: 409c lw a5,0(s1) + 805e0a6e: 409c lw a5,0(s1) app_flash_start = DEFAULT_APP_ADDR; - 805e0ab8: 6741 lui a4,0x10 - 805e0aba: 00001697 auipc a3,0x1 - 805e0abe: 00e6ab23 sw a4,22(a3) # 805e1ad0 + 805e0a70: 6741 lui a4,0x10 + 805e0a72: 00001697 auipc a3,0x1 + 805e0a76: 06e6a723 sw a4,110(a3) # 805e1ae0 LOG("%c\n\n", (char)char_in); - 805e0ac2: e6078fe3 beqz a5,805e0940 - 805e0ac6: 601c ld a5,0(s0) - 805e0ac8: 00001597 auipc a1,0x1 - 805e0acc: 46c5c583 lbu a1,1132(a1) # 805e1f34 - 805e0ad0: 00001517 auipc a0,0x1 - 805e0ad4: ef850513 addi a0,a0,-264 # 805e19c8 - 805e0ad8: 9782 jalr a5 - 805e0ada: 0c800513 li a0,200 - 805e0ade: 00000097 auipc ra,0x0 - 805e0ae2: 60e080e7 jalr 1550(ra) # 805e10ec - 805e0ae6: b1c1 j 805e07a6 + 805e0a7a: ec0781e3 beqz a5,805e093c + 805e0a7e: 601c ld a5,0(s0) + 805e0a80: 00001597 auipc a1,0x1 + 805e0a84: 4c45c583 lbu a1,1220(a1) # 805e1f44 + 805e0a88: 00001517 auipc a0,0x1 + 805e0a8c: f5050513 addi a0,a0,-176 # 805e19d8 + 805e0a90: 9782 jalr a5 + 805e0a92: 0c800513 li a0,200 + 805e0a96: 00000097 auipc ra,0x0 + 805e0a9a: 666080e7 jalr 1638(ra) # 805e10fc + 805e0a9e: b311 j 805e07a2 + if ((boot_entry < BOOT_CONFIG_ITEMS) || app_sha256()) { + 805e0aa0: 00000097 auipc ra,0x0 + 805e0aa4: 4ca080e7 jalr 1226(ra) # 805e0f6a + 805e0aa8: 2501 sext.w a0,a0 + 805e0aaa: ee0510e3 bnez a0,805e098a if (key) { - 805e0ae8: 00001797 auipc a5,0x1 - 805e0aec: 47c7c783 lbu a5,1148(a5) # 805e1f64 - 805e0af0: cc0780e3 beqz a5,805e07b0 - 805e0af4: bdad j 805e096e - for (i = 0; i < BOOT_CONFIG_ITEMS; i++) { - 805e0af6: 479d li a5,7 - 805e0af8: b961 j 805e0790 - 805e0afa: 4799 li a5,6 - 805e0afc: b951 j 805e0790 - 805e0afe: 4795 li a5,5 - 805e0b00: b941 j 805e0790 - 805e0b02: 4791 li a5,4 - 805e0b04: b171 j 805e0790 + 805e0aae: 00001797 auipc a5,0x1 + 805e0ab2: 4c67c783 lbu a5,1222(a5) # 805e1f74 + 805e0ab6: ce078be3 beqz a5,805e07ac + LOG("\n* Default application check failed!\n"); + 805e0aba: 601c ld a5,0(s0) + print_enabled = 1; + 805e0abc: 4705 li a4,1 + LOG("\n* Default application check failed!\n"); + 805e0abe: 00001517 auipc a0,0x1 + 805e0ac2: f2250513 addi a0,a0,-222 # 805e19e0 + print_enabled = 1; + 805e0ac6: 00001697 auipc a3,0x1 + 805e0aca: 4ae6a923 sw a4,1202(a3) # 805e1f78 + LOG("\n* Default application check failed!\n"); + 805e0ace: 9782 jalr a5 + 805e0ad0: 0c800513 li a0,200 + 805e0ad4: 00000097 auipc ra,0x0 + 805e0ad8: 628080e7 jalr 1576(ra) # 805e10fc + LOG("* SYSTEM HALTED\n"); + 805e0adc: 409c lw a5,0(s1) + 805e0ade: cf89 beqz a5,805e0af8 + 805e0ae0: 601c ld a5,0(s0) + 805e0ae2: 00001517 auipc a0,0x1 + 805e0ae6: f2650513 addi a0,a0,-218 # 805e1a08 + 805e0aea: 9782 jalr a5 + 805e0aec: 0c800513 li a0,200 + 805e0af0: 00000097 auipc ra,0x0 + 805e0af4: 60c080e7 jalr 1548(ra) # 805e10fc + asm ("nop"); + 805e0af8: 0001 nop + 805e0afa: 0001 nop + 805e0afc: bff5 j 805e0af8 + for (boot_entry = 0; boot_entry < BOOT_CONFIG_ITEMS; boot_entry++) { + 805e0afe: 479d li a5,7 + 805e0b00: b171 j 805e078c + 805e0b02: 4799 li a5,6 + 805e0b04: b161 j 805e078c + 805e0b06: 4795 li a5,5 + 805e0b08: b151 j 805e078c + 805e0b0a: 4791 li a5,4 + 805e0b0c: b141 j 805e078c LOG("\n* No app found, loading default\n"); - 805e0b06: e2078de3 beqz a5,805e0940 - 805e0b0a: 601c ld a5,0(s0) - 805e0b0c: 00001517 auipc a0,0x1 - 805e0b10: e4450513 addi a0,a0,-444 # 805e1950 - 805e0b14: 9782 jalr a5 - 805e0b16: 0c800513 li a0,200 - 805e0b1a: 00000097 auipc ra,0x0 - 805e0b1e: 5d2080e7 jalr 1490(ra) # 805e10ec - 805e0b22: b151 j 805e07a6 + 805e0b0e: e20787e3 beqz a5,805e093c + 805e0b12: 601c ld a5,0(s0) + 805e0b14: 00001517 auipc a0,0x1 + 805e0b18: e4c50513 addi a0,a0,-436 # 805e1960 + 805e0b1c: 9782 jalr a5 + 805e0b1e: 0c800513 li a0,200 + 805e0b22: 00000097 auipc ra,0x0 + 805e0b26: 5da080e7 jalr 1498(ra) # 805e10fc + 805e0b2a: b9a5 j 805e07a2 LOG("%c? ", char_in); - 805e0b24: 601c ld a5,0(s0) - 805e0b26: 85ca mv a1,s2 - 805e0b28: 8556 mv a0,s5 - 805e0b2a: 9782 jalr a5 - 805e0b2c: 0c800513 li a0,200 - 805e0b30: 00000097 auipc ra,0x0 - 805e0b34: 5bc080e7 jalr 1468(ra) # 805e10ec - 805e0b38: bfa1 j 805e0a90 + 805e0b2c: 601c ld a5,0(s0) + 805e0b2e: 85ca mv a1,s2 + 805e0b30: 855a mv a0,s6 + 805e0b32: 9782 jalr a5 + 805e0b34: 0c800513 li a0,200 + 805e0b38: 00000097 auipc ra,0x0 + 805e0b3c: 5c4080e7 jalr 1476(ra) # 805e10fc + 805e0b40: b731 j 805e0a4c offset = (i*8) + (cfg_offset / 4); // 32bit offset in current config sector - 805e0b3a: 0009a583 lw a1,0(s3) - 805e0b3e: 0037179b slliw a5,a4,0x3 + 805e0b42: 0009a703 lw a4,0(s3) + 805e0b46: 003a979b slliw a5,s5,0x3 offset = (i*32) + cfg_offset + 0x10; // 8bit offset in current config sector - 805e0b42: 0057171b slliw a4,a4,0x5 + 805e0b4a: 005a969b slliw a3,s5,0x5 offset = (i*8) + (cfg_offset / 4); // 32bit offset in current config sector - 805e0b46: 0025d69b srliw a3,a1,0x2 - 805e0b4a: 9fb5 addw a5,a5,a3 + 805e0b4e: 0027561b srliw a2,a4,0x2 + 805e0b52: 9fb1 addw a5,a5,a2 cfg_address = cfg_flash_ptr[offset + 1]; - 805e0b4c: 0017851b addiw a0,a5,1 + 805e0b54: 0017881b addiw a6,a5,1 cfg_size = cfg_flash_ptr[offset + 2]; - 805e0b50: 0027861b addiw a2,a5,2 + 805e0b58: 0027851b addiw a0,a5,2 cfg_crc = cfg_flash_ptr[offset + 3]; - 805e0b54: 0037869b addiw a3,a5,3 + 805e0b5c: 0037861b addiw a2,a5,3 offset = (i*32) + cfg_offset + 0x10; // 8bit offset in current config sector - 805e0b58: 25c1 addiw a1,a1,16 - 805e0b5a: 9db9 addw a1,a1,a4 + 805e0b60: 2741 addiw a4,a4,16 + 805e0b62: 9f35 addw a4,a4,a3 cfg_magic = cfg_flash_ptr[offset + 0]; - 805e0b5c: 1782 slli a5,a5,0x20 + 805e0b64: 1782 slli a5,a5,0x20 cfg_address = cfg_flash_ptr[offset + 1]; - 805e0b5e: 1502 slli a0,a0,0x20 + 805e0b66: 1802 slli a6,a6,0x20 cfg_size = cfg_flash_ptr[offset + 2]; - 805e0b60: 1602 slli a2,a2,0x20 + 805e0b68: 1502 slli a0,a0,0x20 cfg_crc = cfg_flash_ptr[offset + 3]; - 805e0b62: 1682 slli a3,a3,0x20 + 805e0b6a: 1602 slli a2,a2,0x20 cfg_magic = cfg_flash_ptr[offset + 0]; - 805e0b64: 9381 srli a5,a5,0x20 + 805e0b6c: 9381 srli a5,a5,0x20 cfg_address = cfg_flash_ptr[offset + 1]; - 805e0b66: 9101 srli a0,a0,0x20 + 805e0b6e: 02085813 srli a6,a6,0x20 cfg_size = cfg_flash_ptr[offset + 2]; - 805e0b68: 9201 srli a2,a2,0x20 + 805e0b72: 9101 srli a0,a0,0x20 cfg_crc = cfg_flash_ptr[offset + 3]; - 805e0b6a: 9281 srli a3,a3,0x20 + 805e0b74: 9201 srli a2,a2,0x20 key = cfg_flash_bptr[offset]; // dummy read needed to switch to 8bit XiP read - 805e0b6c: 02059813 slli a6,a1,0x20 + 805e0b76: 02071593 slli a1,a4,0x20 cfg_magic = cfg_flash_ptr[offset + 0]; - 805e0b70: 54004737 lui a4,0x54004 + 805e0b7a: 540046b7 lui a3,0x54004 key = cfg_flash_bptr[offset]; // dummy read needed to switch to 8bit XiP read - 805e0b74: 02085813 srli a6,a6,0x20 + 805e0b7e: 9181 srli a1,a1,0x20 cfg_magic = cfg_flash_ptr[offset + 0]; - 805e0b78: 078a slli a5,a5,0x2 + 805e0b80: 078a slli a5,a5,0x2 cfg_address = cfg_flash_ptr[offset + 1]; - 805e0b7a: 050a slli a0,a0,0x2 + 805e0b82: 080a slli a6,a6,0x2 cfg_size = cfg_flash_ptr[offset + 2]; - 805e0b7c: 060a slli a2,a2,0x2 + 805e0b84: 050a slli a0,a0,0x2 cfg_crc = cfg_flash_ptr[offset + 3]; - 805e0b7e: 068a slli a3,a3,0x2 + 805e0b86: 060a slli a2,a2,0x2 cfg_magic = cfg_flash_ptr[offset + 0]; - 805e0b80: 97ba add a5,a5,a4 + 805e0b88: 97b6 add a5,a5,a3 cfg_address = cfg_flash_ptr[offset + 1]; - 805e0b82: 953a add a0,a0,a4 + 805e0b8a: 9836 add a6,a6,a3 cfg_size = cfg_flash_ptr[offset + 2]; - 805e0b84: 963a add a2,a2,a4 + 805e0b8c: 9536 add a0,a0,a3 cfg_crc = cfg_flash_ptr[offset + 3]; - 805e0b86: 96ba add a3,a3,a4 + 805e0b8e: 9636 add a2,a2,a3 key = cfg_flash_bptr[offset]; // dummy read needed to switch to 8bit XiP read - 805e0b88: 9742 add a4,a4,a6 - cfg_size = cfg_flash_ptr[offset + 2]; - 805e0b8a: 4210 lw a2,0(a2) + 805e0b90: 96ae add a3,a3,a1 cfg_magic = cfg_flash_ptr[offset + 0]; - 805e0b8c: 0007a803 lw a6,0(a5) - cfg_crc = cfg_flash_ptr[offset + 3]; - 805e0b90: 4294 lw a3,0(a3) + 805e0b92: 0007a883 lw a7,0(a5) + cfg_size = cfg_flash_ptr[offset + 2]; + 805e0b96: 410c lw a1,0(a0) key = cfg_flash_bptr[offset]; // dummy read needed to switch to 8bit XiP read - 805e0b92: 00074783 lbu a5,0(a4) # 54004000 <_start-0x2c5dc000> + 805e0b98: 0006c783 lbu a5,0(a3) # 54004000 <_start-0x2c5dc000> + cfg_crc = cfg_flash_ptr[offset + 3]; + 805e0b9c: 4210 lw a2,0(a2) cfg_address = cfg_flash_ptr[offset + 1]; - 805e0b96: 00052983 lw s3,0(a0) + 805e0b9e: 00082983 lw s3,0(a6) # 54000000 <_start-0x2c5e0000> cfg_size = cfg_flash_ptr[offset + 2]; - 805e0b9a: 00001717 auipc a4,0x1 - 805e0b9e: 38c72b23 sw a2,918(a4) # 805e1f30 + 805e0ba2: 00001697 auipc a3,0x1 + 805e0ba6: 38b6af23 sw a1,926(a3) # 805e1f40 cfg_crc = cfg_flash_ptr[offset + 3]; - 805e0ba2: 00001717 auipc a4,0x1 - 805e0ba6: 36d72923 sw a3,882(a4) # 805e1f14 + 805e0baa: 00001697 auipc a3,0x1 + 805e0bae: 36c6ad23 sw a2,890(a3) # 805e1f24 key = cfg_flash_bptr[offset]; // dummy read needed to switch to 8bit XiP read - 805e0baa: 00001717 auipc a4,0x1 - 805e0bae: 3af70d23 sb a5,954(a4) # 805e1f64 + 805e0bb2: 00001697 auipc a3,0x1 + 805e0bb6: 3cf68123 sb a5,962(a3) # 805e1f74 cfg_magic = cfg_flash_ptr[offset + 0]; - 805e0bb2: 00001717 auipc a4,0x1 - 805e0bb6: 37072b23 sw a6,886(a4) # 805e1f28 + 805e0bba: 00001697 auipc a3,0x1 + 805e0bbe: 3716af23 sw a7,894(a3) # 805e1f38 cfg_address = cfg_flash_ptr[offset + 1]; - 805e0bba: 00001717 auipc a4,0x1 - 805e0bbe: 35372b23 sw s3,854(a4) # 805e1f10 + 805e0bc2: 00001697 auipc a3,0x1 + 805e0bc6: 3536af23 sw s3,862(a3) # 805e1f20 key = cfg_flash_bptr[offset]; // dummy read needed to switch to 8bit XiP read - 805e0bc2: 4781 li a5,0 + 805e0bca: 4781 li a5,0 cfg_info[n] = cfg_flash_bptr[offset + n]; - 805e0bc4: 54004637 lui a2,0x54004 + 805e0bcc: 540045b7 lui a1,0x54004 for (int n=0; n<16; n++) { - 805e0bc8: 46c1 li a3,16 + 805e0bd0: 4641 li a2,16 cfg_info[n] = cfg_flash_bptr[offset + n]; - 805e0bca: 00b7873b addw a4,a5,a1 - 805e0bce: 1702 slli a4,a4,0x20 - 805e0bd0: 9301 srli a4,a4,0x20 - 805e0bd2: 9732 add a4,a4,a2 - 805e0bd4: 00074503 lbu a0,0(a4) - 805e0bd8: 00001717 auipc a4,0x1 - 805e0bdc: 34070713 addi a4,a4,832 # 805e1f18 - 805e0be0: 973e add a4,a4,a5 - 805e0be2: 00a70023 sb a0,0(a4) - 805e0be6: 0785 addi a5,a5,1 + 805e0bd2: 00e786bb addw a3,a5,a4 + 805e0bd6: 1682 slli a3,a3,0x20 + 805e0bd8: 9281 srli a3,a3,0x20 + 805e0bda: 96ae add a3,a3,a1 + 805e0bdc: 0006c503 lbu a0,0(a3) + 805e0be0: 00001697 auipc a3,0x1 + 805e0be4: 34868693 addi a3,a3,840 # 805e1f28 + 805e0be8: 96be add a3,a3,a5 + 805e0bea: 00a68023 sb a0,0(a3) + 805e0bee: 0785 addi a5,a5,1 for (int n=0; n<16; n++) { - 805e0be8: fed791e3 bne a5,a3,805e0bca + 805e0bf0: fec791e3 bne a5,a2,805e0bd2 app_size = flash2uint32(cfg_address+1); - 805e0bec: 0019851b addiw a0,s3,1 + 805e0bf4: 0019851b addiw a0,s3,1 cfg_info[15] = 0; - 805e0bf0: 00001797 auipc a5,0x1 - 805e0bf4: 32078ba3 sb zero,823(a5) # 805e1f27 + 805e0bf8: 00001797 auipc a5,0x1 + 805e0bfc: 32078fa3 sb zero,831(a5) # 805e1f37 app_size = flash2uint32(cfg_address+1); - 805e0bf8: 00000097 auipc ra,0x0 - 805e0bfc: 316080e7 jalr 790(ra) # 805e0f0e + 805e0c00: 00000097 auipc ra,0x0 + 805e0c04: 31e080e7 jalr 798(ra) # 805e0f1e LOG("%c\n\n", (char)char_in); - 805e0c00: 409c lw a5,0(s1) + 805e0c08: 409c lw a5,0(s1) app_size = flash2uint32(cfg_address+1); - 805e0c02: 00001717 auipc a4,0x1 - 805e0c06: eea72b23 sw a0,-266(a4) # 805e1af8 - app_flash_start = cfg_address; 805e0c0a: 00001717 auipc a4,0x1 - 805e0c0e: ed372323 sw s3,-314(a4) # 805e1ad0 - char_in += 0x30; + 805e0c0e: eea72f23 sw a0,-258(a4) # 805e1b08 + app_flash_start = cfg_address; 805e0c12: 00001717 auipc a4,0x1 - 805e0c16: 33272123 sw s2,802(a4) # 805e1f34 + 805e0c16: ed372723 sw s3,-306(a4) # 805e1ae0 + boot_entry = char_in; + 805e0c1a: 00001717 auipc a4,0x1 + 805e0c1e: ef572f23 sw s5,-258(a4) # 805e1b18 + char_in += 0x30; + 805e0c22: 00001717 auipc a4,0x1 + 805e0c26: 33272123 sw s2,802(a4) # 805e1f44 LOG("%c\n\n", (char)char_in); - 805e0c1a: ea0796e3 bnez a5,805e0ac6 + 805e0c2a: e4079ae3 bnez a5,805e0a7e if (app_flash_start == DEFAULT_APP_ADDR) { - 805e0c1e: 67c1 lui a5,0x10 - 805e0c20: d2f980e3 beq s3,a5,805e0940 - 805e0c24: 00001917 auipc s2,0x1 - 805e0c28: ed490913 addi s2,s2,-300 # 805e1af8 - 805e0c2c: be45 j 805e07dc + 805e0c2e: 67c1 lui a5,0x10 + 805e0c30: d0f986e3 beq s3,a5,805e093c + 805e0c34: 00001917 auipc s2,0x1 + 805e0c38: ed490913 addi s2,s2,-300 # 805e1b08 + 805e0c3c: be71 j 805e07d8 LOG(" d=default ] ? "); - 805e0c2e: 601c ld a5,0(s0) - 805e0c30: 00001517 auipc a0,0x1 - 805e0c34: d8050513 addi a0,a0,-640 # 805e19b0 - 805e0c38: 9782 jalr a5 - 805e0c3a: 0c800513 li a0,200 - 805e0c3e: 00000097 auipc ra,0x0 - 805e0c42: 4ae080e7 jalr 1198(ra) # 805e10ec - 805e0c46: bd11 j 805e0a5a + 805e0c3e: 601c ld a5,0(s0) + 805e0c40: 00001517 auipc a0,0x1 + 805e0c44: d8050513 addi a0,a0,-640 # 805e19c0 + 805e0c48: 9782 jalr a5 + 805e0c4a: 0c800513 li a0,200 + 805e0c4e: 00000097 auipc ra,0x0 + 805e0c52: 4ae080e7 jalr 1198(ra) # 805e10fc + 805e0c56: bb7d j 805e0a14 uint32_t crc = 0xFFFFFFFF; - 805e0c48: 57fd li a5,-1 - 805e0c4a: b609 j 805e074c + 805e0c58: 57fd li a5,-1 + 805e0c5a: b4fd j 805e0748 LOG("\nSelect the application number to load ["); - 805e0c4c: 601c ld a5,0(s0) - 805e0c4e: 00001517 auipc a0,0x1 - 805e0c52: d2a50513 addi a0,a0,-726 # 805e1978 - 805e0c56: 9782 jalr a5 - 805e0c58: 0c800513 li a0,200 - 805e0c5c: 00000097 auipc ra,0x0 - 805e0c60: 490080e7 jalr 1168(ra) # 805e10ec - 805e0c64: b355 j 805e0a08 - -00000000805e0c66 : - 805e0c66: 00001517 auipc a0,0x1 - 805e0c6a: 31a50513 addi a0,a0,794 # 805e1f80 <__TMC_END__> - 805e0c6e: 00001797 auipc a5,0x1 - 805e0c72: 31278793 addi a5,a5,786 # 805e1f80 <__TMC_END__> - 805e0c76: 00a78963 beq a5,a0,805e0c88 - 805e0c7a: 00000337 lui t1,0x0 - 805e0c7e: 00030313 mv t1,t1 - 805e0c82: 00030363 beqz t1,805e0c88 - 805e0c86: 8302 jr t1 - 805e0c88: 8082 ret - -00000000805e0c8a <__do_global_dtors_aux>: - 805e0c8a: 00001797 auipc a5,0x1 - 805e0c8e: 3267c783 lbu a5,806(a5) # 805e1fb0 - 805e0c92: ef85 bnez a5,805e0cca <__do_global_dtors_aux+0x40> - 805e0c94: 1141 addi sp,sp,-16 - 805e0c96: e406 sd ra,8(sp) - 805e0c98: 00000097 auipc ra,0x0 - 805e0c9c: fce080e7 jalr -50(ra) # 805e0c66 - 805e0ca0: 000007b7 lui a5,0x0 - 805e0ca4: 00078793 mv a5,a5 - 805e0ca8: cb89 beqz a5,805e0cba <__do_global_dtors_aux+0x30> - 805e0caa: 00001517 auipc a0,0x1 - 805e0cae: e1650513 addi a0,a0,-490 # 805e1ac0 <__FRAME_END__> - 805e0cb2: 00000097 auipc ra,0x0 - 805e0cb6: 000000e7 jalr zero # 0 <_start-0x805e0000> - 805e0cba: 60a2 ld ra,8(sp) - 805e0cbc: 4785 li a5,1 - 805e0cbe: 00001717 auipc a4,0x1 - 805e0cc2: 2ef70923 sb a5,754(a4) # 805e1fb0 - 805e0cc6: 0141 addi sp,sp,16 - 805e0cc8: 8082 ret - 805e0cca: 8082 ret - -00000000805e0ccc : + 805e0c5c: 601c ld a5,0(s0) + 805e0c5e: 00001517 auipc a0,0x1 + 805e0c62: d2a50513 addi a0,a0,-726 # 805e1988 + 805e0c66: 9782 jalr a5 + 805e0c68: 0c800513 li a0,200 + 805e0c6c: 00000097 auipc ra,0x0 + 805e0c70: 490080e7 jalr 1168(ra) # 805e10fc + 805e0c74: b3b9 j 805e09c2 + +00000000805e0c76 : + 805e0c76: 00001517 auipc a0,0x1 + 805e0c7a: 34a50513 addi a0,a0,842 # 805e1fc0 <__TMC_END__> + 805e0c7e: 00001797 auipc a5,0x1 + 805e0c82: 34278793 addi a5,a5,834 # 805e1fc0 <__TMC_END__> + 805e0c86: 00a78963 beq a5,a0,805e0c98 + 805e0c8a: 00000337 lui t1,0x0 + 805e0c8e: 00030313 mv t1,t1 + 805e0c92: 00030363 beqz t1,805e0c98 + 805e0c96: 8302 jr t1 + 805e0c98: 8082 ret + +00000000805e0c9a <__do_global_dtors_aux>: + 805e0c9a: 00001797 auipc a5,0x1 + 805e0c9e: 3567c783 lbu a5,854(a5) # 805e1ff0 + 805e0ca2: ef85 bnez a5,805e0cda <__do_global_dtors_aux+0x40> + 805e0ca4: 1141 addi sp,sp,-16 + 805e0ca6: e406 sd ra,8(sp) + 805e0ca8: 00000097 auipc ra,0x0 + 805e0cac: fce080e7 jalr -50(ra) # 805e0c76 + 805e0cb0: 000007b7 lui a5,0x0 + 805e0cb4: 00078793 mv a5,a5 + 805e0cb8: cb89 beqz a5,805e0cca <__do_global_dtors_aux+0x30> + 805e0cba: 00001517 auipc a0,0x1 + 805e0cbe: e1650513 addi a0,a0,-490 # 805e1ad0 <__FRAME_END__> + 805e0cc2: 00000097 auipc ra,0x0 + 805e0cc6: 000000e7 jalr zero # 0 <_start-0x805e0000> + 805e0cca: 60a2 ld ra,8(sp) + 805e0ccc: 4785 li a5,1 + 805e0cce: 00001717 auipc a4,0x1 + 805e0cd2: 32f70123 sb a5,802(a4) # 805e1ff0 + 805e0cd6: 0141 addi sp,sp,16 + 805e0cd8: 8082 ret + 805e0cda: 8082 ret + +00000000805e0cdc : } int fpioa_set_io_pull(int number, fpioa_pull_t pull) { /* Check parameters */ if(number < 0 || number >= FPIOA_NUM_IO || pull >= FPIOA_PULL_MAX) - 805e0ccc: 02f00793 li a5,47 - 805e0cd0: 04a7ec63 bltu a5,a0,805e0d28 - 805e0cd4: 4789 li a5,2 - 805e0cd6: 04b7e963 bltu a5,a1,805e0d28 + 805e0cdc: 02f00793 li a5,47 + 805e0ce0: 04a7ec63 bltu a5,a0,805e0d38 + 805e0ce4: 4789 li a5,2 + 805e0ce6: 04b7e963 bltu a5,a1,805e0d38 return -1; /* Atomic read register */ fpioa_io_config_t cfg = fpioa->io[number]; - 805e0cda: 1582 slli a1,a1,0x20 - 805e0cdc: 9181 srli a1,a1,0x20 + 805e0cea: 1582 slli a1,a1,0x20 + 805e0cec: 9181 srli a1,a1,0x20 break; default: break; } /* Atomic write register */ fpioa->io[number] = cfg; - 805e0cde: 00000717 auipc a4,0x0 - 805e0ce2: 6fa70713 addi a4,a4,1786 # 805e13d8 - 805e0ce6: 972e add a4,a4,a1 + 805e0cee: 00000717 auipc a4,0x0 + 805e0cf2: 6fa70713 addi a4,a4,1786 # 805e13e8 + 805e0cf6: 972e add a4,a4,a1 fpioa_io_config_t cfg = fpioa->io[number]; - 805e0ce8: 502b07b7 lui a5,0x502b0 - 805e0cec: 050a slli a0,a0,0x2 - 805e0cee: 953e add a0,a0,a5 + 805e0cf8: 502b07b7 lui a5,0x502b0 + 805e0cfc: 050a slli a0,a0,0x2 + 805e0cfe: 953e add a0,a0,a5 fpioa->io[number] = cfg; - 805e0cf0: 00074783 lbu a5,0(a4) - 805e0cf4: 00000697 auipc a3,0x0 - 805e0cf8: 6ec68693 addi a3,a3,1772 # 805e13e0 - 805e0cfc: 95b6 add a1,a1,a3 + 805e0d00: 00074783 lbu a5,0(a4) + 805e0d04: 00000697 auipc a3,0x0 + 805e0d08: 6ec68693 addi a3,a3,1772 # 805e13f0 + 805e0d0c: 95b6 add a1,a1,a3 fpioa_io_config_t cfg = fpioa->io[number]; - 805e0cfe: 4118 lw a4,0(a0) + 805e0d0e: 4118 lw a4,0(a0) switch(pull) - 805e0d00: 0005c683 lbu a3,0(a1) + 805e0d10: 0005c683 lbu a3,0(a1) # 54004000 <_start-0x2c5dc000> fpioa->io[number] = cfg; - 805e0d04: 8b85 andi a5,a5,1 - 805e0d06: 0107961b slliw a2,a5,0x10 - 805e0d0a: 77c1 lui a5,0xffff0 - 805e0d0c: 17fd addi a5,a5,-1 - 805e0d0e: 8ff9 and a5,a5,a4 - 805e0d10: 0016f713 andi a4,a3,1 - 805e0d14: 7681 lui a3,0xfffe0 - 805e0d16: 8fd1 or a5,a5,a2 - 805e0d18: 16fd addi a3,a3,-1 - 805e0d1a: 0117171b slliw a4,a4,0x11 - 805e0d1e: 8ff5 and a5,a5,a3 - 805e0d20: 8fd9 or a5,a5,a4 - 805e0d22: c11c sw a5,0(a0) + 805e0d14: 8b85 andi a5,a5,1 + 805e0d16: 0107961b slliw a2,a5,0x10 + 805e0d1a: 77c1 lui a5,0xffff0 + 805e0d1c: 17fd addi a5,a5,-1 + 805e0d1e: 8ff9 and a5,a5,a4 + 805e0d20: 0016f713 andi a4,a3,1 + 805e0d24: 7681 lui a3,0xfffe0 + 805e0d26: 8fd1 or a5,a5,a2 + 805e0d28: 16fd addi a3,a3,-1 + 805e0d2a: 0117171b slliw a4,a4,0x11 + 805e0d2e: 8ff5 and a5,a5,a3 + 805e0d30: 8fd9 or a5,a5,a4 + 805e0d32: c11c sw a5,0(a0) return 0; - 805e0d24: 4501 li a0,0 - 805e0d26: 8082 ret + 805e0d34: 4501 li a0,0 + 805e0d36: 8082 ret return -1; - 805e0d28: 557d li a0,-1 + 805e0d38: 557d li a0,-1 } - 805e0d2a: 8082 ret + 805e0d3a: 8082 ret -00000000805e0d2c : +00000000805e0d3c : } int fpioa_set_function_raw(int number, fpioa_function_t function) { /* Check parameters */ if(number < 0 || number >= FPIOA_NUM_IO || function < 0 || function >= FUNC_MAX) - 805e0d2c: 02f00793 li a5,47 - 805e0d30: 02a7e963 bltu a5,a0,805e0d62 - 805e0d34: 0ff00793 li a5,255 - 805e0d38: 02b7e563 bltu a5,a1,805e0d62 + 805e0d3c: 02f00793 li a5,47 + 805e0d40: 02a7e963 bltu a5,a0,805e0d72 + 805e0d44: 0ff00793 li a5,255 + 805e0d48: 02b7e563 bltu a5,a1,805e0d72 return -1; /* Atomic write register */ fpioa->io[number] = (const fpioa_io_config_t){ .ch_sel = function_config[function].ch_sel, - 805e0d3c: 1582 slli a1,a1,0x20 - 805e0d3e: 00000797 auipc a5,0x0 - 805e0d42: 6aa78793 addi a5,a5,1706 # 805e13e8 - 805e0d46: 81f9 srli a1,a1,0x1e - 805e0d48: 95be add a1,a1,a5 - 805e0d4a: 419c lw a5,0(a1) + 805e0d4c: 1582 slli a1,a1,0x20 + 805e0d4e: 00000797 auipc a5,0x0 + 805e0d52: 6aa78793 addi a5,a5,1706 # 805e13f8 + 805e0d56: 81f9 srli a1,a1,0x1e + 805e0d58: 95be add a1,a1,a5 + 805e0d5a: 419c lw a5,0(a1) fpioa->io[number] = (const fpioa_io_config_t){ - 805e0d4c: 00fc0737 lui a4,0xfc0 - 805e0d50: 177d addi a4,a4,-1 - 805e0d52: 8f7d and a4,a4,a5 - 805e0d54: 050a slli a0,a0,0x2 - 805e0d56: 502b07b7 lui a5,0x502b0 - 805e0d5a: 953e add a0,a0,a5 - 805e0d5c: c118 sw a4,0(a0) + 805e0d5c: 00fc0737 lui a4,0xfc0 + 805e0d60: 177d addi a4,a4,-1 + 805e0d62: 8f7d and a4,a4,a5 + 805e0d64: 050a slli a0,a0,0x2 + 805e0d66: 502b07b7 lui a5,0x502b0 + 805e0d6a: 953e add a0,a0,a5 + 805e0d6c: c118 sw a4,0(a0) .ie_inv = function_config[function].ie_inv, .di_inv = function_config[function].di_inv, .st = function_config[function].st, /* resv and pad_di do not need initialization */ }; return 0; - 805e0d5e: 4501 li a0,0 - 805e0d60: 8082 ret + 805e0d6e: 4501 li a0,0 + 805e0d70: 8082 ret return -1; - 805e0d62: 557d li a0,-1 + 805e0d72: 557d li a0,-1 } - 805e0d64: 8082 ret + 805e0d74: 8082 ret -00000000805e0d66 : +00000000805e0d76 : int fpioa_set_function(int number, fpioa_function_t function) { uint8_t index = 0; /* Check parameters */ if(number < 0 || number >= FPIOA_NUM_IO || function < 0 || function >= FUNC_MAX) - 805e0d66: 02f00793 li a5,47 - 805e0d6a: 08a7e063 bltu a5,a0,805e0dea + 805e0d76: 02f00793 li a5,47 + 805e0d7a: 08a7e063 bltu a5,a0,805e0dfa { - 805e0d6e: 7179 addi sp,sp,-48 - 805e0d70: ec26 sd s1,24(sp) - 805e0d72: f406 sd ra,40(sp) - 805e0d74: f022 sd s0,32(sp) - 805e0d76: e84a sd s2,16(sp) - 805e0d78: e44e sd s3,8(sp) - 805e0d7a: e052 sd s4,0(sp) + 805e0d7e: 7179 addi sp,sp,-48 + 805e0d80: ec26 sd s1,24(sp) + 805e0d82: f406 sd ra,40(sp) + 805e0d84: f022 sd s0,32(sp) + 805e0d86: e84a sd s2,16(sp) + 805e0d88: e44e sd s3,8(sp) + 805e0d8a: e052 sd s4,0(sp) if(number < 0 || number >= FPIOA_NUM_IO || function < 0 || function >= FUNC_MAX) - 805e0d7c: 0ff00793 li a5,255 - 805e0d80: 84ae mv s1,a1 - 805e0d82: 06b7e663 bltu a5,a1,805e0dee + 805e0d8c: 0ff00793 li a5,255 + 805e0d90: 84ae mv s1,a1 + 805e0d92: 06b7e663 bltu a5,a1,805e0dfe return -1; if(function == FUNC_RESV0) - 805e0d86: 07800793 li a5,120 - 805e0d8a: 8a2a mv s4,a0 - 805e0d8c: 4401 li s0,0 + 805e0d96: 07800793 li a5,120 + 805e0d9a: 8a2a mv s4,a0 + 805e0d9c: 4401 li s0,0 return 0; } /* Compare all IO */ for(index = 0; index < FPIOA_NUM_IO; index++) { if((fpioa->io[index].ch_sel == function) && (index != number)) - 805e0d8e: 502b09b7 lui s3,0x502b0 + 805e0d9e: 502b09b7 lui s3,0x502b0 for(index = 0; index < FPIOA_NUM_IO; index++) - 805e0d92: 03000913 li s2,48 + 805e0da2: 03000913 li s2,48 if(function == FUNC_RESV0) - 805e0d96: 02f58163 beq a1,a5,805e0db8 + 805e0da6: 02f58163 beq a1,a5,805e0dc8 if((fpioa->io[index].ch_sel == function) && (index != number)) - 805e0d9a: 0004071b sext.w a4,s0 - 805e0d9e: 00271793 slli a5,a4,0x2 - 805e0da2: 97ce add a5,a5,s3 - 805e0da4: 439c lw a5,0(a5) - 805e0da6: 2405 addiw s0,s0,1 - 805e0da8: 0ff7f793 andi a5,a5,255 - 805e0dac: 02978363 beq a5,s1,805e0dd2 + 805e0daa: 0004071b sext.w a4,s0 + 805e0dae: 00271793 slli a5,a4,0x2 + 805e0db2: 97ce add a5,a5,s3 + 805e0db4: 439c lw a5,0(a5) + 805e0db6: 2405 addiw s0,s0,1 + 805e0db8: 0ff7f793 andi a5,a5,255 + 805e0dbc: 02978363 beq a5,s1,805e0de2 for(index = 0; index < FPIOA_NUM_IO; index++) - 805e0db0: ff2415e3 bne s0,s2,805e0d9a + 805e0dc0: ff2415e3 bne s0,s2,805e0daa fpioa_set_function_raw(index, FUNC_RESV0); } fpioa_set_function_raw(number, function); - 805e0db4: 85a6 mv a1,s1 - 805e0db6: 8552 mv a0,s4 - 805e0db8: 00000097 auipc ra,0x0 - 805e0dbc: f74080e7 jalr -140(ra) # 805e0d2c + 805e0dc4: 85a6 mv a1,s1 + 805e0dc6: 8552 mv a0,s4 + 805e0dc8: 00000097 auipc ra,0x0 + 805e0dcc: f74080e7 jalr -140(ra) # 805e0d3c return 0; - 805e0dc0: 4501 li a0,0 + 805e0dd0: 4501 li a0,0 } - 805e0dc2: 70a2 ld ra,40(sp) - 805e0dc4: 7402 ld s0,32(sp) - 805e0dc6: 64e2 ld s1,24(sp) - 805e0dc8: 6942 ld s2,16(sp) - 805e0dca: 69a2 ld s3,8(sp) - 805e0dcc: 6a02 ld s4,0(sp) - 805e0dce: 6145 addi sp,sp,48 - 805e0dd0: 8082 ret + 805e0dd2: 70a2 ld ra,40(sp) + 805e0dd4: 7402 ld s0,32(sp) + 805e0dd6: 64e2 ld s1,24(sp) + 805e0dd8: 6942 ld s2,16(sp) + 805e0dda: 69a2 ld s3,8(sp) + 805e0ddc: 6a02 ld s4,0(sp) + 805e0dde: 6145 addi sp,sp,48 + 805e0de0: 8082 ret fpioa_set_function_raw(index, FUNC_RESV0); - 805e0dd2: 07800593 li a1,120 - 805e0dd6: 853a mv a0,a4 + 805e0de2: 07800593 li a1,120 + 805e0de6: 853a mv a0,a4 if((fpioa->io[index].ch_sel == function) && (index != number)) - 805e0dd8: fd470ce3 beq a4,s4,805e0db0 + 805e0de8: fd470ce3 beq a4,s4,805e0dc0 fpioa_set_function_raw(index, FUNC_RESV0); - 805e0ddc: 00000097 auipc ra,0x0 - 805e0de0: f50080e7 jalr -176(ra) # 805e0d2c + 805e0dec: 00000097 auipc ra,0x0 + 805e0df0: f50080e7 jalr -176(ra) # 805e0d3c for(index = 0; index < FPIOA_NUM_IO; index++) - 805e0de4: fb241be3 bne s0,s2,805e0d9a - 805e0de8: b7f1 j 805e0db4 + 805e0df4: fb241be3 bne s0,s2,805e0daa + 805e0df8: b7f1 j 805e0dc4 return -1; - 805e0dea: 557d li a0,-1 + 805e0dfa: 557d li a0,-1 } - 805e0dec: 8082 ret + 805e0dfc: 8082 ret return -1; - 805e0dee: 557d li a0,-1 - 805e0df0: bfc9 j 805e0dc2 + 805e0dfe: 557d li a0,-1 + 805e0e00: bfc9 j 805e0dd2 -00000000805e0df2 : +00000000805e0e02 : } int fpioa_get_io_by_function(fpioa_function_t function) { int index = 0; for(index = 0; index < FPIOA_NUM_IO; index++) - 805e0df2: 4781 li a5,0 + 805e0e02: 4781 li a5,0 { if(fpioa->io[index].ch_sel == function) - 805e0df4: 502b06b7 lui a3,0x502b0 + 805e0e04: 502b06b7 lui a3,0x502b0 for(index = 0; index < FPIOA_NUM_IO; index++) - 805e0df8: 03000613 li a2,48 - 805e0dfc: a021 j 805e0e04 - 805e0dfe: 2785 addiw a5,a5,1 - 805e0e00: 00c78c63 beq a5,a2,805e0e18 + 805e0e08: 03000613 li a2,48 + 805e0e0c: a021 j 805e0e14 + 805e0e0e: 2785 addiw a5,a5,1 + 805e0e10: 00c78c63 beq a5,a2,805e0e28 if(fpioa->io[index].ch_sel == function) - 805e0e04: 00279713 slli a4,a5,0x2 - 805e0e08: 9736 add a4,a4,a3 - 805e0e0a: 4318 lw a4,0(a4) - 805e0e0c: 0ff77713 andi a4,a4,255 - 805e0e10: fea717e3 bne a4,a0,805e0dfe + 805e0e14: 00279713 slli a4,a5,0x2 + 805e0e18: 9736 add a4,a4,a3 + 805e0e1a: 4318 lw a4,0(a4) + 805e0e1c: 0ff77713 andi a4,a4,255 + 805e0e20: fea717e3 bne a4,a0,805e0e0e return index; } return -1; } - 805e0e14: 853e mv a0,a5 - 805e0e16: 8082 ret + 805e0e24: 853e mv a0,a5 + 805e0e26: 8082 ret return -1; - 805e0e18: 57fd li a5,-1 + 805e0e28: 57fd li a5,-1 } - 805e0e1a: 853e mv a0,a5 - 805e0e1c: 8082 ret + 805e0e2a: 853e mv a0,a5 + 805e0e2c: 8082 ret -00000000805e0e1e : +00000000805e0e2e : static gpiohs_pin_instance_t pin_instance[32]; */ void set_bit(volatile uint32_t *bits, uint32_t mask, uint32_t value) { uint32_t org = (*bits) & ~mask; - 805e0e1e: 411c lw a5,0(a0) - 805e0e20: 2781 sext.w a5,a5 + 805e0e2e: 411c lw a5,0(a0) + 805e0e30: 2781 sext.w a5,a5 *bits = org | (value & mask); - 805e0e22: 8e3d xor a2,a2,a5 - 805e0e24: 8df1 and a1,a1,a2 - 805e0e26: 8fad xor a5,a5,a1 - 805e0e28: c11c sw a5,0(a0) + 805e0e32: 8e3d xor a2,a2,a5 + 805e0e34: 8df1 and a1,a1,a2 + 805e0e36: 8fad xor a5,a5,a1 + 805e0e38: c11c sw a5,0(a0) } - 805e0e2a: 8082 ret + 805e0e3a: 8082 ret -00000000805e0e2c : +00000000805e0e3c : void set_bit_offset(volatile uint32_t *bits, uint32_t mask, size_t offset, uint32_t value) { set_bit(bits, mask << offset, value << offset); - 805e0e2c: 0006079b sext.w a5,a2 - 805e0e30: 00f6963b sllw a2,a3,a5 - 805e0e34: 00f595bb sllw a1,a1,a5 - 805e0e38: 00000317 auipc t1,0x0 - 805e0e3c: fe630067 jr -26(t1) # 805e0e1e + 805e0e3c: 0006079b sext.w a5,a2 + 805e0e40: 00f6963b sllw a2,a3,a5 + 805e0e44: 00f595bb sllw a1,a1,a5 + 805e0e48: 00000317 auipc t1,0x0 + 805e0e4c: fe630067 jr -26(t1) # 805e0e2e -00000000805e0e40 : +00000000805e0e50 : } void set_gpio_bit(volatile uint32_t *bits, size_t offset, uint32_t value) { set_bit_offset(bits, 1, offset, value); - 805e0e40: 86b2 mv a3,a2 - 805e0e42: 862e mv a2,a1 - 805e0e44: 4585 li a1,1 - 805e0e46: 00000317 auipc t1,0x0 - 805e0e4a: fe630067 jr -26(t1) # 805e0e2c + 805e0e50: 86b2 mv a3,a2 + 805e0e52: 862e mv a2,a1 + 805e0e54: 4585 li a1,1 + 805e0e56: 00000317 auipc t1,0x0 + 805e0e5a: fe630067 jr -26(t1) # 805e0e3c -00000000805e0e4e : +00000000805e0e5e : } uint32_t get_bit(volatile uint32_t *bits, uint32_t mask, size_t offset) { return ((*bits) & (mask << offset)) >> offset; - 805e0e4e: 411c lw a5,0(a0) - 805e0e50: 2601 sext.w a2,a2 - 805e0e52: 00c595bb sllw a1,a1,a2 - 805e0e56: 2781 sext.w a5,a5 - 805e0e58: 8fed and a5,a5,a1 + 805e0e5e: 411c lw a5,0(a0) + 805e0e60: 2601 sext.w a2,a2 + 805e0e62: 00c595bb sllw a1,a1,a2 + 805e0e66: 2781 sext.w a5,a5 + 805e0e68: 8fed and a5,a5,a1 } - 805e0e5a: 00c7d53b srlw a0,a5,a2 - 805e0e5e: 8082 ret + 805e0e6a: 00c7d53b srlw a0,a5,a2 + 805e0e6e: 8082 ret -00000000805e0e60 : +00000000805e0e70 : uint32_t get_gpio_bit(volatile uint32_t *bits, size_t offset) { return get_bit(bits, 1, offset); - 805e0e60: 862e mv a2,a1 - 805e0e62: 4585 li a1,1 - 805e0e64: 00000317 auipc t1,0x0 - 805e0e68: fea30067 jr -22(t1) # 805e0e4e + 805e0e70: 862e mv a2,a1 + 805e0e72: 4585 li a1,1 + 805e0e74: 00000317 auipc t1,0x0 + 805e0e78: fea30067 jr -22(t1) # 805e0e5e -00000000805e0e6c : +00000000805e0e7c : void gpiohs_set_drive_mode(uint8_t pin, gpio_drive_mode_t mode) { - 805e0e6c: 1101 addi sp,sp,-32 - 805e0e6e: e426 sd s1,8(sp) - 805e0e70: 84aa mv s1,a0 + 805e0e7c: 1101 addi sp,sp,-32 + 805e0e7e: e426 sd s1,8(sp) + 805e0e80: 84aa mv s1,a0 int io_number = fpioa_get_io_by_function(FUNC_GPIOHS0 + pin); - 805e0e72: 0561 addi a0,a0,24 + 805e0e82: 0561 addi a0,a0,24 { - 805e0e74: e822 sd s0,16(sp) - 805e0e76: ec06 sd ra,24(sp) - 805e0e78: 842e mv s0,a1 + 805e0e84: e822 sd s0,16(sp) + 805e0e86: ec06 sd ra,24(sp) + 805e0e88: 842e mv s0,a1 int io_number = fpioa_get_io_by_function(FUNC_GPIOHS0 + pin); - 805e0e7a: 00000097 auipc ra,0x0 - 805e0e7e: f78080e7 jalr -136(ra) # 805e0df2 + 805e0e8a: 00000097 auipc ra,0x0 + 805e0e8e: f78080e7 jalr -136(ra) # 805e0e02 fpioa_pull_t pull = FPIOA_PULL_NONE; uint32_t dir = 0; switch(mode) - 805e0e82: fff4059b addiw a1,s0,-1 - 805e0e86: 0005871b sext.w a4,a1 - 805e0e8a: 4789 li a5,2 - 805e0e8c: 02e7fd63 bleu a4,a5,805e0ec6 + 805e0e92: fff4059b addiw a1,s0,-1 + 805e0e96: 0005871b sext.w a4,a1 + 805e0e9a: 4789 li a5,2 + 805e0e9c: 02e7fd63 bleu a4,a5,805e0ed6 break; default: break; } fpioa_set_io_pull(io_number, pull); - 805e0e90: 4581 li a1,0 - 805e0e92: 00000097 auipc ra,0x0 - 805e0e96: e3a080e7 jalr -454(ra) # 805e0ccc + 805e0ea0: 4581 li a1,0 + 805e0ea2: 00000097 auipc ra,0x0 + 805e0ea6: e3a080e7 jalr -454(ra) # 805e0cdc volatile uint32_t *reg = dir ? gpiohs->output_en.u32 : gpiohs->input_en.u32; - 805e0e9a: 38001537 lui a0,0x38001 - 805e0e9e: 00450413 addi s0,a0,4 # 38001004 <_start-0x485deffc> + 805e0eaa: 38001537 lui a0,0x38001 + 805e0eae: 00450413 addi s0,a0,4 # 38001004 <_start-0x485deffc> volatile uint32_t *reg_d = !dir ? gpiohs->output_en.u32 : gpiohs->input_en.u32; - 805e0ea2: 0521 addi a0,a0,8 + 805e0eb2: 0521 addi a0,a0,8 set_gpio_bit(reg_d, pin, 0); - 805e0ea4: 85a6 mv a1,s1 - 805e0ea6: 4601 li a2,0 - 805e0ea8: 00000097 auipc ra,0x0 - 805e0eac: f98080e7 jalr -104(ra) # 805e0e40 + 805e0eb4: 85a6 mv a1,s1 + 805e0eb6: 4601 li a2,0 + 805e0eb8: 00000097 auipc ra,0x0 + 805e0ebc: f98080e7 jalr -104(ra) # 805e0e50 set_gpio_bit(reg, pin, 1); - 805e0eb0: 8522 mv a0,s0 + 805e0ec0: 8522 mv a0,s0 } - 805e0eb2: 6442 ld s0,16(sp) - 805e0eb4: 60e2 ld ra,24(sp) + 805e0ec2: 6442 ld s0,16(sp) + 805e0ec4: 60e2 ld ra,24(sp) set_gpio_bit(reg, pin, 1); - 805e0eb6: 85a6 mv a1,s1 + 805e0ec6: 85a6 mv a1,s1 } - 805e0eb8: 64a2 ld s1,8(sp) + 805e0ec8: 64a2 ld s1,8(sp) set_gpio_bit(reg, pin, 1); - 805e0eba: 4605 li a2,1 + 805e0eca: 4605 li a2,1 } - 805e0ebc: 6105 addi sp,sp,32 + 805e0ecc: 6105 addi sp,sp,32 set_gpio_bit(reg, pin, 1); - 805e0ebe: 00000317 auipc t1,0x0 - 805e0ec2: f8230067 jr -126(t1) # 805e0e40 - 805e0ec6: 1582 slli a1,a1,0x20 - 805e0ec8: 81f9 srli a1,a1,0x1e + 805e0ece: 00000317 auipc t1,0x0 + 805e0ed2: f8230067 jr -126(t1) # 805e0e50 + 805e0ed6: 1582 slli a1,a1,0x20 + 805e0ed8: 81f9 srli a1,a1,0x1e fpioa_set_io_pull(io_number, pull); - 805e0eca: 00001797 auipc a5,0x1 - 805e0ece: 91e78793 addi a5,a5,-1762 # 805e17e8 - 805e0ed2: 00001717 auipc a4,0x1 - 805e0ed6: 92670713 addi a4,a4,-1754 # 805e17f8 - 805e0eda: 972e add a4,a4,a1 - 805e0edc: 95be add a1,a1,a5 - 805e0ede: 418c lw a1,0(a1) - 805e0ee0: 4300 lw s0,0(a4) - 805e0ee2: 00000097 auipc ra,0x0 - 805e0ee6: dea080e7 jalr -534(ra) # 805e0ccc + 805e0eda: 00001797 auipc a5,0x1 + 805e0ede: 91e78793 addi a5,a5,-1762 # 805e17f8 + 805e0ee2: 00001717 auipc a4,0x1 + 805e0ee6: 92670713 addi a4,a4,-1754 # 805e1808 + 805e0eea: 972e add a4,a4,a1 + 805e0eec: 95be add a1,a1,a5 + 805e0eee: 418c lw a1,0(a1) + 805e0ef0: 4300 lw s0,0(a4) + 805e0ef2: 00000097 auipc ra,0x0 + 805e0ef6: dea080e7 jalr -534(ra) # 805e0cdc volatile uint32_t *reg = dir ? gpiohs->output_en.u32 : gpiohs->input_en.u32; - 805e0eea: 38001537 lui a0,0x38001 - 805e0eee: c409 beqz s0,805e0ef8 - 805e0ef0: 00850413 addi s0,a0,8 # 38001008 <_start-0x485deff8> + 805e0efa: 38001537 lui a0,0x38001 + 805e0efe: c409 beqz s0,805e0f08 + 805e0f00: 00850413 addi s0,a0,8 # 38001008 <_start-0x485deff8> volatile uint32_t *reg_d = !dir ? gpiohs->output_en.u32 : gpiohs->input_en.u32; - 805e0ef4: 0511 addi a0,a0,4 - 805e0ef6: b77d j 805e0ea4 + 805e0f04: 0511 addi a0,a0,4 + 805e0f06: b77d j 805e0eb4 volatile uint32_t *reg = dir ? gpiohs->output_en.u32 : gpiohs->input_en.u32; - 805e0ef8: 00450413 addi s0,a0,4 + 805e0f08: 00450413 addi s0,a0,4 volatile uint32_t *reg_d = !dir ? gpiohs->output_en.u32 : gpiohs->input_en.u32; - 805e0efc: 0521 addi a0,a0,8 - 805e0efe: b75d j 805e0ea4 + 805e0f0c: 0521 addi a0,a0,8 + 805e0f0e: b75d j 805e0eb4 -00000000805e0f00 : +00000000805e0f10 : gpio_pin_value_t gpiohs_get_pin(uint8_t pin) { return get_gpio_bit(gpiohs->input_val.u32, pin); - 805e0f00: 85aa mv a1,a0 - 805e0f02: 38001537 lui a0,0x38001 - 805e0f06: 00000317 auipc t1,0x0 - 805e0f0a: f5a30067 jr -166(t1) # 805e0e60 + 805e0f10: 85aa mv a1,a0 + 805e0f12: 38001537 lui a0,0x38001 + 805e0f16: 00000317 auipc t1,0x0 + 805e0f1a: f5a30067 jr -166(t1) # 805e0e70 -00000000805e0f0e : +00000000805e0f1e : val += app_flash_ptr[addr+1] << 8; - 805e0f0e: 0015079b addiw a5,a0,1 + 805e0f1e: 0015079b addiw a5,a0,1 val += app_flash_ptr[addr+2] << 16; - 805e0f12: 0025069b addiw a3,a0,2 + 805e0f22: 0025069b addiw a3,a0,2 val += app_flash_ptr[addr+1] << 8; - 805e0f16: 1782 slli a5,a5,0x20 + 805e0f26: 1782 slli a5,a5,0x20 val += app_flash_ptr[addr+2] << 16; - 805e0f18: 1682 slli a3,a3,0x20 + 805e0f28: 1682 slli a3,a3,0x20 uint32_t val = app_flash_ptr[addr]; - 805e0f1a: 54000737 lui a4,0x54000 + 805e0f2a: 54000737 lui a4,0x54000 val += app_flash_ptr[addr+3] << 24; - 805e0f1e: 0035061b addiw a2,a0,3 + 805e0f2e: 0035061b addiw a2,a0,3 val += app_flash_ptr[addr+1] << 8; - 805e0f22: 9381 srli a5,a5,0x20 + 805e0f32: 9381 srli a5,a5,0x20 val += app_flash_ptr[addr+2] << 16; - 805e0f24: 9281 srli a3,a3,0x20 + 805e0f34: 9281 srli a3,a3,0x20 val += app_flash_ptr[addr+1] << 8; - 805e0f26: 97ba add a5,a5,a4 + 805e0f36: 97ba add a5,a5,a4 val += app_flash_ptr[addr+2] << 16; - 805e0f28: 96ba add a3,a3,a4 + 805e0f38: 96ba add a3,a3,a4 uint32_t val = app_flash_ptr[addr]; - 805e0f2a: 1502 slli a0,a0,0x20 + 805e0f3a: 1502 slli a0,a0,0x20 val += app_flash_ptr[addr+3] << 24; - 805e0f2c: 1602 slli a2,a2,0x20 + 805e0f3c: 1602 slli a2,a2,0x20 val += app_flash_ptr[addr+1] << 8; - 805e0f2e: 0007c783 lbu a5,0(a5) + 805e0f3e: 0007c783 lbu a5,0(a5) val += app_flash_ptr[addr+2] << 16; - 805e0f32: 0006c683 lbu a3,0(a3) # 502b0000 <_start-0x30330000> + 805e0f42: 0006c683 lbu a3,0(a3) # 502b0000 <_start-0x30330000> val += app_flash_ptr[addr+3] << 24; - 805e0f36: 9201 srli a2,a2,0x20 + 805e0f46: 9201 srli a2,a2,0x20 uint32_t val = app_flash_ptr[addr]; - 805e0f38: 9101 srli a0,a0,0x20 - 805e0f3a: 953a add a0,a0,a4 + 805e0f48: 9101 srli a0,a0,0x20 + 805e0f4a: 953a add a0,a0,a4 val += app_flash_ptr[addr+3] << 24; - 805e0f3c: 9732 add a4,a4,a2 + 805e0f4c: 9732 add a4,a4,a2 uint32_t val = app_flash_ptr[addr]; - 805e0f3e: 00054603 lbu a2,0(a0) # 38001000 <_start-0x485df000> + 805e0f4e: 00054603 lbu a2,0(a0) # 38001000 <_start-0x485df000> val += app_flash_ptr[addr+3] << 24; - 805e0f42: 00074503 lbu a0,0(a4) # 54000000 <_start-0x2c5e0000> + 805e0f52: 00074503 lbu a0,0(a4) # 54000000 <_start-0x2c5e0000> val += app_flash_ptr[addr+1] << 8; - 805e0f46: 0087979b slliw a5,a5,0x8 + 805e0f56: 0087979b slliw a5,a5,0x8 val += app_flash_ptr[addr+2] << 16; - 805e0f4a: 0106971b slliw a4,a3,0x10 - 805e0f4e: 9fb9 addw a5,a5,a4 - 805e0f50: 9fb1 addw a5,a5,a2 + 805e0f5a: 0106971b slliw a4,a3,0x10 + 805e0f5e: 9fb9 addw a5,a5,a4 + 805e0f60: 9fb1 addw a5,a5,a2 val += app_flash_ptr[addr+3] << 24; - 805e0f52: 0185151b slliw a0,a0,0x18 + 805e0f62: 0185151b slliw a0,a0,0x18 } - 805e0f56: 9d3d addw a0,a0,a5 - 805e0f58: 8082 ret + 805e0f66: 9d3d addw a0,a0,a5 + 805e0f68: 8082 ret -00000000805e0f5a : +00000000805e0f6a : { - 805e0f5a: 711d addi sp,sp,-96 - 805e0f5c: fc4e sd s3,56(sp) + 805e0f6a: 711d addi sp,sp,-96 + 805e0f6c: fc4e sd s3,56(sp) int size = cfg_size+5; - 805e0f5e: 00001997 auipc s3,0x1 - 805e0f62: fd298993 addi s3,s3,-46 # 805e1f30 + 805e0f6e: 00001997 auipc s3,0x1 + 805e0f72: fd298993 addi s3,s3,-46 # 805e1f40 { - 805e0f66: f05a sd s6,32(sp) + 805e0f76: f05a sd s6,32(sp) int size = cfg_size+5; - 805e0f68: 0009ab03 lw s6,0(s3) + 805e0f78: 0009ab03 lw s6,0(s3) sha256_init(&context, size); - 805e0f6c: 00001517 auipc a0,0x1 - 805e0f70: 04c50513 addi a0,a0,76 # 805e1fb8 + 805e0f7c: 00001517 auipc a0,0x1 + 805e0f80: 07c50513 addi a0,a0,124 # 805e1ff8 { - 805e0f74: e466 sd s9,8(sp) + 805e0f84: e466 sd s9,8(sp) int size = cfg_size+5; - 805e0f76: 2b15 addiw s6,s6,5 + 805e0f86: 2b15 addiw s6,s6,5 sha256_init(&context, size); - 805e0f78: 85da mv a1,s6 + 805e0f88: 85da mv a1,s6 { - 805e0f7a: ec86 sd ra,88(sp) - 805e0f7c: e8a2 sd s0,80(sp) - 805e0f7e: e4a6 sd s1,72(sp) - 805e0f80: e0ca sd s2,64(sp) - 805e0f82: f852 sd s4,48(sp) - 805e0f84: f456 sd s5,40(sp) - 805e0f86: ec5e sd s7,24(sp) - 805e0f88: e862 sd s8,16(sp) - 805e0f8a: 00001c97 auipc s9,0x1 - 805e0f8e: f86c8c93 addi s9,s9,-122 # 805e1f10 + 805e0f8a: ec86 sd ra,88(sp) + 805e0f8c: e8a2 sd s0,80(sp) + 805e0f8e: e4a6 sd s1,72(sp) + 805e0f90: e0ca sd s2,64(sp) + 805e0f92: f852 sd s4,48(sp) + 805e0f94: f456 sd s5,40(sp) + 805e0f96: ec5e sd s7,24(sp) + 805e0f98: e862 sd s8,16(sp) + 805e0f9a: 00001c97 auipc s9,0x1 + 805e0f9e: f86c8c93 addi s9,s9,-122 # 805e1f20 sha256_init(&context, size); - 805e0f92: 00000097 auipc ra,0x0 - 805e0f96: 184080e7 jalr 388(ra) # 805e1116 + 805e0fa2: 00000097 auipc ra,0x0 + 805e0fa6: 184080e7 jalr 388(ra) # 805e1126 while (size > 0) { - 805e0f9a: 09605663 blez s6,805e1026 + 805e0faa: 09605663 blez s6,805e1036 uint32_t idx = 0; - 805e0f9e: 4b81 li s7,0 - 805e0fa0: 00001c97 auipc s9,0x1 - 805e0fa4: f70c8c93 addi s9,s9,-144 # 805e1f10 - 805e0fa8: 00001917 auipc s2,0x1 - 805e0fac: b6990913 addi s2,s2,-1175 # 805e1b11 + 805e0fae: 4b81 li s7,0 + 805e0fb0: 00001c97 auipc s9,0x1 + 805e0fb4: f70c8c93 addi s9,s9,-144 # 805e1f20 + 805e0fb8: 00001917 auipc s2,0x1 + 805e0fbc: b6990913 addi s2,s2,-1175 # 805e1b21 sz = (size >= 1024) ? 1024 : size; - 805e0fb0: 40000493 li s1,1024 - 805e0fb4: 00001c17 auipc s8,0x1 - 805e0fb8: b5cc0c13 addi s8,s8,-1188 # 805e1b10 + 805e0fc0: 40000493 li s1,1024 + 805e0fc4: 00001c17 auipc s8,0x1 + 805e0fc8: b5cc0c13 addi s8,s8,-1188 # 805e1b20 buffer[n] = app_flash_ptr[cfg_address + idx + n]; - 805e0fbc: 54000a37 lui s4,0x54000 + 805e0fcc: 54000a37 lui s4,0x54000 sha256_update(&context, buffer, sz); - 805e0fc0: 00001417 auipc s0,0x1 - 805e0fc4: ff840413 addi s0,s0,-8 # 805e1fb8 + 805e0fd0: 00001417 auipc s0,0x1 + 805e0fd4: 02840413 addi s0,s0,40 # 805e1ff8 sz = (size >= 1024) ? 1024 : size; - 805e0fc8: 87da mv a5,s6 - 805e0fca: 0164d463 ble s6,s1,805e0fd2 - 805e0fce: 40000793 li a5,1024 + 805e0fd8: 87da mv a5,s6 + 805e0fda: 0164d463 ble s6,s1,805e0fe2 + 805e0fde: 40000793 li a5,1024 buffer[n] = app_flash_ptr[cfg_address + idx + n]; - 805e0fd2: 000ca683 lw a3,0(s9) - 805e0fd6: fff7861b addiw a2,a5,-1 - 805e0fda: 1602 slli a2,a2,0x20 - 805e0fdc: 9201 srli a2,a2,0x20 - 805e0fde: 017686bb addw a3,a3,s7 + 805e0fe2: 000ca683 lw a3,0(s9) + 805e0fe6: fff7861b addiw a2,a5,-1 + 805e0fea: 1602 slli a2,a2,0x20 + 805e0fec: 9201 srli a2,a2,0x20 + 805e0fee: 017686bb addw a3,a3,s7 sz = (size >= 1024) ? 1024 : size; - 805e0fe2: 00078a9b sext.w s5,a5 + 805e0ff2: 00078a9b sext.w s5,a5 for (int n=0; n - 805e0ff0: 418686bb subw a3,a3,s8 - 805e0ff4: 00e687bb addw a5,a3,a4 - 805e0ff8: 1782 slli a5,a5,0x20 - 805e0ffa: 9381 srli a5,a5,0x20 - 805e0ffc: 97d2 add a5,a5,s4 - 805e0ffe: 0007c783 lbu a5,0(a5) - 805e1002: 0705 addi a4,a4,1 - 805e1004: fef70fa3 sb a5,-1(a4) + 805e0ff8: 00001717 auipc a4,0x1 + 805e0ffc: b2870713 addi a4,a4,-1240 # 805e1b20 + 805e1000: 418686bb subw a3,a3,s8 + 805e1004: 00e687bb addw a5,a3,a4 + 805e1008: 1782 slli a5,a5,0x20 + 805e100a: 9381 srli a5,a5,0x20 + 805e100c: 97d2 add a5,a5,s4 + 805e100e: 0007c783 lbu a5,0(a5) + 805e1012: 0705 addi a4,a4,1 + 805e1014: fef70fa3 sb a5,-1(a4) for (int n=0; n + 805e1018: fec716e3 bne a4,a2,805e1004 sha256_update(&context, buffer, sz); - 805e100c: 8656 mv a2,s5 - 805e100e: 85e2 mv a1,s8 - 805e1010: 8522 mv a0,s0 + 805e101c: 8656 mv a2,s5 + 805e101e: 85e2 mv a1,s8 + 805e1020: 8522 mv a0,s0 size -= sz; - 805e1012: 415b0b3b subw s6,s6,s5 + 805e1022: 415b0b3b subw s6,s6,s5 sha256_update(&context, buffer, sz); - 805e1016: 00000097 auipc ra,0x0 - 805e101a: 188080e7 jalr 392(ra) # 805e119e + 805e1026: 00000097 auipc ra,0x0 + 805e102a: 188080e7 jalr 392(ra) # 805e11ae idx += sz; - 805e101e: 015b8bbb addw s7,s7,s5 + 805e102e: 015b8bbb addw s7,s7,s5 while (size > 0) { - 805e1022: fb6043e3 bgtz s6,805e0fc8 + 805e1032: fb6043e3 bgtz s6,805e0fd8 sha256_final(&context, hash); - 805e1026: 00001597 auipc a1,0x1 - 805e102a: f1a58593 addi a1,a1,-230 # 805e1f40 - 805e102e: 00001517 auipc a0,0x1 - 805e1032: f8a50513 addi a0,a0,-118 # 805e1fb8 - 805e1036: 00000097 auipc ra,0x0 - 805e103a: 20a080e7 jalr 522(ra) # 805e1240 + 805e1036: 00001597 auipc a1,0x1 + 805e103a: f1a58593 addi a1,a1,-230 # 805e1f50 + 805e103e: 00001517 auipc a0,0x1 + 805e1042: fba50513 addi a0,a0,-70 # 805e1ff8 + 805e1046: 00000097 auipc ra,0x0 + 805e104a: 20a080e7 jalr 522(ra) # 805e1250 offset = cfg_address + cfg_size + 5; - 805e103e: 000ca683 lw a3,0(s9) - 805e1042: 0009a783 lw a5,0(s3) - 805e1046: 00001617 auipc a2,0x1 - 805e104a: a9260613 addi a2,a2,-1390 # 805e1ad8 - 805e104e: 00001517 auipc a0,0x1 - 805e1052: aaa50513 addi a0,a0,-1366 # 805e1af8 - 805e1056: 9ebd addw a3,a3,a5 - 805e1058: 2695 addiw a3,a3,5 - 805e105a: 8732 mv a4,a2 - 805e105c: 9e91 subw a3,a3,a2 + 805e104e: 000ca683 lw a3,0(s9) + 805e1052: 0009a783 lw a5,0(s3) + 805e1056: 00001617 auipc a2,0x1 + 805e105a: a9260613 addi a2,a2,-1390 # 805e1ae8 + 805e105e: 00001517 auipc a0,0x1 + 805e1062: aaa50513 addi a0,a0,-1366 # 805e1b08 + 805e1066: 9ebd addw a3,a3,a5 + 805e1068: 2695 addiw a3,a3,5 + 805e106a: 8732 mv a4,a2 + 805e106c: 9e91 subw a3,a3,a2 app_hash[n] = app_flash_ptr[offset + n]; - 805e105e: 540005b7 lui a1,0x54000 - 805e1062: 00e687bb addw a5,a3,a4 - 805e1066: 1782 slli a5,a5,0x20 - 805e1068: 9381 srli a5,a5,0x20 - 805e106a: 97ae add a5,a5,a1 - 805e106c: 0007c783 lbu a5,0(a5) - 805e1070: 0705 addi a4,a4,1 - 805e1072: fef70fa3 sb a5,-1(a4) + 805e106e: 540005b7 lui a1,0x54000 + 805e1072: 00e687bb addw a5,a3,a4 + 805e1076: 1782 slli a5,a5,0x20 + 805e1078: 9381 srli a5,a5,0x20 + 805e107a: 97ae add a5,a5,a1 + 805e107c: 0007c783 lbu a5,0(a5) + 805e1080: 0705 addi a4,a4,1 + 805e1082: fef70fa3 sb a5,-1(a4) for (int n=0; n - 805e107a: 00001797 auipc a5,0x1 - 805e107e: ec678793 addi a5,a5,-314 # 805e1f40 - 805e1082: 00001597 auipc a1,0x1 - 805e1086: ede58593 addi a1,a1,-290 # 805e1f60 - 805e108a: a019 j 805e1090 + 805e1086: fee516e3 bne a0,a4,805e1072 + 805e108a: 00001797 auipc a5,0x1 + 805e108e: ec678793 addi a5,a5,-314 # 805e1f50 + 805e1092: 00001597 auipc a1,0x1 + 805e1096: ede58593 addi a1,a1,-290 # 805e1f70 + 805e109a: a019 j 805e10a0 for (idx=0; idx + 805e109c: 04f58e63 beq a1,a5,805e10f8 if (hash[idx] != app_hash[idx]) { - 805e1090: 0007c683 lbu a3,0(a5) - 805e1094: 00064703 lbu a4,0(a2) - 805e1098: 0785 addi a5,a5,1 - 805e109a: 0605 addi a2,a2,1 - 805e109c: fee688e3 beq a3,a4,805e108c + 805e10a0: 0007c683 lbu a3,0(a5) + 805e10a4: 00064703 lbu a4,0(a2) + 805e10a8: 0785 addi a5,a5,1 + 805e10aa: 0605 addi a2,a2,1 + 805e10ac: fee688e3 beq a3,a4,805e109c LOG("SHA256 error, "); - 805e10a0: 00001797 auipc a5,0x1 - 805e10a4: ec878793 addi a5,a5,-312 # 805e1f68 - 805e10a8: 4388 lw a0,0(a5) - 805e10aa: c115 beqz a0,805e10ce - 805e10ac: 00001797 auipc a5,0x1 - 805e10b0: edc7b783 ld a5,-292(a5) # 805e1f88 <__TMC_END__+0x8> - 805e10b4: 639c ld a5,0(a5) - 805e10b6: 00000517 auipc a0,0x0 - 805e10ba: 75250513 addi a0,a0,1874 # 805e1808 - 805e10be: 9782 jalr a5 - 805e10c0: 0c800513 li a0,200 - 805e10c4: 00000097 auipc ra,0x0 - 805e10c8: 028080e7 jalr 40(ra) # 805e10ec + 805e10b0: 00001797 auipc a5,0x1 + 805e10b4: ec878793 addi a5,a5,-312 # 805e1f78 + 805e10b8: 4388 lw a0,0(a5) + 805e10ba: c115 beqz a0,805e10de + 805e10bc: 00001797 auipc a5,0x1 + 805e10c0: f0c7b783 ld a5,-244(a5) # 805e1fc8 <__TMC_END__+0x8> + 805e10c4: 639c ld a5,0(a5) + 805e10c6: 00000517 auipc a0,0x0 + 805e10ca: 75250513 addi a0,a0,1874 # 805e1818 + 805e10ce: 9782 jalr a5 + 805e10d0: 0c800513 li a0,200 + 805e10d4: 00000097 auipc ra,0x0 + 805e10d8: 028080e7 jalr 40(ra) # 805e10fc return 0; - 805e10cc: 4501 li a0,0 + 805e10dc: 4501 li a0,0 } - 805e10ce: 60e6 ld ra,88(sp) - 805e10d0: 6446 ld s0,80(sp) - 805e10d2: 64a6 ld s1,72(sp) - 805e10d4: 6906 ld s2,64(sp) - 805e10d6: 79e2 ld s3,56(sp) - 805e10d8: 7a42 ld s4,48(sp) - 805e10da: 7aa2 ld s5,40(sp) - 805e10dc: 7b02 ld s6,32(sp) - 805e10de: 6be2 ld s7,24(sp) - 805e10e0: 6c42 ld s8,16(sp) - 805e10e2: 6ca2 ld s9,8(sp) - 805e10e4: 6125 addi sp,sp,96 - 805e10e6: 8082 ret + 805e10de: 60e6 ld ra,88(sp) + 805e10e0: 6446 ld s0,80(sp) + 805e10e2: 64a6 ld s1,72(sp) + 805e10e4: 6906 ld s2,64(sp) + 805e10e6: 79e2 ld s3,56(sp) + 805e10e8: 7a42 ld s4,48(sp) + 805e10ea: 7aa2 ld s5,40(sp) + 805e10ec: 7b02 ld s6,32(sp) + 805e10ee: 6be2 ld s7,24(sp) + 805e10f0: 6c42 ld s8,16(sp) + 805e10f2: 6ca2 ld s9,8(sp) + 805e10f4: 6125 addi sp,sp,96 + 805e10f6: 8082 ret return 1; - 805e10e8: 4505 li a0,1 - 805e10ea: b7d5 j 805e10ce + 805e10f8: 4505 li a0,1 + 805e10fa: b7d5 j 805e10de -00000000805e10ec : +00000000805e10fc : #define BYTESWAP(x) ((ROTR((x), 8) & 0xff00ff00L) | (ROTL((x), 8) & 0x00ff00ffL)) #define BYTESWAP64(x) byteswap64(x) int usleep(uint64_t usec) { uint64_t cycle = read_cycle(); - 805e10ec: b0002773 csrr a4,mcycle + 805e10fc: b0002773 csrr a4,mcycle uint64_t nop_all = usec * DEFAULT_CPU_CLOCK / 1000000UL; - 805e10f0: 173ef7b7 lui a5,0x173ef - 805e10f4: d8078793 addi a5,a5,-640 # 173eed80 <_start-0x691f1280> - 805e10f8: 02f50533 mul a0,a0,a5 - 805e10fc: 000f47b7 lui a5,0xf4 - 805e1100: 24078793 addi a5,a5,576 # f4240 <_start-0x804ebdc0> - 805e1104: 02f55533 divu a0,a0,a5 + 805e1100: 173ef7b7 lui a5,0x173ef + 805e1104: d8078793 addi a5,a5,-640 # 173eed80 <_start-0x691f1280> + 805e1108: 02f50533 mul a0,a0,a5 + 805e110c: 000f47b7 lui a5,0xf4 + 805e1110: 24078793 addi a5,a5,576 # f4240 <_start-0x804ebdc0> + 805e1114: 02f55533 divu a0,a0,a5 while(1) { if(read_cycle() - cycle >= nop_all) - 805e1108: b00027f3 csrr a5,mcycle - 805e110c: 8f99 sub a5,a5,a4 - 805e110e: fea7ede3 bltu a5,a0,805e1108 + 805e1118: b00027f3 csrr a5,mcycle + 805e111c: 8f99 sub a5,a5,a4 + 805e111e: fea7ede3 bltu a5,a0,805e1118 break; } return 0; } - 805e1112: 4501 li a0,0 - 805e1114: 8082 ret + 805e1122: 4501 li a0,0 + 805e1124: 8082 ret -00000000805e1116 : +00000000805e1126 : uint32_t b = (uint32_t)x; return ((uint64_t)BYTESWAP(b) << 32) | (uint64_t)BYTESWAP(a); } void sha256_init(sha256_context_t *context, size_t input_len) { - 805e1116: 1101 addi sp,sp,-32 + 805e1126: 1101 addi sp,sp,-32 //sysctl_clock_enable(SYSCTL_CLOCK_SHA); sysctl->clk_en_cent.apb0_clk_en = 1; - 805e1118: 00001797 auipc a5,0x1 - 805e111c: e787b783 ld a5,-392(a5) # 805e1f90 <__TMC_END__+0x10> + 805e1128: 00001797 auipc a5,0x1 + 805e112c: ea87b783 ld a5,-344(a5) # 805e1fd0 <__TMC_END__+0x10> { - 805e1120: e822 sd s0,16(sp) + 805e1130: e822 sd s0,16(sp) sysctl->clk_en_cent.apb0_clk_en = 1; - 805e1122: 6380 ld s0,0(a5) + 805e1132: 6380 ld s0,0(a5) { - 805e1124: e426 sd s1,8(sp) - 805e1126: e04a sd s2,0(sp) - 805e1128: ec06 sd ra,24(sp) + 805e1134: e426 sd s1,8(sp) + 805e1136: e04a sd s2,0(sp) + 805e1138: ec06 sd ra,24(sp) sysctl->clk_en_cent.apb0_clk_en = 1; - 805e112a: 5418 lw a4,40(s0) + 805e113a: 5418 lw a4,40(s0) sysctl->clk_en_peri.sha_clk_en = 1; - 805e112c: 040006b7 lui a3,0x4000 + 805e113c: 040006b7 lui a3,0x4000 { - 805e1130: 892a mv s2,a0 + 805e1140: 892a mv s2,a0 sysctl->clk_en_cent.apb0_clk_en = 1; - 805e1132: 00876713 ori a4,a4,8 - 805e1136: d418 sw a4,40(s0) + 805e1142: 00876713 ori a4,a4,8 + 805e1146: d418 sw a4,40(s0) sysctl->clk_en_peri.sha_clk_en = 1; - 805e1138: 5458 lw a4,44(s0) + 805e1148: 5458 lw a4,44(s0) //sysctl_reset(SYSCTL_RESET_SHA); sysctl->peri_reset.sha_reset = 1; usleep(10); - 805e113a: 4529 li a0,10 + 805e114a: 4529 li a0,10 { - 805e113c: 84ae mv s1,a1 + 805e114c: 84ae mv s1,a1 sysctl->clk_en_peri.sha_clk_en = 1; - 805e113e: 8f55 or a4,a4,a3 - 805e1140: d458 sw a4,44(s0) + 805e114e: 8f55 or a4,a4,a3 + 805e1150: d458 sw a4,44(s0) sysctl->peri_reset.sha_reset = 1; - 805e1142: 585c lw a5,52(s0) + 805e1152: 585c lw a5,52(s0) sysctl->peri_reset.sha_reset = 0; sha256->sha_num_reg.sha_data_cnt = (uint32_t)((input_len + SHA256_BLOCK_LEN + 8) / SHA256_BLOCK_LEN); - 805e1144: 04848493 addi s1,s1,72 - 805e1148: 8099 srli s1,s1,0x6 + 805e1154: 04848493 addi s1,s1,72 + 805e1158: 8099 srli s1,s1,0x6 sysctl->peri_reset.sha_reset = 1; - 805e114a: 8fd5 or a5,a5,a3 - 805e114c: d85c sw a5,52(s0) + 805e115a: 8fd5 or a5,a5,a3 + 805e115c: d85c sw a5,52(s0) usleep(10); - 805e114e: 00000097 auipc ra,0x0 - 805e1152: f9e080e7 jalr -98(ra) # 805e10ec + 805e115e: 00000097 auipc ra,0x0 + 805e1162: f9e080e7 jalr -98(ra) # 805e10fc sysctl->peri_reset.sha_reset = 0; - 805e1156: 585c lw a5,52(s0) - 805e1158: fc000737 lui a4,0xfc000 - 805e115c: 177d addi a4,a4,-1 - 805e115e: 8ff9 and a5,a5,a4 - 805e1160: d85c sw a5,52(s0) + 805e1166: 585c lw a5,52(s0) + 805e1168: fc000737 lui a4,0xfc000 + 805e116c: 177d addi a4,a4,-1 + 805e116e: 8ff9 and a5,a5,a4 + 805e1170: d85c sw a5,52(s0) sha256->sha_num_reg.sha_data_cnt = (uint32_t)((input_len + SHA256_BLOCK_LEN + 8) / SHA256_BLOCK_LEN); - 805e1162: 502c07b7 lui a5,0x502c0 - 805e1166: 5798 lw a4,40(a5) - 805e1168: 76c1 lui a3,0xffff0 - 805e116a: 14c2 slli s1,s1,0x30 - 805e116c: 8f75 and a4,a4,a3 - 805e116e: 90c1 srli s1,s1,0x30 - 805e1170: 8cd9 or s1,s1,a4 - 805e1172: d784 sw s1,40(a5) + 805e1172: 502c07b7 lui a5,0x502c0 + 805e1176: 5798 lw a4,40(a5) + 805e1178: 76c1 lui a3,0xffff0 + 805e117a: 14c2 slli s1,s1,0x30 + 805e117c: 8f75 and a4,a4,a3 + 805e117e: 90c1 srli s1,s1,0x30 + 805e1180: 8cd9 or s1,s1,a4 + 805e1182: d784 sw s1,40(a5) sha256->sha_function_reg_1.dma_en = 0x0; - 805e1174: 5bd8 lw a4,52(a5) + 805e1184: 5bd8 lw a4,52(a5) sha256->sha_function_reg_0.sha_endian = SHA256_BIG_ENDIAN; - 805e1176: 66c1 lui a3,0x10 + 805e1186: 66c1 lui a3,0x10 sha256->sha_function_reg_1.dma_en = 0x0; - 805e1178: 9b79 andi a4,a4,-2 - 805e117a: dbd8 sw a4,52(a5) + 805e1188: 9b79 andi a4,a4,-2 + 805e118a: dbd8 sw a4,52(a5) sha256->sha_function_reg_0.sha_endian = SHA256_BIG_ENDIAN; - 805e117c: 57d8 lw a4,44(a5) - 805e117e: 8f55 or a4,a4,a3 - 805e1180: d7d8 sw a4,44(a5) + 805e118c: 57d8 lw a4,44(a5) + 805e118e: 8f55 or a4,a4,a3 + 805e1190: d7d8 sw a4,44(a5) sha256->sha_function_reg_0.sha_en = ENABLE_SHA; - 805e1182: 57d8 lw a4,44(a5) - 805e1184: 00176713 ori a4,a4,1 - 805e1188: d7d8 sw a4,44(a5) + 805e1192: 57d8 lw a4,44(a5) + 805e1194: 00176713 ori a4,a4,1 + 805e1198: d7d8 sw a4,44(a5) context->total_len = 0L; context->buffer_len = 0L; } - 805e118a: 60e2 ld ra,24(sp) - 805e118c: 6442 ld s0,16(sp) + 805e119a: 60e2 ld ra,24(sp) + 805e119c: 6442 ld s0,16(sp) context->total_len = 0L; - 805e118e: 00093023 sd zero,0(s2) + 805e119e: 00093023 sd zero,0(s2) context->buffer_len = 0L; - 805e1192: 00093423 sd zero,8(s2) + 805e11a2: 00093423 sd zero,8(s2) } - 805e1196: 64a2 ld s1,8(sp) - 805e1198: 6902 ld s2,0(sp) - 805e119a: 6105 addi sp,sp,32 - 805e119c: 8082 ret + 805e11a6: 64a2 ld s1,8(sp) + 805e11a8: 6902 ld s2,0(sp) + 805e11aa: 6105 addi sp,sp,32 + 805e11ac: 8082 ret -00000000805e119e : +00000000805e11ae : const uint8_t *data = input; size_t buffer_bytes_left; size_t bytes_to_copy; uint32_t i; while(input_len) - 805e119e: c245 beqz a2,805e123e + 805e11ae: c245 beqz a2,805e124e { - 805e11a0: 7139 addi sp,sp,-64 - 805e11a2: f04a sd s2,32(sp) - 805e11a4: 892a mv s2,a0 - 805e11a6: 6508 ld a0,8(a0) - 805e11a8: f822 sd s0,48(sp) - 805e11aa: ec4e sd s3,24(sp) - 805e11ac: e852 sd s4,16(sp) - 805e11ae: e456 sd s5,8(sp) - 805e11b0: e05a sd s6,0(sp) - 805e11b2: fc06 sd ra,56(sp) - 805e11b4: f426 sd s1,40(sp) - 805e11b6: 89b2 mv s3,a2 - 805e11b8: 8a2e mv s4,a1 + 805e11b0: 7139 addi sp,sp,-64 + 805e11b2: f04a sd s2,32(sp) + 805e11b4: 892a mv s2,a0 + 805e11b6: 6508 ld a0,8(a0) + 805e11b8: f822 sd s0,48(sp) + 805e11ba: ec4e sd s3,24(sp) + 805e11bc: e852 sd s4,16(sp) + 805e11be: e456 sd s5,8(sp) + 805e11c0: e05a sd s6,0(sp) + 805e11c2: fc06 sd ra,56(sp) + 805e11c4: f426 sd s1,40(sp) + 805e11c6: 89b2 mv s3,a2 + 805e11c8: 8a2e mv s4,a1 { buffer_bytes_left = SHA256_BLOCK_LEN - context->buffer_len; - 805e11ba: 04000b13 li s6,64 - 805e11be: 05090a93 addi s5,s2,80 + 805e11ca: 04000b13 li s6,64 + 805e11ce: 05090a93 addi s5,s2,80 input_len -= bytes_to_copy; if(context->buffer_len == SHA256_BLOCK_LEN) { for(i = 0; i < 16; i++) { while(sha256->sha_function_reg_1.fifo_in_full) - 805e11c2: 502c0437 lui s0,0x502c0 + 805e11d2: 502c0437 lui s0,0x502c0 buffer_bytes_left = SHA256_BLOCK_LEN - context->buffer_len; - 805e11c6: 40ab04b3 sub s1,s6,a0 - 805e11ca: 0099f363 bleu s1,s3,805e11d0 - 805e11ce: 84ce mv s1,s3 + 805e11d6: 40ab04b3 sub s1,s6,a0 + 805e11da: 0099f363 bleu s1,s3,805e11e0 + 805e11de: 84ce mv s1,s3 memcpy(&context->buffer.bytes[context->buffer_len], data, bytes_to_copy); - 805e11d0: 0541 addi a0,a0,16 - 805e11d2: 85d2 mv a1,s4 - 805e11d4: 8626 mv a2,s1 - 805e11d6: 954a add a0,a0,s2 - 805e11d8: 00000097 auipc ra,0x0 - 805e11dc: 144080e7 jalr 324(ra) # 805e131c + 805e11e0: 0541 addi a0,a0,16 + 805e11e2: 85d2 mv a1,s4 + 805e11e4: 8626 mv a2,s1 + 805e11e6: 954a add a0,a0,s2 + 805e11e8: 00000097 auipc ra,0x0 + 805e11ec: 144080e7 jalr 324(ra) # 805e132c context->total_len += bytes_to_copy * 8L; - 805e11e0: 00093783 ld a5,0(s2) + 805e11f0: 00093783 ld a5,0(s2) context->buffer_len += bytes_to_copy; - 805e11e4: 00893503 ld a0,8(s2) + 805e11f4: 00893503 ld a0,8(s2) context->total_len += bytes_to_copy * 8L; - 805e11e8: 00349713 slli a4,s1,0x3 - 805e11ec: 97ba add a5,a5,a4 + 805e11f8: 00349713 slli a4,s1,0x3 + 805e11fc: 97ba add a5,a5,a4 context->buffer_len += bytes_to_copy; - 805e11ee: 9526 add a0,a0,s1 + 805e11fe: 9526 add a0,a0,s1 context->total_len += bytes_to_copy * 8L; - 805e11f0: 00f93023 sd a5,0(s2) + 805e1200: 00f93023 sd a5,0(s2) context->buffer_len += bytes_to_copy; - 805e11f4: 00a93423 sd a0,8(s2) + 805e1204: 00a93423 sd a0,8(s2) data += bytes_to_copy; - 805e11f8: 9a26 add s4,s4,s1 + 805e1208: 9a26 add s4,s4,s1 input_len -= bytes_to_copy; - 805e11fa: 409989b3 sub s3,s3,s1 + 805e120a: 409989b3 sub s3,s3,s1 if(context->buffer_len == SHA256_BLOCK_LEN) - 805e11fe: 01650e63 beq a0,s6,805e121a + 805e120e: 01650e63 beq a0,s6,805e122a while(input_len) - 805e1202: fc0992e3 bnez s3,805e11c6 + 805e1212: fc0992e3 bnez s3,805e11d6 sha256->sha_data_in1 = context->buffer.words[i]; } context->buffer_len = 0L; } } } - 805e1206: 70e2 ld ra,56(sp) - 805e1208: 7442 ld s0,48(sp) - 805e120a: 74a2 ld s1,40(sp) - 805e120c: 7902 ld s2,32(sp) - 805e120e: 69e2 ld s3,24(sp) - 805e1210: 6a42 ld s4,16(sp) - 805e1212: 6aa2 ld s5,8(sp) - 805e1214: 6b02 ld s6,0(sp) - 805e1216: 6121 addi sp,sp,64 - 805e1218: 8082 ret - 805e121a: 01090713 addi a4,s2,16 + 805e1216: 70e2 ld ra,56(sp) + 805e1218: 7442 ld s0,48(sp) + 805e121a: 74a2 ld s1,40(sp) + 805e121c: 7902 ld s2,32(sp) + 805e121e: 69e2 ld s3,24(sp) + 805e1220: 6a42 ld s4,16(sp) + 805e1222: 6aa2 ld s5,8(sp) + 805e1224: 6b02 ld s6,0(sp) + 805e1226: 6121 addi sp,sp,64 + 805e1228: 8082 ret + 805e122a: 01090713 addi a4,s2,16 while(sha256->sha_function_reg_1.fifo_in_full) - 805e121e: 585c lw a5,52(s0) - 805e1220: 0087d79b srliw a5,a5,0x8 - 805e1224: 8b85 andi a5,a5,1 - 805e1226: ffe5 bnez a5,805e121e + 805e122e: 585c lw a5,52(s0) + 805e1230: 0087d79b srliw a5,a5,0x8 + 805e1234: 8b85 andi a5,a5,1 + 805e1236: ffe5 bnez a5,805e122e sha256->sha_data_in1 = context->buffer.words[i]; - 805e1228: 431c lw a5,0(a4) - 805e122a: 0711 addi a4,a4,4 - 805e122c: d01c sw a5,32(s0) + 805e1238: 431c lw a5,0(a4) + 805e123a: 0711 addi a4,a4,4 + 805e123c: d01c sw a5,32(s0) for(i = 0; i < 16; i++) - 805e122e: feea98e3 bne s5,a4,805e121e + 805e123e: feea98e3 bne s5,a4,805e122e context->buffer_len = 0L; - 805e1232: 00093423 sd zero,8(s2) - 805e1236: 4501 li a0,0 + 805e1242: 00093423 sd zero,8(s2) + 805e1246: 4501 li a0,0 while(input_len) - 805e1238: f80997e3 bnez s3,805e11c6 - 805e123c: b7e9 j 805e1206 - 805e123e: 8082 ret + 805e1248: f80997e3 bnez s3,805e11d6 + 805e124c: b7e9 j 805e1216 + 805e124e: 8082 ret -00000000805e1240 : +00000000805e1250 : { size_t bytes_to_pad; size_t length_pad; uint32_t i; bytes_to_pad = 120L - context->buffer_len; - 805e1240: 651c ld a5,8(a0) + 805e1250: 651c ld a5,8(a0) { - 805e1242: 7179 addi sp,sp,-48 + 805e1252: 7179 addi sp,sp,-48 bytes_to_pad = 120L - context->buffer_len; - 805e1244: 07800613 li a2,120 + 805e1254: 07800613 li a2,120 { - 805e1248: f022 sd s0,32(sp) - 805e124a: ec26 sd s1,24(sp) - 805e124c: f406 sd ra,40(sp) + 805e1258: f022 sd s0,32(sp) + 805e125a: ec26 sd s1,24(sp) + 805e125c: f406 sd ra,40(sp) if(bytes_to_pad > 64L) - 805e124e: 04000713 li a4,64 + 805e125e: 04000713 li a4,64 bytes_to_pad = 120L - context->buffer_len; - 805e1252: 8e1d sub a2,a2,a5 + 805e1262: 8e1d sub a2,a2,a5 { - 805e1254: 84aa mv s1,a0 - 805e1256: 842e mv s0,a1 + 805e1264: 84aa mv s1,a0 + 805e1266: 842e mv s0,a1 if(bytes_to_pad > 64L) - 805e1258: 00c77563 bleu a2,a4,805e1262 + 805e1268: 00c77563 bleu a2,a4,805e1272 bytes_to_pad -= 64L; - 805e125c: 03800613 li a2,56 - 805e1260: 8e1d sub a2,a2,a5 + 805e126c: 03800613 li a2,56 + 805e1270: 8e1d sub a2,a2,a5 length_pad = BYTESWAP64(context->total_len); - 805e1262: 6098 ld a4,0(s1) + 805e1272: 6098 ld a4,0(s1) return ((uint64_t)BYTESWAP(b) << 32) | (uint64_t)BYTESWAP(a); - 805e1264: ff010337 lui t1,0xff010 - 805e1268: 00ff08b7 lui a7,0xff0 + 805e1274: ff010337 lui t1,0xff010 + 805e1278: 00ff08b7 lui a7,0xff0 uint32_t a = (uint32_t)(x >> 32); - 805e126c: 42075593 srai a1,a4,0x20 + 805e127c: 42075593 srai a1,a4,0x20 uint32_t b = (uint32_t)x; - 805e1270: 2701 sext.w a4,a4 + 805e1280: 2701 sext.w a4,a4 return ((uint64_t)BYTESWAP(b) << 32) | (uint64_t)BYTESWAP(a); - 805e1272: 01871e9b slliw t4,a4,0x18 - 805e1276: 0087181b slliw a6,a4,0x8 - 805e127a: 01859e1b slliw t3,a1,0x18 - 805e127e: 0085951b slliw a0,a1,0x8 - 805e1282: 0087579b srliw a5,a4,0x8 - 805e1286: 0187569b srliw a3,a4,0x18 - 805e128a: 0085d71b srliw a4,a1,0x8 - 805e128e: 0185d59b srliw a1,a1,0x18 - 805e1292: f0030313 addi t1,t1,-256 # ffffffffff00ff00 - 805e1296: 0ff88893 addi a7,a7,255 # ff00ff <_start-0x7f5eff01> - 805e129a: 01c76733 or a4,a4,t3 - 805e129e: 8dc9 or a1,a1,a0 - 805e12a0: 0115f5b3 and a1,a1,a7 - 805e12a4: 01d7e7b3 or a5,a5,t4 - 805e12a8: 00d866b3 or a3,a6,a3 - 805e12ac: 00677733 and a4,a4,t1 - 805e12b0: 0067f7b3 and a5,a5,t1 - 805e12b4: 0116f6b3 and a3,a3,a7 - 805e12b8: 8f4d or a4,a4,a1 - 805e12ba: 8fd5 or a5,a5,a3 - 805e12bc: 1702 slli a4,a4,0x20 - 805e12be: 9301 srli a4,a4,0x20 - 805e12c0: 1782 slli a5,a5,0x20 - 805e12c2: 8fd9 or a5,a5,a4 + 805e1282: 01871e9b slliw t4,a4,0x18 + 805e1286: 0087181b slliw a6,a4,0x8 + 805e128a: 01859e1b slliw t3,a1,0x18 + 805e128e: 0085951b slliw a0,a1,0x8 + 805e1292: 0087579b srliw a5,a4,0x8 + 805e1296: 0187569b srliw a3,a4,0x18 + 805e129a: 0085d71b srliw a4,a1,0x8 + 805e129e: 0185d59b srliw a1,a1,0x18 + 805e12a2: f0030313 addi t1,t1,-256 # ffffffffff00ff00 + 805e12a6: 0ff88893 addi a7,a7,255 # ff00ff <_start-0x7f5eff01> + 805e12aa: 01c76733 or a4,a4,t3 + 805e12ae: 8dc9 or a1,a1,a0 + 805e12b0: 0115f5b3 and a1,a1,a7 + 805e12b4: 01d7e7b3 or a5,a5,t4 + 805e12b8: 00d866b3 or a3,a6,a3 + 805e12bc: 00677733 and a4,a4,t1 + 805e12c0: 0067f7b3 and a5,a5,t1 + 805e12c4: 0116f6b3 and a3,a3,a7 + 805e12c8: 8f4d or a4,a4,a1 + 805e12ca: 8fd5 or a5,a5,a3 + 805e12cc: 1702 slli a4,a4,0x20 + 805e12ce: 9301 srli a4,a4,0x20 + 805e12d0: 1782 slli a5,a5,0x20 + 805e12d2: 8fd9 or a5,a5,a4 sha256_update(context, padding, bytes_to_pad); - 805e12c4: 00000597 auipc a1,0x0 - 805e12c8: 7bc58593 addi a1,a1,1980 # 805e1a80 - 805e12cc: 8526 mv a0,s1 + 805e12d4: 00000597 auipc a1,0x0 + 805e12d8: 7bc58593 addi a1,a1,1980 # 805e1a90 + 805e12dc: 8526 mv a0,s1 length_pad = BYTESWAP64(context->total_len); - 805e12ce: e43e sd a5,8(sp) + 805e12de: e43e sd a5,8(sp) sha256_update(context, padding, bytes_to_pad); - 805e12d0: 00000097 auipc ra,0x0 - 805e12d4: ece080e7 jalr -306(ra) # 805e119e + 805e12e0: 00000097 auipc ra,0x0 + 805e12e4: ece080e7 jalr -306(ra) # 805e11ae sha256_update(context, &length_pad, 8L); - 805e12d8: 4621 li a2,8 - 805e12da: 002c addi a1,sp,8 - 805e12dc: 8526 mv a0,s1 - 805e12de: 00000097 auipc ra,0x0 - 805e12e2: ec0080e7 jalr -320(ra) # 805e119e + 805e12e8: 4621 li a2,8 + 805e12ea: 002c addi a1,sp,8 + 805e12ec: 8526 mv a0,s1 + 805e12ee: 00000097 auipc ra,0x0 + 805e12f2: ec0080e7 jalr -320(ra) # 805e11ae while(!(sha256->sha_function_reg_0.sha_en)) - 805e12e6: 502c0737 lui a4,0x502c0 - 805e12ea: 575c lw a5,44(a4) - 805e12ec: 8b85 andi a5,a5,1 - 805e12ee: dff5 beqz a5,805e12ea + 805e12f6: 502c0737 lui a4,0x502c0 + 805e12fa: 575c lw a5,44(a4) + 805e12fc: 8b85 andi a5,a5,1 + 805e12fe: dff5 beqz a5,805e12fa ; if(output) - 805e12f0: c00d beqz s0,805e1312 + 805e1300: c00d beqz s0,805e1322 { for(i = 0; i < SHA256_HASH_WORDS; i++) { *((uint32_t *)output) = sha256->sha_result[SHA256_HASH_WORDS - i - 1]; - 805e12f2: 4f5c lw a5,28(a4) - 805e12f4: c01c sw a5,0(s0) - 805e12f6: 4f1c lw a5,24(a4) - 805e12f8: c05c sw a5,4(s0) - 805e12fa: 4b5c lw a5,20(a4) - 805e12fc: c41c sw a5,8(s0) - 805e12fe: 4b1c lw a5,16(a4) - 805e1300: c45c sw a5,12(s0) - 805e1302: 475c lw a5,12(a4) - 805e1304: c81c sw a5,16(s0) - 805e1306: 471c lw a5,8(a4) - 805e1308: c85c sw a5,20(s0) - 805e130a: 435c lw a5,4(a4) - 805e130c: cc1c sw a5,24(s0) - 805e130e: 431c lw a5,0(a4) - 805e1310: cc5c sw a5,28(s0) + 805e1302: 4f5c lw a5,28(a4) + 805e1304: c01c sw a5,0(s0) + 805e1306: 4f1c lw a5,24(a4) + 805e1308: c05c sw a5,4(s0) + 805e130a: 4b5c lw a5,20(a4) + 805e130c: c41c sw a5,8(s0) + 805e130e: 4b1c lw a5,16(a4) + 805e1310: c45c sw a5,12(s0) + 805e1312: 475c lw a5,12(a4) + 805e1314: c81c sw a5,16(s0) + 805e1316: 471c lw a5,8(a4) + 805e1318: c85c sw a5,20(s0) + 805e131a: 435c lw a5,4(a4) + 805e131c: cc1c sw a5,24(s0) + 805e131e: 431c lw a5,0(a4) + 805e1320: cc5c sw a5,28(s0) output += 4; } } } - 805e1312: 70a2 ld ra,40(sp) - 805e1314: 7402 ld s0,32(sp) - 805e1316: 64e2 ld s1,24(sp) - 805e1318: 6145 addi sp,sp,48 - 805e131a: 8082 ret - -00000000805e131c : - 805e131c: 00a5c7b3 xor a5,a1,a0 - 805e1320: 8b9d andi a5,a5,7 - 805e1322: 00c50733 add a4,a0,a2 - 805e1326: e781 bnez a5,805e132e - 805e1328: 479d li a5,7 - 805e132a: 00c7ee63 bltu a5,a2,805e1346 - 805e132e: 87aa mv a5,a0 - 805e1330: 0ae57063 bleu a4,a0,805e13d0 - 805e1334: 0005c683 lbu a3,0(a1) - 805e1338: 0785 addi a5,a5,1 - 805e133a: 0585 addi a1,a1,1 - 805e133c: fed78fa3 sb a3,-1(a5) # 502bffff <_start-0x30320001> - 805e1340: fee7eae3 bltu a5,a4,805e1334 - 805e1344: 8082 ret - 805e1346: 00757693 andi a3,a0,7 - 805e134a: 87aa mv a5,a0 - 805e134c: ca91 beqz a3,805e1360 - 805e134e: 0005c683 lbu a3,0(a1) - 805e1352: 0785 addi a5,a5,1 - 805e1354: 0585 addi a1,a1,1 - 805e1356: fed78fa3 sb a3,-1(a5) - 805e135a: 0077f693 andi a3,a5,7 - 805e135e: b7fd j 805e134c - 805e1360: ff877693 andi a3,a4,-8 - 805e1364: fc068613 addi a2,a3,-64 # ffc0 <_start-0x805d0040> - 805e1368: 06c7f063 bleu a2,a5,805e13c8 - 805e136c: 0005b383 ld t2,0(a1) - 805e1370: 0085b283 ld t0,8(a1) - 805e1374: 0105bf83 ld t6,16(a1) - 805e1378: 0185bf03 ld t5,24(a1) - 805e137c: 0205be83 ld t4,32(a1) - 805e1380: 0285be03 ld t3,40(a1) - 805e1384: 0305b303 ld t1,48(a1) - 805e1388: 0385b883 ld a7,56(a1) - 805e138c: 04858593 addi a1,a1,72 - 805e1390: 0077b023 sd t2,0(a5) - 805e1394: ff85b803 ld a6,-8(a1) - 805e1398: 0057b423 sd t0,8(a5) - 805e139c: 01f7b823 sd t6,16(a5) - 805e13a0: 01e7bc23 sd t5,24(a5) - 805e13a4: 03d7b023 sd t4,32(a5) - 805e13a8: 03c7b423 sd t3,40(a5) - 805e13ac: 0267b823 sd t1,48(a5) - 805e13b0: 0317bc23 sd a7,56(a5) - 805e13b4: 04878793 addi a5,a5,72 - 805e13b8: ff07bc23 sd a6,-8(a5) - 805e13bc: b775 j 805e1368 - 805e13be: 6190 ld a2,0(a1) - 805e13c0: 07a1 addi a5,a5,8 - 805e13c2: 05a1 addi a1,a1,8 - 805e13c4: fec7bc23 sd a2,-8(a5) - 805e13c8: fed7ebe3 bltu a5,a3,805e13be - 805e13cc: f6e7e4e3 bltu a5,a4,805e1334 - 805e13d0: 8082 ret - 805e13d2: 0000 unimp - 805e13d4: 0000 unimp + 805e1322: 70a2 ld ra,40(sp) + 805e1324: 7402 ld s0,32(sp) + 805e1326: 64e2 ld s1,24(sp) + 805e1328: 6145 addi sp,sp,48 + 805e132a: 8082 ret + +00000000805e132c : + 805e132c: 00a5c7b3 xor a5,a1,a0 + 805e1330: 8b9d andi a5,a5,7 + 805e1332: 00c50733 add a4,a0,a2 + 805e1336: e781 bnez a5,805e133e + 805e1338: 479d li a5,7 + 805e133a: 00c7ee63 bltu a5,a2,805e1356 + 805e133e: 87aa mv a5,a0 + 805e1340: 0ae57063 bleu a4,a0,805e13e0 + 805e1344: 0005c683 lbu a3,0(a1) + 805e1348: 0785 addi a5,a5,1 + 805e134a: 0585 addi a1,a1,1 + 805e134c: fed78fa3 sb a3,-1(a5) # 502bffff <_start-0x30320001> + 805e1350: fee7eae3 bltu a5,a4,805e1344 + 805e1354: 8082 ret + 805e1356: 00757693 andi a3,a0,7 + 805e135a: 87aa mv a5,a0 + 805e135c: ca91 beqz a3,805e1370 + 805e135e: 0005c683 lbu a3,0(a1) + 805e1362: 0785 addi a5,a5,1 + 805e1364: 0585 addi a1,a1,1 + 805e1366: fed78fa3 sb a3,-1(a5) + 805e136a: 0077f693 andi a3,a5,7 + 805e136e: b7fd j 805e135c + 805e1370: ff877693 andi a3,a4,-8 + 805e1374: fc068613 addi a2,a3,-64 # ffc0 <_start-0x805d0040> + 805e1378: 06c7f063 bleu a2,a5,805e13d8 + 805e137c: 0005b383 ld t2,0(a1) + 805e1380: 0085b283 ld t0,8(a1) + 805e1384: 0105bf83 ld t6,16(a1) + 805e1388: 0185bf03 ld t5,24(a1) + 805e138c: 0205be83 ld t4,32(a1) + 805e1390: 0285be03 ld t3,40(a1) + 805e1394: 0305b303 ld t1,48(a1) + 805e1398: 0385b883 ld a7,56(a1) + 805e139c: 04858593 addi a1,a1,72 + 805e13a0: 0077b023 sd t2,0(a5) + 805e13a4: ff85b803 ld a6,-8(a1) + 805e13a8: 0057b423 sd t0,8(a5) + 805e13ac: 01f7b823 sd t6,16(a5) + 805e13b0: 01e7bc23 sd t5,24(a5) + 805e13b4: 03d7b023 sd t4,32(a5) + 805e13b8: 03c7b423 sd t3,40(a5) + 805e13bc: 0267b823 sd t1,48(a5) + 805e13c0: 0317bc23 sd a7,56(a5) + 805e13c4: 04878793 addi a5,a5,72 + 805e13c8: ff07bc23 sd a6,-8(a5) + 805e13cc: b775 j 805e1378 + 805e13ce: 6190 ld a2,0(a1) + 805e13d0: 07a1 addi a5,a5,8 + 805e13d2: 05a1 addi a1,a1,8 + 805e13d4: fec7bc23 sd a2,-8(a5) + 805e13d8: fed7ebe3 bltu a5,a3,805e13ce + 805e13dc: f6e7e4e3 bltu a5,a4,805e1344 + 805e13e0: 8082 ret + 805e13e2: 0000 unimp + 805e13e4: 0000 unimp ... diff --git a/build/bootloader_hi.elf b/build/bootloader_hi.elf index 75a26fd6975a965112422c94ef935178e9a97143..10d54870dc29007236d59e7407b4d9f378437ed6 100755 GIT binary patch delta 39361 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 literal 95600 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 JAkx|L{|_7+Y6JiP diff --git a/build/bootloader_lo.elf b/build/bootloader_lo.elf index 95373c783cf9e0f712ae97b83b6511a20ab99107..9d9de989b94a9feb86f3f0e0622c3a98ca16e2fd 100755 GIT binary patch delta 6171 zcmZvgd2|$27RFy~>2656U#RSakN{HbftaI_B?Lr7AOvMo0>nTNq9MT$Jt#_pxZsA& zvWG4%g9K0zVUENR#C662QO9uuw*gTW6&acDtJL+6IdBe@e!sf!-TU2l->vFi z^q8^yQDb>GbNPrDdW>rqKNV9dxqVcr`|$t&|CwQDMOY~_9C|KUDa&?h>zgog5`@}* ztquMdNn=u!vPZzc?3q=CB}^kc8pt%Aac%i0WWa|#m#89p5e@9nMwr{{9aW*s+U&ky z_DFija>wy=BW$g{X-)X-tRi^c0T`He2RLgk53 zZgxdi8>q97lEd?6HY)oZf1pDP7^>$F(n9B^V$j_mWQ9ILsCG|(kQ+M11$z5~{80Zy zvs+aASOn;N9~Fn5urRp5AC!bzkT`pQKNuMD5S%^8AC!ewB0u(Ee=sauI|FeH@dqP9 z`zh)|e=s`Kj@~Zv2V+A^6Jye{U_ zp@m5pjPnOShy09A@CT+K07hG-_oH~6$pYFaeJR7O z6cACmnHEz7gq6M)u{l!(gp^Jpm?j`e>AE&5uAC|%j?%X>kSha#eNd@mxooxJ-9)8v zU+HW^_rX1Vj7qN#jHxui+1CVsO8-Qqbz%Xbuh3$SSU_m}2P&-(2$gX>qLpC|y8djRK%_9m>v`Cjd%)T}=T%#i`Wm8Oe1<+^fN+#qRNi-DKzt+|<8N z*uub?!dB8aF4G~5eZyHK77*4#i^XCAVW+94`s1DO&WaNo%dxr()FD&-;{8eRiq>Ir*0?tEtGe8i*Ya<9IS>4@nDChRvsZvyBfwI+h;CKf3=&`lMQsECF{sqZ z6l|KFiSmstK-O(1V(Mv_sh4mM+RAK{i(hTY0qDrttC;f?)9VfUSUNP=PMWFbgX(-9 zs0pxRb3w*>-FZ3fkJ5`b!(&ow#=K(#GkWL*TH z*gmJabIfQjzyBDhwu`vQUBv{|mO~Ry0IF?fBClgXyen}J!KkPbPV6ZF4@O0cUII{1 z!&vLR1)!joP*NWOD5%*4g#u7e3%O`t0rF!;ZC zu0cext8lTM0j5613OGUsg92l|Bb;Ffr2?=u_c7|h0+8mNJmv8+A;?(|CVq$j95=rR zhXw%VD)kdad7{SZc)dNK+_&t^f54vfR_=<@WI3&8p~Aj%md0EydcqhOs1 zA-)4v!&uV`VaeEF2)3O`rrt&e!|C7(F@}Q{ik>V04we&C3V;J&z!U*o{~g9K)%0d@ z{oC8ZzwOkR`e!<5V1BO(tTon~$~v1RfYS>|W}DvYoNi%YI}N737(wg)ymhS@WALfovjZ` z`UL^#Y#;DYZWMsd_9`_tOQT?COQy*tF+peh7c;b306N!M=fI z@sa>^y*0V|0a1^2#Vnh1KBPBZO`A|R|KH#`MbFz00>H@u4Jq` zO|OZ&c@hKL`J1VCayM^fwsy;G?B+BExhDW|1KU~3*>8vmwsQ$%+A9EU&p+^Q1|XLn z2XU3ROs^6?V%6Ae+j-yALtJ>=!tC#p+39+GgCWcPj!^DWo^YVQ7> zqfV_((_EY9tc#V&Z?jo$G54vfmBp`ux$as%IlEbz{3e(0ZsVwjmC5fzUEDO*XfG>= zUuU|x=dw%mv2yr5qL=Hx8TPf}*?dpz>vmw*DYCNp-dF6_Gn2(u2Hycn+=U#SXJznl zJkY(E%am9de0G+(%XqK9mB9zyFt;r$a-fyL2iFL9J@1uT8GP)FcJJc6GAn}*iLq`i zcXO!a#@W)xyE9mg!z`Em_j30)CV04&#q&GGtz{=2VYTPky3+M4d!&`gGOuy{vL0<^ zvf^gDCwXkgSXnHfI(H>=IJPy1bKMrYzpQoC+BUs5eFKY-aGQzJTVR1*E_wYo{n9|7hi(4(;NfeCi_&>tNIbHw& delta 6292 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 diff --git a/build/kboot.kfpkg b/build/kboot.kfpkg index b3a723e600e78107d2e0d289d6a1c85e9a3b4304..4033cd148af24e4618bf20eb82e250d4a32668ee 100644 GIT binary patch delta 4957 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 diff --git a/src/bootloader_hi/README.md b/src/bootloader_hi/README.md index b7e29fc..4afbe7a 100644 --- a/src/bootloader_hi/README.md +++ b/src/bootloader_hi/README.md @@ -48,13 +48,12 @@ The following SPI Flash layout must be used when using **Kboot* | From | To | Length | Comment | | ---: | ---: | ---: | :--- | -| `0x00000000` | `0x0000FFFF` | 64K | **Kboot** application code | -| `0x00010000` | `0x0001FFFF` | 64K | reserved for future use | -| `0x00020000` | `0x00020FFF` | 4K | main **boot configuration** sector | -| `0x00021000` | `0x00021FFF` | 4K | backup **boot configuration** sector | -| `0x00022000` | `0x0002FFFF` | 56K | reserved, user data etc. | -| `0x00030000` | `0x0007FFFF` | 320K | **default application** code | -| `0x00080000` | `Flash end` | --- | user area, application(s) code, file system(s), user data etc. | +| `0x00000000` | `0x00003FFF` | 64K | **Kboot** application code | +| `0x00004000` | `0x00004FFF` | 4K | main **boot configuration** sector | +| `0x00005000` | `0x00005FFF` | 4K | backup **boot configuration** sector | +| `0x00006000` | `0x0000FFFF` | 40K | reserved | +| `0x00010000` | `DEF_END` | --- | **default application** code | +| `DEF_END` | `Flash end` | --- | user area, application(s) code, file system(s), user data etc. |
diff --git a/src/bootloader_hi/main.c b/src/bootloader_hi/main.c index 947a7f1..5dbdbd8 100644 --- a/src/bootloader_hi/main.c +++ b/src/bootloader_hi/main.c @@ -98,6 +98,7 @@ static uint32_t *cfg_flash_ptr = (uint32_t *)(SPI3_BASE_ADDR+BOOT_CONFIG_ADDR); static uint8_t *cfg_flash_bptr = (uint8_t *)(SPI3_BASE_ADDR+BOOT_CONFIG_ADDR); static uint32_t i = 0; +static uint32_t boot_entry = 0; static uint32_t cfg_offset = 0; static uint32_t offset = 0; static uint8_t key = 0; @@ -341,7 +342,7 @@ int main(void) boot_pin = gpiohs_get_pin(GPIO_KEY); } - LOG("\nK210 bootloader by LoBo v.1.4.1\n\n"); + LOG("\nK210 bootloader by LoBo v.1.4.2\n\n"); LOG("* Find applications in MAIN parameters\n"); @@ -365,9 +366,9 @@ int main(void) // Valid size LOG("@ 0x%08X, size=%u, ", cfg_address, cfg_size); /* - * Basic check passed, now we can check the application's vilidity + * Basic check passed, now we can check the application's validity * If in interractive mode, all applications are checked, - * otherwize, the application is checked only if flagged as active + * otherwise, the application is checked only if flagged as active */ if ((cfg_magic & CFG_APP_FLAG_ACTIVE) || (boot_pin == 0)) { // ** Check if valid application @@ -391,7 +392,7 @@ int main(void) app_flash_start = cfg_address; } if (boot_pin > 0) { - // Active application found and cheched and not in interractive mode + // Active application found and checked and not in interractive mode LOG("ACTIVE\n"); break; } @@ -409,10 +410,10 @@ int main(void) } // check if any valid application was found - for (i = 0; i < BOOT_CONFIG_ITEMS; i++) { - if (available_apps[i]) break; + for (boot_entry = 0; boot_entry < BOOT_CONFIG_ITEMS; boot_entry++) { + if (available_apps[boot_entry]) break; } - if ((app_flash_start == DEFAULT_APP_ADDR) && (i >= BOOT_CONFIG_ITEMS)) { + if ((app_flash_start == DEFAULT_APP_ADDR) && (boot_entry >= BOOT_CONFIG_ITEMS)) { // No valid application found if (cfg_offset == 0) { // no valid entry found in main config sector, check the backup one @@ -456,6 +457,7 @@ int main(void) // get application's size and address in Flash app_size = flash2uint32(cfg_address+1); app_flash_start = cfg_address; + boot_entry = char_in; char_in += 0x30; break; } @@ -475,8 +477,10 @@ int main(void) if ((app_size >= MIN_APP_FLASH_SIZE) && (app_size <= MAX_APP_FLASH_SIZE)) { cfg_size = app_size; cfg_address = app_flash_start; - // Check default application - if (app_sha256()) key = 0; + // Check default application if no app selected + if ((boot_entry < BOOT_CONFIG_ITEMS) || app_sha256()) { + key = 0; + } } if (key) { // Check failed