mirror of
https://github.com/RGBCube/serenity
synced 2025-07-25 16:37:35 +00:00
LibC: Communicate malloc() and free() operations to UserspaceEmulator
Use the sneaky SALC secret mechanism of UserspaceEmulator to inform it about malloc operations.
This commit is contained in:
parent
c314292319
commit
4aa81a4fd9
2 changed files with 24 additions and 0 deletions
|
@ -281,6 +281,10 @@ static void* malloc_impl(size_t size)
|
||||||
#ifdef MALLOC_DEBUG
|
#ifdef MALLOC_DEBUG
|
||||||
dbgprintf("LibC: allocated %p (chunk in block %p, size %zu)\n", ptr, block, block->bytes_per_chunk());
|
dbgprintf("LibC: allocated %p (chunk in block %p, size %zu)\n", ptr, block, block->bytes_per_chunk());
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
// Tell UserspaceEmulator about this malloc()
|
||||||
|
send_secret_data_to_userspace_emulator(1, size, reinterpret_cast<FlatPtr>(ptr));
|
||||||
|
|
||||||
if (s_scrub_malloc)
|
if (s_scrub_malloc)
|
||||||
memset(ptr, MALLOC_SCRUB_BYTE, block->m_size);
|
memset(ptr, MALLOC_SCRUB_BYTE, block->m_size);
|
||||||
return ptr;
|
return ptr;
|
||||||
|
@ -382,6 +386,9 @@ void free(void* ptr)
|
||||||
if (s_profiling)
|
if (s_profiling)
|
||||||
perf_event(PERF_EVENT_FREE, reinterpret_cast<FlatPtr>(ptr), 0);
|
perf_event(PERF_EVENT_FREE, reinterpret_cast<FlatPtr>(ptr), 0);
|
||||||
free_impl(ptr);
|
free_impl(ptr);
|
||||||
|
|
||||||
|
// Tell UserspaceEmulator about this free()
|
||||||
|
send_secret_data_to_userspace_emulator(2, reinterpret_cast<FlatPtr>(ptr), 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
void* calloc(size_t count, size_t size)
|
void* calloc(size_t count, size_t size)
|
||||||
|
|
|
@ -70,4 +70,21 @@ int perf_event(int type, uintptr_t arg1, uintptr_t arg2);
|
||||||
|
|
||||||
int get_stack_bounds(uintptr_t* user_stack_base, size_t* user_stack_size);
|
int get_stack_bounds(uintptr_t* user_stack_base, size_t* user_stack_size);
|
||||||
|
|
||||||
|
ALWAYS_INLINE void send_secret_data_to_userspace_emulator(uintptr_t data1, uintptr_t data2, uintptr_t data3)
|
||||||
|
{
|
||||||
|
asm volatile(
|
||||||
|
".byte 0xd6\n"
|
||||||
|
".byte 0xd6\n" ::
|
||||||
|
: "eax");
|
||||||
|
asm volatile(
|
||||||
|
"push %%eax\n"
|
||||||
|
"push %%ecx\n"
|
||||||
|
"push %%edx\n"
|
||||||
|
"pop %%edx\n"
|
||||||
|
"pop %%ecx\n"
|
||||||
|
"pop %%eax\n" ::"a"(data1),
|
||||||
|
"c"(data2), "d"(data3)
|
||||||
|
: "memory");
|
||||||
|
}
|
||||||
|
|
||||||
__END_DECLS
|
__END_DECLS
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue