patcher: fix ppc32 support
The table of contents (TOC) code only appears to only apply to ppc64. The code was incorrectly assuming the existence of the TOC on ppc32. This commit updates the necessary code to only apply to ppc64. Signed-off-by: Nathan Hjelm <hjelmn@lanl.gov>
Этот коммит содержится в:
родитель
41f00b7465
Коммит
71be36d380
@ -68,7 +68,7 @@ OPAL_DECLSPEC int mca_patcher_base_patch_hook (mca_patcher_base_module_t *module
|
||||
OPAL_DECLSPEC void mca_base_patcher_patch_apply_binary (mca_patcher_base_patch_t *patch);
|
||||
|
||||
static inline uintptr_t mca_patcher_base_addr_text (uintptr_t addr) {
|
||||
#if (defined(__PPC64__) || defined(__powerpc64__) || defined(__PPC__)) && _CALL_ELF != 2
|
||||
#if (OPAL_ASSEMBLY_ARCH == OPAL_POWERPC64) && (!defined (_CALL_ELF) || (_CALL_ELF != 2))
|
||||
struct odp_t {
|
||||
uintptr_t text;
|
||||
uintptr_t toc;
|
||||
|
@ -122,7 +122,7 @@ static void ModifyMemoryProtection (uintptr_t addr, size_t length, int prot)
|
||||
if (mprotect((void *)base, page_size, prot))
|
||||
perror("MemHook: mprotect failed");
|
||||
base += page_size;
|
||||
} while (base < addr + length);
|
||||
} while (base < bound);
|
||||
#else
|
||||
if (mprotect((void *) base, length, prot)) {
|
||||
perror("MemHook: mprotect failed");
|
||||
@ -156,10 +156,9 @@ void mca_base_patcher_patch_apply_binary (mca_patcher_base_patch_t *patch)
|
||||
|
||||
int mca_patcher_base_patch_hook (mca_patcher_base_module_t *module, uintptr_t hook_addr)
|
||||
{
|
||||
#if defined(__PPC64__) || defined(__powerpc64__) || defined(__PPC__)
|
||||
#if (OPAL_ASSEMBLY_ARCH == OPAL_POWERPC64)
|
||||
mca_patcher_base_patch_t *hook_patch;
|
||||
const unsigned int nop = 0x60000000;
|
||||
unsigned int *nop_addr;
|
||||
|
||||
hook_patch = OBJ_NEW(mca_patcher_base_patch_t);
|
||||
if (OPAL_UNLIKELY(NULL == hook_patch)) {
|
||||
@ -167,15 +166,16 @@ int mca_patcher_base_patch_hook (mca_patcher_base_module_t *module, uintptr_t ho
|
||||
}
|
||||
|
||||
// locate reserved code space in hook function
|
||||
for (nop_addr = (unsigned int *)hook_addr ; ; nop_addr++) {
|
||||
for (unsigned int *nop_addr = (unsigned int *)hook_addr ; ; nop_addr++) {
|
||||
if (nop_addr[0] == nop && nop_addr[1] == nop && nop_addr[2] == nop
|
||||
&& nop_addr[3] == nop && nop_addr[4] == nop) {
|
||||
hook_patch->patch_orig = (uintptr_t) nop_addr;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// generate code to restore TOC
|
||||
register unsigned long toc asm("r2");
|
||||
hook_patch->patch_orig = (uintptr_t) nop_addr;
|
||||
hook_patch->patch_data_size = PatchLoadImm((uintptr_t)hook_patch->patch_data, 2, toc);
|
||||
|
||||
/* put the hook patch on the patch list so it will be undone on finalize */
|
||||
|
@ -214,7 +214,7 @@ static int mca_patcher_overwrite_apply_patch (mca_patcher_base_patch_t *patch)
|
||||
return rc;
|
||||
}
|
||||
|
||||
#if _CALL_ELF == 2
|
||||
#if defined(_CALL_ELF) && (_CALL_ELF == 2)
|
||||
sys_addr += 8;
|
||||
hook_addr += 8;
|
||||
#endif /* _CALL_ELF == 2*/
|
||||
|
@ -21,7 +21,7 @@
|
||||
/* Any function being patched in as a hook must use SYMBOLPATCH_BEGIN at the top,
|
||||
* and SYMBOLPATCH_END before it returns (this is just for PPC). */
|
||||
|
||||
#if (defined(__PPC64__) || defined(__powerpc64__) || defined(__PPC__)) && defined(OPAL_GCC_INLINE_ASSEMBLY)
|
||||
#if (OPAL_ASSEMBLY_ARCH == OPAL_POWERPC64)
|
||||
|
||||
/* special processing for ppc64 to save and restore TOC (r2)
|
||||
* Reference: "64-bit PowerPC ELF Application Binary Interface Supplement 1.9" */
|
||||
|
Загрузка…
x
Ссылка в новой задаче
Block a user