diff --git a/src/include/hlib.h b/src/include/hlib.h index fa51e95..5399a88 100644 --- a/src/include/hlib.h +++ b/src/include/hlib.h @@ -33,8 +33,8 @@ extern uint32_t getService(char *name); extern void requestName(char *service, char *provider, uintptr_t data1, uintptr_t data2); -extern void request(uint32_t service, uint32_t provider, uintptr_t data1, - uintptr_t data2); +extern uint32_t request(uint32_t service, uint32_t provider, uintptr_t data1, + uintptr_t data2); extern uint32_t getServiceId(); extern uintptr_t insertString(char *string); extern uintptr_t getStringLength(uintptr_t stringId); @@ -49,6 +49,7 @@ extern bool stackContains(uint32_t serviceId); extern uint32_t await(uint32_t service, uint32_t event); +extern void gets(char *buffer); #define MAX(x, y) (x > y ? (x) : (y)) diff --git a/src/include/hlib.h b/src/include/hlib.h index fa51e95..5399a88 100644 --- a/src/include/hlib.h +++ b/src/include/hlib.h @@ -33,8 +33,8 @@ extern uint32_t getService(char *name); extern void requestName(char *service, char *provider, uintptr_t data1, uintptr_t data2); -extern void request(uint32_t service, uint32_t provider, uintptr_t data1, - uintptr_t data2); +extern uint32_t request(uint32_t service, uint32_t provider, uintptr_t data1, + uintptr_t data2); extern uint32_t getServiceId(); extern uintptr_t insertString(char *string); extern uintptr_t getStringLength(uintptr_t stringId); @@ -49,6 +49,7 @@ extern bool stackContains(uint32_t serviceId); extern uint32_t await(uint32_t service, uint32_t event); +extern void gets(char *buffer); #define MAX(x, y) (x > y ? (x) : (y)) diff --git a/src/kernel/service/service.asm b/src/kernel/service/service.asm index 8584d61..023da7b 100644 --- a/src/kernel/service/service.asm +++ b/src/kernel/service/service.asm @@ -23,6 +23,7 @@ sti sysexit runEnd: + mov ebx, eax mov eax, 0 sysenter diff --git a/src/include/hlib.h b/src/include/hlib.h index fa51e95..5399a88 100644 --- a/src/include/hlib.h +++ b/src/include/hlib.h @@ -33,8 +33,8 @@ extern uint32_t getService(char *name); extern void requestName(char *service, char *provider, uintptr_t data1, uintptr_t data2); -extern void request(uint32_t service, uint32_t provider, uintptr_t data1, - uintptr_t data2); +extern uint32_t request(uint32_t service, uint32_t provider, uintptr_t data1, + uintptr_t data2); extern uint32_t getServiceId(); extern uintptr_t insertString(char *string); extern uintptr_t getStringLength(uintptr_t stringId); @@ -49,6 +49,7 @@ extern bool stackContains(uint32_t serviceId); extern uint32_t await(uint32_t service, uint32_t event); +extern void gets(char *buffer); #define MAX(x, y) (x > y ? (x) : (y)) diff --git a/src/kernel/service/service.asm b/src/kernel/service/service.asm index 8584d61..023da7b 100644 --- a/src/kernel/service/service.asm +++ b/src/kernel/service/service.asm @@ -23,6 +23,7 @@ sti sysexit runEnd: + mov ebx, eax mov eax, 0 sysenter diff --git a/src/kernel/syscalls/syscall.c b/src/kernel/syscalls/syscall.c index 4b1dce0..d855560 100644 --- a/src/kernel/syscalls/syscall.c +++ b/src/kernel/syscalls/syscall.c @@ -27,6 +27,9 @@ freePage(currentSyscall->esp); if (currentSyscall->respondingTo) { + if (currentSyscall->respondingTo->function == 2) { + currentSyscall->respondingTo->returnValue = parameter0; + } listAdd(&callsToProcess, currentSyscall->respondingTo); } return; diff --git a/src/include/hlib.h b/src/include/hlib.h index fa51e95..5399a88 100644 --- a/src/include/hlib.h +++ b/src/include/hlib.h @@ -33,8 +33,8 @@ extern uint32_t getService(char *name); extern void requestName(char *service, char *provider, uintptr_t data1, uintptr_t data2); -extern void request(uint32_t service, uint32_t provider, uintptr_t data1, - uintptr_t data2); +extern uint32_t request(uint32_t service, uint32_t provider, uintptr_t data1, + uintptr_t data2); extern uint32_t getServiceId(); extern uintptr_t insertString(char *string); extern uintptr_t getStringLength(uintptr_t stringId); @@ -49,6 +49,7 @@ extern bool stackContains(uint32_t serviceId); extern uint32_t await(uint32_t service, uint32_t event); +extern void gets(char *buffer); #define MAX(x, y) (x > y ? (x) : (y)) diff --git a/src/kernel/service/service.asm b/src/kernel/service/service.asm index 8584d61..023da7b 100644 --- a/src/kernel/service/service.asm +++ b/src/kernel/service/service.asm @@ -23,6 +23,7 @@ sti sysexit runEnd: + mov ebx, eax mov eax, 0 sysenter diff --git a/src/kernel/syscalls/syscall.c b/src/kernel/syscalls/syscall.c index 4b1dce0..d855560 100644 --- a/src/kernel/syscalls/syscall.c +++ b/src/kernel/syscalls/syscall.c @@ -27,6 +27,9 @@ freePage(currentSyscall->esp); if (currentSyscall->respondingTo) { + if (currentSyscall->respondingTo->function == 2) { + currentSyscall->respondingTo->returnValue = parameter0; + } listAdd(&callsToProcess, currentSyscall->respondingTo); } return; diff --git a/src/userland/hlib/service/service.c b/src/userland/hlib/service/service.c index b26ba11..0a7b20f 100644 --- a/src/userland/hlib/service/service.c +++ b/src/userland/hlib/service/service.c @@ -2,9 +2,9 @@ #include #include -void request(uint32_t service, uint32_t function, uintptr_t data1, - uintptr_t data2) { - syscall(SYS_REQUEST, service, function, data1, data2); +uint32_t request(uint32_t service, uint32_t function, uintptr_t data1, + uintptr_t data2) { + return syscall(SYS_REQUEST, service, function, data1, data2); } uint32_t createFunction(char *name, int32_t(handler)(void *, uint32_t)) { diff --git a/src/include/hlib.h b/src/include/hlib.h index fa51e95..5399a88 100644 --- a/src/include/hlib.h +++ b/src/include/hlib.h @@ -33,8 +33,8 @@ extern uint32_t getService(char *name); extern void requestName(char *service, char *provider, uintptr_t data1, uintptr_t data2); -extern void request(uint32_t service, uint32_t provider, uintptr_t data1, - uintptr_t data2); +extern uint32_t request(uint32_t service, uint32_t provider, uintptr_t data1, + uintptr_t data2); extern uint32_t getServiceId(); extern uintptr_t insertString(char *string); extern uintptr_t getStringLength(uintptr_t stringId); @@ -49,6 +49,7 @@ extern bool stackContains(uint32_t serviceId); extern uint32_t await(uint32_t service, uint32_t event); +extern void gets(char *buffer); #define MAX(x, y) (x > y ? (x) : (y)) diff --git a/src/kernel/service/service.asm b/src/kernel/service/service.asm index 8584d61..023da7b 100644 --- a/src/kernel/service/service.asm +++ b/src/kernel/service/service.asm @@ -23,6 +23,7 @@ sti sysexit runEnd: + mov ebx, eax mov eax, 0 sysenter diff --git a/src/kernel/syscalls/syscall.c b/src/kernel/syscalls/syscall.c index 4b1dce0..d855560 100644 --- a/src/kernel/syscalls/syscall.c +++ b/src/kernel/syscalls/syscall.c @@ -27,6 +27,9 @@ freePage(currentSyscall->esp); if (currentSyscall->respondingTo) { + if (currentSyscall->respondingTo->function == 2) { + currentSyscall->respondingTo->returnValue = parameter0; + } listAdd(&callsToProcess, currentSyscall->respondingTo); } return; diff --git a/src/userland/hlib/service/service.c b/src/userland/hlib/service/service.c index b26ba11..0a7b20f 100644 --- a/src/userland/hlib/service/service.c +++ b/src/userland/hlib/service/service.c @@ -2,9 +2,9 @@ #include #include -void request(uint32_t service, uint32_t function, uintptr_t data1, - uintptr_t data2) { - syscall(SYS_REQUEST, service, function, data1, data2); +uint32_t request(uint32_t service, uint32_t function, uintptr_t data1, + uintptr_t data2) { + return syscall(SYS_REQUEST, service, function, data1, data2); } uint32_t createFunction(char *name, int32_t(handler)(void *, uint32_t)) { diff --git a/src/userland/hlib/stdio.c b/src/userland/hlib/stdio.c index 7ca1032..5a2ad19 100644 --- a/src/userland/hlib/stdio.c +++ b/src/userland/hlib/stdio.c @@ -152,3 +152,13 @@ discardString(id); free(data); } + +void gets(char *buffer) { + static uint32_t function = 0; + if (!function) { + function = getFunction(ioManager, "gets"); + } + uint32_t stringId = request(ioManager, function, 0, 0); + asm("nop" ::"a"(stringId)); + readString(stringId, buffer); +} diff --git a/src/include/hlib.h b/src/include/hlib.h index fa51e95..5399a88 100644 --- a/src/include/hlib.h +++ b/src/include/hlib.h @@ -33,8 +33,8 @@ extern uint32_t getService(char *name); extern void requestName(char *service, char *provider, uintptr_t data1, uintptr_t data2); -extern void request(uint32_t service, uint32_t provider, uintptr_t data1, - uintptr_t data2); +extern uint32_t request(uint32_t service, uint32_t provider, uintptr_t data1, + uintptr_t data2); extern uint32_t getServiceId(); extern uintptr_t insertString(char *string); extern uintptr_t getStringLength(uintptr_t stringId); @@ -49,6 +49,7 @@ extern bool stackContains(uint32_t serviceId); extern uint32_t await(uint32_t service, uint32_t event); +extern void gets(char *buffer); #define MAX(x, y) (x > y ? (x) : (y)) diff --git a/src/kernel/service/service.asm b/src/kernel/service/service.asm index 8584d61..023da7b 100644 --- a/src/kernel/service/service.asm +++ b/src/kernel/service/service.asm @@ -23,6 +23,7 @@ sti sysexit runEnd: + mov ebx, eax mov eax, 0 sysenter diff --git a/src/kernel/syscalls/syscall.c b/src/kernel/syscalls/syscall.c index 4b1dce0..d855560 100644 --- a/src/kernel/syscalls/syscall.c +++ b/src/kernel/syscalls/syscall.c @@ -27,6 +27,9 @@ freePage(currentSyscall->esp); if (currentSyscall->respondingTo) { + if (currentSyscall->respondingTo->function == 2) { + currentSyscall->respondingTo->returnValue = parameter0; + } listAdd(&callsToProcess, currentSyscall->respondingTo); } return; diff --git a/src/userland/hlib/service/service.c b/src/userland/hlib/service/service.c index b26ba11..0a7b20f 100644 --- a/src/userland/hlib/service/service.c +++ b/src/userland/hlib/service/service.c @@ -2,9 +2,9 @@ #include #include -void request(uint32_t service, uint32_t function, uintptr_t data1, - uintptr_t data2) { - syscall(SYS_REQUEST, service, function, data1, data2); +uint32_t request(uint32_t service, uint32_t function, uintptr_t data1, + uintptr_t data2) { + return syscall(SYS_REQUEST, service, function, data1, data2); } uint32_t createFunction(char *name, int32_t(handler)(void *, uint32_t)) { diff --git a/src/userland/hlib/stdio.c b/src/userland/hlib/stdio.c index 7ca1032..5a2ad19 100644 --- a/src/userland/hlib/stdio.c +++ b/src/userland/hlib/stdio.c @@ -152,3 +152,13 @@ discardString(id); free(data); } + +void gets(char *buffer) { + static uint32_t function = 0; + if (!function) { + function = getFunction(ioManager, "gets"); + } + uint32_t stringId = request(ioManager, function, 0, 0); + asm("nop" ::"a"(stringId)); + readString(stringId, buffer); +} diff --git a/src/userland/ioManager/main.c b/src/userland/ioManager/main.c index db1a0d9..24fb966 100644 --- a/src/userland/ioManager/main.c +++ b/src/userland/ioManager/main.c @@ -61,12 +61,52 @@ focusServiceKeyHandler = 0; } -uint32_t keyEvent; +uint32_t keyEvent, newLineEvent; + +char inputBuffer[256]; +uint32_t inputBufferPosition; +bool printInput = true; + +void onNewLine() { + uint32_t stringId = insertString(inputBuffer); + fireEvent(newLineEvent, stringId); + inputBufferPosition = 0; + inputBuffer[inputBufferPosition] = '\0'; +} void handleKey(uint32_t keycode, uint32_t stringId) { - focusServiceKeyHandler = getFunction(focusService, "onKey"); - request(focusService, focusServiceKeyHandler, keycode, stringId); + if (!focusServiceKeyHandler) { + focusServiceKeyHandler = getFunction(focusService, "onKey"); + } + if (focusServiceKeyHandler) { + request(focusService, focusServiceKeyHandler, keycode, stringId); + } fireEvent(keyEvent, keycode); + if (printInput) { + request(mainService, mainOut, keycode, 0); + } + switch (keycode) { + case '\b': + if (inputBufferPosition) { + inputBufferPosition--; + inputBuffer[inputBufferPosition] = 0; + } + break; + case '\n': + onNewLine(); + return; + default: + inputBuffer[inputBufferPosition] = (char)keycode; + inputBufferPosition++; + inputBuffer[inputBufferPosition] = '\0'; + break; + } +} + +uint32_t getsImplementation() { + inputBufferPosition = 0; + inputBuffer[inputBufferPosition] = '\0'; + return await(ioManager, newLineEvent); } int32_t main() { @@ -82,4 +122,6 @@ loadFromInitrd("keyboard"); createFunction("setForeground", (void *)setForeground); keyEvent = createEvent("keyPress"); + newLineEvent = createEvent("newLine"); + createFunction("gets", (void *)getsImplementation); } diff --git a/src/include/hlib.h b/src/include/hlib.h index fa51e95..5399a88 100644 --- a/src/include/hlib.h +++ b/src/include/hlib.h @@ -33,8 +33,8 @@ extern uint32_t getService(char *name); extern void requestName(char *service, char *provider, uintptr_t data1, uintptr_t data2); -extern void request(uint32_t service, uint32_t provider, uintptr_t data1, - uintptr_t data2); +extern uint32_t request(uint32_t service, uint32_t provider, uintptr_t data1, + uintptr_t data2); extern uint32_t getServiceId(); extern uintptr_t insertString(char *string); extern uintptr_t getStringLength(uintptr_t stringId); @@ -49,6 +49,7 @@ extern bool stackContains(uint32_t serviceId); extern uint32_t await(uint32_t service, uint32_t event); +extern void gets(char *buffer); #define MAX(x, y) (x > y ? (x) : (y)) diff --git a/src/kernel/service/service.asm b/src/kernel/service/service.asm index 8584d61..023da7b 100644 --- a/src/kernel/service/service.asm +++ b/src/kernel/service/service.asm @@ -23,6 +23,7 @@ sti sysexit runEnd: + mov ebx, eax mov eax, 0 sysenter diff --git a/src/kernel/syscalls/syscall.c b/src/kernel/syscalls/syscall.c index 4b1dce0..d855560 100644 --- a/src/kernel/syscalls/syscall.c +++ b/src/kernel/syscalls/syscall.c @@ -27,6 +27,9 @@ freePage(currentSyscall->esp); if (currentSyscall->respondingTo) { + if (currentSyscall->respondingTo->function == 2) { + currentSyscall->respondingTo->returnValue = parameter0; + } listAdd(&callsToProcess, currentSyscall->respondingTo); } return; diff --git a/src/userland/hlib/service/service.c b/src/userland/hlib/service/service.c index b26ba11..0a7b20f 100644 --- a/src/userland/hlib/service/service.c +++ b/src/userland/hlib/service/service.c @@ -2,9 +2,9 @@ #include #include -void request(uint32_t service, uint32_t function, uintptr_t data1, - uintptr_t data2) { - syscall(SYS_REQUEST, service, function, data1, data2); +uint32_t request(uint32_t service, uint32_t function, uintptr_t data1, + uintptr_t data2) { + return syscall(SYS_REQUEST, service, function, data1, data2); } uint32_t createFunction(char *name, int32_t(handler)(void *, uint32_t)) { diff --git a/src/userland/hlib/stdio.c b/src/userland/hlib/stdio.c index 7ca1032..5a2ad19 100644 --- a/src/userland/hlib/stdio.c +++ b/src/userland/hlib/stdio.c @@ -152,3 +152,13 @@ discardString(id); free(data); } + +void gets(char *buffer) { + static uint32_t function = 0; + if (!function) { + function = getFunction(ioManager, "gets"); + } + uint32_t stringId = request(ioManager, function, 0, 0); + asm("nop" ::"a"(stringId)); + readString(stringId, buffer); +} diff --git a/src/userland/ioManager/main.c b/src/userland/ioManager/main.c index db1a0d9..24fb966 100644 --- a/src/userland/ioManager/main.c +++ b/src/userland/ioManager/main.c @@ -61,12 +61,52 @@ focusServiceKeyHandler = 0; } -uint32_t keyEvent; +uint32_t keyEvent, newLineEvent; + +char inputBuffer[256]; +uint32_t inputBufferPosition; +bool printInput = true; + +void onNewLine() { + uint32_t stringId = insertString(inputBuffer); + fireEvent(newLineEvent, stringId); + inputBufferPosition = 0; + inputBuffer[inputBufferPosition] = '\0'; +} void handleKey(uint32_t keycode, uint32_t stringId) { - focusServiceKeyHandler = getFunction(focusService, "onKey"); - request(focusService, focusServiceKeyHandler, keycode, stringId); + if (!focusServiceKeyHandler) { + focusServiceKeyHandler = getFunction(focusService, "onKey"); + } + if (focusServiceKeyHandler) { + request(focusService, focusServiceKeyHandler, keycode, stringId); + } fireEvent(keyEvent, keycode); + if (printInput) { + request(mainService, mainOut, keycode, 0); + } + switch (keycode) { + case '\b': + if (inputBufferPosition) { + inputBufferPosition--; + inputBuffer[inputBufferPosition] = 0; + } + break; + case '\n': + onNewLine(); + return; + default: + inputBuffer[inputBufferPosition] = (char)keycode; + inputBufferPosition++; + inputBuffer[inputBufferPosition] = '\0'; + break; + } +} + +uint32_t getsImplementation() { + inputBufferPosition = 0; + inputBuffer[inputBufferPosition] = '\0'; + return await(ioManager, newLineEvent); } int32_t main() { @@ -82,4 +122,6 @@ loadFromInitrd("keyboard"); createFunction("setForeground", (void *)setForeground); keyEvent = createEvent("keyPress"); + newLineEvent = createEvent("newLine"); + createFunction("gets", (void *)getsImplementation); } diff --git a/src/userland/shell/main.c b/src/userland/shell/main.c index e5333d1..8f642ed 100644 --- a/src/userland/shell/main.c +++ b/src/userland/shell/main.c @@ -3,42 +3,13 @@ #include #include -char inputBuffer[256]; -uint8_t inputBufferPosition; -bool printInput = true; - -void onNewLine() { - printf("\n"); - loadFromInitrd(inputBuffer); - inputBufferPosition = 0; - inputBuffer[inputBufferPosition] = '\0'; - printf("> "); -} - -void onKeyInput(uint32_t keycode, uint32_t stringId) { - switch (keycode) { - case '\b': - if (inputBufferPosition) { - inputBufferPosition--; - inputBuffer[inputBufferPosition] = 0; - printf("\b"); - } - break; - case '\n': - onNewLine(); - break; - default: - if (printInput) { - printf("%c", keycode); - } - inputBuffer[inputBufferPosition] = (char)keycode; - inputBufferPosition++; - inputBuffer[inputBufferPosition] = '\0'; - break; - } -} +char buffer[256]; int32_t main() { - createFunction("onKey", (void *)onKeyInput); - printf("HONEY-OS - made by Lukas Eisenhauer\n> "); + printf("HONEY-OS - made by Lukas Eisenhauer - shell\n"); + while (1) { + printf("> "); + gets(buffer); + loadFromInitrd(buffer); + } }