[CPU] Add syscall handler.
This commit is contained in:
parent
c6259241a2
commit
0cf4cab59b
|
@ -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;
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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 {
|
||||||
|
|
Loading…
Reference in New Issue