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 kHelCallDriveQueue = 105,
37 kHelCallAlertQueue = 106,
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,
63 kHelCallCreateThread = 67,
64 kHelCallQueryThreadStats = 95,
65 kHelCallSetPriority = 85,
67 kHelCallSubmitObserve = 74,
68 kHelCallKillThread = 87,
69 kHelCallInterruptThread = 86,
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 kHelCallAssertVirtualizedIrq = 107,
80 kHelCallGetRandomBytes = 101,
81 kHelCallWriteGsBase = 54,
82 kHelCallReadFsBase = 55,
83 kHelCallReadGsBase = 56,
84 kHelCallGetCurrentCpu = 57,
86 kHelCallCreateStream = 68,
87 kHelCallSubmitAsync = 79,
88 kHelCallShutdownLane = 91,
90 kHelCallFutexWait = 73,
91 kHelCallFutexWake = 71,
93 kHelCallCreateOneshotEvent = 96,
94 kHelCallCreateBitsetEvent = 97,
95 kHelCallRaiseEvent = 98,
96 kHelCallAccessIrq = 14,
97 kHelCallAcknowledgeIrq = 81,
98 kHelCallSubmitAwaitEvent = 82,
99 kHelCallAutomateIrq = 94,
101 kHelCallAccessIo = 11,
102 kHelCallEnableIo = 12,
103 kHelCallEnableFullIo = 35,
105 kHelCallBindKernlet = 93,
107 kHelCallGetAffinity = 103,
108 kHelCallSetAffinity = 100,
110 kHelCallCreateToken = 104,
112 kHelCallSuper = 0x80000000
117 kHelErrBufferTooSmall = 1,
118 kHelErrBadDescriptor = 2,
120 kHelErrNoDescriptor = 4,
121 kHelErrIllegalSyscall = 5,
122 kHelErrIllegalObject = 6,
123 kHelErrIllegalArgs = 7,
124 kHelErrLaneShutdown = 8,
125 kHelErrEndOfLane = 9,
127 kHelErrThreadTerminated = 11,
128 kHelErrCancelled = 12,
129 kHelErrTransmissionMismatch = 13,
130 kHelErrQueueTooSmall = 14,
131 kHelErrIllegalState = 15,
132 kHelErrNoHardwareSupport = 16,
133 kHelErrNoMemory = 17,
134 kHelErrUnsupportedOperation = 18,
135 kHelErrOutOfBounds = 19,
136 kHelErrDismissed = 20,
137 kHelErrRemoteFault = 21,
138 kHelErrAlreadyExists = 22,
139 kHelErrBadPermissions = 23,
141 kHelErrFutexRace = 25,
142 kHelErrBadRights = 26,
145typedef uint32_t HelRights;
151static const HelRights kHelRightNull = 0;
160static const HelRights kHelRightGrant = UINT32_C(1) << 0;
164static const HelRights kHelRightTake = UINT32_C(1) << 1;
177static const HelRights kHelRightRead = UINT32_C(1) << 2;
190static const HelRights kHelRightWrite = UINT32_C(1) << 3;
194static const HelRights kHelRightExecute = UINT32_C(1) << 4;
199static const HelRights kHelRightInvoke = UINT32_C(1) << 5;
215static const HelRights kHelRightAssign = UINT32_C(1) << 6;
218static const HelRights kHelRightDerive = UINT32_C(1) << 7;
225static const HelRights kHelRightProvision = UINT32_C(1) << 8;
228static const HelRights kHelRightPin = UINT32_C(1) << 9;
231static const HelRights kHelRightFence = UINT32_C(1) << 10;
238static const HelRights kHelRightWait = UINT32_C(1) << 11;
247static const HelRights kHelRightSignal = UINT32_C(1) << 12;
256static const HelRights kHelRightManage = UINT32_C(1) << 13;
258struct HelX86SegmentRegister {
262 uint8_t type, present, dpl, db, s, l, g, avl;
265struct HelX86DescriptorTable {
270struct HelX86VirtualizationRegs {
291 struct HelX86SegmentRegister cs, ds, es, fs, gs, ss;
292 struct HelX86SegmentRegister tr, ldt;
293 struct HelX86DescriptorTable gdt, idt;
295 uint64_t cr0, cr2, cr3, cr4, cr8;
300struct HelRiscv64VirtualizationRegs {
356#if defined(__riscv) && __riscv_xlen == 64
357typedef struct HelRiscv64VirtualizationRegs HelVirtualizationRegs;
359typedef struct HelX86VirtualizationRegs HelVirtualizationRegs;
364 kHelThisUniverse = -1,
370 kHelWaitInfinite = -1
379 kHelActionDismiss = 11,
381 kHelActionAccept = 6,
382 kHelActionImbueCredentials = 8,
383 kHelActionExtractCredentials = 9,
384 kHelActionSendFromBuffer = 1,
385 kHelActionSendFromBufferSg = 10,
386 kHelActionRecvInline = 7,
387 kHelActionRecvToBuffer = 3,
388 kHelActionPushDescriptor = 2,
389 kHelActionPullDescriptor = 4
394 kHelItemAncillary = 2,
395 kHelItemWantLane = (1 << 16),
398enum HelTransferDescriptorFlags {
399 kHelTransferDescriptorOut,
400 kHelTransferDescriptorIn,
417struct HelDescriptorInfo {
422 kHelAllocContinuous = 4,
423 kHelAllocOnDemand = 1,
426struct HelAllocRestrictions {
430enum HelManagedFlags {
431 kHelManagedReadahead = 1
434enum HelManageRequests {
435 kHelManageInitialize = 1,
436 kHelManageWriteback = 2
441 kHelMapProtRead = 256,
442 kHelMapProtWrite = 512,
443 kHelMapProtExecute = 1024,
444 kHelMapDontRequireBacking = 128,
446 kHelMapFixedNoReplace = 4096,
447 kHelMapPreferBottom = 8192
451 kHelSliceCacheWriteCombine = 1,
455 kHelThreadStopped = 1
460 kHelObserveInterrupt = 4,
461 kHelObservePanic = 3,
462 kHelObserveBreakpoint = 1,
463 kHelObservePageFault = 2,
464 kHelObserveGeneralFault = 5,
465 kHelObserveIllegalInstruction = 6,
466 kHelObserveDivByZero = 7,
467 kHelObserveSuperCall = 0x80000000
470enum HelRegisterSets {
475 kHelRegsVirtualization = 5,
478 kHelRegsPageFault = 8
481enum HelPageFaultFlags {
482 kHelPageFaultMapError = 1,
483 kHelPageFaultAccessError = 2
492#if defined(__x86_64__)
493enum HelRegisterIndex {
517 kHelRegNumber = kHelRegRdi,
518 kHelRegError = kHelRegRdi,
520 kHelRegArg0 = kHelRegRsi,
521 kHelRegArg1 = kHelRegRdx,
522 kHelRegArg2 = kHelRegRax,
523 kHelRegArg3 = kHelRegR8,
524 kHelRegArg4 = kHelRegR9,
525 kHelRegArg5 = kHelRegR10,
526 kHelRegArg6 = kHelRegR12,
527 kHelRegArg7 = kHelRegR13,
528 kHelRegArg8 = kHelRegR14,
530 kHelRegOut0 = kHelRegRsi,
531 kHelRegOut1 = kHelRegRdx,
532 kHelRegOut2 = kHelRegRax
535#elif defined(__aarch64__)
536enum HelRegisterIndex {
576 kHelRegNumber = kHelRegX0,
577 kHelRegError = kHelRegX0,
579 kHelRegArg0 = kHelRegX1,
580 kHelRegArg1 = kHelRegX2,
581 kHelRegArg2 = kHelRegX3,
582 kHelRegArg3 = kHelRegX4,
583 kHelRegArg4 = kHelRegX5,
584 kHelRegArg5 = kHelRegX6,
585 kHelRegArg6 = kHelRegX7,
586 kHelRegArg7 = kHelRegX8,
587 kHelRegArg8 = kHelRegX9,
589 kHelRegOut0 = kHelRegX1,
590 kHelRegOut1 = kHelRegX2,
591 kHelRegOut2 = kHelRegX3
594#elif defined(__riscv) && __riscv_xlen == 64
595enum HelRegisterIndex {
631 kHelRegNumber = kHelRegA0,
632 kHelRegError = kHelRegA0,
633 kHelRegArg0 = kHelRegA1,
634 kHelRegArg1 = kHelRegA2,
635 kHelRegArg2 = kHelRegA3,
636 kHelRegArg3 = kHelRegA4,
637 kHelRegArg4 = kHelRegA5,
638 kHelRegArg5 = kHelRegA6,
639 kHelRegArg6 = kHelRegA7,
640 kHelRegArg7 = kHelRegS2,
641 kHelRegArg8 = kHelRegS3,
643 kHelRegOut0 = kHelRegA1,
644 kHelRegOut1 = kHelRegA2,
645 kHelRegOut2 = kHelRegA3
650struct HelQueueParameters {
652 unsigned int numChunks;
654 unsigned int numSqChunks;
764 uint64_t cancellationTag;
908struct HelSimpleResult {
913struct HelCredentialsResult {
916 char credentials[16];
919struct HelManageResult {
926struct HelObserveResult {
928 unsigned int observation;
931struct HelInlineResult {
938struct HelInlineResultNoFlex {
944struct HelLengthResult {
950struct HelHandleResult {
956struct HelEventResult {
963 kHelAckAcknowledge = 2,
966 kHelAckClear = 0x100,
969union HelKernletData {
973struct HelThreadStats {
979 kHelVmexitTranslationFault = 1,
980 kHelVmexitHyperCall = 2,
981 kHelVmexitInstructionTrap = 3,
982 kHelVmexitError = -1,
983 kHelVmexitUnknownPlatformSpecificExitCode = -2,
987 kHelVmFaultRead = 1 << 0,
988 kHelVmFaultWrite = 1 << 1,
989 kHelVmFaultExecute = 1 << 2,
992#if defined(__riscv) && __riscv_xlen == 64
994struct HelVmexitReason {
998 uint64_t instruction;
1005struct HelVmexitReason {
1006 uint32_t exitReason;
1015enum HelLogSeverity {
1016 kHelLogSeverityEmergency,
1017 kHelLogSeverityAlert,
1018 kHelLogSeverityCritical,
1019 kHelLogSeverityError,
1020 kHelLogSeverityWarning,
1021 kHelLogSeverityNotice,
1022 kHelLogSeverityInfo,
1023 kHelLogSeverityDebug,
1036HEL_C_LINKAGE HelError
helLog(
const enum HelLogSeverity severity,
const char *
string,
size_t length);
1043HEL_C_LINKAGE
void helPanic(
const char *
string,
size_t length)
1044 __attribute__ (( noreturn ));
1074HEL_C_LINKAGE HelError
1076 enum HelTransferDescriptorFlags direction, HelHandle *outHandle);
1078HEL_C_LINKAGE HelError helDescriptorInfo(HelHandle handle,
struct HelDescriptorInfo *info);
1118HEL_C_LINKAGE HelError
helDriveQueue(HelHandle queueHandle, uint32_t flags, uint32_t notifyMask);
1142 const struct HelAllocRestrictions *restrictions, HelHandle *handle);
1164 HelHandle *backingHandle, HelHandle *frontalHandle);
1177 uintptr_t offset,
size_t size, HelHandle *handle);
1179HEL_C_LINKAGE HelError helAccessPhysical(uintptr_t physical,
1180 size_t size, HelHandle *handle);
1206 HelHandle memoryHandle, uintptr_t offset,
size_t size);
1208HEL_C_LINKAGE HelError helCreateSliceView(HelHandle bundle, uintptr_t offset,
size_t size,
1209 uint32_t flags, HelHandle *handle);
1242HEL_C_LINKAGE HelError
helMapMemory(HelHandle memoryHandle, HelHandle spaceHandle,
1243 void *pointer, uintptr_t offset,
size_t size, uint32_t flags,
void **actualPointer);
1256HEL_C_LINKAGE HelError
helUnmapMemory(HelHandle spaceHandle,
void *pointer,
size_t size);
1258HEL_C_LINKAGE HelError helPointerPhysical(HelHandle spaceHandle,
const void *pointer, uintptr_t *physical);
1260HEL_C_LINKAGE HelError helMemoryInfo(HelHandle handle,
1263HEL_C_LINKAGE HelError helUpdateMemory(HelHandle handle,
int type, uintptr_t offset,
size_t length);
1275HEL_C_LINKAGE HelError
helLoadahead(HelHandle handle, uintptr_t offset,
size_t length);
1277HEL_C_LINKAGE HelError helCreateVirtualizedSpace(HelHandle *handle);
1297 HelAbi abi,
void *ip,
void *sp, uint32_t flags, HelHandle *handle);
1365HEL_C_LINKAGE HelError helWriteFsBase(
void *pointer);
1367HEL_C_LINKAGE HelError helReadFsBase(
void **pointer);
1369HEL_C_LINKAGE HelError helWriteGsBase(
void *pointer);
1371HEL_C_LINKAGE HelError helReadGsBase(
void **pointer);
1382HEL_C_LINKAGE HelError helCreateVirtualizedCpu(HelHandle handle, HelHandle *out_handle);
1384HEL_C_LINKAGE HelError helRunVirtualizedCpu(HelHandle handle,
struct HelVmexitReason *reason);
1386HEL_C_LINKAGE HelError helAssertVirtualizedIrq(HelHandle handle, uint64_t irq, uint8_t level);
1388HEL_C_LINKAGE HelError helGetRandomBytes(
void *buffer,
size_t wantedSize,
size_t *actualSize);
1399HEL_C_LINKAGE HelError
helGetAffinity(HelHandle handle, uint8_t *mask,
size_t size,
size_t *actualSize);
1421HEL_C_LINKAGE HelError
helCreateStream(HelHandle *lane1, HelHandle *lane2, uint32_t attach_credentials);
1423HEL_C_LINKAGE HelError helShutdownLane(HelHandle handle);
1446HEL_C_LINKAGE HelError
helFutexWait(
int *pointer,
int expected, int64_t deadline);
1474HEL_C_LINKAGE HelError helAccessIrq(
int number, HelHandle *handle);
1476HEL_C_LINKAGE HelError helAcknowledgeIrq(HelHandle handle, uint32_t flags, uint64_t sequence);
1478HEL_C_LINKAGE HelError helAutomateIrq(HelHandle handle, uint32_t flags, HelHandle kernlet);
1484HEL_C_LINKAGE HelError helAccessIo(uintptr_t *port_array,
size_t num_ports,
1492HEL_C_LINKAGE HelError helEnableFullIo();
1508 const union HelKernletData *data,
size_t numData, HelHandle *boundHandle);
1512extern inline __attribute__ (( always_inline ))
const char *_helErrorString(HelError code) {
1516 case kHelErrIllegalSyscall:
1517 return "Illegal syscall";
1518 case kHelErrIllegalArgs:
1519 return "Illegal arguments";
1520 case kHelErrIllegalState:
1521 return "Illegal state";
1522 case kHelErrUnsupportedOperation:
1523 return "Unsupported operation";
1524 case kHelErrNoDescriptor:
1525 return "No such descriptor";
1526 case kHelErrBadDescriptor:
1527 return "Illegal descriptor for this operation";
1528 case kHelErrThreadTerminated:
1529 return "Thread terminated already";
1530 case kHelErrLaneShutdown:
1531 return "Lane shutdown";
1532 case kHelErrEndOfLane:
1533 return "End of lane";
1534 case kHelErrDismissed:
1535 return "IPC item dismissed by remote";
1536 case kHelErrBufferTooSmall:
1537 return "Buffer too small";
1538 case kHelErrQueueTooSmall:
1539 return "Buffer too small";
1542 case kHelErrNoHardwareSupport:
1543 return "Missing hardware support for this feature";
1544 case kHelErrNoMemory:
1545 return "Out of memory";
1546 case kHelErrTransmissionMismatch:
1547 return "Transmission mismatch";
1548 case kHelErrCancelled:
1550 case kHelErrOutOfBounds:
1551 return "Out of bounds";
1552 case kHelErrAlreadyExists:
1553 return "Already exists";
1554 case kHelErrBadRights:
1555 return "Missing rights for this operation";
1561extern inline __attribute__ (( always_inline ))
void _helCheckFailed(HelError err_code,
1562 const char *
string,
int fatal) {
1563 helLog(kHelLogSeverityError,
string, strlen(
string));
1565 const char *err_string = _helErrorString(err_code);
1567 err_string =
"(Unexpected error code)";
1568 helLog(kHelLogSeverityError, err_string, strlen(err_string));
1569 helLog(kHelLogSeverityError,
"\n", 1);
1575#define HEL_STRINGIFY_AUX(x) #x
1576#define HEL_STRINGIFY(x) HEL_STRINGIFY_AUX(x)
1578#define HEL_CHECK(expr) do { HelError __error = expr; if(__error != kHelErrNone) \
1579 _helCheckFailed(__error, "HEL_CHECK failed: " #expr "\n" \
1580 " In file " __FILE__ " on line " HEL_STRINGIFY(__LINE__) "\n", 1); } while(0)
1581#define HEL_SOFT_CHECK(expr) do { HelError __error = expr; if(__error != kHelErrNone) \
1582 _helCheckFailed(__error, "HEL_SOFT_CHECK failed: " #expr "\n" \
1583 " 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.
static const int kHelUserNotifyAlert
Set in userNotify when the queue is alerted.
Definition hel.h:664
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:667
static const uint32_t kHelSubmitInvalidateMemory
SQ opcode: invalidate memory.
Definition hel.h:705
HEL_C_LINKAGE HelError helQueryThreadStats(HelHandle handle, struct HelThreadStats *stats)
Query run-time statistics of a thread.
HEL_C_LINKAGE HelError helAlterMemoryIndirection(HelHandle indirectHandle, size_t slotIndex, HelHandle memoryHandle, uintptr_t offset, size_t size)
Modifies indirect memory objects.
HEL_C_LINKAGE HelError helCreateBitsetEvent(HelHandle *handle)
Create an event consisting of multiple bits that can fire independently.
HEL_C_LINKAGE HelError helGetCredentials(HelHandle handle, uint32_t flags, char *credentials)
Returns the credentials associated with a given descriptor.
HEL_C_LINKAGE HelError helKillThread(HelHandle handle)
Kill (i.e., terminate) a thread.
static const uint32_t kHelSubmitWriteMemory
SQ opcode: write memory.
Definition hel.h:691
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:677
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:734
static const uint32_t kHelSubmitManageMemory
SQ opcode: manage memory.
Definition hel.h:693
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:701
HEL_C_LINKAGE HelError helInterruptThread(HelHandle handle)
Interrupt a thread.
static const int kHelProgressFull
Set by the producer once the chunk is full (i.e., no more bytes will be written).
Definition hel.h:738
static const uint32_t kHelSubmitSynchronizeSpace
SQ opcode: synchronize space.
Definition hel.h:687
HEL_C_LINKAGE HelError helRaiseEvent(HelHandle handle)
Raise an event.
static const uint32_t kHelDriveWait
Flag for helDriveQueue: wait until userNotify has any bits not in notifyMask set.
Definition hel.h:672
static const uint32_t kHelSubmitObserve
SQ opcode: observe thread.
Definition hel.h:697
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:679
static const uint32_t kHelSubmitReadMemory
SQ opcode: read memory.
Definition hel.h:689
static const int kHelNextPresent
Marks the next field as present.
Definition hel.h:731
static const int kHelKernelNotifySupplyCqChunks
Set in kernelNotify after userspace has supplied new chunks.
Definition hel.h:669
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:683
static const uint32_t kHelSubmitAwaitClock
SQ opcode: wait for time to pass.
Definition hel.h:681
static const uint32_t kHelSubmitPopulateSpace
SQ opcode: populate a space.
Definition hel.h:707
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:685
static const int kHelUserNotifySupplySqChunks
Set in userNotify after kernel has supplied new SQ chunks.
Definition hel.h:660
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:658
HEL_C_LINKAGE HelError helCreateSpace(HelHandle *handle)
Creates a virtual address space that threads can run in.
static const uint32_t kHelSubmitWritebackFence
SQ opcode: writeback fence.
Definition hel.h:703
static const uint32_t kHelSubmitResizeMemory
SQ opcode: resize memory.
Definition hel.h:699
HEL_C_LINKAGE HelError helCreateOneshotEvent(HelHandle *handle)
Create an event that fires at most once.
HEL_C_LINKAGE HelError helDriveQueue(HelHandle queueHandle, uint32_t flags, uint32_t notifyMask)
Drives an IPC queue.
static const uint32_t kHelSubmitLockMemoryView
SQ opcode: lock memory view.
Definition hel.h:695
HEL_C_LINKAGE HelError helCreateUniverse(HelHandle *handle)
Creates a new universe descriptor.
static const int kHelProgressDone
Set by the producer once it retires the chunk.
Definition hel.h:736
HEL_C_LINKAGE HelError helEnableIo(HelHandle handle)
Enable userspace access to hardware I/O resources.
static const int kHelUserNotifyError
Set in userNotify if the queue encounters a contract violation.
Definition hel.h:662
static const uint32_t kHelSubmitCancel
SQ opcode: cancel an asynchronous operation.
Definition hel.h:675
A single element of a HelQueue.
Definition hel.h:753
unsigned int length
Length of the element in bytes.
Definition hel.h:755
void * context
User-defined value.
Definition hel.h:759
unsigned int opcode
Operation code (for SQ elements).
Definition hel.h:757
In-memory kernel/user-space queue.
Definition hel.h:710
int kernelNotify
Futex that is used to wake the kernel.
Definition hel.h:719
int userNotify
Futex that is used to wake userspace.
Definition hel.h:714
int cqFirst
Index of the first chunk of the completion queue.
Definition hel.h:723
int sqFirst
Index of the first chunk of the submission queue.
Definition hel.h:727
Register-related information returned by helQueryRegisterInfo.
Definition hel.h:487
int setSize
Size of the selected register set.
Definition hel.h:489
SQ data for kHelSubmitAwaitClock.
Definition hel.h:779
uint64_t cancellationTag
Tag to cancel this operation.
Definition hel.h:783
uint64_t counter
Deadline in nanoseconds since boot.
Definition hel.h:781
SQ data for kHelSubmitAwaitEvent.
Definition hel.h:787
HelHandle handle
Handle to the event descriptor.
Definition hel.h:789
uint64_t cancellationTag
Tag to cancel this operation.
Definition hel.h:793
uint64_t sequence
Previous sequence number.
Definition hel.h:791
SQ data for kHelSubmitCancel.
Definition hel.h:763
SQ data for kHelSubmitExchangeMsgs.
Definition hel.h:769
uint32_t flags
Flags.
Definition hel.h:775
size_t count
Number of actions.
Definition hel.h:773
HelHandle lane
Handle to the lane.
Definition hel.h:771
SQ data for kHelSubmitForkMemory.
Definition hel.h:873
HelHandle handle
Handle to the memory object.
Definition hel.h:875
SQ data for kHelSubmitInvalidateMemory.
Definition hel.h:889
HelHandle handle
Handle to the memory object.
Definition hel.h:891
size_t size
Size of the range.
Definition hel.h:895
uintptr_t offset
Offset within the memory object.
Definition hel.h:893
SQ data for kHelSubmitLockMemoryView.
Definition hel.h:849
size_t size
Size to lock.
Definition hel.h:855
uintptr_t offset
Offset within the memory object.
Definition hel.h:853
HelHandle handle
Handle to the memory object.
Definition hel.h:851
SQ data for kHelSubmitManageMemory.
Definition hel.h:843
HelHandle handle
Handle to the memory object.
Definition hel.h:845
SQ data for kHelSubmitObserve.
Definition hel.h:859
HelHandle handle
Handle to the thread.
Definition hel.h:861
SQ data for kHelSubmitPopulateSpace.
Definition hel.h:899
HelHandle handle
Handle to the memory space.
Definition hel.h:901
uintptr_t address
Address within the memory space.
Definition hel.h:903
size_t length
Length of the range.
Definition hel.h:905
SQ data for kHelSubmitProtectMemory.
Definition hel.h:797
size_t size
Size of the mapping.
Definition hel.h:803
void * pointer
Pointer to the mapping.
Definition hel.h:801
uint32_t flags
Protection flags.
Definition hel.h:805
HelHandle spaceHandle
Handle to the address space.
Definition hel.h:799
SQ data for kHelSubmitReadMemory.
Definition hel.h:819
uintptr_t address
Address within the memory object.
Definition hel.h:823
HelHandle handle
Handle to the memory object.
Definition hel.h:821
size_t length
Length in bytes.
Definition hel.h:825
void * buffer
Buffer to read into.
Definition hel.h:827
SQ data for kHelSubmitResizeMemory.
Definition hel.h:865
HelHandle handle
Handle to the memory object.
Definition hel.h:867
size_t newSize
New size in bytes.
Definition hel.h:869
SQ data for kHelSubmitSynchronizeSpace.
Definition hel.h:809
void * pointer
Pointer to the mapping.
Definition hel.h:813
size_t size
Size of the mapping.
Definition hel.h:815
HelHandle spaceHandle
Handle to the address space.
Definition hel.h:811
SQ data for kHelSubmitWriteMemory.
Definition hel.h:831
HelHandle handle
Handle to the memory object.
Definition hel.h:833
size_t length
Length in bytes.
Definition hel.h:837
const void * buffer
Buffer to write from.
Definition hel.h:839
uintptr_t address
Address within the memory object.
Definition hel.h:835
SQ data for kHelSubmitWritebackFence.
Definition hel.h:879
HelHandle handle
Handle to the memory object.
Definition hel.h:881
size_t size
Size of the range.
Definition hel.h:885
uintptr_t offset
Offset within the memory object.
Definition hel.h:883