mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-10-09 11:25:00 +00:00
Bug 772886 - Avoid failure to mmap some library segments on some armv6 devices. r=nfroyd
This commit is contained in:
parent
da548c4ede
commit
a716e0afd3
@ -394,15 +394,30 @@ CustomElf::LoadSegment(const Phdr *pt_load) const
|
|||||||
((pt_load->p_flags & PF_R) ? PROT_READ : 0);
|
((pt_load->p_flags & PF_R) ? PROT_READ : 0);
|
||||||
|
|
||||||
/* Mmap at page boundary */
|
/* Mmap at page boundary */
|
||||||
Addr page_offset = pt_load->p_vaddr & ~PAGE_MASK;
|
Addr align = PAGE_SIZE;
|
||||||
void *where = GetPtr(pt_load->p_vaddr - page_offset);
|
void *mapped, *where;
|
||||||
debug("%s: Loading segment @%p %c%c%c", GetPath(), where,
|
do {
|
||||||
prot & PROT_READ ? 'r' : '-',
|
Addr align_offset = pt_load->p_vaddr & (align - 1);
|
||||||
prot & PROT_WRITE ? 'w' : '-',
|
where = GetPtr(pt_load->p_vaddr - align_offset);
|
||||||
prot & PROT_EXEC ? 'x' : '-');
|
debug("%s: Loading segment @%p %c%c%c", GetPath(), where,
|
||||||
void *mapped = mappable->mmap(where, pt_load->p_filesz + page_offset,
|
prot & PROT_READ ? 'r' : '-',
|
||||||
prot, MAP_PRIVATE | MAP_FIXED,
|
prot & PROT_WRITE ? 'w' : '-',
|
||||||
pt_load->p_offset - page_offset);
|
prot & PROT_EXEC ? 'x' : '-');
|
||||||
|
mapped = mappable->mmap(where, pt_load->p_filesz + align_offset,
|
||||||
|
prot, MAP_PRIVATE | MAP_FIXED,
|
||||||
|
pt_load->p_offset - align_offset);
|
||||||
|
if ((mapped != MAP_FAILED) || (pt_load->p_vaddr == 0) ||
|
||||||
|
(pt_load->p_align == align))
|
||||||
|
break;
|
||||||
|
/* The virtual address space for the library is properly aligned at
|
||||||
|
* 16k on ARMv6 (see CustomElf::Load), and so is the first segment
|
||||||
|
* (p_vaddr == 0). But subsequent segments may not be 16k aligned
|
||||||
|
* and fail to mmap. In such case, try to mmap again at the p_align
|
||||||
|
* boundary instead of page boundary. */
|
||||||
|
debug("%s: Failed to mmap, retrying");
|
||||||
|
align = pt_load->p_align;
|
||||||
|
} while (1);
|
||||||
|
|
||||||
if (mapped != where) {
|
if (mapped != where) {
|
||||||
if (mapped == MAP_FAILED) {
|
if (mapped == MAP_FAILED) {
|
||||||
log("%s: Failed to mmap", GetPath());
|
log("%s: Failed to mmap", GetPath());
|
||||||
|
Loading…
Reference in New Issue
Block a user