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 = 113,
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 kHelCallObtainHandle = 4,
35
36 kHelCallCreateQueue = 89,
37 kHelCallDriveQueue = 105,
38 kHelCallAlertQueue = 106,
39
40 kHelCallAllocateMemory = 51,
41 kHelCallResizeMemory = 83,
42 kHelCallCreateManagedMemory = 64,
43 kHelCallCopyOnWrite = 39,
44 kHelCallAccessPhysical = 30,
45 kHelCallCreateSliceView = 88,
46 kHelCallForkMemory = 40,
47 kHelCallCreateSpace = 27,
48 kHelCallCreateDmaSpace = 108,
49 kHelCallConfigureIrq = 109,
50 kHelCallCreateIndirectMemory = 45,
51 kHelCallAlterMemoryIndirection = 52,
52 kHelCallMapMemory = 44,
53 kHelCallSubmitProtectMemory = 99,
54 kHelCallSubmitSynchronizeSpace = 53,
55 kHelCallUnmapMemory = 36,
56 kHelCallPointerPhysical = 43,
57 kHelCallSubmitReadMemory = 77,
58 kHelCallSubmitWriteMemory = 78,
59 kHelCallMemoryInfo = 26,
60 kHelCallSubmitManageMemory = 46,
61 kHelCallUpdateMemory = 47,
62 kHelCallSubmitLockMemoryView = 48,
63 kHelCallLoadahead = 49,
64 kHelCallCreateVirtualizedSpace = 50,
65 kHelCallCreateSwapSpace = 110,
66 kHelCallAllocateSwappableMemory = 111,
67 kHelCallSetSwapBudget = 112,
68
69 kHelCallCreateThread = 67,
70 kHelCallQueryThreadStats = 95,
71 kHelCallSetPriority = 85,
72 kHelCallYield = 34,
73 kHelCallSubmitObserve = 74,
74 kHelCallKillThread = 87,
75 kHelCallInterruptThread = 86,
76 kHelCallResume = 61,
77 kHelCallLoadRegisters = 75,
78 kHelCallStoreRegisters = 76,
79 kHelCallQueryRegisterInfo = 102,
80 kHelCallWriteFsBase = 41,
81 kHelCallGetClock = 42,
82 kHelCallSubmitAwaitClock = 80,
83 kHelCallCreateVirtualizedCpu = 37,
84 kHelCallRunVirtualizedCpu = 38,
85 kHelCallAssertVirtualizedIrq = 107,
86 kHelCallGetRandomBytes = 101,
87 kHelCallWriteGsBase = 54,
88 kHelCallReadFsBase = 55,
89 kHelCallReadGsBase = 56,
90 kHelCallGetCurrentCpu = 57,
91
92 kHelCallCreateStream = 68,
93 kHelCallSubmitAsync = 79,
94 kHelCallShutdownLane = 91,
95
96 kHelCallFutexWait = 73,
97 kHelCallFutexWake = 71,
98
99 kHelCallCreateOneshotEvent = 96,
100 kHelCallCreateBitsetEvent = 97,
101 kHelCallRaiseEvent = 98,
102 kHelCallAccessIrq = 14,
103 kHelCallHandleIrq = 5,
104 kHelCallAcknowledgeIrq = 81,
105 kHelCallSubmitAwaitEvent = 82,
106 kHelCallAutomateIrq = 94,
107 kHelCallQueryMsiInfo = 6,
108
109 kHelCallAccessIo = 11,
110 kHelCallEnableIo = 12,
111
112 kHelCallBindKernlet = 93,
113
114 kHelCallGetAffinity = 103,
115 kHelCallSetAffinity = 100,
116
117 kHelCallCreateToken = 104,
118
119 kHelCallSuper = 0x80000000
120};
121
122enum {
123 kHelErrNone = 0,
124 kHelErrBufferTooSmall = 1,
125 kHelErrBadDescriptor = 2,
126 kHelErrTimeout = 3,
127 kHelErrNoDescriptor = 4,
128 kHelErrIllegalSyscall = 5,
129 kHelErrIllegalObject = 6,
130 kHelErrIllegalArgs = 7,
131 kHelErrLaneShutdown = 8,
132 kHelErrEndOfLane = 9,
133 kHelErrFault = 10,
134 kHelErrThreadTerminated = 11,
135 kHelErrCancelled = 12,
136 kHelErrTransmissionMismatch = 13,
137 kHelErrQueueTooSmall = 14,
138 kHelErrIllegalState = 15,
139 kHelErrNoHardwareSupport = 16,
140 kHelErrNoMemory = 17,
141 kHelErrUnsupportedOperation = 18,
142 kHelErrOutOfBounds = 19,
143 kHelErrDismissed = 20,
144 kHelErrRemoteFault = 21,
145 kHelErrAlreadyExists = 22,
146 kHelErrBadPermissions = 23,
147 kHelErrOther = 24,
148 kHelErrFutexRace = 25,
149 kHelErrBadRights = 26,
150};
151
152typedef uint32_t HelRights;
153
154// No right but easier to recognize in code than a zero literal.
155// - General: descriptor properties can be queried without any rights.
156// - Memory view: memory size can be queried without any rights.
157// - Thread: statistics can be queried without any rights.
158static const HelRights kHelRightNull = 0;
159// Right to map into an object.
160// - Universe: required to transfer into the universe.
161// - Universe: required to close descriptors in the universe.
162// - Universe: required to create a thread in the universe.
163// - Address space: required to map into the space.
164// - Address space: required to change memory protection.
165// - Virtualized space: required to map into the space.
166// - DMA space: required to map into the space.
167static const HelRights kHelRightGrant = UINT32_C(1) << 0;
168// Right to map from an object.
169// - Universe: required to transfer out of the universe.
170// - Universe: required to create a thread in the universe.
171static const HelRights kHelRightTake = UINT32_C(1) << 1;
172// Right to read data.
173// - IPC queue: required to map readable.
174// - Memory view: required to read.
175// - Memory view: required to map readable.
176// - Memory view: required to create copy-on-write view.
177// - Memory view: required to map into indirect memory.
178// - Memory slice: required to map readable.
179// - Memory slice: required to map into indirect memory.
180// - Address space: required to read from it.
181// - Address space: required to create thread.
182// - Virtualized space: required to read from it.
183// - I/O objects: required to enable userspace I/O.
184// - Thread: required to read registers.
185// - Thread: required to read memory in its address space.
186// - Thread: required to get the affinity.
187// - Virtualized CPUs: required to read registers.
188static const HelRights kHelRightRead = UINT32_C(1) << 2;
189// Right to write data.
190// - IPC queue: required to map writeable.
191// - Memory view: required to write.
192// - Memory view: required to map writeable.
193// - Memory view: required to map into indirect memory.
194// - Memory slice: required to map writeable.
195// - Memory slice: required to map into indirect memory.
196// - Address space: required to write to it.
197// - Address space: required to create thread.
198// - Virtualized space: required to write to it.
199// - I/O objects: required to enable userspace I/O.
200// - Thread: required to write registers.
201// - Thread: required to write memory in its address space.
202// - Thread: required to set the affinity.
203// - Virtualized CPUs: required to write registers.
204static const HelRights kHelRightWrite = UINT32_C(1) << 3;
205// Right to execute code.
206// - Memory view: required to map executable.
207// - Memory slice: required to map executable.
208static const HelRights kHelRightExecute = UINT32_C(1) << 4;
209// Right to execute operations.
210// - IPC queue: required to submit.
211// - Lane: required to do exchange messages.
212// - Virtualized CPUs: required to run.
213static const HelRights kHelRightInvoke = UINT32_C(1) << 5;
214// Right to build new objects on top of existing ones.
215// - IPC queue: required to map.
216// - Universe: required to create thread.
217// - Address space: required to create thread.
218// - Memory view: required to map.
219// - Memory view: required to create copy-on-write view.
220// - Memory view: required to map into indirect memory.
221// - Memory view: required to create slice.
222// - Memory view: required to bind to kernlet.
223// - IRQ pin: required to install an IRQ handler.
224// - Memory slice: required to map.
225// - Memory slice: required to map into indirect memory.
226// - Swap space: required to allocate memory backed by it.
227// - Virtualized space: required to create virtualized CPU.
228// - I/O objects: required to enable userspace I/O.
229// - Kernlets: required to create a bound kernlet from it.
230// - Bound kernlets: required to attach to an IRQ.
231static const HelRights kHelRightAssign = UINT32_C(1) << 6;
232// Right to derive new objects that affect the original one.
233// - Memory view: required to fork.
234static const HelRights kHelRightDerive = UINT32_C(1) << 7;
235// Right to add, remove or manipulate components.
236// - Memory views: required to perform loadahead.
237// - Address space: required to synchronize.
238// - Address space: required to resolve physical addresses.
239// - DMA space: required to populate.
240// - DMA space: required to resolve physical addresses.
241static const HelRights kHelRightProvision = UINT32_C(1) << 8;
242// Right to pin memory pages.
243// - Memory view: required to pin pages.
244static const HelRights kHelRightPin = UINT32_C(1) << 9;
245// Right to perform memory fences.
246// - Memory view: required for fences.
247static const HelRights kHelRightFence = UINT32_C(1) << 10;
248// Right to wait on an object.
249// - IPC queue: required to drive.
250// - Thread: required to observe.
251// - Event: required to wait.
252// - IRQ: required to wait.
253// - IRQ: required to attach a kernlet.
254static const HelRights kHelRightWait = UINT32_C(1) << 11;
255// Right to signal an object.
256// - IPC queue: required to alert.
257// - Thread: required to interrupt.
258// - Event: required to raise.
259// - Event: required to bind to kernlet.
260// - IRQ: required to acknowledge.
261// - IRQ: required to attach a kernlet.
262// - Virtualized CPUs: required to raise an interrupt.
263static const HelRights kHelRightSignal = UINT32_C(1) << 12;
264// Right to manage an object (includes potentially destructive operations).
265// - Lane: required to shut down.
266// - Memory view: required to resize.
267// - Memory view: required to manage.
268// - Memory view: required to invalidate.
269// - Swap space: required to set the swap budget.
270// - Thread: required to set priority.
271// - Thread: required to resume.
272// - Thread: required to kill.
273// - IRQ pin: required to configure the IRQ.
274// - IRQ pin: required to obtain MSI address and data words.
275static const HelRights kHelRightManage = UINT32_C(1) << 13;
276// All rights (even unspecified ones). Easier to recognize in code than a literal.
277static const HelRights kHelRightsMax = ~UINT32_C(0);
278
279struct HelX86SegmentRegister {
280 uint64_t base;
281 uint32_t limit;
282 uint16_t selector;
283 uint8_t type, present, dpl, db, s, l, g, avl;
284};
285
286struct HelX86DescriptorTable {
287 uint64_t base;
288 uint16_t limit;
289};
290
291struct HelX86VirtualizationRegs {
292 uint64_t rax;
293 uint64_t rbx;
294 uint64_t rcx;
295 uint64_t rdx;
296 uint64_t rsi;
297 uint64_t rdi;
298 uint64_t rbp;
299 uint64_t r8;
300 uint64_t r9;
301 uint64_t r10;
302 uint64_t r11;
303 uint64_t r12;
304 uint64_t r13;
305 uint64_t r14;
306 uint64_t r15;
307
308 uint64_t rsp;
309 uint64_t rip;
310 uint64_t rflags;
311
312 struct HelX86SegmentRegister cs, ds, es, fs, gs, ss;
313 struct HelX86SegmentRegister tr, ldt;
314 struct HelX86DescriptorTable gdt, idt;
315
316 uint64_t cr0, cr2, cr3, cr4, cr8;
317 uint64_t efer;
318 uint64_t apic_base;
319};
320
321struct HelRiscv64VirtualizationRegs {
322 union {
323 uint64_t x[32];
324
325 struct {
326 uint64_t zero;
327 uint64_t ra;
328 uint64_t sp;
329 uint64_t gp;
330 uint64_t tp;
331 uint64_t t0;
332 uint64_t t1;
333 uint64_t t2;
334 uint64_t s0;
335 uint64_t s1;
336 uint64_t a0;
337 uint64_t a1;
338 uint64_t a2;
339 uint64_t a3;
340 uint64_t a4;
341 uint64_t a5;
342 uint64_t a6;
343 uint64_t a7;
344 uint64_t s2;
345 uint64_t s3;
346 uint64_t s4;
347 uint64_t s5;
348 uint64_t s6;
349 uint64_t s7;
350 uint64_t s8;
351 uint64_t s9;
352 uint64_t s10;
353 uint64_t s11;
354 uint64_t t3;
355 uint64_t t4;
356 uint64_t t5;
357 uint64_t t6;
358 };
359 };
360
361 uint64_t pc;
362 uint8_t kernelMode;
363
364 // CSRs
365 uint64_t sstatus;
366 uint64_t sie;
367 uint64_t stvec;
368 uint64_t sscratch;
369 uint64_t sepc;
370 uint64_t scause;
371 uint64_t stval;
372 uint64_t sip;
373 uint64_t satp;
374 uint64_t stimecmp;
375};
376
377#if defined(__riscv) && __riscv_xlen == 64
378typedef struct HelRiscv64VirtualizationRegs HelVirtualizationRegs;
379#else
380typedef struct HelX86VirtualizationRegs HelVirtualizationRegs;
381#endif
382
383enum {
384 kHelNullHandle = 0,
385 kHelThisUniverse = -1,
386 kHelThisThread = -2
387};
388
389enum {
390 kHelWaitInfinite = -1
391};
392
393enum {
394 kHelAbiSystemV = 1
395};
396
397enum {
398 kHelActionNone = 0,
399 kHelActionDismiss = 11,
400 kHelActionOffer = 5,
401 kHelActionAccept = 6,
402 kHelActionImbueCredentials = 8,
403 kHelActionExtractCredentials = 9,
404 kHelActionSendFromBuffer = 1,
405 kHelActionSendFromBufferSg = 10,
406 kHelActionRecvInline = 7,
407 kHelActionRecvToBuffer = 3,
408 kHelActionPushDescriptor = 2,
409 kHelActionPullDescriptor = 4
410};
411
412enum {
413 kHelItemChain = 1,
414 kHelItemAncillary = 2,
415 kHelItemWantLane = (1 << 16),
416};
417
418static const uint32_t kHelTransferDescriptorOut = UINT32_C(1) << 0;
419static const uint32_t kHelTransferDescriptorIn = UINT32_C(1) << 1;
420
421enum {
422 kHelObtainZeroMemory = 1,
423 kHelObtainClockPage = 2
424};
425
427enum {
437 kHelClockTime = 4
439
450 uint64_t seqlock;
452 uint32_t clockType;
454 int32_t tickShift;
456 uint64_t tickFactor;
457};
458
459struct HelSgItem {
460 void *buffer;
461 size_t length;
462};
463
464struct HelAction {
465 int type;
466 uint32_t flags;
467 // TODO: It may be worth to restructure this to a union of structs
468 // (e.g., a HelActionDataBufferSize, HelActionDataDescriptorRights, ...),
469 // but that requires simultaneous mlibc and Managarm changes.
470 union {
471 uintptr_t word0;
472 void *buffer;
473 };
474 union {
475 uintptr_t word1;
476 size_t length;
477 // For kHelPushDescriptor, kHelPullDescriptor.
478 uint32_t rights;
479 };
480 union {
481 uintptr_t word2;
482 // For kHelActionImbueCredentials, kHelPushDescriptor, kHelPullDescriptor.
483 HelHandle handle;
484 };
485};
486
487struct HelDescriptorInfo {
488 int type;
489};
490
491enum HelAllocFlags {
492 kHelAllocContinuous = 4,
493 kHelAllocOnDemand = 1,
494};
495
496struct HelAllocRestrictions {
497 int addressBits;
498};
499
500enum HelManagedFlags {
501 kHelManagedReadahead = 1
502};
503
504enum HelManageRequests {
505 kHelManageInitialize = 1,
506 kHelManageWriteback = 2
507};
508
509enum HelMapFlags {
510 // Additional flags that may be set.
511 kHelMapProtRead = 256,
512 kHelMapProtWrite = 512,
513 kHelMapProtExecute = 1024,
514 kHelMapDontRequireBacking = 128,
515 kHelMapFixed = 2048,
516 kHelMapFixedNoReplace = 4096,
517 kHelMapPreferBottom = 8192
518};
519
520enum HelSliceFlags {
521 kHelSliceCacheWriteCombine = 1,
522};
523
524enum HelCachingMode {
525 kHelCachingDefault = 0,
526 kHelCachingUncached = 1,
527 kHelCachingWriteCombine = 2,
528 kHelCachingWriteThrough = 3,
529 kHelCachingWriteBack = 4,
530 kHelCachingMmio = 5,
531 kHelCachingMmioNonPosted = 6
532};
533
534enum HelThreadFlags {
535 kHelThreadStopped = 1
536};
537
538enum HelObservation {
539 kHelObserveNull = 0,
540 kHelObserveInterrupt = 4,
541 kHelObservePanic = 3,
542 kHelObserveBreakpoint = 1,
543 kHelObservePageFault = 2,
544 kHelObserveGeneralFault = 5,
545 kHelObserveIllegalInstruction = 6,
546 kHelObserveDivByZero = 7,
547 kHelObserveSuperCall = 0x80000000
548};
549
550enum HelRegisterSets {
551 kHelRegsProgram = 1,
552 kHelRegsGeneral = 2,
553 kHelRegsThread = 3,
554 kHelRegsDebug = 4,
555 kHelRegsVirtualization = 5,
556 kHelRegsSimd = 6,
557 kHelRegsSignal = 7,
558 kHelRegsPageFault = 8
559};
560
561enum HelPageFaultFlags {
562 kHelPageFaultMapError = 1,
563 kHelPageFaultAccessError = 2
564};
565
570};
571
572#if defined(__x86_64__)
573enum HelRegisterIndex {
574 kHelRegRax = 0,
575 kHelRegRbx = 1,
576 kHelRegRcx = 2,
577 kHelRegRdx = 3,
578 kHelRegRdi = 4,
579 kHelRegRsi = 5,
580 kHelRegR8 = 6,
581 kHelRegR9 = 7,
582 kHelRegR10 = 8,
583 kHelRegR11 = 9,
584 kHelRegR12 = 10,
585 kHelRegR13 = 11,
586 kHelRegR14 = 12,
587 kHelRegR15 = 13,
588 kHelRegRbp = 14,
589
590 kHelNumGprs = 15,
591
592 kHelRegIp = 0,
593 kHelRegSp = 1
594};
595
596enum HelSyscallArgs {
597 kHelRegNumber = kHelRegRdi,
598 kHelRegError = kHelRegRdi,
599
600 kHelRegArg0 = kHelRegRsi,
601 kHelRegArg1 = kHelRegRdx,
602 kHelRegArg2 = kHelRegRax,
603 kHelRegArg3 = kHelRegR8,
604 kHelRegArg4 = kHelRegR9,
605 kHelRegArg5 = kHelRegR10,
606 kHelRegArg6 = kHelRegR12,
607 kHelRegArg7 = kHelRegR13,
608 kHelRegArg8 = kHelRegR14,
609
610 kHelRegOut0 = kHelRegRsi,
611 kHelRegOut1 = kHelRegRdx,
612 kHelRegOut2 = kHelRegRax
613};
614
615#elif defined(__aarch64__)
616enum HelRegisterIndex {
617 kHelRegX0 = 0,
618 kHelRegX1,
619 kHelRegX2,
620 kHelRegX3,
621 kHelRegX4,
622 kHelRegX5,
623 kHelRegX6,
624 kHelRegX7,
625 kHelRegX8,
626 kHelRegX9,
627 kHelRegX10,
628 kHelRegX11,
629 kHelRegX12,
630 kHelRegX13,
631 kHelRegX14,
632 kHelRegX15,
633 kHelRegX16,
634 kHelRegX17,
635 kHelRegX18,
636 kHelRegX19,
637 kHelRegX20,
638 kHelRegX21,
639 kHelRegX22,
640 kHelRegX23,
641 kHelRegX24,
642 kHelRegX25,
643 kHelRegX26,
644 kHelRegX27,
645 kHelRegX28,
646 kHelRegX29,
647 kHelRegX30,
648
649 kHelNumGprs = 31,
650
651 kHelRegIp = 0,
652 kHelRegSp = 1
653};
654
655enum HelSyscallArgs {
656 kHelRegNumber = kHelRegX0,
657 kHelRegError = kHelRegX0,
658
659 kHelRegArg0 = kHelRegX1,
660 kHelRegArg1 = kHelRegX2,
661 kHelRegArg2 = kHelRegX3,
662 kHelRegArg3 = kHelRegX4,
663 kHelRegArg4 = kHelRegX5,
664 kHelRegArg5 = kHelRegX6,
665 kHelRegArg6 = kHelRegX7,
666 kHelRegArg7 = kHelRegX8,
667 kHelRegArg8 = kHelRegX9,
668
669 kHelRegOut0 = kHelRegX1,
670 kHelRegOut1 = kHelRegX2,
671 kHelRegOut2 = kHelRegX3
672};
673
674#elif defined(__riscv) && __riscv_xlen == 64
675enum HelRegisterIndex {
676 kHelRegRa = 0,
677 kHelRegGp,
678 kHelRegTp,
679 kHelRegT0,
680 kHelRegT1,
681 kHelRegT2,
682 kHelRegS0,
683 kHelRegS1,
684 kHelRegA0,
685 kHelRegA1,
686 kHelRegA2,
687 kHelRegA3,
688 kHelRegA4,
689 kHelRegA5,
690 kHelRegA6,
691 kHelRegA7,
692 kHelRegS2,
693 kHelRegS3,
694 kHelRegS4,
695 kHelRegS5,
696 kHelRegS6,
697 kHelRegS7,
698 kHelRegS8,
699 kHelRegS9,
700 kHelRegS10,
701 kHelRegS11,
702 kHelRegT3,
703 kHelRegT4,
704 kHelRegT5,
705 kHelRegT6,
706 kHelNumGprs,
707 kHelRegIp = 0,
708 kHelRegSp = 1
709};
710enum HelSyscallArgs {
711 kHelRegNumber = kHelRegA0,
712 kHelRegError = kHelRegA0,
713 kHelRegArg0 = kHelRegA1,
714 kHelRegArg1 = kHelRegA2,
715 kHelRegArg2 = kHelRegA3,
716 kHelRegArg3 = kHelRegA4,
717 kHelRegArg4 = kHelRegA5,
718 kHelRegArg5 = kHelRegA6,
719 kHelRegArg6 = kHelRegA7,
720 kHelRegArg7 = kHelRegS2,
721 kHelRegArg8 = kHelRegS3,
722
723 kHelRegOut0 = kHelRegA1,
724 kHelRegOut1 = kHelRegA2,
725 kHelRegOut2 = kHelRegA3
726};
727
728#endif
729
730struct HelQueueParameters {
731 uint32_t flags;
732 unsigned int numChunks;
733 size_t chunkSize;
734 unsigned int numSqChunks;
735};
736
738static const int kHelUserNotifyCqProgress = (1 << 0);
740static const int kHelUserNotifySupplySqChunks = (1 << 1);
742static const int kHelUserNotifyError = (1 << 14);
744static const int kHelUserNotifyAlert = (1 << 15);
745
747static const int kHelKernelNotifySqProgress = (1 << 0);
749static const int kHelKernelNotifySupplyCqChunks = (1 << 1);
750
752static const uint32_t kHelDriveWait = (1 << 0);
753
755static const uint32_t kHelSubmitCancel = 256;
757static const uint32_t kHelSubmitAsyncNop = 1;
759static const uint32_t kHelSubmitExchangeMsgs = 2;
761static const uint32_t kHelSubmitAwaitClock = 3;
763static const uint32_t kHelSubmitAwaitEvent = 4;
765static const uint32_t kHelSubmitProtectMemory = 5;
767static const uint32_t kHelSubmitSynchronizeSpace = 6;
769static const uint32_t kHelSubmitReadMemory = 7;
771static const uint32_t kHelSubmitWriteMemory = 8;
773static const uint32_t kHelSubmitManageMemory = 9;
775static const uint32_t kHelSubmitLockMemoryView = 10;
777static const uint32_t kHelSubmitObserve = 11;
779static const uint32_t kHelSubmitResizeMemory = 12;
781static const uint32_t kHelSubmitForkMemory = 13;
783static const uint32_t kHelSubmitWritebackFence = 14;
785static const uint32_t kHelSubmitInvalidateMemory = 15;
787static const uint32_t kHelSubmitPopulateSpace = 16;
788
790struct HelQueue {
795
800
804
808};
809
811static const int kHelNextPresent = (1 << 24);
812
814static const int kHelProgressMask = 0xFFFFFF;
816static const int kHelProgressDone = (1 << 25);
818static const int kHelProgressFull = (1 << 26);
819
820struct HelChunk {
823 int next;
824
826 int progressFutex;
827
829 char buffer[];
830};
831
835 unsigned int length;
837 unsigned int opcode;
839 void *context;
840};
841
844 uint64_t cancellationTag;
845};
846
851 HelHandle lane;
853 size_t count;
855 uint32_t flags;
856};
857
861 uint64_t counter;
864};
865
869 HelHandle handle;
871 uint64_t sequence;
874};
875
879 HelHandle spaceHandle;
881 void *pointer;
883 size_t size;
885 uint32_t flags;
886};
887
891 HelHandle spaceHandle;
893 void *pointer;
895 size_t size;
896};
897
901 HelHandle handle;
903 uintptr_t address;
905 size_t length;
907 void *buffer;
908};
909
913 HelHandle handle;
915 uintptr_t address;
917 size_t length;
919 const void *buffer;
920};
921
925 HelHandle handle;
926};
927
931 HelHandle handle;
933 uintptr_t offset;
935 size_t size;
936};
937
941 HelHandle handle;
942};
943
947 HelHandle handle;
949 size_t newSize;
950};
951
955 HelHandle handle;
956};
957
961 HelHandle handle;
963 uintptr_t offset;
965 size_t size;
966};
967
969static const uint32_t kHelInvalidateNoWriteback = 1;
970
974 HelHandle handle;
976 uintptr_t offset;
978 size_t size;
980 uint32_t flags;
981};
982
986 HelHandle handle;
988 uintptr_t address;
990 size_t length;
991};
992
993struct HelSimpleResult {
994 HelError error;
995 int reserved;
996};
997
998struct HelCredentialsResult {
999 HelError error;
1000 int reserved;
1001 char credentials[16];
1002};
1003
1004struct HelManageResult {
1005 HelError error;
1006 int type;
1007 uintptr_t offset;
1008 size_t length;
1009};
1010
1011struct HelObserveResult {
1012 HelError error;
1013 unsigned int observation;
1014};
1015
1016struct HelInlineResult {
1017 HelError error;
1018 int reserved;
1019 size_t length;
1020 char data[];
1021};
1022
1023struct HelInlineResultNoFlex {
1024 HelError error;
1025 int reserved;
1026 size_t length;
1027};
1028
1029struct HelLengthResult {
1030 HelError error;
1031 int reserved;
1032 size_t length;
1033};
1034
1035struct HelHandleResult {
1036 HelError error;
1037 int reserved;
1038 HelHandle handle;
1039};
1040
1041struct HelEventResult {
1042 HelError error;
1043 uint32_t bitset;
1044 uint64_t sequence;
1045};
1046
1047enum HelAckFlags {
1048 kHelAckAcknowledge = 2,
1049 kHelAckNack = 3,
1050 kHelAckKick = 1,
1051 kHelAckClear = 0x100,
1052};
1053
1054union HelKernletData {
1055 HelHandle handle;
1056};
1057
1058struct HelThreadStats {
1059 uint64_t userTime;
1060};
1061
1062enum {
1063 kHelVmexitHlt = 0,
1064 kHelVmexitTranslationFault = 1,
1065 kHelVmexitHyperCall = 2,
1066 kHelVmexitInstructionTrap = 3,
1067 kHelVmexitError = -1,
1068 kHelVmexitUnknownPlatformSpecificExitCode = -2,
1069};
1070
1071enum {
1072 kHelVmFaultRead = 1 << 0,
1073 kHelVmFaultWrite = 1 << 1,
1074 kHelVmFaultExecute = 1 << 2,
1075};
1076
1077#if defined(__riscv) && __riscv_xlen == 64
1078
1079struct HelVmexitReason {
1080 uint32_t exitReason;
1081 // If bit 63 is set then stores a compressed unexpanded instruction,
1082 // otherwise stores a normal 32-bit instruction (possibly originally compressed in which case bits 1:0 aren't 0b11).
1083 uint64_t instruction;
1084 size_t address;
1085 size_t flags;
1086};
1087
1088#else
1089
1090struct HelVmexitReason {
1091 uint32_t exitReason;
1092 uint32_t code;
1093 size_t address;
1094 size_t flags;
1095};
1096
1097#endif
1098
1099// see RFC 5424
1100enum HelLogSeverity {
1101 kHelLogSeverityEmergency,
1102 kHelLogSeverityAlert,
1103 kHelLogSeverityCritical,
1104 kHelLogSeverityError,
1105 kHelLogSeverityWarning,
1106 kHelLogSeverityNotice,
1107 kHelLogSeverityInfo,
1108 kHelLogSeverityDebug,
1109};
1110
1111enum {
1112 kHelAccessIrqByGsi = 1,
1113 kHelAccessIrqByPhandle = 2,
1114 kHelAccessIrqAllocateMsi = 3,
1115};
1116
1118enum {
1119 kHelIrqNameSize = 32,
1120};
1121
1122enum {
1123 kHelIrqTriggerNull = 0,
1124 kHelIrqTriggerEdge = 1,
1125 kHelIrqTriggerLevel = 2
1126};
1127
1128enum {
1129 kHelIrqPolarityNull = 0,
1130 kHelIrqPolarityHigh = 1,
1131 kHelIrqPolarityLow = 2
1132};
1133
1136 uint64_t address;
1137 uint32_t data;
1138};
1139
1142
1150HEL_C_LINKAGE HelError helLog(const enum HelLogSeverity severity, const char *string, size_t length);
1151
1157HEL_C_LINKAGE void helPanic(const char *string, size_t length)
1158 __attribute__ (( noreturn ));
1159
1163
1165HEL_C_LINKAGE HelError helNop();
1166
1170HEL_C_LINKAGE HelError helSubmitAsyncNop(HelHandle queueHandle, uintptr_t context);
1171
1175
1179HEL_C_LINKAGE HelError helCreateUniverse(HelHandle *handle);
1180
1188HEL_C_LINKAGE HelError
1189helTransferDescriptor(HelHandle handle, HelHandle universeHandle,
1190 uint32_t flags, uint32_t exposedRights, uint32_t requiredRights, HelHandle *outHandle);
1191
1192HEL_C_LINKAGE HelError helDescriptorInfo(HelHandle handle, struct HelDescriptorInfo *info);
1193
1199HEL_C_LINKAGE HelError helGetCredentials(HelHandle handle, uint32_t flags,
1200 char *credentials);
1201
1207HEL_C_LINKAGE HelError helCloseDescriptor(HelHandle universeHandle, HelHandle handle);
1208
1214HEL_C_LINKAGE HelError helObtainHandle(int kind, HelHandle *handle);
1215
1219
1225HEL_C_LINKAGE HelError helCreateQueue(const struct HelQueueParameters *params,
1226 HelHandle *handle);
1227
1239HEL_C_LINKAGE HelError helDriveQueue(HelHandle queueHandle, uint32_t flags, uint32_t notifyMask);
1240
1247HEL_C_LINKAGE HelError helAlertQueue(HelHandle queueHandle);
1248
1252
1262HEL_C_LINKAGE HelError helAllocateMemory(size_t size, uint32_t flags,
1263 const struct HelAllocRestrictions *restrictions, HelHandle *handle);
1264
1271HEL_C_LINKAGE HelError helResizeMemory(HelHandle handle, size_t newSize);
1272
1284HEL_C_LINKAGE HelError helCreateManagedMemory(size_t size, uint32_t flags,
1285 HelHandle *backingHandle, HelHandle *frontalHandle);
1286
1301HEL_C_LINKAGE HelError helCreateSwapSpace(uint32_t flags, HelHandle *backingHandle,
1302 HelHandle *swapHandle);
1303
1314HEL_C_LINKAGE HelError helAllocateSwappableMemory(HelHandle swapSpace,
1315 size_t size, uint32_t flags, HelHandle *handle);
1316
1322HEL_C_LINKAGE HelError helSetSwapBudget(HelHandle swapSpace, size_t numPages);
1323
1334HEL_C_LINKAGE HelError helCopyOnWrite(HelHandle memory,
1335 uintptr_t offset, size_t size, HelHandle *handle);
1336
1337HEL_C_LINKAGE HelError helAccessPhysical(
1338 HelHandle accessToken, uintptr_t physical, size_t size, uint32_t cachingMode, HelHandle *handle
1339);
1340
1346HEL_C_LINKAGE HelError helCreateIndirectMemory(size_t numSlots, HelHandle *handle);
1347
1364HEL_C_LINKAGE HelError helAlterMemoryIndirection(HelHandle indirectHandle, size_t slotIndex,
1365 HelHandle memoryHandle, uintptr_t offset, size_t size);
1366
1367HEL_C_LINKAGE HelError helCreateSliceView(HelHandle bundle, uintptr_t offset, size_t size,
1368 uint32_t flags, HelHandle *handle);
1369
1377HEL_C_LINKAGE HelError helForkMemory(HelHandle handle, HelHandle *forkedHandle);
1378
1382HEL_C_LINKAGE HelError helCreateSpace(HelHandle *handle);
1383
1389HEL_C_LINKAGE HelError helCreateDmaSpace(uint32_t flags, HelHandle *handle);
1390
1408HEL_C_LINKAGE HelError helMapMemory(HelHandle memoryHandle, HelHandle spaceHandle,
1409 void *pointer, uintptr_t offset, size_t size, uint32_t flags, void **actualPointer);
1410
1411
1422HEL_C_LINKAGE HelError helUnmapMemory(HelHandle spaceHandle, void *pointer, size_t size);
1423
1424HEL_C_LINKAGE HelError helPointerPhysical(HelHandle spaceHandle, const void *pointer, uintptr_t *physical);
1425
1426HEL_C_LINKAGE HelError helMemoryInfo(HelHandle handle,
1427 size_t *size);
1428
1429HEL_C_LINKAGE HelError helUpdateMemory(HelHandle handle, int type, uintptr_t offset, size_t length);
1430
1441HEL_C_LINKAGE HelError helLoadahead(HelHandle handle, uintptr_t offset, size_t length);
1442
1443HEL_C_LINKAGE HelError helCreateVirtualizedSpace(HelHandle *handle);
1444
1448
1462HEL_C_LINKAGE HelError helCreateThread(HelHandle universe, HelHandle spaceHandle,
1463 HelAbi abi, void *ip, void *sp, uint32_t flags, HelHandle *handle);
1464
1470HEL_C_LINKAGE HelError helQueryThreadStats(HelHandle handle, struct HelThreadStats *stats);
1471
1480HEL_C_LINKAGE HelError helSetPriority(HelHandle handle, int priority);
1481
1483HEL_C_LINKAGE HelError helYield();
1484
1488HEL_C_LINKAGE HelError helKillThread(HelHandle handle);
1489
1496HEL_C_LINKAGE HelError helInterruptThread(HelHandle handle);
1497
1504HEL_C_LINKAGE HelError helResume(HelHandle handle);
1505
1513HEL_C_LINKAGE HelError helLoadRegisters(HelHandle handle, int set, void *image);
1514
1522HEL_C_LINKAGE HelError helStoreRegisters(HelHandle handle, int set, const void *image);
1523
1526// Register set to query information for.
1529HEL_C_LINKAGE HelError helQueryRegisterInfo(int set, struct HelRegisterInfo *info);
1530
1531HEL_C_LINKAGE HelError helWriteFsBase(void *pointer);
1532
1533HEL_C_LINKAGE HelError helReadFsBase(void **pointer);
1534
1535HEL_C_LINKAGE HelError helWriteGsBase(void *pointer);
1536
1537HEL_C_LINKAGE HelError helReadGsBase(void **pointer);
1538
1540HEL_C_LINKAGE HelError helGetCurrentCpu(int *cpu);
1541
1546HEL_C_LINKAGE HelError helGetClock(uint64_t *counter);
1547
1548HEL_C_LINKAGE HelError helCreateVirtualizedCpu(HelHandle handle, HelHandle *out_handle);
1549
1550HEL_C_LINKAGE HelError helRunVirtualizedCpu(HelHandle handle, struct HelVmexitReason *reason);
1551
1552HEL_C_LINKAGE HelError helAssertVirtualizedIrq(HelHandle handle, uint64_t irq, uint8_t level);
1553
1554HEL_C_LINKAGE HelError helGetRandomBytes(void *buffer, size_t wantedSize, size_t *actualSize);
1555
1565HEL_C_LINKAGE HelError helGetAffinity(HelHandle handle, uint8_t *mask, size_t size, size_t *actualSize);
1566
1574HEL_C_LINKAGE HelError helSetAffinity(HelHandle handle, uint8_t *mask, size_t size);
1575
1579
1587HEL_C_LINKAGE HelError helCreateStream(HelHandle *lane1, HelHandle *lane2, uint32_t attach_credentials);
1588
1589HEL_C_LINKAGE HelError helShutdownLane(HelHandle handle);
1590
1598HEL_C_LINKAGE HelError helCreateToken(HelHandle *handle);
1599
1603
1612HEL_C_LINKAGE HelError helFutexWait(int *pointer, int expected, int64_t deadline);
1613
1619HEL_C_LINKAGE HelError helFutexWake(int *pointer, unsigned int count);
1620
1624
1628HEL_C_LINKAGE HelError helCreateOneshotEvent(HelHandle *handle);
1629
1633HEL_C_LINKAGE HelError helCreateBitsetEvent(HelHandle *handle);
1634
1638HEL_C_LINKAGE HelError helRaiseEvent(HelHandle handle);
1639
1660HEL_C_LINKAGE HelError helAccessIrq(
1661 HelHandle accessHandle, uint32_t mode, uint64_t controller, uint64_t index,
1662 const char *name, HelHandle *handle
1663);
1664
1670HEL_C_LINKAGE HelError helHandleIrq(HelHandle pinHandle, HelHandle *handle);
1671
1683HEL_C_LINKAGE HelError helConfigureIrq(HelHandle pinHandle, uint32_t trigger, uint32_t polarity);
1684
1691HEL_C_LINKAGE HelError helQueryMsiInfo(HelHandle pinHandle, struct HelMsiInfo *info);
1692
1693HEL_C_LINKAGE HelError helAcknowledgeIrq(HelHandle handle, uint32_t flags, uint64_t sequence);
1694
1695HEL_C_LINKAGE HelError helAutomateIrq(HelHandle handle, uint32_t flags, HelHandle kernlet);
1696
1700
1701HEL_C_LINKAGE HelError helAccessIo(
1702 HelHandle accessToken, const uintptr_t *portArray, size_t numPorts, HelHandle *handle
1703);
1704
1708HEL_C_LINKAGE HelError helEnableIo(HelHandle handle);
1709
1713
1723HEL_C_LINKAGE HelError helBindKernlet(HelHandle handle,
1724 const union HelKernletData *data, size_t numData, HelHandle *boundHandle);
1725
1727
1728extern inline __attribute__ (( always_inline )) const char *_helErrorString(HelError code) {
1729 switch(code) {
1730 case kHelErrNone:
1731 return "Success";
1732 case kHelErrIllegalSyscall:
1733 return "Illegal syscall";
1734 case kHelErrIllegalArgs:
1735 return "Illegal arguments";
1736 case kHelErrIllegalState:
1737 return "Illegal state";
1738 case kHelErrUnsupportedOperation:
1739 return "Unsupported operation";
1740 case kHelErrNoDescriptor:
1741 return "No such descriptor";
1742 case kHelErrBadDescriptor:
1743 return "Illegal descriptor for this operation";
1744 case kHelErrThreadTerminated:
1745 return "Thread terminated already";
1746 case kHelErrLaneShutdown:
1747 return "Lane shutdown";
1748 case kHelErrEndOfLane:
1749 return "End of lane";
1750 case kHelErrDismissed:
1751 return "IPC item dismissed by remote";
1752 case kHelErrBufferTooSmall:
1753 return "Buffer too small";
1754 case kHelErrQueueTooSmall:
1755 return "Buffer too small";
1756 case kHelErrFault:
1757 return "Segfault";
1758 case kHelErrNoHardwareSupport:
1759 return "Missing hardware support for this feature";
1760 case kHelErrNoMemory:
1761 return "Out of memory";
1762 case kHelErrTransmissionMismatch:
1763 return "Transmission mismatch";
1764 case kHelErrCancelled:
1765 return "Cancelled";
1766 case kHelErrOutOfBounds:
1767 return "Out of bounds";
1768 case kHelErrAlreadyExists:
1769 return "Already exists";
1770 case kHelErrBadRights:
1771 return "Missing rights for this operation";
1772 default:
1773 return 0;
1774 }
1775}
1776
1777extern inline __attribute__ (( always_inline )) void _helCheckFailed(HelError err_code,
1778 const char *string, int fatal) {
1779 helLog(kHelLogSeverityError, string, strlen(string));
1780
1781 const char *err_string = _helErrorString(err_code);
1782 if(err_string == 0)
1783 err_string = "(Unexpected error code)";
1784 helLog(kHelLogSeverityError, err_string, strlen(err_string));
1785 helLog(kHelLogSeverityError, "\n", 1);
1786
1787 if(fatal)
1788 helPanic(0, 0);
1789}
1790
1791#define HEL_STRINGIFY_AUX(x) #x
1792#define HEL_STRINGIFY(x) HEL_STRINGIFY_AUX(x)
1793
1794#define HEL_CHECK(expr) do { HelError __error = expr; if(__error != kHelErrNone) \
1795 _helCheckFailed(__error, "HEL_CHECK failed: " #expr "\n" \
1796 " In file " __FILE__ " on line " HEL_STRINGIFY(__LINE__) "\n", 1); } while(0)
1797#define HEL_SOFT_CHECK(expr) do { HelError __error = expr; if(__error != kHelErrNone) \
1798 _helCheckFailed(__error, "HEL_SOFT_CHECK failed: " #expr "\n" \
1799 " In file " __FILE__ " on line " HEL_STRINGIFY(__LINE__) "\n", 0); } while(0)
1800
1801#endif // HEL_H
1802
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.
HEL_C_LINKAGE HelError helQueryMsiInfo(HelHandle pinHandle, struct HelMsiInfo *info)
Retrieves the message address and data of an MSI pin.
HEL_C_LINKAGE HelError helAccessIrq(HelHandle accessHandle, uint32_t mode, uint64_t controller, uint64_t index, const char *name, HelHandle *handle)
Access the IRQ pin that an IRQ is attached to.
HEL_C_LINKAGE HelError helConfigureIrq(HelHandle pinHandle, uint32_t trigger, uint32_t polarity)
Configure the trigger mode and polarity of an IRQ pin.
static const int kHelUserNotifyAlert
Set in userNotify when the queue is alerted.
Definition hel.h:744
HEL_C_LINKAGE HelError helTransferDescriptor(HelHandle handle, HelHandle universeHandle, uint32_t flags, uint32_t exposedRights, uint32_t requiredRights, 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 helSetSwapBudget(HelHandle swapSpace, size_t numPages)
Sets a swap space's budget, which is the number of pages that may be swapped out.
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:747
static const uint32_t kHelSubmitInvalidateMemory
SQ opcode: invalidate memory.
Definition hel.h:785
HEL_C_LINKAGE HelError helCreateDmaSpace(uint32_t flags, HelHandle *handle)
Creates a DMA space that memory can be mapped into for device DMA.
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.
static const uint32_t kHelInvalidateNoWriteback
Flag for kHelSubmitInvalidateMemory: discard dirty pages instead of writing them back.
Definition hel.h:969
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:771
HEL_C_LINKAGE HelError helObtainHandle(int kind, HelHandle *handle)
Obtains a descriptor to one of the kernel's global objects.
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:757
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:814
static const uint32_t kHelSubmitManageMemory
SQ opcode: manage memory.
Definition hel.h:773
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:781
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:818
static const uint32_t kHelSubmitSynchronizeSpace
SQ opcode: synchronize space.
Definition hel.h:767
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:752
static const uint32_t kHelSubmitObserve
SQ opcode: observe thread.
Definition hel.h:777
HEL_C_LINKAGE HelError helForkMemory(HelHandle handle, HelHandle *forkedHandle)
Forks memory objects, i.e., copies them using copy-on-write.
HEL_C_LINKAGE HelError helAllocateSwappableMemory(HelHandle swapSpace, size_t size, uint32_t flags, HelHandle *handle)
Allocates memory that behaves like helAllocateMemory() but is backed by a swap space: under memory pr...
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:759
static const uint32_t kHelSubmitReadMemory
SQ opcode: read memory.
Definition hel.h:769
static const int kHelNextPresent
Marks the next field as present.
Definition hel.h:811
static const int kHelKernelNotifySupplyCqChunks
Set in kernelNotify after userspace has supplied new chunks.
Definition hel.h:749
HEL_C_LINKAGE HelError helSubmitAsyncNop(HelHandle queueHandle, uintptr_t context)
Does nothing, asynchronously (useful only for profiling).
HEL_C_LINKAGE HelError helHandleIrq(HelHandle pinHandle, HelHandle *handle)
Install an IRQ handler on an IRQ pin.
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:763
static const uint32_t kHelSubmitAwaitClock
SQ opcode: wait for time to pass.
Definition hel.h:761
static const uint32_t kHelSubmitPopulateSpace
SQ opcode: populate a space.
Definition hel.h:787
@ kHelClockTsc
x86: TSC.
Definition hel.h:431
@ kHelClockCntvct
ARM: virtual counter (CNTVCT_EL0).
Definition hel.h:435
@ kHelClockCntpct
ARM: physical counter (CNTPCT_EL0).
Definition hel.h:433
@ kHelClockNone
No clock that is accessible to userspace (= helGetClock() has to be used).
Definition hel.h:429
@ kHelClockTime
RISC-V: time CSR.
Definition hel.h:437
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:765
static const int kHelUserNotifySupplySqChunks
Set in userNotify after kernel has supplied new SQ chunks.
Definition hel.h:740
HEL_C_LINKAGE HelError helCreateSwapSpace(uint32_t flags, HelHandle *backingHandle, HelHandle *swapHandle)
Creates a swap space, the backing store for swappable anonymous memory (see helAllocateSwappableMemor...
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:738
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:783
static const uint32_t kHelSubmitResizeMemory
SQ opcode: resize memory.
Definition hel.h:779
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:775
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:816
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:742
static const uint32_t kHelSubmitCancel
SQ opcode: cancel an asynchronous operation.
Definition hel.h:755
Parameters that allow userspace to compute the current time on the monotone clock (i....
Definition hel.h:449
int32_t tickShift
Scaling exponent of the tick -> nanosecond conversion.
Definition hel.h:454
uint64_t tickFactor
Factor of the tick -> nanosecond conversion.
Definition hel.h:456
uint32_t clockType
One of the kHelClock* constants.
Definition hel.h:452
A single element of a HelQueue.
Definition hel.h:833
unsigned int length
Length of the element in bytes.
Definition hel.h:835
void * context
User-defined value.
Definition hel.h:839
unsigned int opcode
Operation code (for SQ elements).
Definition hel.h:837
Message address / data pair that raises an MSI (see helQueryMsiInfo).
Definition hel.h:1135
In-memory kernel/user-space queue.
Definition hel.h:790
int kernelNotify
Futex that is used to wake the kernel.
Definition hel.h:799
int userNotify
Futex that is used to wake userspace.
Definition hel.h:794
int cqFirst
Index of the first chunk of the completion queue.
Definition hel.h:803
int sqFirst
Index of the first chunk of the submission queue.
Definition hel.h:807
Register-related information returned by helQueryRegisterInfo.
Definition hel.h:567
int setSize
Size of the selected register set.
Definition hel.h:569
SQ data for kHelSubmitAwaitClock.
Definition hel.h:859
uint64_t cancellationTag
Tag to cancel this operation.
Definition hel.h:863
uint64_t counter
Deadline in nanoseconds since boot.
Definition hel.h:861
SQ data for kHelSubmitAwaitEvent.
Definition hel.h:867
HelHandle handle
Handle to the event descriptor.
Definition hel.h:869
uint64_t cancellationTag
Tag to cancel this operation.
Definition hel.h:873
uint64_t sequence
Previous sequence number.
Definition hel.h:871
SQ data for kHelSubmitCancel.
Definition hel.h:843
SQ data for kHelSubmitExchangeMsgs.
Definition hel.h:849
uint32_t flags
Flags.
Definition hel.h:855
size_t count
Number of actions.
Definition hel.h:853
HelHandle lane
Handle to the lane.
Definition hel.h:851
SQ data for kHelSubmitForkMemory.
Definition hel.h:953
HelHandle handle
Handle to the memory object.
Definition hel.h:955
SQ data for kHelSubmitInvalidateMemory.
Definition hel.h:972
uint32_t flags
Flags (kHelInvalidate*).
Definition hel.h:980
HelHandle handle
Handle to the memory object.
Definition hel.h:974
size_t size
Size of the range.
Definition hel.h:978
uintptr_t offset
Offset within the memory object.
Definition hel.h:976
SQ data for kHelSubmitLockMemoryView.
Definition hel.h:929
size_t size
Size to lock.
Definition hel.h:935
uintptr_t offset
Offset within the memory object.
Definition hel.h:933
HelHandle handle
Handle to the memory object.
Definition hel.h:931
SQ data for kHelSubmitManageMemory.
Definition hel.h:923
HelHandle handle
Handle to the memory object.
Definition hel.h:925
SQ data for kHelSubmitObserve.
Definition hel.h:939
HelHandle handle
Handle to the thread.
Definition hel.h:941
SQ data for kHelSubmitPopulateSpace.
Definition hel.h:984
HelHandle handle
Handle to the memory space.
Definition hel.h:986
uintptr_t address
Address within the memory space.
Definition hel.h:988
size_t length
Length of the range.
Definition hel.h:990
SQ data for kHelSubmitProtectMemory.
Definition hel.h:877
size_t size
Size of the mapping.
Definition hel.h:883
void * pointer
Pointer to the mapping.
Definition hel.h:881
uint32_t flags
Protection flags.
Definition hel.h:885
HelHandle spaceHandle
Handle to the address space.
Definition hel.h:879
SQ data for kHelSubmitReadMemory.
Definition hel.h:899
uintptr_t address
Address within the memory object.
Definition hel.h:903
HelHandle handle
Handle to the memory object.
Definition hel.h:901
size_t length
Length in bytes.
Definition hel.h:905
void * buffer
Buffer to read into.
Definition hel.h:907
SQ data for kHelSubmitResizeMemory.
Definition hel.h:945
HelHandle handle
Handle to the memory object.
Definition hel.h:947
size_t newSize
New size in bytes.
Definition hel.h:949
SQ data for kHelSubmitSynchronizeSpace.
Definition hel.h:889
void * pointer
Pointer to the mapping.
Definition hel.h:893
size_t size
Size of the mapping.
Definition hel.h:895
HelHandle spaceHandle
Handle to the address space.
Definition hel.h:891
SQ data for kHelSubmitWriteMemory.
Definition hel.h:911
HelHandle handle
Handle to the memory object.
Definition hel.h:913
size_t length
Length in bytes.
Definition hel.h:917
const void * buffer
Buffer to write from.
Definition hel.h:919
uintptr_t address
Address within the memory object.
Definition hel.h:915
SQ data for kHelSubmitWritebackFence.
Definition hel.h:959
HelHandle handle
Handle to the memory object.
Definition hel.h:961
size_t size
Size of the range.
Definition hel.h:965
uintptr_t offset
Offset within the memory object.
Definition hel.h:963