Fixing some misc bugs.
This commit is contained in:
parent
ea28c563ad
commit
71eabf7f2b
|
@ -364,11 +364,22 @@ void X64Emitter::DebugBreak() {
|
||||||
db(0xCC);
|
db(0xCC);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
uint64_t TrapDebugPrint(void* raw_context, uint64_t address) {
|
||||||
|
auto thread_state = *reinterpret_cast<ThreadState**>(raw_context);
|
||||||
|
uint32_t str_ptr = uint32_t(thread_state->context()->r[3]);
|
||||||
|
uint16_t str_len = uint16_t(thread_state->context()->r[4]);
|
||||||
|
const char* str =
|
||||||
|
reinterpret_cast<const char*>(thread_state->memory()->Translate(str_ptr));
|
||||||
|
// TODO(benvanik): truncate to length?
|
||||||
|
PLOGD("(DebugPrint) %s", str);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
void X64Emitter::Trap(uint16_t trap_type) {
|
void X64Emitter::Trap(uint16_t trap_type) {
|
||||||
switch (trap_type) {
|
switch (trap_type) {
|
||||||
case 20:
|
case 20:
|
||||||
|
case 26:
|
||||||
// 0x0FE00014 is a 'debug print' where r3 = buffer r4 = length
|
// 0x0FE00014 is a 'debug print' where r3 = buffer r4 = length
|
||||||
// TODO(benvanik): debug print at runtime.
|
CallNative(TrapDebugPrint, 0);
|
||||||
break;
|
break;
|
||||||
case 0:
|
case 0:
|
||||||
case 22:
|
case 22:
|
||||||
|
@ -378,6 +389,9 @@ void X64Emitter::Trap(uint16_t trap_type) {
|
||||||
db(0xCC);
|
db(0xCC);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
case 25:
|
||||||
|
// ?
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
PLOGW("Unknown trap type %d", trap_type);
|
PLOGW("Unknown trap type %d", trap_type);
|
||||||
db(0xCC);
|
db(0xCC);
|
||||||
|
|
|
@ -60,7 +60,7 @@ class XThread : public XObject {
|
||||||
void SetPriority(int32_t increment);
|
void SetPriority(int32_t increment);
|
||||||
void SetAffinity(uint32_t affinity);
|
void SetAffinity(uint32_t affinity);
|
||||||
|
|
||||||
X_STATUS Resume(uint32_t* out_suspend_count);
|
X_STATUS Resume(uint32_t* out_suspend_count = nullptr);
|
||||||
X_STATUS Suspend(uint32_t* out_suspend_count);
|
X_STATUS Suspend(uint32_t* out_suspend_count);
|
||||||
X_STATUS Delay(uint32_t processor_mode, uint32_t alertable,
|
X_STATUS Delay(uint32_t processor_mode, uint32_t alertable,
|
||||||
uint64_t interval);
|
uint64_t interval);
|
||||||
|
|
|
@ -539,6 +539,7 @@ int xe_xex2_read_image_uncompressed(const xe_xex2_header_t *header,
|
||||||
return 2;
|
return 2;
|
||||||
}
|
}
|
||||||
uint8_t *buffer = memory->Translate(header->exe_address);
|
uint8_t *buffer = memory->Translate(header->exe_address);
|
||||||
|
std::memset(buffer, 0, uncompressed_size);
|
||||||
|
|
||||||
const uint8_t *p = (const uint8_t *)xex_addr + header->exe_offset;
|
const uint8_t *p = (const uint8_t *)xex_addr + header->exe_offset;
|
||||||
|
|
||||||
|
@ -589,6 +590,7 @@ int xe_xex2_read_image_basic_compressed(const xe_xex2_header_t *header,
|
||||||
}
|
}
|
||||||
uint8_t *buffer = memory->Translate(header->exe_address);
|
uint8_t *buffer = memory->Translate(header->exe_address);
|
||||||
uint8_t *d = buffer;
|
uint8_t *d = buffer;
|
||||||
|
std::memset(buffer, 0, uncompressed_size);
|
||||||
|
|
||||||
uint32_t rk[4 * (MAXNR + 1)];
|
uint32_t rk[4 * (MAXNR + 1)];
|
||||||
uint8_t ivec[16] = {0};
|
uint8_t ivec[16] = {0};
|
||||||
|
@ -725,6 +727,7 @@ int xe_xex2_read_image_compressed(const xe_xex2_header_t *header,
|
||||||
goto XECLEANUP;
|
goto XECLEANUP;
|
||||||
}
|
}
|
||||||
uint8_t *buffer = memory->Translate(header->exe_address);
|
uint8_t *buffer = memory->Translate(header->exe_address);
|
||||||
|
std::memset(buffer, 0, uncompressed_size);
|
||||||
|
|
||||||
// Setup decompressor and decompress.
|
// Setup decompressor and decompress.
|
||||||
sys = mspack_memory_sys_create();
|
sys = mspack_memory_sys_create();
|
||||||
|
|
|
@ -159,21 +159,14 @@ SHIM_CALL NtResumeThread_shim(PPCContext* ppc_state, KernelState* state) {
|
||||||
|
|
||||||
SHIM_CALL KeResumeThread_shim(PPCContext* ppc_state, KernelState* state) {
|
SHIM_CALL KeResumeThread_shim(PPCContext* ppc_state, KernelState* state) {
|
||||||
uint32_t thread_ptr = SHIM_GET_ARG_32(0);
|
uint32_t thread_ptr = SHIM_GET_ARG_32(0);
|
||||||
uint32_t suspend_count_ptr = SHIM_GET_ARG_32(1);
|
|
||||||
|
|
||||||
XELOGD("KeResumeThread(%.8X, %.8X)", thread_ptr, suspend_count_ptr);
|
XELOGD("KeResumeThread(%.8X)", thread_ptr);
|
||||||
|
|
||||||
X_STATUS result;
|
X_STATUS result;
|
||||||
XThread* thread =
|
XThread* thread =
|
||||||
(XThread*)XObject::GetObject(state, SHIM_MEM_ADDR(thread_ptr));
|
(XThread*)XObject::GetObject(state, SHIM_MEM_ADDR(thread_ptr));
|
||||||
uint32_t suspend_count;
|
|
||||||
if (thread) {
|
if (thread) {
|
||||||
result = thread->Resume(&suspend_count);
|
result = thread->Resume();
|
||||||
}
|
|
||||||
if (XSUCCEEDED(result)) {
|
|
||||||
if (suspend_count_ptr) {
|
|
||||||
SHIM_SET_MEM_32(suspend_count_ptr, suspend_count);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
SHIM_SET_RETURN_32(result);
|
SHIM_SET_RETURN_32(result);
|
||||||
|
@ -447,7 +440,9 @@ SHIM_CALL NtCreateEvent_shim(PPCContext* ppc_state, KernelState* state) {
|
||||||
|
|
||||||
// TODO(benvanik): check for name collision. May return existing object if
|
// TODO(benvanik): check for name collision. May return existing object if
|
||||||
// type matches.
|
// type matches.
|
||||||
AssertNoNameCollision(state, obj_attributes_ptr);
|
if (obj_attributes_ptr) {
|
||||||
|
AssertNoNameCollision(state, obj_attributes_ptr);
|
||||||
|
}
|
||||||
|
|
||||||
XEvent* ev = new XEvent(state);
|
XEvent* ev = new XEvent(state);
|
||||||
ev->Initialize(!event_type, !!initial_state);
|
ev->Initialize(!event_type, !!initial_state);
|
||||||
|
|
Loading…
Reference in New Issue