[IA64] Module gp must point to valid memory
Some bits of the kernel assume that gp always points to valid memory, in particular PHYSICAL_MODE_ENTER() assumes that both gp and sp are valid virtual addresses with associated physical pages. The IA64 module loader puts gp well past the end of the module, with no physical backing. Offsets on gp are still valid, but physical mode addressing breaks for modules. Ensure that gp always falls within the module body. Also ensure that gp is 8 byte aligned. Signed-off-by: Keith Owens <kaos@sgi.com> Signed-off-by: Tony Luck <tony.luck@intel.com>
This commit is contained in:
parent
ad597bd518
commit
866ba633a8
|
@ -825,14 +825,16 @@ apply_relocate_add (Elf64_Shdr *sechdrs, const char *strtab, unsigned int symind
|
||||||
* XXX Should have an arch-hook for running this after final section
|
* XXX Should have an arch-hook for running this after final section
|
||||||
* addresses have been selected...
|
* addresses have been selected...
|
||||||
*/
|
*/
|
||||||
/* See if gp can cover the entire core module: */
|
uint64_t gp;
|
||||||
uint64_t gp = (uint64_t) mod->module_core + MAX_LTOFF / 2;
|
if (mod->core_size > MAX_LTOFF)
|
||||||
if (mod->core_size >= MAX_LTOFF)
|
|
||||||
/*
|
/*
|
||||||
* This takes advantage of fact that SHF_ARCH_SMALL gets allocated
|
* This takes advantage of fact that SHF_ARCH_SMALL gets allocated
|
||||||
* at the end of the module.
|
* at the end of the module.
|
||||||
*/
|
*/
|
||||||
gp = (uint64_t) mod->module_core + mod->core_size - MAX_LTOFF / 2;
|
gp = mod->core_size - MAX_LTOFF / 2;
|
||||||
|
else
|
||||||
|
gp = mod->core_size / 2;
|
||||||
|
gp = (uint64_t) mod->module_core + ((gp + 7) & -8);
|
||||||
mod->arch.gp = gp;
|
mod->arch.gp = gp;
|
||||||
DEBUGP("%s: placing gp at 0x%lx\n", __FUNCTION__, gp);
|
DEBUGP("%s: placing gp at 0x%lx\n", __FUNCTION__, gp);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue