1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-05-22 22:25:07 +00:00

UserspaceEmulator: Support the name argument in mmap for file backed mappings

This commit is contained in:
Itamar 2020-11-27 15:45:49 +02:00 committed by Andreas Kling
parent d2262b8f6d
commit 28cda567c1
3 changed files with 27 additions and 5 deletions

View file

@ -874,11 +874,27 @@ u32 Emulator::virt$mmap(u32 params_addr)
u32 final_size = round_up_to_power_of_two(params.size, PAGE_SIZE); u32 final_size = round_up_to_power_of_two(params.size, PAGE_SIZE);
u32 final_address = allocate_vm(final_size, params.alignment); u32 final_address = allocate_vm(final_size, params.alignment);
if (params.addr != 0) {
// NOTE: We currently do not support allocating VM at a requeted address in the emulator.
// The loader needs this functionality to load .data just after .text.
// Luckily, since the loader calls mmap for .data right after it calls mmap for .text,
// the emulator will allocate a chunk of memory that is just after what we allocated for .text
// becuase of the way we currently allocate VM.
ASSERT(params.addr == final_address);
}
if (params.flags & MAP_ANONYMOUS) if (params.flags & MAP_ANONYMOUS)
mmu().add_region(MmapRegion::create_anonymous(final_address, final_size, params.prot)); mmu().add_region(MmapRegion::create_anonymous(final_address, final_size, params.prot));
else else {
mmu().add_region(MmapRegion::create_file_backed(final_address, final_size, params.prot, params.flags, params.fd, params.offset)); dbgln("chars: {:p}, len: {}", params.name.characters, params.name.length);
String name_str;
if (params.name.characters) {
auto name = ByteBuffer::create_uninitialized(params.name.length);
mmu().copy_from_vm(name.data(), (FlatPtr)params.name.characters, params.name.length);
name_str = { name.data(), name.size() };
}
mmu().add_region(MmapRegion::create_file_backed(final_address, final_size, params.prot, params.flags, params.fd, params.offset, name_str));
}
return final_address; return final_address;
} }

View file

@ -39,11 +39,16 @@ NonnullOwnPtr<MmapRegion> MmapRegion::create_anonymous(u32 base, u32 size, u32 p
return region; return region;
} }
NonnullOwnPtr<MmapRegion> MmapRegion::create_file_backed(u32 base, u32 size, u32 prot, int flags, int fd, off_t offset) NonnullOwnPtr<MmapRegion> MmapRegion::create_file_backed(u32 base, u32 size, u32 prot, int flags, int fd, off_t offset, String name)
{ {
auto region = adopt_own(*new MmapRegion(base, size, prot)); auto region = adopt_own(*new MmapRegion(base, size, prot));
region->m_file_backed = true; region->m_file_backed = true;
region->m_data = (u8*)mmap(nullptr, size, prot, flags, fd, offset); if (!name.is_empty()) {
dbgln("name is not empty");
name = String::format("%s (Emulated)", name.characters());
region->m_name = name;
}
region->m_data = (u8*)mmap_with_name(nullptr, size, prot, flags, fd, offset, name.is_empty() ? nullptr : name.characters());
ASSERT(region->m_data != MAP_FAILED); ASSERT(region->m_data != MAP_FAILED);
return region; return region;
} }

View file

@ -37,7 +37,7 @@ class MallocTracer;
class MmapRegion final : public Region { class MmapRegion final : public Region {
public: public:
static NonnullOwnPtr<MmapRegion> create_anonymous(u32 base, u32 size, u32 prot); static NonnullOwnPtr<MmapRegion> create_anonymous(u32 base, u32 size, u32 prot);
static NonnullOwnPtr<MmapRegion> create_file_backed(u32 base, u32 size, u32 prot, int flags, int fd, off_t offset); static NonnullOwnPtr<MmapRegion> create_file_backed(u32 base, u32 size, u32 prot, int flags, int fd, off_t offset, String name = {});
virtual ~MmapRegion() override; virtual ~MmapRegion() override;
virtual ValueWithShadow<u8> read8(u32 offset) override; virtual ValueWithShadow<u8> read8(u32 offset) override;
@ -71,6 +71,7 @@ private:
bool m_malloc { false }; bool m_malloc { false };
OwnPtr<MallocRegionMetadata> m_malloc_metadata; OwnPtr<MallocRegionMetadata> m_malloc_metadata;
String m_name;
}; };
} }