From 76eedfb9219e35fffa537aee0a57ef291e7039ac Mon Sep 17 00:00:00 2001 From: pjht Date: Wed, 22 Jul 2020 07:33:44 -0500 Subject: [PATCH] new_thread is now pthread_create --- init/main.c | 6 ++- kernel/cpu/i386/isr.c | 10 +++-- kernel/cpu/i386/tasking.c | 3 +- kernel/cpu/tasking.h | 2 +- kernel/rpc.c | 81 ++++++++++++++++++++--------------- kernel/rpc.h | 2 +- libc/pthread.c | 16 +++++++ libc/tasking.c | 7 --- sysroot/usr/include/pthread.h | 12 ++++++ 9 files changed, 89 insertions(+), 50 deletions(-) create mode 100644 libc/pthread.c create mode 100644 sysroot/usr/include/pthread.h diff --git a/init/main.c b/init/main.c index 40ecf5e..c5b296a 100644 --- a/init/main.c +++ b/init/main.c @@ -9,6 +9,7 @@ #include #include #include +#include typedef struct { char filename[100]; @@ -129,13 +130,14 @@ char load_proc(uint32_t datapos,char* initrd) { // return 1; // } -void thread() { +void thread_func() { for (;;) yield(); } int main() { serial_print("IN INIT\n"); - new_thread(thread); + pthread_t thread; + pthread_create(&thread,NULL,thread_func,NULL); blockThread(THREAD_BLOCKED); for (int i=0;i<5;i++) { serial_print("YIELDING\n"); diff --git a/kernel/cpu/i386/isr.c b/kernel/cpu/i386/isr.c index d57b8cb..e4664f0 100644 --- a/kernel/cpu/i386/isr.c +++ b/kernel/cpu/i386/isr.c @@ -250,9 +250,13 @@ void isr_handler(registers_t* r) { serial_printf("Copying initrd\n"); memcpy((char*)r->ebx,initrd,initrd_sz); break; - case SYSCALL_NEW_THREAD: - tasking_new_thread((void*)r->ebx,tasking_getPID(),0,0); - break; + case SYSCALL_NEW_THREAD: { + uint32_t tid=tasking_new_thread((void*)r->ebx,tasking_getPID(),1,r->edx); + if ((uint32_t*)r->ecx!=NULL) { + *((uint32_t*)r->ecx)=tid; + } + } + break; default: break; } diff --git a/kernel/cpu/i386/tasking.c b/kernel/cpu/i386/tasking.c index f043827..8107c80 100644 --- a/kernel/cpu/i386/tasking.c +++ b/kernel/cpu/i386/tasking.c @@ -167,8 +167,9 @@ int* tasking_get_errno_address() { return ¤tThread->errno; } -void tasking_new_thread(void* start,pid_t pid,char param_exists,uint32_t param_arg) { +uint32_t tasking_new_thread(void* start,pid_t pid,char param_exists,uint32_t param_arg) { tasking_createTask(start,NULL,0,param_exists,param_arg,0,pid,1); + return processes[pid]->firstThread->tid; } void switch_to_thread(Thread* thread) { diff --git a/kernel/cpu/tasking.h b/kernel/cpu/tasking.h index f225fae..7cc68a4 100644 --- a/kernel/cpu/tasking.h +++ b/kernel/cpu/tasking.h @@ -13,7 +13,7 @@ void tasking_init(); char tasking_isPrivleged(); pid_t tasking_getPID(); int* tasking_get_errno_address(); -void tasking_new_thread(void* start,pid_t pid,char param_exists,uint32_t param_arg); +uint32_t tasking_new_thread(void* start,pid_t pid,char param_exists,uint32_t param_arg); void tasking_exit(uint8_t code); void tasking_block(ThreadState newstate); diff --git a/kernel/rpc.c b/kernel/rpc.c index 9225bba..f69615b 100644 --- a/kernel/rpc.c +++ b/kernel/rpc.c @@ -1,37 +1,48 @@ -#include "cpu/tasking.h" -#include -#include "rpc.h" -#include "cpu/i386/serial.h" -#include "cpu/halt.h" -void rpc_init_struct(ThreadRPCStruct* info) { - for (size_t i = 0; i < 32; i++) { - info->funcs[i].code=NULL; - memset(info->funcs[i].name,'\0',32); - } - info->rpc_response=NULL; - info->next_func=0; -} +// #include "cpu/tasking.h" +// #include +// #include "rpc.h" +// #include "cpu/i386/serial.h" +// #include "cpu/halt.h" +// #include "cpu/i386/address_spaces.h" +// void rpc_init_struct(ThreadRPCStruct* info) { +// for (size_t i = 0; i < 32; i++) { +// info->funcs[i].code=NULL; +// memset(info->funcs[i].name,'\0',32); +// } +// info->rpc_response=NULL; +// info->num_funcs=0; +// } -void rpc_reg_func(void* (*code)(void*),char* name) { - if (strlen(name)>31) { - serial_printf("Max length for RPC function name is 31!\n"); - halt(); - } - ThreadRPCStruct* info=tasking_get_rpc_struct(0); - if (info->next_func==32) { - serial_printf("Maximum # of RPC functions registered\n"); - halt(); - } - info->funcs[info->next_func].code=code; - strcpy(info->funcs[info->next_func].name,name); - info->next_func++; -} +// void rpc_reg_func(void* (*code)(void*),char* name) { +// if (strlen(name)>31) { +// serial_printf("Max length for RPC function name is 31!\n"); +// halt(); +// } +// ThreadRPCStruct* info=tasking_get_rpc_struct(0); +// if (info->num_funcs==32) { +// serial_printf("Maximum # of RPC functions registered\n"); +// halt(); +// } +// info->funcs[info->num_funcs].code=code; +// strcpy(info->funcs[info->num_funcs].name,name); +// info->num_funcs++; +// } -void rpc_call(char* name,pid_t pid,void* data) { - if (strlen(name)>31) { - serial_printf("Max length for RPC function name is 31!\n"); - halt(); - } - ThreadRPCStruct* info=tasking_get_rpc_struct(pid); - int func_idx; -} +// void rpc_call(char* name,pid_t pid,void* data,size_t size) { +// if (strlen(name)>31) { +// serial_printf("Max length for RPC function name is 31!\n"); +// halt(); +// } +// ThreadRPCStruct* info=tasking_get_rpc_struct(pid); +// int func_idx=-1; +// for (size_t i=0;inum_funcs;i++) { +// if (strcmp(info->funcs[i].name,name)==0) { +// func_idx=i; +// } +// } +// if (func_idx==-1) { +// serial_printf("No such rpc function %s for PID %d",name,pid); +// } +// void* copieddata=address_spaces_put_data(currentThread->cr3,data,size); +// tasking_new_thread(info->funcs[func_idx].code,pid,1,copieddata); +// } diff --git a/kernel/rpc.h b/kernel/rpc.h index 9c37e25..2f403bd 100644 --- a/kernel/rpc.h +++ b/kernel/rpc.h @@ -8,7 +8,7 @@ typedef struct RPCFuncInfo { typedef struct ThreadRPCStruct { RPCFuncInfo funcs[32]; - int next_func; + int num_funcs; void* rpc_response; } ThreadRPCStruct; diff --git a/libc/pthread.c b/libc/pthread.c new file mode 100644 index 0000000..b5419eb --- /dev/null +++ b/libc/pthread.c @@ -0,0 +1,16 @@ +#include +#include +#include +#define QUAUX(X) #X +#define QU(X) QUAUX(X) + +int pthread_create(pthread_t *restrict thread, const pthread_attr_t *restrict attr, void *(*start_routine)(void*), void *restrict arg) { + if (thread==NULL) { + return 1; + } + asm volatile(" \ + mov $" QU(SYSCALL_NEW_THREAD) ", %%eax; \ + int $80; \ + "::"b"(start_routine),"c"(thread),"d"(arg)); + return 0; +} diff --git a/libc/tasking.c b/libc/tasking.c index 0a015d6..2da87c1 100644 --- a/libc/tasking.c +++ b/libc/tasking.c @@ -57,10 +57,3 @@ void unblockThread(pid_t pid,uint32_t tid) { int $80; \ "::"b"(pid),"c"(tid)); } - -void new_thread(void* start) { - asm volatile(" \ - mov $" QU(SYSCALL_NEW_THREAD) ", %%eax; \ - int $80; \ - "::"b"(start)); -} diff --git a/sysroot/usr/include/pthread.h b/sysroot/usr/include/pthread.h new file mode 100644 index 0000000..117441a --- /dev/null +++ b/sysroot/usr/include/pthread.h @@ -0,0 +1,12 @@ +#ifndef PTHREAD_H +#define PTHREAD_H + +#include + +typedef uint32_t pthread_t; +typedef int pthread_attr_t; //Created as dummy + +int pthread_create(pthread_t *restrict thread, + const pthread_attr_t *restrict attr, + void *(*start_routine)(void*), void *restrict arg); +#endif