diff --git a/src/xenia/cpu/ppc/ppc_emit_control.cc b/src/xenia/cpu/ppc/ppc_emit_control.cc index c439549cb..ec09ea458 100644 --- a/src/xenia/cpu/ppc/ppc_emit_control.cc +++ b/src/xenia/cpu/ppc/ppc_emit_control.cc @@ -426,6 +426,10 @@ int InstrEmit_sc(PPCHIRBuilder& f, const InstrData& i) { // Game code should only ever use LEV=0. // LEV=2 is to signify 'call import' from Xenia. // TODO(gibbed): syscalls! + if (i.SC.LEV == 0) { + f.CallExtern(f.builtins()->syscall_handler); + return 0; + } if (i.SC.LEV == 2) { f.CallExtern(f.function()); return 0; diff --git a/src/xenia/cpu/ppc/ppc_frontend.cc b/src/xenia/cpu/ppc/ppc_frontend.cc index 1696cadfa..594414fe4 100644 --- a/src/xenia/cpu/ppc/ppc_frontend.cc +++ b/src/xenia/cpu/ppc/ppc_frontend.cc @@ -10,6 +10,7 @@ #include "xenia/cpu/ppc/ppc_frontend.h" #include "xenia/base/atomic.h" +#include "xenia/base/logging.h" #include "xenia/cpu/ppc/ppc_context.h" #include "xenia/cpu/ppc/ppc_emit.h" #include "xenia/cpu/ppc/ppc_opcode_info.h" @@ -78,6 +79,16 @@ void LeaveGlobalLock(PPCContext* ppc_context, void* arg0, void* arg1) { global_mutex->unlock(); } +void SyscallHandler(PPCContext* ppc_context, void* arg0, void* arg1) { + uint64_t syscall_number = ppc_context->r[0]; + switch (syscall_number) { + default: + assert_unhandled_case(syscall_number); + XELOGE("Unhandled syscall {}!", syscall_number); + break; + } +} + bool PPCFrontend::Initialize() { void* arg0 = reinterpret_cast(&xe::global_critical_region::mutex()); void* arg1 = reinterpret_cast(&builtins_.global_lock_count); @@ -87,6 +98,8 @@ bool PPCFrontend::Initialize() { processor_->DefineBuiltin("EnterGlobalLock", EnterGlobalLock, arg0, arg1); builtins_.leave_global_lock = processor_->DefineBuiltin("LeaveGlobalLock", LeaveGlobalLock, arg0, arg1); + builtins_.syscall_handler = processor_->DefineBuiltin( + "SyscallHandler", SyscallHandler, nullptr, nullptr); return true; } diff --git a/src/xenia/cpu/ppc/ppc_frontend.h b/src/xenia/cpu/ppc/ppc_frontend.h index 7a6acd63b..d2a41c76c 100644 --- a/src/xenia/cpu/ppc/ppc_frontend.h +++ b/src/xenia/cpu/ppc/ppc_frontend.h @@ -33,6 +33,7 @@ struct PPCBuiltins { Function* check_global_lock; Function* enter_global_lock; Function* leave_global_lock; + Function* syscall_handler; }; class PPCFrontend {