From 7368329c160bf3f96421715434fe7429f27a0309 Mon Sep 17 00:00:00 2001 From: Luxferre Date: Thu, 18 Jun 2026 19:34:05 +0300 Subject: [PATCH] added ebreak support --- Makefile | 5 +++++ README.md | 2 +- amach.awk | 6 +++--- rv32imac_tests.bin | Bin 17940 -> 17940 bytes rv32imac_tests.s | 6 ++++++ 5 files changed, 15 insertions(+), 4 deletions(-) diff --git a/Makefile b/Makefile index c5746db..a50667d 100644 --- a/Makefile +++ b/Makefile @@ -15,6 +15,11 @@ rv32imac_tests.bin: rv32imac_tests.elf run: rv32imac_tests.bin $(EMULATOR) rv32imac_tests.bin + @echo "Testing standard ebreak..." + @echo "115 0 16 0" | awk -f amach.awk 2>&1 | grep -q "Fatal: EBREAK" + @echo "Testing compressed c.ebreak..." + @echo "2 144" | awk -f amach.awk 2>&1 | grep -q "Fatal: EBREAK" + @echo "All EBREAK tests PASSED!" clean: rm -f rv32imac_tests.elf rv32imac_tests.bin diff --git a/README.md b/README.md index 359c27b..172a61b 100644 --- a/README.md +++ b/README.md @@ -32,7 +32,7 @@ POSIXLY_CORRECT=1 awk -f amach.awk [-v LVA=...] -- path/to/program.dec ## Support -Currently, A-machine only supports the **unprivileged** RV32IMAC instruction set with a few additional `ecall` syscalls: 63 (sys_read, for fd 0 only), 64 (sys_write, for fd 1 and 2 only) and 93 (sys_exit). For completeness, `fence` instruction is also supported but yields a no-op. +Currently, A-machine only supports the **unprivileged** RV32IMAC instruction set with a few additional `ecall` syscalls: 63 (sys_read, for fd 0 only), 64 (sys_write, for fd 1 and 2 only) and 93 (sys_exit). For completeness, `fence` instruction is also supported but yields a no-op, and both `ebreak` and `c.ebreak` are supported to halt execution with a debug message. ## Plans (from higher to lower priority) diff --git a/amach.awk b/amach.awk index ca39d04..fa3a712 100644 --- a/amach.awk +++ b/amach.awk @@ -170,6 +170,7 @@ function amach_imm(opcode, f3, rd, rs1, immval, r1, ur1, shamt) { pc = r1 + immval } else if(opcode == 115) { # 0x73, system call / csr if(immval == 0) handle_ecall(getreg(17), getreg(10), getreg(11), getreg(12), getreg(13), getreg(14), getreg(15)) + else if(immval == 1) trapout(sprintf("EBREAK at 0x%X", pc-4)) else trapout(sprintf("Unimplemented external system call at 0x%X", pc-4)) } else trapout(sprintf("Illegal instruction at 0x%X", pc-4)) } @@ -317,9 +318,8 @@ function amach_comp(instr, op, f3, b12, r11_7, r9_7, r6_2, r4_2, shamt, imm, ba } else setreg(r11_7, getreg(r6_2)) # C.MV } else { if(r6_2 == 0) { - if(r11_7 == 0) { # C.EBREAK - trapout(sprintf("EBREAK at 0x%X", pc-2)) - } else { # C.JALR + if(r11_7 == 0) trapout(sprintf("EBREAK at 0x%X", pc-2)) # C.EBREAK + else { # C.JALR imm = getreg(r11_7) setreg(1, pc) pc = imm diff --git a/rv32imac_tests.bin b/rv32imac_tests.bin index 1b576fae021d33adba49252f7e6da7a4389f7f16..0ce71c1801281d03b2845f0558f7513c2a7e6878 100755 GIT binary patch delta 3485 zcmZXVe{56N700ig*a;-}4Zfu#r>d;8%4p}M^owBlw{UA0g3zQAU&h@o@ z9q+&B^FHT$&%M6q=I9~a(L=gmlce1TjS{nQP8YX%pF6x!m7@RRWZ+TUCT~3)^w9Y@ zBh5zQkK2NWZ?;R?Ke!?jEb4@fI#mk)g(HGU-V8yVN)4Y0D*`uk?Ns|zkRUYc+ok9y zqRjhcIHd0?p1;aa^WEFG&BnWIfiJ-=#J-O*a1r80cqYd~otKjVh$1kNgNs~B5Z?LQMz5ZVpxl5Z;M%wSR; z95;BVc8W{v0I|%_Ex9L>l0R-Ed%pTJ6mH{$ zGN~AD74}J%r-Vcb!An&-xiu&O=@Y1q<6dw-iG`HWn&bV$*QocIglvTFp&S9)mlS4ngyF3-U5 zN|b({EW>QqD{uuRdx#^vA}A>(cqh+tf)`MBy##wpJk)(gpc%M|lJCc&%=JxZT!o`^ zlB2bWqywvPbdGZpVM#r3ok?SvN$X0nrz4CcUP#%6zga2v^iF2djnZz@;+qNS-06C= zanEViY1?BRQuu%fb2Y>9$2`}VcX7fF z-Bk$>P@3GCnbcF>A%zA7ajk^+$~`pvd}dOPwTF%-$Co9|z;;9qmdwBu*l*eKr2Vo^&#j>DAp*uUk0sE|4o)CBr6;@BtsClYw@Nh==U7+XZKZ7c3wyHu99LeQp~w1xyW=IZg955!3jZrX4p z>`P@Fok|=D8xMZE0{`XQixaO3?^SkDXBoq0BfimCo>$dI7guJI{;F=eXyRl%vFT}a zLdh9tRT0Qhx}{LQsFE9CKxvhBd6LM_Ar6c(%HWTJ8!9 zr@R^m@}HR`&+abpEyOgl(XVG+_uIRR!helv%};!7kJ)IfjFYnvvOhHk>Eu!L2!sUB%%n4#PkbJst(~?sOe;Cs?sk05KT?~CH{6xYCrPl@8)VoaE z{aj`XzDqG}cVDLnxF+o6v3?>*i`)K|eMtlM-^4V#8W8nSVYB)iGo=u!t*8!Nh-r1I zAuV=(yi_#Ph2O&$wW}592QjTweOQ^=l4CYooP`Z_6-wwFyAZy#M=xi4Q}70Q_Gxw@ zrqbTRrED(%7wRe%?S1B1)85ofw$}-|dZl{u4D-TkQvG%QGTU4D05;cGDV9?)O{c!p zloA)tXNv&{)GJE(M=bDg+6zo)dk(mYp7SKj+mK$^@qV^93#AQK#eE{CeO0|*om$s% z=KsB~H#}Y!Jtju`hm9$FYBJmIgr7DvG`dI8-ZR*X&*iH$ojo)z?5chI!YrJC{Ki@( z6lB}_xIPse_<>Nl=zyNaO1mMz24`IVT2;z)jAfg%aICRT3BAb@-%5K!N3uN%^Np2? zU1OvDur{6dPPR7-b&iUW@V=P#n(9k?^z95U@%r^1h?BYEu_{7f|7YLNnbhMmZnN^2 z(YYW0Ht}yS9OT~y%J?_KzBm~uO4fake;Y3?F|ZePek4xDDSm6f(5eGD6MC}Ul%wY# k!{5aP3vkj23GTi0LWnvi2wiq delta 3395 zcmZXVe{56N6~~`#?1Uuu-&s%%Y-1bju858>=N6u^(h|#VoZ_tHD^twi26-8dikL&h>rv z4bESQKKFCJ@4Wl&xjsIwJ3g+9tP_o2f=UF7>6$KWOYAthSrPqTFf#NoZHoktMm%IB zO-ZLo2&Zk*(VK43_&HM~0gJZ6W}PCs{=txdDB^~QP9f@bZu#Jb&P|M;aUwyd-Yxn+ z=4FXa7}xh#j9jIt^X~227Smn&fXCq$;>`RKT#mR6wi-Mn_IoV=kq=H9@F5>+M33FV zJp(@E1C7wMYS_9$5i`GLh`vE&HB7Hii0d3h_?F!?>COr_iT<2R61a_SF>^+9;+SND z6Gjg)zRM)Kfmmi75a-^}q;T36eg%9c53&A)Nz?c^0Zy6vMC+T3&|MDiK30UzaYh8} zTYz8@I&W|i9)b5!a=gY6?OTANVw6-)!q37`F(!pM65u?QUeS`UEIa_x%0V$2V(2z) z;Az;s(nF%Vm)2cg*(XN7%Sretu$AD3@1h8|DNZ|hsiaSgJ;zCSBP2=&Mb{2imkoEq zhSEVX7GQ`TkZ==3N_)hP!E9mRi3&t^xK`RPX11~{9a`}k*j(06l5SSWUU{m_ExLLc zAyhKMt+IeP*~O)BDfoy&tY7C=H=HCv657Zm+&nQTW}JBa1_BWBVke*M?SbDVNww%5;U1HNykaT4ddp3 zIP!p_$QHP54iM`-j(o7KB1qK#a3aC^itXl1c1$~Qe=VlN&!;6H$QE~n^(OT?0|HJx zrHN*E)uNa?{`M&L!BtByiD?rXF3Og#>Lvb9*kc$OTh%8{{v}&^_~Angv%r;AJz^-q z5PobaAwrGSLo$D2b;AE>(wMcEBrj{En37A@KGA=Pk#JdBitmG()gI#iordnDrEVBo zjnW0J471~7a0R94FB!rkf|6W`XYwo~cmSpNci`1Z51Bj7Q8!#gDHG*o@tx5A7>>@{ z3~k6J9eNB$=L91OnluQXQfX>w(#9(6=@=#18&ZnnH><*)CYC1Ms2VVbj%1~Cr&}$i zJ*R1>y=(eJ*C8Gj-vlStc*x{FhHTj;?w~Zemyv6<3B35KQThQx-8!0dvbs-9zQ_pO z^tcTkpybfzmnChh=@UD$<7+Wd61T#c8V_-0=htFlNru{O#Hx)iP3nf>+FmjjWZBbt zN@i=_B$FLpi;33ok!X6pvTDO1)xU=*Z$-PuAiFPSJNJ}}4wVn;D2kyaRzd&C6;FN-+feYsyue#NasJ(M-}h?DoZl~@Bi z8vDs)hFdu0jX03n+-qGrT&0;?Db->M>uJ|P$3VI3pDDF-)3^6nOs0mkumNI@r@lrm z>ME^x1sFp&=%U?hF)2@E)|=n0bRs1aUmbE1K_#*cy)1D;)7n}&`qz|dR6^XlzubEs zJ=doxwN{C7@9uK%)Y=9)_A$+KCE*w#9|bR$$>3iEdk1#jq=Fll)6R9$hi(CKI49F&pVrIW$TA2_4|Pk_dZ$f zy@cLeJf%96826IPz4OiWjsA-%wMB8}z0r>fJ(7U?&2@6}LQ1Vt78-I5dglwpMR>BM zUiP1(AA4usbN->wn};8wH}?zru_yB$nJe^W;DeS1*>RS7#=JKlFZ4#i&?+~&-lN{X z*5&#e{cWK~egmFXyBs@}QgzBRd6E38P@I7`T4j0UXEgA_+FanwY@z3cBznndn%9u` zyk`r&MW}A8l^1@TQlC+-H|FxZ?=APXx2T3_08!831hRXeKSZ*Oo!$LUZ^>z~V;-l;-!5#DNV zk^M(#Vn=H(apG8^=Y*T>4f5QN=-4ha=REK0h2A2xIqUb297w5qm7RId`PvdMdrf5y zriF0DlwAk~_Uc;`ibRHU@6Y60L2O8n1Fx3a30j__s+h&?nLFWO~wBQQ#kdv diff --git a/rv32imac_tests.s b/rv32imac_tests.s index ecd3059..a8b8393 100644 --- a/rv32imac_tests.s +++ b/rv32imac_tests.s @@ -795,6 +795,12 @@ _start: li a7, 93 ecall + # Unreachable: placed to verify standard/compressed ebreak compilation + ebreak + .option rvc + c.ebreak + .option norvc + report_error: la a0, str_some_failed jal print_string