[CPU] Add syscall handler.

This commit is contained in:
gibbed 2021-06-28 12:48:27 -05:00 committed by Rick Gibbed
parent c6259241a2
commit 0cf4cab59b
3 changed files with 18 additions and 0 deletions

View File

@ -426,6 +426,10 @@ int InstrEmit_sc(PPCHIRBuilder& f, const InstrData& i) {
// Game code should only ever use LEV=0. // Game code should only ever use LEV=0.
// LEV=2 is to signify 'call import' from Xenia. // LEV=2 is to signify 'call import' from Xenia.
// TODO(gibbed): syscalls! // TODO(gibbed): syscalls!
if (i.SC.LEV == 0) {
f.CallExtern(f.builtins()->syscall_handler);
return 0;
}
if (i.SC.LEV == 2) { if (i.SC.LEV == 2) {
f.CallExtern(f.function()); f.CallExtern(f.function());
return 0; return 0;

View File

@ -10,6 +10,7 @@
#include "xenia/cpu/ppc/ppc_frontend.h" #include "xenia/cpu/ppc/ppc_frontend.h"
#include "xenia/base/atomic.h" #include "xenia/base/atomic.h"
#include "xenia/base/logging.h"
#include "xenia/cpu/ppc/ppc_context.h" #include "xenia/cpu/ppc/ppc_context.h"
#include "xenia/cpu/ppc/ppc_emit.h" #include "xenia/cpu/ppc/ppc_emit.h"
#include "xenia/cpu/ppc/ppc_opcode_info.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(); 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() { bool PPCFrontend::Initialize() {
void* arg0 = reinterpret_cast<void*>(&xe::global_critical_region::mutex()); void* arg0 = reinterpret_cast<void*>(&xe::global_critical_region::mutex());
void* arg1 = reinterpret_cast<void*>(&builtins_.global_lock_count); void* arg1 = reinterpret_cast<void*>(&builtins_.global_lock_count);
@ -87,6 +98,8 @@ bool PPCFrontend::Initialize() {
processor_->DefineBuiltin("EnterGlobalLock", EnterGlobalLock, arg0, arg1); processor_->DefineBuiltin("EnterGlobalLock", EnterGlobalLock, arg0, arg1);
builtins_.leave_global_lock = builtins_.leave_global_lock =
processor_->DefineBuiltin("LeaveGlobalLock", LeaveGlobalLock, arg0, arg1); processor_->DefineBuiltin("LeaveGlobalLock", LeaveGlobalLock, arg0, arg1);
builtins_.syscall_handler = processor_->DefineBuiltin(
"SyscallHandler", SyscallHandler, nullptr, nullptr);
return true; return true;
} }

View File

@ -33,6 +33,7 @@ struct PPCBuiltins {
Function* check_global_lock; Function* check_global_lock;
Function* enter_global_lock; Function* enter_global_lock;
Function* leave_global_lock; Function* leave_global_lock;
Function* syscall_handler;
}; };
class PPCFrontend { class PPCFrontend {