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 kHelUserNotifyAlert = (1 << 15);
484
486static const int kHelKernelNotifySqProgress = (1 << 0);
488static const int kHelKernelNotifySupplyCqChunks = (1 << 1);
489
491static const uint32_t kHelDriveWaitCqProgress = (1 << 0);
492
494static const uint32_t kHelSubmitCancel = 256;
496static const uint32_t kHelSubmitAsyncNop = 1;
498static const uint32_t kHelSubmitExchangeMsgs = 2;
500static const uint32_t kHelSubmitAwaitClock = 3;
502static const uint32_t kHelSubmitAwaitEvent = 4;
504static const uint32_t kHelSubmitProtectMemory = 5;
506static const uint32_t kHelSubmitSynchronizeSpace = 6;
508static const uint32_t kHelSubmitReadMemory = 7;
510static const uint32_t kHelSubmitWriteMemory = 8;
512static const uint32_t kHelSubmitManageMemory = 9;
514static const uint32_t kHelSubmitLockMemoryView = 10;
516static const uint32_t kHelSubmitObserve = 11;
518static const uint32_t kHelSubmitResizeMemory = 12;
520static const uint32_t kHelSubmitForkMemory = 13;
521
523struct HelQueue {
528
533
537
541};
542
544static const int kHelNextPresent = (1 << 24);
545
547static const int kHelProgressMask = 0xFFFFFF;
549static const int kHelProgressDone = (1 << 25);
550
551struct HelChunk {
554 int next;
555
557 int progressFutex;
558
560 char buffer[];
561};
562
566 unsigned int length;
568 unsigned int opcode;
570 void *context;
571};
572
575 uint64_t cancellationTag;
576};
577
582 HelHandle lane;
584 size_t count;
586 uint32_t flags;
587};
588
592 uint64_t counter;
595};
596
600 HelHandle handle;
602 uint64_t sequence;
605};
606
610 HelHandle spaceHandle;
612 void *pointer;
614 size_t size;
616 uint32_t flags;
617};
618
622 HelHandle spaceHandle;
624 void *pointer;
626 size_t size;
627};
628
632 HelHandle handle;
634 uintptr_t address;
636 size_t length;
638 void *buffer;
639};
640
644 HelHandle handle;
646 uintptr_t address;
648 size_t length;
650 const void *buffer;
651};
652
656 HelHandle handle;
657};
658
662 HelHandle handle;
664 uintptr_t offset;
666 size_t size;
667};
668
672 HelHandle handle;
674 uint64_t sequence;
675};
676
680 HelHandle handle;
682 size_t newSize;
683};
684
688 HelHandle handle;
689};
690
691struct HelSimpleResult {
692 HelError error;
693 int reserved;
694};
695
696struct HelCredentialsResult {
697 HelError error;
698 int reserved;
699 char credentials[16];
700};
701
702struct HelManageResult {
703 HelError error;
704 int type;
705 uintptr_t offset;
706 size_t length;
707};
708
709struct HelObserveResult {
710 HelError error;
711 unsigned int observation;
712 uint64_t sequence;
713};
714
715struct HelInlineResult {
716 HelError error;
717 int reserved;
718 size_t length;
719 char data[];
720};
721
722struct HelInlineResultNoFlex {
723 HelError error;
724 int reserved;
725 size_t length;
726};
727
728struct HelLengthResult {
729 HelError error;
730 int reserved;
731 size_t length;
732};
733
734struct HelHandleResult {
735 HelError error;
736 int reserved;
737 HelHandle handle;
738};
739
740struct HelEventResult {
741 HelError error;
742 uint32_t bitset;
743 uint64_t sequence;
744};
745
746enum HelAckFlags {
747 kHelAckAcknowledge = 2,
748 kHelAckNack = 3,
749 kHelAckKick = 1,
750 kHelAckClear = 0x100,
751};
752
753union HelKernletData {
754 HelHandle handle;
755};
756
757struct HelThreadStats {
758 uint64_t userTime;
759};
760
761enum {
762 kHelVmexitHlt = 0,
763 kHelVmexitTranslationFault = 1,
764 kHelVmexitError = -1,
765 kHelVmexitUnknownPlatformSpecificExitCode = -2,
766};
767
768struct HelVmexitReason {
769 uint32_t exitReason;
770 uint32_t code;
771 size_t address;
772 size_t flags;
773};
774
775// see RFC 5424
776enum HelLogSeverity {
777 kHelLogSeverityEmergency,
778 kHelLogSeverityAlert,
779 kHelLogSeverityCritical,
780 kHelLogSeverityError,
781 kHelLogSeverityWarning,
782 kHelLogSeverityNotice,
783 kHelLogSeverityInfo,
784 kHelLogSeverityDebug,
785};
786
789
797HEL_C_LINKAGE HelError helLog(const enum HelLogSeverity severity, const char *string, size_t length);
798
804HEL_C_LINKAGE void helPanic(const char *string, size_t length)
805 __attribute__ (( noreturn ));
806
810
812HEL_C_LINKAGE HelError helNop();
813
817HEL_C_LINKAGE HelError helSubmitAsyncNop(HelHandle queueHandle, uintptr_t context);
818
822
826HEL_C_LINKAGE HelError helCreateUniverse(HelHandle *handle);
827
835HEL_C_LINKAGE HelError
836helTransferDescriptor(HelHandle handle, HelHandle universeHandle,
837 enum HelTransferDescriptorFlags direction, HelHandle *outHandle);
838
839HEL_C_LINKAGE HelError helDescriptorInfo(HelHandle handle, struct HelDescriptorInfo *info);
840
846HEL_C_LINKAGE HelError helGetCredentials(HelHandle handle, uint32_t flags,
847 char *credentials);
848
854HEL_C_LINKAGE HelError helCloseDescriptor(HelHandle universeHandle, HelHandle handle);
855
859
865HEL_C_LINKAGE HelError helCreateQueue(const struct HelQueueParameters *params,
866 HelHandle *handle);
867
877HEL_C_LINKAGE HelError helDriveQueue(HelHandle queueHandle, uint32_t flags);
878
885HEL_C_LINKAGE HelError helAlertQueue(HelHandle queueHandle);
886
890
900HEL_C_LINKAGE HelError helAllocateMemory(size_t size, uint32_t flags,
901 const struct HelAllocRestrictions *restrictions, HelHandle *handle);
902
909HEL_C_LINKAGE HelError helResizeMemory(HelHandle handle, size_t newSize);
910
922HEL_C_LINKAGE HelError helCreateManagedMemory(size_t size, uint32_t flags,
923 HelHandle *backingHandle, HelHandle *frontalHandle);
924
935HEL_C_LINKAGE HelError helCopyOnWrite(HelHandle memory,
936 uintptr_t offset, size_t size, HelHandle *handle);
937
938HEL_C_LINKAGE HelError helAccessPhysical(uintptr_t physical,
939 size_t size, HelHandle *handle);
940
946HEL_C_LINKAGE HelError helCreateIndirectMemory(size_t numSlots, HelHandle *handle);
947
964HEL_C_LINKAGE HelError helAlterMemoryIndirection(HelHandle indirectHandle, size_t slotIndex,
965 HelHandle memoryHandle, uintptr_t offset, size_t size);
966
967HEL_C_LINKAGE HelError helCreateSliceView(HelHandle bundle, uintptr_t offset, size_t size,
968 uint32_t flags, HelHandle *handle);
969
977HEL_C_LINKAGE HelError helForkMemory(HelHandle handle, HelHandle *forkedHandle);
978
982HEL_C_LINKAGE HelError helCreateSpace(HelHandle *handle);
983
1001HEL_C_LINKAGE HelError helMapMemory(HelHandle memoryHandle, HelHandle spaceHandle,
1002 void *pointer, uintptr_t offset, size_t size, uint32_t flags, void **actualPointer);
1003
1004
1015HEL_C_LINKAGE HelError helUnmapMemory(HelHandle spaceHandle, void *pointer, size_t size);
1016
1017HEL_C_LINKAGE HelError helPointerPhysical(const void *pointer, uintptr_t *physical);
1018
1019HEL_C_LINKAGE HelError helMemoryInfo(HelHandle handle,
1020 size_t *size);
1021
1022HEL_C_LINKAGE HelError helUpdateMemory(HelHandle handle, int type, uintptr_t offset, size_t length);
1023
1034HEL_C_LINKAGE HelError helLoadahead(HelHandle handle, uintptr_t offset, size_t length);
1035
1036HEL_C_LINKAGE HelError helCreateVirtualizedSpace(HelHandle *handle);
1037
1041
1055HEL_C_LINKAGE HelError helCreateThread(HelHandle universe, HelHandle spaceHandle,
1056 HelAbi abi, void *ip, void *sp, uint32_t flags, HelHandle *handle);
1057
1063HEL_C_LINKAGE HelError helQueryThreadStats(HelHandle handle, struct HelThreadStats *stats);
1064
1073HEL_C_LINKAGE HelError helSetPriority(HelHandle handle, int priority);
1074
1076HEL_C_LINKAGE HelError helYield();
1077
1081HEL_C_LINKAGE HelError helKillThread(HelHandle handle);
1082
1089HEL_C_LINKAGE HelError helInterruptThread(HelHandle handle);
1090
1097HEL_C_LINKAGE HelError helResume(HelHandle handle);
1098
1106HEL_C_LINKAGE HelError helLoadRegisters(HelHandle handle, int set, void *image);
1107
1115HEL_C_LINKAGE HelError helStoreRegisters(HelHandle handle, int set, const void *image);
1116
1119// Register set to query information for.
1122HEL_C_LINKAGE HelError helQueryRegisterInfo(int set, struct HelRegisterInfo *info);
1123
1124HEL_C_LINKAGE HelError helWriteFsBase(void *pointer);
1125
1126HEL_C_LINKAGE HelError helReadFsBase(void **pointer);
1127
1128HEL_C_LINKAGE HelError helWriteGsBase(void *pointer);
1129
1130HEL_C_LINKAGE HelError helReadGsBase(void **pointer);
1131
1133HEL_C_LINKAGE HelError helGetCurrentCpu(int *cpu);
1134
1139HEL_C_LINKAGE HelError helGetClock(uint64_t *counter);
1140
1141HEL_C_LINKAGE HelError helCreateVirtualizedCpu(HelHandle handle, HelHandle *out_handle);
1142
1143HEL_C_LINKAGE HelError helRunVirtualizedCpu(HelHandle handle, struct HelVmexitReason *reason);
1144
1145HEL_C_LINKAGE HelError helGetRandomBytes(void *buffer, size_t wantedSize, size_t *actualSize);
1146
1156HEL_C_LINKAGE HelError helGetAffinity(HelHandle handle, uint8_t *mask, size_t size, size_t *actualSize);
1157
1165HEL_C_LINKAGE HelError helSetAffinity(HelHandle handle, uint8_t *mask, size_t size);
1166
1170
1178HEL_C_LINKAGE HelError helCreateStream(HelHandle *lane1, HelHandle *lane2, uint32_t attach_credentials);
1179
1180HEL_C_LINKAGE HelError helShutdownLane(HelHandle handle);
1181
1189HEL_C_LINKAGE HelError helCreateToken(HelHandle *handle);
1190
1194
1203HEL_C_LINKAGE HelError helFutexWait(int *pointer, int expected, int64_t deadline);
1204
1210HEL_C_LINKAGE HelError helFutexWake(int *pointer, unsigned int count);
1211
1215
1219HEL_C_LINKAGE HelError helCreateOneshotEvent(HelHandle *handle);
1220
1224HEL_C_LINKAGE HelError helCreateBitsetEvent(HelHandle *handle);
1225
1229HEL_C_LINKAGE HelError helRaiseEvent(HelHandle handle);
1230
1231HEL_C_LINKAGE HelError helAccessIrq(int number, HelHandle *handle);
1232
1233HEL_C_LINKAGE HelError helAcknowledgeIrq(HelHandle handle, uint32_t flags, uint64_t sequence);
1234
1235HEL_C_LINKAGE HelError helAutomateIrq(HelHandle handle, uint32_t flags, HelHandle kernlet);
1236
1240
1241HEL_C_LINKAGE HelError helAccessIo(uintptr_t *port_array, size_t num_ports,
1242 HelHandle *handle);
1243
1247HEL_C_LINKAGE HelError helEnableIo(HelHandle handle);
1248
1249HEL_C_LINKAGE HelError helEnableFullIo();
1250
1254
1264HEL_C_LINKAGE HelError helBindKernlet(HelHandle handle,
1265 const union HelKernletData *data, size_t numData, HelHandle *boundHandle);
1266
1268
1269extern inline __attribute__ (( always_inline )) const char *_helErrorString(HelError code) {
1270 switch(code) {
1271 case kHelErrNone:
1272 return "Success";
1273 case kHelErrIllegalSyscall:
1274 return "Illegal syscall";
1275 case kHelErrIllegalArgs:
1276 return "Illegal arguments";
1277 case kHelErrIllegalState:
1278 return "Illegal state";
1279 case kHelErrUnsupportedOperation:
1280 return "Unsupported operation";
1281 case kHelErrNoDescriptor:
1282 return "No such descriptor";
1283 case kHelErrBadDescriptor:
1284 return "Illegal descriptor for this operation";
1285 case kHelErrThreadTerminated:
1286 return "Thread terminated already";
1287 case kHelErrLaneShutdown:
1288 return "Lane shutdown";
1289 case kHelErrEndOfLane:
1290 return "End of lane";
1291 case kHelErrDismissed:
1292 return "IPC item dismissed by remote";
1293 case kHelErrBufferTooSmall:
1294 return "Buffer too small";
1295 case kHelErrQueueTooSmall:
1296 return "Buffer too small";
1297 case kHelErrFault:
1298 return "Segfault";
1299 case kHelErrNoHardwareSupport:
1300 return "Missing hardware support for this feature";
1301 case kHelErrNoMemory:
1302 return "Out of memory";
1303 case kHelErrTransmissionMismatch:
1304 return "Transmission mismatch";
1305 case kHelErrCancelled:
1306 return "Cancelled";
1307 case kHelErrOutOfBounds:
1308 return "Out of bounds";
1309 case kHelErrAlreadyExists:
1310 return "Already exists";
1311 default:
1312 return 0;
1313 }
1314}
1315
1316extern inline __attribute__ (( always_inline )) void _helCheckFailed(HelError err_code,
1317 const char *string, int fatal) {
1318 helLog(kHelLogSeverityError, string, strlen(string));
1319
1320 const char *err_string = _helErrorString(err_code);
1321 if(err_string == 0)
1322 err_string = "(Unexpected error code)";
1323 helLog(kHelLogSeverityError, err_string, strlen(err_string));
1324 helLog(kHelLogSeverityError, "\n", 1);
1325
1326 if(fatal)
1327 helPanic(0, 0);
1328}
1329
1330#define HEL_STRINGIFY_AUX(x) #x
1331#define HEL_STRINGIFY(x) HEL_STRINGIFY_AUX(x)
1332
1333#define HEL_CHECK(expr) do { HelError __error = expr; if(__error != kHelErrNone) \
1334 _helCheckFailed(__error, "HEL_CHECK failed: " #expr "\n" \
1335 " In file " __FILE__ " on line " HEL_STRINGIFY(__LINE__) "\n", 1); } while(0)
1336#define HEL_SOFT_CHECK(expr) do { HelError __error = expr; if(__error != kHelErrNone) \
1337 _helCheckFailed(__error, "HEL_SOFT_CHECK failed: " #expr "\n" \
1338 " In file " __FILE__ " on line " HEL_STRINGIFY(__LINE__) "\n", 0); } while(0)
1339
1340#endif // HEL_H
1341
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:483
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:486
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.
HEL_C_LINKAGE HelError helDriveQueue(HelHandle queueHandle, uint32_t flags)
Drives an IPC queue.
static const uint32_t kHelSubmitWriteMemory
SQ opcode: write memory.
Definition hel.h:510
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:496
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:547
static const uint32_t kHelSubmitManageMemory
SQ opcode: manage memory.
Definition hel.h:512
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:520
HEL_C_LINKAGE HelError helInterruptThread(HelHandle handle)
Interrupt a thread.
static const uint32_t kHelSubmitSynchronizeSpace
SQ opcode: synchronize space.
Definition hel.h:506
HEL_C_LINKAGE HelError helRaiseEvent(HelHandle handle)
Raise an event.
static const uint32_t kHelSubmitObserve
SQ opcode: observe thread.
Definition hel.h:516
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:498
static const uint32_t kHelSubmitReadMemory
SQ opcode: read memory.
Definition hel.h:508
static const int kHelNextPresent
Marks the next field as present.
Definition hel.h:544
static const int kHelKernelNotifySupplyCqChunks
Set in kernelNotify after userspace has supplied new chunks.
Definition hel.h:488
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:502
static const uint32_t kHelSubmitAwaitClock
SQ opcode: wait for time to pass.
Definition hel.h:500
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:504
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 kHelSubmitResizeMemory
SQ opcode: resize memory.
Definition hel.h:518
HEL_C_LINKAGE HelError helCreateOneshotEvent(HelHandle *handle)
Create an event that fires at most once.
static const uint32_t kHelSubmitLockMemoryView
SQ opcode: lock memory view.
Definition hel.h:514
HEL_C_LINKAGE HelError helCreateUniverse(HelHandle *handle)
Creates a new universe descriptor.
static const int kHelProgressDone
Set by the kernel once it retires the chunk.
Definition hel.h:549
HEL_C_LINKAGE HelError helEnableIo(HelHandle handle)
Enable userspace access to hardware I/O resources.
static const uint32_t kHelSubmitCancel
SQ opcode: cancel an asynchronous operation.
Definition hel.h:494
static const uint32_t kHelDriveWaitCqProgress
Flag for helDriveQueue: wait until completion queue has progress.
Definition hel.h:491
A single element of a HelQueue.
Definition hel.h:564
unsigned int length
Length of the element in bytes.
Definition hel.h:566
void * context
User-defined value.
Definition hel.h:570
unsigned int opcode
Operation code (for SQ elements).
Definition hel.h:568
In-memory kernel/user-space queue.
Definition hel.h:523
int kernelNotify
Futex that is used to wake the kernel.
Definition hel.h:532
int userNotify
Futex that is used to wake userspace.
Definition hel.h:527
int cqFirst
Index of the first chunk of the completion queue.
Definition hel.h:536
int sqFirst
Index of the first chunk of the submission queue.
Definition hel.h:540
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:590
uint64_t cancellationTag
Tag to cancel this operation.
Definition hel.h:594
uint64_t counter
Deadline in nanoseconds since boot.
Definition hel.h:592
SQ data for kHelSubmitAwaitEvent.
Definition hel.h:598
HelHandle handle
Handle to the event descriptor.
Definition hel.h:600
uint64_t cancellationTag
Tag to cancel this operation.
Definition hel.h:604
uint64_t sequence
Previous sequence number.
Definition hel.h:602
SQ data for kHelSubmitCancel.
Definition hel.h:574
SQ data for kHelSubmitExchangeMsgs.
Definition hel.h:580
uint32_t flags
Flags.
Definition hel.h:586
size_t count
Number of actions.
Definition hel.h:584
HelHandle lane
Handle to the lane.
Definition hel.h:582
SQ data for kHelSubmitForkMemory.
Definition hel.h:686
HelHandle handle
Handle to the memory object.
Definition hel.h:688
SQ data for kHelSubmitLockMemoryView.
Definition hel.h:660
size_t size
Size to lock.
Definition hel.h:666
uintptr_t offset
Offset within the memory object.
Definition hel.h:664
HelHandle handle
Handle to the memory object.
Definition hel.h:662
SQ data for kHelSubmitManageMemory.
Definition hel.h:654
HelHandle handle
Handle to the memory object.
Definition hel.h:656
SQ data for kHelSubmitObserve.
Definition hel.h:670
HelHandle handle
Handle to the thread.
Definition hel.h:672
uint64_t sequence
Input sequence number.
Definition hel.h:674
SQ data for kHelSubmitProtectMemory.
Definition hel.h:608
size_t size
Size of the mapping.
Definition hel.h:614
void * pointer
Pointer to the mapping.
Definition hel.h:612
uint32_t flags
Protection flags.
Definition hel.h:616
HelHandle spaceHandle
Handle to the address space.
Definition hel.h:610
SQ data for kHelSubmitReadMemory.
Definition hel.h:630
uintptr_t address
Address within the memory object.
Definition hel.h:634
HelHandle handle
Handle to the memory object.
Definition hel.h:632
size_t length
Length in bytes.
Definition hel.h:636
void * buffer
Buffer to read into.
Definition hel.h:638
SQ data for kHelSubmitResizeMemory.
Definition hel.h:678
HelHandle handle
Handle to the memory object.
Definition hel.h:680
size_t newSize
New size in bytes.
Definition hel.h:682
SQ data for kHelSubmitSynchronizeSpace.
Definition hel.h:620
void * pointer
Pointer to the mapping.
Definition hel.h:624
size_t size
Size of the mapping.
Definition hel.h:626
HelHandle spaceHandle
Handle to the address space.
Definition hel.h:622
SQ data for kHelSubmitWriteMemory.
Definition hel.h:642
HelHandle handle
Handle to the memory object.
Definition hel.h:644
size_t length
Length in bytes.
Definition hel.h:648
const void * buffer
Buffer to write from.
Definition hel.h:650
uintptr_t address
Address within the memory object.
Definition hel.h:646