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};
141
142struct HelX86SegmentRegister {
143 uint64_t base;
144 uint32_t limit;
145 uint16_t selector;
146 uint8_t type, present, dpl, db, s, l, g, avl;
147};
148
149struct HelX86DescriptorTable {
150 uint64_t base;
151 uint16_t limit;
152};
153
154struct HelX86VirtualizationRegs {
155 uint64_t rax;
156 uint64_t rbx;
157 uint64_t rcx;
158 uint64_t rdx;
159 uint64_t rsi;
160 uint64_t rdi;
161 uint64_t rbp;
162 uint64_t r8;
163 uint64_t r9;
164 uint64_t r10;
165 uint64_t r11;
166 uint64_t r12;
167 uint64_t r13;
168 uint64_t r14;
169 uint64_t r15;
170
171 uint64_t rsp;
172 uint64_t rip;
173 uint64_t rflags;
174
175 struct HelX86SegmentRegister cs, ds, es, fs, gs, ss;
176 struct HelX86SegmentRegister tr, ldt;
177 struct HelX86DescriptorTable gdt, idt;
178
179 uint64_t cr0, cr2, cr3, cr4, cr8;
180 uint64_t efer;
181 uint64_t apic_base;
182};
183
184enum {
185 kHelNullHandle = 0,
186 kHelThisUniverse = -1,
187 kHelThisThread = -2,
188 kHelZeroMemory = -3
189};
190
191enum {
192 kHelWaitInfinite = -1
193};
194
195enum {
196 kHelAbiSystemV = 1
197};
198
199enum {
200 kHelActionNone = 0,
201 kHelActionDismiss = 11,
202 kHelActionOffer = 5,
203 kHelActionAccept = 6,
204 kHelActionImbueCredentials = 8,
205 kHelActionExtractCredentials = 9,
206 kHelActionSendFromBuffer = 1,
207 kHelActionSendFromBufferSg = 10,
208 kHelActionRecvInline = 7,
209 kHelActionRecvToBuffer = 3,
210 kHelActionPushDescriptor = 2,
211 kHelActionPullDescriptor = 4
212};
213
214enum {
215 kHelItemChain = 1,
216 kHelItemAncillary = 2,
217 kHelItemWantLane = (1 << 16),
218};
219
220enum HelTransferDescriptorFlags {
221 kHelTransferDescriptorOut,
222 kHelTransferDescriptorIn,
223};
224
225struct HelSgItem {
226 void *buffer;
227 size_t length;
228};
229
230struct HelAction {
231 int type;
232 uint32_t flags;
233 // TODO: the following fields could be put into unions
234 void *buffer;
235 size_t length;
236 HelHandle handle;
237};
238
239struct HelDescriptorInfo {
240 int type;
241};
242
243enum HelAllocFlags {
244 kHelAllocContinuous = 4,
245 kHelAllocOnDemand = 1,
246};
247
248struct HelAllocRestrictions {
249 int addressBits;
250};
251
252enum HelManagedFlags {
253 kHelManagedReadahead = 1
254};
255
256enum HelManageRequests {
257 kHelManageInitialize = 1,
258 kHelManageWriteback = 2
259};
260
261enum HelMapFlags {
262 // Additional flags that may be set.
263 kHelMapProtRead = 256,
264 kHelMapProtWrite = 512,
265 kHelMapProtExecute = 1024,
266 kHelMapDontRequireBacking = 128,
267 kHelMapFixed = 2048,
268 kHelMapFixedNoReplace = 4096
269};
270
271enum HelSliceFlags {
272 kHelSliceCacheWriteCombine = 1,
273};
274
275enum HelThreadFlags {
276 kHelThreadStopped = 1
277};
278
279enum HelObservation {
280 kHelObserveNull = 0,
281 kHelObserveInterrupt = 4,
282 kHelObservePanic = 3,
283 kHelObserveBreakpoint = 1,
284 kHelObservePageFault = 2,
285 kHelObserveGeneralFault = 5,
286 kHelObserveIllegalInstruction = 6,
287 kHelObserveDivByZero = 7,
288 kHelObserveSuperCall = 0x80000000
289};
290
291enum HelRegisterSets {
292 kHelRegsProgram = 1,
293 kHelRegsGeneral = 2,
294 kHelRegsThread = 3,
295 kHelRegsDebug = 4,
296 kHelRegsVirtualization = 5,
297 kHelRegsSimd = 6,
298 kHelRegsSignal = 7,
299 kHelRegsPageFault = 8
300};
301
302enum HelPageFaultFlags {
303 kHelPageFaultMapError = 1,
304 kHelPageFaultAccessError = 2
305};
306
311};
312
313#if defined(__x86_64__)
314enum HelRegisterIndex {
315 kHelRegRax = 0,
316 kHelRegRbx = 1,
317 kHelRegRcx = 2,
318 kHelRegRdx = 3,
319 kHelRegRdi = 4,
320 kHelRegRsi = 5,
321 kHelRegR8 = 6,
322 kHelRegR9 = 7,
323 kHelRegR10 = 8,
324 kHelRegR11 = 9,
325 kHelRegR12 = 10,
326 kHelRegR13 = 11,
327 kHelRegR14 = 12,
328 kHelRegR15 = 13,
329 kHelRegRbp = 14,
330
331 kHelNumGprs = 15,
332
333 kHelRegIp = 0,
334 kHelRegSp = 1
335};
336
337enum HelSyscallArgs {
338 kHelRegNumber = kHelRegRdi,
339 kHelRegError = kHelRegRdi,
340
341 kHelRegArg0 = kHelRegRsi,
342 kHelRegArg1 = kHelRegRdx,
343 kHelRegArg2 = kHelRegRax,
344 kHelRegArg3 = kHelRegR8,
345 kHelRegArg4 = kHelRegR9,
346 kHelRegArg5 = kHelRegR10,
347 kHelRegArg6 = kHelRegR12,
348 kHelRegArg7 = kHelRegR13,
349 kHelRegArg8 = kHelRegR14,
350
351 kHelRegOut0 = kHelRegRsi,
352 kHelRegOut1 = kHelRegRdx,
353 kHelRegOut2 = kHelRegRax
354};
355
356#elif defined(__aarch64__)
357enum HelRegisterIndex {
358 kHelRegX0 = 0,
359 kHelRegX1,
360 kHelRegX2,
361 kHelRegX3,
362 kHelRegX4,
363 kHelRegX5,
364 kHelRegX6,
365 kHelRegX7,
366 kHelRegX8,
367 kHelRegX9,
368 kHelRegX10,
369 kHelRegX11,
370 kHelRegX12,
371 kHelRegX13,
372 kHelRegX14,
373 kHelRegX15,
374 kHelRegX16,
375 kHelRegX17,
376 kHelRegX18,
377 kHelRegX19,
378 kHelRegX20,
379 kHelRegX21,
380 kHelRegX22,
381 kHelRegX23,
382 kHelRegX24,
383 kHelRegX25,
384 kHelRegX26,
385 kHelRegX27,
386 kHelRegX28,
387 kHelRegX29,
388 kHelRegX30,
389
390 kHelNumGprs = 31,
391
392 kHelRegIp = 0,
393 kHelRegSp = 1
394};
395
396enum HelSyscallArgs {
397 kHelRegNumber = kHelRegX0,
398 kHelRegError = kHelRegX0,
399
400 kHelRegArg0 = kHelRegX1,
401 kHelRegArg1 = kHelRegX2,
402 kHelRegArg2 = kHelRegX3,
403 kHelRegArg3 = kHelRegX4,
404 kHelRegArg4 = kHelRegX5,
405 kHelRegArg5 = kHelRegX6,
406 kHelRegArg6 = kHelRegX7,
407 kHelRegArg7 = kHelRegX8,
408 kHelRegArg8 = kHelRegX9,
409
410 kHelRegOut0 = kHelRegX1,
411 kHelRegOut1 = kHelRegX2,
412 kHelRegOut2 = kHelRegX3
413};
414
415#elif defined(__riscv) && __riscv_xlen == 64
416enum HelRegisterIndex {
417 kHelRegRa = 0,
418 kHelRegGp,
419 kHelRegTp,
420 kHelRegT0,
421 kHelRegT1,
422 kHelRegT2,
423 kHelRegS0,
424 kHelRegS1,
425 kHelRegA0,
426 kHelRegA1,
427 kHelRegA2,
428 kHelRegA3,
429 kHelRegA4,
430 kHelRegA5,
431 kHelRegA6,
432 kHelRegA7,
433 kHelRegS2,
434 kHelRegS3,
435 kHelRegS4,
436 kHelRegS5,
437 kHelRegS6,
438 kHelRegS7,
439 kHelRegS8,
440 kHelRegS9,
441 kHelRegS10,
442 kHelRegS11,
443 kHelRegT3,
444 kHelRegT4,
445 kHelRegT5,
446 kHelRegT6,
447 kHelNumGprs,
448 kHelRegIp = 0,
449 kHelRegSp = 1
450};
451enum HelSyscallArgs {
452 kHelRegNumber = kHelRegA0,
453 kHelRegError = kHelRegA0,
454 kHelRegArg0 = kHelRegA1,
455 kHelRegArg1 = kHelRegA2,
456 kHelRegArg2 = kHelRegA3,
457 kHelRegArg3 = kHelRegA4,
458 kHelRegArg4 = kHelRegA5,
459 kHelRegArg5 = kHelRegA6,
460 kHelRegArg6 = kHelRegA7,
461 kHelRegArg7 = kHelRegS2,
462 kHelRegArg8 = kHelRegS3,
463
464 kHelRegOut0 = kHelRegA1,
465 kHelRegOut1 = kHelRegA2,
466 kHelRegOut2 = kHelRegA3
467};
468
469#endif
470
471struct HelQueueParameters {
472 uint32_t flags;
473 unsigned int numChunks;
474 size_t chunkSize;
475 unsigned int numSqChunks;
476};
477
479static const int kHelUserNotifyCqProgress = (1 << 0);
481static const int kHelUserNotifySupplySqChunks = (1 << 1);
483static const int kHelUserNotifyError = (1 << 14);
485static const int kHelUserNotifyAlert = (1 << 15);
486
488static const int kHelKernelNotifySqProgress = (1 << 0);
490static const int kHelKernelNotifySupplyCqChunks = (1 << 1);
491
493static const uint32_t kHelDriveWait = (1 << 0);
494
496static const uint32_t kHelSubmitCancel = 256;
498static const uint32_t kHelSubmitAsyncNop = 1;
500static const uint32_t kHelSubmitExchangeMsgs = 2;
502static const uint32_t kHelSubmitAwaitClock = 3;
504static const uint32_t kHelSubmitAwaitEvent = 4;
506static const uint32_t kHelSubmitProtectMemory = 5;
508static const uint32_t kHelSubmitSynchronizeSpace = 6;
510static const uint32_t kHelSubmitReadMemory = 7;
512static const uint32_t kHelSubmitWriteMemory = 8;
514static const uint32_t kHelSubmitManageMemory = 9;
516static const uint32_t kHelSubmitLockMemoryView = 10;
518static const uint32_t kHelSubmitObserve = 11;
520static const uint32_t kHelSubmitResizeMemory = 12;
522static const uint32_t kHelSubmitForkMemory = 13;
524static const uint32_t kHelSubmitWritebackFence = 14;
526static const uint32_t kHelSubmitInvalidateMemory = 15;
527
529struct HelQueue {
534
539
543
547};
548
550static const int kHelNextPresent = (1 << 24);
551
553static const int kHelProgressMask = 0xFFFFFF;
555static const int kHelProgressDone = (1 << 25);
557static const int kHelProgressFull = (1 << 26);
558
559struct HelChunk {
562 int next;
563
565 int progressFutex;
566
568 char buffer[];
569};
570
574 unsigned int length;
576 unsigned int opcode;
578 void *context;
579};
580
583 uint64_t cancellationTag;
584};
585
590 HelHandle lane;
592 size_t count;
594 uint32_t flags;
595};
596
600 uint64_t counter;
603};
604
608 HelHandle handle;
610 uint64_t sequence;
613};
614
618 HelHandle spaceHandle;
620 void *pointer;
622 size_t size;
624 uint32_t flags;
625};
626
630 HelHandle spaceHandle;
632 void *pointer;
634 size_t size;
635};
636
640 HelHandle handle;
642 uintptr_t address;
644 size_t length;
646 void *buffer;
647};
648
652 HelHandle handle;
654 uintptr_t address;
656 size_t length;
658 const void *buffer;
659};
660
664 HelHandle handle;
665};
666
670 HelHandle handle;
672 uintptr_t offset;
674 size_t size;
675};
676
680 HelHandle handle;
681};
682
686 HelHandle handle;
688 size_t newSize;
689};
690
694 HelHandle handle;
695};
696
700 HelHandle handle;
702 uintptr_t offset;
704 size_t size;
705};
706
710 HelHandle handle;
712 uintptr_t offset;
714 size_t size;
715};
716
717struct HelSimpleResult {
718 HelError error;
719 int reserved;
720};
721
722struct HelCredentialsResult {
723 HelError error;
724 int reserved;
725 char credentials[16];
726};
727
728struct HelManageResult {
729 HelError error;
730 int type;
731 uintptr_t offset;
732 size_t length;
733};
734
735struct HelObserveResult {
736 HelError error;
737 unsigned int observation;
738};
739
740struct HelInlineResult {
741 HelError error;
742 int reserved;
743 size_t length;
744 char data[];
745};
746
747struct HelInlineResultNoFlex {
748 HelError error;
749 int reserved;
750 size_t length;
751};
752
753struct HelLengthResult {
754 HelError error;
755 int reserved;
756 size_t length;
757};
758
759struct HelHandleResult {
760 HelError error;
761 int reserved;
762 HelHandle handle;
763};
764
765struct HelEventResult {
766 HelError error;
767 uint32_t bitset;
768 uint64_t sequence;
769};
770
771enum HelAckFlags {
772 kHelAckAcknowledge = 2,
773 kHelAckNack = 3,
774 kHelAckKick = 1,
775 kHelAckClear = 0x100,
776};
777
778union HelKernletData {
779 HelHandle handle;
780};
781
782struct HelThreadStats {
783 uint64_t userTime;
784};
785
786enum {
787 kHelVmexitHlt = 0,
788 kHelVmexitTranslationFault = 1,
789 kHelVmexitError = -1,
790 kHelVmexitUnknownPlatformSpecificExitCode = -2,
791};
792
793struct HelVmexitReason {
794 uint32_t exitReason;
795 uint32_t code;
796 size_t address;
797 size_t flags;
798};
799
800// see RFC 5424
801enum HelLogSeverity {
802 kHelLogSeverityEmergency,
803 kHelLogSeverityAlert,
804 kHelLogSeverityCritical,
805 kHelLogSeverityError,
806 kHelLogSeverityWarning,
807 kHelLogSeverityNotice,
808 kHelLogSeverityInfo,
809 kHelLogSeverityDebug,
810};
811
814
822HEL_C_LINKAGE HelError helLog(const enum HelLogSeverity severity, const char *string, size_t length);
823
829HEL_C_LINKAGE void helPanic(const char *string, size_t length)
830 __attribute__ (( noreturn ));
831
835
837HEL_C_LINKAGE HelError helNop();
838
842HEL_C_LINKAGE HelError helSubmitAsyncNop(HelHandle queueHandle, uintptr_t context);
843
847
851HEL_C_LINKAGE HelError helCreateUniverse(HelHandle *handle);
852
860HEL_C_LINKAGE HelError
861helTransferDescriptor(HelHandle handle, HelHandle universeHandle,
862 enum HelTransferDescriptorFlags direction, HelHandle *outHandle);
863
864HEL_C_LINKAGE HelError helDescriptorInfo(HelHandle handle, struct HelDescriptorInfo *info);
865
871HEL_C_LINKAGE HelError helGetCredentials(HelHandle handle, uint32_t flags,
872 char *credentials);
873
879HEL_C_LINKAGE HelError helCloseDescriptor(HelHandle universeHandle, HelHandle handle);
880
884
890HEL_C_LINKAGE HelError helCreateQueue(const struct HelQueueParameters *params,
891 HelHandle *handle);
892
904HEL_C_LINKAGE HelError helDriveQueue(HelHandle queueHandle, uint32_t flags, uint32_t notifyMask);
905
912HEL_C_LINKAGE HelError helAlertQueue(HelHandle queueHandle);
913
917
927HEL_C_LINKAGE HelError helAllocateMemory(size_t size, uint32_t flags,
928 const struct HelAllocRestrictions *restrictions, HelHandle *handle);
929
936HEL_C_LINKAGE HelError helResizeMemory(HelHandle handle, size_t newSize);
937
949HEL_C_LINKAGE HelError helCreateManagedMemory(size_t size, uint32_t flags,
950 HelHandle *backingHandle, HelHandle *frontalHandle);
951
962HEL_C_LINKAGE HelError helCopyOnWrite(HelHandle memory,
963 uintptr_t offset, size_t size, HelHandle *handle);
964
965HEL_C_LINKAGE HelError helAccessPhysical(uintptr_t physical,
966 size_t size, HelHandle *handle);
967
973HEL_C_LINKAGE HelError helCreateIndirectMemory(size_t numSlots, HelHandle *handle);
974
991HEL_C_LINKAGE HelError helAlterMemoryIndirection(HelHandle indirectHandle, size_t slotIndex,
992 HelHandle memoryHandle, uintptr_t offset, size_t size);
993
994HEL_C_LINKAGE HelError helCreateSliceView(HelHandle bundle, uintptr_t offset, size_t size,
995 uint32_t flags, HelHandle *handle);
996
1004HEL_C_LINKAGE HelError helForkMemory(HelHandle handle, HelHandle *forkedHandle);
1005
1009HEL_C_LINKAGE HelError helCreateSpace(HelHandle *handle);
1010
1028HEL_C_LINKAGE HelError helMapMemory(HelHandle memoryHandle, HelHandle spaceHandle,
1029 void *pointer, uintptr_t offset, size_t size, uint32_t flags, void **actualPointer);
1030
1031
1042HEL_C_LINKAGE HelError helUnmapMemory(HelHandle spaceHandle, void *pointer, size_t size);
1043
1044HEL_C_LINKAGE HelError helPointerPhysical(const void *pointer, uintptr_t *physical);
1045
1046HEL_C_LINKAGE HelError helMemoryInfo(HelHandle handle,
1047 size_t *size);
1048
1049HEL_C_LINKAGE HelError helUpdateMemory(HelHandle handle, int type, uintptr_t offset, size_t length);
1050
1061HEL_C_LINKAGE HelError helLoadahead(HelHandle handle, uintptr_t offset, size_t length);
1062
1063HEL_C_LINKAGE HelError helCreateVirtualizedSpace(HelHandle *handle);
1064
1068
1082HEL_C_LINKAGE HelError helCreateThread(HelHandle universe, HelHandle spaceHandle,
1083 HelAbi abi, void *ip, void *sp, uint32_t flags, HelHandle *handle);
1084
1090HEL_C_LINKAGE HelError helQueryThreadStats(HelHandle handle, struct HelThreadStats *stats);
1091
1100HEL_C_LINKAGE HelError helSetPriority(HelHandle handle, int priority);
1101
1103HEL_C_LINKAGE HelError helYield();
1104
1108HEL_C_LINKAGE HelError helKillThread(HelHandle handle);
1109
1116HEL_C_LINKAGE HelError helInterruptThread(HelHandle handle);
1117
1124HEL_C_LINKAGE HelError helResume(HelHandle handle);
1125
1133HEL_C_LINKAGE HelError helLoadRegisters(HelHandle handle, int set, void *image);
1134
1142HEL_C_LINKAGE HelError helStoreRegisters(HelHandle handle, int set, const void *image);
1143
1146// Register set to query information for.
1149HEL_C_LINKAGE HelError helQueryRegisterInfo(int set, struct HelRegisterInfo *info);
1150
1151HEL_C_LINKAGE HelError helWriteFsBase(void *pointer);
1152
1153HEL_C_LINKAGE HelError helReadFsBase(void **pointer);
1154
1155HEL_C_LINKAGE HelError helWriteGsBase(void *pointer);
1156
1157HEL_C_LINKAGE HelError helReadGsBase(void **pointer);
1158
1160HEL_C_LINKAGE HelError helGetCurrentCpu(int *cpu);
1161
1166HEL_C_LINKAGE HelError helGetClock(uint64_t *counter);
1167
1168HEL_C_LINKAGE HelError helCreateVirtualizedCpu(HelHandle handle, HelHandle *out_handle);
1169
1170HEL_C_LINKAGE HelError helRunVirtualizedCpu(HelHandle handle, struct HelVmexitReason *reason);
1171
1172HEL_C_LINKAGE HelError helGetRandomBytes(void *buffer, size_t wantedSize, size_t *actualSize);
1173
1183HEL_C_LINKAGE HelError helGetAffinity(HelHandle handle, uint8_t *mask, size_t size, size_t *actualSize);
1184
1192HEL_C_LINKAGE HelError helSetAffinity(HelHandle handle, uint8_t *mask, size_t size);
1193
1197
1205HEL_C_LINKAGE HelError helCreateStream(HelHandle *lane1, HelHandle *lane2, uint32_t attach_credentials);
1206
1207HEL_C_LINKAGE HelError helShutdownLane(HelHandle handle);
1208
1216HEL_C_LINKAGE HelError helCreateToken(HelHandle *handle);
1217
1221
1230HEL_C_LINKAGE HelError helFutexWait(int *pointer, int expected, int64_t deadline);
1231
1237HEL_C_LINKAGE HelError helFutexWake(int *pointer, unsigned int count);
1238
1242
1246HEL_C_LINKAGE HelError helCreateOneshotEvent(HelHandle *handle);
1247
1251HEL_C_LINKAGE HelError helCreateBitsetEvent(HelHandle *handle);
1252
1256HEL_C_LINKAGE HelError helRaiseEvent(HelHandle handle);
1257
1258HEL_C_LINKAGE HelError helAccessIrq(int number, HelHandle *handle);
1259
1260HEL_C_LINKAGE HelError helAcknowledgeIrq(HelHandle handle, uint32_t flags, uint64_t sequence);
1261
1262HEL_C_LINKAGE HelError helAutomateIrq(HelHandle handle, uint32_t flags, HelHandle kernlet);
1263
1267
1268HEL_C_LINKAGE HelError helAccessIo(uintptr_t *port_array, size_t num_ports,
1269 HelHandle *handle);
1270
1274HEL_C_LINKAGE HelError helEnableIo(HelHandle handle);
1275
1276HEL_C_LINKAGE HelError helEnableFullIo();
1277
1281
1291HEL_C_LINKAGE HelError helBindKernlet(HelHandle handle,
1292 const union HelKernletData *data, size_t numData, HelHandle *boundHandle);
1293
1295
1296extern inline __attribute__ (( always_inline )) const char *_helErrorString(HelError code) {
1297 switch(code) {
1298 case kHelErrNone:
1299 return "Success";
1300 case kHelErrIllegalSyscall:
1301 return "Illegal syscall";
1302 case kHelErrIllegalArgs:
1303 return "Illegal arguments";
1304 case kHelErrIllegalState:
1305 return "Illegal state";
1306 case kHelErrUnsupportedOperation:
1307 return "Unsupported operation";
1308 case kHelErrNoDescriptor:
1309 return "No such descriptor";
1310 case kHelErrBadDescriptor:
1311 return "Illegal descriptor for this operation";
1312 case kHelErrThreadTerminated:
1313 return "Thread terminated already";
1314 case kHelErrLaneShutdown:
1315 return "Lane shutdown";
1316 case kHelErrEndOfLane:
1317 return "End of lane";
1318 case kHelErrDismissed:
1319 return "IPC item dismissed by remote";
1320 case kHelErrBufferTooSmall:
1321 return "Buffer too small";
1322 case kHelErrQueueTooSmall:
1323 return "Buffer too small";
1324 case kHelErrFault:
1325 return "Segfault";
1326 case kHelErrNoHardwareSupport:
1327 return "Missing hardware support for this feature";
1328 case kHelErrNoMemory:
1329 return "Out of memory";
1330 case kHelErrTransmissionMismatch:
1331 return "Transmission mismatch";
1332 case kHelErrCancelled:
1333 return "Cancelled";
1334 case kHelErrOutOfBounds:
1335 return "Out of bounds";
1336 case kHelErrAlreadyExists:
1337 return "Already exists";
1338 default:
1339 return 0;
1340 }
1341}
1342
1343extern inline __attribute__ (( always_inline )) void _helCheckFailed(HelError err_code,
1344 const char *string, int fatal) {
1345 helLog(kHelLogSeverityError, string, strlen(string));
1346
1347 const char *err_string = _helErrorString(err_code);
1348 if(err_string == 0)
1349 err_string = "(Unexpected error code)";
1350 helLog(kHelLogSeverityError, err_string, strlen(err_string));
1351 helLog(kHelLogSeverityError, "\n", 1);
1352
1353 if(fatal)
1354 helPanic(0, 0);
1355}
1356
1357#define HEL_STRINGIFY_AUX(x) #x
1358#define HEL_STRINGIFY(x) HEL_STRINGIFY_AUX(x)
1359
1360#define HEL_CHECK(expr) do { HelError __error = expr; if(__error != kHelErrNone) \
1361 _helCheckFailed(__error, "HEL_CHECK failed: " #expr "\n" \
1362 " In file " __FILE__ " on line " HEL_STRINGIFY(__LINE__) "\n", 1); } while(0)
1363#define HEL_SOFT_CHECK(expr) do { HelError __error = expr; if(__error != kHelErrNone) \
1364 _helCheckFailed(__error, "HEL_SOFT_CHECK failed: " #expr "\n" \
1365 " In file " __FILE__ " on line " HEL_STRINGIFY(__LINE__) "\n", 0); } while(0)
1366
1367#endif // HEL_H
1368
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:485
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:488
static const uint32_t kHelSubmitInvalidateMemory
SQ opcode: invalidate memory.
Definition hel.h:526
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:512
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:498
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:553
static const uint32_t kHelSubmitManageMemory
SQ opcode: manage memory.
Definition hel.h:514
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:522
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:557
static const uint32_t kHelSubmitSynchronizeSpace
SQ opcode: synchronize space.
Definition hel.h:508
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:493
static const uint32_t kHelSubmitObserve
SQ opcode: observe thread.
Definition hel.h:518
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:500
static const uint32_t kHelSubmitReadMemory
SQ opcode: read memory.
Definition hel.h:510
static const int kHelNextPresent
Marks the next field as present.
Definition hel.h:550
static const int kHelKernelNotifySupplyCqChunks
Set in kernelNotify after userspace has supplied new chunks.
Definition hel.h:490
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:504
static const uint32_t kHelSubmitAwaitClock
SQ opcode: wait for time to pass.
Definition hel.h:502
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:506
static const int kHelUserNotifySupplySqChunks
Set in userNotify after kernel has supplied new SQ chunks.
Definition hel.h:481
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:479
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:524
static const uint32_t kHelSubmitResizeMemory
SQ opcode: resize memory.
Definition hel.h:520
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:516
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:555
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:483
static const uint32_t kHelSubmitCancel
SQ opcode: cancel an asynchronous operation.
Definition hel.h:496
A single element of a HelQueue.
Definition hel.h:572
unsigned int length
Length of the element in bytes.
Definition hel.h:574
void * context
User-defined value.
Definition hel.h:578
unsigned int opcode
Operation code (for SQ elements).
Definition hel.h:576
In-memory kernel/user-space queue.
Definition hel.h:529
int kernelNotify
Futex that is used to wake the kernel.
Definition hel.h:538
int userNotify
Futex that is used to wake userspace.
Definition hel.h:533
int cqFirst
Index of the first chunk of the completion queue.
Definition hel.h:542
int sqFirst
Index of the first chunk of the submission queue.
Definition hel.h:546
Register-related information returned by helQueryRegisterInfo.
Definition hel.h:308
int setSize
Size of the selected register set.
Definition hel.h:310
SQ data for kHelSubmitAwaitClock.
Definition hel.h:598
uint64_t cancellationTag
Tag to cancel this operation.
Definition hel.h:602
uint64_t counter
Deadline in nanoseconds since boot.
Definition hel.h:600
SQ data for kHelSubmitAwaitEvent.
Definition hel.h:606
HelHandle handle
Handle to the event descriptor.
Definition hel.h:608
uint64_t cancellationTag
Tag to cancel this operation.
Definition hel.h:612
uint64_t sequence
Previous sequence number.
Definition hel.h:610
SQ data for kHelSubmitCancel.
Definition hel.h:582
SQ data for kHelSubmitExchangeMsgs.
Definition hel.h:588
uint32_t flags
Flags.
Definition hel.h:594
size_t count
Number of actions.
Definition hel.h:592
HelHandle lane
Handle to the lane.
Definition hel.h:590
SQ data for kHelSubmitForkMemory.
Definition hel.h:692
HelHandle handle
Handle to the memory object.
Definition hel.h:694
SQ data for kHelSubmitInvalidateMemory.
Definition hel.h:708
HelHandle handle
Handle to the memory object.
Definition hel.h:710
size_t size
Size of the range.
Definition hel.h:714
uintptr_t offset
Offset within the memory object.
Definition hel.h:712
SQ data for kHelSubmitLockMemoryView.
Definition hel.h:668
size_t size
Size to lock.
Definition hel.h:674
uintptr_t offset
Offset within the memory object.
Definition hel.h:672
HelHandle handle
Handle to the memory object.
Definition hel.h:670
SQ data for kHelSubmitManageMemory.
Definition hel.h:662
HelHandle handle
Handle to the memory object.
Definition hel.h:664
SQ data for kHelSubmitObserve.
Definition hel.h:678
HelHandle handle
Handle to the thread.
Definition hel.h:680
SQ data for kHelSubmitProtectMemory.
Definition hel.h:616
size_t size
Size of the mapping.
Definition hel.h:622
void * pointer
Pointer to the mapping.
Definition hel.h:620
uint32_t flags
Protection flags.
Definition hel.h:624
HelHandle spaceHandle
Handle to the address space.
Definition hel.h:618
SQ data for kHelSubmitReadMemory.
Definition hel.h:638
uintptr_t address
Address within the memory object.
Definition hel.h:642
HelHandle handle
Handle to the memory object.
Definition hel.h:640
size_t length
Length in bytes.
Definition hel.h:644
void * buffer
Buffer to read into.
Definition hel.h:646
SQ data for kHelSubmitResizeMemory.
Definition hel.h:684
HelHandle handle
Handle to the memory object.
Definition hel.h:686
size_t newSize
New size in bytes.
Definition hel.h:688
SQ data for kHelSubmitSynchronizeSpace.
Definition hel.h:628
void * pointer
Pointer to the mapping.
Definition hel.h:632
size_t size
Size of the mapping.
Definition hel.h:634
HelHandle spaceHandle
Handle to the address space.
Definition hel.h:630
SQ data for kHelSubmitWriteMemory.
Definition hel.h:650
HelHandle handle
Handle to the memory object.
Definition hel.h:652
size_t length
Length in bytes.
Definition hel.h:656
const void * buffer
Buffer to write from.
Definition hel.h:658
uintptr_t address
Address within the memory object.
Definition hel.h:654
SQ data for kHelSubmitWritebackFence.
Definition hel.h:698
HelHandle handle
Handle to the memory object.
Definition hel.h:700
size_t size
Size of the range.
Definition hel.h:704
uintptr_t offset
Offset within the memory object.
Definition hel.h:702