Attempt to emulate reserved load/store more closely. can't do anything for stores of the same value that are done via a non-reserved store to a reserved location
uses a bitmap that splits up the memory space into 65k blocks per bit. Currently is using the guest virtual address but should be using physical addresses instead. Currently if a guest does a reserve on a location and then a reserved store to a totally different location we trigger a breakpoint. This should never happen Also removed the NEGATED_MUL_blah operations. They weren't necessary, nothing special is needed for the negated result variants. Added a log message for when watched physical memory has a race, it just would be nice to know when it happens and in what games.
This commit is contained in:
@@ -185,7 +185,7 @@ bool MMIOHandler::TryDecodeLoadStore(const uint8_t* p,
|
||||
uint8_t rex_b = rex & 0b0001;
|
||||
uint8_t rex_x = rex & 0b0010;
|
||||
uint8_t rex_r = rex & 0b0100;
|
||||
//uint8_t rex_w = rex & 0b1000;
|
||||
// uint8_t rex_w = rex & 0b1000;
|
||||
|
||||
// http://www.sandpile.org/x86/opc_rm.htm
|
||||
// http://www.sandpile.org/x86/opc_sib.htm
|
||||
@@ -448,6 +448,7 @@ bool MMIOHandler::ExceptionCallback(Exception* ex) {
|
||||
if (cur_access != memory::PageAccess::kNoAccess &&
|
||||
(!is_write || cur_access != memory::PageAccess::kReadOnly)) {
|
||||
// Another thread has cleared this watch. Abort.
|
||||
XELOGD("Race condition on watch, was already cleared by another thread!");
|
||||
return true;
|
||||
}
|
||||
// The address is not found within any range, so either a write watch or an
|
||||
|
||||
Reference in New Issue
Block a user