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 kHelCallAccessIommu = 13,
70
71 kHelCallCreateThread = 67,
72 kHelCallQueryThreadStats = 95,
73 kHelCallSetPriority = 85,
74 kHelCallYield = 34,
75 kHelCallSubmitObserve = 74,
76 kHelCallKillThread = 87,
77 kHelCallInterruptThread = 86,
78 kHelCallResume = 61,
79 kHelCallLoadRegisters = 75,
80 kHelCallStoreRegisters = 76,
81 kHelCallQueryRegisterInfo = 102,
82 kHelCallWriteFsBase = 41,
83 kHelCallGetClock = 42,
84 kHelCallSubmitAwaitClock = 80,
85 kHelCallCreateVirtualizedCpu = 37,
86 kHelCallRunVirtualizedCpu = 38,
87 kHelCallAssertVirtualizedIrq = 107,
88 kHelCallGetRandomBytes = 101,
89 kHelCallWriteGsBase = 54,
90 kHelCallReadFsBase = 55,
91 kHelCallReadGsBase = 56,
92 kHelCallGetCurrentCpu = 57,
93
94 kHelCallCreateStream = 68,
95 kHelCallSubmitAsync = 79,
96 kHelCallShutdownLane = 91,
97
98 kHelCallFutexWait = 73,
99 kHelCallFutexWake = 71,
100
101 kHelCallCreateOneshotEvent = 96,
102 kHelCallCreateBitsetEvent = 97,
103 kHelCallRaiseEvent = 98,
104 kHelCallAccessIrq = 14,
105 kHelCallHandleIrq = 5,
106 kHelCallAcknowledgeIrq = 81,
107 kHelCallSubmitAwaitEvent = 82,
108 kHelCallAutomateIrq = 94,
109 kHelCallQueryMsiInfo = 6,
110
111 kHelCallAccessIo = 11,
112 kHelCallEnableIo = 12,
113
114 kHelCallBindKernlet = 93,
115
116 kHelCallGetAffinity = 103,
117 kHelCallSetAffinity = 100,
118
119 kHelCallCreateToken = 104,
120
121 kHelCallExtendHierarchy = 7,
122
123 kHelCallSuper = 0x80000000
124};
125
126enum {
127 kHelErrNone = 0,
128 kHelErrBufferTooSmall = 1,
129 kHelErrBadDescriptor = 2,
130 kHelErrTimeout = 3,
131 kHelErrNoDescriptor = 4,
132 kHelErrIllegalSyscall = 5,
133 kHelErrIllegalObject = 6,
134 kHelErrIllegalArgs = 7,
135 kHelErrLaneShutdown = 8,
136 kHelErrEndOfLane = 9,
137 kHelErrFault = 10,
138 kHelErrThreadTerminated = 11,
139 kHelErrCancelled = 12,
140 kHelErrTransmissionMismatch = 13,
141 kHelErrQueueTooSmall = 14,
142 kHelErrIllegalState = 15,
143 kHelErrNoHardwareSupport = 16,
144 kHelErrNoMemory = 17,
145 kHelErrUnsupportedOperation = 18,
146 kHelErrOutOfBounds = 19,
147 kHelErrDismissed = 20,
148 kHelErrRemoteFault = 21,
149 kHelErrAlreadyExists = 22,
150 kHelErrBadPermissions = 23,
151 kHelErrOther = 24,
152 kHelErrFutexRace = 25,
153 kHelErrBadRights = 26,
154};
155
156typedef uint32_t HelRights;
157
158// No right but easier to recognize in code than a zero literal.
159// - General: descriptor properties can be queried without any rights.
160// - Memory view: memory size can be queried without any rights.
161// - Thread: statistics can be queried without any rights.
162static const HelRights kHelRightNull = 0;
163// Right to map into an object.
164// - Universe: required to transfer into the universe.
165// - Universe: required to close descriptors in the universe.
166// - Universe: required to create a thread in the universe.
167// - Address space: required to map into the space.
168// - Address space: required to change memory protection.
169// - Virtualized space: required to map into the space.
170// - DMA space: required to map into the space.
171static const HelRights kHelRightGrant = UINT32_C(1) << 0;
172// Right to map from an object.
173// - Universe: required to transfer out of the universe.
174// - Universe: required to create a thread in the universe.
175static const HelRights kHelRightTake = UINT32_C(1) << 1;
176// Right to read data.
177// - IPC queue: required to map readable.
178// - Memory view: required to read.
179// - Memory view: required to map readable.
180// - Memory view: required to create copy-on-write view.
181// - Memory view: required to map into indirect memory.
182// - Memory slice: required to map readable.
183// - Memory slice: required to map into indirect memory.
184// - Address space: required to read from it.
185// - Address space: required to create thread.
186// - Virtualized space: required to read from it.
187// - I/O objects: required to enable userspace I/O.
188// - Thread: required to read registers.
189// - Thread: required to read memory in its address space.
190// - Thread: required to get the affinity.
191// - Virtualized CPUs: required to read registers.
192static const HelRights kHelRightRead = UINT32_C(1) << 2;
193// Right to write data.
194// - IPC queue: required to map writeable.
195// - Memory view: required to write.
196// - Memory view: required to map writeable.
197// - Memory view: required to map into indirect memory.
198// - Memory slice: required to map writeable.
199// - Memory slice: required to map into indirect memory.
200// - Address space: required to write to it.
201// - Address space: required to create thread.
202// - Virtualized space: required to write to it.
203// - I/O objects: required to enable userspace I/O.
204// - Thread: required to write registers.
205// - Thread: required to write memory in its address space.
206// - Thread: required to set the affinity.
207// - Virtualized CPUs: required to write registers.
208static const HelRights kHelRightWrite = UINT32_C(1) << 3;
209// Right to execute code.
210// - Memory view: required to map executable.
211// - Memory slice: required to map executable.
212static const HelRights kHelRightExecute = UINT32_C(1) << 4;
213// Right to execute operations.
214// - IPC queue: required to submit.
215// - Lane: required to do exchange messages.
216// - Virtualized CPUs: required to run.
217static const HelRights kHelRightInvoke = UINT32_C(1) << 5;
218// Right to build new objects on top of existing ones.
219// - IPC queue: required to map.
220// - Universe: required to create thread.
221// - Address space: required to create thread.
222// - Memory view: required to map.
223// - Memory view: required to create copy-on-write view.
224// - Memory view: required to map into indirect memory.
225// - Memory view: required to create slice.
226// - Memory view: required to bind to kernlet.
227// - IRQ pin: required to install an IRQ handler.
228// - Memory slice: required to map.
229// - Memory slice: required to map into indirect memory.
230// - Swap space: required to allocate memory backed by it.
231// - Virtualized space: required to create virtualized CPU.
232// - I/O objects: required to enable userspace I/O.
233// - Kernlets: required to create a bound kernlet from it.
234// - Bound kernlets: required to attach to an IRQ.
235static const HelRights kHelRightAssign = UINT32_C(1) << 6;
236// Right to derive new objects that affect the original one.
237// - Memory view: required to fork.
238// - Hierarchy: required to extend it by a child hierarchy node.
239static const HelRights kHelRightDerive = UINT32_C(1) << 7;
240// Right to add, remove or manipulate components.
241// - Memory views: required to perform loadahead.
242// - Address space: required to synchronize.
243// - Address space: required to resolve physical addresses.
244// - DMA space: required to populate.
245// - DMA space: required to resolve physical addresses.
246// - Hierarchy: required to charge resources to it.
247static const HelRights kHelRightProvision = UINT32_C(1) << 8;
248// Right to pin memory pages.
249// - Memory view: required to pin pages.
250static const HelRights kHelRightPin = UINT32_C(1) << 9;
251// Right to perform memory fences.
252// - Memory view: required for fences.
253static const HelRights kHelRightFence = UINT32_C(1) << 10;
254// Right to wait on an object.
255// - IPC queue: required to drive.
256// - Thread: required to observe.
257// - Event: required to wait.
258// - IRQ: required to wait.
259// - IRQ: required to attach a kernlet.
260static const HelRights kHelRightWait = UINT32_C(1) << 11;
261// Right to signal an object.
262// - IPC queue: required to alert.
263// - Thread: required to interrupt.
264// - Event: required to raise.
265// - Event: required to bind to kernlet.
266// - IRQ: required to acknowledge.
267// - IRQ: required to attach a kernlet.
268// - Virtualized CPUs: required to raise an interrupt.
269static const HelRights kHelRightSignal = UINT32_C(1) << 12;
270// Right to manage an object (includes potentially destructive operations).
271// - Lane: required to shut down.
272// - Memory view: required to resize.
273// - Memory view: required to manage.
274// - Memory view: required to invalidate.
275// - Swap space: required to set the swap budget.
276// - Thread: required to set priority.
277// - Thread: required to resume.
278// - Thread: required to kill.
279// - IRQ pin: required to configure the IRQ.
280// - IRQ pin: required to obtain MSI address and data words.
281static const HelRights kHelRightManage = UINT32_C(1) << 13;
282// All rights (even unspecified ones). Easier to recognize in code than a literal.
283static const HelRights kHelRightsMax = ~UINT32_C(0);
284
285struct HelX86SegmentRegister {
286 uint64_t base;
287 uint32_t limit;
288 uint16_t selector;
289 uint8_t type, present, dpl, db, s, l, g, avl;
290};
291
292struct HelX86DescriptorTable {
293 uint64_t base;
294 uint16_t limit;
295};
296
297struct HelX86VirtualizationRegs {
298 uint64_t rax;
299 uint64_t rbx;
300 uint64_t rcx;
301 uint64_t rdx;
302 uint64_t rsi;
303 uint64_t rdi;
304 uint64_t rbp;
305 uint64_t r8;
306 uint64_t r9;
307 uint64_t r10;
308 uint64_t r11;
309 uint64_t r12;
310 uint64_t r13;
311 uint64_t r14;
312 uint64_t r15;
313
314 uint64_t rsp;
315 uint64_t rip;
316 uint64_t rflags;
317
318 struct HelX86SegmentRegister cs, ds, es, fs, gs, ss;
319 struct HelX86SegmentRegister tr, ldt;
320 struct HelX86DescriptorTable gdt, idt;
321
322 uint64_t cr0, cr2, cr3, cr4, cr8;
323 uint64_t efer;
324 uint64_t apic_base;
325};
326
327struct HelRiscv64VirtualizationRegs {
328 union {
329 uint64_t x[32];
330
331 struct {
332 uint64_t zero;
333 uint64_t ra;
334 uint64_t sp;
335 uint64_t gp;
336 uint64_t tp;
337 uint64_t t0;
338 uint64_t t1;
339 uint64_t t2;
340 uint64_t s0;
341 uint64_t s1;
342 uint64_t a0;
343 uint64_t a1;
344 uint64_t a2;
345 uint64_t a3;
346 uint64_t a4;
347 uint64_t a5;
348 uint64_t a6;
349 uint64_t a7;
350 uint64_t s2;
351 uint64_t s3;
352 uint64_t s4;
353 uint64_t s5;
354 uint64_t s6;
355 uint64_t s7;
356 uint64_t s8;
357 uint64_t s9;
358 uint64_t s10;
359 uint64_t s11;
360 uint64_t t3;
361 uint64_t t4;
362 uint64_t t5;
363 uint64_t t6;
364 };
365 };
366
367 uint64_t pc;
368 uint8_t kernelMode;
369
370 // CSRs
371 uint64_t sstatus;
372 uint64_t sie;
373 uint64_t stvec;
374 uint64_t sscratch;
375 uint64_t sepc;
376 uint64_t scause;
377 uint64_t stval;
378 uint64_t sip;
379 uint64_t satp;
380 uint64_t stimecmp;
381};
382
383#if defined(__riscv) && __riscv_xlen == 64
384typedef struct HelRiscv64VirtualizationRegs HelVirtualizationRegs;
385#else
386typedef struct HelX86VirtualizationRegs HelVirtualizationRegs;
387#endif
388
389enum {
390 kHelNullHandle = 0,
391 kHelThisUniverse = -1,
392 kHelThisThread = -2
393};
394
395enum {
396 kHelWaitInfinite = -1
397};
398
399enum {
400 kHelAbiSystemV = 1
401};
402
403enum {
404 kHelActionNone = 0,
405 kHelActionDismiss = 11,
406 kHelActionOffer = 5,
407 kHelActionAccept = 6,
408 kHelActionImbueCredentials = 8,
409 kHelActionExtractCredentials = 9,
410 kHelActionSendFromBuffer = 1,
411 kHelActionSendFromBufferSg = 10,
412 kHelActionRecvInline = 7,
413 kHelActionRecvToBuffer = 3,
414 kHelActionPushDescriptor = 2,
415 kHelActionPullDescriptor = 4
416};
417
418enum {
419 kHelItemChain = 1,
420 kHelItemAncillary = 2,
421 kHelItemWantLane = (1 << 16),
422};
423
424static const uint32_t kHelTransferDescriptorOut = UINT32_C(1) << 0;
425static const uint32_t kHelTransferDescriptorIn = UINT32_C(1) << 1;
426
427enum {
428 kHelObtainZeroMemory = 1,
429 kHelObtainClockPage = 2
430};
431
433enum {
443 kHelClockTime = 4
445
456 uint64_t seqlock;
458 uint32_t clockType;
460 int32_t tickShift;
462 uint64_t tickFactor;
463};
464
465struct HelSgItem {
466 void *buffer;
467 size_t length;
468};
469
470struct HelAction {
471 int type;
472 uint32_t flags;
473 // TODO: It may be worth to restructure this to a union of structs
474 // (e.g., a HelActionDataBufferSize, HelActionDataDescriptorRights, ...),
475 // but that requires simultaneous mlibc and Managarm changes.
476 union {
477 uintptr_t word0;
478 void *buffer;
479 };
480 union {
481 uintptr_t word1;
482 size_t length;
483 // For kHelPushDescriptor, kHelPullDescriptor.
484 uint32_t rights;
485 };
486 union {
487 uintptr_t word2;
488 // For kHelActionImbueCredentials, kHelPushDescriptor, kHelPullDescriptor.
489 HelHandle handle;
490 };
491};
492
493struct HelDescriptorInfo {
494 int type;
495};
496
497enum HelAllocFlags {
498 kHelAllocContinuous = 4,
499 kHelAllocOnDemand = 1,
500};
501
502struct HelAllocRestrictions {
503 int addressBits;
504};
505
506enum HelManagedFlags {
507 kHelManagedReadahead = 1
508};
509
510enum HelManageRequests {
511 kHelManageInitialize = 1,
512 kHelManageWriteback = 2
513};
514
522
524 // Additional flags that may be set.
525 kHelMapProtRead = UINT32_C(1) << 8,
526 kHelMapProtWrite = UINT32_C(1) << 9,
527 kHelMapProtExecute = UINT32_C(1) << 10,
528 kHelMapDontRequireBacking = UINT32_C(1) << 7,
529 kHelMapFixed = UINT32_C(1) << 11,
530 kHelMapFixedNoReplace = UINT32_C(1) << 12,
531 kHelMapPreferBottom = UINT32_C(1) << 13,
534 kHelMapNoDirtyTracking = UINT32_C(1) << 14
536
537enum HelSliceFlags {
538 kHelSliceCacheWriteCombine = 1,
539};
540
541enum HelCachingMode {
542 kHelCachingDefault = 0,
543 kHelCachingUncached = 1,
544 kHelCachingWriteCombine = 2,
545 kHelCachingWriteThrough = 3,
546 kHelCachingWriteBack = 4,
547 kHelCachingMmio = 5,
548 kHelCachingMmioNonPosted = 6
549};
550
551enum HelThreadFlags {
552 kHelThreadStopped = 1
553};
554
555enum HelObservation {
556 kHelObserveNull = 0,
557 kHelObserveInterrupt = 4,
558 kHelObservePanic = 3,
559 kHelObserveBreakpoint = 1,
560 kHelObservePageFault = 2,
561 kHelObserveGeneralFault = 5,
562 kHelObserveIllegalInstruction = 6,
563 kHelObserveDivByZero = 7,
564 kHelObserveSuperCall = 0x80000000
565};
566
567enum HelRegisterSets {
568 kHelRegsProgram = 1,
569 kHelRegsGeneral = 2,
570 kHelRegsThread = 3,
571 kHelRegsDebug = 4,
572 kHelRegsVirtualization = 5,
573 kHelRegsSimd = 6,
574 kHelRegsSignal = 7,
575 kHelRegsPageFault = 8
576};
577
578enum HelPageFaultFlags {
579 kHelPageFaultMapError = 1,
580 kHelPageFaultAccessError = 2
581};
582
587};
588
589#if defined(__x86_64__)
590enum HelRegisterIndex {
591 kHelRegRax = 0,
592 kHelRegRbx = 1,
593 kHelRegRcx = 2,
594 kHelRegRdx = 3,
595 kHelRegRdi = 4,
596 kHelRegRsi = 5,
597 kHelRegR8 = 6,
598 kHelRegR9 = 7,
599 kHelRegR10 = 8,
600 kHelRegR11 = 9,
601 kHelRegR12 = 10,
602 kHelRegR13 = 11,
603 kHelRegR14 = 12,
604 kHelRegR15 = 13,
605 kHelRegRbp = 14,
606
607 kHelNumGprs = 15,
608
609 kHelRegIp = 0,
610 kHelRegSp = 1
611};
612
613enum HelSyscallArgs {
614 kHelRegNumber = kHelRegRdi,
615 kHelRegError = kHelRegRdi,
616
617 kHelRegArg0 = kHelRegRsi,
618 kHelRegArg1 = kHelRegRdx,
619 kHelRegArg2 = kHelRegRax,
620 kHelRegArg3 = kHelRegR8,
621 kHelRegArg4 = kHelRegR9,
622 kHelRegArg5 = kHelRegR10,
623 kHelRegArg6 = kHelRegR12,
624 kHelRegArg7 = kHelRegR13,
625 kHelRegArg8 = kHelRegR14,
626
627 kHelRegOut0 = kHelRegRsi,
628 kHelRegOut1 = kHelRegRdx,
629 kHelRegOut2 = kHelRegRax
630};
631
632#elif defined(__aarch64__)
633enum HelRegisterIndex {
634 kHelRegX0 = 0,
635 kHelRegX1,
636 kHelRegX2,
637 kHelRegX3,
638 kHelRegX4,
639 kHelRegX5,
640 kHelRegX6,
641 kHelRegX7,
642 kHelRegX8,
643 kHelRegX9,
644 kHelRegX10,
645 kHelRegX11,
646 kHelRegX12,
647 kHelRegX13,
648 kHelRegX14,
649 kHelRegX15,
650 kHelRegX16,
651 kHelRegX17,
652 kHelRegX18,
653 kHelRegX19,
654 kHelRegX20,
655 kHelRegX21,
656 kHelRegX22,
657 kHelRegX23,
658 kHelRegX24,
659 kHelRegX25,
660 kHelRegX26,
661 kHelRegX27,
662 kHelRegX28,
663 kHelRegX29,
664 kHelRegX30,
665
666 kHelNumGprs = 31,
667
668 kHelRegIp = 0,
669 kHelRegSp = 1
670};
671
672enum HelSyscallArgs {
673 kHelRegNumber = kHelRegX0,
674 kHelRegError = kHelRegX0,
675
676 kHelRegArg0 = kHelRegX1,
677 kHelRegArg1 = kHelRegX2,
678 kHelRegArg2 = kHelRegX3,
679 kHelRegArg3 = kHelRegX4,
680 kHelRegArg4 = kHelRegX5,
681 kHelRegArg5 = kHelRegX6,
682 kHelRegArg6 = kHelRegX7,
683 kHelRegArg7 = kHelRegX8,
684 kHelRegArg8 = kHelRegX9,
685
686 kHelRegOut0 = kHelRegX1,
687 kHelRegOut1 = kHelRegX2,
688 kHelRegOut2 = kHelRegX3
689};
690
691#elif defined(__riscv) && __riscv_xlen == 64
692enum HelRegisterIndex {
693 kHelRegRa = 0,
694 kHelRegGp,
695 kHelRegTp,
696 kHelRegT0,
697 kHelRegT1,
698 kHelRegT2,
699 kHelRegS0,
700 kHelRegS1,
701 kHelRegA0,
702 kHelRegA1,
703 kHelRegA2,
704 kHelRegA3,
705 kHelRegA4,
706 kHelRegA5,
707 kHelRegA6,
708 kHelRegA7,
709 kHelRegS2,
710 kHelRegS3,
711 kHelRegS4,
712 kHelRegS5,
713 kHelRegS6,
714 kHelRegS7,
715 kHelRegS8,
716 kHelRegS9,
717 kHelRegS10,
718 kHelRegS11,
719 kHelRegT3,
720 kHelRegT4,
721 kHelRegT5,
722 kHelRegT6,
723 kHelNumGprs,
724 kHelRegIp = 0,
725 kHelRegSp = 1
726};
727enum HelSyscallArgs {
728 kHelRegNumber = kHelRegA0,
729 kHelRegError = kHelRegA0,
730 kHelRegArg0 = kHelRegA1,
731 kHelRegArg1 = kHelRegA2,
732 kHelRegArg2 = kHelRegA3,
733 kHelRegArg3 = kHelRegA4,
734 kHelRegArg4 = kHelRegA5,
735 kHelRegArg5 = kHelRegA6,
736 kHelRegArg6 = kHelRegA7,
737 kHelRegArg7 = kHelRegS2,
738 kHelRegArg8 = kHelRegS3,
739
740 kHelRegOut0 = kHelRegA1,
741 kHelRegOut1 = kHelRegA2,
742 kHelRegOut2 = kHelRegA3
743};
744
745#endif
746
747struct HelQueueParameters {
748 uint32_t flags;
749 unsigned int numChunks;
750 size_t chunkSize;
751 unsigned int numSqChunks;
752};
753
754struct HelHierarchyParameters {
755 // Optional tag to identify the hierarchy in kernel messages.
756 // Null-terminated unless it fills the entire array.
757 char tag[128];
758};
759
761static const int kHelUserNotifyCqProgress = (1 << 0);
763static const int kHelUserNotifySupplySqChunks = (1 << 1);
765static const int kHelUserNotifyError = (1 << 14);
767static const int kHelUserNotifyAlert = (1 << 15);
768
770static const int kHelKernelNotifySqProgress = (1 << 0);
772static const int kHelKernelNotifySupplyCqChunks = (1 << 1);
773
775static const uint32_t kHelDriveWait = (1 << 0);
776
777enum {
778 kHelAccessIommuIntelVtd = 1,
779 kHelAccessIommuAmdVi = 2,
780};
781
782enum {
783 kHelDmaRegionRead = 1,
784 kHelDmaRegionWrite = 2,
785};
786
789 uint64_t base;
790 uint64_t size;
791 uint32_t flags;
792};
793
796 uint32_t segment;
797 uint8_t bus;
798 uint8_t slot;
799 uint8_t function;
800};
801
803static const uint32_t kHelSubmitCancel = 256;
805static const uint32_t kHelSubmitAsyncNop = 1;
807static const uint32_t kHelSubmitExchangeMsgs = 2;
809static const uint32_t kHelSubmitAwaitClock = 3;
811static const uint32_t kHelSubmitAwaitEvent = 4;
813static const uint32_t kHelSubmitProtectMemory = 5;
815static const uint32_t kHelSubmitSynchronizeSpace = 6;
817static const uint32_t kHelSubmitReadMemory = 7;
819static const uint32_t kHelSubmitWriteMemory = 8;
821static const uint32_t kHelSubmitManageMemory = 9;
823static const uint32_t kHelSubmitLockMemoryView = 10;
825static const uint32_t kHelSubmitObserve = 11;
827static const uint32_t kHelSubmitResizeMemory = 12;
829static const uint32_t kHelSubmitForkMemory = 13;
831static const uint32_t kHelSubmitWritebackFence = 14;
833static const uint32_t kHelSubmitInvalidateMemory = 15;
835static const uint32_t kHelSubmitPopulateSpace = 16;
837static const uint32_t kHelSubmitMapMemory = 17;
839static const uint32_t kHelSubmitUnmapMemory = 18;
841static const uint32_t kHelSubmitBindDmaDevice = 19;
843static const uint32_t kHelSubmitUnbindDmaDevice = 20;
845static const uint32_t kHelSubmitActivateIommu = 21;
846
848struct HelQueue {
853
858
862
866};
867
869static const int kHelNextPresent = (1 << 24);
870
872static const int kHelProgressMask = 0xFFFFFF;
874static const int kHelProgressDone = (1 << 25);
876static const int kHelProgressFull = (1 << 26);
877
878struct HelChunk {
881 int next;
882
884 int progressFutex;
885
887 char buffer[];
888};
889
893 unsigned int length;
895 unsigned int opcode;
897 void *context;
898};
899
902 uint64_t cancellationTag;
903};
904
909 HelHandle lane;
911 size_t count;
913 uint32_t flags;
914};
915
919 uint64_t counter;
922};
923
927 HelHandle handle;
929 uint64_t sequence;
932};
933
937 HelHandle spaceHandle;
939 void *pointer;
941 size_t size;
943 uint32_t flags;
944};
945
949 HelHandle spaceHandle;
951 void *pointer;
953 size_t size;
954};
955
959 HelHandle handle;
961 uintptr_t address;
963 size_t length;
965 void *buffer;
966};
967
971 HelHandle handle;
973 uintptr_t address;
975 size_t length;
977 const void *buffer;
978};
979
983 HelHandle handle;
984};
985
989 HelHandle handle;
991 uintptr_t offset;
993 size_t size;
994};
995
999 HelHandle handle;
1000};
1001
1005 HelHandle handle;
1007 size_t newSize;
1008};
1009
1015 HelHandle handle;
1016};
1017
1022 HelHandle handle;
1024 uintptr_t offset;
1026 size_t size;
1027};
1028
1030static const uint32_t kHelInvalidateNoWriteback = 1;
1031
1035 HelHandle handle;
1037 uintptr_t offset;
1039 size_t size;
1041 uint32_t flags;
1042};
1043
1047 HelHandle handle;
1049 uintptr_t address;
1051 size_t length;
1052};
1053
1057 HelHandle memoryHandle;
1059 HelHandle spaceHandle;
1061 void *pointer;
1063 uintptr_t offset;
1065 size_t size;
1067 uint32_t flags;
1068};
1069
1073 HelHandle spaceHandle;
1075 void *pointer;
1077 size_t size;
1078};
1079
1092
1102
1109 HelHandle iommuHandle;
1110};
1111
1112struct HelSimpleResult {
1113 HelError error;
1114 int reserved;
1115};
1116
1117struct HelCredentialsResult {
1118 HelError error;
1119 int reserved;
1120 char credentials[16];
1121};
1122
1123struct HelManageResult {
1124 HelError error;
1125 int type;
1126 uintptr_t offset;
1127 size_t length;
1128};
1129
1130struct HelObserveResult {
1131 HelError error;
1132 unsigned int observation;
1133};
1134
1135struct HelInlineResult {
1136 HelError error;
1137 int reserved;
1138 size_t length;
1139 char data[];
1140};
1141
1142struct HelInlineResultNoFlex {
1143 HelError error;
1144 int reserved;
1145 size_t length;
1146};
1147
1148struct HelLengthResult {
1149 HelError error;
1150 int reserved;
1151 size_t length;
1152};
1153
1154struct HelHandleResult {
1155 HelError error;
1156 int reserved;
1157 HelHandle handle;
1158};
1159
1160struct HelPointerResult {
1161 HelError error;
1162 int reserved;
1163 void *pointer;
1164};
1165
1166struct HelEventResult {
1167 HelError error;
1168 uint32_t bitset;
1169 uint64_t sequence;
1170};
1171
1172enum HelAckFlags {
1173 kHelAckAcknowledge = 2,
1174 kHelAckNack = 3,
1175 kHelAckKick = 1,
1176 kHelAckClear = 0x100,
1177};
1178
1179union HelKernletData {
1180 HelHandle handle;
1181};
1182
1183struct HelThreadStats {
1184 uint64_t userTime;
1185};
1186
1187enum {
1188 kHelVmexitHlt = 0,
1189 kHelVmexitTranslationFault = 1,
1190 kHelVmexitHyperCall = 2,
1191 kHelVmexitInstructionTrap = 3,
1192 kHelVmexitError = -1,
1193 kHelVmexitUnknownPlatformSpecificExitCode = -2,
1194};
1195
1196enum {
1197 kHelVmFaultRead = 1 << 0,
1198 kHelVmFaultWrite = 1 << 1,
1199 kHelVmFaultExecute = 1 << 2,
1200};
1201
1202#if defined(__riscv) && __riscv_xlen == 64
1203
1204struct HelVmexitReason {
1205 uint32_t exitReason;
1206 // If bit 63 is set then stores a compressed unexpanded instruction,
1207 // otherwise stores a normal 32-bit instruction (possibly originally compressed in which case bits 1:0 aren't 0b11).
1208 uint64_t instruction;
1209 size_t address;
1210 size_t flags;
1211};
1212
1213#else
1214
1215struct HelVmexitReason {
1216 uint32_t exitReason;
1217 uint32_t code;
1218 size_t address;
1219 size_t flags;
1220};
1221
1222#endif
1223
1224// see RFC 5424
1225enum HelLogSeverity {
1226 kHelLogSeverityEmergency,
1227 kHelLogSeverityAlert,
1228 kHelLogSeverityCritical,
1229 kHelLogSeverityError,
1230 kHelLogSeverityWarning,
1231 kHelLogSeverityNotice,
1232 kHelLogSeverityInfo,
1233 kHelLogSeverityDebug,
1234};
1235
1236enum {
1237 kHelAccessIrqByGsi = 1,
1238 kHelAccessIrqByPhandle = 2,
1239 kHelAccessIrqAllocateMsi = 3,
1240};
1241
1243enum {
1244 kHelIrqNameSize = 32,
1245};
1246
1247enum {
1248 kHelIrqTriggerNull = 0,
1249 kHelIrqTriggerEdge = 1,
1250 kHelIrqTriggerLevel = 2
1251};
1252
1253enum {
1254 kHelIrqPolarityNull = 0,
1255 kHelIrqPolarityHigh = 1,
1256 kHelIrqPolarityLow = 2
1257};
1258
1261 uint64_t address;
1262 uint32_t data;
1263};
1264
1267
1275HEL_C_LINKAGE HelError helLog(const enum HelLogSeverity severity, const char *string, size_t length);
1276
1282HEL_C_LINKAGE void helPanic(const char *string, size_t length)
1283 __attribute__ (( noreturn ));
1284
1288
1290HEL_C_LINKAGE HelError helNop();
1291
1295HEL_C_LINKAGE HelError helSubmitAsyncNop(HelHandle queueHandle, uintptr_t context);
1296
1304HEL_C_LINKAGE HelError helExtendHierarchy(HelHandle hierarchyHandle,
1305 const struct HelHierarchyParameters *params, HelHandle *handle);
1306
1310
1314HEL_C_LINKAGE HelError helCreateUniverse(HelHandle *handle);
1315
1323HEL_C_LINKAGE HelError
1324helTransferDescriptor(HelHandle handle, HelHandle universeHandle,
1325 uint32_t flags, uint32_t exposedRights, uint32_t requiredRights, HelHandle *outHandle);
1326
1327HEL_C_LINKAGE HelError helDescriptorInfo(HelHandle handle, struct HelDescriptorInfo *info);
1328
1334HEL_C_LINKAGE HelError helGetCredentials(HelHandle handle, uint32_t flags,
1335 char *credentials);
1336
1342HEL_C_LINKAGE HelError helCloseDescriptor(HelHandle universeHandle, HelHandle handle);
1343
1349HEL_C_LINKAGE HelError helObtainHandle(int kind, HelHandle *handle);
1350
1354
1360HEL_C_LINKAGE HelError helCreateQueue(const struct HelQueueParameters *params,
1361 HelHandle *handle);
1362
1374HEL_C_LINKAGE HelError helDriveQueue(HelHandle queueHandle, uint32_t flags, uint32_t notifyMask);
1375
1382HEL_C_LINKAGE HelError helAlertQueue(HelHandle queueHandle);
1383
1387
1400HEL_C_LINKAGE HelError helAllocateMemory(HelHandle hierarchy, size_t size, uint32_t flags,
1401 const struct HelAllocRestrictions *restrictions, HelHandle *handle);
1402
1409HEL_C_LINKAGE HelError helResizeMemory(HelHandle handle, size_t newSize);
1410
1425HEL_C_LINKAGE HelError helCreateManagedMemory(HelHandle hierarchy, size_t size, uint32_t flags,
1426 HelHandle *backingHandle, HelHandle *frontalHandle);
1427
1449HEL_C_LINKAGE HelError helCreateSwapSpace(HelHandle hierarchy, uint32_t flags,
1450 HelHandle *backingHandle, HelHandle *swapHandle);
1451
1466HEL_C_LINKAGE HelError helAllocateSwappableMemory(HelHandle hierarchy, HelHandle swapSpace,
1467 size_t size, uint32_t flags, HelHandle *handle);
1468
1474HEL_C_LINKAGE HelError helSetSwapBudget(HelHandle swapSpace, size_t numPages);
1475
1494HEL_C_LINKAGE HelError helCopyOnWrite(HelHandle hierarchy, HelHandle swapSpace, HelHandle memory,
1495 uintptr_t offset, size_t size, HelHandle *handle);
1496
1497HEL_C_LINKAGE HelError helAccessPhysical(
1498 HelHandle accessToken, uintptr_t physical, size_t size, uint32_t cachingMode, HelHandle *handle
1499);
1500
1506HEL_C_LINKAGE HelError helCreateIndirectMemory(size_t numSlots, HelHandle *handle);
1507
1524HEL_C_LINKAGE HelError helAlterMemoryIndirection(HelHandle indirectHandle, size_t slotIndex,
1525 HelHandle memoryHandle, uintptr_t offset, size_t size);
1526
1527HEL_C_LINKAGE HelError helCreateSliceView(HelHandle bundle, uintptr_t offset, size_t size,
1528 uint32_t flags, HelHandle *handle);
1529
1537HEL_C_LINKAGE HelError helForkMemory(HelHandle handle, HelHandle *forkedHandle);
1538
1542HEL_C_LINKAGE HelError helCreateSpace(HelHandle *handle);
1543
1553HEL_C_LINKAGE HelError helAccessIommu(HelHandle accessHandle, uint32_t mode, uint64_t base,
1554 HelHandle *handle);
1555
1575HEL_C_LINKAGE HelError helCreateDmaSpace(HelHandle iommuHandle,
1576 const struct HelDmaReservedRegion *regions, size_t numRegions,
1577 uint32_t flags, HelHandle *handle);
1578
1596HEL_C_LINKAGE HelError helMapMemory(HelHandle memoryHandle, HelHandle spaceHandle,
1597 void *pointer, uintptr_t offset, size_t size, uint32_t flags, void **actualPointer);
1598
1599
1610HEL_C_LINKAGE HelError helUnmapMemory(HelHandle spaceHandle, void *pointer, size_t size);
1611
1612HEL_C_LINKAGE HelError helPointerPhysical(HelHandle spaceHandle, const void *pointer, uintptr_t *physical);
1613
1614HEL_C_LINKAGE HelError helMemoryInfo(HelHandle handle,
1615 size_t *size);
1616
1617HEL_C_LINKAGE HelError helUpdateMemory(HelHandle handle, int type, uintptr_t offset, size_t length);
1618
1629HEL_C_LINKAGE HelError helLoadahead(HelHandle handle, uintptr_t offset, size_t length);
1630
1631HEL_C_LINKAGE HelError helCreateVirtualizedSpace(HelHandle *handle);
1632
1636
1650HEL_C_LINKAGE HelError helCreateThread(HelHandle universe, HelHandle spaceHandle,
1651 HelAbi abi, void *ip, void *sp, uint32_t flags, HelHandle *handle);
1652
1658HEL_C_LINKAGE HelError helQueryThreadStats(HelHandle handle, struct HelThreadStats *stats);
1659
1668HEL_C_LINKAGE HelError helSetPriority(HelHandle handle, int priority);
1669
1671HEL_C_LINKAGE HelError helYield();
1672
1676HEL_C_LINKAGE HelError helKillThread(HelHandle handle);
1677
1684HEL_C_LINKAGE HelError helInterruptThread(HelHandle handle);
1685
1692HEL_C_LINKAGE HelError helResume(HelHandle handle);
1693
1701HEL_C_LINKAGE HelError helLoadRegisters(HelHandle handle, int set, void *image);
1702
1710HEL_C_LINKAGE HelError helStoreRegisters(HelHandle handle, int set, const void *image);
1711
1714// Register set to query information for.
1717HEL_C_LINKAGE HelError helQueryRegisterInfo(int set, struct HelRegisterInfo *info);
1718
1719HEL_C_LINKAGE HelError helWriteFsBase(void *pointer);
1720
1721HEL_C_LINKAGE HelError helReadFsBase(void **pointer);
1722
1723HEL_C_LINKAGE HelError helWriteGsBase(void *pointer);
1724
1725HEL_C_LINKAGE HelError helReadGsBase(void **pointer);
1726
1728HEL_C_LINKAGE HelError helGetCurrentCpu(int *cpu);
1729
1734HEL_C_LINKAGE HelError helGetClock(uint64_t *counter);
1735
1736HEL_C_LINKAGE HelError helCreateVirtualizedCpu(HelHandle handle, HelHandle *out_handle);
1737
1738HEL_C_LINKAGE HelError helRunVirtualizedCpu(HelHandle handle, struct HelVmexitReason *reason);
1739
1740HEL_C_LINKAGE HelError helAssertVirtualizedIrq(HelHandle handle, uint64_t irq, uint8_t level);
1741
1742HEL_C_LINKAGE HelError helGetRandomBytes(void *buffer, size_t wantedSize, size_t *actualSize);
1743
1753HEL_C_LINKAGE HelError helGetAffinity(HelHandle handle, uint8_t *mask, size_t size, size_t *actualSize);
1754
1762HEL_C_LINKAGE HelError helSetAffinity(HelHandle handle, uint8_t *mask, size_t size);
1763
1767
1775HEL_C_LINKAGE HelError helCreateStream(HelHandle *lane1, HelHandle *lane2, uint32_t attach_credentials);
1776
1777HEL_C_LINKAGE HelError helShutdownLane(HelHandle handle);
1778
1786HEL_C_LINKAGE HelError helCreateToken(HelHandle *handle);
1787
1791
1800HEL_C_LINKAGE HelError helFutexWait(int *pointer, int expected, int64_t deadline);
1801
1807HEL_C_LINKAGE HelError helFutexWake(int *pointer, unsigned int count);
1808
1812
1816HEL_C_LINKAGE HelError helCreateOneshotEvent(HelHandle *handle);
1817
1821HEL_C_LINKAGE HelError helCreateBitsetEvent(HelHandle *handle);
1822
1826HEL_C_LINKAGE HelError helRaiseEvent(HelHandle handle);
1827
1848HEL_C_LINKAGE HelError helAccessIrq(
1849 HelHandle accessHandle, uint32_t mode, uint64_t controller, uint64_t index,
1850 const char *name, HelHandle *handle
1851);
1852
1858HEL_C_LINKAGE HelError helHandleIrq(HelHandle pinHandle, HelHandle *handle);
1859
1871HEL_C_LINKAGE HelError helConfigureIrq(HelHandle pinHandle, uint32_t trigger, uint32_t polarity);
1872
1879HEL_C_LINKAGE HelError helQueryMsiInfo(HelHandle pinHandle, struct HelMsiInfo *info);
1880
1881HEL_C_LINKAGE HelError helAcknowledgeIrq(HelHandle handle, uint32_t flags, uint64_t sequence);
1882
1883HEL_C_LINKAGE HelError helAutomateIrq(HelHandle handle, uint32_t flags, HelHandle kernlet);
1884
1888
1889HEL_C_LINKAGE HelError helAccessIo(
1890 HelHandle accessToken, const uintptr_t *portArray, size_t numPorts, HelHandle *handle
1891);
1892
1896HEL_C_LINKAGE HelError helEnableIo(HelHandle handle);
1897
1901
1911HEL_C_LINKAGE HelError helBindKernlet(HelHandle handle,
1912 const union HelKernletData *data, size_t numData, HelHandle *boundHandle);
1913
1915
1916extern inline __attribute__ (( always_inline )) const char *_helErrorString(HelError code) {
1917 switch(code) {
1918 case kHelErrNone:
1919 return "Success";
1920 case kHelErrIllegalSyscall:
1921 return "Illegal syscall";
1922 case kHelErrIllegalArgs:
1923 return "Illegal arguments";
1924 case kHelErrIllegalState:
1925 return "Illegal state";
1926 case kHelErrUnsupportedOperation:
1927 return "Unsupported operation";
1928 case kHelErrNoDescriptor:
1929 return "No such descriptor";
1930 case kHelErrBadDescriptor:
1931 return "Illegal descriptor for this operation";
1932 case kHelErrThreadTerminated:
1933 return "Thread terminated already";
1934 case kHelErrLaneShutdown:
1935 return "Lane shutdown";
1936 case kHelErrEndOfLane:
1937 return "End of lane";
1938 case kHelErrDismissed:
1939 return "IPC item dismissed by remote";
1940 case kHelErrBufferTooSmall:
1941 return "Buffer too small";
1942 case kHelErrQueueTooSmall:
1943 return "Buffer too small";
1944 case kHelErrFault:
1945 return "Segfault";
1946 case kHelErrNoHardwareSupport:
1947 return "Missing hardware support for this feature";
1948 case kHelErrNoMemory:
1949 return "Out of memory";
1950 case kHelErrTransmissionMismatch:
1951 return "Transmission mismatch";
1952 case kHelErrCancelled:
1953 return "Cancelled";
1954 case kHelErrOutOfBounds:
1955 return "Out of bounds";
1956 case kHelErrAlreadyExists:
1957 return "Already exists";
1958 case kHelErrBadRights:
1959 return "Missing rights for this operation";
1960 default:
1961 return 0;
1962 }
1963}
1964
1965extern inline __attribute__ (( always_inline )) void _helCheckFailed(HelError err_code,
1966 const char *string, int fatal) {
1967 helLog(kHelLogSeverityError, string, strlen(string));
1968
1969 const char *err_string = _helErrorString(err_code);
1970 if(err_string == 0)
1971 err_string = "(Unexpected error code)";
1972 helLog(kHelLogSeverityError, err_string, strlen(err_string));
1973 helLog(kHelLogSeverityError, "\n", 1);
1974
1975 if(fatal)
1976 helPanic(0, 0);
1977}
1978
1979#define HEL_STRINGIFY_AUX(x) #x
1980#define HEL_STRINGIFY(x) HEL_STRINGIFY_AUX(x)
1981
1982#define HEL_CHECK(expr) do { HelError __error = expr; if(__error != kHelErrNone) \
1983 _helCheckFailed(__error, "HEL_CHECK failed: " #expr "\n" \
1984 " In file " __FILE__ " on line " HEL_STRINGIFY(__LINE__) "\n", 1); } while(0)
1985#define HEL_SOFT_CHECK(expr) do { HelError __error = expr; if(__error != kHelErrNone) \
1986 _helCheckFailed(__error, "HEL_SOFT_CHECK failed: " #expr "\n" \
1987 " In file " __FILE__ " on line " HEL_STRINGIFY(__LINE__) "\n", 0); } while(0)
1988
1989#endif // HEL_H
1990
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:767
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:770
static const uint32_t kHelSubmitInvalidateMemory
SQ opcode: invalidate memory.
Definition hel.h:833
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:1030
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:819
static const uint32_t kHelSubmitUnmapMemory
SQ opcode: unmap memory.
Definition hel.h:839
HEL_C_LINKAGE HelError helObtainHandle(int kind, HelHandle *handle)
Obtains a descriptor to one of the kernel's global objects.
HEL_C_LINKAGE HelError helCreateDmaSpace(HelHandle iommuHandle, const struct HelDmaReservedRegion *regions, size_t numRegions, uint32_t flags, HelHandle *handle)
Creates a DMA space that memory can be mapped into for device DMA.
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:805
HEL_C_LINKAGE HelError helAccessIommu(HelHandle accessHandle, uint32_t mode, uint64_t base, HelHandle *handle)
Access an IOMMU that the kernel discovered from firmware.
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 helCopyOnWrite(HelHandle hierarchy, HelHandle swapSpace, 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 HelError helLoadRegisters(HelHandle handle, int set, void *image)
Load a register image (e.g., from a thread).
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 helAllocateSwappableMemory(HelHandle hierarchy, 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 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:872
static const uint32_t kHelSubmitManageMemory
SQ opcode: manage memory.
Definition hel.h:821
static const uint32_t kHelSubmitForkMemory
SQ opcode: fork memory.
Definition hel.h:829
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:876
static const uint32_t kHelSubmitUnbindDmaDevice
SQ opcode: block the DMA requests of a device.
Definition hel.h:843
static const uint32_t kHelSubmitSynchronizeSpace
SQ opcode: synchronize space.
Definition hel.h:815
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:775
static const uint32_t kHelSubmitObserve
SQ opcode: observe thread.
Definition hel.h:825
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 helCreateThread(HelHandle universe, HelHandle spaceHandle, HelAbi abi, void *ip, void *sp, uint32_t flags, HelHandle *handle)
Create a new thread.
static const uint32_t kHelSubmitBindDmaDevice
SQ opcode: bind a device to a DMA space.
Definition hel.h:841
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:807
static const uint32_t kHelSubmitReadMemory
SQ opcode: read memory.
Definition hel.h:817
static const int kHelNextPresent
Marks the next field as present.
Definition hel.h:869
static const int kHelKernelNotifySupplyCqChunks
Set in kernelNotify after userspace has supplied new chunks.
Definition hel.h:772
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:811
static const uint32_t kHelSubmitAwaitClock
SQ opcode: wait for time to pass.
Definition hel.h:809
static const uint32_t kHelSubmitPopulateSpace
SQ opcode: populate a space.
Definition hel.h:835
@ kHelClockTsc
x86: TSC.
Definition hel.h:437
@ kHelClockCntvct
ARM: virtual counter (CNTVCT_EL0).
Definition hel.h:441
@ kHelClockCntpct
ARM: physical counter (CNTPCT_EL0).
Definition hel.h:439
@ kHelClockNone
No clock that is accessible to userspace (= helGetClock() has to be used).
Definition hel.h:435
@ kHelClockTime
RISC-V: time CSR.
Definition hel.h:443
HEL_C_LINKAGE HelError helAlertQueue(HelHandle queueHandle)
Alerts an IPC queue.
static const uint32_t kHelSubmitActivateIommu
SQ opcode: activate translation on an IOMMU.
Definition hel.h:845
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:813
HelMapFlags
Definition hel.h:523
@ kHelMapNoDirtyTracking
Discards the mapping's dirty bits instead of scheduling the pages for writeback.
Definition hel.h:534
static const uint32_t kHelSubmitMapMemory
SQ opcode: map memory.
Definition hel.h:837
static const int kHelUserNotifySupplySqChunks
Set in userNotify after kernel has supplied new SQ chunks.
Definition hel.h:763
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:761
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:831
HelUpdateMemoryTypes
Additional type values of helUpdateMemory(); these are never issued as manage requests.
Definition hel.h:516
@ kHelUpdateMarkDirty
Marks a range as dirty, as if it had been written through a dirty-tracked mapping.
Definition hel.h:520
static const uint32_t kHelSubmitResizeMemory
SQ opcode: resize memory.
Definition hel.h:827
HEL_C_LINKAGE HelError helCreateOneshotEvent(HelHandle *handle)
Create an event that fires at most once.
HEL_C_LINKAGE HelError helCreateSwapSpace(HelHandle hierarchy, uint32_t flags, HelHandle *backingHandle, HelHandle *swapHandle)
Creates a swap space, the backing store for swappable anonymous memory (see helAllocateSwappableMemor...
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:823
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:874
HEL_C_LINKAGE HelError helEnableIo(HelHandle handle)
Enable userspace access to hardware I/O resources.
HEL_C_LINKAGE HelError helCreateManagedMemory(HelHandle hierarchy, size_t size, uint32_t flags, HelHandle *backingHandle, HelHandle *frontalHandle)
Creates a memory object that is managed by userspace.
static const int kHelUserNotifyError
Set in userNotify if the queue encounters a contract violation.
Definition hel.h:765
HEL_C_LINKAGE HelError helExtendHierarchy(HelHandle hierarchyHandle, const struct HelHierarchyParameters *params, HelHandle *handle)
Creates a child hierarchy capability.
static const uint32_t kHelSubmitCancel
SQ opcode: cancel an asynchronous operation.
Definition hel.h:803
HEL_C_LINKAGE HelError helAllocateMemory(HelHandle hierarchy, size_t size, uint32_t flags, const struct HelAllocRestrictions *restrictions, HelHandle *handle)
Creates a memory object consisting of unmanaged RAM.
Parameters that allow userspace to compute the current time on the monotone clock (i....
Definition hel.h:455
int32_t tickShift
Scaling exponent of the tick -> nanosecond conversion.
Definition hel.h:460
uint64_t tickFactor
Factor of the tick -> nanosecond conversion.
Definition hel.h:462
uint32_t clockType
One of the kHelClock* constants.
Definition hel.h:458
Requester ID that a device issues DMA requests as (see kHelSubmitBindDmaDevice).
Definition hel.h:795
Range of physical memory that a DMA space identity-maps (see helCreateDmaSpace).
Definition hel.h:788
A single element of a HelQueue.
Definition hel.h:891
unsigned int length
Length of the element in bytes.
Definition hel.h:893
void * context
User-defined value.
Definition hel.h:897
unsigned int opcode
Operation code (for SQ elements).
Definition hel.h:895
Message address / data pair that raises an MSI (see helQueryMsiInfo).
Definition hel.h:1260
In-memory kernel/user-space queue.
Definition hel.h:848
int kernelNotify
Futex that is used to wake the kernel.
Definition hel.h:857
int userNotify
Futex that is used to wake userspace.
Definition hel.h:852
int cqFirst
Index of the first chunk of the completion queue.
Definition hel.h:861
int sqFirst
Index of the first chunk of the submission queue.
Definition hel.h:865
Register-related information returned by helQueryRegisterInfo.
Definition hel.h:584
int setSize
Size of the selected register set.
Definition hel.h:586
SQ data for kHelSubmitActivateIommu.
Definition hel.h:1107
HelHandle iommuHandle
Handle to the IOMMU (see helAccessIommu).
Definition hel.h:1109
SQ data for kHelSubmitAwaitClock.
Definition hel.h:917
uint64_t cancellationTag
Tag to cancel this operation.
Definition hel.h:921
uint64_t counter
Deadline in nanoseconds since boot.
Definition hel.h:919
SQ data for kHelSubmitAwaitEvent.
Definition hel.h:925
HelHandle handle
Handle to the event descriptor.
Definition hel.h:927
uint64_t cancellationTag
Tag to cancel this operation.
Definition hel.h:931
uint64_t sequence
Previous sequence number.
Definition hel.h:929
SQ data for kHelSubmitBindDmaDevice.
Definition hel.h:1083
struct HelDmaDeviceId id
Requester ID of the device.
Definition hel.h:1090
HelHandle iommuHandle
Handle to the IOMMU (see helAccessIommu).
Definition hel.h:1085
HelHandle dmaSpaceHandle
Handle to a DMA space of that IOMMU (see helCreateDmaSpace).
Definition hel.h:1088
SQ data for kHelSubmitCancel.
Definition hel.h:901
SQ data for kHelSubmitExchangeMsgs.
Definition hel.h:907
uint32_t flags
Flags.
Definition hel.h:913
size_t count
Number of actions.
Definition hel.h:911
HelHandle lane
Handle to the lane.
Definition hel.h:909
SQ data for kHelSubmitForkMemory.
Definition hel.h:1011
HelHandle hierarchyHandle
Handle to the hierarchy object that owns the memory object.
Definition hel.h:1013
HelHandle handle
Handle to the memory object.
Definition hel.h:1015
SQ data for kHelSubmitInvalidateMemory.
Definition hel.h:1033
uint32_t flags
Flags (kHelInvalidate*).
Definition hel.h:1041
HelHandle handle
Handle to the memory object.
Definition hel.h:1035
size_t size
Size of the range.
Definition hel.h:1039
uintptr_t offset
Offset within the memory object.
Definition hel.h:1037
SQ data for kHelSubmitLockMemoryView.
Definition hel.h:987
size_t size
Size to lock.
Definition hel.h:993
uintptr_t offset
Offset within the memory object.
Definition hel.h:991
HelHandle handle
Handle to the memory object.
Definition hel.h:989
SQ data for kHelSubmitManageMemory.
Definition hel.h:981
HelHandle handle
Handle to the memory object.
Definition hel.h:983
SQ data for kHelSubmitMapMemory.
Definition hel.h:1055
uint32_t flags
Flags (kHelMap*).
Definition hel.h:1067
HelHandle spaceHandle
Handle to the space that the memory is mapped into.
Definition hel.h:1059
HelHandle memoryHandle
Handle to the memory object.
Definition hel.h:1057
uintptr_t offset
Offset within the memory object.
Definition hel.h:1063
void * pointer
Address to map at (depending on kHelMap*).
Definition hel.h:1061
size_t size
Size of the mapping.
Definition hel.h:1065
SQ data for kHelSubmitObserve.
Definition hel.h:997
HelHandle handle
Handle to the thread.
Definition hel.h:999
SQ data for kHelSubmitPopulateSpace.
Definition hel.h:1045
HelHandle handle
Handle to the memory space.
Definition hel.h:1047
uintptr_t address
Address within the memory space.
Definition hel.h:1049
size_t length
Length of the range.
Definition hel.h:1051
SQ data for kHelSubmitProtectMemory.
Definition hel.h:935
size_t size
Size of the mapping.
Definition hel.h:941
void * pointer
Pointer to the mapping.
Definition hel.h:939
uint32_t flags
Protection flags.
Definition hel.h:943
HelHandle spaceHandle
Handle to the address space.
Definition hel.h:937
SQ data for kHelSubmitReadMemory.
Definition hel.h:957
uintptr_t address
Address within the memory object.
Definition hel.h:961
HelHandle handle
Handle to the memory object.
Definition hel.h:959
size_t length
Length in bytes.
Definition hel.h:963
void * buffer
Buffer to read into.
Definition hel.h:965
SQ data for kHelSubmitResizeMemory.
Definition hel.h:1003
HelHandle handle
Handle to the memory object.
Definition hel.h:1005
size_t newSize
New size in bytes.
Definition hel.h:1007
SQ data for kHelSubmitSynchronizeSpace.
Definition hel.h:947
void * pointer
Pointer to the mapping.
Definition hel.h:951
size_t size
Size of the mapping.
Definition hel.h:953
HelHandle spaceHandle
Handle to the address space.
Definition hel.h:949
SQ data for kHelSubmitUnbindDmaDevice.
Definition hel.h:1096
HelHandle iommuHandle
Handle to the IOMMU (see helAccessIommu).
Definition hel.h:1098
struct HelDmaDeviceId id
Requester ID of the device.
Definition hel.h:1100
SQ data for kHelSubmitUnmapMemory.
Definition hel.h:1071
size_t size
Size of the mapping.
Definition hel.h:1077
void * pointer
Pointer to the mapping.
Definition hel.h:1075
HelHandle spaceHandle
Handle to the space that the mapping is removed from.
Definition hel.h:1073
SQ data for kHelSubmitWriteMemory.
Definition hel.h:969
HelHandle handle
Handle to the memory object.
Definition hel.h:971
size_t length
Length in bytes.
Definition hel.h:975
const void * buffer
Buffer to write from.
Definition hel.h:977
uintptr_t address
Address within the memory object.
Definition hel.h:973
SQ data for kHelSubmitWritebackFence.
Definition hel.h:1020
HelHandle handle
Handle to the memory object.
Definition hel.h:1022
size_t size
Size of the range.
Definition hel.h:1026
uintptr_t offset
Offset within the memory object.
Definition hel.h:1024