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 = 105,
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 kHelCallCancelAsync = 92,
37
38 kHelCallAllocateMemory = 51,
39 kHelCallResizeMemory = 83,
40 kHelCallCreateManagedMemory = 64,
41 kHelCallCopyOnWrite = 39,
42 kHelCallAccessPhysical = 30,
43 kHelCallCreateSliceView = 88,
44 kHelCallForkMemory = 40,
45 kHelCallCreateSpace = 27,
46 kHelCallCreateIndirectMemory = 45,
47 kHelCallAlterMemoryIndirection = 52,
48 kHelCallMapMemory = 44,
49 kHelCallSubmitProtectMemory = 99,
50 kHelCallSubmitSynchronizeSpace = 53,
51 kHelCallUnmapMemory = 36,
52 kHelCallPointerPhysical = 43,
53 kHelCallSubmitReadMemory = 77,
54 kHelCallSubmitWriteMemory = 78,
55 kHelCallMemoryInfo = 26,
56 kHelCallSubmitManageMemory = 46,
57 kHelCallUpdateMemory = 47,
58 kHelCallSubmitLockMemoryView = 48,
59 kHelCallLoadahead = 49,
60 kHelCallCreateVirtualizedSpace = 50,
61
62 kHelCallCreateThread = 67,
63 kHelCallQueryThreadStats = 95,
64 kHelCallSetPriority = 85,
65 kHelCallYield = 34,
66 kHelCallSubmitObserve = 74,
67 kHelCallKillThread = 87,
68 kHelCallInterruptThread = 86,
69 kHelCallResume = 61,
70 kHelCallLoadRegisters = 75,
71 kHelCallStoreRegisters = 76,
72 kHelCallQueryRegisterInfo = 102,
73 kHelCallWriteFsBase = 41,
74 kHelCallGetClock = 42,
75 kHelCallSubmitAwaitClock = 80,
76 kHelCallCreateVirtualizedCpu = 37,
77 kHelCallRunVirtualizedCpu = 38,
78 kHelCallGetRandomBytes = 101,
79 kHelCallWriteGsBase = 54,
80 kHelCallReadFsBase = 55,
81 kHelCallReadGsBase = 56,
82 kHelCallGetCurrentCpu = 57,
83
84 kHelCallCreateStream = 68,
85 kHelCallSubmitAsync = 79,
86 kHelCallShutdownLane = 91,
87
88 kHelCallFutexWait = 73,
89 kHelCallFutexWake = 71,
90
91 kHelCallCreateOneshotEvent = 96,
92 kHelCallCreateBitsetEvent = 97,
93 kHelCallRaiseEvent = 98,
94 kHelCallAccessIrq = 14,
95 kHelCallAcknowledgeIrq = 81,
96 kHelCallSubmitAwaitEvent = 82,
97 kHelCallAutomateIrq = 94,
98
99 kHelCallAccessIo = 11,
100 kHelCallEnableIo = 12,
101 kHelCallEnableFullIo = 35,
102
103 kHelCallBindKernlet = 93,
104
105 kHelCallGetAffinity = 103,
106 kHelCallSetAffinity = 100,
107
108 kHelCallCreateToken = 104,
109
110 kHelCallSuper = 0x80000000
111};
112
113enum {
114 kHelErrNone = 0,
115 kHelErrBufferTooSmall = 1,
116 kHelErrBadDescriptor = 2,
117 kHelErrTimeout = 3,
118 kHelErrNoDescriptor = 4,
119 kHelErrIllegalSyscall = 5,
120 kHelErrIllegalArgs = 7,
121 kHelErrLaneShutdown = 8,
122 kHelErrEndOfLane = 9,
123 kHelErrFault = 10,
124 kHelErrThreadTerminated = 11,
125 kHelErrCancelled = 12,
126 kHelErrTransmissionMismatch = 13,
127 kHelErrQueueTooSmall = 14,
128 kHelErrIllegalState = 15,
129 kHelErrNoHardwareSupport = 16,
130 kHelErrNoMemory = 17,
131 kHelErrUnsupportedOperation = 18,
132 kHelErrOutOfBounds = 19,
133 kHelErrDismissed = 20,
134 kHelErrRemoteFault = 21,
135 kHelErrAlreadyExists = 22
136};
137
138struct HelX86SegmentRegister {
139 uint64_t base;
140 uint32_t limit;
141 uint16_t selector;
142 uint8_t type, present, dpl, db, s, l, g, avl;
143};
144
145struct HelX86DescriptorTable {
146 uint64_t base;
147 uint16_t limit;
148};
149
150struct HelX86VirtualizationRegs {
151 uint64_t rax;
152 uint64_t rbx;
153 uint64_t rcx;
154 uint64_t rdx;
155 uint64_t rsi;
156 uint64_t rdi;
157 uint64_t rbp;
158 uint64_t r8;
159 uint64_t r9;
160 uint64_t r10;
161 uint64_t r11;
162 uint64_t r12;
163 uint64_t r13;
164 uint64_t r14;
165 uint64_t r15;
166
167 uint64_t rsp;
168 uint64_t rip;
169 uint64_t rflags;
170
171 struct HelX86SegmentRegister cs, ds, es, fs, gs, ss;
172 struct HelX86SegmentRegister tr, ldt;
173 struct HelX86DescriptorTable gdt, idt;
174
175 uint64_t cr0, cr2, cr3, cr4, cr8;
176 uint64_t efer;
177 uint64_t apic_base;
178};
179
180enum {
181 kHelNullHandle = 0,
182 kHelThisUniverse = -1,
183 kHelThisThread = -2,
184 kHelZeroMemory = -3
185};
186
187enum {
188 kHelWaitInfinite = -1
189};
190
191enum {
192 kHelAbiSystemV = 1
193};
194
195enum {
196 kHelActionNone = 0,
197 kHelActionDismiss = 11,
198 kHelActionOffer = 5,
199 kHelActionAccept = 6,
200 kHelActionImbueCredentials = 8,
201 kHelActionExtractCredentials = 9,
202 kHelActionSendFromBuffer = 1,
203 kHelActionSendFromBufferSg = 10,
204 kHelActionRecvInline = 7,
205 kHelActionRecvToBuffer = 3,
206 kHelActionPushDescriptor = 2,
207 kHelActionPullDescriptor = 4
208};
209
210enum {
211 kHelItemChain = 1,
212 kHelItemAncillary = 2,
213 kHelItemWantLane = (1 << 16),
214};
215
216enum HelTransferDescriptorFlags {
217 kHelTransferDescriptorOut,
218 kHelTransferDescriptorIn,
219};
220
221struct HelSgItem {
222 void *buffer;
223 size_t length;
224};
225
226struct HelAction {
227 int type;
228 uint32_t flags;
229 // TODO: the following fields could be put into unions
230 void *buffer;
231 size_t length;
232 HelHandle handle;
233};
234
235struct HelDescriptorInfo {
236 int type;
237};
238
239enum HelAllocFlags {
240 kHelAllocContinuous = 4,
241 kHelAllocOnDemand = 1,
242};
243
244struct HelAllocRestrictions {
245 int addressBits;
246};
247
248enum HelManagedFlags {
249 kHelManagedReadahead = 1
250};
251
252enum HelManageRequests {
253 kHelManageInitialize = 1,
254 kHelManageWriteback = 2
255};
256
257enum HelMapFlags {
258 // Additional flags that may be set.
259 kHelMapProtRead = 256,
260 kHelMapProtWrite = 512,
261 kHelMapProtExecute = 1024,
262 kHelMapDontRequireBacking = 128,
263 kHelMapFixed = 2048,
264 kHelMapFixedNoReplace = 4096
265};
266
267enum HelSliceFlags {
268 kHelSliceCacheWriteCombine = 1,
269};
270
271enum HelThreadFlags {
272 kHelThreadStopped = 1
273};
274
275enum HelObservation {
276 kHelObserveNull = 0,
277 kHelObserveInterrupt = 4,
278 kHelObservePanic = 3,
279 kHelObserveBreakpoint = 1,
280 kHelObservePageFault = 2,
281 kHelObserveGeneralFault = 5,
282 kHelObserveIllegalInstruction = 6,
283 kHelObserveDivByZero = 7,
284 kHelObserveSuperCall = 0x80000000
285};
286
287enum HelRegisterSets {
288 kHelRegsProgram = 1,
289 kHelRegsGeneral = 2,
290 kHelRegsThread = 3,
291 kHelRegsDebug = 4,
292 kHelRegsVirtualization = 5,
293 kHelRegsSimd = 6,
294 kHelRegsSignal = 7,
295 kHelRegsPageFault = 8
296};
297
298enum HelPageFaultFlags {
299 kHelPageFaultMapError = 1,
300 kHelPageFaultAccessError = 2
301};
302
307};
308
309#if defined(__x86_64__)
310enum HelRegisterIndex {
311 kHelRegRax = 0,
312 kHelRegRbx = 1,
313 kHelRegRcx = 2,
314 kHelRegRdx = 3,
315 kHelRegRdi = 4,
316 kHelRegRsi = 5,
317 kHelRegR8 = 6,
318 kHelRegR9 = 7,
319 kHelRegR10 = 8,
320 kHelRegR11 = 9,
321 kHelRegR12 = 10,
322 kHelRegR13 = 11,
323 kHelRegR14 = 12,
324 kHelRegR15 = 13,
325 kHelRegRbp = 14,
326
327 kHelNumGprs = 15,
328
329 kHelRegIp = 0,
330 kHelRegSp = 1
331};
332
333enum HelSyscallArgs {
334 kHelRegNumber = kHelRegRdi,
335 kHelRegError = kHelRegRdi,
336
337 kHelRegArg0 = kHelRegRsi,
338 kHelRegArg1 = kHelRegRdx,
339 kHelRegArg2 = kHelRegRax,
340 kHelRegArg3 = kHelRegR8,
341 kHelRegArg4 = kHelRegR9,
342 kHelRegArg5 = kHelRegR10,
343 kHelRegArg6 = kHelRegR12,
344 kHelRegArg7 = kHelRegR13,
345 kHelRegArg8 = kHelRegR14,
346
347 kHelRegOut0 = kHelRegRsi,
348 kHelRegOut1 = kHelRegRdx
349};
350
351#elif defined(__aarch64__)
352enum HelRegisterIndex {
353 kHelRegX0 = 0,
354 kHelRegX1,
355 kHelRegX2,
356 kHelRegX3,
357 kHelRegX4,
358 kHelRegX5,
359 kHelRegX6,
360 kHelRegX7,
361 kHelRegX8,
362 kHelRegX9,
363 kHelRegX10,
364 kHelRegX11,
365 kHelRegX12,
366 kHelRegX13,
367 kHelRegX14,
368 kHelRegX15,
369 kHelRegX16,
370 kHelRegX17,
371 kHelRegX18,
372 kHelRegX19,
373 kHelRegX20,
374 kHelRegX21,
375 kHelRegX22,
376 kHelRegX23,
377 kHelRegX24,
378 kHelRegX25,
379 kHelRegX26,
380 kHelRegX27,
381 kHelRegX28,
382 kHelRegX29,
383 kHelRegX30,
384
385 kHelNumGprs = 31,
386
387 kHelRegIp = 0,
388 kHelRegSp = 1
389};
390
391enum HelSyscallArgs {
392 kHelRegNumber = kHelRegX0,
393 kHelRegError = kHelRegX0,
394
395 kHelRegArg0 = kHelRegX1,
396 kHelRegArg1 = kHelRegX2,
397 kHelRegArg2 = kHelRegX3,
398 kHelRegArg3 = kHelRegX4,
399 kHelRegArg4 = kHelRegX5,
400 kHelRegArg5 = kHelRegX6,
401 kHelRegArg6 = kHelRegX7,
402 kHelRegArg7 = kHelRegX8,
403 kHelRegArg8 = kHelRegX9,
404
405 kHelRegOut0 = kHelRegX1,
406 kHelRegOut1 = kHelRegX2
407};
408
409#elif defined(__riscv) && __riscv_xlen == 64
410enum HelRegisterIndex {
411 kHelRegRa = 0,
412 kHelRegGp,
413 kHelRegTp,
414 kHelRegT0,
415 kHelRegT1,
416 kHelRegT2,
417 kHelRegS0,
418 kHelRegS1,
419 kHelRegA0,
420 kHelRegA1,
421 kHelRegA2,
422 kHelRegA3,
423 kHelRegA4,
424 kHelRegA5,
425 kHelRegA6,
426 kHelRegA7,
427 kHelRegS2,
428 kHelRegS3,
429 kHelRegS4,
430 kHelRegS5,
431 kHelRegS6,
432 kHelRegS7,
433 kHelRegS8,
434 kHelRegS9,
435 kHelRegS10,
436 kHelRegS11,
437 kHelRegT3,
438 kHelRegT4,
439 kHelRegT5,
440 kHelRegT6,
441 kHelNumGprs,
442 kHelRegIp = 0,
443 kHelRegSp = 1
444};
445enum HelSyscallArgs {
446 kHelRegNumber = kHelRegA0,
447 kHelRegError = kHelRegA0,
448 kHelRegArg0 = kHelRegA1,
449 kHelRegArg1 = kHelRegA2,
450 kHelRegArg2 = kHelRegA3,
451 kHelRegArg3 = kHelRegA4,
452 kHelRegArg4 = kHelRegA5,
453 kHelRegArg5 = kHelRegA6,
454 kHelRegArg6 = kHelRegA7,
455 kHelRegArg7 = kHelRegS2,
456 kHelRegArg8 = kHelRegS3,
457 kHelRegOut0 = kHelRegA1,
458 kHelRegOut1 = kHelRegA2
459};
460
461#endif
462
463struct HelQueueParameters {
464 uint32_t flags;
465 unsigned int ringShift;
466 unsigned int numChunks;
467 size_t chunkSize;
468};
469
471static const int kHelHeadMask = 0xFFFFFF;
472
474static const int kHelHeadWaiters = (1 << 24);
475
477struct HelQueue {
480
482 char padding[4];
483
486};
487
489static const int kHelProgressMask = 0xFFFFFF;
490
492static const int kHelProgressWaiters = (1 << 24);
493
495static const int kHelProgressDone = (1 << 25);
496
497struct HelChunk {
499 int progressFutex;
500
502 char padding[4];
503
505 char buffer[];
506};
507
511 unsigned int length;
512 unsigned int reserved;
514 void *context;
515};
516
517struct HelSimpleResult {
518 HelError error;
519 int reserved;
520};
521
522struct HelCredentialsResult {
523 HelError error;
524 int reserved;
525 char credentials[16];
526};
527
528struct HelManageResult {
529 HelError error;
530 int type;
531 uintptr_t offset;
532 size_t length;
533};
534
535struct HelObserveResult {
536 HelError error;
537 unsigned int observation;
538 uint64_t sequence;
539};
540
541struct HelInlineResult {
542 HelError error;
543 int reserved;
544 size_t length;
545 char data[];
546};
547
548struct HelInlineResultNoFlex {
549 HelError error;
550 int reserved;
551 size_t length;
552};
553
554struct HelLengthResult {
555 HelError error;
556 int reserved;
557 size_t length;
558};
559
560struct HelHandleResult {
561 HelError error;
562 int reserved;
563 HelHandle handle;
564};
565
566struct HelEventResult {
567 HelError error;
568 uint32_t bitset;
569 uint64_t sequence;
570};
571
572enum HelAckFlags {
573 kHelAckAcknowledge = 2,
574 kHelAckNack = 3,
575 kHelAckKick = 1,
576 kHelAckClear = 0x100,
577};
578
579union HelKernletData {
580 HelHandle handle;
581};
582
583struct HelThreadStats {
584 uint64_t userTime;
585};
586
587enum {
588 kHelVmexitHlt = 0,
589 kHelVmexitTranslationFault = 1,
590 kHelVmexitError = -1,
591 kHelVmexitUnknownPlatformSpecificExitCode = -2,
592};
593
594struct HelVmexitReason {
595 uint32_t exitReason;
596 uint32_t code;
597 size_t address;
598 size_t flags;
599};
600
601// see RFC 5424
602enum HelLogSeverity {
603 kHelLogSeverityEmergency,
604 kHelLogSeverityAlert,
605 kHelLogSeverityCritical,
606 kHelLogSeverityError,
607 kHelLogSeverityWarning,
608 kHelLogSeverityNotice,
609 kHelLogSeverityInfo,
610 kHelLogSeverityDebug,
611};
612
615
623HEL_C_LINKAGE HelError helLog(const enum HelLogSeverity severity, const char *string, size_t length);
624
630HEL_C_LINKAGE void helPanic(const char *string, size_t length)
631 __attribute__ (( noreturn ));
632
636
638HEL_C_LINKAGE HelError helNop();
639
643HEL_C_LINKAGE HelError helSubmitAsyncNop(HelHandle queueHandle, uintptr_t context);
644
648
652HEL_C_LINKAGE HelError helCreateUniverse(HelHandle *handle);
653
661HEL_C_LINKAGE HelError
662helTransferDescriptor(HelHandle handle, HelHandle universeHandle,
663 enum HelTransferDescriptorFlags direction, HelHandle *outHandle);
664
665HEL_C_LINKAGE HelError helDescriptorInfo(HelHandle handle, struct HelDescriptorInfo *info);
666
672HEL_C_LINKAGE HelError helGetCredentials(HelHandle handle, uint32_t flags,
673 char *credentials);
674
680HEL_C_LINKAGE HelError helCloseDescriptor(HelHandle universeHandle, HelHandle handle);
681
685
691HEL_C_LINKAGE HelError helCreateQueue(const struct HelQueueParameters *params,
692 HelHandle *handle);
693
699HEL_C_LINKAGE HelError helCancelAsync(HelHandle queueHandle, uint64_t asyncId);
700
704
714HEL_C_LINKAGE HelError helAllocateMemory(size_t size, uint32_t flags,
715 const struct HelAllocRestrictions *restrictions, HelHandle *handle);
716
723HEL_C_LINKAGE HelError helResizeMemory(HelHandle handle, size_t newSize);
724
736HEL_C_LINKAGE HelError helCreateManagedMemory(size_t size, uint32_t flags,
737 HelHandle *backingHandle, HelHandle *frontalHandle);
738
749HEL_C_LINKAGE HelError helCopyOnWrite(HelHandle memory,
750 uintptr_t offset, size_t size, HelHandle *handle);
751
752HEL_C_LINKAGE HelError helAccessPhysical(uintptr_t physical,
753 size_t size, HelHandle *handle);
754
760HEL_C_LINKAGE HelError helCreateIndirectMemory(size_t numSlots, HelHandle *handle);
761
778HEL_C_LINKAGE HelError helAlterMemoryIndirection(HelHandle indirectHandle, size_t slotIndex,
779 HelHandle memoryHandle, uintptr_t offset, size_t size);
780
781HEL_C_LINKAGE HelError helCreateSliceView(HelHandle bundle, uintptr_t offset, size_t size,
782 uint32_t flags, HelHandle *handle);
783
791HEL_C_LINKAGE HelError helForkMemory(HelHandle handle, HelHandle *forkedHandle);
792
796HEL_C_LINKAGE HelError helCreateSpace(HelHandle *handle);
797
815HEL_C_LINKAGE HelError helMapMemory(HelHandle memoryHandle, HelHandle spaceHandle,
816 void *pointer, uintptr_t offset, size_t size, uint32_t flags, void **actualPointer);
817
829HEL_C_LINKAGE HelError helSubmitProtectMemory(HelHandle spaceHandle,
830 void *pointer, size_t size, uint32_t flags,
831 HelHandle queueHandle, uintptr_t context);
832
848HEL_C_LINKAGE HelError helSubmitSynchronizeSpace(HelHandle spaceHandle,
849 void *pointer, size_t size,
850 HelHandle queueHandle, uintptr_t context);
851
862HEL_C_LINKAGE HelError helUnmapMemory(HelHandle spaceHandle, void *pointer, size_t size);
863
864HEL_C_LINKAGE HelError helPointerPhysical(const void *pointer, uintptr_t *physical);
865
877HEL_C_LINKAGE HelError helSubmitReadMemory(HelHandle handle, uintptr_t address,
878 size_t length, void *buffer,
879 HelHandle queue, uintptr_t context);
880
892HEL_C_LINKAGE HelError helSubmitWriteMemory(HelHandle handle, uintptr_t address,
893 size_t length, const void *buffer,
894 HelHandle queue, uintptr_t context);
895
896HEL_C_LINKAGE HelError helMemoryInfo(HelHandle handle,
897 size_t *size);
898
899HEL_C_LINKAGE HelError helSubmitManageMemory(HelHandle handle,
900 HelHandle queue, uintptr_t context);
901
902HEL_C_LINKAGE HelError helUpdateMemory(HelHandle handle, int type, uintptr_t offset, size_t length);
903
904HEL_C_LINKAGE HelError helSubmitLockMemoryView(HelHandle handle, uintptr_t offset, size_t size,
905 HelHandle queue, uintptr_t context);
906
917HEL_C_LINKAGE HelError helLoadahead(HelHandle handle, uintptr_t offset, size_t length);
918
919HEL_C_LINKAGE HelError helCreateVirtualizedSpace(HelHandle *handle);
920
924
938HEL_C_LINKAGE HelError helCreateThread(HelHandle universe, HelHandle spaceHandle,
939 HelAbi abi, void *ip, void *sp, uint32_t flags, HelHandle *handle);
940
946HEL_C_LINKAGE HelError helQueryThreadStats(HelHandle handle, struct HelThreadStats *stats);
947
956HEL_C_LINKAGE HelError helSetPriority(HelHandle handle, int priority);
957
959HEL_C_LINKAGE HelError helYield();
960
968HEL_C_LINKAGE HelError helSubmitObserve(HelHandle handle, uint64_t sequence,
969 HelHandle queue, uintptr_t context);
970
974HEL_C_LINKAGE HelError helKillThread(HelHandle handle);
975
982HEL_C_LINKAGE HelError helInterruptThread(HelHandle handle);
983
990HEL_C_LINKAGE HelError helResume(HelHandle handle);
991
999HEL_C_LINKAGE HelError helLoadRegisters(HelHandle handle, int set, void *image);
1000
1008HEL_C_LINKAGE HelError helStoreRegisters(HelHandle handle, int set, const void *image);
1009
1012// Register set to query information for.
1015HEL_C_LINKAGE HelError helQueryRegisterInfo(int set, struct HelRegisterInfo *info);
1016
1017HEL_C_LINKAGE HelError helWriteFsBase(void *pointer);
1018
1019HEL_C_LINKAGE HelError helReadFsBase(void **pointer);
1020
1021HEL_C_LINKAGE HelError helWriteGsBase(void *pointer);
1022
1023HEL_C_LINKAGE HelError helReadGsBase(void **pointer);
1024
1026HEL_C_LINKAGE HelError helGetCurrentCpu(int *cpu);
1027
1032HEL_C_LINKAGE HelError helGetClock(uint64_t *counter);
1033
1041HEL_C_LINKAGE HelError helSubmitAwaitClock(uint64_t counter,
1042 HelHandle queue, uintptr_t context, uint64_t *asyncId);
1043
1044HEL_C_LINKAGE HelError helCreateVirtualizedCpu(HelHandle handle, HelHandle *out_handle);
1045
1046HEL_C_LINKAGE HelError helRunVirtualizedCpu(HelHandle handle, struct HelVmexitReason *reason);
1047
1048HEL_C_LINKAGE HelError helGetRandomBytes(void *buffer, size_t wantedSize, size_t *actualSize);
1049
1059HEL_C_LINKAGE HelError helGetAffinity(HelHandle handle, uint8_t *mask, size_t size, size_t *actualSize);
1060
1068HEL_C_LINKAGE HelError helSetAffinity(HelHandle handle, uint8_t *mask, size_t size);
1069
1073
1081HEL_C_LINKAGE HelError helCreateStream(HelHandle *lane1, HelHandle *lane2, uint32_t attach_credentials);
1082
1090HEL_C_LINKAGE HelError helSubmitAsync(HelHandle handle, const struct HelAction *actions,
1091 size_t count, HelHandle queue, uintptr_t context, uint32_t flags);
1092
1093HEL_C_LINKAGE HelError helShutdownLane(HelHandle handle);
1094
1102HEL_C_LINKAGE HelError helCreateToken(HelHandle *handle);
1103
1107
1116HEL_C_LINKAGE HelError helFutexWait(int *pointer, int expected, int64_t deadline);
1117
1123HEL_C_LINKAGE HelError helFutexWake(int *pointer, unsigned int count);
1124
1128
1132HEL_C_LINKAGE HelError helCreateOneshotEvent(HelHandle *handle);
1133
1137HEL_C_LINKAGE HelError helCreateBitsetEvent(HelHandle *handle);
1138
1142HEL_C_LINKAGE HelError helRaiseEvent(HelHandle handle);
1143
1144HEL_C_LINKAGE HelError helAccessIrq(int number, HelHandle *handle);
1145
1146HEL_C_LINKAGE HelError helAcknowledgeIrq(HelHandle handle, uint32_t flags, uint64_t sequence);
1147
1155HEL_C_LINKAGE HelError helSubmitAwaitEvent(HelHandle handle, uint64_t sequence,
1156 HelHandle queue, uintptr_t context, uint64_t *asyncId);
1157
1158HEL_C_LINKAGE HelError helAutomateIrq(HelHandle handle, uint32_t flags, HelHandle kernlet);
1159
1163
1164HEL_C_LINKAGE HelError helAccessIo(uintptr_t *port_array, size_t num_ports,
1165 HelHandle *handle);
1166
1170HEL_C_LINKAGE HelError helEnableIo(HelHandle handle);
1171
1172HEL_C_LINKAGE HelError helEnableFullIo();
1173
1177
1187HEL_C_LINKAGE HelError helBindKernlet(HelHandle handle,
1188 const union HelKernletData *data, size_t numData, HelHandle *boundHandle);
1189
1191
1192extern inline __attribute__ (( always_inline )) const char *_helErrorString(HelError code) {
1193 switch(code) {
1194 case kHelErrNone:
1195 return "Success";
1196 case kHelErrIllegalSyscall:
1197 return "Illegal syscall";
1198 case kHelErrIllegalArgs:
1199 return "Illegal arguments";
1200 case kHelErrIllegalState:
1201 return "Illegal state";
1202 case kHelErrUnsupportedOperation:
1203 return "Unsupported operation";
1204 case kHelErrNoDescriptor:
1205 return "No such descriptor";
1206 case kHelErrBadDescriptor:
1207 return "Illegal descriptor for this operation";
1208 case kHelErrThreadTerminated:
1209 return "Thread terminated already";
1210 case kHelErrLaneShutdown:
1211 return "Lane shutdown";
1212 case kHelErrEndOfLane:
1213 return "End of lane";
1214 case kHelErrDismissed:
1215 return "IPC item dismissed by remote";
1216 case kHelErrBufferTooSmall:
1217 return "Buffer too small";
1218 case kHelErrQueueTooSmall:
1219 return "Buffer too small";
1220 case kHelErrFault:
1221 return "Segfault";
1222 case kHelErrNoHardwareSupport:
1223 return "Missing hardware support for this feature";
1224 case kHelErrNoMemory:
1225 return "Out of memory";
1226 case kHelErrTransmissionMismatch:
1227 return "Transmission mismatch";
1228 case kHelErrCancelled:
1229 return "Cancelled";
1230 case kHelErrOutOfBounds:
1231 return "Out of bounds";
1232 case kHelErrAlreadyExists:
1233 return "Already exists";
1234 default:
1235 return 0;
1236 }
1237}
1238
1239extern inline __attribute__ (( always_inline )) void _helCheckFailed(HelError err_code,
1240 const char *string, int fatal) {
1241 helLog(kHelLogSeverityError, string, strlen(string));
1242
1243 const char *err_string = _helErrorString(err_code);
1244 if(err_string == 0)
1245 err_string = "(Unexpected error code)";
1246 helLog(kHelLogSeverityError, err_string, strlen(err_string));
1247 helLog(kHelLogSeverityError, "\n", 1);
1248
1249 if(fatal)
1250 helPanic(0, 0);
1251}
1252
1253#define HEL_STRINGIFY_AUX(x) #x
1254#define HEL_STRINGIFY(x) HEL_STRINGIFY_AUX(x)
1255
1256#define HEL_CHECK(expr) do { HelError __error = expr; if(__error != kHelErrNone) \
1257 _helCheckFailed(__error, "HEL_CHECK failed: " #expr "\n" \
1258 " In file " __FILE__ " on line " HEL_STRINGIFY(__LINE__) "\n", 1); } while(0)
1259#define HEL_SOFT_CHECK(expr) do { HelError __error = expr; if(__error != kHelErrNone) \
1260 _helCheckFailed(__error, "HEL_SOFT_CHECK failed: " #expr "\n" \
1261 " In file " __FILE__ " on line " HEL_STRINGIFY(__LINE__) "\n", 0); } while(0)
1262
1263#endif // HEL_H
1264
HEL_C_LINKAGE HelError helLog(const enum HelLogSeverity severity, const char *string, size_t length)
Writes a text message (e.g., a line of text) to the kernel's log.
HEL_C_LINKAGE HelError helSetPriority(HelHandle handle, int priority)
Set the priority of a thread.
HEL_C_LINKAGE HelError helYield()
Yields the current thread.
HEL_C_LINKAGE HelError helTransferDescriptor(HelHandle handle, HelHandle universeHandle, enum HelTransferDescriptorFlags direction, HelHandle *outHandle)
Copies descriptors from the current universe to another universe.
HEL_C_LINKAGE HelError helSubmitReadMemory(HelHandle handle, uintptr_t address, size_t length, void *buffer, HelHandle queue, uintptr_t context)
Load memory (i.e., bytes) from a descriptor.
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.
HEL_C_LINKAGE HelError helSubmitAsync(HelHandle handle, const struct HelAction *actions, size_t count, HelHandle queue, uintptr_t context, uint32_t flags)
Pass messages on a stream.
static const int kHelHeadMask
Mask to extract the current queue head.
Definition hel.h:471
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 helSubmitObserve(HelHandle handle, uint64_t sequence, HelHandle queue, uintptr_t context)
Observe whether a thread changes its state.
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 helSubmitAwaitClock(uint64_t counter, HelHandle queue, uintptr_t context, uint64_t *asyncId)
Wait until time passes.
HEL_C_LINKAGE HelError helGetAffinity(HelHandle handle, uint8_t *mask, size_t size, size_t *actualSize)
Get a thread's CPU affinity mask.
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.
HEL_C_LINKAGE HelError helSubmitSynchronizeSpace(HelHandle spaceHandle, void *pointer, size_t size, HelHandle queueHandle, uintptr_t context)
Notifies the kernel of dirty pages in a memory mapping.
static const int kHelProgressMask
Mask to extract the number of valid bytes in the chunk.
Definition hel.h:489
HEL_C_LINKAGE HelError helCreateManagedMemory(size_t size, uint32_t flags, HelHandle *backingHandle, HelHandle *frontalHandle)
Creates a memory object that is managed by userspace.
HEL_C_LINKAGE HelError helInterruptThread(HelHandle handle)
Interrupt a thread.
HEL_C_LINKAGE HelError helSubmitAwaitEvent(HelHandle handle, uint64_t sequence, HelHandle queue, uintptr_t context, uint64_t *asyncId)
Wait for an event.
HEL_C_LINKAGE HelError helRaiseEvent(HelHandle handle)
Raise an event.
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.
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).
HEL_C_LINKAGE HelError helSubmitProtectMemory(HelHandle spaceHandle, void *pointer, size_t size, uint32_t flags, HelHandle queueHandle, uintptr_t context)
Changes protection attributes of a memory mapping.
HEL_C_LINKAGE HelError helCreateStream(HelHandle *lane1, HelHandle *lane2, uint32_t attach_credentials)
Create a stream (which always consists of two lanes).
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 helSubmitWriteMemory(HelHandle handle, uintptr_t address, size_t length, const void *buffer, HelHandle queue, uintptr_t context)
Store memory (i.e., bytes) to a descriptor.
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.
static const int kHelHeadWaiters
Can be set by the kernel to request a FutexWake on update.
Definition hel.h:474
HEL_C_LINKAGE HelError helBindKernlet(HelHandle handle, const union HelKernletData *data, size_t numData, HelHandle *boundHandle)
Bind parameters to a kernlet.
HEL_C_LINKAGE HelError helCreateSpace(HelHandle *handle)
Creates a virtual address space that threads can run in.
HEL_C_LINKAGE HelError helCreateOneshotEvent(HelHandle *handle)
Create an event that fires at most once.
static const int kHelProgressWaiters
Can be set by userspace to request a FutexWake on update.
Definition hel.h:492
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:495
HEL_C_LINKAGE HelError helEnableIo(HelHandle handle)
Enable userspace access to hardware I/O resources.
HEL_C_LINKAGE HelError helCancelAsync(HelHandle queueHandle, uint64_t asyncId)
Cancels an ongoing asynchronous operation.
A single element of a HelQueue.
Definition hel.h:509
unsigned int length
Length of the element in bytes.
Definition hel.h:511
void * context
User-defined value.
Definition hel.h:514
In-memory kernel/user-space queue.
Definition hel.h:477
char padding[4]
Ensures that the buffer is 8-byte aligned.
Definition hel.h:482
int headFutex
Futex for kernel/user-space head synchronization.
Definition hel.h:479
int indexQueue[]
The actual queue.
Definition hel.h:485
Register-related information returned by helQueryRegisterInfo.
Definition hel.h:304
int setSize
Size of the selected register set.
Definition hel.h:306