Merge pull request #1615 from hjelmn/new_hooks_update
memory/patcher: add #if check for MREMAP_FIXED
Этот коммит содержится в:
Коммит
67fd6fa6eb
@ -84,6 +84,8 @@ AC_DEFUN([MCA_opal_memory_patcher_CONFIG],[
|
|||||||
AC_DEFINE_UNQUOTED([OPAL_MEMORY_PATCHER_HAVE___SYSCALL], [$memory_patcher_have___syscall],
|
AC_DEFINE_UNQUOTED([OPAL_MEMORY_PATCHER_HAVE___SYSCALL], [$memory_patcher_have___syscall],
|
||||||
[Whether the internal __syscall call exists])
|
[Whether the internal __syscall call exists])
|
||||||
|
|
||||||
|
AC_CHECK_HEADERS([linux/mman.h])
|
||||||
|
|
||||||
[$1]
|
[$1]
|
||||||
|
|
||||||
OPAL_VAR_SCOPE_POP
|
OPAL_VAR_SCOPE_POP
|
||||||
|
@ -43,6 +43,10 @@
|
|||||||
#include <sys/time.h>
|
#include <sys/time.h>
|
||||||
#include <sys/syscall.h>
|
#include <sys/syscall.h>
|
||||||
|
|
||||||
|
#if defined(HAVE_LINUX_MMAN_H)
|
||||||
|
#include <linux/mman.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
#include "memory_patcher.h"
|
#include "memory_patcher.h"
|
||||||
#undef opal_memory_changed
|
#undef opal_memory_changed
|
||||||
|
|
||||||
@ -162,11 +166,20 @@ static int intercept_munmap(void *start, size_t length)
|
|||||||
|
|
||||||
#if defined (SYS_mremap)
|
#if defined (SYS_mremap)
|
||||||
|
|
||||||
|
#if defined(__linux__)
|
||||||
/* on linux this function has an optional extra argument but ... can not be used here because it
|
/* on linux this function has an optional extra argument but ... can not be used here because it
|
||||||
* causes issues when intercepting a 4-argument mremap call */
|
* causes issues when intercepting a 4-argument mremap call */
|
||||||
static void *(*original_mremap) (void *, size_t, size_t, int, void *);
|
static void *(*original_mremap) (void *, size_t, size_t, int, void *);
|
||||||
|
#else
|
||||||
|
/* mremap has a different signature on BSD systems */
|
||||||
|
static void *(*original_mremap) (void *, size_t, void *, size_t, int);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(__linux__)
|
||||||
static void *intercept_mremap (void *start, size_t oldlen, size_t newlen, int flags, void *new_address)
|
static void *intercept_mremap (void *start, size_t oldlen, size_t newlen, int flags, void *new_address)
|
||||||
|
#else
|
||||||
|
static void *intercept_mremap (void *start, size_t oldlen, void *new_address, size_t newlen, int flags)
|
||||||
|
#endif
|
||||||
{
|
{
|
||||||
OPAL_PATCHER_BEGIN;
|
OPAL_PATCHER_BEGIN;
|
||||||
void *result = MAP_FAILED;
|
void *result = MAP_FAILED;
|
||||||
@ -175,15 +188,25 @@ static void *intercept_mremap (void *start, size_t oldlen, size_t newlen, int fl
|
|||||||
opal_mem_hooks_release_hook (start, oldlen, true);
|
opal_mem_hooks_release_hook (start, oldlen, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if defined(MREMAP_FIXED)
|
||||||
if (!(flags & MREMAP_FIXED)) {
|
if (!(flags & MREMAP_FIXED)) {
|
||||||
new_address = NULL;
|
new_address = NULL;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(__linux__)
|
||||||
if (!original_mremap) {
|
if (!original_mremap) {
|
||||||
result = (void *)(intptr_t) memory_patcher_syscall (SYS_mremap, start, oldlen, newlen, flags, new_address);
|
result = (void *)(intptr_t) memory_patcher_syscall (SYS_mremap, start, oldlen, newlen, flags, new_address);
|
||||||
} else {
|
} else {
|
||||||
result = original_mremap (start, oldlen, newlen, flags, new_address);
|
result = original_mremap (start, oldlen, newlen, flags, new_address);
|
||||||
}
|
}
|
||||||
|
#else
|
||||||
|
if (!original_mremap) {
|
||||||
|
result = (void *)(intptr_t) memory_patcher_syscall (SYS_mremap, start, oldlen, new_address, newlen, flags);
|
||||||
|
} else {
|
||||||
|
result = original_mremap (start, oldlen, new_address, newlen, flags);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
OPAL_PATCHER_END;
|
OPAL_PATCHER_END;
|
||||||
return result;
|
return result;
|
||||||
|
@ -105,7 +105,7 @@ static int mca_patcher_overwrite_apply_patch (mca_patcher_base_patch_t *patch)
|
|||||||
* imm64 = i << 63 | imm41 << 22 | ic << 21 | imm5c << 16 | imm9d << 7 | imm7b
|
* imm64 = i << 63 | imm41 << 22 | ic << 21 | imm5c << 16 | imm9d << 7 | imm7b
|
||||||
*/
|
*/
|
||||||
unsigned char buf[16];
|
unsigned char buf[16];
|
||||||
unsigned long long imm64 = func_new_addr - func_old_addr - 16;
|
unsigned long long imm64 = func_new_addr - patch->patch_orig - 16;
|
||||||
register unsigned long long glb_ptr __asm__("r1");
|
register unsigned long long glb_ptr __asm__("r1");
|
||||||
unsigned long long nop =
|
unsigned long long nop =
|
||||||
(0x0ULL<<37) | /* O */
|
(0x0ULL<<37) | /* O */
|
||||||
@ -133,7 +133,7 @@ static int mca_patcher_overwrite_apply_patch (mca_patcher_base_patch_t *patch)
|
|||||||
(1ULL << 6) |
|
(1ULL << 6) |
|
||||||
(0x0ULL << 0);
|
(0x0ULL << 0);
|
||||||
|
|
||||||
patch->data_size = 32;
|
patch->patch_data_size = 32;
|
||||||
|
|
||||||
make_ia64_bundle(buf, movl, (glb_ptr>>22)&0x1FFFFFFFFFFULL, nop, 5);
|
make_ia64_bundle(buf, movl, (glb_ptr>>22)&0x1FFFFFFFFFFULL, nop, 5);
|
||||||
for (int i = 0 ; i < 16 ; ++i) {
|
for (int i = 0 ; i < 16 ; ++i) {
|
||||||
|
Загрузка…
x
Ссылка в новой задаче
Block a user