From d047958aaade97d65ed5d5ca6c3835c2699e1010 Mon Sep 17 00:00:00 2001 From: John Hodge Date: Wed, 3 Oct 2012 11:39:49 +0800 Subject: [PATCH] AcessNative - Implimented (serverside) TCP - This should allow AxWin to start (as it sends almost 4MiB framebuffer updates) --- AcessNative/acesskernel_src/Makefile | 10 +- AcessNative/acesskernel_src/helpers.c | 9 ++ AcessNative/acesskernel_src/include/arch.h | 1 + .../acesskernel_src/include/threads_int.h | 2 +- AcessNative/acesskernel_src/server.c | 129 ++++++++++++++++-- AcessNative/acesskernel_src/threads.c | 28 ++++ AcessNative/ld-acess_src/exports.h | 2 + AcessNative/syscalls.h | 5 + BuildConf/x86/default.mk | 3 +- KernelLand/Kernel/include/hal_proc.h | 1 + KernelLand/Kernel/include/rwlock.h | 2 +- 11 files changed, 176 insertions(+), 16 deletions(-) diff --git a/AcessNative/acesskernel_src/Makefile b/AcessNative/acesskernel_src/Makefile index 0d63d5f5..fddfbcca 100644 --- a/AcessNative/acesskernel_src/Makefile +++ b/AcessNative/acesskernel_src/Makefile @@ -13,7 +13,7 @@ endif KERNEL_SRC = ../../KernelLand/Kernel/ -KERNEL_OBJ := logging.o adt.o lib.o drvutil.o debug.o messages.o +KERNEL_OBJ := logging.o adt.o lib.o libc.o debug.o messages.o drvutil_disk.o drvutil_video.o KERNEL_OBJ += vfs/main.o vfs/open.o vfs/acls.o vfs/io.o vfs/dir.o KERNEL_OBJ += vfs/nodecache.o vfs/mount.o vfs/memfile.o vfs/select.o KERNEL_OBJ += vfs/fs/root.o vfs/fs/devfs.o @@ -35,7 +35,7 @@ DEPFILES = $(filter %.o,$(OBJ) $(N_OBJ) $(K_OBJ)) DEPFILES := $(DEPFILES:%=%.dep) CPPFLAGS += -I include/ -I $(KERNEL_SRC)include/ -CFLAGS += -Wall -g +CFLAGS += -Wall -g -std=gnu99 LDFLAGS += -lSDL -lSDLmain -g -Wl,--defsym,__buildnum=$(BUILD_NUM) ifeq ($(PLATFORM),win) @@ -79,8 +79,12 @@ $(N_OBJ): obj-$(PLATFORM)/%.o: %.c $(BUILDINFO_SRC): $(filter-out $(BUILDINFO_OBJ), $(OBJ)) Makefile @echo "" > $@ + $(eval _GITHASH=$(shell git log -n 1 | head -n 1 | awk '{print $$2}')) + $(eval _GITCHANGED=$(shell git status --porcelain | grep -c '^ M ')) @echo "const char gsKernelVersion[] = \"$(ACESS_VERSION)\";" >> $@ - @echo "const char gsGitHash[] = \""`git log -n 1 | head -n 1 | awk '{print $$2}'`"\";" >> $@ + @echo "const char gsGitHash[] = \"$(_GITHASH)\";" >> $@ + @echo "const char gsBuildInfo[] = \"Acess2 v$(KERNEL_VERSION) $(ARCH)-$(PLATFORM)\\\\r\\\\n\"" >> $@ + @echo " \"Build $(shell hostname --fqdn):$(BUILD_NUM) Git $(_GITHASH) - $(_GITCHANGED) modified\";" >> $@ @echo "const int giBuildNumber = $(BUILD_NUM);" >> $@ $(BUILDINFO_OBJ): $(BUILDINFO_SRC) @echo [CC] -o $@ diff --git a/AcessNative/acesskernel_src/helpers.c b/AcessNative/acesskernel_src/helpers.c index fb3e48cf..3cf273e4 100644 --- a/AcessNative/acesskernel_src/helpers.c +++ b/AcessNative/acesskernel_src/helpers.c @@ -93,6 +93,10 @@ void Heap_Deallocate(void *Ptr) free(Ptr); } +void Heap_Dump(void) +{ +} + tPAddr MM_GetPhysAddr(tVAddr VAddr) { return VAddr; // HACK! @@ -121,3 +125,8 @@ Sint64 now(void) return tv.tv_sec * 1000 + tv.tv_usec/1000; } +void IPStack_SendDebugText(const char *str) +{ + // nop +} + diff --git a/AcessNative/acesskernel_src/include/arch.h b/AcessNative/acesskernel_src/include/arch.h index b63d1bb2..03474cf1 100644 --- a/AcessNative/acesskernel_src/include/arch.h +++ b/AcessNative/acesskernel_src/include/arch.h @@ -37,6 +37,7 @@ struct sShortSpinlock #define SHORTLOCK(...) #define SHORTREL(...) +#define CPU_HAS_LOCK(...) 0 //#define NUM_CFG_ENTRIES 10 diff --git a/AcessNative/acesskernel_src/include/threads_int.h b/AcessNative/acesskernel_src/include/threads_int.h index f070a50e..1294a5f4 100644 --- a/AcessNative/acesskernel_src/include/threads_int.h +++ b/AcessNative/acesskernel_src/include/threads_int.h @@ -72,7 +72,7 @@ enum { THREAD_STAT_DEAD, // Awaiting burial (free) THREAD_STAT_BURIED // If it's still on the list here, something's wrong }; -extern tThread *Threads_GetThread(Uint TID); +extern struct sThread *Threads_GetThread(Uint TID); #endif diff --git a/AcessNative/acesskernel_src/server.c b/AcessNative/acesskernel_src/server.c index 78f7fa13..2e3f3a95 100644 --- a/AcessNative/acesskernel_src/server.c +++ b/AcessNative/acesskernel_src/server.c @@ -15,11 +15,12 @@ # include # include # include +# include // inet_ntop #endif #include "../syscalls.h" //#include -#define USE_TCP 0 +#define USE_TCP 1 #define MAX_CLIENTS 16 // === TYPES === @@ -27,6 +28,7 @@ typedef struct { int ClientID; SDL_Thread *WorkerThread; #if USE_TCP + int Socket; #else tRequestHeader *CurrentRequest; struct sockaddr_in ClientAddr; @@ -42,6 +44,7 @@ extern void Threads_SetThread(int TID); // HACK: Should have these in a header extern void Log_Debug(const char *Subsys, const char *Message, ...); extern void Log_Notice(const char *Subsys, const char *Message, ...); +extern void Log_Warning(const char *Subsys, const char *Message, ...); // === PROTOTYPES === tClient *Server_GetClient(int ClientID); @@ -102,12 +105,19 @@ tClient *Server_GetClient(int ClientID) // Allocate a thread for the process ret->ClientID = ClientID; + #if USE_TCP + ret->Socket = 0; + #else ret->CurrentRequest = NULL; + #endif if( !ret->WorkerThread ) { + #if USE_TCP + #else ret->WaitFlag = SDL_CreateCond(); ret->Mutex = SDL_CreateMutex(); SDL_mutexP( ret->Mutex ); + #endif ret->WorkerThread = SDL_CreateThread( Server_WorkerThread, ret ); } @@ -117,14 +127,76 @@ tClient *Server_GetClient(int ClientID) int Server_WorkerThread(void *ClientPtr) { tClient *Client = ClientPtr; + + #if USE_TCP + for( ;; ) + { + fd_set fds; + int nfd = Client->Socket; + FD_ZERO(&fds); + FD_SET(Client->Socket, &fds); + + select(nfd, &fds, NULL, NULL, NULL); // TODO: Timeouts? + + if( FD_ISSET(Client->Socket, &fds) ) + { + const int ciMaxParamCount = 6; + char lbuf[sizeof(tRequestHeader) + ciMaxParamCount*sizeof(tRequestValue)]; + tRequestHeader *hdr = (void*)lbuf; + size_t len = recv(Client->Socket, hdr, sizeof(*hdr), 0); + if( len != sizeof(hdr) ) { + // Oops? + } + + if( hdr->NParams > ciMaxParamCount ) { + // Oops. + } + + len = recv(Client->Socket, hdr->Params, hdr->NParams*sizeof(tRequestValue), 0); + if( len != hdr->NParams*sizeof(tRequestValue) ) { + // Oops. + } + + // Get buffer size + size_t hdrsize = sizeof(tRequestHeader) + hdr->NParams*sizeof(tRequestValue); + size_t bufsize = hdrsize; + int i; + for( i = 0; i < hdr->NParams; i ++ ) + { + if( hdr->Params[i].Flags & ARG_FLAG_ZEROED ) + ; + else { + bufsize += hdr->Params[i].Length; + } + } + + // Allocate full buffer + hdr = malloc(bufsize); + memcpy(hdr, lbuf, hdrsize); + len = recv(Client->Socket, hdr->Params + hdr->NParams, bufsize - hdrsize, 0); + if( len != bufsize - hdrsize ) { + // Oops? + } + + int retlen; + tRequestHeader *retHeader; + retHeader = SyscallRecieve(hdr, &retlen); + if( !retHeader ) { + // Some sort of error + } + + send(Client->Socket, retHeader, retlen, 0); + + // Clean up + free(hdr); + } + } + #else tRequestHeader *retHeader; tRequestHeader errorHeader; int retSize = 0; int sentSize; int cur_client_id = 0; - - #if USE_TCP - #else for( ;; ) { // Wait for something to do @@ -253,18 +325,55 @@ int Server_ListenThread(void *Unused) for( ;; ) { #if USE_TCP - struct sockaddr_in client; - uint clientSize = sizeof(client); - int clientSock = accept(gSocket, (struct sockaddr*)&client, &clientSize); + struct sockaddr_in clientaddr; + socklen_t clientSize = sizeof(clientaddr); + int clientSock = accept(gSocket, (struct sockaddr*)&clientaddr, &clientSize); if( clientSock < 0 ) { perror("SyscallServer - accept"); break ; } + + char addrstr[4*8+8+1]; + inet_ntop(clientaddr.sin_family, &clientaddr.sin_addr, addrstr, sizeof(addrstr)); + Log_Debug("Server", "Client connection %s:%i\n", addrstr, ntohs(clientaddr.sin_port)); - Log("Client connection %x:%i\n", - ntohl(client.sin_addr), ntohs(client.sin_port) - ); + // Perform auth + size_t len; + tRequestAuthHdr authhdr; + len = recv(clientSock, &authhdr, sizeof(authhdr), 0); + if( len != sizeof(authhdr) ) { + // Some form of error? + } + + tClient *client; + if( authhdr.pid == 0 ) { + // Allocate PID and client structure/thread + client = Server_GetClient(0); + client->Socket = clientSock; + authhdr.pid = client->ClientID; + } + else { + // Get client structure and make sure it's unused + // - Auth token / verifcation? + client = Server_GetClient(authhdr.pid); + if( client->Socket != 0 ) { + Log_Warning("Server", "Client (%i)%p owned by FD%i but %s:%i tried to use it", + authhdr.pid, client, addrstr, clientaddr.sin_port); + authhdr.pid = 0; + } + else { + client->Socket = clientSock; + } + } + len = send(clientSock, &authhdr, sizeof(authhdr), 0); + if( len != sizeof(authhdr) ) { + // Ok, this is an error + perror("Sending auth reply"); + } + + // All done, client thread should be watching now + #else char data[BUFSIZ]; tRequestHeader *req = (void*)data; diff --git a/AcessNative/acesskernel_src/threads.c b/AcessNative/acesskernel_src/threads.c index c390a031..a7aace8b 100644 --- a/AcessNative/acesskernel_src/threads.c +++ b/AcessNative/acesskernel_src/threads.c @@ -15,6 +15,7 @@ #include #include #include +#include #include #include @@ -333,6 +334,33 @@ int Semaphore_Signal(tSemaphore *Sem, int AmmountToAdd) return AmmountToAdd; } +// -------------------------------------------------------------------- +// Event handling +// -------------------------------------------------------------------- +int RWLock_AcquireRead(tRWLock *Lock) +{ + if( !Lock->ReaderWaiting ) { + Lock->ReaderWaiting = malloc(sizeof(pthread_rwlock_t)); + pthread_rwlock_init( (void*)Lock->ReaderWaiting, 0 ); + } + pthread_rwlock_rdlock( (void*)Lock->ReaderWaiting ); + return 0; +} +int RWLock_AcquireWrite(tRWLock *Lock) +{ + if( !Lock->ReaderWaiting ) { + Lock->ReaderWaiting = malloc(sizeof(pthread_rwlock_t)); + pthread_rwlock_init( (void*)Lock->ReaderWaiting, 0 ); + } + pthread_rwlock_wrlock( (void*)Lock->ReaderWaiting ); + return 0; +} +void RWLock_Release(tRWLock *Lock) +{ + pthread_rwlock_unlock( (void*)Lock->ReaderWaiting ); +} + + // -------------------------------------------------------------------- // Event handling // -------------------------------------------------------------------- diff --git a/AcessNative/ld-acess_src/exports.h b/AcessNative/ld-acess_src/exports.h index feb5bfd5..121a3aed 100644 --- a/AcessNative/ld-acess_src/exports.h +++ b/AcessNative/ld-acess_src/exports.h @@ -8,6 +8,8 @@ #ifndef _EXPORTS_H_ #define _EXPORTS_H_ +#include + // Syscall request (used by acess_*) extern uint64_t _Syscall(int SyscallID, const char *ArgTypes, ...); diff --git a/AcessNative/syscalls.h b/AcessNative/syscalls.h index d1a0bdce..37bc88cc 100644 --- a/AcessNative/syscalls.h +++ b/AcessNative/syscalls.h @@ -14,6 +14,11 @@ * uint8_t paramData[SUM(params[].Lengh)]; */ +typedef struct { + uint32_t pid; + uint32_t key; +} tRequestAuthHdr; + typedef struct sRequestValue { /// \see eArgumentTypes uint16_t Type; diff --git a/BuildConf/x86/default.mk b/BuildConf/x86/default.mk index 5d153f51..ff8de6ef 100644 --- a/BuildConf/x86/default.mk +++ b/BuildConf/x86/default.mk @@ -10,7 +10,8 @@ MODULES += Display/BochsGA MODULES += Input/PS2KbMouse MODULES += x86/ISADMA x86/VGAText -MODULES += USB/Core USB/UHCI USB/EHCI +MODULES += USB/Core USB/UHCI +#MODULES += USB/EHCI #USB/OHCI MODULES += USB/HID USB/MSC #MODULES += Interfaces/UDI diff --git a/KernelLand/Kernel/include/hal_proc.h b/KernelLand/Kernel/include/hal_proc.h index bb9dd4f6..5c03bdad 100644 --- a/KernelLand/Kernel/include/hal_proc.h +++ b/KernelLand/Kernel/include/hal_proc.h @@ -13,6 +13,7 @@ * \brief Achitecture defined thread/process management functions */ +#include #include /** diff --git a/KernelLand/Kernel/include/rwlock.h b/KernelLand/Kernel/include/rwlock.h index a6f46b58..e0d42078 100644 --- a/KernelLand/Kernel/include/rwlock.h +++ b/KernelLand/Kernel/include/rwlock.h @@ -37,7 +37,7 @@ struct sRWLock */ extern int RWLock_AcquireRead(tRWLock *Lock); -extern int RWLock_AcquireWrite(tRWLock *LOck); +extern int RWLock_AcquireWrite(tRWLock *Lock); /** * \brief Release a held mutex -- 2.20.1