diff --git a/src/kernel/include/service.h b/src/kernel/include/service.h index 5b094fd..46302e8 100644 --- a/src/kernel/include/service.h +++ b/src/kernel/include/service.h @@ -38,4 +38,7 @@ extern void scheduleProvider(Provider *provider, uintptr_t data1, uintptr_t data2, uintptr_t data3, Syscall *respondingTo); +extern void fireEvent(Event *event, uint32_t data1); +extern void installKernelEvents(); + #endif diff --git a/src/kernel/include/service.h b/src/kernel/include/service.h index 5b094fd..46302e8 100644 --- a/src/kernel/include/service.h +++ b/src/kernel/include/service.h @@ -38,4 +38,7 @@ extern void scheduleProvider(Provider *provider, uintptr_t data1, uintptr_t data2, uintptr_t data3, Syscall *respondingTo); +extern void fireEvent(Event *event, uint32_t data1); +extern void installKernelEvents(); + #endif diff --git a/src/kernel/interrupts/interrupts.c b/src/kernel/interrupts/interrupts.c index f8969b3..054896e 100644 --- a/src/kernel/interrupts/interrupts.c +++ b/src/kernel/interrupts/interrupts.c @@ -25,15 +25,15 @@ { scheduleProvider(provider, intNo, 0, 0, NULL); }) ; if (cr3 == PTR(0x500000)) { + // interrupt was triggered while the kernel was doing stuff return; } Syscall *call = malloc(sizeof(Syscall)); - call->function = 0; call->service = currentSyscall->service; call->esp = esp; call->respondingTo = currentSyscall->respondingTo; - Service *currentService = currentSyscall->service; call->cr3 = cr3; + call->resume = true; listAdd(&callsToProcess, call); asm("jmp handleSyscallEnd"); } diff --git a/src/kernel/include/service.h b/src/kernel/include/service.h index 5b094fd..46302e8 100644 --- a/src/kernel/include/service.h +++ b/src/kernel/include/service.h @@ -38,4 +38,7 @@ extern void scheduleProvider(Provider *provider, uintptr_t data1, uintptr_t data2, uintptr_t data3, Syscall *respondingTo); +extern void fireEvent(Event *event, uint32_t data1); +extern void installKernelEvents(); + #endif diff --git a/src/kernel/interrupts/interrupts.c b/src/kernel/interrupts/interrupts.c index f8969b3..054896e 100644 --- a/src/kernel/interrupts/interrupts.c +++ b/src/kernel/interrupts/interrupts.c @@ -25,15 +25,15 @@ { scheduleProvider(provider, intNo, 0, 0, NULL); }) ; if (cr3 == PTR(0x500000)) { + // interrupt was triggered while the kernel was doing stuff return; } Syscall *call = malloc(sizeof(Syscall)); - call->function = 0; call->service = currentSyscall->service; call->esp = esp; call->respondingTo = currentSyscall->respondingTo; - Service *currentService = currentSyscall->service; call->cr3 = cr3; + call->resume = true; listAdd(&callsToProcess, call); asm("jmp handleSyscallEnd"); } diff --git a/src/kernel/main.c b/src/kernel/main.c index 4660129..ea08335 100644 --- a/src/kernel/main.c +++ b/src/kernel/main.c @@ -30,6 +30,7 @@ } void loadAndScheduleSystemServices(void *multibootInfo) { + installKernelEvents(); void *address = kernelMapPhysicalCount(multibootInfo, 4); initrd = findInitrd(address, &initrdSize); hlib = readInitrdProgram("hlib"); diff --git a/src/kernel/include/service.h b/src/kernel/include/service.h index 5b094fd..46302e8 100644 --- a/src/kernel/include/service.h +++ b/src/kernel/include/service.h @@ -38,4 +38,7 @@ extern void scheduleProvider(Provider *provider, uintptr_t data1, uintptr_t data2, uintptr_t data3, Syscall *respondingTo); +extern void fireEvent(Event *event, uint32_t data1); +extern void installKernelEvents(); + #endif diff --git a/src/kernel/interrupts/interrupts.c b/src/kernel/interrupts/interrupts.c index f8969b3..054896e 100644 --- a/src/kernel/interrupts/interrupts.c +++ b/src/kernel/interrupts/interrupts.c @@ -25,15 +25,15 @@ { scheduleProvider(provider, intNo, 0, 0, NULL); }) ; if (cr3 == PTR(0x500000)) { + // interrupt was triggered while the kernel was doing stuff return; } Syscall *call = malloc(sizeof(Syscall)); - call->function = 0; call->service = currentSyscall->service; call->esp = esp; call->respondingTo = currentSyscall->respondingTo; - Service *currentService = currentSyscall->service; call->cr3 = cr3; + call->resume = true; listAdd(&callsToProcess, call); asm("jmp handleSyscallEnd"); } diff --git a/src/kernel/main.c b/src/kernel/main.c index 4660129..ea08335 100644 --- a/src/kernel/main.c +++ b/src/kernel/main.c @@ -30,6 +30,7 @@ } void loadAndScheduleSystemServices(void *multibootInfo) { + installKernelEvents(); void *address = kernelMapPhysicalCount(multibootInfo, 4); initrd = findInitrd(address, &initrdSize); hlib = readInitrdProgram("hlib"); diff --git a/src/kernel/service/eventSyscalls.c b/src/kernel/service/eventSyscalls.c index 50a7ed0..77f90d2 100644 --- a/src/kernel/service/eventSyscalls.c +++ b/src/kernel/service/eventSyscalls.c @@ -15,15 +15,19 @@ listAdd(&service->events, event); } +extern ListElement *kernelEvents; + void handleGetEventSyscall(Syscall *call) { char *name = retrieveString(call->parameters[1]); if (!name) { return; } uint32_t i = 0; - Service *callService = call->service; - Service *service = listGet(services, call->parameters[0]); - foreach (service->events, Event *, event, { + ListElement *events = kernelEvents; + if (call->parameters[0]) { + events = ((Service *)listGet(services, call->parameters[0]))->events; + } + foreach (events, Event *, event, { if (stringEquals(event->name, name)) { call->returnValue = i; return; @@ -36,14 +40,18 @@ void handleFireEventSyscall(Syscall *call) { Service *service = call->service; Event *event = listGet(service->events, call->parameters[0]); - foreach (event->subscriptions, Provider *, provider, - { scheduleProvider(provider, 0, 0, 0, 0); }) - ; + fireEvent(event, 0); } void handleSubscribeEventSyscall(Syscall *call) { + ListElement *list = kernelEvents; + if (call->parameters[0]) { + // given another service as the target + Service *eventService = listGet(services, call->parameters[0]); + list = eventService->events; + } + Event *event = listGet(list, call->parameters[1]); Service *eventService = listGet(services, call->parameters[0]); - Event *event = listGet(eventService->events, call->parameters[1]); Provider *provider = malloc(sizeof(Provider)); provider->name = "event subscription"; provider->service = call->service; diff --git a/src/kernel/include/service.h b/src/kernel/include/service.h index 5b094fd..46302e8 100644 --- a/src/kernel/include/service.h +++ b/src/kernel/include/service.h @@ -38,4 +38,7 @@ extern void scheduleProvider(Provider *provider, uintptr_t data1, uintptr_t data2, uintptr_t data3, Syscall *respondingTo); +extern void fireEvent(Event *event, uint32_t data1); +extern void installKernelEvents(); + #endif diff --git a/src/kernel/interrupts/interrupts.c b/src/kernel/interrupts/interrupts.c index f8969b3..054896e 100644 --- a/src/kernel/interrupts/interrupts.c +++ b/src/kernel/interrupts/interrupts.c @@ -25,15 +25,15 @@ { scheduleProvider(provider, intNo, 0, 0, NULL); }) ; if (cr3 == PTR(0x500000)) { + // interrupt was triggered while the kernel was doing stuff return; } Syscall *call = malloc(sizeof(Syscall)); - call->function = 0; call->service = currentSyscall->service; call->esp = esp; call->respondingTo = currentSyscall->respondingTo; - Service *currentService = currentSyscall->service; call->cr3 = cr3; + call->resume = true; listAdd(&callsToProcess, call); asm("jmp handleSyscallEnd"); } diff --git a/src/kernel/main.c b/src/kernel/main.c index 4660129..ea08335 100644 --- a/src/kernel/main.c +++ b/src/kernel/main.c @@ -30,6 +30,7 @@ } void loadAndScheduleSystemServices(void *multibootInfo) { + installKernelEvents(); void *address = kernelMapPhysicalCount(multibootInfo, 4); initrd = findInitrd(address, &initrdSize); hlib = readInitrdProgram("hlib"); diff --git a/src/kernel/service/eventSyscalls.c b/src/kernel/service/eventSyscalls.c index 50a7ed0..77f90d2 100644 --- a/src/kernel/service/eventSyscalls.c +++ b/src/kernel/service/eventSyscalls.c @@ -15,15 +15,19 @@ listAdd(&service->events, event); } +extern ListElement *kernelEvents; + void handleGetEventSyscall(Syscall *call) { char *name = retrieveString(call->parameters[1]); if (!name) { return; } uint32_t i = 0; - Service *callService = call->service; - Service *service = listGet(services, call->parameters[0]); - foreach (service->events, Event *, event, { + ListElement *events = kernelEvents; + if (call->parameters[0]) { + events = ((Service *)listGet(services, call->parameters[0]))->events; + } + foreach (events, Event *, event, { if (stringEquals(event->name, name)) { call->returnValue = i; return; @@ -36,14 +40,18 @@ void handleFireEventSyscall(Syscall *call) { Service *service = call->service; Event *event = listGet(service->events, call->parameters[0]); - foreach (event->subscriptions, Provider *, provider, - { scheduleProvider(provider, 0, 0, 0, 0); }) - ; + fireEvent(event, 0); } void handleSubscribeEventSyscall(Syscall *call) { + ListElement *list = kernelEvents; + if (call->parameters[0]) { + // given another service as the target + Service *eventService = listGet(services, call->parameters[0]); + list = eventService->events; + } + Event *event = listGet(list, call->parameters[1]); Service *eventService = listGet(services, call->parameters[0]); - Event *event = listGet(eventService->events, call->parameters[1]); Provider *provider = malloc(sizeof(Provider)); provider->name = "event subscription"; provider->service = call->service; diff --git a/src/kernel/service/events.c b/src/kernel/service/events.c new file mode 100644 index 0000000..e304177 --- /dev/null +++ b/src/kernel/service/events.c @@ -0,0 +1,25 @@ +#include +#include + +ListElement *kernelEvents; + +Event *loadInitrdEvent, *crashEvent; + +Event *createKernelEvent(char *name) { + Event *event = malloc(sizeof(Provider)); + event->subscriptions = NULL; + event->name = name; + listAdd(&kernelEvents, event); + return event; +} + +void fireEvent(Event *event, uint32_t data1) { + foreach (event->subscriptions, Provider *, provider, + { scheduleProvider(provider, data1, 0, 0, 0); }) + ; +} + +void installKernelEvents() { + loadInitrdEvent = createKernelEvent("loadInitrd"); + crashEvent = createKernelEvent("crash"); +} diff --git a/src/kernel/include/service.h b/src/kernel/include/service.h index 5b094fd..46302e8 100644 --- a/src/kernel/include/service.h +++ b/src/kernel/include/service.h @@ -38,4 +38,7 @@ extern void scheduleProvider(Provider *provider, uintptr_t data1, uintptr_t data2, uintptr_t data3, Syscall *respondingTo); +extern void fireEvent(Event *event, uint32_t data1); +extern void installKernelEvents(); + #endif diff --git a/src/kernel/interrupts/interrupts.c b/src/kernel/interrupts/interrupts.c index f8969b3..054896e 100644 --- a/src/kernel/interrupts/interrupts.c +++ b/src/kernel/interrupts/interrupts.c @@ -25,15 +25,15 @@ { scheduleProvider(provider, intNo, 0, 0, NULL); }) ; if (cr3 == PTR(0x500000)) { + // interrupt was triggered while the kernel was doing stuff return; } Syscall *call = malloc(sizeof(Syscall)); - call->function = 0; call->service = currentSyscall->service; call->esp = esp; call->respondingTo = currentSyscall->respondingTo; - Service *currentService = currentSyscall->service; call->cr3 = cr3; + call->resume = true; listAdd(&callsToProcess, call); asm("jmp handleSyscallEnd"); } diff --git a/src/kernel/main.c b/src/kernel/main.c index 4660129..ea08335 100644 --- a/src/kernel/main.c +++ b/src/kernel/main.c @@ -30,6 +30,7 @@ } void loadAndScheduleSystemServices(void *multibootInfo) { + installKernelEvents(); void *address = kernelMapPhysicalCount(multibootInfo, 4); initrd = findInitrd(address, &initrdSize); hlib = readInitrdProgram("hlib"); diff --git a/src/kernel/service/eventSyscalls.c b/src/kernel/service/eventSyscalls.c index 50a7ed0..77f90d2 100644 --- a/src/kernel/service/eventSyscalls.c +++ b/src/kernel/service/eventSyscalls.c @@ -15,15 +15,19 @@ listAdd(&service->events, event); } +extern ListElement *kernelEvents; + void handleGetEventSyscall(Syscall *call) { char *name = retrieveString(call->parameters[1]); if (!name) { return; } uint32_t i = 0; - Service *callService = call->service; - Service *service = listGet(services, call->parameters[0]); - foreach (service->events, Event *, event, { + ListElement *events = kernelEvents; + if (call->parameters[0]) { + events = ((Service *)listGet(services, call->parameters[0]))->events; + } + foreach (events, Event *, event, { if (stringEquals(event->name, name)) { call->returnValue = i; return; @@ -36,14 +40,18 @@ void handleFireEventSyscall(Syscall *call) { Service *service = call->service; Event *event = listGet(service->events, call->parameters[0]); - foreach (event->subscriptions, Provider *, provider, - { scheduleProvider(provider, 0, 0, 0, 0); }) - ; + fireEvent(event, 0); } void handleSubscribeEventSyscall(Syscall *call) { + ListElement *list = kernelEvents; + if (call->parameters[0]) { + // given another service as the target + Service *eventService = listGet(services, call->parameters[0]); + list = eventService->events; + } + Event *event = listGet(list, call->parameters[1]); Service *eventService = listGet(services, call->parameters[0]); - Event *event = listGet(eventService->events, call->parameters[1]); Provider *provider = malloc(sizeof(Provider)); provider->name = "event subscription"; provider->service = call->service; diff --git a/src/kernel/service/events.c b/src/kernel/service/events.c new file mode 100644 index 0000000..e304177 --- /dev/null +++ b/src/kernel/service/events.c @@ -0,0 +1,25 @@ +#include +#include + +ListElement *kernelEvents; + +Event *loadInitrdEvent, *crashEvent; + +Event *createKernelEvent(char *name) { + Event *event = malloc(sizeof(Provider)); + event->subscriptions = NULL; + event->name = name; + listAdd(&kernelEvents, event); + return event; +} + +void fireEvent(Event *event, uint32_t data1) { + foreach (event->subscriptions, Provider *, provider, + { scheduleProvider(provider, data1, 0, 0, 0); }) + ; +} + +void installKernelEvents() { + loadInitrdEvent = createKernelEvent("loadInitrd"); + crashEvent = createKernelEvent("crash"); +} diff --git a/src/kernel/service/service.c b/src/kernel/service/service.c index 6016cb4..e77de8a 100644 --- a/src/kernel/service/service.c +++ b/src/kernel/service/service.c @@ -12,6 +12,7 @@ ListElement *services, *callsToProcess; Syscall *currentSyscall; extern Service *hlib; +extern Event *loadInitrdEvent; void resume(Syscall *syscall) { if (U32(syscall) < 0x1000) { @@ -32,6 +33,7 @@ service->pagingInfo.pageDirectory = malloc(0x1000); service->name = serviceName; service->nameHash = insertString(serviceName); + fireEvent(loadInitrdEvent, service->nameHash); void *current = &functionsStart; if (hlib) { service->pagingInfo.pageDirectory[0x3FC].pageTableID = diff --git a/src/kernel/include/service.h b/src/kernel/include/service.h index 5b094fd..46302e8 100644 --- a/src/kernel/include/service.h +++ b/src/kernel/include/service.h @@ -38,4 +38,7 @@ extern void scheduleProvider(Provider *provider, uintptr_t data1, uintptr_t data2, uintptr_t data3, Syscall *respondingTo); +extern void fireEvent(Event *event, uint32_t data1); +extern void installKernelEvents(); + #endif diff --git a/src/kernel/interrupts/interrupts.c b/src/kernel/interrupts/interrupts.c index f8969b3..054896e 100644 --- a/src/kernel/interrupts/interrupts.c +++ b/src/kernel/interrupts/interrupts.c @@ -25,15 +25,15 @@ { scheduleProvider(provider, intNo, 0, 0, NULL); }) ; if (cr3 == PTR(0x500000)) { + // interrupt was triggered while the kernel was doing stuff return; } Syscall *call = malloc(sizeof(Syscall)); - call->function = 0; call->service = currentSyscall->service; call->esp = esp; call->respondingTo = currentSyscall->respondingTo; - Service *currentService = currentSyscall->service; call->cr3 = cr3; + call->resume = true; listAdd(&callsToProcess, call); asm("jmp handleSyscallEnd"); } diff --git a/src/kernel/main.c b/src/kernel/main.c index 4660129..ea08335 100644 --- a/src/kernel/main.c +++ b/src/kernel/main.c @@ -30,6 +30,7 @@ } void loadAndScheduleSystemServices(void *multibootInfo) { + installKernelEvents(); void *address = kernelMapPhysicalCount(multibootInfo, 4); initrd = findInitrd(address, &initrdSize); hlib = readInitrdProgram("hlib"); diff --git a/src/kernel/service/eventSyscalls.c b/src/kernel/service/eventSyscalls.c index 50a7ed0..77f90d2 100644 --- a/src/kernel/service/eventSyscalls.c +++ b/src/kernel/service/eventSyscalls.c @@ -15,15 +15,19 @@ listAdd(&service->events, event); } +extern ListElement *kernelEvents; + void handleGetEventSyscall(Syscall *call) { char *name = retrieveString(call->parameters[1]); if (!name) { return; } uint32_t i = 0; - Service *callService = call->service; - Service *service = listGet(services, call->parameters[0]); - foreach (service->events, Event *, event, { + ListElement *events = kernelEvents; + if (call->parameters[0]) { + events = ((Service *)listGet(services, call->parameters[0]))->events; + } + foreach (events, Event *, event, { if (stringEquals(event->name, name)) { call->returnValue = i; return; @@ -36,14 +40,18 @@ void handleFireEventSyscall(Syscall *call) { Service *service = call->service; Event *event = listGet(service->events, call->parameters[0]); - foreach (event->subscriptions, Provider *, provider, - { scheduleProvider(provider, 0, 0, 0, 0); }) - ; + fireEvent(event, 0); } void handleSubscribeEventSyscall(Syscall *call) { + ListElement *list = kernelEvents; + if (call->parameters[0]) { + // given another service as the target + Service *eventService = listGet(services, call->parameters[0]); + list = eventService->events; + } + Event *event = listGet(list, call->parameters[1]); Service *eventService = listGet(services, call->parameters[0]); - Event *event = listGet(eventService->events, call->parameters[1]); Provider *provider = malloc(sizeof(Provider)); provider->name = "event subscription"; provider->service = call->service; diff --git a/src/kernel/service/events.c b/src/kernel/service/events.c new file mode 100644 index 0000000..e304177 --- /dev/null +++ b/src/kernel/service/events.c @@ -0,0 +1,25 @@ +#include +#include + +ListElement *kernelEvents; + +Event *loadInitrdEvent, *crashEvent; + +Event *createKernelEvent(char *name) { + Event *event = malloc(sizeof(Provider)); + event->subscriptions = NULL; + event->name = name; + listAdd(&kernelEvents, event); + return event; +} + +void fireEvent(Event *event, uint32_t data1) { + foreach (event->subscriptions, Provider *, provider, + { scheduleProvider(provider, data1, 0, 0, 0); }) + ; +} + +void installKernelEvents() { + loadInitrdEvent = createKernelEvent("loadInitrd"); + crashEvent = createKernelEvent("crash"); +} diff --git a/src/kernel/service/service.c b/src/kernel/service/service.c index 6016cb4..e77de8a 100644 --- a/src/kernel/service/service.c +++ b/src/kernel/service/service.c @@ -12,6 +12,7 @@ ListElement *services, *callsToProcess; Syscall *currentSyscall; extern Service *hlib; +extern Event *loadInitrdEvent; void resume(Syscall *syscall) { if (U32(syscall) < 0x1000) { @@ -32,6 +33,7 @@ service->pagingInfo.pageDirectory = malloc(0x1000); service->name = serviceName; service->nameHash = insertString(serviceName); + fireEvent(loadInitrdEvent, service->nameHash); void *current = &functionsStart; if (hlib) { service->pagingInfo.pageDirectory[0x3FC].pageTableID = diff --git a/src/userland/loader/main.c b/src/userland/loader/main.c index 9e86a62..dce3d9b 100644 --- a/src/userland/loader/main.c +++ b/src/userland/loader/main.c @@ -7,7 +7,7 @@ loadFromInitrd("log"); loadFromInitrd("vga"); loadFromInitrd("parallel"); - log("honey os is alive :)"); + log("hello world! honey os is alive :)"); loadFromInitrd("pic"); loadFromInitrd("keyboard"); printf("test print string: '%s', number: %i, hex: 0x%x", "hello world", diff --git a/src/kernel/include/service.h b/src/kernel/include/service.h index 5b094fd..46302e8 100644 --- a/src/kernel/include/service.h +++ b/src/kernel/include/service.h @@ -38,4 +38,7 @@ extern void scheduleProvider(Provider *provider, uintptr_t data1, uintptr_t data2, uintptr_t data3, Syscall *respondingTo); +extern void fireEvent(Event *event, uint32_t data1); +extern void installKernelEvents(); + #endif diff --git a/src/kernel/interrupts/interrupts.c b/src/kernel/interrupts/interrupts.c index f8969b3..054896e 100644 --- a/src/kernel/interrupts/interrupts.c +++ b/src/kernel/interrupts/interrupts.c @@ -25,15 +25,15 @@ { scheduleProvider(provider, intNo, 0, 0, NULL); }) ; if (cr3 == PTR(0x500000)) { + // interrupt was triggered while the kernel was doing stuff return; } Syscall *call = malloc(sizeof(Syscall)); - call->function = 0; call->service = currentSyscall->service; call->esp = esp; call->respondingTo = currentSyscall->respondingTo; - Service *currentService = currentSyscall->service; call->cr3 = cr3; + call->resume = true; listAdd(&callsToProcess, call); asm("jmp handleSyscallEnd"); } diff --git a/src/kernel/main.c b/src/kernel/main.c index 4660129..ea08335 100644 --- a/src/kernel/main.c +++ b/src/kernel/main.c @@ -30,6 +30,7 @@ } void loadAndScheduleSystemServices(void *multibootInfo) { + installKernelEvents(); void *address = kernelMapPhysicalCount(multibootInfo, 4); initrd = findInitrd(address, &initrdSize); hlib = readInitrdProgram("hlib"); diff --git a/src/kernel/service/eventSyscalls.c b/src/kernel/service/eventSyscalls.c index 50a7ed0..77f90d2 100644 --- a/src/kernel/service/eventSyscalls.c +++ b/src/kernel/service/eventSyscalls.c @@ -15,15 +15,19 @@ listAdd(&service->events, event); } +extern ListElement *kernelEvents; + void handleGetEventSyscall(Syscall *call) { char *name = retrieveString(call->parameters[1]); if (!name) { return; } uint32_t i = 0; - Service *callService = call->service; - Service *service = listGet(services, call->parameters[0]); - foreach (service->events, Event *, event, { + ListElement *events = kernelEvents; + if (call->parameters[0]) { + events = ((Service *)listGet(services, call->parameters[0]))->events; + } + foreach (events, Event *, event, { if (stringEquals(event->name, name)) { call->returnValue = i; return; @@ -36,14 +40,18 @@ void handleFireEventSyscall(Syscall *call) { Service *service = call->service; Event *event = listGet(service->events, call->parameters[0]); - foreach (event->subscriptions, Provider *, provider, - { scheduleProvider(provider, 0, 0, 0, 0); }) - ; + fireEvent(event, 0); } void handleSubscribeEventSyscall(Syscall *call) { + ListElement *list = kernelEvents; + if (call->parameters[0]) { + // given another service as the target + Service *eventService = listGet(services, call->parameters[0]); + list = eventService->events; + } + Event *event = listGet(list, call->parameters[1]); Service *eventService = listGet(services, call->parameters[0]); - Event *event = listGet(eventService->events, call->parameters[1]); Provider *provider = malloc(sizeof(Provider)); provider->name = "event subscription"; provider->service = call->service; diff --git a/src/kernel/service/events.c b/src/kernel/service/events.c new file mode 100644 index 0000000..e304177 --- /dev/null +++ b/src/kernel/service/events.c @@ -0,0 +1,25 @@ +#include +#include + +ListElement *kernelEvents; + +Event *loadInitrdEvent, *crashEvent; + +Event *createKernelEvent(char *name) { + Event *event = malloc(sizeof(Provider)); + event->subscriptions = NULL; + event->name = name; + listAdd(&kernelEvents, event); + return event; +} + +void fireEvent(Event *event, uint32_t data1) { + foreach (event->subscriptions, Provider *, provider, + { scheduleProvider(provider, data1, 0, 0, 0); }) + ; +} + +void installKernelEvents() { + loadInitrdEvent = createKernelEvent("loadInitrd"); + crashEvent = createKernelEvent("crash"); +} diff --git a/src/kernel/service/service.c b/src/kernel/service/service.c index 6016cb4..e77de8a 100644 --- a/src/kernel/service/service.c +++ b/src/kernel/service/service.c @@ -12,6 +12,7 @@ ListElement *services, *callsToProcess; Syscall *currentSyscall; extern Service *hlib; +extern Event *loadInitrdEvent; void resume(Syscall *syscall) { if (U32(syscall) < 0x1000) { @@ -32,6 +33,7 @@ service->pagingInfo.pageDirectory = malloc(0x1000); service->name = serviceName; service->nameHash = insertString(serviceName); + fireEvent(loadInitrdEvent, service->nameHash); void *current = &functionsStart; if (hlib) { service->pagingInfo.pageDirectory[0x3FC].pageTableID = diff --git a/src/userland/loader/main.c b/src/userland/loader/main.c index 9e86a62..dce3d9b 100644 --- a/src/userland/loader/main.c +++ b/src/userland/loader/main.c @@ -7,7 +7,7 @@ loadFromInitrd("log"); loadFromInitrd("vga"); loadFromInitrd("parallel"); - log("honey os is alive :)"); + log("hello world! honey os is alive :)"); loadFromInitrd("pic"); loadFromInitrd("keyboard"); printf("test print string: '%s', number: %i, hex: 0x%x", "hello world", diff --git a/src/userland/log/main.c b/src/userland/log/main.c index d3ad82e..1ab0851 100644 --- a/src/userland/log/main.c +++ b/src/userland/log/main.c @@ -1,3 +1,5 @@ +#define ALLOC_MAIN + #include #include @@ -15,8 +17,14 @@ } } +bool lock = false; +char buffer[100]; + void handleLog(uint32_t stringId, uint32_t unused, uint32_t caller) { - char buffer[100]; + while (lock) { + ioIn(1, 1); + } + lock = true; writeString("[ "); readString(caller, buffer); writeString(buffer); @@ -26,8 +34,8 @@ writeString(" ] "); readString(stringId, buffer); writeString(buffer); - writeChar('\r'); - writeChar('\n'); + writeString("\r\n"); + lock = false; } void registerOut(uintptr_t service, uintptr_t provider) { @@ -36,8 +44,16 @@ outputCount++; } +void onInitrdLoad(uint32_t programName) { + char buffer[100]; + readString(programName, buffer); + printf("loading '%s' from initrd", buffer); +} + int32_t main() { installServiceProvider("log", (void *)handleLog); installServiceProvider("registerOut", (void *)registerOut); + uint32_t eventId = getEvent(0, "loadInitrd"); + subscribeEvent(0, eventId, (void *)onInitrdLoad); return 0; }