From e07eeab043effab632ae911b37ca90c181e8d134 Mon Sep 17 00:00:00 2001 From: Toby Jaffey Date: Wed, 10 Dec 2025 10:35:18 +0000 Subject: [PATCH] Make yield a regular syscall taking an argument. Allows "wait for interrupt"/"wait for event" type operation where VM code blocks until the host has something for it. --- README.md | 40 ++++++++++++++++++++++++++++++++++ apps/lissajous/lissajous.c | 9 +------- apps/self/self.c | 2 ++ apps/sketch/sketch.c | 2 +- common/uvm32_target.h | 2 +- host-arduino/host-arduino.ino | 2 ++ host-arduino/uvm32.cpp | 35 +++++++++++++++++++++++++---- host-mini/host-mini.c | 2 ++ host-parallel/host-parallel.c | 2 ++ host/host.c | 9 ++++---- precompiled/fib.bin | Bin 476 -> 480 bytes precompiled/self.bin | Bin 5348 -> 5332 bytes uvm32/uvm32.c | 6 +---- uvm32/uvm32.h | 1 - 14 files changed, 88 insertions(+), 24 deletions(-) diff --git a/README.md b/README.md index 3a75310..5641f71 100644 --- a/README.md +++ b/README.md @@ -203,6 +203,46 @@ The following functions are used to access syscall parameters safely: void uvm32_setval(uvm32_state_t *vmst, uvm32_evt_t *evt, uvm32_arg_t, uint32_t val); uvm32_evt_syscall_buf_t uvm32_getbuf(uvm32_state_t *vmst, uvm32_evt_t *evt, uvm32_arg_t argPtr, uvm32_arg_t argLen); +## Event driven operation + +A useful pattern for code running in the VM is to be event-driven. In this setup the program requests blocks until woken up with a reason. This requires some support in the host, but can be implemented as follows. + +In the VM code: + +```c +while(1) { + // ask host to suspend running until one of the following events + uint32_t wakeReason = yield(KEYPRESS_EVENT_MASK | MOUSE_EVENT_MASK | NETWORK_EVENT_MASK); + switch(wakeReason) { + ... + } +} +``` + +In the host code: + +```c +uvm32_run(&vmst, &evt, 1000); +switch(evt.typ) { + case UVM32_EVT_SYSCALL: + switch(evt.data.syscall.code) { + case UVM32_SYSCALL_YIELD: + uint32_t events = uvm32_getval(&vmst, &evt, ARG0); + // do not call uvm32_run() again until something in the events set is triggered + break; + ... + } + break; + ... +} +``` + +Then, to wake the VM once an (eg. key) event has occurred + +```c +uvm32_setval(&vmst, &evt, RET, KEYPRESS_EVENT_MASK); +uvm32_run(&vmst, &evt, 1000); +``` ## Configuration diff --git a/apps/lissajous/lissajous.c b/apps/lissajous/lissajous.c index 8aa19bb..e957a96 100644 --- a/apps/lissajous/lissajous.c +++ b/apps/lissajous/lissajous.c @@ -13,13 +13,6 @@ void movecursor(int x, int y) { print("f"); } -void sleep(uint32_t ms) { - uint32_t start = millis(); - while (millis() < start + ms) { - yield(); - } -} - // Absolute value function for doubles double abs_c(double x) { if (x < 0) { @@ -116,7 +109,7 @@ void main(void) { // wait for next frame while (millis() < framestart + (1000 / 30)) { - yield(); + yield(0); } beta += 0.05; freq1 += 0.01; diff --git a/apps/self/self.c b/apps/self/self.c index 5821e1a..fa98ab9 100644 --- a/apps/self/self.c +++ b/apps/self/self.c @@ -45,6 +45,8 @@ void main(void) { break; case UVM32_EVT_SYSCALL: // vm has paused to handle UVM32_SYSCALL switch(evt.data.syscall.code) { + case UVM32_SYSCALL_YIELD: + break; case UVM32_SYSCALL_PUTC: putc(uvm32_getval(&vmst, &evt, ARG0)); break; diff --git a/apps/sketch/sketch.c b/apps/sketch/sketch.c index 27c6a59..67d23fd 100644 --- a/apps/sketch/sketch.c +++ b/apps/sketch/sketch.c @@ -25,7 +25,7 @@ void setup(void) { void main(void) { setup(); while(loop()) { - yield(); + yield(0); } } diff --git a/common/uvm32_target.h b/common/uvm32_target.h index 4439804..15144a1 100644 --- a/common/uvm32_target.h +++ b/common/uvm32_target.h @@ -56,7 +56,7 @@ static uint32_t syscall(uint32_t id, uint32_t param1, uint32_t param2) { #define millis() syscall_cast(UVM32_SYSCALL_MILLIS, 0, 0) #define putc(x) syscall_cast(UVM32_SYSCALL_PUTC, x, 0) #define getc() syscall_cast(UVM32_SYSCALL_GETC, 0, 0) -#define yield() syscall_cast(UVM32_SYSCALL_YIELD, 0, 0) +#define yield(x) syscall_cast(UVM32_SYSCALL_YIELD, x, 0) #define printbuf(x, y) syscall_cast(UVM32_SYSCALL_PRINTBUF, x, y) extern char _estack; diff --git a/host-arduino/host-arduino.ino b/host-arduino/host-arduino.ino index 6487c1f..9abc23c 100644 --- a/host-arduino/host-arduino.ino +++ b/host-arduino/host-arduino.ino @@ -57,6 +57,8 @@ void loop(void) { break; case UVM32_EVT_SYSCALL: // vm has paused to handle UVM32_SYSCALL switch(evt.data.syscall.code) { + case UVM32_SYSCALL_YIELD: + break; case UVM32_SYSCALL_PUTC: Serial.print((char)uvm32_getval(&vmst, &evt, ARG0)); break; diff --git a/host-arduino/uvm32.cpp b/host-arduino/uvm32.cpp index dd9097c..f93ab92 100644 --- a/host-arduino/uvm32.cpp +++ b/host-arduino/uvm32.cpp @@ -1,4 +1,5 @@ #include "config.h" + #define MINIRV32_IMPLEMENTATION #include "uvm32.h" @@ -11,6 +12,9 @@ // On an invalid operation, an error is set in uvm32_state_t, but a valid pointer still needs to be temporarily used static uint32_t garbage; +// magic value for stack canary +#define STACK_CANARY_VALUE 0x42 + #ifndef UVM32_MEMCPY #define UVM32_MEMCPY uvm32_memcpy void uvm32_memcpy(void *dst, const void *src, int len) { @@ -85,6 +89,8 @@ bool uvm32_load(uvm32_state_t *vmst, const uint8_t *rom, int len) { } UVM32_MEMCPY(vmst->memory, rom, len); + vmst->stack_canary = (uint8_t *)UVM32_NULL; + return true; } @@ -136,6 +142,12 @@ void uvm32_clearError(uvm32_state_t *vmst) { uint32_t uvm32_run(uvm32_state_t *vmst, uvm32_evt_t *evt, uint32_t instr_meter) { uint32_t num_instr = 0; + if (vmst->stack_canary != UVM32_NULL && *vmst->stack_canary != STACK_CANARY_VALUE) { + setStatusErr(vmst, UVM32_ERR_STACKOVERFLOW); + setup_err_evt(vmst, evt); + return num_instr; + } + if (vmst->status != UVM32_STATUS_PAUSED) { setStatusErr(vmst, UVM32_ERR_NOTREADY); setup_err_evt(vmst, evt); @@ -160,10 +172,25 @@ uint32_t uvm32_run(uvm32_state_t *vmst, uvm32_evt_t *evt, uint32_t instr_meter) case UVM32_SYSCALL_HALT: setStatus(vmst, UVM32_STATUS_ENDED); break; - case UVM32_SYSCALL_YIELD: - vmst->ioevt.typ = UVM32_EVT_YIELD; - setStatus(vmst, UVM32_STATUS_PAUSED); - break; + case UVM32_SYSCALL_STACKPROTECT: { + // don't allow errant code to change it once set + if (vmst->stack_canary == (uint8_t *)UVM32_NULL) { + uint32_t param0 = vmst->core.regs[10]; // a0 + uint32_t mem_offset = param0 - MINIRV32_RAM_IMAGE_OFFSET; + + // check data fits in ram + if (mem_offset > UVM32_MEMORY_SIZE) { + setStatusErr(vmst, UVM32_ERR_STACKOVERFLOW); + setup_err_evt(vmst, evt); + } + // check canary is inside valid memory + if (mem_offset < UVM32_MEMORY_SIZE) { + // set canary + vmst->stack_canary = &vmst->memory[mem_offset]; + *vmst->stack_canary = STACK_CANARY_VALUE; + } + } + } break; default: // user defined syscalls vmst->ioevt.typ = UVM32_EVT_SYSCALL; diff --git a/host-mini/host-mini.c b/host-mini/host-mini.c index e32ad0d..a9eb539 100644 --- a/host-mini/host-mini.c +++ b/host-mini/host-mini.c @@ -47,6 +47,8 @@ int main(int argc, char *argv[]) { break; case UVM32_EVT_SYSCALL: // vm has paused to handle UVM32_SYSCALL switch(evt.data.syscall.code) { + case UVM32_SYSCALL_YIELD: + break; case UVM32_SYSCALL_PUTC: printf("%c", uvm32_getval(&vmst, &evt, ARG0)); break; diff --git a/host-parallel/host-parallel.c b/host-parallel/host-parallel.c index 13cd69b..d2d3fd7 100644 --- a/host-parallel/host-parallel.c +++ b/host-parallel/host-parallel.c @@ -81,6 +81,8 @@ int main(int argc, char *argv[]) { break; case UVM32_EVT_SYSCALL: // vm has paused to handle UVM32_SYSCALL switch(evt.data.syscall.code) { + case UVM32_SYSCALL_YIELD: + break; case UVM32_SYSCALL_PRINTLN: { const char *str = uvm32_getcstr(&vmst[scheduler_index], &evt, ARG0); if (str[0] != 0) { diff --git a/host/host.c b/host/host.c index 2762881..27860bc 100644 --- a/host/host.c +++ b/host/host.c @@ -167,10 +167,6 @@ int main(int argc, char *argv[]) { printf("UVM32_EVT_END\n"); isrunning = false; break; - case UVM32_EVT_YIELD: - //printf("UVM32_EVT_YIELD\n"); - // program has paused, but no syscall - break; case UVM32_EVT_ERR: printf("UVM32_EVT_ERR '%s' (%d)\n", evt.data.err.errstr, (int)evt.data.err.errcode); if (evt.data.err.errcode == UVM32_ERR_HUNG) { @@ -187,6 +183,11 @@ int main(int argc, char *argv[]) { printf("%02x", *buf.ptr++); } } break; + case UVM32_SYSCALL_YIELD: { + // uint32_t yield_typ = uvm32_getval(&vmst, &evt, ARG0); + // printf("YIELD type=%d\n", yield_typ); + // uvm32_setval(&vmst, &evt, RET, 123); + } break; case UVM32_SYSCALL_PRINT: { const char *str = uvm32_getcstr(&vmst, &evt, ARG0); printf("%s", str); diff --git a/precompiled/fib.bin b/precompiled/fib.bin index 9d95c6d11e29c3aa485af1a9ee37ad5a117dfe32..a92bdfd9e535fa7c70320fa7342fac22de2ace47 100755 GIT binary patch delta 265 zcmcb^{D4_oSxu1PJ;MR9?Hmk@#S9QInU#TIGKT{Lh;Poy&>+mpDl?hGV4`%9`Gqbf z<1Q0MVOB1N_aE+mo7~C5Aj~4dFqwsmA^*et-@>h&49P4hjKZxfAo(xCT`WLx`F|77 z$fygmurW;LRA5NHFq6r+vz0-Zl@q8&{^Mj;7KX_!U;YcTa01oFPZnoXl@MlO1dpzfAMmTOix W2vpy|1k}$6bkz@#Zzu0yQ~?0vxJUT_ delta 311 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 z%0DaLBcCb%Hqco9E!n%LN^Z{GQg-&<^6xV;+Hynro&mRfPqMcvf;(bmH15Cg`w-s| zz5ab*MfrD*dy(cIIP1zWD~^2MDD8r+thJ3YS}@V~A=eiwVb8i0>utH=3W^-mPtd_UXw8s{ObU*&p+`4oQ_t@)zc9?U11 z2j|cw+|%=;0Pkh|?7sx~5ylsm@S}{ky%May8tnh!%zhjD4+QwZOA+iZ;jabz|5@G< zEvWWFwc;GGeb_D$}WoL=Pg5!83sN#*05Z-d&xJrws0 zxT8m*R>7yPKwmMrpzsH#D>k*F_OzgnPorN!efaUENYK|98)oXlyKkU=K<}p>y%j(=_VTIUDzQ|f464W zoRoWw5c>n(wh>`AXaDCyK zT3-F1%Gfr;bM*npehvL6{N>$jsm`|jTG)jl){Q@A{TFf*^ws)+xNRx9b^&^@gIW-; zZE6x`ZH)Uag?#5<&YjGB)>p0kiyQNm&T?Nvp9I_Gs-ait9=;jnIsu=@C}Sr0?kD{) z*BZPz`V9C{TQS+!!FCAVgUU#h{wv6Subba`%$sx6`Xcyyh|kTw_b^W5T?U=j;GM+p z+P168!28R@Tb1AJ*)<1b#2|eM-kx=M8!g_c;Y=ua!{R&p8TNGYyWd%6d=c^T5c5y? zeRa#TPjA_{`I{T-p8LD!m=UEa2b5*8!#OhI!$0 z-|f$RzwLALrJtMMhxvNM)Ej`=drkm94R{am0pRWkB{~7y0IyV+;0W-IHr4>o1Ndww z#(jVj6*v!g5AXq?00>u7q7LvZU>jfuAOYwE90I%wI8sH4%YX=IcVYY*#$ABpfcpUZ z0EYmxyf8lu%**WFp8+r5JG*}RChMa&SwDZ1_3Ta7r*5)t!#?HwT*N-YS_JR`@C|@j zc{T!n1;FyW7o)^^Kmib`f$jhg03HQw06Y)q0=pC}gjeZ%iXys@6S-6ZVV^AVp>H2k$@@{0Ye~Knst{2fqcl}D>K{WGc`phuDI_|~X}Pg4>>5Q) zp6kQA9P13WNnUq%$gM6mi}&7a@}lns|0BBLu;zCBP8V(cioevt.typ = UVM32_EVT_YIELD; - setStatus(vmst, UVM32_STATUS_PAUSED); - break; case UVM32_SYSCALL_STACKPROTECT: { // don't allow errant code to change it once set if (vmst->stack_canary == (uint8_t *)UVM32_NULL) { - uint32_t param0 = vmst->core.regs[10]; + uint32_t param0 = vmst->core.regs[10]; // a0 uint32_t mem_offset = param0 - MINIRV32_RAM_IMAGE_OFFSET; // check data fits in ram diff --git a/uvm32/uvm32.h b/uvm32/uvm32.h index 588e761..6fd44c5 100644 --- a/uvm32/uvm32.h +++ b/uvm32/uvm32.h @@ -26,7 +26,6 @@ typedef enum { typedef enum { UVM32_EVT_ERR, UVM32_EVT_SYSCALL, - UVM32_EVT_YIELD, UVM32_EVT_END, } uvm32_evt_typ_t;