- #include "elf.h"
- #include <service.h>
- #include <stdint.h>
- #include <stringmap.h>
-
- extern Syscall *currentSyscall;
-
- uint32_t getServiceId(Service *searchService) {
- uint32_t i = 0;
- foreach (services, Service *, service, {
- if (service == searchService) {
- return i;
- }
- i++;
- })
- ;
- return i;
- }
-
- void handleGetServiceIdSyscall(Syscall *call) {
- call->returnValue = ((Service *)call->service)->id;
- }
-
- void handleGetServiceSyscall(Syscall *call) {
- uint32_t i = 0;
- Service *callService = call->service;
- char *name = retrieveString(call->parameters[0]);
- if (!name) {
- return;
- }
- foreach (services, Service *, service, {
- if (stringEquals(service->name, name)) {
- call->returnValue = i;
- return;
- }
- i++;
- })
- ;
- }
-
- void handleGetFunctionSyscall(Syscall *call) {
- uint32_t i = 0;
- Service *callService = call->service;
- char *name = retrieveString(call->parameters[1]);
- if (!name) {
- return;
- }
- Service *providerService = listGet(services, call->parameters[0]);
- foreach (providerService->functions, ServiceFunction *, provider, {
- if (stringEquals(provider->name, name)) {
- call->returnValue = i;
- return;
- }
- i++;
- })
- ;
- }
-
- void handleCreateFunctionSyscall(Syscall *call) {
- char *name = retrieveString(call->parameters[0]);
- if (!name) {
- return;
- }
- ServiceFunction *function = malloc(sizeof(ServiceFunction));
- Service *service = call->service;
- function->name = name;
- function->address = PTR(call->parameters[1]);
- function->service = call->service;
- call->returnValue = listCount(service->functions);
- listAdd(&service->functions, function);
- }
-
- void handleRequestSyscall(Syscall *call) {
- Service *service = call->service;
- Service *providerService = listGet(services, call->parameters[0]);
- if (!providerService)
- return;
- ServiceFunction *function =
- listGet(providerService->functions, call->parameters[1]);
- if (!function)
- return;
- scheduleFunction(function, call, call->parameters[2], call->parameters[3],
- service->nameHash, service->id);
- call->avoidReschedule = true;
- }
-
- void handleLookupSymbolSyscall(Syscall *call) {
- Service *service = listGet(services, call->parameters[0]);
- uint32_t location = call->parameters[1];
- for (uint32_t i = 0; i < service->symbolTableSize / sizeof(SymbolEntry);
- i++) {
- SymbolEntry *entry = &service->symbolTable[i];
- if (location >= entry->value &&
- location <= entry->value + entry->size) {
- char *name = service->stringTable + entry->name;
- call->returnValue = insertString(name);
- return;
- }
- }
- }
-
- void handleStackContainsSyscall(Syscall *call) {
- Syscall *currentCall = call;
- while (currentCall) {
- if (((Service *)currentCall->service)->id == call->parameters[0]) {
- call->returnValue = 1;
- return;
- }
- currentCall = currentCall->respondingTo;
- }
- call->returnValue = 0;
- }
-
- void handleForkSyscall(Syscall *call) {
- Service *service = call->service;
- ServiceFunction function = {
- .service = service,
- .address = PTR(call->parameters[0]),
- .name = "forked function",
- };
- scheduleFunction(&function, NULL, call->parameters[1], call->parameters[2], call->parameters[3]);
- }