libose
Loading...
Searching...
No Matches
ose_vm.h
Go to the documentation of this file.
1/*
2 Copyright (c) 2019-23 John MacCallum Permission is hereby granted,
3 free of charge, to any person obtaining a copy of this software
4 and associated documentation files (the "Software"), to deal in
5 the Software without restriction, including without limitation the
6 rights to use, copy, modify, merge, publish, distribute,
7 sublicense, and/or sell copies of the Software, and to permit
8 persons to whom the Software is furnished to do so, subject to the
9 following conditions:
10
11 The above copyright notice and this permission notice shall be
12 included in all copies or substantial portions of the Software.
13
14 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15 EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16 MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17 NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
18 HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
19 WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
21 DEALINGS IN THE SOFTWARE.
22*/
23
70#ifndef OSE_VM_H
71#define OSE_VM_H
72
73#include "ose_context.h"
74/* osevm_setFault()/osevm_getFault() name `enum ose_errno` in their
75 signatures, and a client that includes this header without
76 ose_stackops.h first has no declaration for it. The enum then has
77 function scope, and the compiler says so. */
78#include "ose_errno.h"
79#include "ose_util.h" /* the runtime OSEVM_INPUT()/STACK()/... read an
80 int32 out of the cache; without this a host that
81 leaves the sizes undefined gets an implicit
82 declaration of ose_readInt32, which is an error
83 under C99 and later */
84#include "osevm_lib.h"
85
86#ifdef __cplusplus
87extern "C" {
88#endif
89
94#define OSEVM_ADDR_INPUT "/_i"
95#define OSEVM_ADDR_STACK "/_s"
96#define OSEVM_ADDR_ENV "/_e"
97#define OSEVM_ADDR_CONTROL "/_c"
98#define OSEVM_ADDR_DUMP "/_d"
99#define OSEVM_ADDR_STDLIB "/_l"
100#define OSEVM_ADDR_HOST "/_x"
101#define OSEVM_ADDR_CACHE "/_0"
102#define OSEVM_ADDR_FAULT "/_h"
112#define OSEVM_ADDR_PARAMS "/_p"
// Built-in Addresses
114
136#define OSEVM_DECL_NREGISTERS 6
137extern const char * const
138osevm_decl_registers[OSEVM_DECL_NREGISTERS];
139
140enum osevm_decl
141{
142 OSEVM_DECL_NONE = 0,
143 OSEVM_DECL_I = 1 << 0,
144 OSEVM_DECL_S = 1 << 1,
145 OSEVM_DECL_E = 1 << 2,
146 OSEVM_DECL_C = 1 << 3,
147 OSEVM_DECL_D = 1 << 4,
148 OSEVM_DECL_P = 1 << 5
149};
150
157int32_t osevm_declares(ose_constbundle src);
158
169int32_t osevm_declaresAtOffset(ose_constbundle B, int32_t offset);
// Declarations
171
176#define OSEVM_ADDR_assign "/@"
177#define OSEVM_ADDR_quote "/'"
178#define OSEVM_ADDR_funcall "/!"
179#define OSEVM_ADDR_lookup "/$"
180#define OSEVM_ADDR_copyRegisterToElem "/>"
181#define OSEVM_ADDR_appendElemToRegister "/<<"
182#define OSEVM_ADDR_replaceRegisterWithElem "/<"
183#define OSEVM_ADDR_moveElemToRegister "/-"
184#define OSEVM_ADDR_toType "/,"
185#define OSEVM_ADDR_toInt32 "/,/i"
186#define OSEVM_ADDR_toFloat "/,/f"
187#define OSEVM_ADDR_toString "/,/s"
188#define OSEVM_ADDR_toBlob "/,/b"
189#define OSEVM_ADDR_appendByte "/&"
// Built-in Prefixes
191
196/* number of 32-bit ints available in the cache message */
197#define OSEVM_CACHE_SIZE 30
198#define OSEVM_CACHE_MSG_SIZE OSE_CONTEXT_MESSAGE_OVERHEAD \
199 + 4 + 4 + 32 + (OSEVM_CACHE_SIZE * 4)
200#define OSEVM_CACHE_OFFSET_0 OSE_BUNDLE_HEADER_LEN \
201 + OSE_CONTEXT_BUNDLE_OFFSET \
202 + OSE_BUNDLE_HEADER_LEN \
203 + 4 + 4 + 32 /* size, address, typetags */
204#define OSEVM_CACHE_OFFSET_1 OSEVM_CACHE_OFFSET_0 + 4
205#define OSEVM_CACHE_OFFSET_2 OSEVM_CACHE_OFFSET_1 + 4
206#define OSEVM_CACHE_OFFSET_3 OSEVM_CACHE_OFFSET_2 + 4
207#define OSEVM_CACHE_OFFSET_4 OSEVM_CACHE_OFFSET_3 + 4
208#define OSEVM_CACHE_OFFSET_5 OSEVM_CACHE_OFFSET_4 + 4
209#define OSEVM_CACHE_OFFSET_6 OSEVM_CACHE_OFFSET_5 + 4
210#define OSEVM_CACHE_OFFSET_7 OSEVM_CACHE_OFFSET_6 + 4
211#define OSEVM_CACHE_OFFSET_8 OSEVM_CACHE_OFFSET_7 + 4
212#define OSEVM_CACHE_OFFSET_9 OSEVM_CACHE_OFFSET_8 + 4
213#define OSEVM_CACHE_OFFSET_10 OSEVM_CACHE_OFFSET_9 + 4
214#define OSEVM_CACHE_OFFSET_11 OSEVM_CACHE_OFFSET_10 + 4
215#define OSEVM_CACHE_OFFSET_12 OSEVM_CACHE_OFFSET_11 + 4
216#define OSEVM_CACHE_OFFSET_13 OSEVM_CACHE_OFFSET_12 + 4
217#define OSEVM_CACHE_OFFSET_14 OSEVM_CACHE_OFFSET_13 + 4
218#define OSEVM_CACHE_OFFSET_15 OSEVM_CACHE_OFFSET_14 + 4
219#define OSEVM_CACHE_OFFSET_16 OSEVM_CACHE_OFFSET_15 + 4
220#define OSEVM_CACHE_OFFSET_17 OSEVM_CACHE_OFFSET_16 + 4
221#define OSEVM_CACHE_OFFSET_18 OSEVM_CACHE_OFFSET_17 + 4
222#define OSEVM_CACHE_OFFSET_19 OSEVM_CACHE_OFFSET_18 + 4
223#define OSEVM_CACHE_OFFSET_20 OSEVM_CACHE_OFFSET_19 + 4
224#define OSEVM_CACHE_OFFSET_21 OSEVM_CACHE_OFFSET_20 + 4
225#define OSEVM_CACHE_OFFSET_22 OSEVM_CACHE_OFFSET_21 + 4
226#define OSEVM_CACHE_OFFSET_23 OSEVM_CACHE_OFFSET_22 + 4
227#define OSEVM_CACHE_OFFSET_24 OSEVM_CACHE_OFFSET_23 + 4
228#define OSEVM_CACHE_OFFSET_25 OSEVM_CACHE_OFFSET_24 + 4
229#define OSEVM_CACHE_OFFSET_26 OSEVM_CACHE_OFFSET_25 + 4
230#define OSEVM_CACHE_OFFSET_27 OSEVM_CACHE_OFFSET_26 + 4
231#define OSEVM_CACHE_OFFSET_28 OSEVM_CACHE_OFFSET_27 + 4
232#define OSEVM_CACHE_OFFSET_29 OSEVM_CACHE_OFFSET_28 + 4
233#define OSEVM_CACHE_OFFSET_30 OSEVM_CACHE_OFFSET_29 + 4
234
235#define OSEVM_CACHE_POINTER OSEVM_CACHE_OFFSET_0
236#define OSEVM_CACHE_FLAGS OSEVM_CACHE_OFFSET_1
237#define OSEVM_CACHE_OFFSET_INPUT OSEVM_CACHE_OFFSET_2
238#define OSEVM_CACHE_OFFSET_STACK OSEVM_CACHE_OFFSET_3
239#define OSEVM_CACHE_OFFSET_ENV OSEVM_CACHE_OFFSET_4
240#define OSEVM_CACHE_OFFSET_CONTROL OSEVM_CACHE_OFFSET_5
241#define OSEVM_CACHE_OFFSET_DUMP OSEVM_CACHE_OFFSET_6
242#define OSEVM_CACHE_OFFSET_FAULT OSEVM_CACHE_OFFSET_7
// Cache Offsets
244
250#ifdef OSE_IN_DOXYGEN
255#define OSE_CONF_VM_INPUT_SIZE
256#define OSE_CONF_VM_STACK_SIZE
257#define OSE_CONF_VM_ENV_SIZE
258#define OSE_CONF_VM_CONTROL_SIZE
259#define OSE_CONF_VM_DUMP_SIZE
260#undef OSE_CONF_VM_INPUT_SIZE
261#undef OSE_CONF_VM_STACK_SIZE
262#undef OSE_CONF_VM_ENV_SIZE
263#undef OSE_CONF_VM_CONTROL_SIZE
264#undef OSE_CONF_VM_DUMP_SIZE
/* conf_vm */
266#endif
267
275#define OSEVM_FAULT_SIZE 128
276
277#if defined(OSE_CONF_VM_INPUT_SIZE) \
278 && defined(OSE_CONF_VM_STACK_SIZE) \
279 && defined(OSE_CONF_VM_ENV_SIZE) \
280 && defined(OSE_CONF_VM_CONTROL_SIZE) \
281 && defined(OSE_CONF_VM_DUMP_SIZE)
282#define OSEVM_HAVE_SIZES
283static const int32_t OSEVM_INPUT_SIZE = OSE_CONF_VM_INPUT_SIZE;
284static const int32_t OSEVM_STACK_SIZE = OSE_CONF_VM_STACK_SIZE;
285static const int32_t OSEVM_ENV_SIZE = OSE_CONF_VM_ENV_SIZE;
286static const int32_t OSEVM_CONTROL_SIZE = OSE_CONF_VM_CONTROL_SIZE;
287static const int32_t OSEVM_DUMP_SIZE = OSE_CONF_VM_DUMP_SIZE;
288
289#include "ose_context.h"
290static const int32_t OSEVM_TOTAL_SIZE =
291 (OSEVM_CACHE_MSG_SIZE
292 + OSEVM_INPUT_SIZE + OSE_CONTEXT_MESSAGE_OVERHEAD
293 + OSEVM_STACK_SIZE + OSE_CONTEXT_MESSAGE_OVERHEAD
294 + OSEVM_ENV_SIZE + OSE_CONTEXT_MESSAGE_OVERHEAD
295 + OSEVM_CONTROL_SIZE + OSE_CONTEXT_MESSAGE_OVERHEAD
296 + OSEVM_DUMP_SIZE + OSE_CONTEXT_MESSAGE_OVERHEAD
298
299#elif !defined(OSE_CONF_VM_INPUT_SIZE) \
300 && !defined(OSE_CONF_VM_STACK_SIZE) \
301 && !defined(OSE_CONF_VM_ENV_SIZE) \
302 && !defined(OSE_CONF_VM_CONTROL_SIZE) \
303 && !defined(OSE_CONF_VM_DUMP_SIZE)
304#else
305#pragma message ( "Sizes were specified for some, but not all of the VM "\
306 "stacks. Sizes specified will be ignored during compilation, "\
307 "and must be passed to osevm_init() at runtime."\
308 )
309#endif
/* VM Configuration */
311
312#ifdef OSEVM_HAVE_SIZES
313
318#define OSEVM_INPUT_CONTEXT_MESSAGE_OFFSET \
319 OSE_BUNDLE_HEADER_LEN + OSEVM_CACHE_MSG_SIZE
320#define OSEVM_INPUT_BUNDLE_OFFSET \
321 OSEVM_INPUT_CONTEXT_MESSAGE_OFFSET + OSE_CONTEXT_BUNDLE_OFFSET
322
323#define OSEVM_STACK_CONTEXT_MESSAGE_OFFSET \
324 OSEVM_INPUT_CONTEXT_MESSAGE_OFFSET \
325 + OSE_CONTEXT_MESSAGE_OVERHEAD + OSEVM_INPUT_SIZE
326#define OSEVM_STACK_BUNDLE_OFFSET \
327 OSEVM_STACK_CONTEXT_MESSAGE_OFFSET + OSE_CONTEXT_BUNDLE_OFFSET
328
329#define OSEVM_ENV_CONTEXT_MESSAGE_OFFSET \
330 OSEVM_STACK_CONTEXT_MESSAGE_OFFSET \
331 + OSE_CONTEXT_MESSAGE_OVERHEAD + OSEVM_STACK_SIZE
332#define OSEVM_ENV_BUNDLE_OFFSET \
333 OSEVM_ENV_CONTEXT_MESSAGE_OFFSET + OSE_CONTEXT_BUNDLE_OFFSET
334
335#define OSEVM_CONTROL_CONTEXT_MESSAGE_OFFSET \
336 OSEVM_ENV_CONTEXT_MESSAGE_OFFSET \
337 + OSE_CONTEXT_MESSAGE_OVERHEAD + OSEVM_ENV_SIZE
338#define OSEVM_CONTROL_BUNDLE_OFFSET \
339 OSEVM_CONTROL_CONTEXT_MESSAGE_OFFSET + OSE_CONTEXT_BUNDLE_OFFSET
340
341#define OSEVM_DUMP_CONTEXT_MESSAGE_OFFSET \
342 OSEVM_CONTROL_CONTEXT_MESSAGE_OFFSET \
343 + OSE_CONTEXT_MESSAGE_OVERHEAD + OSEVM_CONTROL_SIZE
344#define OSEVM_DUMP_BUNDLE_OFFSET \
345 OSEVM_DUMP_CONTEXT_MESSAGE_OFFSET + OSE_CONTEXT_BUNDLE_OFFSET
346
347#define OSEVM_FAULT_CONTEXT_MESSAGE_OFFSET \
348 OSEVM_DUMP_CONTEXT_MESSAGE_OFFSET \
349 + OSE_CONTEXT_MESSAGE_OVERHEAD + OSEVM_DUMP_SIZE
350#define OSEVM_FAULT_BUNDLE_OFFSET \
351 OSEVM_FAULT_CONTEXT_MESSAGE_OFFSET + OSE_CONTEXT_BUNDLE_OFFSET
// VM Bundle Offsets
353
362#define OSEVM_INPUT(osevm) \
363 ose_makeBundle(ose_getBundlePtr(osevm) \
364 + OSEVM_INPUT_BUNDLE_OFFSET)
368#define OSEVM_STACK(osevm) \
369 ose_makeBundle(ose_getBundlePtr(osevm) \
370 + OSEVM_STACK_BUNDLE_OFFSET)
374#define OSEVM_ENV(osevm) \
375 ose_makeBundle(ose_getBundlePtr(osevm) \
376 + OSEVM_ENV_BUNDLE_OFFSET)
380#define OSEVM_CONTROL(osevm) \
381 ose_makeBundle(ose_getBundlePtr(osevm) \
382 + OSEVM_CONTROL_BUNDLE_OFFSET)
386#define OSEVM_DUMP(osevm) \
387 ose_makeBundle(ose_getBundlePtr(osevm) \
388 + OSEVM_DUMP_BUNDLE_OFFSET)
392#define OSEVM_FAULT(osevm) \
393 ose_makeBundle(ose_getBundlePtr(osevm) \
394 + OSEVM_FAULT_BUNDLE_OFFSET)
// Components of the VM
396
414
415#else
416
417#define OSEVM_INPUT(osevm) \
418 ose_makeBundle(ose_getBundlePtr(osevm) \
419 + ose_readInt32(osevm, \
420 OSEVM_CACHE_OFFSET_INPUT))
421#define OSEVM_STACK(osevm) \
422 ose_makeBundle(ose_getBundlePtr(osevm) \
423 + ose_readInt32(osevm, \
424 OSEVM_CACHE_OFFSET_STACK))
425#define OSEVM_ENV(osevm) \
426 ose_makeBundle(ose_getBundlePtr(osevm) \
427 + ose_readInt32(osevm, \
428 OSEVM_CACHE_OFFSET_ENV))
429#define OSEVM_CONTROL(osevm) \
430 ose_makeBundle(ose_getBundlePtr(osevm) \
431 + ose_readInt32(osevm, \
432 OSEVM_CACHE_OFFSET_CONTROL))
433#define OSEVM_DUMP(osevm) \
434 ose_makeBundle(ose_getBundlePtr(osevm) \
435 + ose_readInt32(osevm, \
436 OSEVM_CACHE_OFFSET_DUMP))
437#define OSEVM_FAULT(osevm) \
438 ose_makeBundle(ose_getBundlePtr(osevm) \
439 + ose_readInt32(osevm, \
440 OSEVM_CACHE_OFFSET_FAULT))
441
470 int32_t input_size,
471 int32_t stack_size,
472 int32_t env_size,
473 int32_t control_size,
474 int32_t dump_size);
475#endif
476
502void osevm_setFault(ose_bundle osevm, enum ose_errno e);
503
508
512void osevm_clearFault(ose_bundle osevm);
513
518#define OSEVM_GET_FLAGS(osevm) \
519 ose_readInt32(osevm, OSEVM_CACHE_FLAGS)
520#define OSEVM_SET_FLAGS(osevm, flags) \
521 ose_writeInt32(osevm, OSEVM_CACHE_FLAGS, flags)
522
523#define OSEVM_GET_CACHE_VALUE(osevm, idx) \
524 (ose_assert((idx) < OSEVM_CACHE_SIZE), \
525 ose_readInt32(osevm, OSEVM_CACHE_OFFSET_0 + (4 * (idx))))
526#define OSEVM_SET_CACHE_VALUE(osevm, idx, val) \
527 (ose_assert((idx) < OSEVM_CACHE_SIZE), \
528 ose_writeInt32(osevm, OSEVM_CACHE_OFFSET_0 + (4 * (idx)), val))
// Cache Getters and Setters
530
531/************************************************************
532 * Hooks
533 ************************************************************/
538void osevm_respondToString(ose_bundle osevm);
539void osevm_preInput(ose_bundle osevm);
540void osevm_postInput(ose_bundle osevm);
541void osevm_popInputToControl(ose_bundle osevm);
542void osevm_postControl(ose_bundle osevm);
543void osevm_evalType(ose_bundle osevm);
544/* int32_t osevm_callTypeHook(ose_bundle bundle, */
545/* const char typetag, */
546/* const int32_t msg_offset, */
547/* const int32_t item_offset, */
548/* const int32_t addrlen, */
549/* const char * const addr); */
550
551/* int32_t osevm_getPayloadItemLength_hook(ose_bundle bundle, */
552/* const char typetag, */
553/* const int32_t msg_offset, */
554/* const int32_t item_offset); */
555
556/* int32_t osevm_getPayloadItemSize_hook(ose_bundle bundle, */
557/* const char typetag, */
558/* const int32_t msg_offset, */
559/* const int32_t item_offset); */
560
561/* int32_t osevm_pprintPayloadItem_hook(ose_bundle bundle, */
562/* const char typetag, */
563/* const int32_t msg_offset, */
564/* const int32_t item_offset); */
/* Hooks */
566
577#ifndef OSEVM_ASSIGN
578#define OSEVM_ASSIGN osevm_assignStackToEnv
579#else
580extern void OSEVM_ASSIGN (ose_bundle osevm);
581#endif
582
583#ifndef OSEVM_LOOKUP
584#define OSEVM_LOOKUP osevm_lookupInEnv_impl
585#else
586extern void OSEVM_LOOKUP (ose_bundle osevm);
587#endif
588
589#ifndef OSEVM_FUNCALL
590#define OSEVM_FUNCALL osevm_funcall
591#else
592extern void OSEVM_FUNCALL (ose_bundle osevm);
593#endif
594
595#ifndef OSEVM_QUOTE
596#define OSEVM_QUOTE osevm_quote
597#else
598extern void OSEVM_QUOTE (ose_bundle osevm);
599#endif
600
601#ifndef OSEVM_COPYREGISTERTOELEM
602#define OSEVM_COPYREGISTERTOELEM osevm_copyRegisterToElem
603#else
604extern void OSEVM_COPYREGISTERTOELEM (ose_bundle osevm);
605#endif
606
607#ifndef OSEVM_APPENDELEMTOREGISTER
608#define OSEVM_APPENDELEMTOREGISTER osevm_appendElemToRegister
609#else
610extern void OSEVM_APPENDELEMTOREGISTER (ose_bundle osevm);
611#endif
612
613#ifndef OSEVM_REPLACEREGISTERWITHELEM
614#define OSEVM_REPLACEREGISTERWITHELEM osevm_replaceRegisterWithElem
615#else
616extern void OSEVM_REPLACEREGISTERWITHELEM (ose_bundle osevm);
617#endif
618
619#ifndef OSEVM_MOVEELEMTOREGISTER
620#define OSEVM_MOVEELEMTOREGISTER osevm_moveElemToRegister
621#else
622extern void OSEVM_MOVEELEMTOREGISTER (ose_bundle osevm);
623#endif
624
625#ifndef OSEVM_TOTYPE
626#define OSEVM_TOTYPE osevm_toType
627#else
628extern void OSEVM_TOTYPE (ose_bundle osevm);
629#endif
630
631#ifndef OSEVM_TOINT32
632#define OSEVM_TOINT32 osevm_toInt32
633#else
634extern void OSEVM_TOINT32 (ose_bundle osevm);
635#endif
636
637#ifndef OSEVM_TOFLOAT
638#define OSEVM_TOFLOAT osevm_toFloat
639#else
640extern void OSEVM_TOFLOAT (ose_bundle osevm);
641#endif
642
643#ifndef OSEVM_TOSTRING
644#define OSEVM_TOSTRING osevm_toString
645#else
646extern void OSEVM_TOSTRING (ose_bundle osevm);
647#endif
648
649#ifndef OSEVM_TOBLOB
650#define OSEVM_TOBLOB osevm_toBlob
651#else
652extern void OSEVM_TOBLOB (ose_bundle osevm);
653#endif
654
655#ifdef OSE_PROVIDE_TYPE_SYMBOL
656#ifndef OSEVM_TOSYMBOL
657#define OSEVM_TOSYMBOL osevm_toSymbol
658#else
659extern void OSEVM_TOSYMBOL (ose_bundle osevm);
660#endif
661#endif
662
663#ifdef OSE_PROVIDE_TYPE_DOUBLE
664#ifndef OSEVM_TODOUBLE
665#define OSEVM_TODOUBLE osevm_toDouble
666#else
667extern void OSEVM_TODOUBLE (ose_bundle osevm);
668#endif
669#endif
670
671#ifdef OSE_PROVIDE_TYPE_INT8
672#ifndef OSEVM_TOINT8
673#define OSEVM_TOINT8 osevm_toInt8
674#else
675extern void OSEVM_TOINT8 (ose_bundle osevm);
676#endif
677#endif
678
679#ifdef OSE_PROVIDE_TYPE_UINT8
680#ifndef OSEVM_TOUINT8
681#define OSEVM_TOUINT8 osevm_toUInt8
682#else
683extern void OSEVM_TOUINT8 (ose_bundle osevm);
684#endif
685#endif
686
687#ifdef OSE_PROVIDE_TYPE_INT16
688#ifndef OSEVM_TOINT16
689#define OSEVM_TOINT16 osevm_toInt16
690#else
691extern void OSEVM_TOINT16 (ose_bundle osevm);
692#endif
693#endif
694
695#ifdef OSE_PROVIDE_TYPE_UINT16
696#ifndef OSEVM_TOUINT16
697#define OSEVM_TOUINT16 osevm_toUInt16
698#else
699extern void OSEVM_TOUINT16 (ose_bundle osevm);
700#endif
701#endif
702
703#ifdef OSE_PROVIDE_TYPE_UINT32
704#ifndef OSEVM_TOUINT32
705#define OSEVM_TOUINT32 osevm_toUInt32
706#else
707extern void OSEVM_TOUINT32 (ose_bundle osevm);
708#endif
709#endif
710
711#ifdef OSE_PROVIDE_TYPE_INT64
712#ifndef OSEVM_TOINT64
713#define OSEVM_TOINT64 osevm_toInt64
714#else
715extern void OSEVM_TOINT64 (ose_bundle osevm);
716#endif
717#endif
718
719#ifdef OSE_PROVIDE_TYPE_UINT64
720#ifndef OSEVM_TOUINT64
721#define OSEVM_TOUINT64 osevm_toUInt64
722#else
723extern void OSEVM_TOUINT64 (ose_bundle osevm);
724#endif
725#endif
726
727#ifdef OSE_PROVIDE_TYPE_TIMETAG
728#ifndef OSEVM_TOTIMETAG
729#define OSEVM_TOTIMETAG osevm_toTimetag
730#else
731extern void OSEVM_TOTIMETAG (ose_bundle osevm);
732#endif
733#endif
734
735#ifdef OSE_PROVIDE_TYPE_TRUE
736#ifndef OSEVM_TOTRUE
737#define OSEVM_TOTRUE osevm_toTrue
738#else
739extern void OSEVM_TOTRUE (ose_bundle osevm);
740#endif
741#endif
742
743#ifdef OSE_PROVIDE_TYPE_FALSE
744#ifndef OSEVM_TOFALSE
745#define OSEVM_TOFALSE osevm_toFalse
746#else
747extern void OSEVM_TOFALSE (ose_bundle osevm);
748#endif
749#endif
750
751#ifdef OSE_PROVIDE_TYPE_NIL
752#ifndef OSEVM_TONIL
753#define OSEVM_TONIL osevm_toNil
754#else
755extern void OSEVM_TONIL (ose_bundle osevm);
756#endif
757#endif
758
759#ifdef OSE_PROVIDE_TYPE_INFINITUM
760#ifndef OSEVM_TOINFINITUM
761#define OSEVM_TOINFINITUM osevm_toInfinitum
762#else
763extern void OSEVM_TOINFINITUM (ose_bundle osevm);
764#endif
765#endif
766
767#ifndef OSEVM_APPENDBYTE
768#define OSEVM_APPENDBYTE osevm_appendByte
769#else
770extern void OSEVM_APPENDBYTE (ose_bundle osevm);
771#endif
772
773#ifndef OSEVM_RESPONDTOSTRING
774#define OSEVM_RESPONDTOSTRING osevm_respondToString
775#else
776extern void OSEVM_RESPONDTOSTRING (ose_bundle osevm);
777#endif
778
779#ifndef OSEVM_PREINPUT
780#define OSEVM_PREINPUT osevm_preInput
781#else
782extern void OSEVM_PREINPUT (ose_bundle osevm);
783#endif
784
785#ifndef OSEVM_POSTINPUT
786#define OSEVM_POSTINPUT osevm_postInput
787#else
788extern void OSEVM_POSTINPUT (ose_bundle osevm);
789#endif
790
791#ifndef OSEVM_POPINPUTTOCONTROL
792#define OSEVM_POPINPUTTOCONTROL osevm_popInputToControl
793#else
794extern void OSEVM_POPINPUTTOCONTROL (ose_bundle osevm);
795#endif
796
797#ifndef OSEVM_POSTCONTROL
798#define OSEVM_POSTCONTROL osevm_postControl
799#else
800extern void OSEVM_POSTCONTROL (ose_bundle osevm);
801#endif
802
803#define OSEVM_TYPE_ADDR_EVALTYPE_SUFFIX "/EVTY"
804#define OSEVM_EVALTYPE_ADDR \
805 OSE_TYPE_ADDR_PREFIX "%c" OSEVM_TYPE_ADDR_EVALTYPE_SUFFIX
806#define OSEVM_EVALTYPE_ADDR_LEN sizeof(OSEVM_EVALTYPE_ADDR)
807#ifndef OSEVM_EVALTYPE
808void osevm_evalType_hook(ose_bundle osevm);
809#define OSEVM_EVALTYPE osevm_evalType_hook
810#else
811extern void OSEVM_EVALTYPE (ose_bundle osevm);
812#endif
813
/* Hooks */ /* conf_vm_hooks */
816
832int32_t osevm_inputMessages(ose_bundle osevm,
833 int32_t size, const char * const bundle);
834/* The data counterpart of osevm_inputMessages(). Validates bytes from
835 outside and leaves them on the stack as a BLOB, which no client gives an
836 evaluation rule. See the comment in ose_vm.c. */
837int32_t osevm_inputData(ose_bundle osevm,
838 int32_t size, const char * const bundle);
839
847int32_t osevm_inputMessage(ose_bundle osevm,
848 int32_t size, const char * const message);
849
858#ifdef OSE_CONF_PROBE_COUNTS
866extern uint32_t ose_vm_nsteps;
867#endif
868
869#ifdef OSE_CONF_PROBE_STEPS
882#include <stdio.h>
883#define OSEVM_PROBE_TRACE 1
884#define OSEVM_PROBE_SIZES 2
885void osevm_probeSteps_trace(int flags);
886void osevm_probeSteps_reset(void);
887void osevm_probeSteps_dump(FILE *fp);
888/* For a host with no FILE to print to: the rows, in the order they were
889 first seen, and their counts and times in the probe clock's unit. */
890int osevm_probeSteps_rows(void);
891const char *osevm_probeSteps_row(int i, uint64_t *n, uint64_t *t);
892/* The probe's clock, if the host has a better one: a cycle counter. */
893extern uint64_t (*osevm_probeSteps_clock)(void);
894/* A zone inside a step, charged under its own name in the same table:
895 t0 = osevm_probeSteps_time(); ...; osevm_probeSteps_zone("name",
896 osevm_probeSteps_time() - t0). Its time is also inside the step's. */
897uint64_t osevm_probeSteps_time(void);
898void osevm_probeSteps_zone(const char * const name, uint64_t t);
899#endif
900
901void osevm_run(ose_bundle bundle);
902
914char osevm_step(ose_bundle osevm);
915#ifdef OSEVM_HAVE_SIZES
928int32_t osevm_computeSizeReqs(int n, ...);
929#else
930int32_t osevm_computeSizeReqs(int32_t input_size,
931 int32_t stack_size,
932 int32_t env_size,
933 int32_t control_size,
934 int32_t dump_size,
935 int n, ...);
936#endif
937
938#ifdef __cplusplus
939}
940#endif
941
942#endif
#define OSEVM_FAULT_SIZE
Usable bytes of the fault register.
Definition ose_vm.h:275
contains functions that structure an OSC bundle for use with other parts of this library
#define OSE_CONTEXT_MESSAGE_OVERHEAD
The overhead in bytes of a context message.
Definition ose_context.h:194
Status codes for context bundles.
ose_errno
Definition ose_errno.h:37
#define B(...)
Instantiate a top-level OSC bundle.
Definition ose_test_ctosc.h:339
contains basic utilities for reading, writing, and querying an OSC bundle
void osevm_run(ose_bundle bundle)
Run the VM.
Definition ose_vm.c:1779
int32_t osevm_inputMessage(ose_bundle osevm, int32_t size, const char *const message)
Copy a single OSC element into the input bundle of the VM.
Definition ose_vm.c:2059
int32_t osevm_inputMessages(ose_bundle osevm, int32_t size, const char *const bundle)
Copy the contents of an OSC bundle into the input bundle of the VM.
Definition ose_vm.c:1983
ose_bundle osevm_init(ose_bundle bundle)
Initialize the VM.
Definition ose_vm.c:469
void osevm_setFault(ose_bundle osevm, enum ose_errno e)
Record a fault in /_h.
Definition ose_vm.c:439
enum ose_errno osevm_getFault(ose_bundle osevm)
The fault this machine is in, or OSE_ERR_NONE.
Definition ose_vm.c:446
int32_t osevm_declaresAtOffset(ose_bundle B, int32_t offset)
Which registers the bundle ELEMENT at offset declares.
Definition ose_vm.c:366
void osevm_clearFault(ose_bundle osevm)
Declare the fault handled.
Definition ose_vm.c:456
int32_t osevm_computeSizeReqs(int n,...)
Compute the size requirements of the VM given a list of sizes of each of additional VM bundle to be c...
Definition ose_vm.c:2081
char osevm_step(ose_bundle osevm)
Step the VM.
Definition ose_vm.c:1618
int32_t osevm_declares(ose_bundle src)
Which registers src declares.
Definition ose_vm.c:341
Definition ose.h:374