From edb21f2e94d11d367a54f12c0b576d0ceb3f7481 Mon Sep 17 00:00:00 2001 From: vhaudiquet Date: Sun, 30 Aug 2026 00:22:09 +0200 Subject: [PATCH] stub: render failure dump as giant hex digits Round 8: the Round-7 bit-band dump was visible at the L0_ADDR scanout (both the scanout substitution and the render path work), but 32 coarse squares per row proved unreadable from a photo. Replace the rendering with giant hex digits: one u32 per line, 8 digits of a 3x5 font scaled x10 (30x50 px), white on the black background depthcharge left. Readable in any panel orientation, transcribable as text. Same data and markers as before; word 15 still carries the raw OVL_L0_ADDR value. Payload 10760e3c... flashed and verified. --- RESEARCH.md | 15 ++++++++ krane-fb-stub-payload.bin | Bin 159744 -> 159744 bytes krane-fb-stub.bin | Bin 18912 -> 18976 bytes main.c | 73 ++++++++++++++++++++++++++------------ 4 files changed, 66 insertions(+), 22 deletions(-) diff --git a/RESEARCH.md b/RESEARCH.md index 5b35082..803f0ca 100644 --- a/RESEARCH.md +++ b/RESEARCH.md @@ -385,6 +385,21 @@ The OVL register READ is device-only (qemu -M virt aborts on reads to unassigned MMIO; qemu never takes the failure/substitution path, so the test is unaffected). +## Round 8 — hex-digit diagnostic dump + +The bit-band dump WAS visible at the L0_ADDR scanout (proving both the +scanout substitution and the render path), but 32 coarse squares per row +proved unreadable from a photo, and the apparent row/column confusion +made transcription unreliable. The dump rendering is replaced with +**giant hex digits**: one u32 per line, 8 digits of a 3x5 cell font +scaled x10 (30x50 px), MSB nibble first, white on depthcharge's black +background. Readable in any panel orientation, transcribable as text. +Same data, same markers (`0xC0DE0001` DTB stage, `0xC0DE0002|rc` LBIO +stage, word 15 = raw OVL_L0_ADDR value). + +Payload `10760e3c…` flashed (cmp + vbutil OK). host_test and qemu_test +pass. + Recovery: power-cycle, boot USB (unchanged), `dd if=mmcblk0p1-pmos-backup.img of=/dev/mmcblk0p1 bs=4M conv=fsync`. diff --git a/krane-fb-stub-payload.bin b/krane-fb-stub-payload.bin index 866cde483c246f9ddce1cd7cecd88fcd46c551a9..7ba97d57c094486b03e666cc88a488d353cf11de 100644 GIT binary patch delta 1301 zcmX|92~bm46umG1XJJvY2&7^)AQGVJ7;ywQh(xggwGx7{GAfG;G%f?!k%*eFprb|{ zzFXAP`QE`+zY0kFAf1_<(_uzEoA42Wr)&!G=p(%gX=re2AHe%5W?>W**(>pToX^kM ze=#bxV`o%mKjYFSzx9bK>Bj-jQ|jD8zZ4B(BeqrmLtomU}N!clUcds@>N1Fd`{GYh|%!oxW34o9do@vwh;?x*66B zW3qWw19!^~?Mn~;RJ#7pEzNxvUUZ$Hzfp>v(pKv$$mWpX)1#M|*MC)w8aDSg9Uz~C z1>KzpXjIj$UN|Msz2{-NIBiqLBoT+dSD?*FF0|@N^mUG34X9rmOZ=AjdHvdob>`(FAn0w-u4v z1Bb6@0Ut6toysjj$h3uliC_^{21Zz;fhYwatQZ4yf$7N&zy)$EwFyUJ$pFRH2&jMLO*Fm(7*?xd;~yhqII<#Kxx|pCL0E!e1Jj^1CR3%2o11}xXJg|K#cuKWr zu;R0ESxVaB0na(jVBmCcuXL zX>OrbvQPqQq0X_;Dx5%|r21LNfTmF=*eDrwQ-f?IW{AX;fP)q?QpHpp2Q5ZM>KF%w zBU^nV2Sp;JrN-URgOKKNClx?Hu`LhCZj2F%(fC_>=Hf2w(hyyBl*1hfPz}ZOKxv{q zxzy|z+2*YKNoLKkMv*m~YtDU@J1iG#h6OJ)y&C$rV^T^ThrIEZr$*=1=f|O?Z@!W; G=KTvyF%$^^ delta 1198 zcmY*X3rtgI6h5c7?JX~PbcjmGKwjb#0rA1ZN(BO_4Cn~P8LJ>e*i>Mdd!|=G2^J+4 z*#)Ab;1nqM!1AgNf#IB+58w)On;U5@T|v}E%8RBr>Fp@J z-Ie76#ftY!!;kC`WsgU5YZZ#rrCz~v$pLf(%n8+vutv*nj^@sl>6u*SKdU`x}t zk=Dq2-laLiclK&-+%T@(Qd##z&g=Q|xisDP@rkNx|AVJ}=7$EKfAG>${;V~{r|8gS zUA%kpR9RzNLuz`gVO;x4sXM?9$)lR;d3kOJGi8e8*oR#mS57#XX1t@F4h z&etl6!ZLr5ba&*&eL8U5w2&%}eMV&TQr}Nkb>2GjXxOUTx~JTnuDlfI;Z#|5KRfI4 z#~-mvbeX2hqrrPy#Y5#whATX*g)`3a4b6?~3qO~Bvg67%OY!1&^At>rC|#*&7j!)< zZ9OzlbNJ8Sb$5ArPp@V#v5u|`OIAkoY`m6sMlpR+Rh{DD?5Js0R;PToL%m%)x=#9` zca^`PEpQdn;?A_beQs-3NJ-&1dD8f@p-i0mXlK&K2fl-K0at6&kIC1+6Zor1YxK$P zp7kv<5UWcPHRgR85zzw! z#_RlVehRPGt|kX&DY6{|@xoxBAd?f6__e{MxaQ2SdL zf(sJ#T)x-^;0-SRyYvZk4PqD>sHz1}d3BB;N_nxY6o-sbP)!hoW{gAaXNMb2Qsg{> z$vT#m?OFi&dNJrIA;s_riirWL27qF+0F?eY@-A=z)lqsk9|Q3TUCKvK_gnxSK>d`^ z7WEM$a(if7M$d62l+z=8^cAS>{-Z1upr-<;`Y945Twj+P3y_xpATuX({k>-yhv4Ik z1k_Vb)KP|%1S*$t++IMXI_rDfp7)$OCCoU&tl+e#1gS9*4w`X-O7%mDt{&zo^@O9Q z*zfkDVt|5TC|_hCKtlje^`2Zd{{|`nz!?ur+oR{?Y$IK-*a||Ey4O6V_8of`5X=tFkg%~eVBgkxbrbQ&G z(T{E-QI5N5dl3fm)B$v;2*Y`g1L!;vZa^RUf(X~5ymM59(TF9qmp$GIx;@9zi-Ahj z7lFz^@RkxB@8>jIZsWEZa=1aeI-nSJw7&ypYQsrFLN_O&JAWwAGooD*NQAiXu8T7=BqUbWjnF)OBcnce_?{nl{|ruv2ehXg*oFU| ztNo84p0ic!N6M`A`WT=em_FSm`3uq1MI&S9nnFc?lg9opx-I|#LxgsyvEg;L*r|6u5{yaVcO zvZyZ4n<~g?x+$aMZ9QV@7)tuO#G-df(b4XKIwqrGeA5g*Q_(S}qM@r`1{)OUEv@*T z`6UkGV#`Hrnr7unB{qyo-v-H8$_bt@&6lk*!kM3DaG{txMDEzi1uy2$h5wl;Uf)ByrHPE0Mr$)sj9)5wM`?b-=J3oG%n{=T zbOtT3Uw{N&ZF#kVOIzMFAF}nh`lBNUS1&FOESz18C(3rh<|K(7LYx1JDo=mVp4uIV)RuK>)3k-C;;;nt9E;5*U|yJ>5+Y`gVJ)4 zb(xO;FBhz19DKfFBd#;~kOD^atf{Rbon4x78+)hRIGjoopLFebEZd{&fXS1)y<+Hl zaeCUiG2tH9+BatBHd$ltGvmn!#S8Oj&U$QDE)!X4&j5Ebc-&rM$T1kA^AKCBA#wrv zanN{qS$}e1DI@?ZTZB+BO)f9*bAWhgJPx)lq7ZADwb-`hO|T54E^qYp>l_H)~Qe5BM-vs;Jak zS@K<@l00EvYH$dt+QgEZ4n<_xO4Ep(uwsT2m9MOm#;2%Ux6V*l9<)zUdf~c#j_9F$ t+VFu^ 30x50 px */ + +static const u16 hexfont[16] = { + 0b111101101101111, /* 0 */ + 0b010110010010111, /* 1 */ + 0b111001111100111, /* 2 */ + 0b111001011001111, /* 3 */ + 0b101101111001001, /* 4 */ + 0b111100111001111, /* 5 */ + 0b111100111101111, /* 6 */ + 0b111001001010010, /* 7 */ + 0b111101111101111, /* 8 */ + 0b111101111001111, /* 9 */ + 0b111101111101101, /* A */ + 0b100100111101111, /* b */ + 0b111100100100111, /* C */ + 0b001001111101111, /* d */ + 0b111100111100111, /* E */ + 0b111100111100100, /* F */ +}; + +static void fill_rect(u32 base, u32 x, u32 y, u32 w, u32 h, u32 c) +{ + volatile u32 *fb = (volatile u32 *)(u64)base; + for (u32 yy = 0; yy < h; yy++) { + volatile u32 *row = fb + (u64)(y + yy) * DIAG_FB_WIDTH + x; + for (u32 xx = 0; xx < w; xx++) + row[xx] = c; + } +} static void render_diag(u32 base, const u32 *d, int n) { - volatile u32 *fb = (volatile u32 *)(u64)base; + const u32 S = DIAG_DIGIT_SCALE; for (int i = 0; i < n; i++) { - u32 y0 = 40 + (u32)i * 64; - if (y0 + 32 > 1920) + u32 y0 = 30 + (u32)i * 70; + if (y0 + 50 > 1920) break; - for (u32 b = 0; b < 32; b++) { - u32 c = ((d[i] >> (31 - b)) & 1) ? 0x00FFFFFFu - : 0x00000000u; - for (u32 yy = 0; yy < 32; yy++) { - volatile u32 *row = fb + - (u64)(y0 + yy) * DIAG_FB_WIDTH + b * 32; - for (u32 xx = 0; xx < 32; xx++) - row[xx] = c; - } + for (u32 j = 0; j < 8; j++) { + u32 nib = (d[i] >> (28 - 4 * j)) & 0xF; + u16 g = hexfont[nib]; + u32 x0 = 40 + j * 4 * S; + for (u32 gy = 0; gy < 5; gy++) + for (u32 gx = 0; gx < 3; gx++) + if ((g >> (14 - gy * 3 - gx)) & 1) + fill_rect(base, + x0 + gx * S, + y0 + gy * S, + S, S, 0x00FFFFFFu); } } } @@ -363,9 +395,6 @@ static void fail_dump(u32 marker, const u32 *words, int n) render_diag(l0, diag, 16); halt(); } - -/* ---- main checkpoint sequence ------------------------------------------- */ - static void checkpoint(const struct fbinfo *f, int r, int g, int b) { fill_screen(f, mkcolor(f, r, g, b));