From c3b821ccc009ec819f2580a53c0ed423aad43bf9 Mon Sep 17 00:00:00 2001 From: "John Hodge (sonata)" Date: Fri, 25 Jan 2013 22:46:55 +0800 Subject: [PATCH] Tools/DiskTool - Splitting parts out to be shared with NetTest --- Tools/DiskTool/{src => }/Makefile | 16 +- Tools/DiskTool/{src => }/actions.c | 0 Tools/DiskTool/{src => }/helpers.c | 0 Tools/DiskTool/{src => }/include/acess.h | 0 .../{src => }/include/acess_logging.h | 0 Tools/DiskTool/{src => }/include/arch.h | 0 .../{src => }/include/disktool_common.h | 0 Tools/DiskTool/{src => }/include/modules.h | 0 Tools/DiskTool/{src => }/include/mutex.h | 0 Tools/DiskTool/{src => }/include/rwlock.h | 0 Tools/DiskTool/{src => }/main.c | 38 ---- Tools/DiskTool/nativefs.c | 1 + Tools/DiskTool/{src => }/script.c | 0 Tools/DiskTool/src/nativefs.c | 1 - Tools/DiskTool/{src => }/vfs_handles.c | 0 Tools/NetTest/Makefile | 103 +++++++++ Tools/{DiskTool/src => NetTest}/logging.c | 0 Tools/NetTest/main.c | 0 Tools/NetTest/nic.c | 0 Tools/NetTest/tap.c | 0 Tools/NetTest/tcpclient.c | 0 Tools/NetTest/tcpserver.c | 0 Tools/NetTest/vfs_shim.c | 0 Tools/nativelib/Makefile | 27 +++ Tools/nativelib/include/acess.h | 162 ++++++++++++++ Tools/nativelib/include/acess_logging.h | 34 +++ Tools/nativelib/include/arch.h | 0 Tools/nativelib/logging.c | 204 ++++++++++++++++++ Tools/nativelib/misc.c | 57 +++++ Tools/nativelib/mutex.c | 22 ++ Tools/{DiskTool/src => nativelib}/threads.c | 32 ++- Tools/{DiskTool/src => nativelib}/time.c | 5 + 32 files changed, 654 insertions(+), 48 deletions(-) rename Tools/DiskTool/{src => }/Makefile (90%) rename Tools/DiskTool/{src => }/actions.c (100%) rename Tools/DiskTool/{src => }/helpers.c (100%) rename Tools/DiskTool/{src => }/include/acess.h (100%) rename Tools/DiskTool/{src => }/include/acess_logging.h (100%) rename Tools/DiskTool/{src => }/include/arch.h (100%) rename Tools/DiskTool/{src => }/include/disktool_common.h (100%) rename Tools/DiskTool/{src => }/include/modules.h (100%) rename Tools/DiskTool/{src => }/include/mutex.h (100%) rename Tools/DiskTool/{src => }/include/rwlock.h (100%) rename Tools/DiskTool/{src => }/main.c (73%) create mode 120000 Tools/DiskTool/nativefs.c rename Tools/DiskTool/{src => }/script.c (100%) delete mode 120000 Tools/DiskTool/src/nativefs.c rename Tools/DiskTool/{src => }/vfs_handles.c (100%) create mode 100644 Tools/NetTest/Makefile rename Tools/{DiskTool/src => NetTest}/logging.c (100%) create mode 100644 Tools/NetTest/main.c create mode 100644 Tools/NetTest/nic.c create mode 100644 Tools/NetTest/tap.c create mode 100644 Tools/NetTest/tcpclient.c create mode 100644 Tools/NetTest/tcpserver.c create mode 100644 Tools/NetTest/vfs_shim.c create mode 100644 Tools/nativelib/Makefile create mode 100644 Tools/nativelib/include/acess.h create mode 100644 Tools/nativelib/include/acess_logging.h create mode 100644 Tools/nativelib/include/arch.h create mode 100644 Tools/nativelib/logging.c create mode 100644 Tools/nativelib/misc.c create mode 100644 Tools/nativelib/mutex.c rename Tools/{DiskTool/src => nativelib}/threads.c (50%) rename Tools/{DiskTool/src => nativelib}/time.c (90%) diff --git a/Tools/DiskTool/src/Makefile b/Tools/DiskTool/Makefile similarity index 90% rename from Tools/DiskTool/src/Makefile rename to Tools/DiskTool/Makefile index e91bc7f8..9d68da35 100644 --- a/Tools/DiskTool/src/Makefile +++ b/Tools/DiskTool/Makefile @@ -1,17 +1,17 @@ TARGET := $(shell gcc -v 2>&1 | grep Targ | awk '{print $$2}') -include ../../../Makefile.Version.cfg +include ../../Makefile.Version.cfg -include Makefile.BuildNum ifeq ($(BUILD_NUM),) BUILD_NUM = 1 endif -KERNEL_SRC = ../../../KernelLand/Kernel/ -MODULE_SRC = ../../../KernelLand/Modules/ +KERNEL_SRC = ../../KernelLand/Kernel/ +MODULE_SRC = ../../KernelLand/Modules/ -BIN = ../DiskTool +BIN = ../disktool # Kernel Sources (compiled with -ffreestanding) K_OBJ := lib.o K_OBJ += vfs/main.o vfs/open.o vfs/acls.o vfs/io.o vfs/dir.o @@ -21,15 +21,15 @@ K_OBJ += drvutil_disk.o drv/proc.o # Modules MODULES := Storage/LVM Filesystems/FAT Filesystems/Ext2 Filesystems/NTFS # Local kernel soruces (same as above, but located in same directory as Makefile) -L_OBJ = vfs_handles.o threads.o nativefs.o time.o actions.o +L_OBJ = vfs_handles.o nativefs.o actions.o # Native Sources (compiled as usual) -N_OBJ = main.o script.o logging.o helpers.o +N_OBJ = main.o script.o helpers.o # Compilation Options CFLAGS := -Wall -std=gnu99 -g -Werror -CPPFLAGS := -I include/ +CPPFLAGS := -I include/ -I ../nativelib K_CPPFLAGS := -I $(KERNEL_SRC)include -I $(MODULE_SRC) -LDFLAGS += -Wl,--defsym,__buildnum=$(BUILD_NUM) -g +LDFLAGS += -Wl,--defsym,__buildnum=$(BUILD_NUM) -g -L ../ -lnativelib BUILDINFO_OBJ := obj/$(TARGET)/buildinfo.o BUILDINFO_SRC := $(BUILDINFO_OBJ:%.o=%.c) diff --git a/Tools/DiskTool/src/actions.c b/Tools/DiskTool/actions.c similarity index 100% rename from Tools/DiskTool/src/actions.c rename to Tools/DiskTool/actions.c diff --git a/Tools/DiskTool/src/helpers.c b/Tools/DiskTool/helpers.c similarity index 100% rename from Tools/DiskTool/src/helpers.c rename to Tools/DiskTool/helpers.c diff --git a/Tools/DiskTool/src/include/acess.h b/Tools/DiskTool/include/acess.h similarity index 100% rename from Tools/DiskTool/src/include/acess.h rename to Tools/DiskTool/include/acess.h diff --git a/Tools/DiskTool/src/include/acess_logging.h b/Tools/DiskTool/include/acess_logging.h similarity index 100% rename from Tools/DiskTool/src/include/acess_logging.h rename to Tools/DiskTool/include/acess_logging.h diff --git a/Tools/DiskTool/src/include/arch.h b/Tools/DiskTool/include/arch.h similarity index 100% rename from Tools/DiskTool/src/include/arch.h rename to Tools/DiskTool/include/arch.h diff --git a/Tools/DiskTool/src/include/disktool_common.h b/Tools/DiskTool/include/disktool_common.h similarity index 100% rename from Tools/DiskTool/src/include/disktool_common.h rename to Tools/DiskTool/include/disktool_common.h diff --git a/Tools/DiskTool/src/include/modules.h b/Tools/DiskTool/include/modules.h similarity index 100% rename from Tools/DiskTool/src/include/modules.h rename to Tools/DiskTool/include/modules.h diff --git a/Tools/DiskTool/src/include/mutex.h b/Tools/DiskTool/include/mutex.h similarity index 100% rename from Tools/DiskTool/src/include/mutex.h rename to Tools/DiskTool/include/mutex.h diff --git a/Tools/DiskTool/src/include/rwlock.h b/Tools/DiskTool/include/rwlock.h similarity index 100% rename from Tools/DiskTool/src/include/rwlock.h rename to Tools/DiskTool/include/rwlock.h diff --git a/Tools/DiskTool/src/main.c b/Tools/DiskTool/main.c similarity index 73% rename from Tools/DiskTool/src/main.c rename to Tools/DiskTool/main.c index 2de26a6d..81a087c1 100644 --- a/Tools/DiskTool/src/main.c +++ b/Tools/DiskTool/main.c @@ -96,44 +96,6 @@ int *Threads_GetErrno(void) return &errno; } -// TODO: Move into a helper lib? -void itoa(char *buf, uint64_t num, int base, int minLength, char pad) -{ - char fmt[] = "%0ll*x"; - switch(base) - { - case 8: fmt[5] = 'o'; break; - case 10: fmt[5] = 'd'; break; - case 16: fmt[5] = 'x'; break; - } - if(pad != '0') { - fmt[1] = '%'; - sprintf(buf, fmt+1, minLength, num); - } - else { - sprintf(buf, fmt, minLength, num); - } -} - -int strpos(const char *Str, char Ch) -{ - const char *r = strchr(Str, Ch); - if(!r) return -1; - return r - Str; -} - -int strucmp(const char *s1, const char *s2) -{ - return strcasecmp(s1, s2); -} - -uint64_t DivMod64U(uint64_t value, uint64_t divisor, uint64_t *remainder) -{ - if(remainder) - *remainder = value % divisor; - return value / divisor; -} - size_t _fwrite_stdout(size_t bytes, const void *data) { return fwrite(data, bytes, 1, stdout); diff --git a/Tools/DiskTool/nativefs.c b/Tools/DiskTool/nativefs.c new file mode 120000 index 00000000..cdb86d61 --- /dev/null +++ b/Tools/DiskTool/nativefs.c @@ -0,0 +1 @@ +../../AcessNative/acesskernel_src/nativefs.c \ No newline at end of file diff --git a/Tools/DiskTool/src/script.c b/Tools/DiskTool/script.c similarity index 100% rename from Tools/DiskTool/src/script.c rename to Tools/DiskTool/script.c diff --git a/Tools/DiskTool/src/nativefs.c b/Tools/DiskTool/src/nativefs.c deleted file mode 120000 index 164ccfc9..00000000 --- a/Tools/DiskTool/src/nativefs.c +++ /dev/null @@ -1 +0,0 @@ -../../../AcessNative/acesskernel_src/nativefs.c \ No newline at end of file diff --git a/Tools/DiskTool/src/vfs_handles.c b/Tools/DiskTool/vfs_handles.c similarity index 100% rename from Tools/DiskTool/src/vfs_handles.c rename to Tools/DiskTool/vfs_handles.c diff --git a/Tools/NetTest/Makefile b/Tools/NetTest/Makefile new file mode 100644 index 00000000..1679a283 --- /dev/null +++ b/Tools/NetTest/Makefile @@ -0,0 +1,103 @@ + +TARGET := $(shell gcc -v 2>&1 | grep Targ | awk '{print $$2}') + +include ../../Makefile.Version.cfg +-include Makefile.BuildNum +ifeq ($(BUILD_NUM),) +BUILD_NUM = 1 +endif + + +KERNEL_SRC = ../../KernelLand/Kernel/ +MODULE_SRC = ../../KernelLand/Modules/ + +BIN = ../nettest +# Kernel Sources (compiled with -ffreestanding) +K_OBJ := lib.o adt.o +#K_OBJ += vfs/main.o vfs/open.o vfs/acls.o vfs/io.o vfs/dir.o +#K_OBJ += vfs/nodecache.o vfs/mount.o vfs/memfile.o # vfs/select.o +#K_OBJ += vfs/fs/root.o vfs/fs/devfs.o +#K_OBJ += drvutil_disk.o drv/proc.o +# Modules +MODULES := IPStack +# Local kernel soruces (same as above, but located in same directory as Makefile) +L_OBJ = vfs_shim.o nic.o tcpclient.o tcpserver.o +# Native Sources (compiled as usual) +N_OBJ = main.o tap.o + +# Compilation Options +CFLAGS := -Wall -std=gnu99 -g -Werror +CPPFLAGS := -I include/ -I ../nativelib/include +K_CPPFLAGS := -I $(KERNEL_SRC)include -I $(MODULE_SRC) +LDFLAGS += -Wl,--defsym,__buildnum=$(BUILD_NUM) -g -L .. -lnativelib + +BUILDINFO_OBJ := obj/$(TARGET)/buildinfo.o +BUILDINFO_SRC := $(BUILDINFO_OBJ:%.o=%.c) + +# ==================== +# == Start of Magic == +# ==================== +# -- Load modules --- +$(foreach module,$(MODULES), $(eval include $(MODULE_SRC)$(module)/Makefile) $(eval M_OBJ += $(addprefix $(module)/,$(OBJ))) ) + +# -- Apply Prefixes to object paths +OBJ_PREFIX = obj/$(TARGET)/ +K_OBJ_PREFIX = $(OBJ_PREFIX)_Kernel/ +M_OBJ_PREFIX = $(OBJ_PREFIX)_Module/ +K_OBJ := $(addprefix $(K_OBJ_PREFIX),$(K_OBJ)) +M_OBJ := $(addprefix $(M_OBJ_PREFIX),$(M_OBJ)) +L_OBJ := $(addprefix $(OBJ_PREFIX),$(L_OBJ)) +N_OBJ := $(addprefix $(OBJ_PREFIX),$(N_OBJ)) + +OBJ := $(N_OBJ) $(L_OBJ) $(K_OBJ) $(M_OBJ) $(BUILDINFO_OBJ) + +DEPFILES = $(filter %.o,$(OBJ)) +DEPFILES := $(DEPFILES:%=%.dep) + + +.PHONY: all clean + +all: $(BIN) + +clean: + $(RM) -f $(OBJ) $(DEPFILES) $(BIN) + +$(BIN): $(OBJ) + @echo [CC Link] -o $(BIN) + @$(CC) -o $(BIN) $(OBJ) $(LDFLAGS) + @echo BUILD_NUM = $$(( $(BUILD_NUM) + 1 )) > Makefile.BuildNum + +$(M_OBJ): $(M_OBJ_PREFIX)%.o: $(MODULE_SRC)%.c + @mkdir -p $(dir $@) + @echo [CC Module] -o $@ + @$(CC) -c $< -o $@ -ffreestanding $(CFLAGS) $(CPPFLAGS) $(K_CPPFLAGS) -MMD -MP -MF $@.dep + +$(K_OBJ): $(K_OBJ_PREFIX)%.o: $(KERNEL_SRC)%.c + @mkdir -p $(dir $@) + @echo [CC Kernel] -o $@ + @$(CC) -c $< -o $@ -ffreestanding $(CFLAGS) $(CPPFLAGS) $(K_CPPFLAGS) -MMD -MP -MF $@.dep + +$(L_OBJ): $(OBJ_PREFIX)%.o: %.c + @mkdir -p $(dir $@) + @echo [CC Local] -o $@ + @$(CC) -c $< -o $@ -ffreestanding $(CFLAGS) $(CPPFLAGS) $(K_CPPFLAGS) -MMD -MP -MF $@.dep + +$(N_OBJ): $(OBJ_PREFIX)%.o: %.c + @mkdir -p $(dir $@) + @echo [CC Native] -o $@ + @$(CC) -c $< -o $@ $(CFLAGS) $(CPPFLAGS) -MMD -MP -MF $@.dep + +# Hacky buildinfo.c file +$(BUILDINFO_SRC): $(filter-out $(BUILDINFO_OBJ), $(OBJ)) Makefile + @echo "" > $@ + @echo "const char gsKernelVersion[] = \"$(ACESS_VERSION)\";" >> $@ + @echo "const char gsGitHash[] = \""`git log -n 1 | head -n 1 | awk '{print $$2}'`"\";" >> $@ + @echo "const int giBuildNumber = $(BUILD_NUM);" >> $@ + @echo "const char gsBuildInfo[] = \"Acess2 DiskTool v$(ACESS_VERSION)\";" >> $@ +$(BUILDINFO_OBJ): $(BUILDINFO_SRC) + @echo [CC] -o $@ + @$(CC) -o $@ -c $< $(CFLAGS) $(CPPFLAGS) + +$(OBJ): Makefile + +-include $(DEPFILES) diff --git a/Tools/DiskTool/src/logging.c b/Tools/NetTest/logging.c similarity index 100% rename from Tools/DiskTool/src/logging.c rename to Tools/NetTest/logging.c diff --git a/Tools/NetTest/main.c b/Tools/NetTest/main.c new file mode 100644 index 00000000..e69de29b diff --git a/Tools/NetTest/nic.c b/Tools/NetTest/nic.c new file mode 100644 index 00000000..e69de29b diff --git a/Tools/NetTest/tap.c b/Tools/NetTest/tap.c new file mode 100644 index 00000000..e69de29b diff --git a/Tools/NetTest/tcpclient.c b/Tools/NetTest/tcpclient.c new file mode 100644 index 00000000..e69de29b diff --git a/Tools/NetTest/tcpserver.c b/Tools/NetTest/tcpserver.c new file mode 100644 index 00000000..e69de29b diff --git a/Tools/NetTest/vfs_shim.c b/Tools/NetTest/vfs_shim.c new file mode 100644 index 00000000..e69de29b diff --git a/Tools/nativelib/Makefile b/Tools/nativelib/Makefile new file mode 100644 index 00000000..2a6eb6df --- /dev/null +++ b/Tools/nativelib/Makefile @@ -0,0 +1,27 @@ + +KERNEL_DIR := ../../KernelLand/Kernel + +NOBJ := logging.o misc.o +KOBJ := threads.o time.o mutex.o +OBJ := $(NOBJ) $(KOBJ) +BIN := ../libnativelib.a + +CFLAGS := -Wall -std=c99 -Werror +CPPFLAGS := -I include + + +.PHONY: all clean + +all: $(BIN) + +clean: + $(RM) $(BIN) $(OBJ) + +$(BIN): $(OBJ) + ar cru $(BIN) $(OBJ) + +$(NOBJ): %.o: %.c + $(CC) -o $@ -c $< $(CFLAGS) $(CPPFLAGS) +$(KOBJ): %.o: %.c + $(CC) -o $@ -c $< $(CFLAGS) $(CPPFLAGS) -I $(KERNEL_DIR)/include + diff --git a/Tools/nativelib/include/acess.h b/Tools/nativelib/include/acess.h new file mode 100644 index 00000000..c7f77751 --- /dev/null +++ b/Tools/nativelib/include/acess.h @@ -0,0 +1,162 @@ +/* + * Acess2 DiskTool utility + * - By John Hodge (thePowersGang) + * + * include/acess.h + * - Mock kernel core header + */ +#ifndef _DISKTOOL__ACESS_H_ +#define _DISKTOOL__ACESS_H_ + +#define CONCAT(x,y) x ## y +#define EXPAND_CONCAT(x,y) CONCAT(x,y) +#define STR(x) #x +#define EXPAND_STR(x) STR(x) + +#define ASSERT(x) do{}while(0) + +extern char __buildnum[]; +#define BUILD_NUM ((int)(Uint)&__buildnum) +extern const char gsGitHash[]; +extern const char gsBuildInfo[]; +#define VER2(major,minor) ((((major)&0xFF)<<8)|((minor)&0xFF)) + + +#define BITS 32 +#define NULL ((void*)0) +#include + +typedef uintptr_t Uint; +//typedef unsigned int size_t; +#include +typedef uint64_t off_t; +typedef char BOOL; + + +typedef uint8_t Uint8; +typedef uint16_t Uint16; +typedef uint32_t Uint32; +typedef uint64_t Uint64; + +typedef int8_t Sint8; +typedef int16_t Sint16; +typedef int32_t Sint32; +typedef int64_t Sint64; + +typedef uintptr_t tVAddr; +typedef uint32_t tPAddr; + +typedef uint32_t tUID; +typedef uint32_t tGID; +typedef uint32_t tTID; + +// NOTE: Since this is single-threaded (for now) mutexes can be implimented as simple locks +typedef char tShortSpinlock; + +typedef int64_t tTime; +extern tTime now(void); +extern int64_t timestamp(int sec, int min, int hr, int day, int month, int year); +extern void format_date(tTime TS, int *year, int *month, int *day, int *hrs, int *mins, int *sec, int *ms); + +#define PACKED __attribute__((packed)) +#define DEPRECATED +#define EXPORT(s) +#define EXPORTV(s) + +#include + +// These are actually library functions, but they can't be included, so they're defined manually +extern void *malloc(size_t bytes); +extern void *calloc(size_t nmemb, size_t size); +extern void *realloc(void *oldptr, size_t bytes); +extern void free(void *buffer); + +#include +#include + +// Threads +extern int *Threads_GetErrno(void); +//extern tPGID Threads_GetPGID(void); +//extern tPID Threads_GetPID(void); +extern tTID Threads_GetTID(void); +extern tUID Threads_GetUID(void); +extern tGID Threads_GetGID(void); + +extern struct sThread *Proc_SpawnWorker(void (*Fcn)(void*), void *Data); +extern void Threads_Sleep(void); +extern void Threads_Yield(void); +extern int Threads_SetName(const char *NewName); + +// Kinda hacky way of not colliding with native errno +#define errno (*(Threads_GetErrno())) + +/** + * \name Endianness Swapping + * \{ + */ +#ifdef __BIG_ENDIAN__ +#define LittleEndian16(_val) SwapEndian16(_val) +#define LittleEndian32(_val) SwapEndian32(_val) +#define LittleEndian64(_val) SwapEndian32(_val) +#define BigEndian16(_val) (_val) +#define BigEndian32(_val) (_val) +#define BigEndian64(_val) (_val) +#else +#define LittleEndian16(_val) (_val) +#define LittleEndian32(_val) (_val) +#define LittleEndian64(_val) (_val) +#define BigEndian16(_val) SwapEndian16(_val) +#define BigEndian32(_val) SwapEndian32(_val) +#define BigEndian64(_val) SwapEndian64(_val) +#endif +extern Uint16 SwapEndian16(Uint16 Val); +extern Uint32 SwapEndian32(Uint32 Val); +extern Uint64 SwapEndian64(Uint64 Val); +/** + * \} + */ + + +#include +#include +#if 0 +extern int strucmp(const char *s1, const char *s2); +extern int strpos(const char *Str, char Ch); +extern void itoa(char *buf, uint64_t num, int base, int minLength, char pad); +extern int snprintf(char *buf, size_t len, const char *fmt, ...); +extern int sprintf(char *buf, const char *fmt, ...); +extern int ReadUTF8(const Uint8 *str, Uint32 *Val); +extern int WriteUTF8(Uint8 *str, Uint32 Val); +extern int ParseInt(const char *string, int *Val); +#include +extern int ModUtil_SetIdent(char *Dest, const char *Value); +extern int ModUtil_LookupString(const char **Array, const char *Needle); +extern Uint8 ByteSum(const void *Ptr, int Size); +extern int Hex(char *Dest, size_t Size, const Uint8 *SourceData); +extern int UnHex(Uint8 *Dest, size_t DestSize, const char *SourceString); +#endif +#define CheckString(str) (1) +#define CheckMem(mem,sz) (1) +extern int rand(void); + +// TODO: Move out? +extern int DivUp(int value, int divisor); +extern uint64_t DivMod64U(uint64_t Num, uint64_t Den, uint64_t *Rem); +static inline int MIN(int a, int b) { return a < b ? a : b; } +static inline int MAX(int a, int b) { return a > b ? a : b; } + +#if USE_MULTITHREADING +#error "TODO: Impliment multithreaded SHORTLOCK" +#else +static inline void SHORTLOCK(tShortSpinlock *Lock) { + if(*Lock) Log_KernelPanic("---", "Double short lock"); + *Lock = 1; +} +static inline void SHORTREL(tShortSpinlock *m) { *m = 0; } +static inline int CPU_HAS_LOCK(tShortSpinlock *m) { return *m; } +#endif + +static inline intptr_t MM_GetPhysAddr(void *Ptr) { return 1; } + +#endif + diff --git a/Tools/nativelib/include/acess_logging.h b/Tools/nativelib/include/acess_logging.h new file mode 100644 index 00000000..5f007f9b --- /dev/null +++ b/Tools/nativelib/include/acess_logging.h @@ -0,0 +1,34 @@ + +#ifndef _DISKTOOL__ACESS_LOGGING_H_ +#define _DISKTOOL__ACESS_LOGGING_H_ + +#if DEBUG +# define ENTER(str, v...) Debug_TraceEnter(__func__, str, ##v) +# define LOG(fmt, v...) Debug_TraceLog(__func__, fmt, ##v) +# define LEAVE(t, v...) Debug_TraceLeave(__func__, t, ##v) +# define LEAVE_RET(t,v) do{LEAVE('-');return v;}while(0) +#else +# define ENTER(...) do{}while(0) +# define LOG(...) do{}while(0) +# define LEAVE(...) do{}while(0) +# define LEAVE_RET(t,v) do{return v;}while(0) +#endif + +extern void Log_KernelPanic(const char *Ident, const char *Message, ...) __attribute__((noreturn)); +extern void Log_Panic(const char *Ident, const char *Message, ...); +extern void Log_Error(const char *Ident, const char *Message, ...); +extern void Log_Warning(const char *Ident, const char *Message, ...); +extern void Log_Notice(const char *Ident, const char *Message, ...); +extern void Log_Log(const char *Ident, const char *Message, ...); +extern void Log_Debug(const char *Ident, const char *Message, ...); + +extern void Warning(const char *Message, ...); +extern void Log(const char *Message, ...); +extern void Debug_HexDump(const char *Prefix, const void *Data, size_t Length); + +extern void Debug_TraceEnter(const char *Function, const char *Format, ...); +extern void Debug_TraceLog(const char *Function, const char *Format, ...); +extern void Debug_TraceLeave(const char *Function, char Type, ...); + +#endif + diff --git a/Tools/nativelib/include/arch.h b/Tools/nativelib/include/arch.h new file mode 100644 index 00000000..e69de29b diff --git a/Tools/nativelib/logging.c b/Tools/nativelib/logging.c new file mode 100644 index 00000000..0cb3ed32 --- /dev/null +++ b/Tools/nativelib/logging.c @@ -0,0 +1,204 @@ +/* + * + */ +#include +#include +#include +#include +#include +#include +#include + +#define LOGHDR(col,type) fprintf(stderr, "\e["col"m[%-8.8s]"type" ", Ident) +#define LOGTAIL() fprintf(stderr, "\e[0m\n") + +#define PUTERR(col,type) {\ + LOGHDR(col,type);\ + va_list args; va_start(args, Message);\ + vfprintf(stderr, Message, args);\ + va_end(args);\ + LOGTAIL();\ +} + +// === CODE === +void Log_KernelPanic(const char *Ident, const char *Message, ...) { + PUTERR("35", "k") + abort(); +} +void Log_Panic(const char *Ident, const char *Message, ...) + PUTERR("34", "p") +void Log_Error(const char *Ident, const char *Message, ...) + PUTERR("31", "e") +void Log_Warning(const char *Ident, const char *Message, ...) + PUTERR("33", "w") +void Log_Notice(const char *Ident, const char *Message, ...) + PUTERR("32", "n") +void Log_Log(const char *Ident, const char *Message, ...) + PUTERR("37", "l") +void Log_Debug(const char *Ident, const char *Message, ...) + PUTERR("37", "d") + +void Warning(const char *Message, ...) { + const char *Ident = ""; + PUTERR("33", "W") +} +void Log(const char *Message, ...) { + const char *Ident = ""; + PUTERR("37", "L") +} + +void Debug_HexDump(const char *Prefix, const void *Data, size_t Length) +{ + const uint8_t *data = Data; + size_t ofs; + fprintf(stderr, "[HexDump ]d %s: %i bytes\n", Prefix, (int)Length); + for( ofs = 0; ofs + 16 <= Length; ofs += 16 ) + { + fprintf(stderr, "[HexDump ]d %s:", Prefix); + fprintf(stderr, " %02x %02x %02x %02x %02x %02x %02x %02x", + data[0], data[1], data[2], data[3], data[4], data[5], data[6], data[7]); + data += 8; + fprintf(stderr, " %02x %02x %02x %02x %02x %02x %02x %02x", + data[0], data[1], data[2], data[3], data[4], data[5], data[6], data[7]); + data += 8; + fprintf(stderr, "\n"); + } + + fprintf(stderr, "[HexDump ]d %s:", Prefix); + for( ; ofs < Length; ofs ++ ) + { + if( ofs % 8 == 0 ) fprintf(stderr, " "); + fprintf(stderr, " %02x", data[ofs%16]); + } + fprintf(stderr, "\n"); +} + + int giDebug_TraceLevel = 0; + +void Debug_TraceEnter(const char *Function, const char *Format, ...) +{ + const char *Ident = "Trace"; + LOGHDR("37","T"); + for( int i = 0; i < giDebug_TraceLevel; i ++ ) + fprintf(stderr, " "); + fprintf(stderr, "%s: (", Function); + + va_list args; + va_start(args, Format); + + int hasBeenPrev = 0; + while(*Format) + { + while( *Format && isblank(*Format) ) + Format ++; + if( !*Format ) break; + + char type = *Format++; + const char *start = Format; + while( *Format && !isblank(*Format) ) + Format ++; + + if(hasBeenPrev) + fprintf(stderr, ","); + hasBeenPrev = 1; + + fprintf(stderr, "%.*s=", (int)(Format-start), start); + switch(type) + { + case 'p': + fprintf(stderr, "%p", va_arg(args,const void *)); + break; + case 's': + fprintf(stderr, "\"%s\"", va_arg(args,const char *)); + break; + case 'i': + fprintf(stderr, "%i", va_arg(args,int)); + break; + case 'x': + fprintf(stderr, "0x%x", va_arg(args,unsigned int)); + break; + case 'X': + fprintf(stderr, "0x%"PRIx64, va_arg(args,uint64_t)); + break; + default: + va_arg(args,uintptr_t); + fprintf(stderr, "?"); + break; + } + } + + va_end(args); + + fprintf(stderr, ")"); + LOGTAIL(); + giDebug_TraceLevel ++; +} + +void Debug_TraceLog(const char *Function, const char *Format, ...) +{ + const char *Ident = "Trace"; + LOGHDR("37","T"); + + for( int i = 0; i < giDebug_TraceLevel; i ++ ) + fprintf(stderr, " "); + fprintf(stderr, "%s: ", Function); + + va_list args; + va_start(args, Format); + + vfprintf(stderr, Format, args); + + va_end(args); + LOGTAIL(); +} + +void Debug_TraceLeave(const char *Function, char Type, ...) +{ + if( giDebug_TraceLevel == 0 ) { + Log_Error("Debug", "Function %s called LEAVE without ENTER", Function); + } + + const char *Ident = "Trace"; + LOGHDR("37","T"); + + va_list args; + va_start(args, Type); + + if( giDebug_TraceLevel > 0 ) + { + giDebug_TraceLevel --; + for( int i = 0; i < giDebug_TraceLevel; i ++ ) + fprintf(stderr, " "); + } + fprintf(stderr, "%s: RETURN", Function); + switch(Type) + { + case '-': + break; + case 'i': + fprintf(stderr, " %i", va_arg(args, int)); + break; + case 'x': + fprintf(stderr, " 0x%x", va_arg(args, unsigned int)); + break; + case 'X': + fprintf(stderr, " 0x%"PRIx64, va_arg(args,uint64_t)); + break; + case 's': + fprintf(stderr, " \"%s\"", va_arg(args, const char *)); + break; + case 'p': + fprintf(stderr, " %p", va_arg(args, const void *)); + break; + case 'n': + fprintf(stderr, " NULL"); + break; + default: + fprintf(stderr, " ?"); + break; + } + + va_end(args); + LOGTAIL(); +} + diff --git a/Tools/nativelib/misc.c b/Tools/nativelib/misc.c new file mode 100644 index 00000000..20a7442d --- /dev/null +++ b/Tools/nativelib/misc.c @@ -0,0 +1,57 @@ +/* + * Acess2 nativelib + * - By John Hodge (thePowersGang) + * + * misc.c + * - Random functions + */ +#include +#include +#include +#include +#include // strcasecmp + +// TODO: Move into a helper lib? +void itoa(char *buf, uint64_t num, int base, int minLength, char pad) +{ + char fmt[] = "%0ll*x"; + switch(base) + { + case 8: fmt[5] = 'o'; break; + case 10: fmt[5] = 'd'; break; + case 16: fmt[5] = 'x'; break; + } + if(pad != '0') { + fmt[1] = '%'; + sprintf(buf, fmt+1, minLength, num); + } + else { + sprintf(buf, fmt, minLength, num); + } +} + +int ParseInt(const char *string, int *value) +{ + char *next; + *value = strtol(string, &next, 0); + return next - string; +} + +int strpos(const char *Str, char Ch) +{ + const char *r = strchr(Str, Ch); + if(!r) return -1; + return r - Str; +} + +int strucmp(const char *s1, const char *s2) +{ + return strcasecmp(s1, s2); +} + +uint64_t DivMod64U(uint64_t value, uint64_t divisor, uint64_t *remainder) +{ + if(remainder) + *remainder = value % divisor; + return value / divisor; +} diff --git a/Tools/nativelib/mutex.c b/Tools/nativelib/mutex.c new file mode 100644 index 00000000..54940f71 --- /dev/null +++ b/Tools/nativelib/mutex.c @@ -0,0 +1,22 @@ +/* + * Acess2 libnative (Kernel Simulation Library) + * - By John Hodge (thePowersGang) + * + * mutex.c + * - Mutex emulation + */ +#include + + +// === CODE === +int Mutex_Acquire(tMutex *Mutex) +{ + // TODO: Assert + return 0; +} + +void Mutex_Release(tMutex *Mutex) +{ + return; +} + diff --git a/Tools/DiskTool/src/threads.c b/Tools/nativelib/threads.c similarity index 50% rename from Tools/DiskTool/src/threads.c rename to Tools/nativelib/threads.c index 79ec4c65..5055dc3e 100644 --- a/Tools/DiskTool/src/threads.c +++ b/Tools/nativelib/threads.c @@ -1,5 +1,9 @@ /* - * + * Acess2 libnative (Kernel Simulation Library) + * - By John Hodge (thePowersGang) + * + * threads.c + * - Threads handling */ #include #include @@ -29,7 +33,33 @@ void Threads_ClearEvent(Uint32 Mask) tUID Threads_GetUID(void) { return 0; } tGID Threads_GetGID(void) { return 0; } +tTID Threads_GetTID(void) { return 0; } + int *Threads_GetMaxFD(void) { static int max_fd=32; return &max_fd; } char **Threads_GetCWD(void) { static char *cwd; return &cwd; } char **Threads_GetChroot(void) { static char *chroot; return &chroot; } +void Threads_Yield(void) +{ + Log_Warning("Threads", "Threads_Yield DEFINITELY shouldn't be used"); +} + +void Threads_Sleep(void) +{ + Log_Warning("Threads", "Threads_Sleep shouldn't be used"); +} + +int Threads_SetName(const char *Name) +{ + Log_Notice("Threads", "TODO: Threads_SetName('%s')", Name); + return 0; +} + +int *Threads_GetErrno(void) __attribute__ ((weak)); + +int *Threads_GetErrno(void)// __attribute__ ((weak)) +{ + static int a_errno; + return &a_errno; +} + diff --git a/Tools/DiskTool/src/time.c b/Tools/nativelib/time.c similarity index 90% rename from Tools/DiskTool/src/time.c rename to Tools/nativelib/time.c index 445b04b1..a091c0bf 100644 --- a/Tools/DiskTool/src/time.c +++ b/Tools/nativelib/time.c @@ -19,6 +19,11 @@ void Time_ScheduleTimer(tTimer *Timer, int Delta) } +void Time_RemoveTimer(tTimer *Timer) +{ + +} + void Time_FreeTimer(tTimer *Timer) { -- 2.20.1