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 = 107,
22
23 kHelCallLog = 1,
24 kHelCallPanic = 10,
25
26 kHelCallNop = 2,
27 kHelCallSubmitAsyncNop = 3,
28
29 kHelCallCreateUniverse = 62,
30 kHelCallTransferDescriptor = 66,
31 kHelCallDescriptorInfo = 32,
32 kHelCallGetCredentials = 84,
33 kHelCallCloseDescriptor = 21,
34
35 kHelCallCreateQueue = 89,
36 kHelCallDriveQueue = 105,
37 kHelCallAlertQueue = 106,
38
39 kHelCallAllocateMemory = 51,
40 kHelCallResizeMemory = 83,
41 kHelCallCreateManagedMemory = 64,
42 kHelCallCopyOnWrite = 39,
43 kHelCallAccessPhysical = 30,
44 kHelCallCreateSliceView = 88,
45 kHelCallForkMemory = 40,
46 kHelCallCreateSpace = 27,
47 kHelCallCreateIndirectMemory = 45,
48 kHelCallAlterMemoryIndirection = 52,
49 kHelCallMapMemory = 44,
50 kHelCallSubmitProtectMemory = 99,
51 kHelCallSubmitSynchronizeSpace = 53,
52 kHelCallUnmapMemory = 36,
53 kHelCallPointerPhysical = 43,
54 kHelCallSubmitReadMemory = 77,
55 kHelCallSubmitWriteMemory = 78,
56 kHelCallMemoryInfo = 26,
57 kHelCallSubmitManageMemory = 46,
58 kHelCallUpdateMemory = 47,
59 kHelCallSubmitLockMemoryView = 48,
60 kHelCallLoadahead = 49,
61 kHelCallCreateVirtualizedSpace = 50,
62
63 kHelCallCreateThread = 67,
64 kHelCallQueryThreadStats = 95,
65 kHelCallSetPriority = 85,
66 kHelCallYield = 34,
67 kHelCallSubmitObserve = 74,
68 kHelCallKillThread = 87,
69 kHelCallInterruptThread = 86,
70 kHelCallResume = 61,
71 kHelCallLoadRegisters = 75,
72 kHelCallStoreRegisters = 76,
73 kHelCallQueryRegisterInfo = 102,
74 kHelCallWriteFsBase = 41,
75 kHelCallGetClock = 42,
76 kHelCallSubmitAwaitClock = 80,
77 kHelCallCreateVirtualizedCpu = 37,
78 kHelCallRunVirtualizedCpu = 38,
79 kHelCallGetRandomBytes = 101,
80 kHelCallWriteGsBase = 54,
81 kHelCallReadFsBase = 55,
82 kHelCallReadGsBase = 56,
83 kHelCallGetCurrentCpu = 57,
84
85 kHelCallCreateStream = 68,
86 kHelCallSubmitAsync = 79,
87 kHelCallShutdownLane = 91,
88
89 kHelCallFutexWait = 73,
90 kHelCallFutexWake = 71,
91
92 kHelCallCreateOneshotEvent = 96,
93 kHelCallCreateBitsetEvent = 97,
94 kHelCallRaiseEvent = 98,
95 kHelCallAccessIrq = 14,
96 kHelCallAcknowledgeIrq = 81,
97 kHelCallSubmitAwaitEvent = 82,
98 kHelCallAutomateIrq = 94,
99
100 kHelCallAccessIo = 11,
101 kHelCallEnableIo = 12,
102 kHelCallEnableFullIo = 35,
103
104 kHelCallBindKernlet = 93,
105
106 kHelCallGetAffinity = 103,
107 kHelCallSetAffinity = 100,
108
109 kHelCallCreateToken = 104,
110
111 kHelCallSuper = 0x80000000
112};
113
114enum {
115 kHelErrNone = 0,
116 kHelErrBufferTooSmall = 1,
117 kHelErrBadDescriptor = 2,
118 kHelErrTimeout = 3,
119 kHelErrNoDescriptor = 4,
120 kHelErrIllegalSyscall = 5,
121 kHelErrIllegalObject = 6,
122 kHelErrIllegalArgs = 7,
123 kHelErrLaneShutdown = 8,
124 kHelErrEndOfLane = 9,
125 kHelErrFault = 10,
126 kHelErrThreadTerminated = 11,
127 kHelErrCancelled = 12,
128 kHelErrTransmissionMismatch = 13,
129 kHelErrQueueTooSmall = 14,
130 kHelErrIllegalState = 15,
131 kHelErrNoHardwareSupport = 16,
132 kHelErrNoMemory = 17,
133 kHelErrUnsupportedOperation = 18,
134 kHelErrOutOfBounds = 19,
135 kHelErrDismissed = 20,
136 kHelErrRemoteFault = 21,
137 kHelErrAlreadyExists = 22,
138 kHelErrBadPermissions = 23,
139 kHelErrOther = 24,
140 kHelErrFutexRace = 25
141};
142
143struct HelX86SegmentRegister {
144 uint64_t base;
145 uint32_t limit;
146 uint16_t selector;
147 uint8_t type, present, dpl, db, s, l, g, avl;
148};
149
150struct HelX86DescriptorTable {
151 uint64_t base;
152 uint16_t limit;
153};
154
155struct HelX86VirtualizationRegs {
156 uint64_t rax;
157 uint64_t rbx;
158 uint64_t rcx;
159 uint64_t rdx;
160 uint64_t rsi;
161 uint64_t rdi;
162 uint64_t rbp;
163 uint64_t r8;
164 uint64_t r9;
165 uint64_t r10;
166 uint64_t r11;
167 uint64_t r12;
168 uint64_t r13;
169 uint64_t r14;
170 uint64_t r15;
171
172 uint64_t rsp;
173 uint64_t rip;
174 uint64_t rflags;
175
176 struct HelX86SegmentRegister cs, ds, es, fs, gs, ss;
177 struct HelX86SegmentRegister tr, ldt;
178 struct HelX86DescriptorTable gdt, idt;
179
180 uint64_t cr0, cr2, cr3, cr4, cr8;
181 uint64_t efer;
182 uint64_t apic_base;
183};
184
185enum {
186 kHelNullHandle = 0,
187 kHelThisUniverse = -1,
188 kHelThisThread = -2,
189 kHelZeroMemory = -3
190};
191
192enum {
193 kHelWaitInfinite = -1
194};
195
196enum {
197 kHelAbiSystemV = 1
198};
199
200enum {
201 kHelActionNone = 0,
202 kHelActionDismiss = 11,
203 kHelActionOffer = 5,
204 kHelActionAccept = 6,
205 kHelActionImbueCredentials = 8,
206 kHelActionExtractCredentials = 9,
207 kHelActionSendFromBuffer = 1,
208 kHelActionSendFromBufferSg = 10,
209 kHelActionRecvInline = 7,
210 kHelActionRecvToBuffer = 3,
211 kHelActionPushDescriptor = 2,
212 kHelActionPullDescriptor = 4
213};
214
215enum {
216 kHelItemChain = 1,
217 kHelItemAncillary = 2,
218 kHelItemWantLane = (1 << 16),
219};
220
221enum HelTransferDescriptorFlags {
222 kHelTransferDescriptorOut,
223 kHelTransferDescriptorIn,
224};
225
226struct HelSgItem {
227 void *buffer;
228 size_t length;
229};
230
231struct HelAction {
232 int type;
233 uint32_t flags;
234 // TODO: the following fields could be put into unions
235 void *buffer;
236 size_t length;
237 HelHandle handle;
238};
239
240struct HelDescriptorInfo {
241 int type;
242};
243
244enum HelAllocFlags {
245 kHelAllocContinuous = 4,
246 kHelAllocOnDemand = 1,
247};
248
249struct HelAllocRestrictions {
250 int addressBits;
251};
252
253enum HelManagedFlags {
254 kHelManagedReadahead = 1
255};
256
257enum HelManageRequests {
258 kHelManageInitialize = 1,
259 kHelManageWriteback = 2
260};
261
262enum HelMapFlags {
263 // Additional flags that may be set.
264 kHelMapProtRead = 256,
265 kHelMapProtWrite = 512,
266 kHelMapProtExecute = 1024,
267 kHelMapDontRequireBacking = 128,
268 kHelMapFixed = 2048,
269 kHelMapFixedNoReplace = 4096,
270 kHelMapPreferBottom = 8192
271};
272
273enum HelSliceFlags {
274 kHelSliceCacheWriteCombine = 1,
275};
276
277enum HelThreadFlags {
278 kHelThreadStopped = 1
279};
280
281enum HelObservation {
282 kHelObserveNull = 0,
283 kHelObserveInterrupt = 4,
284 kHelObservePanic = 3,
285 kHelObserveBreakpoint = 1,
286 kHelObservePageFault = 2,
287 kHelObserveGeneralFault = 5,
288 kHelObserveIllegalInstruction = 6,
289 kHelObserveDivByZero = 7,
290 kHelObserveSuperCall = 0x80000000
291};
292
293enum HelRegisterSets {
294 kHelRegsProgram = 1,
295 kHelRegsGeneral = 2,
296 kHelRegsThread = 3,
297 kHelRegsDebug = 4,
298 kHelRegsVirtualization = 5,
299 kHelRegsSimd = 6,
300 kHelRegsSignal = 7,
301 kHelRegsPageFault = 8
302};
303
304enum HelPageFaultFlags {
305 kHelPageFaultMapError = 1,
306 kHelPageFaultAccessError = 2
307};
308
313};
314
315#if defined(__x86_64__)
316enum HelRegisterIndex {
317 kHelRegRax = 0,
318 kHelRegRbx = 1,
319 kHelRegRcx = 2,
320 kHelRegRdx = 3,
321 kHelRegRdi = 4,
322 kHelRegRsi = 5,
323 kHelRegR8 = 6,
324 kHelRegR9 = 7,
325 kHelRegR10 = 8,
326 kHelRegR11 = 9,
327 kHelRegR12 = 10,
328 kHelRegR13 = 11,
329 kHelRegR14 = 12,
330 kHelRegR15 = 13,
331 kHelRegRbp = 14,
332
333 kHelNumGprs = 15,
334
335 kHelRegIp = 0,
336 kHelRegSp = 1
337};
338
339enum HelSyscallArgs {
340 kHelRegNumber = kHelRegRdi,
341 kHelRegError = kHelRegRdi,
342
343 kHelRegArg0 = kHelRegRsi,
344 kHelRegArg1 = kHelRegRdx,
345 kHelRegArg2 = kHelRegRax,
346 kHelRegArg3 = kHelRegR8,
347 kHelRegArg4 = kHelRegR9,
348 kHelRegArg5 = kHelRegR10,
349 kHelRegArg6 = kHelRegR12,
350 kHelRegArg7 = kHelRegR13,
351 kHelRegArg8 = kHelRegR14,
352
353 kHelRegOut0 = kHelRegRsi,
354 kHelRegOut1 = kHelRegRdx,
355 kHelRegOut2 = kHelRegRax
356};
357
358#elif defined(__aarch64__)
359enum HelRegisterIndex {
360 kHelRegX0 = 0,
361 kHelRegX1,
362 kHelRegX2,
363 kHelRegX3,
364 kHelRegX4,
365 kHelRegX5,
366 kHelRegX6,
367 kHelRegX7,
368 kHelRegX8,
369 kHelRegX9,
370 kHelRegX10,
371 kHelRegX11,
372 kHelRegX12,
373 kHelRegX13,
374 kHelRegX14,
375 kHelRegX15,
376 kHelRegX16,
377 kHelRegX17,
378 kHelRegX18,
379 kHelRegX19,
380 kHelRegX20,
381 kHelRegX21,
382 kHelRegX22,
383 kHelRegX23,
384 kHelRegX24,
385 kHelRegX25,
386 kHelRegX26,
387 kHelRegX27,
388 kHelRegX28,
389 kHelRegX29,
390 kHelRegX30,
391
392 kHelNumGprs = 31,
393
394 kHelRegIp = 0,
395 kHelRegSp = 1
396};
397
398enum HelSyscallArgs {
399 kHelRegNumber = kHelRegX0,
400 kHelRegError = kHelRegX0,
401
402 kHelRegArg0 = kHelRegX1,
403 kHelRegArg1 = kHelRegX2,
404 kHelRegArg2 = kHelRegX3,
405 kHelRegArg3 = kHelRegX4,
406 kHelRegArg4 = kHelRegX5,
407 kHelRegArg5 = kHelRegX6,
408 kHelRegArg6 = kHelRegX7,
409 kHelRegArg7 = kHelRegX8,
410 kHelRegArg8 = kHelRegX9,
411
412 kHelRegOut0 = kHelRegX1,
413 kHelRegOut1 = kHelRegX2,
414 kHelRegOut2 = kHelRegX3
415};
416
417#elif defined(__riscv) && __riscv_xlen == 64
418enum HelRegisterIndex {
419 kHelRegRa = 0,
420 kHelRegGp,
421 kHelRegTp,
422 kHelRegT0,
423 kHelRegT1,
424 kHelRegT2,
425 kHelRegS0,
426 kHelRegS1,
427 kHelRegA0,
428 kHelRegA1,
429 kHelRegA2,
430 kHelRegA3,
431 kHelRegA4,
432 kHelRegA5,
433 kHelRegA6,
434 kHelRegA7,
435 kHelRegS2,
436 kHelRegS3,
437 kHelRegS4,
438 kHelRegS5,
439 kHelRegS6,
440 kHelRegS7,
441 kHelRegS8,
442 kHelRegS9,
443 kHelRegS10,
444 kHelRegS11,
445 kHelRegT3,
446 kHelRegT4,
447 kHelRegT5,
448 kHelRegT6,
449 kHelNumGprs,
450 kHelRegIp = 0,
451 kHelRegSp = 1
452};
453enum HelSyscallArgs {
454 kHelRegNumber = kHelRegA0,
455 kHelRegError = kHelRegA0,
456 kHelRegArg0 = kHelRegA1,
457 kHelRegArg1 = kHelRegA2,
458 kHelRegArg2 = kHelRegA3,
459 kHelRegArg3 = kHelRegA4,
460 kHelRegArg4 = kHelRegA5,
461 kHelRegArg5 = kHelRegA6,
462 kHelRegArg6 = kHelRegA7,
463 kHelRegArg7 = kHelRegS2,
464 kHelRegArg8 = kHelRegS3,
465
466 kHelRegOut0 = kHelRegA1,
467 kHelRegOut1 = kHelRegA2,
468 kHelRegOut2 = kHelRegA3
469};
470
471#endif
472
473struct HelQueueParameters {
474 uint32_t flags;
475 unsigned int numChunks;
476 size_t chunkSize;
477 unsigned int numSqChunks;
478};
479
481static const int kHelUserNotifyCqProgress = (1 << 0);
483static const int kHelUserNotifySupplySqChunks = (1 << 1);
485static const int kHelUserNotifyError = (1 << 14);
487static const int kHelUserNotifyAlert = (1 << 15);
488
490static const int kHelKernelNotifySqProgress = (1 << 0);
492static const int kHelKernelNotifySupplyCqChunks = (1 << 1);
493
495static const uint32_t kHelDriveWait = (1 << 0);
496
498static const uint32_t kHelSubmitCancel = 256;
500static const uint32_t kHelSubmitAsyncNop = 1;
502static const uint32_t kHelSubmitExchangeMsgs = 2;
504static const uint32_t kHelSubmitAwaitClock = 3;
506static const uint32_t kHelSubmitAwaitEvent = 4;
508static const uint32_t kHelSubmitProtectMemory = 5;
510static const uint32_t kHelSubmitSynchronizeSpace = 6;
512static const uint32_t kHelSubmitReadMemory = 7;
514static const uint32_t kHelSubmitWriteMemory = 8;
516static const uint32_t kHelSubmitManageMemory = 9;
518static const uint32_t kHelSubmitLockMemoryView = 10;
520static const uint32_t kHelSubmitObserve = 11;
522static const uint32_t kHelSubmitResizeMemory = 12;
524static const uint32_t kHelSubmitForkMemory = 13;
526static const uint32_t kHelSubmitWritebackFence = 14;
528static const uint32_t kHelSubmitInvalidateMemory = 15;
530static const uint32_t kHelSubmitPopulateSpace = 16;
531
533struct HelQueue {
538
543
547
551};
552
554static const int kHelNextPresent = (1 << 24);
555
557static const int kHelProgressMask = 0xFFFFFF;
559static const int kHelProgressDone = (1 << 25);
561static const int kHelProgressFull = (1 << 26);
562
563struct HelChunk {
566 int next;
567
569 int progressFutex;
570
572 char buffer[];
573};
574
578 unsigned int length;
580 unsigned int opcode;
582 void *context;
583};
584
587 uint64_t cancellationTag;
588};
589
594 HelHandle lane;
596 size_t count;
598 uint32_t flags;
599};
600
604 uint64_t counter;
607};
608
612 HelHandle handle;
614 uint64_t sequence;
617};
618
622 HelHandle spaceHandle;
624 void *pointer;
626 size_t size;
628 uint32_t flags;
629};
630
634 HelHandle spaceHandle;
636 void *pointer;
638 size_t size;
639};
640
644 HelHandle handle;
646 uintptr_t address;
648 size_t length;
650 void *buffer;
651};
652
656 HelHandle handle;
658 uintptr_t address;
660 size_t length;
662 const void *buffer;
663};
664
668 HelHandle handle;
669};
670
674 HelHandle handle;
676 uintptr_t offset;
678 size_t size;
679};
680
684 HelHandle handle;
685};
686
690 HelHandle handle;
692 size_t newSize;
693};
694
698 HelHandle handle;
699};
700
704 HelHandle handle;
706 uintptr_t offset;
708 size_t size;
709};
710
714 HelHandle handle;
716 uintptr_t offset;
718 size_t size;
719};
720
724 HelHandle handle;
726 uintptr_t address;
728 size_t length;
729};
730
731struct HelSimpleResult {
732 HelError error;
733 int reserved;
734};
735
736struct HelCredentialsResult {
737 HelError error;
738 int reserved;
739 char credentials[16];
740};
741
742struct HelManageResult {
743 HelError error;
744 int type;
745 uintptr_t offset;
746 size_t length;
747};
748
749struct HelObserveResult {
750 HelError error;
751 unsigned int observation;
752};
753
754struct HelInlineResult {
755 HelError error;
756 int reserved;
757 size_t length;
758 char data[];
759};
760
761struct HelInlineResultNoFlex {
762 HelError error;
763 int reserved;
764 size_t length;
765};
766
767struct HelLengthResult {
768 HelError error;
769 int reserved;
770 size_t length;
771};
772
773struct HelHandleResult {
774 HelError error;
775 int reserved;
776 HelHandle handle;
777};
778
779struct HelEventResult {
780 HelError error;
781 uint32_t bitset;
782 uint64_t sequence;
783};
784
785enum HelAckFlags {
786 kHelAckAcknowledge = 2,
787 kHelAckNack = 3,
788 kHelAckKick = 1,
789 kHelAckClear = 0x100,
790};
791
792union HelKernletData {
793 HelHandle handle;
794};
795
796struct HelThreadStats {
797 uint64_t userTime;
798};
799
800enum {
801 kHelVmexitHlt = 0,
802 kHelVmexitTranslationFault = 1,
803 kHelVmexitError = -1,
804 kHelVmexitUnknownPlatformSpecificExitCode = -2,
805};
806
807struct HelVmexitReason {
808 uint32_t exitReason;
809 uint32_t code;
810 size_t address;
811 size_t flags;
812};
813
814// see RFC 5424
815enum HelLogSeverity {
816 kHelLogSeverityEmergency,
817 kHelLogSeverityAlert,
818 kHelLogSeverityCritical,
819 kHelLogSeverityError,
820 kHelLogSeverityWarning,
821 kHelLogSeverityNotice,
822 kHelLogSeverityInfo,
823 kHelLogSeverityDebug,
824};
825
828
836HEL_C_LINKAGE HelError helLog(const enum HelLogSeverity severity, const char *string, size_t length);
837
843HEL_C_LINKAGE void helPanic(const char *string, size_t length)
844 __attribute__ (( noreturn ));
845
849
851HEL_C_LINKAGE HelError helNop();
852
856HEL_C_LINKAGE HelError helSubmitAsyncNop(HelHandle queueHandle, uintptr_t context);
857
861
865HEL_C_LINKAGE HelError helCreateUniverse(HelHandle *handle);
866
874HEL_C_LINKAGE HelError
875helTransferDescriptor(HelHandle handle, HelHandle universeHandle,
876 enum HelTransferDescriptorFlags direction, HelHandle *outHandle);
877
878HEL_C_LINKAGE HelError helDescriptorInfo(HelHandle handle, struct HelDescriptorInfo *info);
879
885HEL_C_LINKAGE HelError helGetCredentials(HelHandle handle, uint32_t flags,
886 char *credentials);
887
893HEL_C_LINKAGE HelError helCloseDescriptor(HelHandle universeHandle, HelHandle handle);
894
898
904HEL_C_LINKAGE HelError helCreateQueue(const struct HelQueueParameters *params,
905 HelHandle *handle);
906
918HEL_C_LINKAGE HelError helDriveQueue(HelHandle queueHandle, uint32_t flags, uint32_t notifyMask);
919
926HEL_C_LINKAGE HelError helAlertQueue(HelHandle queueHandle);
927
931
941HEL_C_LINKAGE HelError helAllocateMemory(size_t size, uint32_t flags,
942 const struct HelAllocRestrictions *restrictions, HelHandle *handle);
943
950HEL_C_LINKAGE HelError helResizeMemory(HelHandle handle, size_t newSize);
951
963HEL_C_LINKAGE HelError helCreateManagedMemory(size_t size, uint32_t flags,
964 HelHandle *backingHandle, HelHandle *frontalHandle);
965
976HEL_C_LINKAGE HelError helCopyOnWrite(HelHandle memory,
977 uintptr_t offset, size_t size, HelHandle *handle);
978
979HEL_C_LINKAGE HelError helAccessPhysical(uintptr_t physical,
980 size_t size, HelHandle *handle);
981
987HEL_C_LINKAGE HelError helCreateIndirectMemory(size_t numSlots, HelHandle *handle);
988
1005HEL_C_LINKAGE HelError helAlterMemoryIndirection(HelHandle indirectHandle, size_t slotIndex,
1006 HelHandle memoryHandle, uintptr_t offset, size_t size);
1007
1008HEL_C_LINKAGE HelError helCreateSliceView(HelHandle bundle, uintptr_t offset, size_t size,
1009 uint32_t flags, HelHandle *handle);
1010
1018HEL_C_LINKAGE HelError helForkMemory(HelHandle handle, HelHandle *forkedHandle);
1019
1023HEL_C_LINKAGE HelError helCreateSpace(HelHandle *handle);
1024
1042HEL_C_LINKAGE HelError helMapMemory(HelHandle memoryHandle, HelHandle spaceHandle,
1043 void *pointer, uintptr_t offset, size_t size, uint32_t flags, void **actualPointer);
1044
1045
1056HEL_C_LINKAGE HelError helUnmapMemory(HelHandle spaceHandle, void *pointer, size_t size);
1057
1058HEL_C_LINKAGE HelError helPointerPhysical(HelHandle spaceHandle, const void *pointer, uintptr_t *physical);
1059
1060HEL_C_LINKAGE HelError helMemoryInfo(HelHandle handle,
1061 size_t *size);
1062
1063HEL_C_LINKAGE HelError helUpdateMemory(HelHandle handle, int type, uintptr_t offset, size_t length);
1064
1075HEL_C_LINKAGE HelError helLoadahead(HelHandle handle, uintptr_t offset, size_t length);
1076
1077HEL_C_LINKAGE HelError helCreateVirtualizedSpace(HelHandle *handle);
1078
1082
1096HEL_C_LINKAGE HelError helCreateThread(HelHandle universe, HelHandle spaceHandle,
1097 HelAbi abi, void *ip, void *sp, uint32_t flags, HelHandle *handle);
1098
1104HEL_C_LINKAGE HelError helQueryThreadStats(HelHandle handle, struct HelThreadStats *stats);
1105
1114HEL_C_LINKAGE HelError helSetPriority(HelHandle handle, int priority);
1115
1117HEL_C_LINKAGE HelError helYield();
1118
1122HEL_C_LINKAGE HelError helKillThread(HelHandle handle);
1123
1130HEL_C_LINKAGE HelError helInterruptThread(HelHandle handle);
1131
1138HEL_C_LINKAGE HelError helResume(HelHandle handle);
1139
1147HEL_C_LINKAGE HelError helLoadRegisters(HelHandle handle, int set, void *image);
1148
1156HEL_C_LINKAGE HelError helStoreRegisters(HelHandle handle, int set, const void *image);
1157
1160// Register set to query information for.
1163HEL_C_LINKAGE HelError helQueryRegisterInfo(int set, struct HelRegisterInfo *info);
1164
1165HEL_C_LINKAGE HelError helWriteFsBase(void *pointer);
1166
1167HEL_C_LINKAGE HelError helReadFsBase(void **pointer);
1168
1169HEL_C_LINKAGE HelError helWriteGsBase(void *pointer);
1170
1171HEL_C_LINKAGE HelError helReadGsBase(void **pointer);
1172
1174HEL_C_LINKAGE HelError helGetCurrentCpu(int *cpu);
1175
1180HEL_C_LINKAGE HelError helGetClock(uint64_t *counter);
1181
1182HEL_C_LINKAGE HelError helCreateVirtualizedCpu(HelHandle handle, HelHandle *out_handle);
1183
1184HEL_C_LINKAGE HelError helRunVirtualizedCpu(HelHandle handle, struct HelVmexitReason *reason);
1185
1186HEL_C_LINKAGE HelError helGetRandomBytes(void *buffer, size_t wantedSize, size_t *actualSize);
1187
1197HEL_C_LINKAGE HelError helGetAffinity(HelHandle handle, uint8_t *mask, size_t size, size_t *actualSize);
1198
1206HEL_C_LINKAGE HelError helSetAffinity(HelHandle handle, uint8_t *mask, size_t size);
1207
1211
1219HEL_C_LINKAGE HelError helCreateStream(HelHandle *lane1, HelHandle *lane2, uint32_t attach_credentials);
1220
1221HEL_C_LINKAGE HelError helShutdownLane(HelHandle handle);
1222
1230HEL_C_LINKAGE HelError helCreateToken(HelHandle *handle);
1231
1235
1244HEL_C_LINKAGE HelError helFutexWait(int *pointer, int expected, int64_t deadline);
1245
1251HEL_C_LINKAGE HelError helFutexWake(int *pointer, unsigned int count);
1252
1256
1260HEL_C_LINKAGE HelError helCreateOneshotEvent(HelHandle *handle);
1261
1265HEL_C_LINKAGE HelError helCreateBitsetEvent(HelHandle *handle);
1266
1270HEL_C_LINKAGE HelError helRaiseEvent(HelHandle handle);
1271
1272HEL_C_LINKAGE HelError helAccessIrq(int number, HelHandle *handle);
1273
1274HEL_C_LINKAGE HelError helAcknowledgeIrq(HelHandle handle, uint32_t flags, uint64_t sequence);
1275
1276HEL_C_LINKAGE HelError helAutomateIrq(HelHandle handle, uint32_t flags, HelHandle kernlet);
1277
1281
1282HEL_C_LINKAGE HelError helAccessIo(uintptr_t *port_array, size_t num_ports,
1283 HelHandle *handle);
1284
1288HEL_C_LINKAGE HelError helEnableIo(HelHandle handle);
1289
1290HEL_C_LINKAGE HelError helEnableFullIo();
1291
1295
1305HEL_C_LINKAGE HelError helBindKernlet(HelHandle handle,
1306 const union HelKernletData *data, size_t numData, HelHandle *boundHandle);
1307
1309
1310extern inline __attribute__ (( always_inline )) const char *_helErrorString(HelError code) {
1311 switch(code) {
1312 case kHelErrNone:
1313 return "Success";
1314 case kHelErrIllegalSyscall:
1315 return "Illegal syscall";
1316 case kHelErrIllegalArgs:
1317 return "Illegal arguments";
1318 case kHelErrIllegalState:
1319 return "Illegal state";
1320 case kHelErrUnsupportedOperation:
1321 return "Unsupported operation";
1322 case kHelErrNoDescriptor:
1323 return "No such descriptor";
1324 case kHelErrBadDescriptor:
1325 return "Illegal descriptor for this operation";
1326 case kHelErrThreadTerminated:
1327 return "Thread terminated already";
1328 case kHelErrLaneShutdown:
1329 return "Lane shutdown";
1330 case kHelErrEndOfLane:
1331 return "End of lane";
1332 case kHelErrDismissed:
1333 return "IPC item dismissed by remote";
1334 case kHelErrBufferTooSmall:
1335 return "Buffer too small";
1336 case kHelErrQueueTooSmall:
1337 return "Buffer too small";
1338 case kHelErrFault:
1339 return "Segfault";
1340 case kHelErrNoHardwareSupport:
1341 return "Missing hardware support for this feature";
1342 case kHelErrNoMemory:
1343 return "Out of memory";
1344 case kHelErrTransmissionMismatch:
1345 return "Transmission mismatch";
1346 case kHelErrCancelled:
1347 return "Cancelled";
1348 case kHelErrOutOfBounds:
1349 return "Out of bounds";
1350 case kHelErrAlreadyExists:
1351 return "Already exists";
1352 default:
1353 return 0;
1354 }
1355}
1356
1357extern inline __attribute__ (( always_inline )) void _helCheckFailed(HelError err_code,
1358 const char *string, int fatal) {
1359 helLog(kHelLogSeverityError, string, strlen(string));
1360
1361 const char *err_string = _helErrorString(err_code);
1362 if(err_string == 0)
1363 err_string = "(Unexpected error code)";
1364 helLog(kHelLogSeverityError, err_string, strlen(err_string));
1365 helLog(kHelLogSeverityError, "\n", 1);
1366
1367 if(fatal)
1368 helPanic(0, 0);
1369}
1370
1371#define HEL_STRINGIFY_AUX(x) #x
1372#define HEL_STRINGIFY(x) HEL_STRINGIFY_AUX(x)
1373
1374#define HEL_CHECK(expr) do { HelError __error = expr; if(__error != kHelErrNone) \
1375 _helCheckFailed(__error, "HEL_CHECK failed: " #expr "\n" \
1376 " In file " __FILE__ " on line " HEL_STRINGIFY(__LINE__) "\n", 1); } while(0)
1377#define HEL_SOFT_CHECK(expr) do { HelError __error = expr; if(__error != kHelErrNone) \
1378 _helCheckFailed(__error, "HEL_SOFT_CHECK failed: " #expr "\n" \
1379 " In file " __FILE__ " on line " HEL_STRINGIFY(__LINE__) "\n", 0); } while(0)
1380
1381#endif // HEL_H
1382
HEL_C_LINKAGE HelError helLog(const enum HelLogSeverity severity, const char *string, size_t length)
Writes a text message (e.g., a line of text) to the kernel's log.
HEL_C_LINKAGE HelError helSetPriority(HelHandle handle, int priority)
Set the priority of a thread.
HEL_C_LINKAGE HelError helYield()
Yields the current thread.
static const int kHelUserNotifyAlert
Set in userNotify when the queue is alerted.
Definition hel.h:487
HEL_C_LINKAGE HelError helTransferDescriptor(HelHandle handle, HelHandle universeHandle, enum HelTransferDescriptorFlags direction, HelHandle *outHandle)
Copies descriptors from the current universe to another universe.
HEL_C_LINKAGE HelError helCloseDescriptor(HelHandle universeHandle, HelHandle handle)
Closes a descriptor.
HEL_C_LINKAGE HelError helQueryRegisterInfo(int set, struct HelRegisterInfo *info)
Query register-related information.
HEL_C_LINKAGE HelError helMapMemory(HelHandle memoryHandle, HelHandle spaceHandle, void *pointer, uintptr_t offset, size_t size, uint32_t flags, void **actualPointer)
Maps memory objects into an address space.
HEL_C_LINKAGE HelError helSetAffinity(HelHandle handle, uint8_t *mask, size_t size)
Set a thread's CPU affinity mask.
static const int kHelKernelNotifySqProgress
Set in kernelNotify after userspace has added SQ elements.
Definition hel.h:490
static const uint32_t kHelSubmitInvalidateMemory
SQ opcode: invalidate memory.
Definition hel.h:528
HEL_C_LINKAGE HelError helQueryThreadStats(HelHandle handle, struct HelThreadStats *stats)
Query run-time statistics of a thread.
HEL_C_LINKAGE HelError helAlterMemoryIndirection(HelHandle indirectHandle, size_t slotIndex, HelHandle memoryHandle, uintptr_t offset, size_t size)
Modifies indirect memory objects.
HEL_C_LINKAGE HelError helCreateBitsetEvent(HelHandle *handle)
Create an event consisting of multiple bits that can fire independently.
HEL_C_LINKAGE HelError helGetCredentials(HelHandle handle, uint32_t flags, char *credentials)
Returns the credentials associated with a given descriptor.
HEL_C_LINKAGE HelError helKillThread(HelHandle handle)
Kill (i.e., terminate) a thread.
static const uint32_t kHelSubmitWriteMemory
SQ opcode: write memory.
Definition hel.h:514
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:500
HEL_C_LINKAGE HelError helGetClock(uint64_t *counter)
Read the system-wide monotone clock.
HEL_C_LINKAGE HelError helLoadahead(HelHandle handle, uintptr_t offset, size_t length)
Notifies the kernel that a certain range of memory should be preloaded.
HEL_C_LINKAGE HelError helLoadRegisters(HelHandle handle, int set, void *image)
Load a register image (e.g., from a thread).
HEL_C_LINKAGE HelError helCopyOnWrite(HelHandle memory, uintptr_t offset, size_t size, HelHandle *handle)
Creates memory object that obtains its memory by copy-on-write from another memory object.
HEL_C_LINKAGE void helPanic(const char *string, size_t length) __attribute__((noreturn))
Kills the current thread and writes an error message to the kernel's log.
HEL_C_LINKAGE HelError helUnmapMemory(HelHandle spaceHandle, void *pointer, size_t size)
Unmaps memory from an address space.
HEL_C_LINKAGE HelError helFutexWake(int *pointer, unsigned int count)
Wakes up all waiters of a futex.
HEL_C_LINKAGE HelError helResizeMemory(HelHandle handle, size_t newSize)
Resizes a memory object.
static const int kHelProgressMask
Mask to extract the number of valid bytes in the chunk.
Definition hel.h:557
static const uint32_t kHelSubmitManageMemory
SQ opcode: manage memory.
Definition hel.h:516
HEL_C_LINKAGE HelError helCreateManagedMemory(size_t size, uint32_t flags, HelHandle *backingHandle, HelHandle *frontalHandle)
Creates a memory object that is managed by userspace.
static const uint32_t kHelSubmitForkMemory
SQ opcode: fork memory.
Definition hel.h:524
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:561
static const uint32_t kHelSubmitSynchronizeSpace
SQ opcode: synchronize space.
Definition hel.h:510
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:495
static const uint32_t kHelSubmitObserve
SQ opcode: observe thread.
Definition hel.h:520
HEL_C_LINKAGE HelError helForkMemory(HelHandle handle, HelHandle *forkedHandle)
Forks memory objects, i.e., copies them using copy-on-write.
HEL_C_LINKAGE HelError helCreateQueue(const struct HelQueueParameters *params, HelHandle *handle)
Creates an IPC queue.
HEL_C_LINKAGE HelError helCreateToken(HelHandle *handle)
Create a token object.
HEL_C_LINKAGE HelError helAllocateMemory(size_t size, uint32_t flags, const struct HelAllocRestrictions *restrictions, HelHandle *handle)
Creates a memory object consisting of unmanaged RAM.
HEL_C_LINKAGE HelError helCreateThread(HelHandle universe, HelHandle spaceHandle, HelAbi abi, void *ip, void *sp, uint32_t flags, HelHandle *handle)
Create a new thread.
HEL_C_LINKAGE HelError helResume(HelHandle handle)
Resume a suspended thread.
static const uint32_t kHelSubmitExchangeMsgs
SQ opcode: exchange messages on a stream.
Definition hel.h:502
static const uint32_t kHelSubmitReadMemory
SQ opcode: read memory.
Definition hel.h:512
static const int kHelNextPresent
Marks the next field as present.
Definition hel.h:554
static const int kHelKernelNotifySupplyCqChunks
Set in kernelNotify after userspace has supplied new chunks.
Definition hel.h:492
HEL_C_LINKAGE HelError helSubmitAsyncNop(HelHandle queueHandle, uintptr_t context)
Does nothing, asynchronously (useful only for profiling).
HEL_C_LINKAGE HelError helStoreRegisters(HelHandle handle, int set, const void *image)
Store a register image (e.g., to a thread).
static const uint32_t kHelSubmitAwaitEvent
SQ opcode: wait for an event.
Definition hel.h:506
static const uint32_t kHelSubmitAwaitClock
SQ opcode: wait for time to pass.
Definition hel.h:504
static const uint32_t kHelSubmitPopulateSpace
SQ opcode: populate a space.
Definition hel.h:530
HEL_C_LINKAGE HelError helAlertQueue(HelHandle queueHandle)
Alerts an IPC queue.
HEL_C_LINKAGE HelError helCreateStream(HelHandle *lane1, HelHandle *lane2, uint32_t attach_credentials)
Create a stream (which always consists of two lanes).
static const uint32_t kHelSubmitProtectMemory
SQ opcode: protect memory.
Definition hel.h:508
static const int kHelUserNotifySupplySqChunks
Set in userNotify after kernel has supplied new SQ chunks.
Definition hel.h:483
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:481
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:526
static const uint32_t kHelSubmitResizeMemory
SQ opcode: resize memory.
Definition hel.h:522
HEL_C_LINKAGE HelError helCreateOneshotEvent(HelHandle *handle)
Create an event that fires at most once.
HEL_C_LINKAGE HelError helDriveQueue(HelHandle queueHandle, uint32_t flags, uint32_t notifyMask)
Drives an IPC queue.
static const uint32_t kHelSubmitLockMemoryView
SQ opcode: lock memory view.
Definition hel.h:518
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:559
HEL_C_LINKAGE HelError helEnableIo(HelHandle handle)
Enable userspace access to hardware I/O resources.
static const int kHelUserNotifyError
Set in userNotify if the queue encounters a contract violation.
Definition hel.h:485
static const uint32_t kHelSubmitCancel
SQ opcode: cancel an asynchronous operation.
Definition hel.h:498
A single element of a HelQueue.
Definition hel.h:576
unsigned int length
Length of the element in bytes.
Definition hel.h:578
void * context
User-defined value.
Definition hel.h:582
unsigned int opcode
Operation code (for SQ elements).
Definition hel.h:580
In-memory kernel/user-space queue.
Definition hel.h:533
int kernelNotify
Futex that is used to wake the kernel.
Definition hel.h:542
int userNotify
Futex that is used to wake userspace.
Definition hel.h:537
int cqFirst
Index of the first chunk of the completion queue.
Definition hel.h:546
int sqFirst
Index of the first chunk of the submission queue.
Definition hel.h:550
Register-related information returned by helQueryRegisterInfo.
Definition hel.h:310
int setSize
Size of the selected register set.
Definition hel.h:312
SQ data for kHelSubmitAwaitClock.
Definition hel.h:602
uint64_t cancellationTag
Tag to cancel this operation.
Definition hel.h:606
uint64_t counter
Deadline in nanoseconds since boot.
Definition hel.h:604
SQ data for kHelSubmitAwaitEvent.
Definition hel.h:610
HelHandle handle
Handle to the event descriptor.
Definition hel.h:612
uint64_t cancellationTag
Tag to cancel this operation.
Definition hel.h:616
uint64_t sequence
Previous sequence number.
Definition hel.h:614
SQ data for kHelSubmitCancel.
Definition hel.h:586
SQ data for kHelSubmitExchangeMsgs.
Definition hel.h:592
uint32_t flags
Flags.
Definition hel.h:598
size_t count
Number of actions.
Definition hel.h:596
HelHandle lane
Handle to the lane.
Definition hel.h:594
SQ data for kHelSubmitForkMemory.
Definition hel.h:696
HelHandle handle
Handle to the memory object.
Definition hel.h:698
SQ data for kHelSubmitInvalidateMemory.
Definition hel.h:712
HelHandle handle
Handle to the memory object.
Definition hel.h:714
size_t size
Size of the range.
Definition hel.h:718
uintptr_t offset
Offset within the memory object.
Definition hel.h:716
SQ data for kHelSubmitLockMemoryView.
Definition hel.h:672
size_t size
Size to lock.
Definition hel.h:678
uintptr_t offset
Offset within the memory object.
Definition hel.h:676
HelHandle handle
Handle to the memory object.
Definition hel.h:674
SQ data for kHelSubmitManageMemory.
Definition hel.h:666
HelHandle handle
Handle to the memory object.
Definition hel.h:668
SQ data for kHelSubmitObserve.
Definition hel.h:682
HelHandle handle
Handle to the thread.
Definition hel.h:684
SQ data for kHelSubmitPopulateSpace.
Definition hel.h:722
HelHandle handle
Handle to the memory space.
Definition hel.h:724
uintptr_t address
Address within the memory space.
Definition hel.h:726
size_t length
Length of the range.
Definition hel.h:728
SQ data for kHelSubmitProtectMemory.
Definition hel.h:620
size_t size
Size of the mapping.
Definition hel.h:626
void * pointer
Pointer to the mapping.
Definition hel.h:624
uint32_t flags
Protection flags.
Definition hel.h:628
HelHandle spaceHandle
Handle to the address space.
Definition hel.h:622
SQ data for kHelSubmitReadMemory.
Definition hel.h:642
uintptr_t address
Address within the memory object.
Definition hel.h:646
HelHandle handle
Handle to the memory object.
Definition hel.h:644
size_t length
Length in bytes.
Definition hel.h:648
void * buffer
Buffer to read into.
Definition hel.h:650
SQ data for kHelSubmitResizeMemory.
Definition hel.h:688
HelHandle handle
Handle to the memory object.
Definition hel.h:690
size_t newSize
New size in bytes.
Definition hel.h:692
SQ data for kHelSubmitSynchronizeSpace.
Definition hel.h:632
void * pointer
Pointer to the mapping.
Definition hel.h:636
size_t size
Size of the mapping.
Definition hel.h:638
HelHandle spaceHandle
Handle to the address space.
Definition hel.h:634
SQ data for kHelSubmitWriteMemory.
Definition hel.h:654
HelHandle handle
Handle to the memory object.
Definition hel.h:656
size_t length
Length in bytes.
Definition hel.h:660
const void * buffer
Buffer to write from.
Definition hel.h:662
uintptr_t address
Address within the memory object.
Definition hel.h:658
SQ data for kHelSubmitWritebackFence.
Definition hel.h:702
HelHandle handle
Handle to the memory object.
Definition hel.h:704
size_t size
Size of the range.
Definition hel.h:708
uintptr_t offset
Offset within the memory object.
Definition hel.h:706