diff --git a/src/xenia/cpu/backend/x64/x64_emitter.cc b/src/xenia/cpu/backend/x64/x64_emitter.cc index 9dc3bf433..294c5463f 100644 --- a/src/xenia/cpu/backend/x64/x64_emitter.cc +++ b/src/xenia/cpu/backend/x64/x64_emitter.cc @@ -364,11 +364,22 @@ void X64Emitter::DebugBreak() { db(0xCC); } +uint64_t TrapDebugPrint(void* raw_context, uint64_t address) { + auto thread_state = *reinterpret_cast(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(thread_state->memory()->Translate(str_ptr)); + // TODO(benvanik): truncate to length? + PLOGD("(DebugPrint) %s", str); + return 0; +} void X64Emitter::Trap(uint16_t trap_type) { switch (trap_type) { case 20: + case 26: // 0x0FE00014 is a 'debug print' where r3 = buffer r4 = length - // TODO(benvanik): debug print at runtime. + CallNative(TrapDebugPrint, 0); break; case 0: case 22: @@ -378,6 +389,9 @@ void X64Emitter::Trap(uint16_t trap_type) { db(0xCC); } break; + case 25: + // ? + break; default: PLOGW("Unknown trap type %d", trap_type); db(0xCC); diff --git a/src/xenia/kernel/objects/xthread.h b/src/xenia/kernel/objects/xthread.h index e400efe25..90aaa8a5c 100644 --- a/src/xenia/kernel/objects/xthread.h +++ b/src/xenia/kernel/objects/xthread.h @@ -60,7 +60,7 @@ class XThread : public XObject { void SetPriority(int32_t increment); 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 Delay(uint32_t processor_mode, uint32_t alertable, uint64_t interval); diff --git a/src/xenia/kernel/util/xex2.cc b/src/xenia/kernel/util/xex2.cc index 8323e621c..b89ddddff 100644 --- a/src/xenia/kernel/util/xex2.cc +++ b/src/xenia/kernel/util/xex2.cc @@ -539,6 +539,7 @@ int xe_xex2_read_image_uncompressed(const xe_xex2_header_t *header, return 2; } 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; @@ -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 *d = buffer; + std::memset(buffer, 0, uncompressed_size); uint32_t rk[4 * (MAXNR + 1)]; uint8_t ivec[16] = {0}; @@ -725,6 +727,7 @@ int xe_xex2_read_image_compressed(const xe_xex2_header_t *header, goto XECLEANUP; } uint8_t *buffer = memory->Translate(header->exe_address); + std::memset(buffer, 0, uncompressed_size); // Setup decompressor and decompress. sys = mspack_memory_sys_create(); diff --git a/src/xenia/kernel/xboxkrnl_threading.cc b/src/xenia/kernel/xboxkrnl_threading.cc index 1110e9541..482c55156 100644 --- a/src/xenia/kernel/xboxkrnl_threading.cc +++ b/src/xenia/kernel/xboxkrnl_threading.cc @@ -159,21 +159,14 @@ SHIM_CALL NtResumeThread_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 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; XThread* thread = (XThread*)XObject::GetObject(state, SHIM_MEM_ADDR(thread_ptr)); - uint32_t suspend_count; if (thread) { - result = thread->Resume(&suspend_count); - } - if (XSUCCEEDED(result)) { - if (suspend_count_ptr) { - SHIM_SET_MEM_32(suspend_count_ptr, suspend_count); - } + result = thread->Resume(); } 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 // type matches. - AssertNoNameCollision(state, obj_attributes_ptr); + if (obj_attributes_ptr) { + AssertNoNameCollision(state, obj_attributes_ptr); + } XEvent* ev = new XEvent(state); ev->Initialize(!event_type, !!initial_state);