[XAM] Improvement rollup. Content, enumerators...
- [Kernel] Create guest object for XEnumerator. - [XAM] Split content data into host/guest variants. - [XAM] Correct message return type from RESULT to HRESULT. - [XAM] Add a new dummy content device for ODD. - [XAM] Implement XamContentAggregateCreateEnumerator. - [XAM] Implement XamGetPrivateEnumStructureFromHandle. - [XAM] Implement XMsgCompleteIORequest (sketchy). - [XAM] Implement XamGetOverlappedResult (sketchy). - [XAM] Implement XamTaskSchedule (sketchy).
This commit is contained in:
@@ -11,6 +11,8 @@
|
||||
|
||||
#include "xenia/base/logging.h"
|
||||
#include "xenia/base/threading.h"
|
||||
#include "xenia/kernel/kernel_state.h"
|
||||
#include "xenia/kernel/xenumerator.h"
|
||||
|
||||
namespace xe {
|
||||
namespace kernel {
|
||||
@@ -19,11 +21,55 @@ namespace apps {
|
||||
|
||||
XamApp::XamApp(KernelState* kernel_state) : App(kernel_state, 0xFE) {}
|
||||
|
||||
X_RESULT XamApp::DispatchMessageSync(uint32_t message, uint32_t buffer_ptr,
|
||||
uint32_t buffer_length) {
|
||||
X_HRESULT XamApp::DispatchMessageSync(uint32_t message, uint32_t buffer_ptr,
|
||||
uint32_t buffer_length) {
|
||||
// NOTE: buffer_length may be zero or valid.
|
||||
auto buffer = memory_->TranslateVirtual(buffer_ptr);
|
||||
switch (message) {
|
||||
case 0x0002000E: {
|
||||
struct message_data {
|
||||
xe::be<uint32_t> user_index;
|
||||
xe::be<uint32_t> unk_04;
|
||||
xe::be<uint32_t> extra_ptr;
|
||||
xe::be<uint32_t> buffer_ptr;
|
||||
xe::be<uint32_t> buffer_size;
|
||||
xe::be<uint32_t> unk_14;
|
||||
xe::be<uint32_t> length_ptr;
|
||||
xe::be<uint32_t> unk_1C;
|
||||
}* data = reinterpret_cast<message_data*>(buffer);
|
||||
XELOGD(
|
||||
"XamAppEnumerateContentAggregate({}, {:08X}, {:08X}, {:08X}, {}, "
|
||||
"{:08X}, {:08X}, {:08X})",
|
||||
(uint32_t)data->user_index, (uint32_t)data->unk_04,
|
||||
(uint32_t)data->extra_ptr, (uint32_t)data->buffer_ptr,
|
||||
(uint32_t)data->buffer_size, (uint32_t)data->unk_14,
|
||||
(uint32_t)data->length_ptr, (uint32_t)data->unk_1C);
|
||||
auto extra = memory_->TranslateVirtual<X_KENUMERATOR_CONTENT_AGGREGATE*>(
|
||||
data->extra_ptr);
|
||||
auto buffer = memory_->TranslateVirtual(data->buffer_ptr);
|
||||
auto e = kernel_state_->object_table()->LookupObject<XEnumerator>(
|
||||
extra->handle);
|
||||
if (!e || !buffer || !extra) {
|
||||
return X_E_INVALIDARG;
|
||||
}
|
||||
assert_true(extra->magic == 'XEN\0');
|
||||
if (data->buffer_size) {
|
||||
std::memset(buffer, 0, data->buffer_size);
|
||||
}
|
||||
if (e->WriteItem(buffer)) {
|
||||
auto content_data = reinterpret_cast<XCONTENT_AGGREGATE_DATA*>(buffer);
|
||||
// TODO(gibbed): WTF?
|
||||
*reinterpret_cast<be<uint32_t>*>(&buffer[0x140]) =
|
||||
content_data->title_id;
|
||||
if (data->length_ptr) {
|
||||
auto length_ptr =
|
||||
memory_->TranslateVirtual<be<uint32_t>*>(data->length_ptr);
|
||||
*length_ptr = 1;
|
||||
}
|
||||
return X_E_SUCCESS;
|
||||
}
|
||||
return X_E_NO_MORE_FILES;
|
||||
}
|
||||
case 0x00020021: {
|
||||
struct message_data {
|
||||
char unk_00[64];
|
||||
@@ -37,11 +83,11 @@ X_RESULT XamApp::DispatchMessageSync(uint32_t message, uint32_t buffer_ptr,
|
||||
XELOGD("XamApp(0x00020021)('{}', {:08X}, {:08X}, {:08X})", data->unk_00,
|
||||
(uint32_t)data->unk_40, (uint32_t)data->unk_44,
|
||||
(uint32_t)data->unk_48);
|
||||
return X_ERROR_SUCCESS;
|
||||
return X_E_SUCCESS;
|
||||
}
|
||||
case 0x00021012: {
|
||||
XELOGD("XamApp(0x00021012)");
|
||||
return X_ERROR_SUCCESS;
|
||||
return X_E_SUCCESS;
|
||||
}
|
||||
case 0x00022005: {
|
||||
struct message_data {
|
||||
@@ -53,14 +99,14 @@ X_RESULT XamApp::DispatchMessageSync(uint32_t message, uint32_t buffer_ptr,
|
||||
auto adr = *unk;
|
||||
XELOGD("XamApp(0x00022005)(%.8X, %.8X)", (uint32_t)data->unk_00,
|
||||
(uint32_t)data->unk_04);
|
||||
return X_ERROR_SUCCESS;
|
||||
return X_E_SUCCESS;
|
||||
}
|
||||
}
|
||||
XELOGE(
|
||||
"Unimplemented XAM message app={:08X}, msg={:08X}, arg1={:08X}, "
|
||||
"arg2={:08X}",
|
||||
app_id(), message, buffer_ptr, buffer_length);
|
||||
return X_STATUS_UNSUCCESSFUL;
|
||||
return X_E_FAIL;
|
||||
}
|
||||
|
||||
} // namespace apps
|
||||
|
||||
Reference in New Issue
Block a user