Misc fixes (overlapped IO, etc).
This commit is contained in:
parent
0a9d936f1e
commit
35885f761c
|
@ -33,14 +33,17 @@ SHIM_CALL XamContentGetLicenseMask_shim(
|
||||||
mask_ptr,
|
mask_ptr,
|
||||||
overlapped_ptr);
|
overlapped_ptr);
|
||||||
|
|
||||||
assert_zero(overlapped_ptr);
|
|
||||||
|
|
||||||
// Arcade games seem to call this and check the result mask for random bits.
|
// Arcade games seem to call this and check the result mask for random bits.
|
||||||
// If we fail, the games seem to use a hardcoded mask, which is likely trial.
|
// If we fail, the games seem to use a hardcoded mask, which is likely trial.
|
||||||
// To be clever, let's just try setting all the bits.
|
// To be clever, let's just try setting all the bits.
|
||||||
SHIM_SET_MEM_32(mask_ptr, 0xFFFFFFFF);
|
SHIM_SET_MEM_32(mask_ptr, 0xFFFFFFFF);
|
||||||
|
|
||||||
SHIM_SET_RETURN_32(X_ERROR_SUCCESS);
|
if (overlapped_ptr) {
|
||||||
|
state->CompleteOverlappedImmediate(overlapped_ptr, X_ERROR_SUCCESS);
|
||||||
|
SHIM_SET_RETURN_32(X_ERROR_IO_PENDING);
|
||||||
|
} else {
|
||||||
|
SHIM_SET_RETURN_32(X_ERROR_SUCCESS);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -125,10 +125,11 @@ SHIM_CALL XamEnumerate_shim(
|
||||||
}
|
}
|
||||||
|
|
||||||
if (item_count_ptr) {
|
if (item_count_ptr) {
|
||||||
|
assert_zero(overlapped_ptr);
|
||||||
SHIM_SET_MEM_32(item_count_ptr, 0);
|
SHIM_SET_MEM_32(item_count_ptr, 0);
|
||||||
} else if (overlapped_ptr) {
|
} else if (overlapped_ptr) {
|
||||||
// TODO(benvanik): overlapped IO.
|
assert_zero(item_count_ptr);
|
||||||
assert_zero(overlapped_ptr);
|
state->CompleteOverlappedImmediate(overlapped_ptr, 0, 0);
|
||||||
} else {
|
} else {
|
||||||
assert_always();
|
assert_always();
|
||||||
}
|
}
|
||||||
|
|
|
@ -11,6 +11,7 @@
|
||||||
|
|
||||||
#include <xenia/kernel/kernel_state.h>
|
#include <xenia/kernel/kernel_state.h>
|
||||||
#include <xenia/kernel/xam_private.h>
|
#include <xenia/kernel/xam_private.h>
|
||||||
|
#include <xenia/kernel/objects/xevent.h>
|
||||||
#include <xenia/kernel/util/shim_utils.h>
|
#include <xenia/kernel/util/shim_utils.h>
|
||||||
|
|
||||||
|
|
||||||
|
@ -36,6 +37,9 @@ SHIM_CALL XMsgInProcessCall_shim(
|
||||||
|
|
||||||
auto result = state->app_manager()->DispatchMessageSync(
|
auto result = state->app_manager()->DispatchMessageSync(
|
||||||
app, message, arg1, arg2);
|
app, message, arg1, arg2);
|
||||||
|
if (result == X_ERROR_NOT_FOUND) {
|
||||||
|
XELOGE("XMsgStartIORequest: app not found");
|
||||||
|
}
|
||||||
SHIM_SET_RETURN_32(result);
|
SHIM_SET_RETURN_32(result);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -56,6 +60,9 @@ SHIM_CALL XMsgStartIORequest_shim(
|
||||||
|
|
||||||
auto result = state->app_manager()->DispatchMessageAsync(
|
auto result = state->app_manager()->DispatchMessageAsync(
|
||||||
app, message, buffer, buffer_length);
|
app, message, buffer, buffer_length);
|
||||||
|
if (result == X_ERROR_NOT_FOUND) {
|
||||||
|
XELOGE("XMsgStartIORequest: app not found");
|
||||||
|
}
|
||||||
SHIM_SET_RETURN_32(result);
|
SHIM_SET_RETURN_32(result);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -69,8 +76,15 @@ SHIM_CALL XMsgCancelIORequest_shim(
|
||||||
"XMsgCancelIORequest(%.8X, %d)",
|
"XMsgCancelIORequest(%.8X, %d)",
|
||||||
overlapped_ptr, wait);
|
overlapped_ptr, wait);
|
||||||
|
|
||||||
// ?
|
X_HANDLE event_handle = XOverlappedGetEvent(SHIM_MEM_ADDR(overlapped_ptr));
|
||||||
XELOGW("XMsgCancelIORequest NOT IMPLEMENTED (wait?)");
|
if (event_handle && wait) {
|
||||||
|
XEvent* ev = nullptr;
|
||||||
|
if (XSUCCEEDED(state->object_table()->GetObject(
|
||||||
|
event_handle, reinterpret_cast<XObject**>(&ev)))) {
|
||||||
|
ev->Wait(0, 0, true, nullptr);
|
||||||
|
ev->Release();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
SHIM_SET_RETURN_32(0);
|
SHIM_SET_RETURN_32(0);
|
||||||
}
|
}
|
||||||
|
|
|
@ -141,6 +141,10 @@ SHIM_CALL XamUserReadProfileSettings_shim(
|
||||||
// Title ID = 0 means us.
|
// Title ID = 0 means us.
|
||||||
// 0xfffe07d1 = profile?
|
// 0xfffe07d1 = profile?
|
||||||
|
|
||||||
|
if (user_index == 255) {
|
||||||
|
user_index = 0;
|
||||||
|
}
|
||||||
|
|
||||||
if (user_index) {
|
if (user_index) {
|
||||||
// Only support user 0.
|
// Only support user 0.
|
||||||
SHIM_SET_RETURN_32(X_ERROR_NOT_FOUND);
|
SHIM_SET_RETURN_32(X_ERROR_NOT_FOUND);
|
||||||
|
|
|
@ -388,8 +388,8 @@ uint64_t xeKeQueryPerformanceFrequency() {
|
||||||
|
|
||||||
SHIM_CALL KeQueryPerformanceFrequency_shim(
|
SHIM_CALL KeQueryPerformanceFrequency_shim(
|
||||||
PPCContext* ppc_state, KernelState* state) {
|
PPCContext* ppc_state, KernelState* state) {
|
||||||
XELOGD(
|
// XELOGD(
|
||||||
"KeQueryPerformanceFrequency()");
|
// "KeQueryPerformanceFrequency()");
|
||||||
|
|
||||||
uint64_t result = xeKeQueryPerformanceFrequency();
|
uint64_t result = xeKeQueryPerformanceFrequency();
|
||||||
SHIM_SET_RETURN_64(result);
|
SHIM_SET_RETURN_64(result);
|
||||||
|
@ -410,9 +410,9 @@ SHIM_CALL KeDelayExecutionThread_shim(
|
||||||
uint32_t interval_ptr = SHIM_GET_ARG_32(2);
|
uint32_t interval_ptr = SHIM_GET_ARG_32(2);
|
||||||
uint64_t interval = SHIM_MEM_64(interval_ptr);
|
uint64_t interval = SHIM_MEM_64(interval_ptr);
|
||||||
|
|
||||||
XELOGD(
|
// XELOGD(
|
||||||
"KeDelayExecutionThread(%.8X, %d, %.8X(%.16llX)",
|
// "KeDelayExecutionThread(%.8X, %d, %.8X(%.16llX)",
|
||||||
processor_mode, alertable, interval_ptr, interval);
|
// processor_mode, alertable, interval_ptr, interval);
|
||||||
|
|
||||||
X_STATUS result = xeKeDelayExecutionThread(
|
X_STATUS result = xeKeDelayExecutionThread(
|
||||||
processor_mode, alertable, interval);
|
processor_mode, alertable, interval);
|
||||||
|
|
Loading…
Reference in New Issue