14#define HEL_C_LINKAGE extern "C"
27 kHelCallSubmitAsyncNop = 3,
29 kHelCallCreateUniverse = 62,
30 kHelCallTransferDescriptor = 66,
31 kHelCallDescriptorInfo = 32,
32 kHelCallGetCredentials = 84,
33 kHelCallCloseDescriptor = 21,
35 kHelCallCreateQueue = 89,
36 kHelCallCancelAsync = 92,
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,
62 kHelCallCreateThread = 67,
63 kHelCallQueryThreadStats = 95,
64 kHelCallSetPriority = 85,
66 kHelCallSubmitObserve = 74,
67 kHelCallKillThread = 87,
68 kHelCallInterruptThread = 86,
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,
84 kHelCallCreateStream = 68,
85 kHelCallSubmitAsync = 79,
86 kHelCallShutdownLane = 91,
88 kHelCallFutexWait = 73,
89 kHelCallFutexWake = 71,
91 kHelCallCreateOneshotEvent = 96,
92 kHelCallCreateBitsetEvent = 97,
93 kHelCallRaiseEvent = 98,
94 kHelCallAccessIrq = 14,
95 kHelCallAcknowledgeIrq = 81,
96 kHelCallSubmitAwaitEvent = 82,
97 kHelCallAutomateIrq = 94,
99 kHelCallAccessIo = 11,
100 kHelCallEnableIo = 12,
101 kHelCallEnableFullIo = 35,
103 kHelCallBindKernlet = 93,
105 kHelCallGetAffinity = 103,
106 kHelCallSetAffinity = 100,
108 kHelCallCreateToken = 104,
110 kHelCallSuper = 0x80000000
115 kHelErrBufferTooSmall = 1,
116 kHelErrBadDescriptor = 2,
118 kHelErrNoDescriptor = 4,
119 kHelErrIllegalSyscall = 5,
120 kHelErrIllegalArgs = 7,
121 kHelErrLaneShutdown = 8,
122 kHelErrEndOfLane = 9,
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
138struct HelX86SegmentRegister {
142 uint8_t type, present, dpl, db, s, l, g, avl;
145struct HelX86DescriptorTable {
150struct HelX86VirtualizationRegs {
171 struct HelX86SegmentRegister cs, ds, es, fs, gs, ss;
172 struct HelX86SegmentRegister tr, ldt;
173 struct HelX86DescriptorTable gdt, idt;
175 uint64_t cr0, cr2, cr3, cr4, cr8;
182 kHelThisUniverse = -1,
188 kHelWaitInfinite = -1
197 kHelActionDismiss = 11,
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
212 kHelItemAncillary = 2,
213 kHelItemWantLane = (1 << 16),
216enum HelTransferDescriptorFlags {
217 kHelTransferDescriptorOut,
218 kHelTransferDescriptorIn,
235struct HelDescriptorInfo {
240 kHelAllocContinuous = 4,
241 kHelAllocOnDemand = 1,
244struct HelAllocRestrictions {
248enum HelManagedFlags {
249 kHelManagedReadahead = 1
252enum HelManageRequests {
253 kHelManageInitialize = 1,
254 kHelManageWriteback = 2
259 kHelMapProtRead = 256,
260 kHelMapProtWrite = 512,
261 kHelMapProtExecute = 1024,
262 kHelMapDontRequireBacking = 128,
264 kHelMapFixedNoReplace = 4096
268 kHelSliceCacheWriteCombine = 1,
272 kHelThreadStopped = 1
277 kHelObserveInterrupt = 4,
278 kHelObservePanic = 3,
279 kHelObserveBreakpoint = 1,
280 kHelObservePageFault = 2,
281 kHelObserveGeneralFault = 5,
282 kHelObserveIllegalInstruction = 6,
283 kHelObserveDivByZero = 7,
284 kHelObserveSuperCall = 0x80000000
287enum HelRegisterSets {
292 kHelRegsVirtualization = 5,
295 kHelRegsPageFault = 8
298enum HelPageFaultFlags {
299 kHelPageFaultMapError = 1,
300 kHelPageFaultAccessError = 2
309#if defined(__x86_64__)
310enum HelRegisterIndex {
334 kHelRegNumber = kHelRegRdi,
335 kHelRegError = kHelRegRdi,
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,
347 kHelRegOut0 = kHelRegRsi,
348 kHelRegOut1 = kHelRegRdx
351#elif defined(__aarch64__)
352enum HelRegisterIndex {
392 kHelRegNumber = kHelRegX0,
393 kHelRegError = kHelRegX0,
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,
405 kHelRegOut0 = kHelRegX1,
406 kHelRegOut1 = kHelRegX2
409#elif defined(__riscv) && __riscv_xlen == 64
410enum HelRegisterIndex {
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
463struct HelQueueParameters {
465 unsigned int ringShift;
466 unsigned int numChunks;
512 unsigned int reserved;
517struct HelSimpleResult {
522struct HelCredentialsResult {
525 char credentials[16];
528struct HelManageResult {
535struct HelObserveResult {
537 unsigned int observation;
541struct HelInlineResult {
548struct HelInlineResultNoFlex {
554struct HelLengthResult {
560struct HelHandleResult {
566struct HelEventResult {
573 kHelAckAcknowledge = 2,
576 kHelAckClear = 0x100,
579union HelKernletData {
583struct HelThreadStats {
589 kHelVmexitTranslationFault = 1,
590 kHelVmexitError = -1,
591 kHelVmexitUnknownPlatformSpecificExitCode = -2,
594struct HelVmexitReason {
603 kHelLogSeverityEmergency,
604 kHelLogSeverityAlert,
605 kHelLogSeverityCritical,
606 kHelLogSeverityError,
607 kHelLogSeverityWarning,
608 kHelLogSeverityNotice,
610 kHelLogSeverityDebug,
623HEL_C_LINKAGE HelError
helLog(
const enum HelLogSeverity severity,
const char *
string,
size_t length);
630HEL_C_LINKAGE
void helPanic(
const char *
string,
size_t length)
631 __attribute__ (( noreturn ));
661HEL_C_LINKAGE HelError
663 enum HelTransferDescriptorFlags direction, HelHandle *outHandle);
665HEL_C_LINKAGE HelError helDescriptorInfo(HelHandle handle,
struct HelDescriptorInfo *info);
715 const struct HelAllocRestrictions *restrictions, HelHandle *handle);
737 HelHandle *backingHandle, HelHandle *frontalHandle);
750 uintptr_t offset,
size_t size, HelHandle *handle);
752HEL_C_LINKAGE HelError helAccessPhysical(uintptr_t physical,
753 size_t size, HelHandle *handle);
779 HelHandle memoryHandle, uintptr_t offset,
size_t size);
781HEL_C_LINKAGE HelError helCreateSliceView(HelHandle bundle, uintptr_t offset,
size_t size,
782 uint32_t flags, HelHandle *handle);
791HEL_C_LINKAGE HelError
helForkMemory(HelHandle handle, HelHandle *forkedHandle);
815HEL_C_LINKAGE HelError
helMapMemory(HelHandle memoryHandle, HelHandle spaceHandle,
816 void *pointer, uintptr_t offset,
size_t size, uint32_t flags,
void **actualPointer);
830 void *pointer,
size_t size, uint32_t flags,
831 HelHandle queueHandle, uintptr_t context);
849 void *pointer,
size_t size,
850 HelHandle queueHandle, uintptr_t context);
862HEL_C_LINKAGE HelError
helUnmapMemory(HelHandle spaceHandle,
void *pointer,
size_t size);
864HEL_C_LINKAGE HelError helPointerPhysical(
const void *pointer, uintptr_t *physical);
878 size_t length,
void *buffer,
879 HelHandle queue, uintptr_t context);
893 size_t length,
const void *buffer,
894 HelHandle queue, uintptr_t context);
896HEL_C_LINKAGE HelError helMemoryInfo(HelHandle handle,
899HEL_C_LINKAGE HelError helSubmitManageMemory(HelHandle handle,
900 HelHandle queue, uintptr_t context);
902HEL_C_LINKAGE HelError helUpdateMemory(HelHandle handle,
int type, uintptr_t offset,
size_t length);
904HEL_C_LINKAGE HelError helSubmitLockMemoryView(HelHandle handle, uintptr_t offset,
size_t size,
905 HelHandle queue, uintptr_t context);
917HEL_C_LINKAGE HelError
helLoadahead(HelHandle handle, uintptr_t offset,
size_t length);
919HEL_C_LINKAGE HelError helCreateVirtualizedSpace(HelHandle *handle);
939 HelAbi abi,
void *ip,
void *sp, uint32_t flags, HelHandle *handle);
969 HelHandle queue, uintptr_t context);
1017HEL_C_LINKAGE HelError helWriteFsBase(
void *pointer);
1019HEL_C_LINKAGE HelError helReadFsBase(
void **pointer);
1021HEL_C_LINKAGE HelError helWriteGsBase(
void *pointer);
1023HEL_C_LINKAGE HelError helReadGsBase(
void **pointer);
1042 HelHandle queue, uintptr_t context, uint64_t *asyncId);
1044HEL_C_LINKAGE HelError helCreateVirtualizedCpu(HelHandle handle, HelHandle *out_handle);
1046HEL_C_LINKAGE HelError helRunVirtualizedCpu(HelHandle handle,
struct HelVmexitReason *reason);
1048HEL_C_LINKAGE HelError helGetRandomBytes(
void *buffer,
size_t wantedSize,
size_t *actualSize);
1059HEL_C_LINKAGE HelError
helGetAffinity(HelHandle handle, uint8_t *mask,
size_t size,
size_t *actualSize);
1081HEL_C_LINKAGE HelError
helCreateStream(HelHandle *lane1, HelHandle *lane2, uint32_t attach_credentials);
1090HEL_C_LINKAGE HelError
helSubmitAsync(HelHandle handle,
const struct HelAction *actions,
1091 size_t count, HelHandle queue, uintptr_t context, uint32_t flags);
1093HEL_C_LINKAGE HelError helShutdownLane(HelHandle handle);
1116HEL_C_LINKAGE HelError
helFutexWait(
int *pointer,
int expected, int64_t deadline);
1144HEL_C_LINKAGE HelError helAccessIrq(
int number, HelHandle *handle);
1146HEL_C_LINKAGE HelError helAcknowledgeIrq(HelHandle handle, uint32_t flags, uint64_t sequence);
1156 HelHandle queue, uintptr_t context, uint64_t *asyncId);
1158HEL_C_LINKAGE HelError helAutomateIrq(HelHandle handle, uint32_t flags, HelHandle kernlet);
1164HEL_C_LINKAGE HelError helAccessIo(uintptr_t *port_array,
size_t num_ports,
1172HEL_C_LINKAGE HelError helEnableFullIo();
1188 const union HelKernletData *data,
size_t numData, HelHandle *boundHandle);
1192extern inline __attribute__ (( always_inline ))
const char *_helErrorString(HelError code) {
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";
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:
1230 case kHelErrOutOfBounds:
1231 return "Out of bounds";
1232 case kHelErrAlreadyExists:
1233 return "Already exists";
1239extern inline __attribute__ (( always_inline ))
void _helCheckFailed(HelError err_code,
1240 const char *
string,
int fatal) {
1241 helLog(kHelLogSeverityError,
string, strlen(
string));
1243 const char *err_string = _helErrorString(err_code);
1245 err_string =
"(Unexpected error code)";
1246 helLog(kHelLogSeverityError, err_string, strlen(err_string));
1247 helLog(kHelLogSeverityError,
"\n", 1);
1253#define HEL_STRINGIFY_AUX(x) #x
1254#define HEL_STRINGIFY(x) HEL_STRINGIFY_AUX(x)
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)
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