From 58f339903238cbe3becec9202369f08054688739 Mon Sep 17 00:00:00 2001 From: MerryMage Date: Mon, 16 Jul 2018 18:24:29 +0100 Subject: [PATCH] A64/PopRSBHint: Prevent RETing to a guest PC of ~0ull from crashing the jit --- src/backend_x64/a64_emit_x64.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/backend_x64/a64_emit_x64.cpp b/src/backend_x64/a64_emit_x64.cpp index 70e41b28..c290c849 100644 --- a/src/backend_x64/a64_emit_x64.cpp +++ b/src/backend_x64/a64_emit_x64.cpp @@ -1005,7 +1005,8 @@ void A64EmitX64::EmitTerminalImpl(IR::Term::LinkBlockFast terminal, IR::Location void A64EmitX64::EmitTerminalImpl(IR::Term::PopRSBHint, IR::LocationDescriptor) { // This calculation has to match up with A64::LocationDescriptor::UniqueHash // TODO: Optimization is available here based on known state of FPSCR_mode and CPSR_et. - code.mov(rcx, qword[r15 + offsetof(A64JitState, pc)]); + code.mov(rcx, A64::LocationDescriptor::PC_MASK); + code.and_(rcx, qword[r15 + offsetof(A64JitState, pc)]); code.mov(ebx, dword[r15 + offsetof(A64JitState, fpcr)]); code.and_(ebx, A64::LocationDescriptor::FPCR_MASK); code.shl(ebx, 37);