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
68 kHelCallAccessIommu = 13,
69
70 kHelCallCreateThread = 67,
71 kHelCallQueryThreadStats = 95,
72 kHelCallSetPriority = 85,
73 kHelCallYield = 34,
74 kHelCallSubmitObserve = 74,
75 kHelCallKillThread = 87,
76 kHelCallInterruptThread = 86,
77 kHelCallResume = 61,
78 kHelCallLoadRegisters = 75,
79 kHelCallStoreRegisters = 76,
80 kHelCallQueryRegisterInfo = 102,
81 kHelCallWriteFsBase = 41,
82 kHelCallGetClock = 42,
83 kHelCallSubmitAwaitClock = 80,
84 kHelCallCreateVirtualizedCpu = 37,
85 kHelCallRunVirtualizedCpu = 38,
86 kHelCallAssertVirtualizedIrq = 107,
87 kHelCallGetRandomBytes = 101,
88 kHelCallWriteGsBase = 54,
89 kHelCallReadFsBase = 55,
90 kHelCallReadGsBase = 56,
91 kHelCallGetCurrentCpu = 57,
92
93 kHelCallCreateStream = 68,
94 kHelCallSubmitAsync = 79,
95 kHelCallShutdownLane = 91,
96
97 kHelCallFutexWait = 73,
98 kHelCallFutexWake = 71,
99
100 kHelCallCreateOneshotEvent = 96,
101 kHelCallCreateBitsetEvent = 97,
102 kHelCallCreateSequencedEvent = 15,
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 attach or detach swap regions.
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 kHelPageFaultOutOfMemory = 3
582};
583
588};
589
590#if defined(__x86_64__)
591enum HelRegisterIndex {
592 kHelRegRax = 0,
593 kHelRegRbx = 1,
594 kHelRegRcx = 2,
595 kHelRegRdx = 3,
596 kHelRegRdi = 4,
597 kHelRegRsi = 5,
598 kHelRegR8 = 6,
599 kHelRegR9 = 7,
600 kHelRegR10 = 8,
601 kHelRegR11 = 9,
602 kHelRegR12 = 10,
603 kHelRegR13 = 11,
604 kHelRegR14 = 12,
605 kHelRegR15 = 13,
606 kHelRegRbp = 14,
607
608 kHelNumGprs = 15,
609
610 kHelRegIp = 0,
611 kHelRegSp = 1
612};
613
614enum HelSyscallArgs {
615 kHelRegNumber = kHelRegRdi,
616 kHelRegError = kHelRegRdi,
617
618 kHelRegArg0 = kHelRegRsi,
619 kHelRegArg1 = kHelRegRdx,
620 kHelRegArg2 = kHelRegRax,
621 kHelRegArg3 = kHelRegR8,
622 kHelRegArg4 = kHelRegR9,
623 kHelRegArg5 = kHelRegR10,
624 kHelRegArg6 = kHelRegR12,
625 kHelRegArg7 = kHelRegR13,
626 kHelRegArg8 = kHelRegR14,
627
628 kHelRegOut0 = kHelRegRsi,
629 kHelRegOut1 = kHelRegRdx,
630 kHelRegOut2 = kHelRegRax
631};
632
633#elif defined(__aarch64__)
634enum HelRegisterIndex {
635 kHelRegX0 = 0,
636 kHelRegX1,
637 kHelRegX2,
638 kHelRegX3,
639 kHelRegX4,
640 kHelRegX5,
641 kHelRegX6,
642 kHelRegX7,
643 kHelRegX8,
644 kHelRegX9,
645 kHelRegX10,
646 kHelRegX11,
647 kHelRegX12,
648 kHelRegX13,
649 kHelRegX14,
650 kHelRegX15,
651 kHelRegX16,
652 kHelRegX17,
653 kHelRegX18,
654 kHelRegX19,
655 kHelRegX20,
656 kHelRegX21,
657 kHelRegX22,
658 kHelRegX23,
659 kHelRegX24,
660 kHelRegX25,
661 kHelRegX26,
662 kHelRegX27,
663 kHelRegX28,
664 kHelRegX29,
665 kHelRegX30,
666
667 kHelNumGprs = 31,
668
669 kHelRegIp = 0,
670 kHelRegSp = 1
671};
672
673enum HelSyscallArgs {
674 kHelRegNumber = kHelRegX0,
675 kHelRegError = kHelRegX0,
676
677 kHelRegArg0 = kHelRegX1,
678 kHelRegArg1 = kHelRegX2,
679 kHelRegArg2 = kHelRegX3,
680 kHelRegArg3 = kHelRegX4,
681 kHelRegArg4 = kHelRegX5,
682 kHelRegArg5 = kHelRegX6,
683 kHelRegArg6 = kHelRegX7,
684 kHelRegArg7 = kHelRegX8,
685 kHelRegArg8 = kHelRegX9,
686
687 kHelRegOut0 = kHelRegX1,
688 kHelRegOut1 = kHelRegX2,
689 kHelRegOut2 = kHelRegX3
690};
691
692#elif defined(__riscv) && __riscv_xlen == 64
693enum HelRegisterIndex {
694 kHelRegRa = 0,
695 kHelRegGp,
696 kHelRegTp,
697 kHelRegT0,
698 kHelRegT1,
699 kHelRegT2,
700 kHelRegS0,
701 kHelRegS1,
702 kHelRegA0,
703 kHelRegA1,
704 kHelRegA2,
705 kHelRegA3,
706 kHelRegA4,
707 kHelRegA5,
708 kHelRegA6,
709 kHelRegA7,
710 kHelRegS2,
711 kHelRegS3,
712 kHelRegS4,
713 kHelRegS5,
714 kHelRegS6,
715 kHelRegS7,
716 kHelRegS8,
717 kHelRegS9,
718 kHelRegS10,
719 kHelRegS11,
720 kHelRegT3,
721 kHelRegT4,
722 kHelRegT5,
723 kHelRegT6,
724 kHelNumGprs,
725 kHelRegIp = 0,
726 kHelRegSp = 1
727};
728enum HelSyscallArgs {
729 kHelRegNumber = kHelRegA0,
730 kHelRegError = kHelRegA0,
731 kHelRegArg0 = kHelRegA1,
732 kHelRegArg1 = kHelRegA2,
733 kHelRegArg2 = kHelRegA3,
734 kHelRegArg3 = kHelRegA4,
735 kHelRegArg4 = kHelRegA5,
736 kHelRegArg5 = kHelRegA6,
737 kHelRegArg6 = kHelRegA7,
738 kHelRegArg7 = kHelRegS2,
739 kHelRegArg8 = kHelRegS3,
740
741 kHelRegOut0 = kHelRegA1,
742 kHelRegOut1 = kHelRegA2,
743 kHelRegOut2 = kHelRegA3
744};
745
746#endif
747
748struct HelQueueParameters {
749 uint32_t flags;
750 unsigned int numChunks;
751 size_t chunkSize;
752 unsigned int numSqChunks;
753};
754
755struct HelHierarchyParameters {
756 // Optional tag to identify the hierarchy in kernel messages.
757 // Null-terminated unless it fills the entire array.
758 char tag[128];
759};
760
762static const int kHelUserNotifyCqProgress = (1 << 0);
764static const int kHelUserNotifySupplySqChunks = (1 << 1);
766static const int kHelUserNotifyError = (1 << 14);
768static const int kHelUserNotifyAlert = (1 << 15);
769
771static const int kHelKernelNotifySqProgress = (1 << 0);
773static const int kHelKernelNotifySupplyCqChunks = (1 << 1);
774
776static const uint32_t kHelDriveWait = (1 << 0);
777
778enum {
779 kHelAccessIommuIntelVtd = 1,
780 kHelAccessIommuAmdVi = 2,
781};
782
783enum {
784 kHelDmaRegionRead = 1,
785 kHelDmaRegionWrite = 2,
786};
787
790 uint64_t base;
791 uint64_t size;
792 uint32_t flags;
793};
794
797 uint32_t segment;
798 uint8_t bus;
799 uint8_t slot;
800 uint8_t function;
801};
802
804static const uint32_t kHelSubmitCancel = 256;
806static const uint32_t kHelSubmitAsyncNop = 1;
808static const uint32_t kHelSubmitExchangeMsgs = 2;
810static const uint32_t kHelSubmitAwaitClock = 3;
812static const uint32_t kHelSubmitAwaitEvent = 4;
814static const uint32_t kHelSubmitProtectMemory = 5;
816static const uint32_t kHelSubmitSynchronizeSpace = 6;
818static const uint32_t kHelSubmitReadMemory = 7;
820static const uint32_t kHelSubmitWriteMemory = 8;
822static const uint32_t kHelSubmitManageMemory = 9;
824static const uint32_t kHelSubmitLockMemoryView = 10;
826static const uint32_t kHelSubmitObserve = 11;
828static const uint32_t kHelSubmitResizeMemory = 12;
830static const uint32_t kHelSubmitForkMemory = 13;
832static const uint32_t kHelSubmitWritebackFence = 14;
834static const uint32_t kHelSubmitInvalidateMemory = 15;
836static const uint32_t kHelSubmitPopulateSpace = 16;
838static const uint32_t kHelSubmitMapMemory = 17;
840static const uint32_t kHelSubmitUnmapMemory = 18;
842static const uint32_t kHelSubmitBindDmaDevice = 19;
844static const uint32_t kHelSubmitUnbindDmaDevice = 20;
846static const uint32_t kHelSubmitActivateIommu = 21;
848static const uint32_t kHelSubmitSetSwapRegion = 23;
849
851struct HelQueue {
856
861
865
869};
870
872static const int kHelNextPresent = (1 << 24);
873
875static const int kHelProgressMask = 0xFFFFFF;
877static const int kHelProgressDone = (1 << 25);
879static const int kHelProgressFull = (1 << 26);
880
881struct HelChunk {
884 int next;
885
887 int progressFutex;
888
890 char buffer[];
891};
892
896 unsigned int length;
898 unsigned int opcode;
900 void *context;
901};
902
905 uint64_t cancellationTag;
906};
907
912 HelHandle lane;
914 size_t count;
916 uint32_t flags;
917};
918
922 uint64_t counter;
925};
926
930 HelHandle handle;
932 uint64_t sequence;
935};
936
940 HelHandle spaceHandle;
942 void *pointer;
944 size_t size;
946 uint32_t flags;
947};
948
952 HelHandle spaceHandle;
954 void *pointer;
956 size_t size;
957};
958
962 HelHandle handle;
964 uintptr_t address;
966 size_t length;
968 void *buffer;
969};
970
974 HelHandle handle;
976 uintptr_t address;
978 size_t length;
980 const void *buffer;
981};
982
986 HelHandle handle;
987};
988
992 HelHandle handle;
994 uintptr_t offset;
996 size_t size;
997};
998
1002 HelHandle handle;
1003};
1004
1008 HelHandle handle;
1010 size_t newSize;
1011};
1012
1018 HelHandle handle;
1019};
1020
1025 HelHandle handle;
1027 uintptr_t offset;
1029 size_t size;
1030};
1031
1033static const uint32_t kHelInvalidateNoWriteback = 1;
1034
1038 HelHandle handle;
1040 uintptr_t offset;
1042 size_t size;
1044 uint32_t flags;
1045};
1046
1050 HelHandle handle;
1052 uintptr_t address;
1054 size_t length;
1055};
1056
1060 HelHandle memoryHandle;
1062 HelHandle spaceHandle;
1064 void *pointer;
1066 uintptr_t offset;
1068 size_t size;
1070 uint32_t flags;
1071};
1072
1076 HelHandle spaceHandle;
1078 void *pointer;
1080 size_t size;
1081};
1082
1095
1105
1112 HelHandle iommuHandle;
1113};
1114
1118static const int kHelSwapRegionShift = 44;
1120static const uint32_t kHelNumSwapRegions = 1 << 18;
1121
1129 HelHandle swapHandle;
1133 size_t numPages;
1135 uint32_t region;
1136};
1137
1138struct HelSimpleResult {
1139 HelError error;
1140 int reserved;
1141};
1142
1143struct HelCredentialsResult {
1144 HelError error;
1145 int reserved;
1146 char credentials[16];
1147};
1148
1149struct HelManageResult {
1150 HelError error;
1151 int type;
1152 uintptr_t offset;
1153 size_t length;
1154};
1155
1156struct HelObserveResult {
1157 HelError error;
1158 unsigned int observation;
1159};
1160
1161struct HelInlineResult {
1162 HelError error;
1163 int reserved;
1164 size_t length;
1165 char data[];
1166};
1167
1168struct HelInlineResultNoFlex {
1169 HelError error;
1170 int reserved;
1171 size_t length;
1172};
1173
1174struct HelLengthResult {
1175 HelError error;
1176 int reserved;
1177 size_t length;
1178};
1179
1180struct HelHandleResult {
1181 HelError error;
1182 int reserved;
1183 HelHandle handle;
1184};
1185
1186struct HelPointerResult {
1187 HelError error;
1188 int reserved;
1189 void *pointer;
1190};
1191
1192struct HelEventResult {
1193 HelError error;
1194 uint32_t bitset;
1195 uint64_t sequence;
1196};
1197
1198enum HelAckFlags {
1199 kHelAckAcknowledge = 2,
1200 kHelAckNack = 3,
1201 kHelAckKick = 1,
1202 kHelAckClear = 0x100,
1203};
1204
1205union HelKernletData {
1206 HelHandle handle;
1207};
1208
1209struct HelThreadStats {
1210 uint64_t userTime;
1211};
1212
1213enum {
1214 kHelVmexitHlt = 0,
1215 kHelVmexitTranslationFault = 1,
1216 kHelVmexitHyperCall = 2,
1217 kHelVmexitInstructionTrap = 3,
1218 kHelVmexitError = -1,
1219 kHelVmexitUnknownPlatformSpecificExitCode = -2,
1220};
1221
1222enum {
1223 kHelVmFaultRead = 1 << 0,
1224 kHelVmFaultWrite = 1 << 1,
1225 kHelVmFaultExecute = 1 << 2,
1226};
1227
1228#if defined(__riscv) && __riscv_xlen == 64
1229
1230struct HelVmexitReason {
1231 uint32_t exitReason;
1232 // If bit 63 is set then stores a compressed unexpanded instruction,
1233 // otherwise stores a normal 32-bit instruction (possibly originally compressed in which case bits 1:0 aren't 0b11).
1234 uint64_t instruction;
1235 size_t address;
1236 size_t flags;
1237};
1238
1239#else
1240
1241struct HelVmexitReason {
1242 uint32_t exitReason;
1243 uint32_t code;
1244 size_t address;
1245 size_t flags;
1246};
1247
1248#endif
1249
1250// see RFC 5424
1251enum HelLogSeverity {
1252 kHelLogSeverityEmergency,
1253 kHelLogSeverityAlert,
1254 kHelLogSeverityCritical,
1255 kHelLogSeverityError,
1256 kHelLogSeverityWarning,
1257 kHelLogSeverityNotice,
1258 kHelLogSeverityInfo,
1259 kHelLogSeverityDebug,
1260};
1261
1262enum {
1263 kHelAccessIrqByGsi = 1,
1264 kHelAccessIrqByPhandle = 2,
1265 kHelAccessIrqAllocateMsi = 3,
1266};
1267
1269enum {
1270 kHelIrqNameSize = 32,
1271};
1272
1273enum {
1274 kHelIrqTriggerNull = 0,
1275 kHelIrqTriggerEdge = 1,
1276 kHelIrqTriggerLevel = 2
1277};
1278
1279enum {
1280 kHelIrqPolarityNull = 0,
1281 kHelIrqPolarityHigh = 1,
1282 kHelIrqPolarityLow = 2
1283};
1284
1287 uint64_t address;
1288 uint32_t data;
1289};
1290
1293
1301HEL_C_LINKAGE HelError helLog(const enum HelLogSeverity severity, const char *string, size_t length);
1302
1308HEL_C_LINKAGE void helPanic(const char *string, size_t length)
1309 __attribute__ (( noreturn ));
1310
1314
1316HEL_C_LINKAGE HelError helNop();
1317
1321HEL_C_LINKAGE HelError helSubmitAsyncNop(HelHandle queueHandle, uintptr_t context);
1322
1330HEL_C_LINKAGE HelError helExtendHierarchy(HelHandle hierarchyHandle,
1331 const struct HelHierarchyParameters *params, HelHandle *handle);
1332
1336
1340HEL_C_LINKAGE HelError helCreateUniverse(HelHandle *handle);
1341
1349HEL_C_LINKAGE HelError
1350helTransferDescriptor(HelHandle handle, HelHandle universeHandle,
1351 uint32_t flags, uint32_t exposedRights, uint32_t requiredRights, HelHandle *outHandle);
1352
1353HEL_C_LINKAGE HelError helDescriptorInfo(HelHandle handle, struct HelDescriptorInfo *info);
1354
1360HEL_C_LINKAGE HelError helGetCredentials(HelHandle handle, uint32_t flags,
1361 char *credentials);
1362
1368HEL_C_LINKAGE HelError helCloseDescriptor(HelHandle universeHandle, HelHandle handle);
1369
1375HEL_C_LINKAGE HelError helObtainHandle(int kind, HelHandle *handle);
1376
1380
1386HEL_C_LINKAGE HelError helCreateQueue(const struct HelQueueParameters *params,
1387 HelHandle *handle);
1388
1400HEL_C_LINKAGE HelError helDriveQueue(HelHandle queueHandle, uint32_t flags, uint32_t notifyMask);
1401
1408HEL_C_LINKAGE HelError helAlertQueue(HelHandle queueHandle);
1409
1413
1426HEL_C_LINKAGE HelError helAllocateMemory(HelHandle hierarchy, size_t size, uint32_t flags,
1427 const struct HelAllocRestrictions *restrictions, HelHandle *handle);
1428
1435HEL_C_LINKAGE HelError helResizeMemory(HelHandle handle, size_t newSize);
1436
1451HEL_C_LINKAGE HelError helCreateManagedMemory(HelHandle hierarchy, size_t size, uint32_t flags,
1452 HelHandle *backingHandle, HelHandle *frontalHandle);
1453
1475HEL_C_LINKAGE HelError helCreateSwapSpace(HelHandle hierarchy, uint32_t flags,
1476 HelHandle *backingHandle, HelHandle *swapHandle);
1477
1493HEL_C_LINKAGE HelError helAllocateSwappableMemory(HelHandle hierarchy, HelHandle swapSpace,
1494 size_t size, uint32_t flags, HelHandle *handle);
1495
1514HEL_C_LINKAGE HelError helCopyOnWrite(HelHandle hierarchy, HelHandle swapSpace, HelHandle memory,
1515 uintptr_t offset, size_t size, HelHandle *handle);
1516
1517HEL_C_LINKAGE HelError helAccessPhysical(
1518 HelHandle accessToken, uintptr_t physical, size_t size, uint32_t cachingMode, HelHandle *handle
1519);
1520
1526HEL_C_LINKAGE HelError helCreateIndirectMemory(size_t numSlots, HelHandle *handle);
1527
1544HEL_C_LINKAGE HelError helAlterMemoryIndirection(HelHandle indirectHandle, size_t slotIndex,
1545 HelHandle memoryHandle, uintptr_t offset, size_t size);
1546
1547HEL_C_LINKAGE HelError helCreateSliceView(HelHandle bundle, uintptr_t offset, size_t size,
1548 uint32_t flags, HelHandle *handle);
1549
1557HEL_C_LINKAGE HelError helForkMemory(HelHandle handle, HelHandle *forkedHandle);
1558
1562HEL_C_LINKAGE HelError helCreateSpace(HelHandle *handle);
1563
1573HEL_C_LINKAGE HelError helAccessIommu(HelHandle accessHandle, uint32_t mode, uint64_t base,
1574 HelHandle *handle);
1575
1595HEL_C_LINKAGE HelError helCreateDmaSpace(HelHandle iommuHandle,
1596 const struct HelDmaReservedRegion *regions, size_t numRegions,
1597 uint32_t flags, HelHandle *handle);
1598
1616HEL_C_LINKAGE HelError helMapMemory(HelHandle memoryHandle, HelHandle spaceHandle,
1617 void *pointer, uintptr_t offset, size_t size, uint32_t flags, void **actualPointer);
1618
1619
1630HEL_C_LINKAGE HelError helUnmapMemory(HelHandle spaceHandle, void *pointer, size_t size);
1631
1632HEL_C_LINKAGE HelError helPointerPhysical(HelHandle spaceHandle, const void *pointer, uintptr_t *physical);
1633
1634HEL_C_LINKAGE HelError helMemoryInfo(HelHandle handle,
1635 size_t *size);
1636
1637HEL_C_LINKAGE HelError helUpdateMemory(HelHandle handle, int type, uintptr_t offset, size_t length);
1638
1649HEL_C_LINKAGE HelError helLoadahead(HelHandle handle, uintptr_t offset, size_t length);
1650
1651HEL_C_LINKAGE HelError helCreateVirtualizedSpace(HelHandle *handle);
1652
1656
1670HEL_C_LINKAGE HelError helCreateThread(HelHandle universe, HelHandle spaceHandle,
1671 HelAbi abi, void *ip, void *sp, uint32_t flags, HelHandle *handle);
1672
1678HEL_C_LINKAGE HelError helQueryThreadStats(HelHandle handle, struct HelThreadStats *stats);
1679
1688HEL_C_LINKAGE HelError helSetPriority(HelHandle handle, int priority);
1689
1691HEL_C_LINKAGE HelError helYield();
1692
1696HEL_C_LINKAGE HelError helKillThread(HelHandle handle);
1697
1704HEL_C_LINKAGE HelError helInterruptThread(HelHandle handle);
1705
1712HEL_C_LINKAGE HelError helResume(HelHandle handle);
1713
1721HEL_C_LINKAGE HelError helLoadRegisters(HelHandle handle, int set, void *image);
1722
1730HEL_C_LINKAGE HelError helStoreRegisters(HelHandle handle, int set, const void *image);
1731
1734// Register set to query information for.
1737HEL_C_LINKAGE HelError helQueryRegisterInfo(int set, struct HelRegisterInfo *info);
1738
1739HEL_C_LINKAGE HelError helWriteFsBase(void *pointer);
1740
1741HEL_C_LINKAGE HelError helReadFsBase(void **pointer);
1742
1743HEL_C_LINKAGE HelError helWriteGsBase(void *pointer);
1744
1745HEL_C_LINKAGE HelError helReadGsBase(void **pointer);
1746
1748HEL_C_LINKAGE HelError helGetCurrentCpu(int *cpu);
1749
1754HEL_C_LINKAGE HelError helGetClock(uint64_t *counter);
1755
1756HEL_C_LINKAGE HelError helCreateVirtualizedCpu(HelHandle handle, HelHandle *out_handle);
1757
1758HEL_C_LINKAGE HelError helRunVirtualizedCpu(HelHandle handle, struct HelVmexitReason *reason);
1759
1760HEL_C_LINKAGE HelError helAssertVirtualizedIrq(HelHandle handle, uint64_t irq, uint8_t level);
1761
1762HEL_C_LINKAGE HelError helGetRandomBytes(void *buffer, size_t wantedSize, size_t *actualSize);
1763
1773HEL_C_LINKAGE HelError helGetAffinity(HelHandle handle, uint8_t *mask, size_t size, size_t *actualSize);
1774
1782HEL_C_LINKAGE HelError helSetAffinity(HelHandle handle, uint8_t *mask, size_t size);
1783
1787
1795HEL_C_LINKAGE HelError helCreateStream(HelHandle *lane1, HelHandle *lane2, uint32_t attach_credentials);
1796
1797HEL_C_LINKAGE HelError helShutdownLane(HelHandle handle);
1798
1806HEL_C_LINKAGE HelError helCreateToken(HelHandle *handle);
1807
1811
1820HEL_C_LINKAGE HelError helFutexWait(int *pointer, int expected, int64_t deadline);
1821
1827HEL_C_LINKAGE HelError helFutexWake(int *pointer, unsigned int count);
1828
1832
1836HEL_C_LINKAGE HelError helCreateOneshotEvent(HelHandle *handle);
1837
1841HEL_C_LINKAGE HelError helCreateBitsetEvent(HelHandle *handle);
1842
1853HEL_C_LINKAGE HelError helCreateSequencedEvent(HelHandle *waitHandle, HelHandle *raiseHandle);
1854
1859HEL_C_LINKAGE HelError helRaiseEvent(HelHandle handle);
1860
1881HEL_C_LINKAGE HelError helAccessIrq(
1882 HelHandle accessHandle, uint32_t mode, uint64_t controller, uint64_t index,
1883 const char *name, HelHandle *handle
1884);
1885
1891HEL_C_LINKAGE HelError helHandleIrq(HelHandle pinHandle, HelHandle *handle);
1892
1904HEL_C_LINKAGE HelError helConfigureIrq(HelHandle pinHandle, uint32_t trigger, uint32_t polarity);
1905
1912HEL_C_LINKAGE HelError helQueryMsiInfo(HelHandle pinHandle, struct HelMsiInfo *info);
1913
1914HEL_C_LINKAGE HelError helAcknowledgeIrq(HelHandle handle, uint32_t flags, uint64_t sequence);
1915
1916HEL_C_LINKAGE HelError helAutomateIrq(HelHandle handle, uint32_t flags, HelHandle kernlet);
1917
1921
1922HEL_C_LINKAGE HelError helAccessIo(
1923 HelHandle accessToken, const uintptr_t *portArray, size_t numPorts, HelHandle *handle
1924);
1925
1929HEL_C_LINKAGE HelError helEnableIo(HelHandle handle);
1930
1934
1944HEL_C_LINKAGE HelError helBindKernlet(HelHandle handle,
1945 const union HelKernletData *data, size_t numData, HelHandle *boundHandle);
1946
1948
1949extern inline __attribute__ (( always_inline )) const char *_helErrorString(HelError code) {
1950 switch(code) {
1951 case kHelErrNone:
1952 return "Success";
1953 case kHelErrIllegalSyscall:
1954 return "Illegal syscall";
1955 case kHelErrIllegalArgs:
1956 return "Illegal arguments";
1957 case kHelErrIllegalState:
1958 return "Illegal state";
1959 case kHelErrUnsupportedOperation:
1960 return "Unsupported operation";
1961 case kHelErrNoDescriptor:
1962 return "No such descriptor";
1963 case kHelErrBadDescriptor:
1964 return "Illegal descriptor for this operation";
1965 case kHelErrThreadTerminated:
1966 return "Thread terminated already";
1967 case kHelErrLaneShutdown:
1968 return "Lane shutdown";
1969 case kHelErrEndOfLane:
1970 return "End of lane";
1971 case kHelErrDismissed:
1972 return "IPC item dismissed by remote";
1973 case kHelErrBufferTooSmall:
1974 return "Buffer too small";
1975 case kHelErrQueueTooSmall:
1976 return "Buffer too small";
1977 case kHelErrFault:
1978 return "Segfault";
1979 case kHelErrNoHardwareSupport:
1980 return "Missing hardware support for this feature";
1981 case kHelErrNoMemory:
1982 return "Out of memory";
1983 case kHelErrTransmissionMismatch:
1984 return "Transmission mismatch";
1985 case kHelErrCancelled:
1986 return "Cancelled";
1987 case kHelErrOutOfBounds:
1988 return "Out of bounds";
1989 case kHelErrAlreadyExists:
1990 return "Already exists";
1991 case kHelErrBadRights:
1992 return "Missing rights for this operation";
1993 default:
1994 return 0;
1995 }
1996}
1997
1998extern inline __attribute__ (( always_inline )) void _helCheckFailed(HelError err_code,
1999 const char *string, int fatal) {
2000 helLog(kHelLogSeverityError, string, strlen(string));
2001
2002 const char *err_string = _helErrorString(err_code);
2003 if(err_string == 0)
2004 err_string = "(Unexpected error code)";
2005 helLog(kHelLogSeverityError, err_string, strlen(err_string));
2006 helLog(kHelLogSeverityError, "\n", 1);
2007
2008 if(fatal)
2009 helPanic(0, 0);
2010}
2011
2012#define HEL_STRINGIFY_AUX(x) #x
2013#define HEL_STRINGIFY(x) HEL_STRINGIFY_AUX(x)
2014
2015#define HEL_CHECK(expr) do { HelError __error = expr; if(__error != kHelErrNone) \
2016 _helCheckFailed(__error, "HEL_CHECK failed: " #expr "\n" \
2017 " In file " __FILE__ " on line " HEL_STRINGIFY(__LINE__) "\n", 1); } while(0)
2018#define HEL_SOFT_CHECK(expr) do { HelError __error = expr; if(__error != kHelErrNone) \
2019 _helCheckFailed(__error, "HEL_SOFT_CHECK failed: " #expr "\n" \
2020 " In file " __FILE__ " on line " HEL_STRINGIFY(__LINE__) "\n", 0); } while(0)
2021
2022#endif // HEL_H
2023
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:768
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 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 kHelSwapRegionShift
Byte offset (((uint64_t)r << kHelSwapRegionShift) + o) in the backing memory of a swap space addresse...
Definition hel.h:1118
static const uint32_t kHelNumSwapRegions
Number of swap regions per swap space.
Definition hel.h:1120
static const int kHelKernelNotifySqProgress
Set in kernelNotify after userspace has added SQ elements.
Definition hel.h:771
static const uint32_t kHelSubmitInvalidateMemory
SQ opcode: invalidate memory.
Definition hel.h:834
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:1033
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:820
static const uint32_t kHelSubmitUnmapMemory
SQ opcode: unmap memory.
Definition hel.h:840
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:806
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:875
static const uint32_t kHelSubmitManageMemory
SQ opcode: manage memory.
Definition hel.h:822
static const uint32_t kHelSubmitForkMemory
SQ opcode: fork memory.
Definition hel.h:830
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:879
static const uint32_t kHelSubmitUnbindDmaDevice
SQ opcode: block the DMA requests of a device.
Definition hel.h:844
static const uint32_t kHelSubmitSynchronizeSpace
SQ opcode: synchronize space.
Definition hel.h:816
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:776
static const uint32_t kHelSubmitObserve
SQ opcode: observe thread.
Definition hel.h:826
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:842
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:808
static const uint32_t kHelSubmitReadMemory
SQ opcode: read memory.
Definition hel.h:818
static const int kHelNextPresent
Marks the next field as present.
Definition hel.h:872
static const int kHelKernelNotifySupplyCqChunks
Set in kernelNotify after userspace has supplied new chunks.
Definition hel.h:773
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:812
static const uint32_t kHelSubmitAwaitClock
SQ opcode: wait for time to pass.
Definition hel.h:810
static const uint32_t kHelSubmitPopulateSpace
SQ opcode: populate a space.
Definition hel.h:836
@ 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:846
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:814
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:838
static const int kHelUserNotifySupplySqChunks
Set in userNotify after kernel has supplied new SQ chunks.
Definition hel.h:764
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:762
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:832
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
HEL_C_LINKAGE HelError helCreateSequencedEvent(HelHandle *waitHandle, HelHandle *raiseHandle)
Create an event that counts how often it was raised.
static const uint32_t kHelSubmitResizeMemory
SQ opcode: resize memory.
Definition hel.h:828
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:824
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:877
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:766
HEL_C_LINKAGE HelError helExtendHierarchy(HelHandle hierarchyHandle, const struct HelHierarchyParameters *params, HelHandle *handle)
Creates a child hierarchy capability.
static const uint32_t kHelSubmitSetSwapRegion
SQ opcode: set the capacity of a swap region.
Definition hel.h:848
static const uint32_t kHelSubmitCancel
SQ opcode: cancel an asynchronous operation.
Definition hel.h:804
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:796
Range of physical memory that a DMA space identity-maps (see helCreateDmaSpace).
Definition hel.h:789
A single element of a HelQueue.
Definition hel.h:894
unsigned int length
Length of the element in bytes.
Definition hel.h:896
void * context
User-defined value.
Definition hel.h:900
unsigned int opcode
Operation code (for SQ elements).
Definition hel.h:898
Message address / data pair that raises an MSI (see helQueryMsiInfo).
Definition hel.h:1286
In-memory kernel/user-space queue.
Definition hel.h:851
int kernelNotify
Futex that is used to wake the kernel.
Definition hel.h:860
int userNotify
Futex that is used to wake userspace.
Definition hel.h:855
int cqFirst
Index of the first chunk of the completion queue.
Definition hel.h:864
int sqFirst
Index of the first chunk of the submission queue.
Definition hel.h:868
Register-related information returned by helQueryRegisterInfo.
Definition hel.h:585
int setSize
Size of the selected register set.
Definition hel.h:587
SQ data for kHelSubmitActivateIommu.
Definition hel.h:1110
HelHandle iommuHandle
Handle to the IOMMU (see helAccessIommu).
Definition hel.h:1112
SQ data for kHelSubmitAwaitClock.
Definition hel.h:920
uint64_t cancellationTag
Tag to cancel this operation.
Definition hel.h:924
uint64_t counter
Deadline in nanoseconds since boot.
Definition hel.h:922
SQ data for kHelSubmitAwaitEvent.
Definition hel.h:928
HelHandle handle
Handle to the event descriptor.
Definition hel.h:930
uint64_t cancellationTag
Tag to cancel this operation.
Definition hel.h:934
uint64_t sequence
Previous sequence number.
Definition hel.h:932
SQ data for kHelSubmitBindDmaDevice.
Definition hel.h:1086
struct HelDmaDeviceId id
Requester ID of the device.
Definition hel.h:1093
HelHandle iommuHandle
Handle to the IOMMU (see helAccessIommu).
Definition hel.h:1088
HelHandle dmaSpaceHandle
Handle to a DMA space of that IOMMU (see helCreateDmaSpace).
Definition hel.h:1091
SQ data for kHelSubmitCancel.
Definition hel.h:904
SQ data for kHelSubmitExchangeMsgs.
Definition hel.h:910
uint32_t flags
Flags.
Definition hel.h:916
size_t count
Number of actions.
Definition hel.h:914
HelHandle lane
Handle to the lane.
Definition hel.h:912
SQ data for kHelSubmitForkMemory.
Definition hel.h:1014
HelHandle hierarchyHandle
Handle to the hierarchy object that owns the memory object.
Definition hel.h:1016
HelHandle handle
Handle to the memory object.
Definition hel.h:1018
SQ data for kHelSubmitInvalidateMemory.
Definition hel.h:1036
uint32_t flags
Flags (kHelInvalidate*).
Definition hel.h:1044
HelHandle handle
Handle to the memory object.
Definition hel.h:1038
size_t size
Size of the range.
Definition hel.h:1042
uintptr_t offset
Offset within the memory object.
Definition hel.h:1040
SQ data for kHelSubmitLockMemoryView.
Definition hel.h:990
size_t size
Size to lock.
Definition hel.h:996
uintptr_t offset
Offset within the memory object.
Definition hel.h:994
HelHandle handle
Handle to the memory object.
Definition hel.h:992
SQ data for kHelSubmitManageMemory.
Definition hel.h:984
HelHandle handle
Handle to the memory object.
Definition hel.h:986
SQ data for kHelSubmitMapMemory.
Definition hel.h:1058
uint32_t flags
Flags (kHelMap*).
Definition hel.h:1070
HelHandle spaceHandle
Handle to the space that the memory is mapped into.
Definition hel.h:1062
HelHandle memoryHandle
Handle to the memory object.
Definition hel.h:1060
uintptr_t offset
Offset within the memory object.
Definition hel.h:1066
void * pointer
Address to map at (depending on kHelMap*).
Definition hel.h:1064
size_t size
Size of the mapping.
Definition hel.h:1068
SQ data for kHelSubmitObserve.
Definition hel.h:1000
HelHandle handle
Handle to the thread.
Definition hel.h:1002
SQ data for kHelSubmitPopulateSpace.
Definition hel.h:1048
HelHandle handle
Handle to the memory space.
Definition hel.h:1050
uintptr_t address
Address within the memory space.
Definition hel.h:1052
size_t length
Length of the range.
Definition hel.h:1054
SQ data for kHelSubmitProtectMemory.
Definition hel.h:938
size_t size
Size of the mapping.
Definition hel.h:944
void * pointer
Pointer to the mapping.
Definition hel.h:942
uint32_t flags
Protection flags.
Definition hel.h:946
HelHandle spaceHandle
Handle to the address space.
Definition hel.h:940
SQ data for kHelSubmitReadMemory.
Definition hel.h:960
uintptr_t address
Address within the memory object.
Definition hel.h:964
HelHandle handle
Handle to the memory object.
Definition hel.h:962
size_t length
Length in bytes.
Definition hel.h:966
void * buffer
Buffer to read into.
Definition hel.h:968
SQ data for kHelSubmitResizeMemory.
Definition hel.h:1006
HelHandle handle
Handle to the memory object.
Definition hel.h:1008
size_t newSize
New size in bytes.
Definition hel.h:1010
SQ data for kHelSubmitSetSwapRegion.
Definition hel.h:1126
size_t numPages
New capacity of the region in pages.
Definition hel.h:1133
HelHandle swapHandle
Handle to the swap space (from helCreateSwapSpace).
Definition hel.h:1129
uint32_t region
Index of the region. Must be smaller than kHelNumSwapRegions.
Definition hel.h:1135
SQ data for kHelSubmitSynchronizeSpace.
Definition hel.h:950
void * pointer
Pointer to the mapping.
Definition hel.h:954
size_t size
Size of the mapping.
Definition hel.h:956
HelHandle spaceHandle
Handle to the address space.
Definition hel.h:952
SQ data for kHelSubmitUnbindDmaDevice.
Definition hel.h:1099
HelHandle iommuHandle
Handle to the IOMMU (see helAccessIommu).
Definition hel.h:1101
struct HelDmaDeviceId id
Requester ID of the device.
Definition hel.h:1103
SQ data for kHelSubmitUnmapMemory.
Definition hel.h:1074
size_t size
Size of the mapping.
Definition hel.h:1080
void * pointer
Pointer to the mapping.
Definition hel.h:1078
HelHandle spaceHandle
Handle to the space that the mapping is removed from.
Definition hel.h:1076
SQ data for kHelSubmitWriteMemory.
Definition hel.h:972
HelHandle handle
Handle to the memory object.
Definition hel.h:974
size_t length
Length in bytes.
Definition hel.h:978
const void * buffer
Buffer to write from.
Definition hel.h:980
uintptr_t address
Address within the memory object.
Definition hel.h:976
SQ data for kHelSubmitWritebackFence.
Definition hel.h:1023
HelHandle handle
Handle to the memory object.
Definition hel.h:1025
size_t size
Size of the range.
Definition hel.h:1029
uintptr_t offset
Offset within the memory object.
Definition hel.h:1027