Vita3K/vita3k/modules/SceLibKernel/SceLibKernel.cpp

1987 lines
57 KiB
C++

// 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 <modules/module_parent.h>
#include <v3kprintf.h>
#include <../SceIofilemgr/SceIofilemgr.h>
#include <../SceKernelModulemgr/SceModulemgr.h>
#include <../SceKernelThreadMgr/SceThreadmgr.h>
#include <cpu/functions.h>
#include <dlmalloc.h>
#include <host/functions.h>
#include <io/functions.h>
#include <kernel/load_self.h>
#include <kernel/sync_primitives.h>
#include <kernel/types.h>
#include <rtc/rtc.h>
#include <util/lock_and_find.h>
#include <util/log.h>
#include <algorithm>
#include <cstdlib>
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::microseconds>(
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<SceKernelLwMutexWork> workarea, const char *name, unsigned int attr, int init_count, Ptr<SceKernelLwMutexOptParam> opt_param) {
const ThreadStatePtr thread = lock_and_find(thread_id, host.kernel.threads, host.kernel.mutex);
Ptr<SceKernelCreateLwMutex_opt> options = Ptr<SceKernelCreateLwMutex_opt>(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<void>, sceClibMemcpy, Ptr<void> dst, const void *src, SceSize len) {
memcpy(dst.get(host.mem), src, len);
return dst;
}
EXPORT(int, sceClibMemcpyChk) {
return UNIMPLEMENTED();
}
EXPORT(Ptr<void>, sceClibMemcpy_safe, Ptr<void> dst, const void *src, SceSize len) {
memcpy(dst.get(host.mem), src, len);
return dst;
}
EXPORT(Ptr<void>, sceClibMemmove, Ptr<void> dst, const void *src, SceSize len) {
memmove(dst.get(host.mem), src, len);
return dst;
}
EXPORT(int, sceClibMemmoveChk) {
return UNIMPLEMENTED();
}
EXPORT(Ptr<void>, sceClibMemset, Ptr<void> dst, int ch, SceSize len) {
memset(dst.get(host.mem), ch, len);
return dst;
}
EXPORT(int, sceClibMemsetChk) {
return UNIMPLEMENTED();
}
EXPORT(Ptr<void>, sceClibMspaceCalloc, Ptr<void> space, uint32_t elements, uint32_t size) {
const std::lock_guard<std::mutex> guard(host.kernel.mutex);
void *address = mspace_calloc(space.get(host.mem), elements, size);
return Ptr<void>(address, host.mem);
}
EXPORT(Ptr<void>, sceClibMspaceCreate, Ptr<void> base, uint32_t capacity) {
const std::lock_guard<std::mutex> guard(host.kernel.mutex);
mspace space = create_mspace_with_base(base.get(host.mem), capacity, 0);
return Ptr<void>(space, host.mem);
}
EXPORT(uint32_t, sceClibMspaceDestroy, Ptr<void> space) {
const std::lock_guard<std::mutex> guard(host.kernel.mutex);
return destroy_mspace(space.get(host.mem));
}
EXPORT(void, sceClibMspaceFree, Ptr<void> space, Ptr<void> address) {
const std::lock_guard<std::mutex> guard(host.kernel.mutex);
mspace_free(space.get(host.mem), address.get(host.mem));
}
EXPORT(int, sceClibMspaceIsHeapEmpty) {
return UNIMPLEMENTED();
}
EXPORT(Ptr<void>, sceClibMspaceMalloc, Ptr<void> space, uint32_t size) {
const std::lock_guard<std::mutex> guard(host.kernel.mutex);
void *address = mspace_malloc(space.get(host.mem), size);
return Ptr<void>(address, host.mem);
}
EXPORT(int, sceClibMspaceMallocStats) {
return UNIMPLEMENTED();
}
EXPORT(int, sceClibMspaceMallocStatsFast) {
return UNIMPLEMENTED();
}
EXPORT(int, sceClibMspaceMallocUsableSize) {
return UNIMPLEMENTED();
}
EXPORT(Ptr<void>, sceClibMspaceMemalign, Ptr<void> space, uint32_t alignment, uint32_t size) {
const std::lock_guard<std::mutex> guard(host.kernel.mutex);
void *address = mspace_memalign(space.get(host.mem), alignment, size);
return Ptr<void>(address, host.mem);
}
EXPORT(Ptr<void>, sceClibMspaceRealloc, Ptr<void> space, Ptr<void> address, uint32_t size) {
const std::lock_guard<std::mutex> guard(host.kernel.mutex);
void *new_address = mspace_realloc(space.get(host.mem), address.get(host.mem), size);
return Ptr<void>(new_address, host.mem);
}
EXPORT(int, sceClibMspaceReallocalign) {
return UNIMPLEMENTED();
}
EXPORT(int, sceClibPrintf, const char *fmt, module::vargs args) {
std::vector<char> 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<char>, sceClibStrchr, const char *str, int c) {
const char *res = strchr(str, c);
return Ptr<char>(res, host.mem);
}
EXPORT(int, sceClibStrcmp, const char *s1, const char *s2) {
return strcmp(s1, s2);
}
EXPORT(int, sceClibStrcpyChk) {
return UNIMPLEMENTED();
}
EXPORT(Ptr<char>, sceClibStrlcat, char *dst, const char *src, SceSize len) {
const char *res = strncat(dst, src, len);
return Ptr<char>(res, host.mem);
}
EXPORT(int, sceClibStrlcatChk) {
return UNIMPLEMENTED();
}
EXPORT(Ptr<char>, sceClibStrlcpy, char *dst, const char *src, SceSize len) {
const char *res = strncpy(dst, src, len);
return Ptr<char>(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<char>, sceClibStrncat, char *dst, const char *src, SceSize len) {
const char *res = strncat(dst, src, len);
return Ptr<char>(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<char>, sceClibStrncpy, char *dst, const char *src, SceSize len) {
const char *res = strncpy(dst, src, len);
return Ptr<char>(res, host.mem);
}
EXPORT(int, sceClibStrncpyChk) {
return UNIMPLEMENTED();
}
EXPORT(uint32_t, sceClibStrnlen, const char *s1, SceSize maxlen) {
return static_cast<uint32_t>(strnlen(s1, maxlen));
}
EXPORT(Ptr<char>, sceClibStrrchr, const char *src, int ch) {
const char *res = strrchr(src, ch);
return Ptr<char>(res, host.mem);
}
EXPORT(Ptr<char>, sceClibStrstr, const char *s1, const char *s2) {
const char *res = strstr(s1, s2);
return Ptr<char>(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<SceKernelLwCondWork> workarea, const char *name, SceUInt attr, Ptr<SceKernelLwMutexWork> workarea_mutex, Ptr<SceKernelLwCondOptParam> opt_param) {
const ThreadStatePtr thread = lock_and_find(thread_id, host.kernel.threads, host.kernel.mutex);
Ptr<SceKernelCreateLwCond_opt> options = Ptr<SceKernelCreateLwCond_opt>(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<SceKernelLwMutexWork> workarea, const char *name, SceUInt attr, int init_count, Ptr<SceKernelLwMutexOptParam> 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<SceKernelLwMutexWork>(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<SceKernelSemaOptParam> option) {
const ThreadStatePtr thread = lock_and_find(thread_id, host.kernel.threads, host.kernel.mutex);
Ptr<SceKernelCreateSema_opt> options = Ptr<SceKernelCreateSema_opt>(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<SceKernelSemaOptParam> option) {
const ThreadStatePtr thread = lock_and_find(thread_id, host.kernel.threads, host.kernel.mutex);
Ptr<SceKernelCreateSema_opt> options = Ptr<SceKernelCreateSema_opt>(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<SceKernelThreadOptParam> option) {
const ThreadStatePtr thread = lock_and_find(thread_id, host.kernel.threads, host.kernel.mutex);
Ptr<SceKernelCreateThread_opt> options = Ptr<SceKernelCreateThread_opt>(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<TimerState>();
TimerPtr &timer_info = host.kernel.timers[handle];
timer_info->name = name;
if (flags & static_cast<uint32_t>(TimerFlags::PRIORITY_THREAD))
timer_info->thread_behaviour = TimerState::ThreadBehaviour::PRIORITY;
else
timer_info->thread_behaviour = TimerState::ThreadBehaviour::FIFO;
if (flags & static_cast<uint32_t>(TimerFlags::AUTOMATIC_RESET))
timer_info->reset_behaviour = TimerState::ResetBehaviour::AUTOMATIC;
else
timer_info->reset_behaviour = TimerState::ResetBehaviour::MANUAL;
if (flags & static_cast<uint32_t>(TimerFlags::WAKE_ONLY_NOTIFY))
timer_info->notify_behaviour = TimerState::NotifyBehaviour::ONLY_WAKE;
else
timer_info->notify_behaviour = TimerState::NotifyBehaviour::ALL;
if (flags & static_cast<uint32_t>(TimerFlags::OPENABLE))
timer_info->openable = true;
return handle;
}
EXPORT(int, sceKernelDeleteLwCond, Ptr<SceKernelLwCondWork> 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<SceKernelLwMutexWork> 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<SceKernelCallbackInfo> pInfo) {
return CALL_EXPORT(_sceKernelGetCallbackInfo, callbackId, pInfo.get(host.mem));
}
EXPORT(SceInt32, sceKernelGetCondInfo, SceUID condId, Ptr<SceKernelCondInfo> pInfo) {
return CALL_EXPORT(_sceKernelGetCondInfo, condId, pInfo);
}
EXPORT(int, sceKernelGetCurrentThreadVfpException) {
return UNIMPLEMENTED();
}
EXPORT(SceInt32, sceKernelGetEventFlagInfo, SceUID evfId, Ptr<SceKernelEventFlagInfo> 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<SceKernelLwMutexInfo> 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<SceKernelLwMutexWork> workarea, Ptr<SceKernelLwMutexInfo> info) {
return CALL_EXPORT(sceKernelGetLwMutexInfoById, workarea.get(host.mem)->uid, info);
}
EXPORT(int, sceKernelGetModuleInfoByAddr, Ptr<void> 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<SceUInt32>(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<SceKernelSemaInfo> pInfo) {
return CALL_EXPORT(_sceKernelGetSemaInfo, semaId, pInfo);
}
EXPORT(int, sceKernelGetSystemInfo) {
return UNIMPLEMENTED();
}
EXPORT(int, sceKernelGetSystemTime) {
return UNIMPLEMENTED();
}
EXPORT(Ptr<Ptr<void>>, sceKernelGetTLSAddr, int key) {
return host.kernel.get_thread_tls_addr(host.mem, thread_id, key);
}
EXPORT(int, sceKernelGetThreadContextForVM, SceUID threadId, Ptr<SceKernelThreadCpuRegisterInfo> pCpuRegisterInfo, Ptr<SceKernelThreadVfpRegisterInfo> 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<SceKernelThreadInfo> 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<void> argp, SceUInt32 flags, const SceKernelLMOption *pOpt, int *pRes) {
return CALL_EXPORT(_sceKernelLoadStartModule, moduleFileName, args, argp, flags, pOpt, pRes);
}
EXPORT(int, sceKernelLockLwMutex, Ptr<SceKernelLwMutexWork> workarea, int lock_count, unsigned int *ptimeout) {
return CALL_EXPORT(_sceKernelLockLwMutex, workarea, lock_count, ptimeout);
}
EXPORT(int, sceKernelLockLwMutexCB, Ptr<SceKernelLwMutexWork> 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<SceKernelThreadCpuRegisterInfo> pCpuRegisterInfo, Ptr<SceKernelThreadVfpRegisterInfo> 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<SceKernelLwCondWork> 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<SceKernelLwCondWork> 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<SceKernelLwCondWork> 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<void> argp, SceUInt32 flags, const Ptr<SceKernelStartModuleOpt> pOpt, int *pRes) {
return CALL_EXPORT(_sceKernelStartModule, uid, args, argp, flags, pOpt, pRes);
}
EXPORT(int, sceKernelStartThread, SceUID thid, SceSize arglen, Ptr<void> argp) {
return CALL_EXPORT(_sceKernelStartThread, thid, arglen, argp);
}
EXPORT(int, sceKernelStopModule) {
return UNIMPLEMENTED();
}
EXPORT(int, sceKernelStopUnloadModule) {
return UNIMPLEMENTED();
}
EXPORT(int, sceKernelTryLockLwMutex, Ptr<SceKernelLwMutexWork> 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<SceKernelLwMutexWork> 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<SceKernelLwMutexWork> 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<SceKernelLwCondWork> 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<SceKernelLwCondWork> 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)