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};
271
272enum HelSliceFlags {
273 kHelSliceCacheWriteCombine = 1,
274};
275
276enum HelThreadFlags {
277 kHelThreadStopped = 1
278};
279
280enum HelObservation {
281 kHelObserveNull = 0,
282 kHelObserveInterrupt = 4,
283 kHelObservePanic = 3,
284 kHelObserveBreakpoint = 1,
285 kHelObservePageFault = 2,
286 kHelObserveGeneralFault = 5,
287 kHelObserveIllegalInstruction = 6,
288 kHelObserveDivByZero = 7,
289 kHelObserveSuperCall = 0x80000000
290};
291
292enum HelRegisterSets {
293 kHelRegsProgram = 1,
294 kHelRegsGeneral = 2,
295 kHelRegsThread = 3,
296 kHelRegsDebug = 4,
297 kHelRegsVirtualization = 5,
298 kHelRegsSimd = 6,
299 kHelRegsSignal = 7,
300 kHelRegsPageFault = 8
301};
302
303enum HelPageFaultFlags {
304 kHelPageFaultMapError = 1,
305 kHelPageFaultAccessError = 2
306};
307
312};
313
314#if defined(__x86_64__)
315enum HelRegisterIndex {
316 kHelRegRax = 0,
317 kHelRegRbx = 1,
318 kHelRegRcx = 2,
319 kHelRegRdx = 3,
320 kHelRegRdi = 4,
321 kHelRegRsi = 5,
322 kHelRegR8 = 6,
323 kHelRegR9 = 7,
324 kHelRegR10 = 8,
325 kHelRegR11 = 9,
326 kHelRegR12 = 10,
327 kHelRegR13 = 11,
328 kHelRegR14 = 12,
329 kHelRegR15 = 13,
330 kHelRegRbp = 14,
331
332 kHelNumGprs = 15,
333
334 kHelRegIp = 0,
335 kHelRegSp = 1
336};
337
338enum HelSyscallArgs {
339 kHelRegNumber = kHelRegRdi,
340 kHelRegError = kHelRegRdi,
341
342 kHelRegArg0 = kHelRegRsi,
343 kHelRegArg1 = kHelRegRdx,
344 kHelRegArg2 = kHelRegRax,
345 kHelRegArg3 = kHelRegR8,
346 kHelRegArg4 = kHelRegR9,
347 kHelRegArg5 = kHelRegR10,
348 kHelRegArg6 = kHelRegR12,
349 kHelRegArg7 = kHelRegR13,
350 kHelRegArg8 = kHelRegR14,
351
352 kHelRegOut0 = kHelRegRsi,
353 kHelRegOut1 = kHelRegRdx,
354 kHelRegOut2 = kHelRegRax
355};
356
357#elif defined(__aarch64__)
358enum HelRegisterIndex {
359 kHelRegX0 = 0,
360 kHelRegX1,
361 kHelRegX2,
362 kHelRegX3,
363 kHelRegX4,
364 kHelRegX5,
365 kHelRegX6,
366 kHelRegX7,
367 kHelRegX8,
368 kHelRegX9,
369 kHelRegX10,
370 kHelRegX11,
371 kHelRegX12,
372 kHelRegX13,
373 kHelRegX14,
374 kHelRegX15,
375 kHelRegX16,
376 kHelRegX17,
377 kHelRegX18,
378 kHelRegX19,
379 kHelRegX20,
380 kHelRegX21,
381 kHelRegX22,
382 kHelRegX23,
383 kHelRegX24,
384 kHelRegX25,
385 kHelRegX26,
386 kHelRegX27,
387 kHelRegX28,
388 kHelRegX29,
389 kHelRegX30,
390
391 kHelNumGprs = 31,
392
393 kHelRegIp = 0,
394 kHelRegSp = 1
395};
396
397enum HelSyscallArgs {
398 kHelRegNumber = kHelRegX0,
399 kHelRegError = kHelRegX0,
400
401 kHelRegArg0 = kHelRegX1,
402 kHelRegArg1 = kHelRegX2,
403 kHelRegArg2 = kHelRegX3,
404 kHelRegArg3 = kHelRegX4,
405 kHelRegArg4 = kHelRegX5,
406 kHelRegArg5 = kHelRegX6,
407 kHelRegArg6 = kHelRegX7,
408 kHelRegArg7 = kHelRegX8,
409 kHelRegArg8 = kHelRegX9,
410
411 kHelRegOut0 = kHelRegX1,
412 kHelRegOut1 = kHelRegX2,
413 kHelRegOut2 = kHelRegX3
414};
415
416#elif defined(__riscv) && __riscv_xlen == 64
417enum HelRegisterIndex {
418 kHelRegRa = 0,
419 kHelRegGp,
420 kHelRegTp,
421 kHelRegT0,
422 kHelRegT1,
423 kHelRegT2,
424 kHelRegS0,
425 kHelRegS1,
426 kHelRegA0,
427 kHelRegA1,
428 kHelRegA2,
429 kHelRegA3,
430 kHelRegA4,
431 kHelRegA5,
432 kHelRegA6,
433 kHelRegA7,
434 kHelRegS2,
435 kHelRegS3,
436 kHelRegS4,
437 kHelRegS5,
438 kHelRegS6,
439 kHelRegS7,
440 kHelRegS8,
441 kHelRegS9,
442 kHelRegS10,
443 kHelRegS11,
444 kHelRegT3,
445 kHelRegT4,
446 kHelRegT5,
447 kHelRegT6,
448 kHelNumGprs,
449 kHelRegIp = 0,
450 kHelRegSp = 1
451};
452enum HelSyscallArgs {
453 kHelRegNumber = kHelRegA0,
454 kHelRegError = kHelRegA0,
455 kHelRegArg0 = kHelRegA1,
456 kHelRegArg1 = kHelRegA2,
457 kHelRegArg2 = kHelRegA3,
458 kHelRegArg3 = kHelRegA4,
459 kHelRegArg4 = kHelRegA5,
460 kHelRegArg5 = kHelRegA6,
461 kHelRegArg6 = kHelRegA7,
462 kHelRegArg7 = kHelRegS2,
463 kHelRegArg8 = kHelRegS3,
464
465 kHelRegOut0 = kHelRegA1,
466 kHelRegOut1 = kHelRegA2,
467 kHelRegOut2 = kHelRegA3
468};
469
470#endif
471
472struct HelQueueParameters {
473 uint32_t flags;
474 unsigned int numChunks;
475 size_t chunkSize;
476 unsigned int numSqChunks;
477};
478
480static const int kHelUserNotifyCqProgress = (1 << 0);
482static const int kHelUserNotifySupplySqChunks = (1 << 1);
484static const int kHelUserNotifyError = (1 << 14);
486static const int kHelUserNotifyAlert = (1 << 15);
487
489static const int kHelKernelNotifySqProgress = (1 << 0);
491static const int kHelKernelNotifySupplyCqChunks = (1 << 1);
492
494static const uint32_t kHelDriveWait = (1 << 0);
495
497static const uint32_t kHelSubmitCancel = 256;
499static const uint32_t kHelSubmitAsyncNop = 1;
501static const uint32_t kHelSubmitExchangeMsgs = 2;
503static const uint32_t kHelSubmitAwaitClock = 3;
505static const uint32_t kHelSubmitAwaitEvent = 4;
507static const uint32_t kHelSubmitProtectMemory = 5;
509static const uint32_t kHelSubmitSynchronizeSpace = 6;
511static const uint32_t kHelSubmitReadMemory = 7;
513static const uint32_t kHelSubmitWriteMemory = 8;
515static const uint32_t kHelSubmitManageMemory = 9;
517static const uint32_t kHelSubmitLockMemoryView = 10;
519static const uint32_t kHelSubmitObserve = 11;
521static const uint32_t kHelSubmitResizeMemory = 12;
523static const uint32_t kHelSubmitForkMemory = 13;
525static const uint32_t kHelSubmitWritebackFence = 14;
527static const uint32_t kHelSubmitInvalidateMemory = 15;
528
530struct HelQueue {
535
540
544
548};
549
551static const int kHelNextPresent = (1 << 24);
552
554static const int kHelProgressMask = 0xFFFFFF;
556static const int kHelProgressDone = (1 << 25);
558static const int kHelProgressFull = (1 << 26);
559
560struct HelChunk {
563 int next;
564
566 int progressFutex;
567
569 char buffer[];
570};
571
575 unsigned int length;
577 unsigned int opcode;
579 void *context;
580};
581
584 uint64_t cancellationTag;
585};
586
591 HelHandle lane;
593 size_t count;
595 uint32_t flags;
596};
597
601 uint64_t counter;
604};
605
609 HelHandle handle;
611 uint64_t sequence;
614};
615
619 HelHandle spaceHandle;
621 void *pointer;
623 size_t size;
625 uint32_t flags;
626};
627
631 HelHandle spaceHandle;
633 void *pointer;
635 size_t size;
636};
637
641 HelHandle handle;
643 uintptr_t address;
645 size_t length;
647 void *buffer;
648};
649
653 HelHandle handle;
655 uintptr_t address;
657 size_t length;
659 const void *buffer;
660};
661
665 HelHandle handle;
666};
667
671 HelHandle handle;
673 uintptr_t offset;
675 size_t size;
676};
677
681 HelHandle handle;
682};
683
687 HelHandle handle;
689 size_t newSize;
690};
691
695 HelHandle handle;
696};
697
701 HelHandle handle;
703 uintptr_t offset;
705 size_t size;
706};
707
711 HelHandle handle;
713 uintptr_t offset;
715 size_t size;
716};
717
718struct HelSimpleResult {
719 HelError error;
720 int reserved;
721};
722
723struct HelCredentialsResult {
724 HelError error;
725 int reserved;
726 char credentials[16];
727};
728
729struct HelManageResult {
730 HelError error;
731 int type;
732 uintptr_t offset;
733 size_t length;
734};
735
736struct HelObserveResult {
737 HelError error;
738 unsigned int observation;
739};
740
741struct HelInlineResult {
742 HelError error;
743 int reserved;
744 size_t length;
745 char data[];
746};
747
748struct HelInlineResultNoFlex {
749 HelError error;
750 int reserved;
751 size_t length;
752};
753
754struct HelLengthResult {
755 HelError error;
756 int reserved;
757 size_t length;
758};
759
760struct HelHandleResult {
761 HelError error;
762 int reserved;
763 HelHandle handle;
764};
765
766struct HelEventResult {
767 HelError error;
768 uint32_t bitset;
769 uint64_t sequence;
770};
771
772enum HelAckFlags {
773 kHelAckAcknowledge = 2,
774 kHelAckNack = 3,
775 kHelAckKick = 1,
776 kHelAckClear = 0x100,
777};
778
779union HelKernletData {
780 HelHandle handle;
781};
782
783struct HelThreadStats {
784 uint64_t userTime;
785};
786
787enum {
788 kHelVmexitHlt = 0,
789 kHelVmexitTranslationFault = 1,
790 kHelVmexitError = -1,
791 kHelVmexitUnknownPlatformSpecificExitCode = -2,
792};
793
794struct HelVmexitReason {
795 uint32_t exitReason;
796 uint32_t code;
797 size_t address;
798 size_t flags;
799};
800
801// see RFC 5424
802enum HelLogSeverity {
803 kHelLogSeverityEmergency,
804 kHelLogSeverityAlert,
805 kHelLogSeverityCritical,
806 kHelLogSeverityError,
807 kHelLogSeverityWarning,
808 kHelLogSeverityNotice,
809 kHelLogSeverityInfo,
810 kHelLogSeverityDebug,
811};
812
815
823HEL_C_LINKAGE HelError helLog(const enum HelLogSeverity severity, const char *string, size_t length);
824
830HEL_C_LINKAGE void helPanic(const char *string, size_t length)
831 __attribute__ (( noreturn ));
832
836
838HEL_C_LINKAGE HelError helNop();
839
843HEL_C_LINKAGE HelError helSubmitAsyncNop(HelHandle queueHandle, uintptr_t context);
844
848
852HEL_C_LINKAGE HelError helCreateUniverse(HelHandle *handle);
853
861HEL_C_LINKAGE HelError
862helTransferDescriptor(HelHandle handle, HelHandle universeHandle,
863 enum HelTransferDescriptorFlags direction, HelHandle *outHandle);
864
865HEL_C_LINKAGE HelError helDescriptorInfo(HelHandle handle, struct HelDescriptorInfo *info);
866
872HEL_C_LINKAGE HelError helGetCredentials(HelHandle handle, uint32_t flags,
873 char *credentials);
874
880HEL_C_LINKAGE HelError helCloseDescriptor(HelHandle universeHandle, HelHandle handle);
881
885
891HEL_C_LINKAGE HelError helCreateQueue(const struct HelQueueParameters *params,
892 HelHandle *handle);
893
905HEL_C_LINKAGE HelError helDriveQueue(HelHandle queueHandle, uint32_t flags, uint32_t notifyMask);
906
913HEL_C_LINKAGE HelError helAlertQueue(HelHandle queueHandle);
914
918
928HEL_C_LINKAGE HelError helAllocateMemory(size_t size, uint32_t flags,
929 const struct HelAllocRestrictions *restrictions, HelHandle *handle);
930
937HEL_C_LINKAGE HelError helResizeMemory(HelHandle handle, size_t newSize);
938
950HEL_C_LINKAGE HelError helCreateManagedMemory(size_t size, uint32_t flags,
951 HelHandle *backingHandle, HelHandle *frontalHandle);
952
963HEL_C_LINKAGE HelError helCopyOnWrite(HelHandle memory,
964 uintptr_t offset, size_t size, HelHandle *handle);
965
966HEL_C_LINKAGE HelError helAccessPhysical(uintptr_t physical,
967 size_t size, HelHandle *handle);
968
974HEL_C_LINKAGE HelError helCreateIndirectMemory(size_t numSlots, HelHandle *handle);
975
992HEL_C_LINKAGE HelError helAlterMemoryIndirection(HelHandle indirectHandle, size_t slotIndex,
993 HelHandle memoryHandle, uintptr_t offset, size_t size);
994
995HEL_C_LINKAGE HelError helCreateSliceView(HelHandle bundle, uintptr_t offset, size_t size,
996 uint32_t flags, HelHandle *handle);
997
1005HEL_C_LINKAGE HelError helForkMemory(HelHandle handle, HelHandle *forkedHandle);
1006
1010HEL_C_LINKAGE HelError helCreateSpace(HelHandle *handle);
1011
1029HEL_C_LINKAGE HelError helMapMemory(HelHandle memoryHandle, HelHandle spaceHandle,
1030 void *pointer, uintptr_t offset, size_t size, uint32_t flags, void **actualPointer);
1031
1032
1043HEL_C_LINKAGE HelError helUnmapMemory(HelHandle spaceHandle, void *pointer, size_t size);
1044
1045HEL_C_LINKAGE HelError helPointerPhysical(const void *pointer, uintptr_t *physical);
1046
1047HEL_C_LINKAGE HelError helMemoryInfo(HelHandle handle,
1048 size_t *size);
1049
1050HEL_C_LINKAGE HelError helUpdateMemory(HelHandle handle, int type, uintptr_t offset, size_t length);
1051
1062HEL_C_LINKAGE HelError helLoadahead(HelHandle handle, uintptr_t offset, size_t length);
1063
1064HEL_C_LINKAGE HelError helCreateVirtualizedSpace(HelHandle *handle);
1065
1069
1083HEL_C_LINKAGE HelError helCreateThread(HelHandle universe, HelHandle spaceHandle,
1084 HelAbi abi, void *ip, void *sp, uint32_t flags, HelHandle *handle);
1085
1091HEL_C_LINKAGE HelError helQueryThreadStats(HelHandle handle, struct HelThreadStats *stats);
1092
1101HEL_C_LINKAGE HelError helSetPriority(HelHandle handle, int priority);
1102
1104HEL_C_LINKAGE HelError helYield();
1105
1109HEL_C_LINKAGE HelError helKillThread(HelHandle handle);
1110
1117HEL_C_LINKAGE HelError helInterruptThread(HelHandle handle);
1118
1125HEL_C_LINKAGE HelError helResume(HelHandle handle);
1126
1134HEL_C_LINKAGE HelError helLoadRegisters(HelHandle handle, int set, void *image);
1135
1143HEL_C_LINKAGE HelError helStoreRegisters(HelHandle handle, int set, const void *image);
1144
1147// Register set to query information for.
1150HEL_C_LINKAGE HelError helQueryRegisterInfo(int set, struct HelRegisterInfo *info);
1151
1152HEL_C_LINKAGE HelError helWriteFsBase(void *pointer);
1153
1154HEL_C_LINKAGE HelError helReadFsBase(void **pointer);
1155
1156HEL_C_LINKAGE HelError helWriteGsBase(void *pointer);
1157
1158HEL_C_LINKAGE HelError helReadGsBase(void **pointer);
1159
1161HEL_C_LINKAGE HelError helGetCurrentCpu(int *cpu);
1162
1167HEL_C_LINKAGE HelError helGetClock(uint64_t *counter);
1168
1169HEL_C_LINKAGE HelError helCreateVirtualizedCpu(HelHandle handle, HelHandle *out_handle);
1170
1171HEL_C_LINKAGE HelError helRunVirtualizedCpu(HelHandle handle, struct HelVmexitReason *reason);
1172
1173HEL_C_LINKAGE HelError helGetRandomBytes(void *buffer, size_t wantedSize, size_t *actualSize);
1174
1184HEL_C_LINKAGE HelError helGetAffinity(HelHandle handle, uint8_t *mask, size_t size, size_t *actualSize);
1185
1193HEL_C_LINKAGE HelError helSetAffinity(HelHandle handle, uint8_t *mask, size_t size);
1194
1198
1206HEL_C_LINKAGE HelError helCreateStream(HelHandle *lane1, HelHandle *lane2, uint32_t attach_credentials);
1207
1208HEL_C_LINKAGE HelError helShutdownLane(HelHandle handle);
1209
1217HEL_C_LINKAGE HelError helCreateToken(HelHandle *handle);
1218
1222
1231HEL_C_LINKAGE HelError helFutexWait(int *pointer, int expected, int64_t deadline);
1232
1238HEL_C_LINKAGE HelError helFutexWake(int *pointer, unsigned int count);
1239
1243
1247HEL_C_LINKAGE HelError helCreateOneshotEvent(HelHandle *handle);
1248
1252HEL_C_LINKAGE HelError helCreateBitsetEvent(HelHandle *handle);
1253
1257HEL_C_LINKAGE HelError helRaiseEvent(HelHandle handle);
1258
1259HEL_C_LINKAGE HelError helAccessIrq(int number, HelHandle *handle);
1260
1261HEL_C_LINKAGE HelError helAcknowledgeIrq(HelHandle handle, uint32_t flags, uint64_t sequence);
1262
1263HEL_C_LINKAGE HelError helAutomateIrq(HelHandle handle, uint32_t flags, HelHandle kernlet);
1264
1268
1269HEL_C_LINKAGE HelError helAccessIo(uintptr_t *port_array, size_t num_ports,
1270 HelHandle *handle);
1271
1275HEL_C_LINKAGE HelError helEnableIo(HelHandle handle);
1276
1277HEL_C_LINKAGE HelError helEnableFullIo();
1278
1282
1292HEL_C_LINKAGE HelError helBindKernlet(HelHandle handle,
1293 const union HelKernletData *data, size_t numData, HelHandle *boundHandle);
1294
1296
1297extern inline __attribute__ (( always_inline )) const char *_helErrorString(HelError code) {
1298 switch(code) {
1299 case kHelErrNone:
1300 return "Success";
1301 case kHelErrIllegalSyscall:
1302 return "Illegal syscall";
1303 case kHelErrIllegalArgs:
1304 return "Illegal arguments";
1305 case kHelErrIllegalState:
1306 return "Illegal state";
1307 case kHelErrUnsupportedOperation:
1308 return "Unsupported operation";
1309 case kHelErrNoDescriptor:
1310 return "No such descriptor";
1311 case kHelErrBadDescriptor:
1312 return "Illegal descriptor for this operation";
1313 case kHelErrThreadTerminated:
1314 return "Thread terminated already";
1315 case kHelErrLaneShutdown:
1316 return "Lane shutdown";
1317 case kHelErrEndOfLane:
1318 return "End of lane";
1319 case kHelErrDismissed:
1320 return "IPC item dismissed by remote";
1321 case kHelErrBufferTooSmall:
1322 return "Buffer too small";
1323 case kHelErrQueueTooSmall:
1324 return "Buffer too small";
1325 case kHelErrFault:
1326 return "Segfault";
1327 case kHelErrNoHardwareSupport:
1328 return "Missing hardware support for this feature";
1329 case kHelErrNoMemory:
1330 return "Out of memory";
1331 case kHelErrTransmissionMismatch:
1332 return "Transmission mismatch";
1333 case kHelErrCancelled:
1334 return "Cancelled";
1335 case kHelErrOutOfBounds:
1336 return "Out of bounds";
1337 case kHelErrAlreadyExists:
1338 return "Already exists";
1339 default:
1340 return 0;
1341 }
1342}
1343
1344extern inline __attribute__ (( always_inline )) void _helCheckFailed(HelError err_code,
1345 const char *string, int fatal) {
1346 helLog(kHelLogSeverityError, string, strlen(string));
1347
1348 const char *err_string = _helErrorString(err_code);
1349 if(err_string == 0)
1350 err_string = "(Unexpected error code)";
1351 helLog(kHelLogSeverityError, err_string, strlen(err_string));
1352 helLog(kHelLogSeverityError, "\n", 1);
1353
1354 if(fatal)
1355 helPanic(0, 0);
1356}
1357
1358#define HEL_STRINGIFY_AUX(x) #x
1359#define HEL_STRINGIFY(x) HEL_STRINGIFY_AUX(x)
1360
1361#define HEL_CHECK(expr) do { HelError __error = expr; if(__error != kHelErrNone) \
1362 _helCheckFailed(__error, "HEL_CHECK failed: " #expr "\n" \
1363 " In file " __FILE__ " on line " HEL_STRINGIFY(__LINE__) "\n", 1); } while(0)
1364#define HEL_SOFT_CHECK(expr) do { HelError __error = expr; if(__error != kHelErrNone) \
1365 _helCheckFailed(__error, "HEL_SOFT_CHECK failed: " #expr "\n" \
1366 " In file " __FILE__ " on line " HEL_STRINGIFY(__LINE__) "\n", 0); } while(0)
1367
1368#endif // HEL_H
1369
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:486
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:489
static const uint32_t kHelSubmitInvalidateMemory
SQ opcode: invalidate memory.
Definition hel.h:527
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:513
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:499
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:554
static const uint32_t kHelSubmitManageMemory
SQ opcode: manage memory.
Definition hel.h:515
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:523
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:558
static const uint32_t kHelSubmitSynchronizeSpace
SQ opcode: synchronize space.
Definition hel.h:509
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:494
static const uint32_t kHelSubmitObserve
SQ opcode: observe thread.
Definition hel.h:519
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:501
static const uint32_t kHelSubmitReadMemory
SQ opcode: read memory.
Definition hel.h:511
static const int kHelNextPresent
Marks the next field as present.
Definition hel.h:551
static const int kHelKernelNotifySupplyCqChunks
Set in kernelNotify after userspace has supplied new chunks.
Definition hel.h:491
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:505
static const uint32_t kHelSubmitAwaitClock
SQ opcode: wait for time to pass.
Definition hel.h:503
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:507
static const int kHelUserNotifySupplySqChunks
Set in userNotify after kernel has supplied new SQ chunks.
Definition hel.h:482
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:480
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:525
static const uint32_t kHelSubmitResizeMemory
SQ opcode: resize memory.
Definition hel.h:521
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:517
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:556
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:484
static const uint32_t kHelSubmitCancel
SQ opcode: cancel an asynchronous operation.
Definition hel.h:497
A single element of a HelQueue.
Definition hel.h:573
unsigned int length
Length of the element in bytes.
Definition hel.h:575
void * context
User-defined value.
Definition hel.h:579
unsigned int opcode
Operation code (for SQ elements).
Definition hel.h:577
In-memory kernel/user-space queue.
Definition hel.h:530
int kernelNotify
Futex that is used to wake the kernel.
Definition hel.h:539
int userNotify
Futex that is used to wake userspace.
Definition hel.h:534
int cqFirst
Index of the first chunk of the completion queue.
Definition hel.h:543
int sqFirst
Index of the first chunk of the submission queue.
Definition hel.h:547
Register-related information returned by helQueryRegisterInfo.
Definition hel.h:309
int setSize
Size of the selected register set.
Definition hel.h:311
SQ data for kHelSubmitAwaitClock.
Definition hel.h:599
uint64_t cancellationTag
Tag to cancel this operation.
Definition hel.h:603
uint64_t counter
Deadline in nanoseconds since boot.
Definition hel.h:601
SQ data for kHelSubmitAwaitEvent.
Definition hel.h:607
HelHandle handle
Handle to the event descriptor.
Definition hel.h:609
uint64_t cancellationTag
Tag to cancel this operation.
Definition hel.h:613
uint64_t sequence
Previous sequence number.
Definition hel.h:611
SQ data for kHelSubmitCancel.
Definition hel.h:583
SQ data for kHelSubmitExchangeMsgs.
Definition hel.h:589
uint32_t flags
Flags.
Definition hel.h:595
size_t count
Number of actions.
Definition hel.h:593
HelHandle lane
Handle to the lane.
Definition hel.h:591
SQ data for kHelSubmitForkMemory.
Definition hel.h:693
HelHandle handle
Handle to the memory object.
Definition hel.h:695
SQ data for kHelSubmitInvalidateMemory.
Definition hel.h:709
HelHandle handle
Handle to the memory object.
Definition hel.h:711
size_t size
Size of the range.
Definition hel.h:715
uintptr_t offset
Offset within the memory object.
Definition hel.h:713
SQ data for kHelSubmitLockMemoryView.
Definition hel.h:669
size_t size
Size to lock.
Definition hel.h:675
uintptr_t offset
Offset within the memory object.
Definition hel.h:673
HelHandle handle
Handle to the memory object.
Definition hel.h:671
SQ data for kHelSubmitManageMemory.
Definition hel.h:663
HelHandle handle
Handle to the memory object.
Definition hel.h:665
SQ data for kHelSubmitObserve.
Definition hel.h:679
HelHandle handle
Handle to the thread.
Definition hel.h:681
SQ data for kHelSubmitProtectMemory.
Definition hel.h:617
size_t size
Size of the mapping.
Definition hel.h:623
void * pointer
Pointer to the mapping.
Definition hel.h:621
uint32_t flags
Protection flags.
Definition hel.h:625
HelHandle spaceHandle
Handle to the address space.
Definition hel.h:619
SQ data for kHelSubmitReadMemory.
Definition hel.h:639
uintptr_t address
Address within the memory object.
Definition hel.h:643
HelHandle handle
Handle to the memory object.
Definition hel.h:641
size_t length
Length in bytes.
Definition hel.h:645
void * buffer
Buffer to read into.
Definition hel.h:647
SQ data for kHelSubmitResizeMemory.
Definition hel.h:685
HelHandle handle
Handle to the memory object.
Definition hel.h:687
size_t newSize
New size in bytes.
Definition hel.h:689
SQ data for kHelSubmitSynchronizeSpace.
Definition hel.h:629
void * pointer
Pointer to the mapping.
Definition hel.h:633
size_t size
Size of the mapping.
Definition hel.h:635
HelHandle spaceHandle
Handle to the address space.
Definition hel.h:631
SQ data for kHelSubmitWriteMemory.
Definition hel.h:651
HelHandle handle
Handle to the memory object.
Definition hel.h:653
size_t length
Length in bytes.
Definition hel.h:657
const void * buffer
Buffer to write from.
Definition hel.h:659
uintptr_t address
Address within the memory object.
Definition hel.h:655
SQ data for kHelSubmitWritebackFence.
Definition hel.h:699
HelHandle handle
Handle to the memory object.
Definition hel.h:701
size_t size
Size of the range.
Definition hel.h:705
uintptr_t offset
Offset within the memory object.
Definition hel.h:703