diff options
| author | spicyjpeg <88942473+spicyjpeg@users.noreply.github.com> | 2022-02-20 12:31:31 +0100 |
|---|---|---|
| committer | spicyjpeg <88942473+spicyjpeg@users.noreply.github.com> | 2022-02-20 12:31:31 +0100 |
| commit | 72db767f5a5bdb958bb11bcb6fe6b9b332a2b195 (patch) | |
| tree | af217b41f42f78180b821e682c54f60ab0f3dd78 /libpsn00b | |
| parent | aca79b2a75c9a6106bc0047f767a475a2c3aaf8e (diff) | |
| download | psn00bsdk-72db767f5a5bdb958bb11bcb6fe6b9b332a2b195.tar.gz | |
Rewrite assert() and DL_CALL(), update mkpsxiso
Diffstat (limited to 'libpsn00b')
| -rw-r--r-- | libpsn00b/include/assert.h | 22 | ||||
| -rw-r--r-- | libpsn00b/include/dlfcn.h | 7 | ||||
| -rw-r--r-- | libpsn00b/libc/abort.c | 14 | ||||
| -rw-r--r-- | libpsn00b/libc/c++-support.cxx | 22 | ||||
| -rw-r--r-- | libpsn00b/psxetc/dl.c | 6 |
5 files changed, 46 insertions, 25 deletions
diff --git a/libpsn00b/include/assert.h b/libpsn00b/include/assert.h index 3114b57..e27f2ed 100644 --- a/libpsn00b/include/assert.h +++ b/libpsn00b/include/assert.h @@ -1,6 +1,20 @@ -#ifndef _ASSERT_H -#define _ASSERT_H +/* + * PSn00bSDK assert macro + * (C) 2022 spicyjpeg - MPL licensed + */ -void assert(int e); +#ifndef __ASSERT_H +#define __ASSERT_H -#endif
\ No newline at end of file +void _assert_abort(const char *file, int line, const char *expr); + +#ifdef DEBUG +#define assert(expr) { \ + if (!(expr)) \ + _assert_abort(__FILE__, __LINE__, #expr); \ +} +#else +#define assert(x) +#endif + +#endif diff --git a/libpsn00b/include/dlfcn.h b/libpsn00b/include/dlfcn.h index 6874d06..5848a95 100644 --- a/libpsn00b/include/dlfcn.h +++ b/libpsn00b/include/dlfcn.h @@ -1,19 +1,18 @@ /* * PSn00bSDK dynamic linker - * (C) 2021 spicyjpeg - MPL licensed + * (C) 2021-2022 spicyjpeg - MPL licensed */ #ifndef __DLFCN_H #define __DLFCN_H -#include <sys/types.h> +#include <stdint.h> #include <elf.h> /* Helper macro for setting $t9 before calling a function */ -#define DL_CALL(func, ...) { \ +#define DL_PRE_CALL(func) { \ __asm__ volatile("move $t9, %0;" :: "r"(func) : "$t9"); \ - func(__VA_ARGS__); \ } /* Types */ diff --git a/libpsn00b/libc/abort.c b/libpsn00b/libc/abort.c index ca5ab1d..1d07037 100644 --- a/libpsn00b/libc/abort.c +++ b/libpsn00b/libc/abort.c @@ -1,9 +1,15 @@ #include <stdio.h> void abort() { - printf("abort()\n"); - - while(1); -}
\ No newline at end of file + for (;;) + __asm__ volatile(""); +} + +void _assert_abort(const char *file, int line, const char *expr) { + printf("%s:%d: assert(%s)\n", file, line, expr); + + for (;;) + __asm__ volatile(""); +} diff --git a/libpsn00b/libc/c++-support.cxx b/libpsn00b/libc/c++-support.cxx index d169fdb..d0c0f3a 100644 --- a/libpsn00b/libc/c++-support.cxx +++ b/libpsn00b/libc/c++-support.cxx @@ -1,28 +1,28 @@ -#include <assert.h> #include <stdint.h> #include <stdlib.h> +#include <stdio.h> -extern "C" +extern "C" void __cxa_pure_virtual(void) { + printf("__cxa_pure_virtual()\n"); -void __cxa_pure_virtual(void) { - /* Pure C++ virtual call; abort! */ - assert(false); + for (;;) + __asm__ volatile(""); } void* operator new(size_t size) { - return malloc(size); + return malloc(size); } void* operator new[](size_t size) { - return malloc(size); + return malloc(size); } void operator delete(void* ptr) { - free(ptr); + free(ptr); } void operator delete[](void* ptr) { - free(ptr); + free(ptr); } /*- @@ -35,5 +35,5 @@ void operator delete[](void* ptr) { * * A memory allocator can use the given size to be more efficient */ void operator delete(void* ptr, unsigned int) { - free(ptr); -}
\ No newline at end of file + free(ptr); +} diff --git a/libpsn00b/psxetc/dl.c b/libpsn00b/psxetc/dl.c index cbdcb66..6d37605 100644 --- a/libpsn00b/psxetc/dl.c +++ b/libpsn00b/psxetc/dl.c @@ -587,7 +587,8 @@ DLL *DL_CreateDLL(void *ptr, size_t size, DL_ResolveMode mode) { if (ctor_list) { for (uint32_t i = ((uint32_t) ctor_list[0]); i >= 1; i--) { void (*ctor)(void) = (void (*)(void)) ctor_list[i]; - DL_CALL(ctor); + DL_PRE_CALL(ctor); + ctor(); } } @@ -619,7 +620,8 @@ void DL_DestroyDLL(DLL *dll) { if (dtor_list) { for (uint32_t i = 0; i < ((uint32_t) dtor_list[0]); i++) { void (*dtor)(void) = (void (*)(void)) dtor_list[i + 1]; - DL_CALL(dtor); + DL_PRE_CALL(dtor); + dtor(); } } } |
