managarm/hel
Loading...
Searching...
No Matches
hel.h
Go to the documentation of this file.
1
3
4#ifndef HEL_H
5#define HEL_H
6
7#include <stddef.h>
8#include <string.h>
9#include <stdint.h>
10
11#include "hel-types.h"
12
13#ifdef __cplusplus
14#define HEL_C_LINKAGE extern "C"
15#else
16#define HEL_C_LINKAGE
17#endif
18
19enum {
20 // largest system call number plus 1
21 kHelNumCalls = 108,
22
23 kHelCallLog = 1,
24 kHelCallPanic = 10,
25
26 kHelCallNop = 2,
27 kHelCallSubmitAsyncNop = 3,
28
29 kHelCallCreateUniverse = 62,
30 kHelCallTransferDescriptor = 66,
31 kHelCallDescriptorInfo = 32,
32 kHelCallGetCredentials = 84,
33 kHelCallCloseDescriptor = 21,
34
35 kHelCallCreateQueue = 89,
36 kHelCallDriveQueue = 105,
37 kHelCallAlertQueue = 106,
38
39 kHelCallAllocateMemory = 51,
40 kHelCallResizeMemory = 83,
41 kHelCallCreateManagedMemory = 64,
42 kHelCallCopyOnWrite = 39,
43 kHelCallAccessPhysical = 30,
44 kHelCallCreateSliceView = 88,
45 kHelCallForkMemory = 40,
46 kHelCallCreateSpace = 27,
47 kHelCallCreateIndirectMemory = 45,
48 kHelCallAlterMemoryIndirection = 52,
49 kHelCallMapMemory = 44,
50 kHelCallSubmitProtectMemory = 99,
51 kHelCallSubmitSynchronizeSpace = 53,
52 kHelCallUnmapMemory = 36,
53 kHelCallPointerPhysical = 43,
54 kHelCallSubmitReadMemory = 77,
55 kHelCallSubmitWriteMemory = 78,
56 kHelCallMemoryInfo = 26,
57 kHelCallSubmitManageMemory = 46,
58 kHelCallUpdateMemory = 47,
59 kHelCallSubmitLockMemoryView = 48,
60 kHelCallLoadahead = 49,
61 kHelCallCreateVirtualizedSpace = 50,
62
63 kHelCallCreateThread = 67,
64 kHelCallQueryThreadStats = 95,
65 kHelCallSetPriority = 85,
66 kHelCallYield = 34,
67 kHelCallSubmitObserve = 74,
68 kHelCallKillThread = 87,
69 kHelCallInterruptThread = 86,
70 kHelCallResume = 61,
71 kHelCallLoadRegisters = 75,
72 kHelCallStoreRegisters = 76,
73 kHelCallQueryRegisterInfo = 102,
74 kHelCallWriteFsBase = 41,
75 kHelCallGetClock = 42,
76 kHelCallSubmitAwaitClock = 80,
77 kHelCallCreateVirtualizedCpu = 37,
78 kHelCallRunVirtualizedCpu = 38,
79 kHelCallAssertVirtualizedIrq = 107,
80 kHelCallGetRandomBytes = 101,
81 kHelCallWriteGsBase = 54,
82 kHelCallReadFsBase = 55,
83 kHelCallReadGsBase = 56,
84 kHelCallGetCurrentCpu = 57,
85
86 kHelCallCreateStream = 68,
87 kHelCallSubmitAsync = 79,
88 kHelCallShutdownLane = 91,
89
90 kHelCallFutexWait = 73,
91 kHelCallFutexWake = 71,
92
93 kHelCallCreateOneshotEvent = 96,
94 kHelCallCreateBitsetEvent = 97,
95 kHelCallRaiseEvent = 98,
96 kHelCallAccessIrq = 14,
97 kHelCallAcknowledgeIrq = 81,
98 kHelCallSubmitAwaitEvent = 82,
99 kHelCallAutomateIrq = 94,
100
101 kHelCallAccessIo = 11,
102 kHelCallEnableIo = 12,
103 kHelCallEnableFullIo = 35,
104
105 kHelCallBindKernlet = 93,
106
107 kHelCallGetAffinity = 103,
108 kHelCallSetAffinity = 100,
109
110 kHelCallCreateToken = 104,
111
112 kHelCallSuper = 0x80000000
113};
114
115enum {
116 kHelErrNone = 0,
117 kHelErrBufferTooSmall = 1,
118 kHelErrBadDescriptor = 2,
119 kHelErrTimeout = 3,
120 kHelErrNoDescriptor = 4,
121 kHelErrIllegalSyscall = 5,
122 kHelErrIllegalObject = 6,
123 kHelErrIllegalArgs = 7,
124 kHelErrLaneShutdown = 8,
125 kHelErrEndOfLane = 9,
126 kHelErrFault = 10,
127 kHelErrThreadTerminated = 11,
128 kHelErrCancelled = 12,
129 kHelErrTransmissionMismatch = 13,
130 kHelErrQueueTooSmall = 14,
131 kHelErrIllegalState = 15,
132 kHelErrNoHardwareSupport = 16,
133 kHelErrNoMemory = 17,
134 kHelErrUnsupportedOperation = 18,
135 kHelErrOutOfBounds = 19,
136 kHelErrDismissed = 20,
137 kHelErrRemoteFault = 21,
138 kHelErrAlreadyExists = 22,
139 kHelErrBadPermissions = 23,
140 kHelErrOther = 24,
141 kHelErrFutexRace = 25,
142 kHelErrBadRights = 26,
143};
144
145typedef uint32_t HelRights;
146
147// No right but easier to recognize in code than a zero literal.
148// - General: descriptor properties can be queried without any rights.
149// - Memory view: memory size can be queried without any rights.
150// - Thread: statistics can be queried without any rights.
151static const HelRights kHelRightNull = 0;
152// Right to map into an object.
153// - Universe: required to transfer into the universe.
154// - Universe: required to close descriptors in the universe.
155// - Universe: required to create a thread in the universe.
156// - Address space: required to map into the space.
157// - Address space: required to change memory protection.
158// - Virtualized space: required to map into the space.
159// - DMA space: required to map into the space.
160static const HelRights kHelRightGrant = UINT32_C(1) << 0;
161// Right to map from an object.
162// - Universe: required to transfer out of the universe.
163// - Universe: required to create a thread in the universe.
164static const HelRights kHelRightTake = UINT32_C(1) << 1;
165// Right to read data.
166// - IPC queue: required to map readable.
167// - Memory view: required to read.
168// - Memory view: required to map readable.
169// - Memory slice: required to map readable.
170// - Address space: required to read from it.
171// - Address space: required to create thread.
172// - Virtualized space: required to read from it.
173// - Thread: required to read registers.
174// - Thread: required to read memory in its address space.
175// - Thread: required to get the affinity.
176// - Virtualized CPUs: required to read registers.
177static const HelRights kHelRightRead = UINT32_C(1) << 2;
178// Right to write data.
179// - IPC queue: required to map writeable.
180// - Memory view: required to write.
181// - Memory view: required to map writeable.
182// - Memory slice: required to map writeable.
183// - Address space: required to write to it.
184// - Address space: required to create thread.
185// - Virtualized space: required to write to it.
186// - Thread: required to write registers.
187// - Thread: required to write memory in its address space.
188// - Thread: required to set the affinity.
189// - Virtualized CPUs: required to write registers.
190static const HelRights kHelRightWrite = UINT32_C(1) << 3;
191// Right to execute code.
192// - Memory view: required to map executable.
193// - Memory slice: required to map executable.
194static const HelRights kHelRightExecute = UINT32_C(1) << 4;
195// Right to execute operations.
196// - IPC queue: required to submit.
197// - Lane: required to do exchange messages.
198// - Virtualized CPUs: required to run.
199static const HelRights kHelRightInvoke = UINT32_C(1) << 5;
200// Right to build new objects on top of existing ones.
201// - IPC queue: required to map.
202// - Universe: required to create thread.
203// - Address space: required to create thread.
204// - Memory view: required to map.
205// - Memory view: required to create copy-on-write view.
206// - Memory view: required to map into indirect memory.
207// - Memory view: required to create slice.
208// - Memory view: required to bind to kernlet.
209// - Memory slice: required to map.
210// - Memory slice: required to map into indirect memory.
211// - Virtualized space: required to create virtualized CPU.
212// - I/O objects: required to enable userspace I/O.
213// - Kernlets: required to create a bound kernlet from it.
214// - Bound kernlets: required to attach to an IRQ.
215static const HelRights kHelRightAssign = UINT32_C(1) << 6;
216// Right to derive new objects that affect the original one.
217// - Memory view: required to fork.
218static const HelRights kHelRightDerive = UINT32_C(1) << 7;
219// Right to add, remove or manipulate components.
220// - Memory views: required to perform loadahead.
221// - Address space: required to synchronize.
222// - Address space: required to resolve physical addresses.
223// - DMA space: required to populate.
224// - DMA space: required to resolve physical addresses.
225static const HelRights kHelRightProvision = UINT32_C(1) << 8;
226// Right to pin memory pages.
227// - Memory view: required to pin pages.
228static const HelRights kHelRightPin = UINT32_C(1) << 9;
229// Right to perform memory fences.
230// - Memory view: required for fences.
231static const HelRights kHelRightFence = UINT32_C(1) << 10;
232// Right to wait on an object.
233// - IPC queue: required to drive.
234// - Thread: required to observe.
235// - Event: required to wait.
236// - IRQ: required to wait.
237// - IRQ: required to attach a kernlet.
238static const HelRights kHelRightWait = UINT32_C(1) << 11;
239// Right to signal an object.
240// - IPC queue: required to alert.
241// - Thread: required to interrupt.
242// - Event: required to raise.
243// - Event: required to bind to kernlet.
244// - IRQ: required to acknowledge.
245// - IRQ: required to attach a kernlet.
246// - Virtualized CPUs: required to raise an interrupt.
247static const HelRights kHelRightSignal = UINT32_C(1) << 12;
248// Right to manage an object (includes potentially destructive operations).
249// - Lane: required to shut down.
250// - Memory view: required to resize.
251// - Memory view: required to manage.
252// - Memory view: required to invalidate.
253// - Thread: required to set priority.
254// - Thread: required to resume.
255// - Thread: required to kill.
256static const HelRights kHelRightManage = UINT32_C(1) << 13;
257
258struct HelX86SegmentRegister {
259 uint64_t base;
260 uint32_t limit;
261 uint16_t selector;
262 uint8_t type, present, dpl, db, s, l, g, avl;
263};
264
265struct HelX86DescriptorTable {
266 uint64_t base;
267 uint16_t limit;
268};
269
270struct HelX86VirtualizationRegs {
271 uint64_t rax;
272 uint64_t rbx;
273 uint64_t rcx;
274 uint64_t rdx;
275 uint64_t rsi;
276 uint64_t rdi;
277 uint64_t rbp;
278 uint64_t r8;
279 uint64_t r9;
280 uint64_t r10;
281 uint64_t r11;
282 uint64_t r12;
283 uint64_t r13;
284 uint64_t r14;
285 uint64_t r15;
286
287 uint64_t rsp;
288 uint64_t rip;
289 uint64_t rflags;
290
291 struct HelX86SegmentRegister cs, ds, es, fs, gs, ss;
292 struct HelX86SegmentRegister tr, ldt;
293 struct HelX86DescriptorTable gdt, idt;
294
295 uint64_t cr0, cr2, cr3, cr4, cr8;
296 uint64_t efer;
297 uint64_t apic_base;
298};
299
300struct HelRiscv64VirtualizationRegs {
301 union {
302 uint64_t x[32];
303
304 struct {
305 uint64_t zero;
306 uint64_t ra;
307 uint64_t sp;
308 uint64_t gp;
309 uint64_t tp;
310 uint64_t t0;
311 uint64_t t1;
312 uint64_t t2;
313 uint64_t s0;
314 uint64_t s1;
315 uint64_t a0;
316 uint64_t a1;
317 uint64_t a2;
318 uint64_t a3;
319 uint64_t a4;
320 uint64_t a5;
321 uint64_t a6;
322 uint64_t a7;
323 uint64_t s2;
324 uint64_t s3;
325 uint64_t s4;
326 uint64_t s5;
327 uint64_t s6;
328 uint64_t s7;
329 uint64_t s8;
330 uint64_t s9;
331 uint64_t s10;
332 uint64_t s11;
333 uint64_t t3;
334 uint64_t t4;
335 uint64_t t5;
336 uint64_t t6;
337 };
338 };
339
340 uint64_t pc;
341 uint8_t kernelMode;
342
343 // CSRs
344 uint64_t sstatus;
345 uint64_t sie;
346 uint64_t stvec;
347 uint64_t sscratch;
348 uint64_t sepc;
349 uint64_t scause;
350 uint64_t stval;
351 uint64_t sip;
352 uint64_t satp;
353 uint64_t stimecmp;
354};
355
356#if defined(__riscv) && __riscv_xlen == 64
357typedef struct HelRiscv64VirtualizationRegs HelVirtualizationRegs;
358#else
359typedef struct HelX86VirtualizationRegs HelVirtualizationRegs;
360#endif
361
362enum {
363 kHelNullHandle = 0,
364 kHelThisUniverse = -1,
365 kHelThisThread = -2,
366 kHelZeroMemory = -3
367};
368
369enum {
370 kHelWaitInfinite = -1
371};
372
373enum {
374 kHelAbiSystemV = 1
375};
376
377enum {
378 kHelActionNone = 0,
379 kHelActionDismiss = 11,
380 kHelActionOffer = 5,
381 kHelActionAccept = 6,
382 kHelActionImbueCredentials = 8,
383 kHelActionExtractCredentials = 9,
384 kHelActionSendFromBuffer = 1,
385 kHelActionSendFromBufferSg = 10,
386 kHelActionRecvInline = 7,
387 kHelActionRecvToBuffer = 3,
388 kHelActionPushDescriptor = 2,
389 kHelActionPullDescriptor = 4
390};
391
392enum {
393 kHelItemChain = 1,
394 kHelItemAncillary = 2,
395 kHelItemWantLane = (1 << 16),
396};
397
398enum HelTransferDescriptorFlags {
399 kHelTransferDescriptorOut,
400 kHelTransferDescriptorIn,
401};
402
403struct HelSgItem {
404 void *buffer;
405 size_t length;
406};
407
408struct HelAction {
409 int type;
410 uint32_t flags;
411 // TODO: the following fields could be put into unions
412 void *buffer;
413 size_t length;
414 HelHandle handle;
415};
416
417struct HelDescriptorInfo {
418 int type;
419};
420
421enum HelAllocFlags {
422 kHelAllocContinuous = 4,
423 kHelAllocOnDemand = 1,
424};
425
426struct HelAllocRestrictions {
427 int addressBits;
428};
429
430enum HelManagedFlags {
431 kHelManagedReadahead = 1
432};
433
434enum HelManageRequests {
435 kHelManageInitialize = 1,
436 kHelManageWriteback = 2
437};
438
439enum HelMapFlags {
440 // Additional flags that may be set.
441 kHelMapProtRead = 256,
442 kHelMapProtWrite = 512,
443 kHelMapProtExecute = 1024,
444 kHelMapDontRequireBacking = 128,
445 kHelMapFixed = 2048,
446 kHelMapFixedNoReplace = 4096,
447 kHelMapPreferBottom = 8192
448};
449
450enum HelSliceFlags {
451 kHelSliceCacheWriteCombine = 1,
452};
453
454enum HelThreadFlags {
455 kHelThreadStopped = 1
456};
457
458enum HelObservation {
459 kHelObserveNull = 0,
460 kHelObserveInterrupt = 4,
461 kHelObservePanic = 3,
462 kHelObserveBreakpoint = 1,
463 kHelObservePageFault = 2,
464 kHelObserveGeneralFault = 5,
465 kHelObserveIllegalInstruction = 6,
466 kHelObserveDivByZero = 7,
467 kHelObserveSuperCall = 0x80000000
468};
469
470enum HelRegisterSets {
471 kHelRegsProgram = 1,
472 kHelRegsGeneral = 2,
473 kHelRegsThread = 3,
474 kHelRegsDebug = 4,
475 kHelRegsVirtualization = 5,
476 kHelRegsSimd = 6,
477 kHelRegsSignal = 7,
478 kHelRegsPageFault = 8
479};
480
481enum HelPageFaultFlags {
482 kHelPageFaultMapError = 1,
483 kHelPageFaultAccessError = 2
484};
485
490};
491
492#if defined(__x86_64__)
493enum HelRegisterIndex {
494 kHelRegRax = 0,
495 kHelRegRbx = 1,
496 kHelRegRcx = 2,
497 kHelRegRdx = 3,
498 kHelRegRdi = 4,
499 kHelRegRsi = 5,
500 kHelRegR8 = 6,
501 kHelRegR9 = 7,
502 kHelRegR10 = 8,
503 kHelRegR11 = 9,
504 kHelRegR12 = 10,
505 kHelRegR13 = 11,
506 kHelRegR14 = 12,
507 kHelRegR15 = 13,
508 kHelRegRbp = 14,
509
510 kHelNumGprs = 15,
511
512 kHelRegIp = 0,
513 kHelRegSp = 1
514};
515
516enum HelSyscallArgs {
517 kHelRegNumber = kHelRegRdi,
518 kHelRegError = kHelRegRdi,
519
520 kHelRegArg0 = kHelRegRsi,
521 kHelRegArg1 = kHelRegRdx,
522 kHelRegArg2 = kHelRegRax,
523 kHelRegArg3 = kHelRegR8,
524 kHelRegArg4 = kHelRegR9,
525 kHelRegArg5 = kHelRegR10,
526 kHelRegArg6 = kHelRegR12,
527 kHelRegArg7 = kHelRegR13,
528 kHelRegArg8 = kHelRegR14,
529
530 kHelRegOut0 = kHelRegRsi,
531 kHelRegOut1 = kHelRegRdx,
532 kHelRegOut2 = kHelRegRax
533};
534
535#elif defined(__aarch64__)
536enum HelRegisterIndex {
537 kHelRegX0 = 0,
538 kHelRegX1,
539 kHelRegX2,
540 kHelRegX3,
541 kHelRegX4,
542 kHelRegX5,
543 kHelRegX6,
544 kHelRegX7,
545 kHelRegX8,
546 kHelRegX9,
547 kHelRegX10,
548 kHelRegX11,
549 kHelRegX12,
550 kHelRegX13,
551 kHelRegX14,
552 kHelRegX15,
553 kHelRegX16,
554 kHelRegX17,
555 kHelRegX18,
556 kHelRegX19,
557 kHelRegX20,
558 kHelRegX21,
559 kHelRegX22,
560 kHelRegX23,
561 kHelRegX24,
562 kHelRegX25,
563 kHelRegX26,
564 kHelRegX27,
565 kHelRegX28,
566 kHelRegX29,
567 kHelRegX30,
568
569 kHelNumGprs = 31,
570
571 kHelRegIp = 0,
572 kHelRegSp = 1
573};
574
575enum HelSyscallArgs {
576 kHelRegNumber = kHelRegX0,
577 kHelRegError = kHelRegX0,
578
579 kHelRegArg0 = kHelRegX1,
580 kHelRegArg1 = kHelRegX2,
581 kHelRegArg2 = kHelRegX3,
582 kHelRegArg3 = kHelRegX4,
583 kHelRegArg4 = kHelRegX5,
584 kHelRegArg5 = kHelRegX6,
585 kHelRegArg6 = kHelRegX7,
586 kHelRegArg7 = kHelRegX8,
587 kHelRegArg8 = kHelRegX9,
588
589 kHelRegOut0 = kHelRegX1,
590 kHelRegOut1 = kHelRegX2,
591 kHelRegOut2 = kHelRegX3
592};
593
594#elif defined(__riscv) && __riscv_xlen == 64
595enum HelRegisterIndex {
596 kHelRegRa = 0,
597 kHelRegGp,
598 kHelRegTp,
599 kHelRegT0,
600 kHelRegT1,
601 kHelRegT2,
602 kHelRegS0,
603 kHelRegS1,
604 kHelRegA0,
605 kHelRegA1,
606 kHelRegA2,
607 kHelRegA3,
608 kHelRegA4,
609 kHelRegA5,
610 kHelRegA6,
611 kHelRegA7,
612 kHelRegS2,
613 kHelRegS3,
614 kHelRegS4,
615 kHelRegS5,
616 kHelRegS6,
617 kHelRegS7,
618 kHelRegS8,
619 kHelRegS9,
620 kHelRegS10,
621 kHelRegS11,
622 kHelRegT3,
623 kHelRegT4,
624 kHelRegT5,
625 kHelRegT6,
626 kHelNumGprs,
627 kHelRegIp = 0,
628 kHelRegSp = 1
629};
630enum HelSyscallArgs {
631 kHelRegNumber = kHelRegA0,
632 kHelRegError = kHelRegA0,
633 kHelRegArg0 = kHelRegA1,
634 kHelRegArg1 = kHelRegA2,
635 kHelRegArg2 = kHelRegA3,
636 kHelRegArg3 = kHelRegA4,
637 kHelRegArg4 = kHelRegA5,
638 kHelRegArg5 = kHelRegA6,
639 kHelRegArg6 = kHelRegA7,
640 kHelRegArg7 = kHelRegS2,
641 kHelRegArg8 = kHelRegS3,
642
643 kHelRegOut0 = kHelRegA1,
644 kHelRegOut1 = kHelRegA2,
645 kHelRegOut2 = kHelRegA3
646};
647
648#endif
649
650struct HelQueueParameters {
651 uint32_t flags;
652 unsigned int numChunks;
653 size_t chunkSize;
654 unsigned int numSqChunks;
655};
656
658static const int kHelUserNotifyCqProgress = (1 << 0);
660static const int kHelUserNotifySupplySqChunks = (1 << 1);
662static const int kHelUserNotifyError = (1 << 14);
664static const int kHelUserNotifyAlert = (1 << 15);
665
667static const int kHelKernelNotifySqProgress = (1 << 0);
669static const int kHelKernelNotifySupplyCqChunks = (1 << 1);
670
672static const uint32_t kHelDriveWait = (1 << 0);
673
675static const uint32_t kHelSubmitCancel = 256;
677static const uint32_t kHelSubmitAsyncNop = 1;
679static const uint32_t kHelSubmitExchangeMsgs = 2;
681static const uint32_t kHelSubmitAwaitClock = 3;
683static const uint32_t kHelSubmitAwaitEvent = 4;
685static const uint32_t kHelSubmitProtectMemory = 5;
687static const uint32_t kHelSubmitSynchronizeSpace = 6;
689static const uint32_t kHelSubmitReadMemory = 7;
691static const uint32_t kHelSubmitWriteMemory = 8;
693static const uint32_t kHelSubmitManageMemory = 9;
695static const uint32_t kHelSubmitLockMemoryView = 10;
697static const uint32_t kHelSubmitObserve = 11;
699static const uint32_t kHelSubmitResizeMemory = 12;
701static const uint32_t kHelSubmitForkMemory = 13;
703static const uint32_t kHelSubmitWritebackFence = 14;
705static const uint32_t kHelSubmitInvalidateMemory = 15;
707static const uint32_t kHelSubmitPopulateSpace = 16;
708
710struct HelQueue {
715
720
724
728};
729
731static const int kHelNextPresent = (1 << 24);
732
734static const int kHelProgressMask = 0xFFFFFF;
736static const int kHelProgressDone = (1 << 25);
738static const int kHelProgressFull = (1 << 26);
739
740struct HelChunk {
743 int next;
744
746 int progressFutex;
747
749 char buffer[];
750};
751
755 unsigned int length;
757 unsigned int opcode;
759 void *context;
760};
761
764 uint64_t cancellationTag;
765};
766
771 HelHandle lane;
773 size_t count;
775 uint32_t flags;
776};
777
781 uint64_t counter;
784};
785
789 HelHandle handle;
791 uint64_t sequence;
794};
795
799 HelHandle spaceHandle;
801 void *pointer;
803 size_t size;
805 uint32_t flags;
806};
807
811 HelHandle spaceHandle;
813 void *pointer;
815 size_t size;
816};
817
821 HelHandle handle;
823 uintptr_t address;
825 size_t length;
827 void *buffer;
828};
829
833 HelHandle handle;
835 uintptr_t address;
837 size_t length;
839 const void *buffer;
840};
841
845 HelHandle handle;
846};
847
851 HelHandle handle;
853 uintptr_t offset;
855 size_t size;
856};
857
861 HelHandle handle;
862};
863
867 HelHandle handle;
869 size_t newSize;
870};
871
875 HelHandle handle;
876};
877
881 HelHandle handle;
883 uintptr_t offset;
885 size_t size;
886};
887
891 HelHandle handle;
893 uintptr_t offset;
895 size_t size;
896};
897
901 HelHandle handle;
903 uintptr_t address;
905 size_t length;
906};
907
908struct HelSimpleResult {
909 HelError error;
910 int reserved;
911};
912
913struct HelCredentialsResult {
914 HelError error;
915 int reserved;
916 char credentials[16];
917};
918
919struct HelManageResult {
920 HelError error;
921 int type;
922 uintptr_t offset;
923 size_t length;
924};
925
926struct HelObserveResult {
927 HelError error;
928 unsigned int observation;
929};
930
931struct HelInlineResult {
932 HelError error;
933 int reserved;
934 size_t length;
935 char data[];
936};
937
938struct HelInlineResultNoFlex {
939 HelError error;
940 int reserved;
941 size_t length;
942};
943
944struct HelLengthResult {
945 HelError error;
946 int reserved;
947 size_t length;
948};
949
950struct HelHandleResult {
951 HelError error;
952 int reserved;
953 HelHandle handle;
954};
955
956struct HelEventResult {
957 HelError error;
958 uint32_t bitset;
959 uint64_t sequence;
960};
961
962enum HelAckFlags {
963 kHelAckAcknowledge = 2,
964 kHelAckNack = 3,
965 kHelAckKick = 1,
966 kHelAckClear = 0x100,
967};
968
969union HelKernletData {
970 HelHandle handle;
971};
972
973struct HelThreadStats {
974 uint64_t userTime;
975};
976
977enum {
978 kHelVmexitHlt = 0,
979 kHelVmexitTranslationFault = 1,
980 kHelVmexitHyperCall = 2,
981 kHelVmexitInstructionTrap = 3,
982 kHelVmexitError = -1,
983 kHelVmexitUnknownPlatformSpecificExitCode = -2,
984};
985
986enum {
987 kHelVmFaultRead = 1 << 0,
988 kHelVmFaultWrite = 1 << 1,
989 kHelVmFaultExecute = 1 << 2,
990};
991
992#if defined(__riscv) && __riscv_xlen == 64
993
994struct HelVmexitReason {
995 uint32_t exitReason;
996 // If bit 63 is set then stores a compressed unexpanded instruction,
997 // otherwise stores a normal 32-bit instruction (possibly originally compressed in which case bits 1:0 aren't 0b11).
998 uint64_t instruction;
999 size_t address;
1000 size_t flags;
1001};
1002
1003#else
1004
1005struct HelVmexitReason {
1006 uint32_t exitReason;
1007 uint32_t code;
1008 size_t address;
1009 size_t flags;
1010};
1011
1012#endif
1013
1014// see RFC 5424
1015enum HelLogSeverity {
1016 kHelLogSeverityEmergency,
1017 kHelLogSeverityAlert,
1018 kHelLogSeverityCritical,
1019 kHelLogSeverityError,
1020 kHelLogSeverityWarning,
1021 kHelLogSeverityNotice,
1022 kHelLogSeverityInfo,
1023 kHelLogSeverityDebug,
1024};
1025
1028
1036HEL_C_LINKAGE HelError helLog(const enum HelLogSeverity severity, const char *string, size_t length);
1037
1043HEL_C_LINKAGE void helPanic(const char *string, size_t length)
1044 __attribute__ (( noreturn ));
1045
1049
1051HEL_C_LINKAGE HelError helNop();
1052
1056HEL_C_LINKAGE HelError helSubmitAsyncNop(HelHandle queueHandle, uintptr_t context);
1057
1061
1065HEL_C_LINKAGE HelError helCreateUniverse(HelHandle *handle);
1066
1074HEL_C_LINKAGE HelError
1075helTransferDescriptor(HelHandle handle, HelHandle universeHandle,
1076 enum HelTransferDescriptorFlags direction, HelHandle *outHandle);
1077
1078HEL_C_LINKAGE HelError helDescriptorInfo(HelHandle handle, struct HelDescriptorInfo *info);
1079
1085HEL_C_LINKAGE HelError helGetCredentials(HelHandle handle, uint32_t flags,
1086 char *credentials);
1087
1093HEL_C_LINKAGE HelError helCloseDescriptor(HelHandle universeHandle, HelHandle handle);
1094
1098
1104HEL_C_LINKAGE HelError helCreateQueue(const struct HelQueueParameters *params,
1105 HelHandle *handle);
1106
1118HEL_C_LINKAGE HelError helDriveQueue(HelHandle queueHandle, uint32_t flags, uint32_t notifyMask);
1119
1126HEL_C_LINKAGE HelError helAlertQueue(HelHandle queueHandle);
1127
1131
1141HEL_C_LINKAGE HelError helAllocateMemory(size_t size, uint32_t flags,
1142 const struct HelAllocRestrictions *restrictions, HelHandle *handle);
1143
1150HEL_C_LINKAGE HelError helResizeMemory(HelHandle handle, size_t newSize);
1151
1163HEL_C_LINKAGE HelError helCreateManagedMemory(size_t size, uint32_t flags,
1164 HelHandle *backingHandle, HelHandle *frontalHandle);
1165
1176HEL_C_LINKAGE HelError helCopyOnWrite(HelHandle memory,
1177 uintptr_t offset, size_t size, HelHandle *handle);
1178
1179HEL_C_LINKAGE HelError helAccessPhysical(uintptr_t physical,
1180 size_t size, HelHandle *handle);
1181
1187HEL_C_LINKAGE HelError helCreateIndirectMemory(size_t numSlots, HelHandle *handle);
1188
1205HEL_C_LINKAGE HelError helAlterMemoryIndirection(HelHandle indirectHandle, size_t slotIndex,
1206 HelHandle memoryHandle, uintptr_t offset, size_t size);
1207
1208HEL_C_LINKAGE HelError helCreateSliceView(HelHandle bundle, uintptr_t offset, size_t size,
1209 uint32_t flags, HelHandle *handle);
1210
1218HEL_C_LINKAGE HelError helForkMemory(HelHandle handle, HelHandle *forkedHandle);
1219
1223HEL_C_LINKAGE HelError helCreateSpace(HelHandle *handle);
1224
1242HEL_C_LINKAGE HelError helMapMemory(HelHandle memoryHandle, HelHandle spaceHandle,
1243 void *pointer, uintptr_t offset, size_t size, uint32_t flags, void **actualPointer);
1244
1245
1256HEL_C_LINKAGE HelError helUnmapMemory(HelHandle spaceHandle, void *pointer, size_t size);
1257
1258HEL_C_LINKAGE HelError helPointerPhysical(HelHandle spaceHandle, const void *pointer, uintptr_t *physical);
1259
1260HEL_C_LINKAGE HelError helMemoryInfo(HelHandle handle,
1261 size_t *size);
1262
1263HEL_C_LINKAGE HelError helUpdateMemory(HelHandle handle, int type, uintptr_t offset, size_t length);
1264
1275HEL_C_LINKAGE HelError helLoadahead(HelHandle handle, uintptr_t offset, size_t length);
1276
1277HEL_C_LINKAGE HelError helCreateVirtualizedSpace(HelHandle *handle);
1278
1282
1296HEL_C_LINKAGE HelError helCreateThread(HelHandle universe, HelHandle spaceHandle,
1297 HelAbi abi, void *ip, void *sp, uint32_t flags, HelHandle *handle);
1298
1304HEL_C_LINKAGE HelError helQueryThreadStats(HelHandle handle, struct HelThreadStats *stats);
1305
1314HEL_C_LINKAGE HelError helSetPriority(HelHandle handle, int priority);
1315
1317HEL_C_LINKAGE HelError helYield();
1318
1322HEL_C_LINKAGE HelError helKillThread(HelHandle handle);
1323
1330HEL_C_LINKAGE HelError helInterruptThread(HelHandle handle);
1331
1338HEL_C_LINKAGE HelError helResume(HelHandle handle);
1339
1347HEL_C_LINKAGE HelError helLoadRegisters(HelHandle handle, int set, void *image);
1348
1356HEL_C_LINKAGE HelError helStoreRegisters(HelHandle handle, int set, const void *image);
1357
1360// Register set to query information for.
1363HEL_C_LINKAGE HelError helQueryRegisterInfo(int set, struct HelRegisterInfo *info);
1364
1365HEL_C_LINKAGE HelError helWriteFsBase(void *pointer);
1366
1367HEL_C_LINKAGE HelError helReadFsBase(void **pointer);
1368
1369HEL_C_LINKAGE HelError helWriteGsBase(void *pointer);
1370
1371HEL_C_LINKAGE HelError helReadGsBase(void **pointer);
1372
1374HEL_C_LINKAGE HelError helGetCurrentCpu(int *cpu);
1375
1380HEL_C_LINKAGE HelError helGetClock(uint64_t *counter);
1381
1382HEL_C_LINKAGE HelError helCreateVirtualizedCpu(HelHandle handle, HelHandle *out_handle);
1383
1384HEL_C_LINKAGE HelError helRunVirtualizedCpu(HelHandle handle, struct HelVmexitReason *reason);
1385
1386HEL_C_LINKAGE HelError helAssertVirtualizedIrq(HelHandle handle, uint64_t irq, uint8_t level);
1387
1388HEL_C_LINKAGE HelError helGetRandomBytes(void *buffer, size_t wantedSize, size_t *actualSize);
1389
1399HEL_C_LINKAGE HelError helGetAffinity(HelHandle handle, uint8_t *mask, size_t size, size_t *actualSize);
1400
1408HEL_C_LINKAGE HelError helSetAffinity(HelHandle handle, uint8_t *mask, size_t size);
1409
1413
1421HEL_C_LINKAGE HelError helCreateStream(HelHandle *lane1, HelHandle *lane2, uint32_t attach_credentials);
1422
1423HEL_C_LINKAGE HelError helShutdownLane(HelHandle handle);
1424
1432HEL_C_LINKAGE HelError helCreateToken(HelHandle *handle);
1433
1437
1446HEL_C_LINKAGE HelError helFutexWait(int *pointer, int expected, int64_t deadline);
1447
1453HEL_C_LINKAGE HelError helFutexWake(int *pointer, unsigned int count);
1454
1458
1462HEL_C_LINKAGE HelError helCreateOneshotEvent(HelHandle *handle);
1463
1467HEL_C_LINKAGE HelError helCreateBitsetEvent(HelHandle *handle);
1468
1472HEL_C_LINKAGE HelError helRaiseEvent(HelHandle handle);
1473
1474HEL_C_LINKAGE HelError helAccessIrq(int number, HelHandle *handle);
1475
1476HEL_C_LINKAGE HelError helAcknowledgeIrq(HelHandle handle, uint32_t flags, uint64_t sequence);
1477
1478HEL_C_LINKAGE HelError helAutomateIrq(HelHandle handle, uint32_t flags, HelHandle kernlet);
1479
1483
1484HEL_C_LINKAGE HelError helAccessIo(uintptr_t *port_array, size_t num_ports,
1485 HelHandle *handle);
1486
1490HEL_C_LINKAGE HelError helEnableIo(HelHandle handle);
1491
1492HEL_C_LINKAGE HelError helEnableFullIo();
1493
1497
1507HEL_C_LINKAGE HelError helBindKernlet(HelHandle handle,
1508 const union HelKernletData *data, size_t numData, HelHandle *boundHandle);
1509
1511
1512extern inline __attribute__ (( always_inline )) const char *_helErrorString(HelError code) {
1513 switch(code) {
1514 case kHelErrNone:
1515 return "Success";
1516 case kHelErrIllegalSyscall:
1517 return "Illegal syscall";
1518 case kHelErrIllegalArgs:
1519 return "Illegal arguments";
1520 case kHelErrIllegalState:
1521 return "Illegal state";
1522 case kHelErrUnsupportedOperation:
1523 return "Unsupported operation";
1524 case kHelErrNoDescriptor:
1525 return "No such descriptor";
1526 case kHelErrBadDescriptor:
1527 return "Illegal descriptor for this operation";
1528 case kHelErrThreadTerminated:
1529 return "Thread terminated already";
1530 case kHelErrLaneShutdown:
1531 return "Lane shutdown";
1532 case kHelErrEndOfLane:
1533 return "End of lane";
1534 case kHelErrDismissed:
1535 return "IPC item dismissed by remote";
1536 case kHelErrBufferTooSmall:
1537 return "Buffer too small";
1538 case kHelErrQueueTooSmall:
1539 return "Buffer too small";
1540 case kHelErrFault:
1541 return "Segfault";
1542 case kHelErrNoHardwareSupport:
1543 return "Missing hardware support for this feature";
1544 case kHelErrNoMemory:
1545 return "Out of memory";
1546 case kHelErrTransmissionMismatch:
1547 return "Transmission mismatch";
1548 case kHelErrCancelled:
1549 return "Cancelled";
1550 case kHelErrOutOfBounds:
1551 return "Out of bounds";
1552 case kHelErrAlreadyExists:
1553 return "Already exists";
1554 case kHelErrBadRights:
1555 return "Missing rights for this operation";
1556 default:
1557 return 0;
1558 }
1559}
1560
1561extern inline __attribute__ (( always_inline )) void _helCheckFailed(HelError err_code,
1562 const char *string, int fatal) {
1563 helLog(kHelLogSeverityError, string, strlen(string));
1564
1565 const char *err_string = _helErrorString(err_code);
1566 if(err_string == 0)
1567 err_string = "(Unexpected error code)";
1568 helLog(kHelLogSeverityError, err_string, strlen(err_string));
1569 helLog(kHelLogSeverityError, "\n", 1);
1570
1571 if(fatal)
1572 helPanic(0, 0);
1573}
1574
1575#define HEL_STRINGIFY_AUX(x) #x
1576#define HEL_STRINGIFY(x) HEL_STRINGIFY_AUX(x)
1577
1578#define HEL_CHECK(expr) do { HelError __error = expr; if(__error != kHelErrNone) \
1579 _helCheckFailed(__error, "HEL_CHECK failed: " #expr "\n" \
1580 " In file " __FILE__ " on line " HEL_STRINGIFY(__LINE__) "\n", 1); } while(0)
1581#define HEL_SOFT_CHECK(expr) do { HelError __error = expr; if(__error != kHelErrNone) \
1582 _helCheckFailed(__error, "HEL_SOFT_CHECK failed: " #expr "\n" \
1583 " In file " __FILE__ " on line " HEL_STRINGIFY(__LINE__) "\n", 0); } while(0)
1584
1585#endif // HEL_H
1586
HEL_C_LINKAGE HelError helLog(const enum HelLogSeverity severity, const char *string, size_t length)
Writes a text message (e.g., a line of text) to the kernel's log.
HEL_C_LINKAGE HelError helSetPriority(HelHandle handle, int priority)
Set the priority of a thread.
HEL_C_LINKAGE HelError helYield()
Yields the current thread.
static const int kHelUserNotifyAlert
Set in userNotify when the queue is alerted.
Definition hel.h:664
HEL_C_LINKAGE HelError helTransferDescriptor(HelHandle handle, HelHandle universeHandle, enum HelTransferDescriptorFlags direction, HelHandle *outHandle)
Copies descriptors from the current universe to another universe.
HEL_C_LINKAGE HelError helCloseDescriptor(HelHandle universeHandle, HelHandle handle)
Closes a descriptor.
HEL_C_LINKAGE HelError helQueryRegisterInfo(int set, struct HelRegisterInfo *info)
Query register-related information.
HEL_C_LINKAGE HelError helMapMemory(HelHandle memoryHandle, HelHandle spaceHandle, void *pointer, uintptr_t offset, size_t size, uint32_t flags, void **actualPointer)
Maps memory objects into an address space.
HEL_C_LINKAGE HelError helSetAffinity(HelHandle handle, uint8_t *mask, size_t size)
Set a thread's CPU affinity mask.
static const int kHelKernelNotifySqProgress
Set in kernelNotify after userspace has added SQ elements.
Definition hel.h:667
static const uint32_t kHelSubmitInvalidateMemory
SQ opcode: invalidate memory.
Definition hel.h:705
HEL_C_LINKAGE HelError helQueryThreadStats(HelHandle handle, struct HelThreadStats *stats)
Query run-time statistics of a thread.
HEL_C_LINKAGE HelError helAlterMemoryIndirection(HelHandle indirectHandle, size_t slotIndex, HelHandle memoryHandle, uintptr_t offset, size_t size)
Modifies indirect memory objects.
HEL_C_LINKAGE HelError helCreateBitsetEvent(HelHandle *handle)
Create an event consisting of multiple bits that can fire independently.
HEL_C_LINKAGE HelError helGetCredentials(HelHandle handle, uint32_t flags, char *credentials)
Returns the credentials associated with a given descriptor.
HEL_C_LINKAGE HelError helKillThread(HelHandle handle)
Kill (i.e., terminate) a thread.
static const uint32_t kHelSubmitWriteMemory
SQ opcode: write memory.
Definition hel.h:691
HEL_C_LINKAGE HelError helGetAffinity(HelHandle handle, uint8_t *mask, size_t size, size_t *actualSize)
Get a thread's CPU affinity mask.
static const uint32_t kHelSubmitAsyncNop
SQ opcode: asynchronous no-op (for testing/profiling).
Definition hel.h:677
HEL_C_LINKAGE HelError helGetClock(uint64_t *counter)
Read the system-wide monotone clock.
HEL_C_LINKAGE HelError helLoadahead(HelHandle handle, uintptr_t offset, size_t length)
Notifies the kernel that a certain range of memory should be preloaded.
HEL_C_LINKAGE HelError helLoadRegisters(HelHandle handle, int set, void *image)
Load a register image (e.g., from a thread).
HEL_C_LINKAGE HelError helCopyOnWrite(HelHandle memory, uintptr_t offset, size_t size, HelHandle *handle)
Creates memory object that obtains its memory by copy-on-write from another memory object.
HEL_C_LINKAGE void helPanic(const char *string, size_t length) __attribute__((noreturn))
Kills the current thread and writes an error message to the kernel's log.
HEL_C_LINKAGE HelError helUnmapMemory(HelHandle spaceHandle, void *pointer, size_t size)
Unmaps memory from an address space.
HEL_C_LINKAGE HelError helFutexWake(int *pointer, unsigned int count)
Wakes up all waiters of a futex.
HEL_C_LINKAGE HelError helResizeMemory(HelHandle handle, size_t newSize)
Resizes a memory object.
static const int kHelProgressMask
Mask to extract the number of valid bytes in the chunk.
Definition hel.h:734
static const uint32_t kHelSubmitManageMemory
SQ opcode: manage memory.
Definition hel.h:693
HEL_C_LINKAGE HelError helCreateManagedMemory(size_t size, uint32_t flags, HelHandle *backingHandle, HelHandle *frontalHandle)
Creates a memory object that is managed by userspace.
static const uint32_t kHelSubmitForkMemory
SQ opcode: fork memory.
Definition hel.h:701
HEL_C_LINKAGE HelError helInterruptThread(HelHandle handle)
Interrupt a thread.
static const int kHelProgressFull
Set by the producer once the chunk is full (i.e., no more bytes will be written).
Definition hel.h:738
static const uint32_t kHelSubmitSynchronizeSpace
SQ opcode: synchronize space.
Definition hel.h:687
HEL_C_LINKAGE HelError helRaiseEvent(HelHandle handle)
Raise an event.
static const uint32_t kHelDriveWait
Flag for helDriveQueue: wait until userNotify has any bits not in notifyMask set.
Definition hel.h:672
static const uint32_t kHelSubmitObserve
SQ opcode: observe thread.
Definition hel.h:697
HEL_C_LINKAGE HelError helForkMemory(HelHandle handle, HelHandle *forkedHandle)
Forks memory objects, i.e., copies them using copy-on-write.
HEL_C_LINKAGE HelError helCreateQueue(const struct HelQueueParameters *params, HelHandle *handle)
Creates an IPC queue.
HEL_C_LINKAGE HelError helCreateToken(HelHandle *handle)
Create a token object.
HEL_C_LINKAGE HelError helAllocateMemory(size_t size, uint32_t flags, const struct HelAllocRestrictions *restrictions, HelHandle *handle)
Creates a memory object consisting of unmanaged RAM.
HEL_C_LINKAGE HelError helCreateThread(HelHandle universe, HelHandle spaceHandle, HelAbi abi, void *ip, void *sp, uint32_t flags, HelHandle *handle)
Create a new thread.
HEL_C_LINKAGE HelError helResume(HelHandle handle)
Resume a suspended thread.
static const uint32_t kHelSubmitExchangeMsgs
SQ opcode: exchange messages on a stream.
Definition hel.h:679
static const uint32_t kHelSubmitReadMemory
SQ opcode: read memory.
Definition hel.h:689
static const int kHelNextPresent
Marks the next field as present.
Definition hel.h:731
static const int kHelKernelNotifySupplyCqChunks
Set in kernelNotify after userspace has supplied new chunks.
Definition hel.h:669
HEL_C_LINKAGE HelError helSubmitAsyncNop(HelHandle queueHandle, uintptr_t context)
Does nothing, asynchronously (useful only for profiling).
HEL_C_LINKAGE HelError helStoreRegisters(HelHandle handle, int set, const void *image)
Store a register image (e.g., to a thread).
static const uint32_t kHelSubmitAwaitEvent
SQ opcode: wait for an event.
Definition hel.h:683
static const uint32_t kHelSubmitAwaitClock
SQ opcode: wait for time to pass.
Definition hel.h:681
static const uint32_t kHelSubmitPopulateSpace
SQ opcode: populate a space.
Definition hel.h:707
HEL_C_LINKAGE HelError helAlertQueue(HelHandle queueHandle)
Alerts an IPC queue.
HEL_C_LINKAGE HelError helCreateStream(HelHandle *lane1, HelHandle *lane2, uint32_t attach_credentials)
Create a stream (which always consists of two lanes).
static const uint32_t kHelSubmitProtectMemory
SQ opcode: protect memory.
Definition hel.h:685
static const int kHelUserNotifySupplySqChunks
Set in userNotify after kernel has supplied new SQ chunks.
Definition hel.h:660
HEL_C_LINKAGE HelError helCreateIndirectMemory(size_t numSlots, HelHandle *handle)
Creates a memory object that obtains its memory by delegating to other memory objects.
HEL_C_LINKAGE HelError helGetCurrentCpu(int *cpu)
Gets the index of the cpu which the calling thread is running on.
HEL_C_LINKAGE HelError helNop()
Does nothing (useful only for profiling).
HEL_C_LINKAGE HelError helFutexWait(int *pointer, int expected, int64_t deadline)
Waits on a futex.
HEL_C_LINKAGE HelError helBindKernlet(HelHandle handle, const union HelKernletData *data, size_t numData, HelHandle *boundHandle)
Bind parameters to a kernlet.
static const int kHelUserNotifyCqProgress
Set in userNotify after kernel has written progress.
Definition hel.h:658
HEL_C_LINKAGE HelError helCreateSpace(HelHandle *handle)
Creates a virtual address space that threads can run in.
static const uint32_t kHelSubmitWritebackFence
SQ opcode: writeback fence.
Definition hel.h:703
static const uint32_t kHelSubmitResizeMemory
SQ opcode: resize memory.
Definition hel.h:699
HEL_C_LINKAGE HelError helCreateOneshotEvent(HelHandle *handle)
Create an event that fires at most once.
HEL_C_LINKAGE HelError helDriveQueue(HelHandle queueHandle, uint32_t flags, uint32_t notifyMask)
Drives an IPC queue.
static const uint32_t kHelSubmitLockMemoryView
SQ opcode: lock memory view.
Definition hel.h:695
HEL_C_LINKAGE HelError helCreateUniverse(HelHandle *handle)
Creates a new universe descriptor.
static const int kHelProgressDone
Set by the producer once it retires the chunk.
Definition hel.h:736
HEL_C_LINKAGE HelError helEnableIo(HelHandle handle)
Enable userspace access to hardware I/O resources.
static const int kHelUserNotifyError
Set in userNotify if the queue encounters a contract violation.
Definition hel.h:662
static const uint32_t kHelSubmitCancel
SQ opcode: cancel an asynchronous operation.
Definition hel.h:675
A single element of a HelQueue.
Definition hel.h:753
unsigned int length
Length of the element in bytes.
Definition hel.h:755
void * context
User-defined value.
Definition hel.h:759
unsigned int opcode
Operation code (for SQ elements).
Definition hel.h:757
In-memory kernel/user-space queue.
Definition hel.h:710
int kernelNotify
Futex that is used to wake the kernel.
Definition hel.h:719
int userNotify
Futex that is used to wake userspace.
Definition hel.h:714
int cqFirst
Index of the first chunk of the completion queue.
Definition hel.h:723
int sqFirst
Index of the first chunk of the submission queue.
Definition hel.h:727
Register-related information returned by helQueryRegisterInfo.
Definition hel.h:487
int setSize
Size of the selected register set.
Definition hel.h:489
SQ data for kHelSubmitAwaitClock.
Definition hel.h:779
uint64_t cancellationTag
Tag to cancel this operation.
Definition hel.h:783
uint64_t counter
Deadline in nanoseconds since boot.
Definition hel.h:781
SQ data for kHelSubmitAwaitEvent.
Definition hel.h:787
HelHandle handle
Handle to the event descriptor.
Definition hel.h:789
uint64_t cancellationTag
Tag to cancel this operation.
Definition hel.h:793
uint64_t sequence
Previous sequence number.
Definition hel.h:791
SQ data for kHelSubmitCancel.
Definition hel.h:763
SQ data for kHelSubmitExchangeMsgs.
Definition hel.h:769
uint32_t flags
Flags.
Definition hel.h:775
size_t count
Number of actions.
Definition hel.h:773
HelHandle lane
Handle to the lane.
Definition hel.h:771
SQ data for kHelSubmitForkMemory.
Definition hel.h:873
HelHandle handle
Handle to the memory object.
Definition hel.h:875
SQ data for kHelSubmitInvalidateMemory.
Definition hel.h:889
HelHandle handle
Handle to the memory object.
Definition hel.h:891
size_t size
Size of the range.
Definition hel.h:895
uintptr_t offset
Offset within the memory object.
Definition hel.h:893
SQ data for kHelSubmitLockMemoryView.
Definition hel.h:849
size_t size
Size to lock.
Definition hel.h:855
uintptr_t offset
Offset within the memory object.
Definition hel.h:853
HelHandle handle
Handle to the memory object.
Definition hel.h:851
SQ data for kHelSubmitManageMemory.
Definition hel.h:843
HelHandle handle
Handle to the memory object.
Definition hel.h:845
SQ data for kHelSubmitObserve.
Definition hel.h:859
HelHandle handle
Handle to the thread.
Definition hel.h:861
SQ data for kHelSubmitPopulateSpace.
Definition hel.h:899
HelHandle handle
Handle to the memory space.
Definition hel.h:901
uintptr_t address
Address within the memory space.
Definition hel.h:903
size_t length
Length of the range.
Definition hel.h:905
SQ data for kHelSubmitProtectMemory.
Definition hel.h:797
size_t size
Size of the mapping.
Definition hel.h:803
void * pointer
Pointer to the mapping.
Definition hel.h:801
uint32_t flags
Protection flags.
Definition hel.h:805
HelHandle spaceHandle
Handle to the address space.
Definition hel.h:799
SQ data for kHelSubmitReadMemory.
Definition hel.h:819
uintptr_t address
Address within the memory object.
Definition hel.h:823
HelHandle handle
Handle to the memory object.
Definition hel.h:821
size_t length
Length in bytes.
Definition hel.h:825
void * buffer
Buffer to read into.
Definition hel.h:827
SQ data for kHelSubmitResizeMemory.
Definition hel.h:865
HelHandle handle
Handle to the memory object.
Definition hel.h:867
size_t newSize
New size in bytes.
Definition hel.h:869
SQ data for kHelSubmitSynchronizeSpace.
Definition hel.h:809
void * pointer
Pointer to the mapping.
Definition hel.h:813
size_t size
Size of the mapping.
Definition hel.h:815
HelHandle spaceHandle
Handle to the address space.
Definition hel.h:811
SQ data for kHelSubmitWriteMemory.
Definition hel.h:831
HelHandle handle
Handle to the memory object.
Definition hel.h:833
size_t length
Length in bytes.
Definition hel.h:837
const void * buffer
Buffer to write from.
Definition hel.h:839
uintptr_t address
Address within the memory object.
Definition hel.h:835
SQ data for kHelSubmitWritebackFence.
Definition hel.h:879
HelHandle handle
Handle to the memory object.
Definition hel.h:881
size_t size
Size of the range.
Definition hel.h:885
uintptr_t offset
Offset within the memory object.
Definition hel.h:883