Merge pull request #211 from DrChat/memory_flags

Memory scribble flag
This commit is contained in:
Ben Vanik 2015-05-16 17:56:27 -07:00
commit c69ee78c27
4 changed files with 15 additions and 4 deletions

View File

@ -146,7 +146,7 @@ X_STATUS XThread::Create() {
} }
// Set native info. // Set native info.
SetNativePointer(thread_state_address_); SetNativePointer(thread_state_address_, true);
XUserModule* module = kernel_state()->GetExecutableModule(); XUserModule* module = kernel_state()->GetExecutableModule();

View File

@ -152,13 +152,16 @@ X_STATUS XObject::WaitMultiple(uint32_t count, XObject** objects,
return result; return result;
} }
void XObject::SetNativePointer(uint32_t native_ptr) { void XObject::SetNativePointer(uint32_t native_ptr, bool uninitialized) {
std::lock_guard<std::mutex> lock(kernel_state_->object_mutex()); std::lock_guard<std::mutex> lock(kernel_state_->object_mutex());
auto header = auto header =
kernel_state_->memory()->TranslateVirtual<DISPATCH_HEADER*>(native_ptr); kernel_state_->memory()->TranslateVirtual<DISPATCH_HEADER*>(native_ptr);
assert_true(!(header->wait_list_blink & 0x1)); // Memory uninitialized, so don't bother with the check.
if (!uninitialized) {
assert_true(!(header->wait_list_blink & 0x1));
}
// Stash pointer in struct. // Stash pointer in struct.
uint64_t object_ptr = reinterpret_cast<uint64_t>(this); uint64_t object_ptr = reinterpret_cast<uint64_t>(this);

View File

@ -78,7 +78,7 @@ class XObject {
virtual void* GetWaitHandle() { return 0; } virtual void* GetWaitHandle() { return 0; }
protected: protected:
void SetNativePointer(uint32_t native_ptr); void SetNativePointer(uint32_t native_ptr, bool uninitialized = false);
static uint32_t TimeoutTicksToMs(int64_t timeout_ticks); static uint32_t TimeoutTicksToMs(int64_t timeout_ticks);

View File

@ -596,6 +596,10 @@ bool BaseHeap::AllocFixed(uint32_t base_address, uint32_t size,
XELOGE("BaseHeap::Alloc failed to alloc range from host"); XELOGE("BaseHeap::Alloc failed to alloc range from host");
return false; return false;
} }
if (FLAGS_scribble_heap && protect & kMemoryProtectWrite) {
memset(result, 0xCD, page_count * page_size_);
}
} }
// Set page state. // Set page state.
@ -725,6 +729,10 @@ bool BaseHeap::AllocRange(uint32_t low_address, uint32_t high_address,
XELOGE("BaseHeap::Alloc failed to alloc range from host"); XELOGE("BaseHeap::Alloc failed to alloc range from host");
return false; return false;
} }
if (FLAGS_scribble_heap && protect & kMemoryProtectWrite) {
memset(result, 0xCD, page_count * page_size_);
}
} }
// Set page state. // Set page state.