// Vita3K emulator project // Copyright (C) 2021 Vita3K team // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License along // with this program; if not, write to the Free Software Foundation, Inc., // 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. #include "SceLibKernel.h" #include #include #include <../SceIofilemgr/SceIofilemgr.h> #include <../SceKernelModulemgr/SceModulemgr.h> #include <../SceKernelThreadMgr/SceThreadmgr.h> #include #include #include #include #include #include #include #include #include #include #include #include enum class TimerFlags : uint32_t { FIFO_THREAD = 0x00000000, PRIORITY_THREAD = 0x00002000, MANUAL_RESET = 0x00000000, AUTOMATIC_RESET = 0x00000100, ALL_NOTIFY = 0x00000000, WAKE_ONLY_NOTIFY = 0x00000800, OPENABLE = 0x00000080, }; inline uint64_t get_current_time() { return std::chrono::duration_cast( std::chrono::high_resolution_clock::now().time_since_epoch()) .count(); } EXPORT(int, __sce_aeabi_idiv0) { return UNIMPLEMENTED(); } EXPORT(int, __sce_aeabi_ldiv0) { return UNIMPLEMENTED(); } EXPORT(int, __stack_chk_fail) { return UNIMPLEMENTED(); } EXPORT(int, __stack_chk_guard) { return UNIMPLEMENTED(); } EXPORT(int, _sceKernelCreateLwMutex, Ptr workarea, const char *name, unsigned int attr, int init_count, Ptr opt_param) { const ThreadStatePtr thread = lock_and_find(thread_id, host.kernel.threads, host.kernel.mutex); Ptr options = Ptr(stack_alloc(*thread->cpu, sizeof(SceKernelCreateLwMutex_opt))); options.get(host.mem)->init_count = init_count; options.get(host.mem)->opt_param = opt_param; int res = CALL_EXPORT(__sceKernelCreateLwMutex, workarea, name, attr, options); stack_free(*thread->cpu, sizeof(SceKernelCreateLwMutex_opt)); return res; } EXPORT(int, sceClibAbort) { return UNIMPLEMENTED(); } EXPORT(int, sceClibDprintf) { return UNIMPLEMENTED(); } EXPORT(int, sceClibLookCtypeTable, uint32_t param1) { if (param1 < 128) { const uint8_t arr[128] = { 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x08, 0x08, 0x08, 0x08, 0x08, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x18, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x10, 0x10, 0x10, 0x10, 0x20 }; return arr[param1]; } else { return 0; } } EXPORT(int, sceClibMemchr) { return UNIMPLEMENTED(); } EXPORT(int, sceClibMemcmp, const void *s1, const void *s2, SceSize len) { return memcmp(s1, s2, len); } EXPORT(int, sceClibMemcmpConstTime) { return UNIMPLEMENTED(); } EXPORT(Ptr, sceClibMemcpy, Ptr dst, const void *src, SceSize len) { memcpy(dst.get(host.mem), src, len); return dst; } EXPORT(int, sceClibMemcpyChk) { return UNIMPLEMENTED(); } EXPORT(Ptr, sceClibMemcpy_safe, Ptr dst, const void *src, SceSize len) { memcpy(dst.get(host.mem), src, len); return dst; } EXPORT(Ptr, sceClibMemmove, Ptr dst, const void *src, SceSize len) { memmove(dst.get(host.mem), src, len); return dst; } EXPORT(int, sceClibMemmoveChk) { return UNIMPLEMENTED(); } EXPORT(Ptr, sceClibMemset, Ptr dst, int ch, SceSize len) { memset(dst.get(host.mem), ch, len); return dst; } EXPORT(int, sceClibMemsetChk) { return UNIMPLEMENTED(); } EXPORT(Ptr, sceClibMspaceCalloc, Ptr space, uint32_t elements, uint32_t size) { const std::lock_guard guard(host.kernel.mutex); void *address = mspace_calloc(space.get(host.mem), elements, size); return Ptr(address, host.mem); } EXPORT(Ptr, sceClibMspaceCreate, Ptr base, uint32_t capacity) { const std::lock_guard guard(host.kernel.mutex); mspace space = create_mspace_with_base(base.get(host.mem), capacity, 0); return Ptr(space, host.mem); } EXPORT(uint32_t, sceClibMspaceDestroy, Ptr space) { const std::lock_guard guard(host.kernel.mutex); return destroy_mspace(space.get(host.mem)); } EXPORT(void, sceClibMspaceFree, Ptr space, Ptr address) { const std::lock_guard guard(host.kernel.mutex); mspace_free(space.get(host.mem), address.get(host.mem)); } EXPORT(int, sceClibMspaceIsHeapEmpty) { return UNIMPLEMENTED(); } EXPORT(Ptr, sceClibMspaceMalloc, Ptr space, uint32_t size) { const std::lock_guard guard(host.kernel.mutex); void *address = mspace_malloc(space.get(host.mem), size); return Ptr(address, host.mem); } EXPORT(int, sceClibMspaceMallocStats) { return UNIMPLEMENTED(); } EXPORT(int, sceClibMspaceMallocStatsFast) { return UNIMPLEMENTED(); } EXPORT(int, sceClibMspaceMallocUsableSize) { return UNIMPLEMENTED(); } EXPORT(Ptr, sceClibMspaceMemalign, Ptr space, uint32_t alignment, uint32_t size) { const std::lock_guard guard(host.kernel.mutex); void *address = mspace_memalign(space.get(host.mem), alignment, size); return Ptr(address, host.mem); } EXPORT(Ptr, sceClibMspaceRealloc, Ptr space, Ptr address, uint32_t size) { const std::lock_guard guard(host.kernel.mutex); void *new_address = mspace_realloc(space.get(host.mem), address.get(host.mem), size); return Ptr(new_address, host.mem); } EXPORT(int, sceClibMspaceReallocalign) { return UNIMPLEMENTED(); } EXPORT(int, sceClibPrintf, const char *fmt, module::vargs args) { std::vector buffer(KB(1)); const ThreadStatePtr thread = lock_and_find(thread_id, host.kernel.threads, host.kernel.mutex); if (!thread) { return SCE_KERNEL_ERROR_UNKNOWN_THREAD_ID; } const int result = utils::snprintf(buffer.data(), buffer.size(), fmt, *(thread->cpu), host.mem, args); if (!result) { return SCE_KERNEL_ERROR_INVALID_ARGUMENT; } LOG_INFO("{}", buffer.data()); return SCE_KERNEL_OK; } EXPORT(int, sceClibSnprintf, char *dst, SceSize dst_max_size, const char *fmt, module::vargs args) { const ThreadStatePtr thread = lock_and_find(thread_id, host.kernel.threads, host.kernel.mutex); if (!thread) { return SCE_KERNEL_ERROR_UNKNOWN_THREAD_ID; } int result = utils::snprintf(dst, dst_max_size, fmt, *(thread->cpu), host.mem, args); if (!result) { return SCE_KERNEL_ERROR_INVALID_ARGUMENT; } return SCE_KERNEL_OK; } EXPORT(int, sceClibSnprintfChk) { return UNIMPLEMENTED(); } EXPORT(int, sceClibStrcatChk) { return UNIMPLEMENTED(); } EXPORT(Ptr, sceClibStrchr, const char *str, int c) { const char *res = strchr(str, c); return Ptr(res, host.mem); } EXPORT(int, sceClibStrcmp, const char *s1, const char *s2) { return strcmp(s1, s2); } EXPORT(int, sceClibStrcpyChk) { return UNIMPLEMENTED(); } EXPORT(Ptr, sceClibStrlcat, char *dst, const char *src, SceSize len) { const char *res = strncat(dst, src, len); return Ptr(res, host.mem); } EXPORT(int, sceClibStrlcatChk) { return UNIMPLEMENTED(); } EXPORT(Ptr, sceClibStrlcpy, char *dst, const char *src, SceSize len) { const char *res = strncpy(dst, src, len); return Ptr(res, host.mem); } EXPORT(int, sceClibStrlcpyChk) { return UNIMPLEMENTED(); } EXPORT(int, sceClibStrncasecmp, const char *s1, const char *s2, SceSize len) { #ifdef WIN32 return _strnicmp(s1, s2, len); #else return strncasecmp(s1, s2, len); #endif } EXPORT(Ptr, sceClibStrncat, char *dst, const char *src, SceSize len) { const char *res = strncat(dst, src, len); return Ptr(res, host.mem); } EXPORT(int, sceClibStrncatChk) { return UNIMPLEMENTED(); } EXPORT(int, sceClibStrncmp, const char *s1, const char *s2, SceSize len) { return strncmp(s1, s2, len); } EXPORT(Ptr, sceClibStrncpy, char *dst, const char *src, SceSize len) { const char *res = strncpy(dst, src, len); return Ptr(res, host.mem); } EXPORT(int, sceClibStrncpyChk) { return UNIMPLEMENTED(); } EXPORT(uint32_t, sceClibStrnlen, const char *s1, SceSize maxlen) { return static_cast(strnlen(s1, maxlen)); } EXPORT(Ptr, sceClibStrrchr, const char *src, int ch) { const char *res = strrchr(src, ch); return Ptr(res, host.mem); } EXPORT(Ptr, sceClibStrstr, const char *s1, const char *s2) { const char *res = strstr(s1, s2); return Ptr(res, host.mem); } EXPORT(int64_t, sceClibStrtoll, const char *str, char **endptr, int base) { return strtoll(str, endptr, base); } EXPORT(int, sceClibTolower, char ch) { return tolower(ch); } EXPORT(int, sceClibToupper, char ch) { return toupper(ch); } EXPORT(int, sceClibVdprintf) { return UNIMPLEMENTED(); } EXPORT(int, sceClibVprintf) { return UNIMPLEMENTED(); } EXPORT(int, sceClibVsnprintf, char *dst, SceSize dst_max_size, const char *fmt, Address list) { const ThreadStatePtr thread = lock_and_find(thread_id, host.kernel.threads, host.kernel.mutex); module::vargs args(list); if (!thread) { return SCE_KERNEL_ERROR_UNKNOWN_THREAD_ID; } int result = utils::snprintf(dst, dst_max_size, fmt, *(thread->cpu), host.mem, args); if (!result) { return SCE_KERNEL_ERROR_INVALID_ARGUMENT; } return SCE_KERNEL_OK; } EXPORT(int, sceClibVsnprintfChk) { return UNIMPLEMENTED(); } EXPORT(int, sceIoChstat) { return UNIMPLEMENTED(); } EXPORT(int, sceIoChstatAsync) { return UNIMPLEMENTED(); } EXPORT(int, sceIoChstatByFd) { return UNIMPLEMENTED(); } EXPORT(int, sceIoClose2) { return UNIMPLEMENTED(); } EXPORT(int, sceIoCompleteMultiple) { return UNIMPLEMENTED(); } EXPORT(int, sceIoDevctl) { return UNIMPLEMENTED(); } EXPORT(int, sceIoDevctlAsync) { return UNIMPLEMENTED(); } EXPORT(int, sceIoDopen, const char *dir) { return CALL_EXPORT(_sceIoDopen, dir); } EXPORT(int, sceIoDread, const SceUID fd, SceIoDirent *dir) { return CALL_EXPORT(_sceIoDread, fd, dir); } EXPORT(int, sceIoGetstat, const char *file, SceIoStat *stat) { return CALL_EXPORT(_sceIoGetstat, file, stat); } EXPORT(int, sceIoGetstatAsync) { return UNIMPLEMENTED(); } EXPORT(int, sceIoGetstatByFd, const SceUID fd, SceIoStat *stat) { return stat_file_by_fd(host.io, fd, stat, host.pref_path, export_name); } EXPORT(int, sceIoIoctl) { return UNIMPLEMENTED(); } EXPORT(int, sceIoIoctlAsync) { return UNIMPLEMENTED(); } EXPORT(SceOff, sceIoLseek, const SceUID fd, const SceOff offset, const SceIoSeekMode whence) { const ThreadStatePtr thread = lock_and_find(thread_id, host.kernel.threads, host.kernel.mutex); Ptr<_sceIoLseekOpt> options = Ptr<_sceIoLseekOpt>(stack_alloc(*thread->cpu, sizeof(_sceIoLseekOpt))); options.get(host.mem)->offset = offset; options.get(host.mem)->whence = whence; SceOff res = CALL_EXPORT(_sceIoLseek, fd, options); stack_free(*thread->cpu, sizeof(_sceIoLseekOpt)); return res; } EXPORT(int, sceIoLseekAsync) { return UNIMPLEMENTED(); } EXPORT(int, sceIoMkdir, const char *dir, const SceMode mode) { return CALL_EXPORT(_sceIoMkdir, dir, mode); } EXPORT(int, sceIoMkdirAsync) { return UNIMPLEMENTED(); } EXPORT(SceUID, sceIoOpen, const char *file, const int flags, const SceMode mode) { if (file == nullptr) { return RET_ERROR(SCE_ERROR_ERRNO_EINVAL); } LOG_INFO("Opening file: {}", file); return open_file(host.io, file, flags, host.pref_path, export_name); } EXPORT(int, sceIoOpenAsync) { return UNIMPLEMENTED(); } EXPORT(SceSSize, sceIoPread, const SceUID fd, void *data, const SceSize size, const SceOff offset) { auto pos = tell_file(host.io, fd, export_name); if (pos < 0) { return pos; } seek_file(fd, offset, SCE_SEEK_SET, host.io, export_name); const auto res = read_file(data, host.io, fd, size, export_name); seek_file(fd, pos, SCE_SEEK_SET, host.io, export_name); return res; } EXPORT(int, sceIoPreadAsync) { return UNIMPLEMENTED(); } EXPORT(SceSSize, sceIoPwrite, const SceUID fd, const void *data, const SceSize size, const SceOff offset) { auto pos = tell_file(host.io, fd, export_name); if (pos < 0) { return pos; } seek_file(fd, offset, SCE_SEEK_SET, host.io, export_name); const auto res = write_file(fd, data, size, host.io, export_name); seek_file(fd, pos, SCE_SEEK_SET, host.io, export_name); return res; } EXPORT(int, sceIoPwriteAsync) { return UNIMPLEMENTED(); } EXPORT(int, sceIoRead2) { return UNIMPLEMENTED(); } EXPORT(int, sceIoRemove, const char *path) { if (path == nullptr) { return RET_ERROR(SCE_ERROR_ERRNO_EINVAL); } return remove_file(host.io, path, host.pref_path, export_name); } EXPORT(int, sceIoRemoveAsync) { return UNIMPLEMENTED(); } EXPORT(int, sceIoRename) { return UNIMPLEMENTED(); } EXPORT(int, sceIoRenameAsync) { return UNIMPLEMENTED(); } EXPORT(int, sceIoRmdir, const char *path) { if (path == nullptr) { return RET_ERROR(SCE_ERROR_ERRNO_EINVAL); } return remove_dir(host.io, path, host.pref_path, export_name); } EXPORT(int, sceIoRmdirAsync) { return UNIMPLEMENTED(); } EXPORT(int, sceIoSync) { return UNIMPLEMENTED(); } EXPORT(int, sceIoSyncAsync) { return UNIMPLEMENTED(); } EXPORT(int, sceIoWrite2) { return UNIMPLEMENTED(); } EXPORT(int, sceKernelAtomicAddAndGet16) { return UNIMPLEMENTED(); } EXPORT(int, sceKernelAtomicAddAndGet32) { return UNIMPLEMENTED(); } EXPORT(int, sceKernelAtomicAddAndGet64) { return UNIMPLEMENTED(); } EXPORT(int, sceKernelAtomicAddAndGet8) { return UNIMPLEMENTED(); } EXPORT(int, sceKernelAtomicAddUnless16) { return UNIMPLEMENTED(); } EXPORT(int, sceKernelAtomicAddUnless32) { return UNIMPLEMENTED(); } EXPORT(int, sceKernelAtomicAddUnless64) { return UNIMPLEMENTED(); } EXPORT(int, sceKernelAtomicAddUnless8) { return UNIMPLEMENTED(); } EXPORT(int, sceKernelAtomicAndAndGet16) { return UNIMPLEMENTED(); } EXPORT(int, sceKernelAtomicAndAndGet32) { return UNIMPLEMENTED(); } EXPORT(int, sceKernelAtomicAndAndGet64) { return UNIMPLEMENTED(); } EXPORT(int, sceKernelAtomicAndAndGet8) { return UNIMPLEMENTED(); } EXPORT(int, sceKernelAtomicClearAndGet16) { return UNIMPLEMENTED(); } EXPORT(int, sceKernelAtomicClearAndGet32) { return UNIMPLEMENTED(); } EXPORT(int, sceKernelAtomicClearAndGet64) { return UNIMPLEMENTED(); } EXPORT(int, sceKernelAtomicClearAndGet8) { return UNIMPLEMENTED(); } EXPORT(int, sceKernelAtomicClearMask16) { return UNIMPLEMENTED(); } EXPORT(int, sceKernelAtomicClearMask32) { return UNIMPLEMENTED(); } EXPORT(int, sceKernelAtomicClearMask64) { return UNIMPLEMENTED(); } EXPORT(int, sceKernelAtomicClearMask8) { return UNIMPLEMENTED(); } EXPORT(int, sceKernelAtomicCompareAndSet16) { return UNIMPLEMENTED(); } EXPORT(int, sceKernelAtomicCompareAndSet32) { return UNIMPLEMENTED(); } EXPORT(int, sceKernelAtomicCompareAndSet64) { return UNIMPLEMENTED(); } EXPORT(int, sceKernelAtomicCompareAndSet8) { return UNIMPLEMENTED(); } EXPORT(int, sceKernelAtomicDecIfPositive16) { return UNIMPLEMENTED(); } EXPORT(int, sceKernelAtomicDecIfPositive32) { return UNIMPLEMENTED(); } EXPORT(int, sceKernelAtomicDecIfPositive64) { return UNIMPLEMENTED(); } EXPORT(int, sceKernelAtomicDecIfPositive8) { return UNIMPLEMENTED(); } EXPORT(int, sceKernelAtomicGetAndAdd16) { return UNIMPLEMENTED(); } EXPORT(int, sceKernelAtomicGetAndAdd32) { return UNIMPLEMENTED(); } EXPORT(int, sceKernelAtomicGetAndAdd64) { return UNIMPLEMENTED(); } EXPORT(int, sceKernelAtomicGetAndAdd8) { return UNIMPLEMENTED(); } EXPORT(int, sceKernelAtomicGetAndAnd16) { return UNIMPLEMENTED(); } EXPORT(int, sceKernelAtomicGetAndAnd32) { return UNIMPLEMENTED(); } EXPORT(int, sceKernelAtomicGetAndAnd64) { return UNIMPLEMENTED(); } EXPORT(int, sceKernelAtomicGetAndAnd8) { return UNIMPLEMENTED(); } EXPORT(int, sceKernelAtomicGetAndClear16) { return UNIMPLEMENTED(); } EXPORT(int, sceKernelAtomicGetAndClear32) { return UNIMPLEMENTED(); } EXPORT(int, sceKernelAtomicGetAndClear64) { return UNIMPLEMENTED(); } EXPORT(int, sceKernelAtomicGetAndClear8) { return UNIMPLEMENTED(); } EXPORT(int, sceKernelAtomicGetAndOr16) { return UNIMPLEMENTED(); } EXPORT(int, sceKernelAtomicGetAndOr32) { return UNIMPLEMENTED(); } EXPORT(int, sceKernelAtomicGetAndOr64) { return UNIMPLEMENTED(); } EXPORT(int, sceKernelAtomicGetAndOr8) { return UNIMPLEMENTED(); } EXPORT(int, sceKernelAtomicGetAndSet16) { return UNIMPLEMENTED(); } EXPORT(int, sceKernelAtomicGetAndSet32) { return UNIMPLEMENTED(); } EXPORT(int, sceKernelAtomicGetAndSet64) { return UNIMPLEMENTED(); } EXPORT(int, sceKernelAtomicGetAndSet8) { return UNIMPLEMENTED(); } EXPORT(int, sceKernelAtomicGetAndSub16) { return UNIMPLEMENTED(); } EXPORT(int, sceKernelAtomicGetAndSub32) { return UNIMPLEMENTED(); } EXPORT(int, sceKernelAtomicGetAndSub64) { return UNIMPLEMENTED(); } EXPORT(int, sceKernelAtomicGetAndSub8) { return UNIMPLEMENTED(); } EXPORT(int, sceKernelAtomicGetAndXor16) { return UNIMPLEMENTED(); } EXPORT(int, sceKernelAtomicGetAndXor32) { return UNIMPLEMENTED(); } EXPORT(int, sceKernelAtomicGetAndXor64) { return UNIMPLEMENTED(); } EXPORT(int, sceKernelAtomicGetAndXor8) { return UNIMPLEMENTED(); } EXPORT(int, sceKernelAtomicOrAndGet16) { return UNIMPLEMENTED(); } EXPORT(int, sceKernelAtomicOrAndGet32) { return UNIMPLEMENTED(); } EXPORT(int, sceKernelAtomicOrAndGet64) { return UNIMPLEMENTED(); } EXPORT(int, sceKernelAtomicOrAndGet8) { return UNIMPLEMENTED(); } EXPORT(int, sceKernelAtomicSet16) { return UNIMPLEMENTED(); } EXPORT(int, sceKernelAtomicSet32) { return UNIMPLEMENTED(); } EXPORT(int, sceKernelAtomicSet64) { return UNIMPLEMENTED(); } EXPORT(int, sceKernelAtomicSet8) { return UNIMPLEMENTED(); } EXPORT(int, sceKernelAtomicSubAndGet16) { return UNIMPLEMENTED(); } EXPORT(int, sceKernelAtomicSubAndGet32) { return UNIMPLEMENTED(); } EXPORT(int, sceKernelAtomicSubAndGet64) { return UNIMPLEMENTED(); } EXPORT(int, sceKernelAtomicSubAndGet8) { return UNIMPLEMENTED(); } EXPORT(int, sceKernelAtomicXorAndGet16) { return UNIMPLEMENTED(); } EXPORT(int, sceKernelAtomicXorAndGet32) { return UNIMPLEMENTED(); } EXPORT(int, sceKernelAtomicXorAndGet64) { return UNIMPLEMENTED(); } EXPORT(int, sceKernelAtomicXorAndGet8) { return UNIMPLEMENTED(); } EXPORT(int, sceKernelBacktrace) { return UNIMPLEMENTED(); } EXPORT(int, sceKernelBacktraceSelf) { return UNIMPLEMENTED(); } EXPORT(int, sceKernelCallModuleExit) { return UNIMPLEMENTED(); } EXPORT(int, sceKernelCallWithChangeStack) { return UNIMPLEMENTED(); } EXPORT(int, sceKernelCancelEvent) { return UNIMPLEMENTED(); } EXPORT(int, sceKernelCancelEventFlag) { return UNIMPLEMENTED(); } EXPORT(int, sceKernelCancelEventWithSetPattern) { return UNIMPLEMENTED(); } EXPORT(int, sceKernelCancelMsgPipe) { return UNIMPLEMENTED(); } EXPORT(int, sceKernelCancelMutex) { return UNIMPLEMENTED(); } EXPORT(int, sceKernelCancelRWLock) { return UNIMPLEMENTED(); } EXPORT(int, sceKernelCancelSema) { return UNIMPLEMENTED(); } EXPORT(int, sceKernelCancelTimer) { return UNIMPLEMENTED(); } EXPORT(int, sceKernelChangeCurrentThreadAttr) { return UNIMPLEMENTED(); } EXPORT(int, sceKernelCheckThreadStack) { return UNIMPLEMENTED(); } EXPORT(int, sceKernelCloseModule) { return UNIMPLEMENTED(); } EXPORT(SceUID, sceKernelCreateCond, const char *pName, SceUInt32 attr, SceUID mutexId, const SceKernelCondOptParam *pOptParam) { return CALL_EXPORT(_sceKernelCreateCond, pName, attr, mutexId, pOptParam); } EXPORT(int, sceKernelCreateEventFlag, const char *name, unsigned int attr, unsigned int flags, SceKernelEventFlagOptParam *opt) { return CALL_EXPORT(_sceKernelCreateEventFlag, name, attr, flags, opt); } EXPORT(int, sceKernelCreateLwCond, Ptr workarea, const char *name, SceUInt attr, Ptr workarea_mutex, Ptr opt_param) { const ThreadStatePtr thread = lock_and_find(thread_id, host.kernel.threads, host.kernel.mutex); Ptr options = Ptr(stack_alloc(*thread->cpu, sizeof(SceKernelCreateLwCond_opt))); options.get(host.mem)->workarea_mutex = workarea_mutex; options.get(host.mem)->opt_param = opt_param; int res = CALL_EXPORT(_sceKernelCreateLwCond, workarea, name, attr, options); stack_free(*thread->cpu, sizeof(SceKernelCreateLwCond_opt)); return res; } EXPORT(int, sceKernelCreateLwMutex, Ptr workarea, const char *name, SceUInt attr, int init_count, Ptr opt_param) { return CALL_EXPORT(_sceKernelCreateLwMutex, workarea, name, attr, init_count, opt_param); } EXPORT(int, sceKernelCreateMsgPipe, const char *name, uint32_t type, uint32_t attr, SceSize bufSize, const SceKernelCreateMsgPipeOpt *opt) { return msgpipe_create(host.kernel, export_name, name, thread_id, attr, bufSize); } EXPORT(int, sceKernelCreateMsgPipeWithLR) { return UNIMPLEMENTED(); } EXPORT(int, sceKernelCreateMutex, const char *name, SceUInt attr, int init_count, SceKernelMutexOptParam *opt_param) { SceUID uid; if (auto error = mutex_create(&uid, host.kernel, host.mem, export_name, name, thread_id, attr, init_count, Ptr(0), SyncWeight::Heavy)) { return error; } return uid; } EXPORT(SceUID, sceKernelCreateRWLock, const char *name, SceUInt32 attr, SceKernelMutexOptParam *opt_param) { return CALL_EXPORT(_sceKernelCreateRWLock, name, attr, opt_param); } EXPORT(SceUID, sceKernelCreateSema, const char *name, SceUInt attr, int initVal, int maxVal, Ptr option) { const ThreadStatePtr thread = lock_and_find(thread_id, host.kernel.threads, host.kernel.mutex); Ptr options = Ptr(stack_alloc(*thread->cpu, sizeof(SceKernelCreateSema_opt))); options.get(host.mem)->maxVal = maxVal; options.get(host.mem)->option = option; int res = CALL_EXPORT(_sceKernelCreateSema, name, attr, initVal, options); stack_free(*thread->cpu, sizeof(SceKernelCreateSema_opt)); return res; } EXPORT(int, sceKernelCreateSema_16XX, const char *name, SceUInt attr, int initVal, int maxVal, Ptr option) { const ThreadStatePtr thread = lock_and_find(thread_id, host.kernel.threads, host.kernel.mutex); Ptr options = Ptr(stack_alloc(*thread->cpu, sizeof(SceKernelCreateSema_opt))); options.get(host.mem)->maxVal = maxVal; options.get(host.mem)->option = option; int res = CALL_EXPORT(_sceKernelCreateSema, name, attr, initVal, options); stack_free(*thread->cpu, sizeof(SceKernelCreateSema_opt)); return res; } EXPORT(SceUID, sceKernelCreateSimpleEvent, const char *pName, SceUInt32 attr, SceUInt32 initPattern, const SceKernelSimpleEventOptParam *pOptParam) { return eventflag_create(host.kernel, export_name, thread_id, pName, attr, initPattern); } EXPORT(SceUID, sceKernelCreateThread, const char *name, SceKernelThreadEntry entry, int init_priority, int stack_size, SceUInt attr, int cpu_affinity_mask, Ptr option) { const ThreadStatePtr thread = lock_and_find(thread_id, host.kernel.threads, host.kernel.mutex); Ptr options = Ptr(stack_alloc(*thread->cpu, sizeof(SceKernelCreateThread_opt))); options.get(host.mem)->stack_size = stack_size; options.get(host.mem)->attr = attr; options.get(host.mem)->cpu_affinity_mask = cpu_affinity_mask; options.get(host.mem)->option = option; SceUID res = CALL_EXPORT(sceKernelCreateThreadForUser, name, entry, init_priority, options.get(host.mem)); stack_free(*thread->cpu, sizeof(SceKernelCreateThread_opt)); return res; } EXPORT(SceUID, sceKernelCreateTimer, const char *name, uint32_t flags, const uint32_t *opt_params) { // opt_params is not used by the firmware but if it is not null, // the firmware checks if its first field (its size) is at most 4. if (opt_params && opt_params[0] > 4) return RET_ERROR(SCE_KERNEL_ERROR_ILLEGAL_SIZE); SceUID handle = host.kernel.get_next_uid(); host.kernel.timers[handle] = std::make_shared(); TimerPtr &timer_info = host.kernel.timers[handle]; timer_info->name = name; if (flags & static_cast(TimerFlags::PRIORITY_THREAD)) timer_info->thread_behaviour = TimerState::ThreadBehaviour::PRIORITY; else timer_info->thread_behaviour = TimerState::ThreadBehaviour::FIFO; if (flags & static_cast(TimerFlags::AUTOMATIC_RESET)) timer_info->reset_behaviour = TimerState::ResetBehaviour::AUTOMATIC; else timer_info->reset_behaviour = TimerState::ResetBehaviour::MANUAL; if (flags & static_cast(TimerFlags::WAKE_ONLY_NOTIFY)) timer_info->notify_behaviour = TimerState::NotifyBehaviour::ONLY_WAKE; else timer_info->notify_behaviour = TimerState::NotifyBehaviour::ALL; if (flags & static_cast(TimerFlags::OPENABLE)) timer_info->openable = true; return handle; } EXPORT(int, sceKernelDeleteLwCond, Ptr workarea) { SceUID lightweight_condition_id = workarea.get(host.mem)->uid; return condvar_delete(host.kernel, export_name, thread_id, lightweight_condition_id, SyncWeight::Light); } EXPORT(int, sceKernelDeleteLwMutex, Ptr workarea) { return CALL_EXPORT(_sceKernelDeleteLwMutex, workarea); } EXPORT(int, sceKernelExitProcess, int res) { // TODO Handle exit code? host.kernel.exit_delete_all_threads(); return SCE_KERNEL_OK; } EXPORT(SceInt32, sceKernelGetCallbackInfo, SceUID callbackId, Ptr pInfo) { return CALL_EXPORT(_sceKernelGetCallbackInfo, callbackId, pInfo.get(host.mem)); } EXPORT(SceInt32, sceKernelGetCondInfo, SceUID condId, Ptr pInfo) { return CALL_EXPORT(_sceKernelGetCondInfo, condId, pInfo); } EXPORT(int, sceKernelGetCurrentThreadVfpException) { return UNIMPLEMENTED(); } EXPORT(SceInt32, sceKernelGetEventFlagInfo, SceUID evfId, Ptr pInfo) { return CALL_EXPORT(_sceKernelGetEventFlagInfo, evfId, pInfo); } EXPORT(int, sceKernelGetEventInfo) { return UNIMPLEMENTED(); } EXPORT(int, sceKernelGetEventPattern) { return UNIMPLEMENTED(); } EXPORT(int, sceKernelGetLwCondInfo) { return UNIMPLEMENTED(); } EXPORT(int, sceKernelGetLwCondInfoById) { return UNIMPLEMENTED(); } EXPORT(int, sceKernelGetLwMutexInfoById, SceUID lightweight_mutex_id, Ptr info) { SceSize size = 0; if (info) { size = info.get(host.mem)->size; } return CALL_EXPORT(_sceKernelGetLwMutexInfoById, lightweight_mutex_id, info, size); } EXPORT(int, sceKernelGetLwMutexInfo, Ptr workarea, Ptr info) { return CALL_EXPORT(sceKernelGetLwMutexInfoById, workarea.get(host.mem)->uid, info); } EXPORT(int, sceKernelGetModuleInfoByAddr, Ptr addr, SceKernelModuleInfo *info) { const auto mod = host.kernel.find_module_by_addr(addr.address()); if (mod) { *info = *mod; return SCE_KERNEL_OK; } return RET_ERROR(SCE_KERNEL_ERROR_MODULEMGR_NOENT); } EXPORT(int, sceKernelGetMsgPipeInfo) { return UNIMPLEMENTED(); } EXPORT(int, sceKernelGetMutexInfo) { return UNIMPLEMENTED(); } EXPORT(int, sceKernelGetOpenPsId) { return UNIMPLEMENTED(); } EXPORT(int, sceKernelGetPMUSERENR) { return UNIMPLEMENTED(); } EXPORT(int, sceKernelGetProcessTime, SceUInt64 *time) { if (time) { *time = rtc_get_ticks(host.kernel.base_tick.tick) - host.kernel.start_tick; } return 0; } EXPORT(SceUInt32, sceKernelGetProcessTimeLow) { return static_cast(rtc_get_ticks(host.kernel.base_tick.tick) - host.kernel.start_tick); } EXPORT(SceUInt64, sceKernelGetProcessTimeWide) { return rtc_get_ticks(host.kernel.base_tick.tick) - host.kernel.start_tick; } EXPORT(int, sceKernelGetRWLockInfo) { return UNIMPLEMENTED(); } EXPORT(SceInt32, sceKernelGetSemaInfo, SceUID semaId, Ptr pInfo) { return CALL_EXPORT(_sceKernelGetSemaInfo, semaId, pInfo); } EXPORT(int, sceKernelGetSystemInfo) { return UNIMPLEMENTED(); } EXPORT(int, sceKernelGetSystemTime) { return UNIMPLEMENTED(); } EXPORT(Ptr>, sceKernelGetTLSAddr, int key) { return host.kernel.get_thread_tls_addr(host.mem, thread_id, key); } EXPORT(int, sceKernelGetThreadContextForVM, SceUID threadId, Ptr pCpuRegisterInfo, Ptr pVfpRegisterInfo) { return CALL_EXPORT(_sceKernelGetThreadContextForVM, threadId, pCpuRegisterInfo, pVfpRegisterInfo); } EXPORT(SceInt32, sceKernelGetThreadCpuAffinityMask2, SceUID thid) { const SceInt32 affinity = CALL_EXPORT(_sceKernelGetThreadCpuAffinityMask, thid); // I guess the difference between this function and sceKernelGetThreadCpuAffinityMask // is that if the result is SCE_KERNEL_THREAD_CPU_AFFINITY_MASK_DEFAULT (=0) // it gets converted into its real affinity (SCE_KERNEL_CPU_MASK_USER_ALL) // either way without this dragon quest builder does not boot if (affinity == SCE_KERNEL_THREAD_CPU_AFFINITY_MASK_DEFAULT) return SCE_KERNEL_CPU_MASK_USER_ALL; return affinity; } EXPORT(SceInt32, sceKernelGetThreadCurrentPriority) { const ThreadStatePtr thread = host.kernel.get_thread(thread_id); if (!thread) return RET_ERROR(SCE_KERNEL_ERROR_UNKNOWN_THREAD_ID); return thread->priority; } EXPORT(int, sceKernelGetThreadEventInfo) { return UNIMPLEMENTED(); } EXPORT(int, sceKernelGetThreadExitStatus, SceUID thid, SceInt32 *pExitStatus) { const ThreadStatePtr thread = lock_and_find(thid ? thid : thread_id, host.kernel.threads, host.kernel.mutex); if (!thread) { return SCE_KERNEL_ERROR_UNKNOWN_THREAD_ID; } if (thread->status != ThreadStatus::dormant) { return SCE_KERNEL_ERROR_NOT_DORMANT; } if (pExitStatus) { *pExitStatus = thread->returned_value; } return 0; } EXPORT(int, sceKernelGetThreadId) { return thread_id; } EXPORT(SceInt32, sceKernelGetThreadInfo, SceUID threadId, Ptr pInfo) { return CALL_EXPORT(_sceKernelGetThreadInfo, threadId, pInfo); } EXPORT(int, sceKernelGetThreadRunStatus) { return UNIMPLEMENTED(); } EXPORT(int, sceKernelGetTimerBase, SceUID timer_handle, SceKernelSysClock *time) { const TimerPtr timer_info = lock_and_find(timer_handle, host.kernel.timers, host.kernel.mutex); if (!timer_info) return SCE_KERNEL_ERROR_UNKNOWN_TIMER_ID; *time = timer_info->time; return 0; } EXPORT(int, sceKernelGetTimerEventRemainingTime) { return UNIMPLEMENTED(); } EXPORT(int, sceKernelGetTimerInfo) { return UNIMPLEMENTED(); } EXPORT(int, sceKernelGetTimerTime, SceUID timer_handle, SceKernelSysClock *time) { const TimerPtr timer_info = lock_and_find(timer_handle, host.kernel.timers, host.kernel.mutex); if (!timer_info) return SCE_KERNEL_ERROR_UNKNOWN_TIMER_ID; *time = get_current_time() - timer_info->time; return 0; } EXPORT(SceUID, sceKernelLoadModule, char *path, int flags, SceKernelLMOption *option) { return CALL_EXPORT(_sceKernelLoadModule, path, flags, option); } EXPORT(SceUID, sceKernelLoadStartModule, const char *moduleFileName, SceSize args, const Ptr argp, SceUInt32 flags, const SceKernelLMOption *pOpt, int *pRes) { return CALL_EXPORT(_sceKernelLoadStartModule, moduleFileName, args, argp, flags, pOpt, pRes); } EXPORT(int, sceKernelLockLwMutex, Ptr workarea, int lock_count, unsigned int *ptimeout) { return CALL_EXPORT(_sceKernelLockLwMutex, workarea, lock_count, ptimeout); } EXPORT(int, sceKernelLockLwMutexCB, Ptr workarea, int lock_count, unsigned int *ptimeout) { STUBBED("no CB"); return CALL_EXPORT(_sceKernelLockLwMutex, workarea, lock_count, ptimeout); } EXPORT(int, sceKernelLockMutex, SceUID mutexid, int lock_count, unsigned int *timeout) { return CALL_EXPORT(_sceKernelLockMutex, mutexid, lock_count, timeout); } EXPORT(int, sceKernelLockMutexCB, SceUID mutexid, int lock_count, unsigned int *timeout) { STUBBED("no CB"); return CALL_EXPORT(_sceKernelLockMutex, mutexid, lock_count, timeout); } EXPORT(SceInt32, sceKernelLockReadRWLock, SceUID lock_id, SceUInt32 *timeout) { return CALL_EXPORT(_sceKernelLockReadRWLock, lock_id, timeout); } EXPORT(SceInt32, sceKernelLockReadRWLockCB, SceUID lock_id, SceUInt32 *timeout) { return CALL_EXPORT(_sceKernelLockReadRWLockCB, lock_id, timeout); } EXPORT(SceInt32, sceKernelLockWriteRWLock, SceUID lock_id, SceUInt32 *timeout) { return CALL_EXPORT(_sceKernelLockWriteRWLock, lock_id, timeout); } EXPORT(SceInt32, sceKernelLockWriteRWLockCB, SceUID lock_id, SceUInt32 *timeout) { return CALL_EXPORT(_sceKernelLockWriteRWLockCB, lock_id, timeout); } EXPORT(int, sceKernelOpenModule) { return UNIMPLEMENTED(); } EXPORT(int, sceKernelPMonThreadGetCounter) { return UNIMPLEMENTED(); } EXPORT(int, sceKernelPollEvent) { return UNIMPLEMENTED(); } EXPORT(int, sceKernelPollEventFlag, SceUID event_id, unsigned int flags, unsigned int wait, unsigned int *outBits) { return CALL_EXPORT(_sceKernelPollEventFlag, event_id, flags, wait, outBits); } EXPORT(int, sceKernelPrintBacktrace) { return UNIMPLEMENTED(); } EXPORT(int, sceKernelPulseEventWithNotifyCallback) { return UNIMPLEMENTED(); } EXPORT(int, sceKernelReceiveMsgPipe, SceUID msgpipe_id, char *recv_buf, SceSize msg_size, SceUInt32 wait_mode, SceSize *result, SceUInt32 *timeout) { const auto ret = msgpipe_recv(host.kernel, export_name, thread_id, msgpipe_id, wait_mode, recv_buf, msg_size, timeout); if (ret < 0) { return ret; } if (result) { *result = ret; } return SCE_KERNEL_OK; } EXPORT(int, sceKernelReceiveMsgPipeCB) { return UNIMPLEMENTED(); } EXPORT(int, sceKernelReceiveMsgPipeVector) { return UNIMPLEMENTED(); } EXPORT(int, sceKernelReceiveMsgPipeVectorCB) { return UNIMPLEMENTED(); } EXPORT(int, sceKernelRegisterThreadEventHandler) { return UNIMPLEMENTED(); } EXPORT(int, sceKernelSendMsgPipe, SceUID msgpipe_id, char *send_buf, SceSize msg_size, SceUInt32 wait_mode, SceSize *result, SceUInt32 *timeout) { const auto ret = msgpipe_send(host.kernel, export_name, thread_id, msgpipe_id, wait_mode, send_buf, msg_size, timeout); if (ret < 0) { return ret; } if (result) { *result = ret; } return SCE_KERNEL_OK; } EXPORT(int, sceKernelSendMsgPipeCB) { return UNIMPLEMENTED(); } EXPORT(int, sceKernelSendMsgPipeVector) { return UNIMPLEMENTED(); } EXPORT(int, sceKernelSendMsgPipeVectorCB) { return UNIMPLEMENTED(); } EXPORT(int, sceKernelSetEventWithNotifyCallback) { return UNIMPLEMENTED(); } EXPORT(int, sceKernelSetThreadContextForVM, SceUID threadId, Ptr pCpuRegisterInfo, Ptr pVfpRegisterInfo) { return CALL_EXPORT(_sceKernelSetThreadContextForVM, threadId, pCpuRegisterInfo, pVfpRegisterInfo); } EXPORT(int, sceKernelSetTimerEvent, SceUID timer_handle, int32_t type, SceKernelSysClock *clock, int32_t repeats) { STUBBED("Type not implemented."); const TimerPtr timer_info = lock_and_find(timer_handle, host.kernel.timers, host.kernel.mutex); if (!timer_info) return SCE_KERNEL_ERROR_UNKNOWN_TIMER_ID; // TODO: Timer values for type. timer_info->repeats = repeats; return SCE_KERNEL_OK; } EXPORT(int, sceKernelSetTimerTime) { return UNIMPLEMENTED(); } EXPORT(int, sceKernelSignalLwCond, Ptr workarea) { SceUID condid = workarea.get(host.mem)->uid; return condvar_signal(host.kernel, export_name, thread_id, condid, Condvar::SignalTarget(Condvar::SignalTarget::Type::Any), SyncWeight::Light); } EXPORT(int, sceKernelSignalLwCondAll, Ptr workarea) { SceUID condid = workarea.get(host.mem)->uid; return condvar_signal(host.kernel, export_name, thread_id, condid, Condvar::SignalTarget(Condvar::SignalTarget::Type::All), SyncWeight::Light); } EXPORT(int, sceKernelSignalLwCondTo, Ptr workarea, SceUID thread_target) { SceUID condid = workarea.get(host.mem)->uid; return condvar_signal(host.kernel, export_name, thread_id, condid, Condvar::SignalTarget(Condvar::SignalTarget::Type::Specific, thread_target), SyncWeight::Light); } EXPORT(int, sceKernelStackChkFail) { return UNIMPLEMENTED(); } EXPORT(int, sceKernelStartModule, SceUID uid, SceSize args, const Ptr argp, SceUInt32 flags, const Ptr pOpt, int *pRes) { return CALL_EXPORT(_sceKernelStartModule, uid, args, argp, flags, pOpt, pRes); } EXPORT(int, sceKernelStartThread, SceUID thid, SceSize arglen, Ptr argp) { return CALL_EXPORT(_sceKernelStartThread, thid, arglen, argp); } EXPORT(int, sceKernelStopModule) { return UNIMPLEMENTED(); } EXPORT(int, sceKernelStopUnloadModule) { return UNIMPLEMENTED(); } EXPORT(int, sceKernelTryLockLwMutex, Ptr workarea, int lock_count) { const auto lwmutexid = workarea.get(host.mem)->uid; return mutex_try_lock(host.kernel, host.mem, export_name, thread_id, lwmutexid, lock_count, SyncWeight::Light); } EXPORT(int, sceKernelTryReceiveMsgPipe, SceUID msgpipe_id, char *recv_buf, SceSize msg_size, SceUInt32 wait_mode, SceSize *result) { const auto ret = msgpipe_recv(host.kernel, export_name, thread_id, msgpipe_id, wait_mode | SCE_KERNEL_MSG_PIPE_MODE_DONT_WAIT, recv_buf, msg_size, 0); if (ret == 0) { return SCE_KERNEL_ERROR_MPP_EMPTY; } if (result) { *result = ret; } return SCE_KERNEL_OK; } EXPORT(int, sceKernelTryReceiveMsgPipeVector) { return UNIMPLEMENTED(); } EXPORT(int, sceKernelTrySendMsgPipe) { return UNIMPLEMENTED(); } EXPORT(int, sceKernelTrySendMsgPipeVector) { return UNIMPLEMENTED(); } EXPORT(int, sceKernelUnloadModule) { return UNIMPLEMENTED(); } EXPORT(int, sceKernelUnlockLwMutex, Ptr workarea, int unlock_count) { const auto lwmutexid = workarea.get(host.mem)->uid; return mutex_unlock(host.kernel, export_name, thread_id, lwmutexid, unlock_count, SyncWeight::Light); } EXPORT(int, sceKernelUnlockLwMutex2, Ptr workarea, int unlock_count) { const auto lwmutexid = workarea.get(host.mem)->uid; return mutex_unlock(host.kernel, export_name, thread_id, lwmutexid, unlock_count, SyncWeight::Light); } EXPORT(int, sceKernelWaitCond, SceUID cond_id, SceUInt32 *timeout) { return condvar_wait(host.kernel, host.mem, export_name, thread_id, cond_id, timeout, SyncWeight::Heavy); } EXPORT(int, sceKernelWaitCondCB, SceUID cond_id, SceUInt32 *timeout) { STUBBED("no CB"); return condvar_wait(host.kernel, host.mem, export_name, thread_id, cond_id, timeout, SyncWeight::Heavy); } EXPORT(int, sceKernelWaitEvent) { return UNIMPLEMENTED(); } EXPORT(int, sceKernelWaitEventCB) { return UNIMPLEMENTED(); } EXPORT(SceInt32, sceKernelWaitEventFlag, SceUID evfId, SceUInt32 bitPattern, SceUInt32 waitMode, SceUInt32 *pResultPat, SceUInt32 *pTimeout) { return eventflag_wait(host.kernel, export_name, thread_id, evfId, bitPattern, waitMode, pResultPat, pTimeout); } EXPORT(SceInt32, sceKernelWaitEventFlagCB, SceUID evfId, SceUInt32 bitPattern, SceUInt32 waitMode, SceUInt32 *pResultPat, SceUInt32 *pTimeout) { STUBBED("no CB"); return eventflag_wait(host.kernel, export_name, thread_id, evfId, bitPattern, waitMode, pResultPat, pTimeout); } EXPORT(int, sceKernelWaitException) { return UNIMPLEMENTED(); } EXPORT(int, sceKernelWaitExceptionCB) { return UNIMPLEMENTED(); } EXPORT(int, sceKernelWaitLwCond, Ptr workarea, SceUInt32 *timeout) { const auto cond_id = workarea.get(host.mem)->uid; return condvar_wait(host.kernel, host.mem, export_name, thread_id, cond_id, timeout, SyncWeight::Light); } EXPORT(int, sceKernelWaitLwCondCB, Ptr workarea, SceUInt32 *timeout) { STUBBED("no CB"); const auto cond_id = workarea.get(host.mem)->uid; return condvar_wait(host.kernel, host.mem, export_name, thread_id, cond_id, timeout, SyncWeight::Light); } EXPORT(int, sceKernelWaitMultipleEvents) { return UNIMPLEMENTED(); } EXPORT(int, sceKernelWaitMultipleEventsCB) { return UNIMPLEMENTED(); } EXPORT(SceInt32, sceKernelWaitSema, SceUID semaId, SceInt32 needCount, SceUInt32 *pTimeout) { return CALL_EXPORT(_sceKernelWaitSema, semaId, needCount, pTimeout); } EXPORT(SceInt32, sceKernelWaitSemaCB, SceUID semaId, SceInt32 needCount, SceUInt32 *pTimeout) { return CALL_EXPORT(_sceKernelWaitSemaCB, semaId, needCount, pTimeout); } EXPORT(int, sceKernelWaitSignal, uint32_t unknown, uint32_t delay, uint32_t timeout) { return CALL_EXPORT(_sceKernelWaitSignal, unknown, delay, timeout); } EXPORT(int, sceKernelWaitSignalCB) { return UNIMPLEMENTED(); } EXPORT(int, sceKernelWaitThreadEnd, SceUID thid, int *stat, SceUInt *timeout) { return CALL_EXPORT(_sceKernelWaitThreadEnd, thid, stat, timeout); } EXPORT(int, sceKernelWaitThreadEndCB, SceUID thid, int *stat, SceUInt *timeout) { return CALL_EXPORT(_sceKernelWaitThreadEndCB, thid, stat, timeout); } EXPORT(int, sceSblACMgrIsGameProgram) { return UNIMPLEMENTED(); } EXPORT(int, sceSblGcAuthMgrAdhocBB160Auth1) { return UNIMPLEMENTED(); } EXPORT(int, sceSblGcAuthMgrAdhocBB160Auth2) { return UNIMPLEMENTED(); } EXPORT(int, sceSblGcAuthMgrAdhocBB160Auth3) { return UNIMPLEMENTED(); } EXPORT(int, sceSblGcAuthMgrAdhocBB160Auth4) { return UNIMPLEMENTED(); } EXPORT(int, sceSblGcAuthMgrAdhocBB160Auth5) { return UNIMPLEMENTED(); } EXPORT(int, sceSblGcAuthMgrAdhocBB160BroadCastDecrypt) { return UNIMPLEMENTED(); } EXPORT(int, sceSblGcAuthMgrAdhocBB160BroadCastEncrypt) { return UNIMPLEMENTED(); } EXPORT(int, sceSblGcAuthMgrAdhocBB160GetKeys) { return UNIMPLEMENTED(); } EXPORT(int, sceSblGcAuthMgrAdhocBB160Init) { return UNIMPLEMENTED(); } EXPORT(int, sceSblGcAuthMgrAdhocBB160Shutdown) { return UNIMPLEMENTED(); } EXPORT(int, sceSblGcAuthMgrAdhocBB160UniCastDecrypt) { return UNIMPLEMENTED(); } EXPORT(int, sceSblGcAuthMgrAdhocBB160UniCastEncrypt) { return UNIMPLEMENTED(); } EXPORT(int, sceSblGcAuthMgrAdhocBB224Auth1) { return UNIMPLEMENTED(); } EXPORT(int, sceSblGcAuthMgrAdhocBB224Auth2) { return UNIMPLEMENTED(); } EXPORT(int, sceSblGcAuthMgrAdhocBB224Auth3) { return UNIMPLEMENTED(); } EXPORT(int, sceSblGcAuthMgrAdhocBB224Auth4) { return UNIMPLEMENTED(); } EXPORT(int, sceSblGcAuthMgrAdhocBB224Auth5) { return UNIMPLEMENTED(); } EXPORT(int, sceSblGcAuthMgrAdhocBB224GetKeys) { return UNIMPLEMENTED(); } EXPORT(int, sceSblGcAuthMgrAdhocBB224Init) { return UNIMPLEMENTED(); } EXPORT(int, sceSblGcAuthMgrAdhocBB224Shutdown) { return UNIMPLEMENTED(); } EXPORT(int, sceSblGcAuthMgrGetMediaIdType01) { return UNIMPLEMENTED(); } EXPORT(int, sceSblGcAuthMgrMsSaveBBCipherFinal) { return UNIMPLEMENTED(); } EXPORT(int, sceSblGcAuthMgrMsSaveBBCipherInit) { return UNIMPLEMENTED(); } EXPORT(int, sceSblGcAuthMgrMsSaveBBCipherUpdate) { return UNIMPLEMENTED(); } EXPORT(int, sceSblGcAuthMgrMsSaveBBMacFinal) { return UNIMPLEMENTED(); } EXPORT(int, sceSblGcAuthMgrMsSaveBBMacInit) { return UNIMPLEMENTED(); } EXPORT(int, sceSblGcAuthMgrMsSaveBBMacUpdate) { return UNIMPLEMENTED(); } EXPORT(int, sceSblGcAuthMgrPcactActivation) { return UNIMPLEMENTED(); } EXPORT(int, sceSblGcAuthMgrPcactGetChallenge) { return UNIMPLEMENTED(); } EXPORT(int, sceSblGcAuthMgrPkgVry) { return UNIMPLEMENTED(); } EXPORT(int, sceSblGcAuthMgrPsmactCreateC1) { return UNIMPLEMENTED(); } EXPORT(int, sceSblGcAuthMgrPsmactVerifyR1) { return UNIMPLEMENTED(); } EXPORT(int, sceSblGcAuthMgrSclkGetData1) { return UNIMPLEMENTED(); } EXPORT(int, sceSblGcAuthMgrSclkSetData2) { return UNIMPLEMENTED(); } BRIDGE_IMPL(__sce_aeabi_idiv0) BRIDGE_IMPL(__sce_aeabi_ldiv0) BRIDGE_IMPL(__stack_chk_fail) BRIDGE_IMPL(_sceKernelCreateLwMutex) BRIDGE_IMPL(sceClibAbort) BRIDGE_IMPL(sceClibDprintf) BRIDGE_IMPL(sceClibLookCtypeTable) BRIDGE_IMPL(sceClibMemchr) BRIDGE_IMPL(sceClibMemcmp) BRIDGE_IMPL(sceClibMemcmpConstTime) BRIDGE_IMPL(sceClibMemcpy) BRIDGE_IMPL(sceClibMemcpyChk) BRIDGE_IMPL(sceClibMemcpy_safe) BRIDGE_IMPL(sceClibMemmove) BRIDGE_IMPL(sceClibMemmoveChk) BRIDGE_IMPL(sceClibMemset) BRIDGE_IMPL(sceClibMemsetChk) BRIDGE_IMPL(sceClibMspaceCalloc) BRIDGE_IMPL(sceClibMspaceCreate) BRIDGE_IMPL(sceClibMspaceDestroy) BRIDGE_IMPL(sceClibMspaceFree) BRIDGE_IMPL(sceClibMspaceIsHeapEmpty) BRIDGE_IMPL(sceClibMspaceMalloc) BRIDGE_IMPL(sceClibMspaceMallocStats) BRIDGE_IMPL(sceClibMspaceMallocStatsFast) BRIDGE_IMPL(sceClibMspaceMallocUsableSize) BRIDGE_IMPL(sceClibMspaceMemalign) BRIDGE_IMPL(sceClibMspaceRealloc) BRIDGE_IMPL(sceClibMspaceReallocalign) BRIDGE_IMPL(sceClibPrintf) BRIDGE_IMPL(sceClibSnprintf) BRIDGE_IMPL(sceClibSnprintfChk) BRIDGE_IMPL(sceClibStrcatChk) BRIDGE_IMPL(sceClibStrchr) BRIDGE_IMPL(sceClibStrcmp) BRIDGE_IMPL(sceClibStrcpyChk) BRIDGE_IMPL(sceClibStrlcat) BRIDGE_IMPL(sceClibStrlcatChk) BRIDGE_IMPL(sceClibStrlcpy) BRIDGE_IMPL(sceClibStrlcpyChk) BRIDGE_IMPL(sceClibStrncasecmp) BRIDGE_IMPL(sceClibStrncat) BRIDGE_IMPL(sceClibStrncatChk) BRIDGE_IMPL(sceClibStrncmp) BRIDGE_IMPL(sceClibStrncpy) BRIDGE_IMPL(sceClibStrncpyChk) BRIDGE_IMPL(sceClibStrnlen) BRIDGE_IMPL(sceClibStrrchr) BRIDGE_IMPL(sceClibStrstr) BRIDGE_IMPL(sceClibStrtoll) BRIDGE_IMPL(sceClibTolower) BRIDGE_IMPL(sceClibToupper) BRIDGE_IMPL(sceClibVdprintf) BRIDGE_IMPL(sceClibVprintf) BRIDGE_IMPL(sceClibVsnprintf) BRIDGE_IMPL(sceClibVsnprintfChk) BRIDGE_IMPL(sceIoChstat) BRIDGE_IMPL(sceIoChstatAsync) BRIDGE_IMPL(sceIoChstatByFd) BRIDGE_IMPL(sceIoClose2) BRIDGE_IMPL(sceIoCompleteMultiple) BRIDGE_IMPL(sceIoDevctl) BRIDGE_IMPL(sceIoDevctlAsync) BRIDGE_IMPL(sceIoDopen) BRIDGE_IMPL(sceIoDread) BRIDGE_IMPL(sceIoGetstat) BRIDGE_IMPL(sceIoGetstatAsync) BRIDGE_IMPL(sceIoGetstatByFd) BRIDGE_IMPL(sceIoIoctl) BRIDGE_IMPL(sceIoIoctlAsync) BRIDGE_IMPL(sceIoLseek) BRIDGE_IMPL(sceIoLseekAsync) BRIDGE_IMPL(sceIoMkdir) BRIDGE_IMPL(sceIoMkdirAsync) BRIDGE_IMPL(sceIoOpen) BRIDGE_IMPL(sceIoOpenAsync) BRIDGE_IMPL(sceIoPread) BRIDGE_IMPL(sceIoPreadAsync) BRIDGE_IMPL(sceIoPwrite) BRIDGE_IMPL(sceIoPwriteAsync) BRIDGE_IMPL(sceIoRead2) BRIDGE_IMPL(sceIoRemove) BRIDGE_IMPL(sceIoRemoveAsync) BRIDGE_IMPL(sceIoRename) BRIDGE_IMPL(sceIoRenameAsync) BRIDGE_IMPL(sceIoRmdir) BRIDGE_IMPL(sceIoRmdirAsync) BRIDGE_IMPL(sceIoSync) BRIDGE_IMPL(sceIoSyncAsync) BRIDGE_IMPL(sceIoWrite2) BRIDGE_IMPL(sceKernelAtomicAddAndGet16) BRIDGE_IMPL(sceKernelAtomicAddAndGet32) BRIDGE_IMPL(sceKernelAtomicAddAndGet64) BRIDGE_IMPL(sceKernelAtomicAddAndGet8) BRIDGE_IMPL(sceKernelAtomicAddUnless16) BRIDGE_IMPL(sceKernelAtomicAddUnless32) BRIDGE_IMPL(sceKernelAtomicAddUnless64) BRIDGE_IMPL(sceKernelAtomicAddUnless8) BRIDGE_IMPL(sceKernelAtomicAndAndGet16) BRIDGE_IMPL(sceKernelAtomicAndAndGet32) BRIDGE_IMPL(sceKernelAtomicAndAndGet64) BRIDGE_IMPL(sceKernelAtomicAndAndGet8) BRIDGE_IMPL(sceKernelAtomicClearAndGet16) BRIDGE_IMPL(sceKernelAtomicClearAndGet32) BRIDGE_IMPL(sceKernelAtomicClearAndGet64) BRIDGE_IMPL(sceKernelAtomicClearAndGet8) BRIDGE_IMPL(sceKernelAtomicClearMask16) BRIDGE_IMPL(sceKernelAtomicClearMask32) BRIDGE_IMPL(sceKernelAtomicClearMask64) BRIDGE_IMPL(sceKernelAtomicClearMask8) BRIDGE_IMPL(sceKernelAtomicCompareAndSet16) BRIDGE_IMPL(sceKernelAtomicCompareAndSet32) BRIDGE_IMPL(sceKernelAtomicCompareAndSet64) BRIDGE_IMPL(sceKernelAtomicCompareAndSet8) BRIDGE_IMPL(sceKernelAtomicDecIfPositive16) BRIDGE_IMPL(sceKernelAtomicDecIfPositive32) BRIDGE_IMPL(sceKernelAtomicDecIfPositive64) BRIDGE_IMPL(sceKernelAtomicDecIfPositive8) BRIDGE_IMPL(sceKernelAtomicGetAndAdd16) BRIDGE_IMPL(sceKernelAtomicGetAndAdd32) BRIDGE_IMPL(sceKernelAtomicGetAndAdd64) BRIDGE_IMPL(sceKernelAtomicGetAndAdd8) BRIDGE_IMPL(sceKernelAtomicGetAndAnd16) BRIDGE_IMPL(sceKernelAtomicGetAndAnd32) BRIDGE_IMPL(sceKernelAtomicGetAndAnd64) BRIDGE_IMPL(sceKernelAtomicGetAndAnd8) BRIDGE_IMPL(sceKernelAtomicGetAndClear16) BRIDGE_IMPL(sceKernelAtomicGetAndClear32) BRIDGE_IMPL(sceKernelAtomicGetAndClear64) BRIDGE_IMPL(sceKernelAtomicGetAndClear8) BRIDGE_IMPL(sceKernelAtomicGetAndOr16) BRIDGE_IMPL(sceKernelAtomicGetAndOr32) BRIDGE_IMPL(sceKernelAtomicGetAndOr64) BRIDGE_IMPL(sceKernelAtomicGetAndOr8) BRIDGE_IMPL(sceKernelAtomicGetAndSet16) BRIDGE_IMPL(sceKernelAtomicGetAndSet32) BRIDGE_IMPL(sceKernelAtomicGetAndSet64) BRIDGE_IMPL(sceKernelAtomicGetAndSet8) BRIDGE_IMPL(sceKernelAtomicGetAndSub16) BRIDGE_IMPL(sceKernelAtomicGetAndSub32) BRIDGE_IMPL(sceKernelAtomicGetAndSub64) BRIDGE_IMPL(sceKernelAtomicGetAndSub8) BRIDGE_IMPL(sceKernelAtomicGetAndXor16) BRIDGE_IMPL(sceKernelAtomicGetAndXor32) BRIDGE_IMPL(sceKernelAtomicGetAndXor64) BRIDGE_IMPL(sceKernelAtomicGetAndXor8) BRIDGE_IMPL(sceKernelAtomicOrAndGet16) BRIDGE_IMPL(sceKernelAtomicOrAndGet32) BRIDGE_IMPL(sceKernelAtomicOrAndGet64) BRIDGE_IMPL(sceKernelAtomicOrAndGet8) BRIDGE_IMPL(sceKernelAtomicSet16) BRIDGE_IMPL(sceKernelAtomicSet32) BRIDGE_IMPL(sceKernelAtomicSet64) BRIDGE_IMPL(sceKernelAtomicSet8) BRIDGE_IMPL(sceKernelAtomicSubAndGet16) BRIDGE_IMPL(sceKernelAtomicSubAndGet32) BRIDGE_IMPL(sceKernelAtomicSubAndGet64) BRIDGE_IMPL(sceKernelAtomicSubAndGet8) BRIDGE_IMPL(sceKernelAtomicXorAndGet16) BRIDGE_IMPL(sceKernelAtomicXorAndGet32) BRIDGE_IMPL(sceKernelAtomicXorAndGet64) BRIDGE_IMPL(sceKernelAtomicXorAndGet8) BRIDGE_IMPL(sceKernelBacktrace) BRIDGE_IMPL(sceKernelBacktraceSelf) BRIDGE_IMPL(sceKernelCallModuleExit) BRIDGE_IMPL(sceKernelCallWithChangeStack) BRIDGE_IMPL(sceKernelCancelEvent) BRIDGE_IMPL(sceKernelCancelEventFlag) BRIDGE_IMPL(sceKernelCancelEventWithSetPattern) BRIDGE_IMPL(sceKernelCancelMsgPipe) BRIDGE_IMPL(sceKernelCancelMutex) BRIDGE_IMPL(sceKernelCancelRWLock) BRIDGE_IMPL(sceKernelCancelSema) BRIDGE_IMPL(sceKernelCancelTimer) BRIDGE_IMPL(sceKernelChangeCurrentThreadAttr) BRIDGE_IMPL(sceKernelCheckThreadStack) BRIDGE_IMPL(sceKernelCloseModule) BRIDGE_IMPL(sceKernelCreateCond) BRIDGE_IMPL(sceKernelCreateEventFlag) BRIDGE_IMPL(sceKernelCreateLwCond) BRIDGE_IMPL(sceKernelCreateLwMutex) BRIDGE_IMPL(sceKernelCreateMsgPipe) BRIDGE_IMPL(sceKernelCreateMsgPipeWithLR) BRIDGE_IMPL(sceKernelCreateMutex) BRIDGE_IMPL(sceKernelCreateRWLock) BRIDGE_IMPL(sceKernelCreateSema) BRIDGE_IMPL(sceKernelCreateSema_16XX) BRIDGE_IMPL(sceKernelCreateSimpleEvent) BRIDGE_IMPL(sceKernelCreateThread) BRIDGE_IMPL(sceKernelCreateTimer) BRIDGE_IMPL(sceKernelDeleteLwCond) BRIDGE_IMPL(sceKernelDeleteLwMutex) BRIDGE_IMPL(sceKernelExitProcess) BRIDGE_IMPL(sceKernelGetCallbackInfo) BRIDGE_IMPL(sceKernelGetCondInfo) BRIDGE_IMPL(sceKernelGetCurrentThreadVfpException) BRIDGE_IMPL(sceKernelGetEventFlagInfo) BRIDGE_IMPL(sceKernelGetEventInfo) BRIDGE_IMPL(sceKernelGetEventPattern) BRIDGE_IMPL(sceKernelGetLwCondInfo) BRIDGE_IMPL(sceKernelGetLwCondInfoById) BRIDGE_IMPL(sceKernelGetLwMutexInfo) BRIDGE_IMPL(sceKernelGetLwMutexInfoById) BRIDGE_IMPL(sceKernelGetModuleInfoByAddr) BRIDGE_IMPL(sceKernelGetMsgPipeInfo) BRIDGE_IMPL(sceKernelGetMutexInfo) BRIDGE_IMPL(sceKernelGetOpenPsId) BRIDGE_IMPL(sceKernelGetPMUSERENR) BRIDGE_IMPL(sceKernelGetProcessTime) BRIDGE_IMPL(sceKernelGetProcessTimeLow) BRIDGE_IMPL(sceKernelGetProcessTimeWide) BRIDGE_IMPL(sceKernelGetRWLockInfo) BRIDGE_IMPL(sceKernelGetSemaInfo) BRIDGE_IMPL(sceKernelGetSystemInfo) BRIDGE_IMPL(sceKernelGetSystemTime) BRIDGE_IMPL(sceKernelGetTLSAddr) BRIDGE_IMPL(sceKernelGetThreadContextForVM) BRIDGE_IMPL(sceKernelGetThreadCpuAffinityMask2) BRIDGE_IMPL(sceKernelGetThreadCurrentPriority) BRIDGE_IMPL(sceKernelGetThreadEventInfo) BRIDGE_IMPL(sceKernelGetThreadExitStatus) BRIDGE_IMPL(sceKernelGetThreadId) BRIDGE_IMPL(sceKernelGetThreadInfo) BRIDGE_IMPL(sceKernelGetThreadRunStatus) BRIDGE_IMPL(sceKernelGetTimerBase) BRIDGE_IMPL(sceKernelGetTimerEventRemainingTime) BRIDGE_IMPL(sceKernelGetTimerInfo) BRIDGE_IMPL(sceKernelGetTimerTime) BRIDGE_IMPL(sceKernelLoadModule) BRIDGE_IMPL(sceKernelLoadStartModule) BRIDGE_IMPL(sceKernelLockLwMutex) BRIDGE_IMPL(sceKernelLockLwMutexCB) BRIDGE_IMPL(sceKernelLockMutex) BRIDGE_IMPL(sceKernelLockMutexCB) BRIDGE_IMPL(sceKernelLockReadRWLock) BRIDGE_IMPL(sceKernelLockReadRWLockCB) BRIDGE_IMPL(sceKernelLockWriteRWLock) BRIDGE_IMPL(sceKernelLockWriteRWLockCB) BRIDGE_IMPL(sceKernelOpenModule) BRIDGE_IMPL(sceKernelPMonThreadGetCounter) BRIDGE_IMPL(sceKernelPollEvent) BRIDGE_IMPL(sceKernelPollEventFlag) BRIDGE_IMPL(sceKernelPrintBacktrace) BRIDGE_IMPL(sceKernelPulseEventWithNotifyCallback) BRIDGE_IMPL(sceKernelReceiveMsgPipe) BRIDGE_IMPL(sceKernelReceiveMsgPipeCB) BRIDGE_IMPL(sceKernelReceiveMsgPipeVector) BRIDGE_IMPL(sceKernelReceiveMsgPipeVectorCB) BRIDGE_IMPL(sceKernelRegisterThreadEventHandler) BRIDGE_IMPL(sceKernelSendMsgPipe) BRIDGE_IMPL(sceKernelSendMsgPipeCB) BRIDGE_IMPL(sceKernelSendMsgPipeVector) BRIDGE_IMPL(sceKernelSendMsgPipeVectorCB) BRIDGE_IMPL(sceKernelSetEventWithNotifyCallback) BRIDGE_IMPL(sceKernelSetThreadContextForVM) BRIDGE_IMPL(sceKernelSetTimerEvent) BRIDGE_IMPL(sceKernelSetTimerTime) BRIDGE_IMPL(sceKernelSignalLwCond) BRIDGE_IMPL(sceKernelSignalLwCondAll) BRIDGE_IMPL(sceKernelSignalLwCondTo) BRIDGE_IMPL(sceKernelStackChkFail) BRIDGE_IMPL(sceKernelStartModule) BRIDGE_IMPL(sceKernelStartThread) BRIDGE_IMPL(sceKernelStopModule) BRIDGE_IMPL(sceKernelStopUnloadModule) BRIDGE_IMPL(sceKernelTryLockLwMutex) BRIDGE_IMPL(sceKernelTryReceiveMsgPipe) BRIDGE_IMPL(sceKernelTryReceiveMsgPipeVector) BRIDGE_IMPL(sceKernelTrySendMsgPipe) BRIDGE_IMPL(sceKernelTrySendMsgPipeVector) BRIDGE_IMPL(sceKernelUnloadModule) BRIDGE_IMPL(sceKernelUnlockLwMutex) BRIDGE_IMPL(sceKernelUnlockLwMutex2) BRIDGE_IMPL(sceKernelWaitCond) BRIDGE_IMPL(sceKernelWaitCondCB) BRIDGE_IMPL(sceKernelWaitEvent) BRIDGE_IMPL(sceKernelWaitEventCB) BRIDGE_IMPL(sceKernelWaitEventFlag) BRIDGE_IMPL(sceKernelWaitEventFlagCB) BRIDGE_IMPL(sceKernelWaitException) BRIDGE_IMPL(sceKernelWaitExceptionCB) BRIDGE_IMPL(sceKernelWaitLwCond) BRIDGE_IMPL(sceKernelWaitLwCondCB) BRIDGE_IMPL(sceKernelWaitMultipleEvents) BRIDGE_IMPL(sceKernelWaitMultipleEventsCB) BRIDGE_IMPL(sceKernelWaitSema) BRIDGE_IMPL(sceKernelWaitSemaCB) BRIDGE_IMPL(sceKernelWaitSignal) BRIDGE_IMPL(sceKernelWaitSignalCB) BRIDGE_IMPL(sceKernelWaitThreadEnd) BRIDGE_IMPL(sceKernelWaitThreadEndCB) BRIDGE_IMPL(sceSblACMgrIsGameProgram) BRIDGE_IMPL(sceSblGcAuthMgrAdhocBB160Auth1) BRIDGE_IMPL(sceSblGcAuthMgrAdhocBB160Auth2) BRIDGE_IMPL(sceSblGcAuthMgrAdhocBB160Auth3) BRIDGE_IMPL(sceSblGcAuthMgrAdhocBB160Auth4) BRIDGE_IMPL(sceSblGcAuthMgrAdhocBB160Auth5) BRIDGE_IMPL(sceSblGcAuthMgrAdhocBB160BroadCastDecrypt) BRIDGE_IMPL(sceSblGcAuthMgrAdhocBB160BroadCastEncrypt) BRIDGE_IMPL(sceSblGcAuthMgrAdhocBB160GetKeys) BRIDGE_IMPL(sceSblGcAuthMgrAdhocBB160Init) BRIDGE_IMPL(sceSblGcAuthMgrAdhocBB160Shutdown) BRIDGE_IMPL(sceSblGcAuthMgrAdhocBB160UniCastDecrypt) BRIDGE_IMPL(sceSblGcAuthMgrAdhocBB160UniCastEncrypt) BRIDGE_IMPL(sceSblGcAuthMgrAdhocBB224Auth1) BRIDGE_IMPL(sceSblGcAuthMgrAdhocBB224Auth2) BRIDGE_IMPL(sceSblGcAuthMgrAdhocBB224Auth3) BRIDGE_IMPL(sceSblGcAuthMgrAdhocBB224Auth4) BRIDGE_IMPL(sceSblGcAuthMgrAdhocBB224Auth5) BRIDGE_IMPL(sceSblGcAuthMgrAdhocBB224GetKeys) BRIDGE_IMPL(sceSblGcAuthMgrAdhocBB224Init) BRIDGE_IMPL(sceSblGcAuthMgrAdhocBB224Shutdown) BRIDGE_IMPL(sceSblGcAuthMgrGetMediaIdType01) BRIDGE_IMPL(sceSblGcAuthMgrMsSaveBBCipherFinal) BRIDGE_IMPL(sceSblGcAuthMgrMsSaveBBCipherInit) BRIDGE_IMPL(sceSblGcAuthMgrMsSaveBBCipherUpdate) BRIDGE_IMPL(sceSblGcAuthMgrMsSaveBBMacFinal) BRIDGE_IMPL(sceSblGcAuthMgrMsSaveBBMacInit) BRIDGE_IMPL(sceSblGcAuthMgrMsSaveBBMacUpdate) BRIDGE_IMPL(sceSblGcAuthMgrPcactActivation) BRIDGE_IMPL(sceSblGcAuthMgrPcactGetChallenge) BRIDGE_IMPL(sceSblGcAuthMgrPkgVry) BRIDGE_IMPL(sceSblGcAuthMgrPsmactCreateC1) BRIDGE_IMPL(sceSblGcAuthMgrPsmactVerifyR1) BRIDGE_IMPL(sceSblGcAuthMgrSclkGetData1) BRIDGE_IMPL(sceSblGcAuthMgrSclkSetData2)