From 1b26ec56edcae7d825f44955d2996bed80149a02 Mon Sep 17 00:00:00 2001 From: Juhn Date: Tue, 20 Feb 2018 21:24:47 +0100 Subject: [PATCH] Implement _sys_qsort in sys_libc_.cpp (#4176) --- rpcs3/Emu/Cell/Modules/sys_libc_.cpp | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/rpcs3/Emu/Cell/Modules/sys_libc_.cpp b/rpcs3/Emu/Cell/Modules/sys_libc_.cpp index b7f62e465f..3498bdbbc0 100644 --- a/rpcs3/Emu/Cell/Modules/sys_libc_.cpp +++ b/rpcs3/Emu/Cell/Modules/sys_libc_.cpp @@ -12,6 +12,8 @@ extern fs::file g_tty; // cfmt implementation (TODO) +using qsortcmp = s32(vm::cptr e1, vm::cptr e2); + struct ps3_fmt_src { ppu_thread* ctx; @@ -452,9 +454,17 @@ s32 _sys_vsprintf() fmt::throw_exception("Unimplemented" HERE); } -s32 _sys_qsort() +void _sys_qsort(vm::ptr base, u32 nelem, u32 size, vm::ptr cmp) { - fmt::throw_exception("Unimplemented" HERE); + sysPrxForUser.warning("_sys_qsort(base=*0x%x, nelem=%d, size=0x%x, cmp=*0x%x)", base, nelem, size, cmp); + + static thread_local decltype(cmp) g_tls_cmp; + g_tls_cmp = cmp; + + std::qsort(base.get_ptr(), nelem, size, [](const void* a, const void* b) -> s32 + { + return g_tls_cmp(static_cast(*get_current_cpu_thread()), vm::get_addr(a), vm::get_addr(b)); + }); } void sysPrxForUser_sys_libc_init()