From 5fb03b7d66e61ad16e391d8f7f1eb48f30ba3f88 Mon Sep 17 00:00:00 2001 From: Toby Jaffey Date: Sun, 14 Dec 2025 15:05:35 +0000 Subject: [PATCH] Remove RV32 breakpoints and interrupts, to save a tiny bit of code size. --- precompiled/self.bin | Bin 3476 -> 3460 bytes uvm32/mini-rv32ima.h | 14 ++++++++++++-- uvm32/uvm32.c | 2 +- uvm32/uvm32.h | 1 + 4 files changed, 14 insertions(+), 3 deletions(-) diff --git a/precompiled/self.bin b/precompiled/self.bin index 9c5e19c3745b1ecffa94ede75c4b75debe71f155..b59ef39987672e9e1eb4e5c6a775962d26ccd4e4 100755 GIT binary patch delta 1761 zcmZ`(U2GIp6h3!mXYTGoW961s)0nPIfB30Toxu9@Qk1_$O==>EJ_zWIv@t|5sf7p3 zPT6hO7D9@*)JjND0yI(NWsvnrC~kKNRxG6K`k+>w!e~rnBkT@V?0W9-6MeABm-BPa z&i%e~&h21rqITe!hHq2z!4f^%8K#YrYhcx;YQSQB$w@<3ilUU?o)uu%-8t+$(1^X0Z>7&GGUP+9_FA!tltHfx0 zix~CY1kZ>O`G^?r(r~;<0~SE^X~6f;fY2)8TH(;?c+)B{A|YU50As`jQxq&ac?74Im88Qn(s9=D3W<|%j~@PymQXba)HT#Q?QTkb-kZGx=;Z5S)O z-+c_N>I}KFBEN>1UQ|4**T$xSb>Y{Gx}r8EeVN?So)(@*#QRNPQ*6Qh%@7|+0-w}c zg}w>+FPXhGJ5b<*V*!y|ix=GpA^{Mmsz4-elv&a%vuF*N+wCNSnnBD*&Y?eb#nfV+f(4h%`O;2ZG#mW*qPg6UCwM=d%d7FZ_tt>3SHEDc_Rqgz zTA}Rp(hKH#KfZu<;d^!c`ndVJ|NC*KQE+zAar13I{z|@1{`(ln|ETgEiCB-8Gxby0 zCVWhwLsW-Wrt6Ab%7CeP;0$KYp>4$xoI{dQK^94(t;-@w8E24`j5G29v!QB0QsBI# zr_r|Jc^b*c^E8r>^Wq zM0RWmgVl-HiAW$0B90@{h|VBbpCdZ-+eo87j+jJzhu9JVYX>5MkTnBn4?-XL99cxAtZ;n1mGWoK#WZQ delta 1735 zcmZ`(U2GIp6h3!mXYTH@Xz|i*v|^V|y9-#AFq%b8OhG6<)Yuq#Fd>0>BlN92XyHM# z3)}9rxFLlLC6b1!5&8i7GRA!|p*3u`CI$HkZHdH1M>>Wyupx9uo3-n?%TLtANxqz) zduPr!_k8E})E}uIc)j^rwic42R~uv67`X$<`fME}S-&+}wLY>`^luqG)OnhmwU?8Z z6?%%!2rEA$-cjGBQEi54xf%N#^-aQ>_7R)TgArY(7>$P%BeGHzHCk<3;~`>1J|{*W z4W?omun?k01D>Hiq1C{h;_%s2tR0Mq4}=fEXuJoh$e5xw?Nij%L`kh4BkG!cqDy-! z(d&a$(*}hRqV7rpZr4H38sN*(_E5+^3lM)2Q4dKYQU=lQgKQB0CJ;!P!H)=A^2wD{ zOU5ty|E$>7Ho_P7XlygH>Wppj!`(2FJ0#CcEgth~^VDxQ_6@JiNhgNk4-9<6oMoce8xQ{~I zt5j^)1vWheY)_uDsc|sr9I$RIIOuhyQ>&}2%`fqVDH3gzHPHp`L&~K+= zp};2L#lh*L7)<&^2D{oc6o^wG{II)G;0ejLbOF@F=PMO+{uFR!=@V?lb6_q#LyV@c zaIJNj_>8_nqT(m|Dv60Y{|kvZ$(5vp9D3UhFw5` zpU5e~+JdFae&htq@+$lpx{eP8)(Ncxm=;3O6*3P+Ck5A496s+1=E}kfp})QCjONN{ zE6(-YLRX?#Sag0zr?`F5xhHMmFM*vCUY=rCKwNDjDmKOTnhBROl-<2K4|eZOh{pgA zbt_>sU*R8kN|r*=w&nrPMBzm@DzNjc)ct@|!)g5XO_>uiM?1jjoWAIf%Za4cRk1Bl z-}$Rlsd|(m&%!TN|D^OA?)y3EZ@*E^UzPrF;h$7fCoPa#U??h97psa+jaq;eupC{q zJs0&bB84gnf!f6XQFj*HbB}0N&vSSLIox`blT&$c7QYz*o}5*j!}|A8r<6#OST?bBDzi4i*u3uzY zvEm%07tF2I_($9qdbDr9e!+ad`u=&QQE(2>N%O;MJSnG@-_C)&1f`JhBAhn$Z&6G- zib>oJvc%B%1k!3ndOsj7Nq+)aNxBorO2&C)A>+K9RW=v~WC2cxK905(*K=51uII3- z+5@+AUl#S{D3* zW>n*OX+x?JSqL)hfuQZGvF4WFXj}*y5vlElNtx$ITb|VnD`zNcJIG^!qr1{t)6z#2Li;03-g?(h&jYPL>aMs2_&CJ J06rlC@Hb!(kK6zN diff --git a/uvm32/mini-rv32ima.h b/uvm32/mini-rv32ima.h index d063c89..f437550 100644 --- a/uvm32/mini-rv32ima.h +++ b/uvm32/mini-rv32ima.h @@ -103,7 +103,11 @@ struct MiniRV32IMAState }; #ifndef MINIRV32_STEPPROTO -MINIRV32_DECORATE int32_t MiniRV32IMAStep(void *userdata, struct MiniRV32IMAState * state, uint8_t * image, uint32_t vProcAddress, uint32_t elapsedUs, int count ); +MINIRV32_DECORATE int32_t MiniRV32IMAStep(void *userdata, struct MiniRV32IMAState * state, uint8_t * image, uint32_t vProcAddress, +#ifndef MINIRV32_NO_TIMERS_NO_CYCLES +uint32_t elapsedUs, +#endif +int count ); #endif #ifdef MINIRV32_IMPLEMENTATION @@ -116,7 +120,11 @@ MINIRV32_DECORATE int32_t MiniRV32IMAStep(void *userdata, struct MiniRV32IMAStat #endif #ifndef MINIRV32_STEPPROTO -MINIRV32_DECORATE int32_t MiniRV32IMAStep(void *userdata, struct MiniRV32IMAState * state, uint8_t * image, uint32_t vProcAddress, uint32_t elapsedUs, int count ) +MINIRV32_DECORATE int32_t MiniRV32IMAStep(void *userdata, struct MiniRV32IMAState * state, uint8_t * image, uint32_t vProcAddress, +#ifndef MINIRV32_NO_TIMERS_NO_CYCLES +uint32_t elapsedUs, +#endif +int count ) #else MINIRV32_STEPPROTO #endif @@ -436,6 +444,7 @@ MINIRV32_STEPPROTO case 0: trap = ( CSR( extraflags ) & 3) ? (11+1) : (8+1); // ECALL; 8 = "Environment call from U-mode"; 11 = "Environment call from M-mode" break; +#ifndef MINIRV32_NO_BREAKPOINT_NO_INTERRUPTS case 1: trap = (3+1); break; // EBREAK 3 = "Breakpoint" case 0x105: //WFI (Wait for interrupts) @@ -443,6 +452,7 @@ MINIRV32_STEPPROTO CSR( extraflags ) |= 4; //Infor environment we want to go to sleep. SETCSR( pc, pc + 4 ); return 1; +#endif default: trap = (2+1); break; // Illegal opcode. } diff --git a/uvm32/uvm32.c b/uvm32/uvm32.c index 8766213..7b982e4 100644 --- a/uvm32/uvm32.c +++ b/uvm32/uvm32.c @@ -254,7 +254,7 @@ uint32_t uvm32_run(uvm32_state_t *vmst, uvm32_evt_t *evt, uint32_t instr_meter) while(vmst->_status == UVM32_STATUS_RUNNING && instr_meter > 0) { uint64_t elapsedUs = 1; uint32_t ret; - ret = MiniRV32IMAStep(vmst, &vmst->_core, vmst->_memory, 0, elapsedUs, 1); + ret = MiniRV32IMAStep(vmst, &vmst->_core, vmst->_memory, elapsedUs, 1); instr_meter--; switch(ret) { diff --git a/uvm32/uvm32.h b/uvm32/uvm32.h index 0f8b323..e33613b 100644 --- a/uvm32/uvm32.h +++ b/uvm32/uvm32.h @@ -44,6 +44,7 @@ SOFTWARE. #define MINIRV32_NO_TIMERS_NO_CYCLES #define MINIRV32_NO_ZICSR #define MINIRV32_NO_ATOMICS +#define MINIRV32_NO_BREAKPOINT_NO_INTERRUPTS #define MINI_RV32_RAM_SIZE UVM32_MEMORY_SIZE #define MINIRV32_POSTEXEC(pc, ir, retval) {if (retval > 0) return retval;} uint32_t _uvm32_extramLoad(void *userdata, uint32_t addr, uint32_t accessTyp);