11 #include "hel-types.h"
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 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,
131 kHelErrRemoteFault = 21,
132 kHelErrNoHardwareSupport = 16,
133 kHelErrNoMemory = 17,
134 kHelErrAlreadyExists = 22
137 struct HelX86SegmentRegister {
141 uint8_t type, present, dpl, db, s, l, g, avl;
144 struct HelX86DescriptorTable {
149 struct HelX86VirtualizationRegs {
170 struct HelX86SegmentRegister cs, ds, es, fs, gs, ss;
171 struct HelX86SegmentRegister tr, ldt;
172 struct HelX86DescriptorTable gdt, idt;
174 uint64_t cr0, cr2, cr3, cr4, cr8;
181 kHelThisUniverse = -1,
187 kHelWaitInfinite = -1
195 kHelActionDismiss = 11,
197 kHelActionAccept = 6,
198 kHelActionImbueCredentials = 8,
199 kHelActionExtractCredentials = 9,
200 kHelActionSendFromBuffer = 1,
201 kHelActionSendFromBufferSg = 10,
202 kHelActionRecvInline = 7,
203 kHelActionRecvToBuffer = 3,
204 kHelActionPushDescriptor = 2,
205 kHelActionPullDescriptor = 4
210 kHelItemAncillary = 2,
211 kHelItemWantLane = (1 << 16),
228 struct HelDescriptorInfo {
233 kHelAllocContinuous = 4,
234 kHelAllocOnDemand = 1,
237 struct HelAllocRestrictions {
241 enum HelManagedFlags {
242 kHelManagedReadahead = 1
245 enum HelManageRequests {
246 kHelManageInitialize = 1,
247 kHelManageWriteback = 2
252 kHelMapProtRead = 256,
253 kHelMapProtWrite = 512,
254 kHelMapProtExecute = 1024,
255 kHelMapDontRequireBacking = 128,
257 kHelMapFixedNoReplace = 4096
260 enum HelThreadFlags {
261 kHelThreadStopped = 1
264 enum HelObservation {
266 kHelObserveInterrupt = 4,
267 kHelObservePanic = 3,
268 kHelObserveBreakpoint = 1,
269 kHelObservePageFault = 2,
270 kHelObserveGeneralFault = 5,
271 kHelObserveIllegalInstruction = 6,
272 kHelObserveDivByZero = 7,
273 kHelObserveSuperCall = 0x80000000
276 enum HelRegisterSets {
281 kHelRegsVirtualization = 5,
292 #if defined(__x86_64__)
293 enum HelRegisterIndex {
316 enum HelSyscallArgs {
317 kHelRegNumber = kHelRegRdi,
318 kHelRegError = kHelRegRdi,
320 kHelRegArg0 = kHelRegRsi,
321 kHelRegArg1 = kHelRegRdx,
322 kHelRegArg2 = kHelRegRax,
323 kHelRegArg3 = kHelRegR8,
324 kHelRegArg4 = kHelRegR9,
325 kHelRegArg5 = kHelRegR10,
326 kHelRegArg6 = kHelRegR12,
327 kHelRegArg7 = kHelRegR13,
328 kHelRegArg8 = kHelRegR14,
330 kHelRegOut0 = kHelRegRsi,
331 kHelRegOut1 = kHelRegRdx
334 #elif defined(__aarch64__)
335 enum HelRegisterIndex {
374 enum HelSyscallArgs {
375 kHelRegNumber = kHelRegX0,
376 kHelRegError = kHelRegX0,
378 kHelRegArg0 = kHelRegX1,
379 kHelRegArg1 = kHelRegX2,
380 kHelRegArg2 = kHelRegX3,
381 kHelRegArg3 = kHelRegX4,
382 kHelRegArg4 = kHelRegX5,
383 kHelRegArg5 = kHelRegX6,
384 kHelRegArg6 = kHelRegX7,
385 kHelRegArg7 = kHelRegX8,
386 kHelRegArg8 = kHelRegX9,
388 kHelRegOut0 = kHelRegX1,
389 kHelRegOut1 = kHelRegX2
393 struct HelQueueParameters {
395 unsigned int ringShift;
396 unsigned int numChunks;
442 unsigned int reserved;
447 struct HelSimpleResult {
452 struct HelCredentialsResult {
455 char credentials[16];
458 struct HelManageResult {
465 struct HelObserveResult {
467 unsigned int observation;
471 struct HelInlineResult {
478 struct HelInlineResultNoFlex {
484 struct HelLengthResult {
490 struct HelHandleResult {
496 struct HelEventResult {
503 kHelAckAcknowledge = 2,
506 kHelAckClear = 0x100,
509 union HelKernletData {
513 struct HelThreadStats {
519 kHelVmexitTranslationFault = 1,
520 kHelVmexitError = -1,
521 kHelVmexitUnknownPlatformSpecificExitCode = -2,
524 struct HelVmexitReason {
539 HEL_C_LINKAGE HelError
helLog(
const char *
string,
size_t length);
546 HEL_C_LINKAGE
void helPanic(
const char *
string,
size_t length)
547 __attribute__ (( noreturn ));
554 HEL_C_LINKAGE HelError
helNop();
559 HEL_C_LINKAGE HelError
helSubmitAsyncNop(HelHandle queueHandle, uintptr_t context);
578 HelHandle *outHandle);
580 HEL_C_LINKAGE HelError helDescriptorInfo(HelHandle handle,
struct HelDescriptorInfo *info);
595 HEL_C_LINKAGE HelError
helCloseDescriptor(HelHandle universeHandle, HelHandle handle);
602 HEL_C_LINKAGE HelError
helCreateQueue(
struct HelQueueParameters *params,
610 HEL_C_LINKAGE HelError
helCancelAsync(HelHandle queueHandle, uint64_t asyncId);
626 struct HelAllocRestrictions *restrictions, HelHandle *handle);
634 HEL_C_LINKAGE HelError
helResizeMemory(HelHandle handle,
size_t newSize);
648 HelHandle *backingHandle, HelHandle *frontalHandle);
661 uintptr_t offset,
size_t size, HelHandle *handle);
663 HEL_C_LINKAGE HelError helAccessPhysical(uintptr_t physical,
664 size_t size, HelHandle *handle);
690 HelHandle memoryHandle, uintptr_t offset,
size_t size);
692 HEL_C_LINKAGE HelError helCreateSliceView(HelHandle bundle, uintptr_t offset,
size_t size,
693 uint32_t flags, HelHandle *handle);
702 HEL_C_LINKAGE HelError
helForkMemory(HelHandle handle, HelHandle *forkedHandle);
726 HEL_C_LINKAGE HelError
helMapMemory(HelHandle memoryHandle, HelHandle spaceHandle,
727 void *pointer, uintptr_t offset,
size_t size, uint32_t flags,
void **actualPointer);
741 void *pointer,
size_t size, uint32_t flags,
742 HelHandle queueHandle, uintptr_t context);
760 void *pointer,
size_t size,
761 HelHandle queueHandle, uintptr_t context);
773 HEL_C_LINKAGE HelError
helUnmapMemory(HelHandle spaceHandle,
void *pointer,
size_t size);
775 HEL_C_LINKAGE HelError helPointerPhysical(
const void *pointer, uintptr_t *physical);
789 size_t length,
void *buffer,
790 HelHandle queue, uintptr_t context);
804 size_t length,
const void *buffer,
805 HelHandle queue, uintptr_t context);
807 HEL_C_LINKAGE HelError helMemoryInfo(HelHandle handle,
810 HEL_C_LINKAGE HelError helSubmitManageMemory(HelHandle handle,
811 HelHandle queue, uintptr_t context);
813 HEL_C_LINKAGE HelError helUpdateMemory(HelHandle handle,
int type, uintptr_t offset,
size_t length);
815 HEL_C_LINKAGE HelError helSubmitLockMemoryView(HelHandle handle, uintptr_t offset,
size_t size,
816 HelHandle queue, uintptr_t context);
828 HEL_C_LINKAGE HelError
helLoadahead(HelHandle handle, uintptr_t offset,
size_t length);
830 HEL_C_LINKAGE HelError helCreateVirtualizedSpace(HelHandle *handle);
849 HEL_C_LINKAGE HelError
helCreateThread(HelHandle universe, HelHandle spaceHandle,
850 HelAbi abi,
void *ip,
void *sp, uint32_t flags, HelHandle *handle);
857 HEL_C_LINKAGE HelError
helQueryThreadStats(HelHandle handle,
struct HelThreadStats *stats);
867 HEL_C_LINKAGE HelError
helSetPriority(HelHandle handle,
int priority);
879 HEL_C_LINKAGE HelError
helSubmitObserve(HelHandle handle, uint64_t sequence,
880 HelHandle queue, uintptr_t context);
901 HEL_C_LINKAGE HelError
helResume(HelHandle handle);
910 HEL_C_LINKAGE HelError
helLoadRegisters(HelHandle handle,
int set,
void *image);
919 HEL_C_LINKAGE HelError
helStoreRegisters(HelHandle handle,
int set,
const void *image);
928 HEL_C_LINKAGE HelError helWriteFsBase(
void *pointer);
930 HEL_C_LINKAGE HelError helReadFsBase(
void **pointer);
932 HEL_C_LINKAGE HelError helWriteGsBase(
void *pointer);
934 HEL_C_LINKAGE HelError helReadGsBase(
void **pointer);
943 HEL_C_LINKAGE HelError
helGetClock(uint64_t *counter);
953 HelHandle queue, uintptr_t context, uint64_t *asyncId);
955 HEL_C_LINKAGE HelError helCreateVirtualizedCpu(HelHandle handle, HelHandle *out_handle);
957 HEL_C_LINKAGE HelError helRunVirtualizedCpu(HelHandle handle,
struct HelVmexitReason *reason);
959 HEL_C_LINKAGE HelError helGetRandomBytes(
void *buffer,
size_t wantedSize,
size_t *actualSize);
970 HEL_C_LINKAGE HelError
helGetAffinity(HelHandle handle, uint8_t *mask,
size_t size,
size_t *actualSize);
979 HEL_C_LINKAGE HelError
helSetAffinity(HelHandle handle, uint8_t *mask,
size_t size);
990 HEL_C_LINKAGE HelError
helCreateStream(HelHandle *lane1, HelHandle *lane2);
999 HEL_C_LINKAGE HelError
helSubmitAsync(HelHandle handle,
const struct HelAction *actions,
1000 size_t count, HelHandle queue, uintptr_t context, uint32_t flags);
1002 HEL_C_LINKAGE HelError helShutdownLane(HelHandle handle);
1025 HEL_C_LINKAGE HelError
helFutexWait(
int *pointer,
int expected, int64_t deadline);
1051 HEL_C_LINKAGE HelError helAccessIrq(
int number, HelHandle *handle);
1053 HEL_C_LINKAGE HelError helAcknowledgeIrq(HelHandle handle, uint32_t flags, uint64_t sequence);
1063 HelHandle queue, uintptr_t context);
1065 HEL_C_LINKAGE HelError helAutomateIrq(HelHandle handle, uint32_t flags, HelHandle kernlet);
1071 HEL_C_LINKAGE HelError helAccessIo(uintptr_t *port_array,
size_t num_ports,
1077 HEL_C_LINKAGE HelError
helEnableIo(HelHandle handle);
1079 HEL_C_LINKAGE HelError helEnableFullIo();
1095 const union HelKernletData *data,
size_t numData, HelHandle *boundHandle);
1099 extern inline __attribute__ (( always_inline ))
const char *_helErrorString(HelError code) {
1103 case kHelErrIllegalSyscall:
1104 return "Illegal syscall";
1105 case kHelErrIllegalArgs:
1106 return "Illegal arguments";
1107 case kHelErrIllegalState:
1108 return "Illegal state";
1109 case kHelErrUnsupportedOperation:
1110 return "Unsupported operation";
1111 case kHelErrNoDescriptor:
1112 return "No such descriptor";
1113 case kHelErrBadDescriptor:
1114 return "Illegal descriptor for this operation";
1115 case kHelErrThreadTerminated:
1116 return "Thread terminated already";
1117 case kHelErrLaneShutdown:
1118 return "Lane shutdown";
1119 case kHelErrEndOfLane:
1120 return "End of lane";
1121 case kHelErrDismissed:
1122 return "IPC item dismissed by remote";
1123 case kHelErrBufferTooSmall:
1124 return "Buffer too small";
1125 case kHelErrQueueTooSmall:
1126 return "Buffer too small";
1129 case kHelErrNoHardwareSupport:
1130 return "Missing hardware support for this feature";
1131 case kHelErrNoMemory:
1132 return "Out of memory";
1133 case kHelErrTransmissionMismatch:
1134 return "Transmission mismatch";
1135 case kHelErrCancelled:
1137 case kHelErrOutOfBounds:
1138 return "Out of bounds";
1139 case kHelErrAlreadyExists:
1140 return "Already exists";
1146 extern inline __attribute__ (( always_inline ))
void _helCheckFailed(HelError err_code,
1147 const char *
string,
int fatal) {
1148 helLog(
string, strlen(
string));
1150 const char *err_string = _helErrorString(err_code);
1152 err_string =
"(Unexpected error code)";
1153 helLog(err_string, strlen(err_string));
1160 #define HEL_STRINGIFY_AUX(x) #x
1161 #define HEL_STRINGIFY(x) HEL_STRINGIFY_AUX(x)
1163 #define HEL_CHECK(expr) do { HelError __error = expr; if(__error != kHelErrNone) \
1164 _helCheckFailed(__error, "HEL_CHECK failed: " #expr "\n" \
1165 " In file " __FILE__ " on line " HEL_STRINGIFY(__LINE__) "\n", 1); } while(0)
1166 #define HEL_SOFT_CHECK(expr) do { HelError __error = expr; if(__error != kHelErrNone) \
1167 _helCheckFailed(__error, "HEL_SOFT_CHECK failed: " #expr "\n" \
1168 " In file " __FILE__ " on line " HEL_STRINGIFY(__LINE__) "\n", 0); } while(0)