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 kHelErrIllegalSyscall = 5,
116 kHelErrIllegalArgs = 7,
117 kHelErrIllegalState = 15,
118 kHelErrUnsupportedOperation = 18,
119 kHelErrOutOfBounds = 19,
120 kHelErrQueueTooSmall = 14,
121 kHelErrCancelled = 12,
122 kHelErrNoDescriptor = 4,
123 kHelErrBadDescriptor = 2,
124 kHelErrThreadTerminated = 11,
125 kHelErrTransmissionMismatch = 13,
126 kHelErrLaneShutdown = 8,
127 kHelErrEndOfLane = 9,
128 kHelErrDismissed = 20,
129 kHelErrBufferTooSmall = 1,
130 kHelErrFault = 10,
131 kHelErrRemoteFault = 21,
132 kHelErrNoHardwareSupport = 16,
133 kHelErrNoMemory = 17,
134 kHelErrAlreadyExists = 22
135};
136
137struct HelX86SegmentRegister {
138 uint64_t base;
139 uint32_t limit;
140 uint16_t selector;
141 uint8_t type, present, dpl, db, s, l, g, avl;
142};
143
144struct HelX86DescriptorTable {
145 uint64_t base;
146 uint16_t limit;
147};
148
149struct HelX86VirtualizationRegs {
150 uint64_t rax;
151 uint64_t rbx;
152 uint64_t rcx;
153 uint64_t rdx;
154 uint64_t rsi;
155 uint64_t rdi;
156 uint64_t rbp;
157 uint64_t r8;
158 uint64_t r9;
159 uint64_t r10;
160 uint64_t r11;
161 uint64_t r12;
162 uint64_t r13;
163 uint64_t r14;
164 uint64_t r15;
165
166 uint64_t rsp;
167 uint64_t rip;
168 uint64_t rflags;
169
170 struct HelX86SegmentRegister cs, ds, es, fs, gs, ss;
171 struct HelX86SegmentRegister tr, ldt;
172 struct HelX86DescriptorTable gdt, idt;
173
174 uint64_t cr0, cr2, cr3, cr4, cr8;
175 uint64_t efer;
176 uint64_t apic_base;
177};
178
179enum {
180 kHelNullHandle = 0,
181 kHelThisUniverse = -1,
182 kHelThisThread = -2,
183 kHelZeroMemory = -3
184};
185
186enum {
187 kHelWaitInfinite = -1
188};
189
190enum {
191 kHelAbiSystemV = 1
192};
193
194enum {
195 kHelActionNone = 0,
196 kHelActionDismiss = 11,
197 kHelActionOffer = 5,
198 kHelActionAccept = 6,
199 kHelActionImbueCredentials = 8,
200 kHelActionExtractCredentials = 9,
201 kHelActionSendFromBuffer = 1,
202 kHelActionSendFromBufferSg = 10,
203 kHelActionRecvInline = 7,
204 kHelActionRecvToBuffer = 3,
205 kHelActionPushDescriptor = 2,
206 kHelActionPullDescriptor = 4
207};
208
209enum {
210 kHelItemChain = 1,
211 kHelItemAncillary = 2,
212 kHelItemWantLane = (1 << 16),
213};
214
215struct HelSgItem {
216 void *buffer;
217 size_t length;
218};
219
220struct HelAction {
221 int type;
222 uint32_t flags;
223 // TODO: the following fields could be put into unions
224 void *buffer;
225 size_t length;
226 HelHandle handle;
227};
228
229struct HelDescriptorInfo {
230 int type;
231};
232
233enum HelAllocFlags {
234 kHelAllocContinuous = 4,
235 kHelAllocOnDemand = 1,
236};
237
238struct HelAllocRestrictions {
239 int addressBits;
240};
241
242enum HelManagedFlags {
243 kHelManagedReadahead = 1
244};
245
246enum HelManageRequests {
247 kHelManageInitialize = 1,
248 kHelManageWriteback = 2
249};
250
251enum HelMapFlags {
252 // Additional flags that may be set.
253 kHelMapProtRead = 256,
254 kHelMapProtWrite = 512,
255 kHelMapProtExecute = 1024,
256 kHelMapDontRequireBacking = 128,
257 kHelMapFixed = 2048,
258 kHelMapFixedNoReplace = 4096
259};
260
261enum HelThreadFlags {
262 kHelThreadStopped = 1
263};
264
265enum HelObservation {
266 kHelObserveNull = 0,
267 kHelObserveInterrupt = 4,
268 kHelObservePanic = 3,
269 kHelObserveBreakpoint = 1,
270 kHelObservePageFault = 2,
271 kHelObserveGeneralFault = 5,
272 kHelObserveIllegalInstruction = 6,
273 kHelObserveDivByZero = 7,
274 kHelObserveSuperCall = 0x80000000
275};
276
277enum HelRegisterSets {
278 kHelRegsProgram = 1,
279 kHelRegsGeneral = 2,
280 kHelRegsThread = 3,
281 kHelRegsDebug = 4,
282 kHelRegsVirtualization = 5,
283 kHelRegsSimd = 6,
284 kHelRegsSignal = 7
285};
286
291};
292
293#if defined(__x86_64__)
294enum HelRegisterIndex {
295 kHelRegRax = 0,
296 kHelRegRbx = 1,
297 kHelRegRcx = 2,
298 kHelRegRdx = 3,
299 kHelRegRdi = 4,
300 kHelRegRsi = 5,
301 kHelRegR8 = 6,
302 kHelRegR9 = 7,
303 kHelRegR10 = 8,
304 kHelRegR11 = 9,
305 kHelRegR12 = 10,
306 kHelRegR13 = 11,
307 kHelRegR14 = 12,
308 kHelRegR15 = 13,
309 kHelRegRbp = 14,
310
311 kHelNumGprs = 15,
312
313 kHelRegIp = 0,
314 kHelRegSp = 1
315};
316
317enum HelSyscallArgs {
318 kHelRegNumber = kHelRegRdi,
319 kHelRegError = kHelRegRdi,
320
321 kHelRegArg0 = kHelRegRsi,
322 kHelRegArg1 = kHelRegRdx,
323 kHelRegArg2 = kHelRegRax,
324 kHelRegArg3 = kHelRegR8,
325 kHelRegArg4 = kHelRegR9,
326 kHelRegArg5 = kHelRegR10,
327 kHelRegArg6 = kHelRegR12,
328 kHelRegArg7 = kHelRegR13,
329 kHelRegArg8 = kHelRegR14,
330
331 kHelRegOut0 = kHelRegRsi,
332 kHelRegOut1 = kHelRegRdx
333};
334
335#elif defined(__aarch64__)
336enum HelRegisterIndex {
337 kHelRegX0 = 0,
338 kHelRegX1,
339 kHelRegX2,
340 kHelRegX3,
341 kHelRegX4,
342 kHelRegX5,
343 kHelRegX6,
344 kHelRegX7,
345 kHelRegX8,
346 kHelRegX9,
347 kHelRegX10,
348 kHelRegX11,
349 kHelRegX12,
350 kHelRegX13,
351 kHelRegX14,
352 kHelRegX15,
353 kHelRegX16,
354 kHelRegX17,
355 kHelRegX18,
356 kHelRegX19,
357 kHelRegX20,
358 kHelRegX21,
359 kHelRegX22,
360 kHelRegX23,
361 kHelRegX24,
362 kHelRegX25,
363 kHelRegX26,
364 kHelRegX27,
365 kHelRegX28,
366 kHelRegX29,
367 kHelRegX30,
368
369 kHelNumGprs = 31,
370
371 kHelRegIp = 0,
372 kHelRegSp = 1
373};
374
375enum HelSyscallArgs {
376 kHelRegNumber = kHelRegX0,
377 kHelRegError = kHelRegX0,
378
379 kHelRegArg0 = kHelRegX1,
380 kHelRegArg1 = kHelRegX2,
381 kHelRegArg2 = kHelRegX3,
382 kHelRegArg3 = kHelRegX4,
383 kHelRegArg4 = kHelRegX5,
384 kHelRegArg5 = kHelRegX6,
385 kHelRegArg6 = kHelRegX7,
386 kHelRegArg7 = kHelRegX8,
387 kHelRegArg8 = kHelRegX9,
388
389 kHelRegOut0 = kHelRegX1,
390 kHelRegOut1 = kHelRegX2
391};
392
393#elif defined(__riscv) && __riscv_xlen == 64
394enum HelRegisterIndex {
395 kHelRegRa = 0,
396 kHelRegGp,
397 kHelRegTp,
398 kHelRegT0,
399 kHelRegT1,
400 kHelRegT2,
401 kHelRegS0,
402 kHelRegS1,
403 kHelRegA0,
404 kHelRegA1,
405 kHelRegA2,
406 kHelRegA3,
407 kHelRegA4,
408 kHelRegA5,
409 kHelRegA6,
410 kHelRegA7,
411 kHelRegS2,
412 kHelRegS3,
413 kHelRegS4,
414 kHelRegS5,
415 kHelRegS6,
416 kHelRegS7,
417 kHelRegS8,
418 kHelRegS9,
419 kHelRegS10,
420 kHelRegS11,
421 kHelRegT3,
422 kHelRegT4,
423 kHelRegT5,
424 kHelRegT6,
425 kHelNumGprs,
426 kHelRegIp = 0,
427 kHelRegSp = 1
428};
429enum HelSyscallArgs {
430 kHelRegNumber = kHelRegA0,
431 kHelRegError = kHelRegA0,
432 kHelRegArg0 = kHelRegA1,
433 kHelRegArg1 = kHelRegA2,
434 kHelRegArg2 = kHelRegA3,
435 kHelRegArg3 = kHelRegA4,
436 kHelRegArg4 = kHelRegA5,
437 kHelRegArg5 = kHelRegA6,
438 kHelRegArg6 = kHelRegA7,
439 kHelRegArg7 = kHelRegS2,
440 kHelRegArg8 = kHelRegS3,
441 kHelRegOut0 = kHelRegA1,
442 kHelRegOut1 = kHelRegA2
443};
444
445#endif
446
447struct HelQueueParameters {
448 uint32_t flags;
449 unsigned int ringShift;
450 unsigned int numChunks;
451 size_t chunkSize;
452};
453
455static const int kHelHeadMask = 0xFFFFFF;
456
458static const int kHelHeadWaiters = (1 << 24);
459
461struct HelQueue {
464
466 char padding[4];
467
470};
471
473static const int kHelProgressMask = 0xFFFFFF;
474
476static const int kHelProgressWaiters = (1 << 24);
477
479static const int kHelProgressDone = (1 << 25);
480
481struct HelChunk {
483 int progressFutex;
484
486 char padding[4];
487
489 char buffer[];
490};
491
495 unsigned int length;
496 unsigned int reserved;
498 void *context;
499};
500
501struct HelSimpleResult {
502 HelError error;
503 int reserved;
504};
505
506struct HelCredentialsResult {
507 HelError error;
508 int reserved;
509 char credentials[16];
510};
511
512struct HelManageResult {
513 HelError error;
514 int type;
515 uintptr_t offset;
516 size_t length;
517};
518
519struct HelObserveResult {
520 HelError error;
521 unsigned int observation;
522 uint64_t sequence;
523};
524
525struct HelInlineResult {
526 HelError error;
527 int reserved;
528 size_t length;
529 char data[];
530};
531
532struct HelInlineResultNoFlex {
533 HelError error;
534 int reserved;
535 size_t length;
536};
537
538struct HelLengthResult {
539 HelError error;
540 int reserved;
541 size_t length;
542};
543
544struct HelHandleResult {
545 HelError error;
546 int reserved;
547 HelHandle handle;
548};
549
550struct HelEventResult {
551 HelError error;
552 uint32_t bitset;
553 uint64_t sequence;
554};
555
556enum HelAckFlags {
557 kHelAckAcknowledge = 2,
558 kHelAckNack = 3,
559 kHelAckKick = 1,
560 kHelAckClear = 0x100,
561};
562
563union HelKernletData {
564 HelHandle handle;
565};
566
567struct HelThreadStats {
568 uint64_t userTime;
569};
570
571enum {
572 kHelVmexitHlt = 0,
573 kHelVmexitTranslationFault = 1,
574 kHelVmexitError = -1,
575 kHelVmexitUnknownPlatformSpecificExitCode = -2,
576};
577
578struct HelVmexitReason {
579 uint32_t exitReason;
580 uint32_t code;
581 size_t address;
582 size_t flags;
583};
584
585// see RFC 5424
586enum HelLogSeverity {
587 kHelLogSeverityEmergency,
588 kHelLogSeverityAlert,
589 kHelLogSeverityCritical,
590 kHelLogSeverityError,
591 kHelLogSeverityWarning,
592 kHelLogSeverityNotice,
593 kHelLogSeverityInfo,
594 kHelLogSeverityDebug,
595};
596
599
607HEL_C_LINKAGE HelError helLog(const enum HelLogSeverity severity, const char *string, size_t length);
608
614HEL_C_LINKAGE void helPanic(const char *string, size_t length)
615 __attribute__ (( noreturn ));
616
620
622HEL_C_LINKAGE HelError helNop();
623
627HEL_C_LINKAGE HelError helSubmitAsyncNop(HelHandle queueHandle, uintptr_t context);
628
632
636HEL_C_LINKAGE HelError helCreateUniverse(HelHandle *handle);
637
645HEL_C_LINKAGE HelError helTransferDescriptor(HelHandle handle, HelHandle universeHandle,
646 HelHandle *outHandle);
647
648HEL_C_LINKAGE HelError helDescriptorInfo(HelHandle handle, struct HelDescriptorInfo *info);
649
655HEL_C_LINKAGE HelError helGetCredentials(HelHandle handle, uint32_t flags,
656 char *credentials);
657
663HEL_C_LINKAGE HelError helCloseDescriptor(HelHandle universeHandle, HelHandle handle);
664
668
674HEL_C_LINKAGE HelError helCreateQueue(const struct HelQueueParameters *params,
675 HelHandle *handle);
676
682HEL_C_LINKAGE HelError helCancelAsync(HelHandle queueHandle, uint64_t asyncId);
683
687
697HEL_C_LINKAGE HelError helAllocateMemory(size_t size, uint32_t flags,
698 const struct HelAllocRestrictions *restrictions, HelHandle *handle);
699
706HEL_C_LINKAGE HelError helResizeMemory(HelHandle handle, size_t newSize);
707
719HEL_C_LINKAGE HelError helCreateManagedMemory(size_t size, uint32_t flags,
720 HelHandle *backingHandle, HelHandle *frontalHandle);
721
732HEL_C_LINKAGE HelError helCopyOnWrite(HelHandle memory,
733 uintptr_t offset, size_t size, HelHandle *handle);
734
735HEL_C_LINKAGE HelError helAccessPhysical(uintptr_t physical,
736 size_t size, HelHandle *handle);
737
743HEL_C_LINKAGE HelError helCreateIndirectMemory(size_t numSlots, HelHandle *handle);
744
761HEL_C_LINKAGE HelError helAlterMemoryIndirection(HelHandle indirectHandle, size_t slotIndex,
762 HelHandle memoryHandle, uintptr_t offset, size_t size);
763
764HEL_C_LINKAGE HelError helCreateSliceView(HelHandle bundle, uintptr_t offset, size_t size,
765 uint32_t flags, HelHandle *handle);
766
774HEL_C_LINKAGE HelError helForkMemory(HelHandle handle, HelHandle *forkedHandle);
775
779HEL_C_LINKAGE HelError helCreateSpace(HelHandle *handle);
780
798HEL_C_LINKAGE HelError helMapMemory(HelHandle memoryHandle, HelHandle spaceHandle,
799 void *pointer, uintptr_t offset, size_t size, uint32_t flags, void **actualPointer);
800
812HEL_C_LINKAGE HelError helSubmitProtectMemory(HelHandle spaceHandle,
813 void *pointer, size_t size, uint32_t flags,
814 HelHandle queueHandle, uintptr_t context);
815
831HEL_C_LINKAGE HelError helSubmitSynchronizeSpace(HelHandle spaceHandle,
832 void *pointer, size_t size,
833 HelHandle queueHandle, uintptr_t context);
834
845HEL_C_LINKAGE HelError helUnmapMemory(HelHandle spaceHandle, void *pointer, size_t size);
846
847HEL_C_LINKAGE HelError helPointerPhysical(const void *pointer, uintptr_t *physical);
848
860HEL_C_LINKAGE HelError helSubmitReadMemory(HelHandle handle, uintptr_t address,
861 size_t length, void *buffer,
862 HelHandle queue, uintptr_t context);
863
875HEL_C_LINKAGE HelError helSubmitWriteMemory(HelHandle handle, uintptr_t address,
876 size_t length, const void *buffer,
877 HelHandle queue, uintptr_t context);
878
879HEL_C_LINKAGE HelError helMemoryInfo(HelHandle handle,
880 size_t *size);
881
882HEL_C_LINKAGE HelError helSubmitManageMemory(HelHandle handle,
883 HelHandle queue, uintptr_t context);
884
885HEL_C_LINKAGE HelError helUpdateMemory(HelHandle handle, int type, uintptr_t offset, size_t length);
886
887HEL_C_LINKAGE HelError helSubmitLockMemoryView(HelHandle handle, uintptr_t offset, size_t size,
888 HelHandle queue, uintptr_t context);
889
900HEL_C_LINKAGE HelError helLoadahead(HelHandle handle, uintptr_t offset, size_t length);
901
902HEL_C_LINKAGE HelError helCreateVirtualizedSpace(HelHandle *handle);
903
907
921HEL_C_LINKAGE HelError helCreateThread(HelHandle universe, HelHandle spaceHandle,
922 HelAbi abi, void *ip, void *sp, uint32_t flags, HelHandle *handle);
923
929HEL_C_LINKAGE HelError helQueryThreadStats(HelHandle handle, struct HelThreadStats *stats);
930
939HEL_C_LINKAGE HelError helSetPriority(HelHandle handle, int priority);
940
942HEL_C_LINKAGE HelError helYield();
943
951HEL_C_LINKAGE HelError helSubmitObserve(HelHandle handle, uint64_t sequence,
952 HelHandle queue, uintptr_t context);
953
957HEL_C_LINKAGE HelError helKillThread(HelHandle handle);
958
965HEL_C_LINKAGE HelError helInterruptThread(HelHandle handle);
966
973HEL_C_LINKAGE HelError helResume(HelHandle handle);
974
982HEL_C_LINKAGE HelError helLoadRegisters(HelHandle handle, int set, void *image);
983
991HEL_C_LINKAGE HelError helStoreRegisters(HelHandle handle, int set, const void *image);
992
995// Register set to query information for.
998HEL_C_LINKAGE HelError helQueryRegisterInfo(int set, struct HelRegisterInfo *info);
999
1000HEL_C_LINKAGE HelError helWriteFsBase(void *pointer);
1001
1002HEL_C_LINKAGE HelError helReadFsBase(void **pointer);
1003
1004HEL_C_LINKAGE HelError helWriteGsBase(void *pointer);
1005
1006HEL_C_LINKAGE HelError helReadGsBase(void **pointer);
1007
1009HEL_C_LINKAGE HelError helGetCurrentCpu(int *cpu);
1010
1015HEL_C_LINKAGE HelError helGetClock(uint64_t *counter);
1016
1024HEL_C_LINKAGE HelError helSubmitAwaitClock(uint64_t counter,
1025 HelHandle queue, uintptr_t context, uint64_t *asyncId);
1026
1027HEL_C_LINKAGE HelError helCreateVirtualizedCpu(HelHandle handle, HelHandle *out_handle);
1028
1029HEL_C_LINKAGE HelError helRunVirtualizedCpu(HelHandle handle, struct HelVmexitReason *reason);
1030
1031HEL_C_LINKAGE HelError helGetRandomBytes(void *buffer, size_t wantedSize, size_t *actualSize);
1032
1042HEL_C_LINKAGE HelError helGetAffinity(HelHandle handle, uint8_t *mask, size_t size, size_t *actualSize);
1043
1051HEL_C_LINKAGE HelError helSetAffinity(HelHandle handle, uint8_t *mask, size_t size);
1052
1056
1064HEL_C_LINKAGE HelError helCreateStream(HelHandle *lane1, HelHandle *lane2, uint32_t attach_credentials);
1065
1073HEL_C_LINKAGE HelError helSubmitAsync(HelHandle handle, const struct HelAction *actions,
1074 size_t count, HelHandle queue, uintptr_t context, uint32_t flags);
1075
1076HEL_C_LINKAGE HelError helShutdownLane(HelHandle handle);
1077
1085HEL_C_LINKAGE HelError helCreateToken(HelHandle *handle);
1086
1090
1099HEL_C_LINKAGE HelError helFutexWait(int *pointer, int expected, int64_t deadline);
1100
1104HEL_C_LINKAGE HelError helFutexWake(int *pointer);
1105
1109
1113HEL_C_LINKAGE HelError helCreateOneshotEvent(HelHandle *handle);
1114
1118HEL_C_LINKAGE HelError helCreateBitsetEvent(HelHandle *handle);
1119
1123HEL_C_LINKAGE HelError helRaiseEvent(HelHandle handle);
1124
1125HEL_C_LINKAGE HelError helAccessIrq(int number, HelHandle *handle);
1126
1127HEL_C_LINKAGE HelError helAcknowledgeIrq(HelHandle handle, uint32_t flags, uint64_t sequence);
1128
1136HEL_C_LINKAGE HelError helSubmitAwaitEvent(HelHandle handle, uint64_t sequence,
1137 HelHandle queue, uintptr_t context);
1138
1139HEL_C_LINKAGE HelError helAutomateIrq(HelHandle handle, uint32_t flags, HelHandle kernlet);
1140
1144
1145HEL_C_LINKAGE HelError helAccessIo(uintptr_t *port_array, size_t num_ports,
1146 HelHandle *handle);
1147
1151HEL_C_LINKAGE HelError helEnableIo(HelHandle handle);
1152
1153HEL_C_LINKAGE HelError helEnableFullIo();
1154
1158
1168HEL_C_LINKAGE HelError helBindKernlet(HelHandle handle,
1169 const union HelKernletData *data, size_t numData, HelHandle *boundHandle);
1170
1172
1173extern inline __attribute__ (( always_inline )) const char *_helErrorString(HelError code) {
1174 switch(code) {
1175 case kHelErrNone:
1176 return "Success";
1177 case kHelErrIllegalSyscall:
1178 return "Illegal syscall";
1179 case kHelErrIllegalArgs:
1180 return "Illegal arguments";
1181 case kHelErrIllegalState:
1182 return "Illegal state";
1183 case kHelErrUnsupportedOperation:
1184 return "Unsupported operation";
1185 case kHelErrNoDescriptor:
1186 return "No such descriptor";
1187 case kHelErrBadDescriptor:
1188 return "Illegal descriptor for this operation";
1189 case kHelErrThreadTerminated:
1190 return "Thread terminated already";
1191 case kHelErrLaneShutdown:
1192 return "Lane shutdown";
1193 case kHelErrEndOfLane:
1194 return "End of lane";
1195 case kHelErrDismissed:
1196 return "IPC item dismissed by remote";
1197 case kHelErrBufferTooSmall:
1198 return "Buffer too small";
1199 case kHelErrQueueTooSmall:
1200 return "Buffer too small";
1201 case kHelErrFault:
1202 return "Segfault";
1203 case kHelErrNoHardwareSupport:
1204 return "Missing hardware support for this feature";
1205 case kHelErrNoMemory:
1206 return "Out of memory";
1207 case kHelErrTransmissionMismatch:
1208 return "Transmission mismatch";
1209 case kHelErrCancelled:
1210 return "Cancelled";
1211 case kHelErrOutOfBounds:
1212 return "Out of bounds";
1213 case kHelErrAlreadyExists:
1214 return "Already exists";
1215 default:
1216 return 0;
1217 }
1218}
1219
1220extern inline __attribute__ (( always_inline )) void _helCheckFailed(HelError err_code,
1221 const char *string, int fatal) {
1222 helLog(kHelLogSeverityError, string, strlen(string));
1223
1224 const char *err_string = _helErrorString(err_code);
1225 if(err_string == 0)
1226 err_string = "(Unexpected error code)";
1227 helLog(kHelLogSeverityError, err_string, strlen(err_string));
1228 helLog(kHelLogSeverityError, "\n", 1);
1229
1230 if(fatal)
1231 helPanic(0, 0);
1232}
1233
1234#define HEL_STRINGIFY_AUX(x) #x
1235#define HEL_STRINGIFY(x) HEL_STRINGIFY_AUX(x)
1236
1237#define HEL_CHECK(expr) do { HelError __error = expr; if(__error != kHelErrNone) \
1238 _helCheckFailed(__error, "HEL_CHECK failed: " #expr "\n" \
1239 " In file " __FILE__ " on line " HEL_STRINGIFY(__LINE__) "\n", 1); } while(0)
1240#define HEL_SOFT_CHECK(expr) do { HelError __error = expr; if(__error != kHelErrNone) \
1241 _helCheckFailed(__error, "HEL_SOFT_CHECK failed: " #expr "\n" \
1242 " In file " __FILE__ " on line " HEL_STRINGIFY(__LINE__) "\n", 0); } while(0)
1243
1244#endif // HEL_H
1245
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 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.
HEL_C_LINKAGE HelError helSubmitAwaitEvent(HelHandle handle, uint64_t sequence, HelHandle queue, uintptr_t context)
Wait for an event.
static const int kHelHeadMask
Mask to extract the current queue head.
Definition hel.h:455
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 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:473
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 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 helFutexWake(int *pointer)
Wakes up all waiters of a futex.
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 helTransferDescriptor(HelHandle handle, HelHandle universeHandle, HelHandle *outHandle)
Copies descriptors from the current universe to another universe.
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:458
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:476
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:479
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:493
unsigned int length
Length of the element in bytes.
Definition hel.h:495
void * context
User-defined value.
Definition hel.h:498
In-memory kernel/user-space queue.
Definition hel.h:461
char padding[4]
Ensures that the buffer is 8-byte aligned.
Definition hel.h:466
int headFutex
Futex for kernel/user-space head synchronization.
Definition hel.h:463
int indexQueue[]
The actual queue.
Definition hel.h:469
Register-related information returned by helQueryRegisterInfo.
Definition hel.h:288
int setSize
Size of the selected register set.
Definition hel.h:290