mcctrl: lookup unexported symbols at runtime
Instead of parsing System.map, use kallsyms_lookup_name() to get unexported symbols addresses at module loading time. This lets mckernel work with kaslr enabled (it gets enabled by default from el7.5 onwards) Change-Id: Ie4349fc1145ebce44f37f1f40c16f9d75584074d
This commit is contained in:
committed by
Masamichi Takagi
parent
794684985f
commit
e8f8660b73
42
config.h.in
42
config.h.in
@ -54,48 +54,6 @@
|
|||||||
/* Define to 1 if you have the <unistd.h> header file. */
|
/* Define to 1 if you have the <unistd.h> header file. */
|
||||||
#undef HAVE_UNISTD_H
|
#undef HAVE_UNISTD_H
|
||||||
|
|
||||||
/* Define to address of kernel symbol __vvar_page, or 0 if exported */
|
|
||||||
#undef MCCTRL_KSYM___vvar_page
|
|
||||||
|
|
||||||
/* Define to address of kernel symbol hpet_address, or 0 if exported */
|
|
||||||
#undef MCCTRL_KSYM_hpet_address
|
|
||||||
|
|
||||||
/* Define to address of kernel symbol hv_clock, or 0 if exported */
|
|
||||||
#undef MCCTRL_KSYM_hv_clock
|
|
||||||
|
|
||||||
/* Define to address of kernel symbol sys_mount, or 0 if exported */
|
|
||||||
#undef MCCTRL_KSYM_sys_mount
|
|
||||||
|
|
||||||
/* Define to address of kernel symbol sys_readlink, or 0 if exported */
|
|
||||||
#undef MCCTRL_KSYM_sys_readlink
|
|
||||||
|
|
||||||
/* Define to address of kernel symbol sys_umount, or 0 if exported */
|
|
||||||
#undef MCCTRL_KSYM_sys_umount
|
|
||||||
|
|
||||||
/* Define to address of kernel symbol sys_unshare, or 0 if exported */
|
|
||||||
#undef MCCTRL_KSYM_sys_unshare
|
|
||||||
|
|
||||||
/* Define to address of kernel symbol vdso_end, or 0 if exported */
|
|
||||||
#undef MCCTRL_KSYM_vdso_end
|
|
||||||
|
|
||||||
/* Define to address of kernel symbol vdso_image_64, or 0 if exported */
|
|
||||||
#undef MCCTRL_KSYM_vdso_image_64
|
|
||||||
|
|
||||||
/* Define to address of kernel symbol vdso_pages, or 0 if exported */
|
|
||||||
#undef MCCTRL_KSYM_vdso_pages
|
|
||||||
|
|
||||||
/* Define to address of kernel symbol vdso_spec, or 0 if exported */
|
|
||||||
#undef MCCTRL_KSYM_vdso_spec
|
|
||||||
|
|
||||||
/* Define to address of kernel symbol vdso_start, or 0 if exported */
|
|
||||||
#undef MCCTRL_KSYM_vdso_start
|
|
||||||
|
|
||||||
/* Define to address of kernel symbol walk_page_range, or 0 if exported */
|
|
||||||
#undef MCCTRL_KSYM_walk_page_range
|
|
||||||
|
|
||||||
/* Define to address of kernel symbol zap_page_range, or 0 if exported */
|
|
||||||
#undef MCCTRL_KSYM_zap_page_range
|
|
||||||
|
|
||||||
/* McKernel specific headers */
|
/* McKernel specific headers */
|
||||||
#undef MCKERNEL_INCDIR
|
#undef MCKERNEL_INCDIR
|
||||||
|
|
||||||
|
|||||||
393
configure
vendored
393
configure
vendored
@ -4396,399 +4396,6 @@ KDIR="$WITH_KERNELSRC"
|
|||||||
UNAME_R="$WITH_UNAME_R"
|
UNAME_R="$WITH_UNAME_R"
|
||||||
TARGET="$WITH_TARGET"
|
TARGET="$WITH_TARGET"
|
||||||
|
|
||||||
MCCTRL_LINUX_SYMTAB=""
|
|
||||||
case "X$WITH_SYSTEM_MAP" in
|
|
||||||
Xyes | Xno | X)
|
|
||||||
MCCTRL_LINUX_SYMTAB=""
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
MCCTRL_LINUX_SYMTAB="$WITH_SYSTEM_MAP"
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for System.map" >&5
|
|
||||||
$as_echo_n "checking for System.map... " >&6; }
|
|
||||||
if test -r "$MCCTRL_LINUX_SYMTAB"; then
|
|
||||||
MCCTRL_LINUX_SYMTAB="$MCCTRL_LINUX_SYMTAB"
|
|
||||||
elif test -r "/boot/System.map-`uname -r`"; then
|
|
||||||
MCCTRL_LINUX_SYMTAB="/boot/System.map-`uname -r`"
|
|
||||||
elif test -r "$KDIR/System.map"; then
|
|
||||||
MCCTRL_LINUX_SYMTAB="$KDIR/System.map"
|
|
||||||
fi
|
|
||||||
|
|
||||||
if test "$MCCTRL_LINUX_SYMTAB" == ""; then
|
|
||||||
as_fn_error $? "could not find" "$LINENO" 5
|
|
||||||
fi
|
|
||||||
|
|
||||||
if test -z "`eval cat $MCCTRL_LINUX_SYMTAB`"; then
|
|
||||||
as_fn_error $? "could not read System.map file, no read permission?" "$LINENO" 5
|
|
||||||
fi
|
|
||||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $MCCTRL_LINUX_SYMTAB" >&5
|
|
||||||
$as_echo "$MCCTRL_LINUX_SYMTAB" >&6; }
|
|
||||||
|
|
||||||
MCCTRL_LINUX_SYMTAB_CMD="cat $MCCTRL_LINUX_SYMTAB"
|
|
||||||
|
|
||||||
# MCCTRL_FIND_KSYM(SYMBOL)
|
|
||||||
# ------------------------------------------------------
|
|
||||||
# Search System.map for address of the given symbol and
|
|
||||||
# do one of three things in config.h:
|
|
||||||
# If not found, leave MCCTRL_KSYM_foo undefined
|
|
||||||
# If found to be exported, "#define MCCTRL_KSYM_foo 0"
|
|
||||||
# If found not to be exported, "#define MCCTRL_KSYM_foo 0x<value>"
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking System.map for symbol sys_mount" >&5
|
|
||||||
$as_echo_n "checking System.map for symbol sys_mount... " >&6; }
|
|
||||||
mcctrl_addr=`eval $MCCTRL_LINUX_SYMTAB_CMD | grep " sys_mount\$" | cut -d\ -f1`
|
|
||||||
if test -z $mcctrl_addr; then
|
|
||||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: not found" >&5
|
|
||||||
$as_echo "not found" >&6; }
|
|
||||||
else
|
|
||||||
mcctrl_result=$mcctrl_addr
|
|
||||||
mcctrl_addr="0x$mcctrl_addr"
|
|
||||||
|
|
||||||
if `eval $MCCTRL_LINUX_SYMTAB_CMD | grep " __ksymtab_sys_mount\$" >/dev/null`; then
|
|
||||||
mcctrl_result="exported"
|
|
||||||
mcctrl_addr="0"
|
|
||||||
fi
|
|
||||||
|
|
||||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $mcctrl_result" >&5
|
|
||||||
$as_echo "$mcctrl_result" >&6; }
|
|
||||||
|
|
||||||
cat >>confdefs.h <<_ACEOF
|
|
||||||
#define MCCTRL_KSYM_sys_mount $mcctrl_addr
|
|
||||||
_ACEOF
|
|
||||||
|
|
||||||
fi
|
|
||||||
|
|
||||||
|
|
||||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking System.map for symbol sys_umount" >&5
|
|
||||||
$as_echo_n "checking System.map for symbol sys_umount... " >&6; }
|
|
||||||
mcctrl_addr=`eval $MCCTRL_LINUX_SYMTAB_CMD | grep " sys_umount\$" | cut -d\ -f1`
|
|
||||||
if test -z $mcctrl_addr; then
|
|
||||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: not found" >&5
|
|
||||||
$as_echo "not found" >&6; }
|
|
||||||
else
|
|
||||||
mcctrl_result=$mcctrl_addr
|
|
||||||
mcctrl_addr="0x$mcctrl_addr"
|
|
||||||
|
|
||||||
if `eval $MCCTRL_LINUX_SYMTAB_CMD | grep " __ksymtab_sys_umount\$" >/dev/null`; then
|
|
||||||
mcctrl_result="exported"
|
|
||||||
mcctrl_addr="0"
|
|
||||||
fi
|
|
||||||
|
|
||||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $mcctrl_result" >&5
|
|
||||||
$as_echo "$mcctrl_result" >&6; }
|
|
||||||
|
|
||||||
cat >>confdefs.h <<_ACEOF
|
|
||||||
#define MCCTRL_KSYM_sys_umount $mcctrl_addr
|
|
||||||
_ACEOF
|
|
||||||
|
|
||||||
fi
|
|
||||||
|
|
||||||
|
|
||||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking System.map for symbol sys_unshare" >&5
|
|
||||||
$as_echo_n "checking System.map for symbol sys_unshare... " >&6; }
|
|
||||||
mcctrl_addr=`eval $MCCTRL_LINUX_SYMTAB_CMD | grep " sys_unshare\$" | cut -d\ -f1`
|
|
||||||
if test -z $mcctrl_addr; then
|
|
||||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: not found" >&5
|
|
||||||
$as_echo "not found" >&6; }
|
|
||||||
else
|
|
||||||
mcctrl_result=$mcctrl_addr
|
|
||||||
mcctrl_addr="0x$mcctrl_addr"
|
|
||||||
|
|
||||||
if `eval $MCCTRL_LINUX_SYMTAB_CMD | grep " __ksymtab_sys_unshare\$" >/dev/null`; then
|
|
||||||
mcctrl_result="exported"
|
|
||||||
mcctrl_addr="0"
|
|
||||||
fi
|
|
||||||
|
|
||||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $mcctrl_result" >&5
|
|
||||||
$as_echo "$mcctrl_result" >&6; }
|
|
||||||
|
|
||||||
cat >>confdefs.h <<_ACEOF
|
|
||||||
#define MCCTRL_KSYM_sys_unshare $mcctrl_addr
|
|
||||||
_ACEOF
|
|
||||||
|
|
||||||
fi
|
|
||||||
|
|
||||||
|
|
||||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking System.map for symbol zap_page_range" >&5
|
|
||||||
$as_echo_n "checking System.map for symbol zap_page_range... " >&6; }
|
|
||||||
mcctrl_addr=`eval $MCCTRL_LINUX_SYMTAB_CMD | grep " zap_page_range\$" | cut -d\ -f1`
|
|
||||||
if test -z $mcctrl_addr; then
|
|
||||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: not found" >&5
|
|
||||||
$as_echo "not found" >&6; }
|
|
||||||
else
|
|
||||||
mcctrl_result=$mcctrl_addr
|
|
||||||
mcctrl_addr="0x$mcctrl_addr"
|
|
||||||
|
|
||||||
if `eval $MCCTRL_LINUX_SYMTAB_CMD | grep " __ksymtab_zap_page_range\$" >/dev/null`; then
|
|
||||||
mcctrl_result="exported"
|
|
||||||
mcctrl_addr="0"
|
|
||||||
fi
|
|
||||||
|
|
||||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $mcctrl_result" >&5
|
|
||||||
$as_echo "$mcctrl_result" >&6; }
|
|
||||||
|
|
||||||
cat >>confdefs.h <<_ACEOF
|
|
||||||
#define MCCTRL_KSYM_zap_page_range $mcctrl_addr
|
|
||||||
_ACEOF
|
|
||||||
|
|
||||||
fi
|
|
||||||
|
|
||||||
|
|
||||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking System.map for symbol vdso_image_64" >&5
|
|
||||||
$as_echo_n "checking System.map for symbol vdso_image_64... " >&6; }
|
|
||||||
mcctrl_addr=`eval $MCCTRL_LINUX_SYMTAB_CMD | grep " vdso_image_64\$" | cut -d\ -f1`
|
|
||||||
if test -z $mcctrl_addr; then
|
|
||||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: not found" >&5
|
|
||||||
$as_echo "not found" >&6; }
|
|
||||||
else
|
|
||||||
mcctrl_result=$mcctrl_addr
|
|
||||||
mcctrl_addr="0x$mcctrl_addr"
|
|
||||||
|
|
||||||
if `eval $MCCTRL_LINUX_SYMTAB_CMD | grep " __ksymtab_vdso_image_64\$" >/dev/null`; then
|
|
||||||
mcctrl_result="exported"
|
|
||||||
mcctrl_addr="0"
|
|
||||||
fi
|
|
||||||
|
|
||||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $mcctrl_result" >&5
|
|
||||||
$as_echo "$mcctrl_result" >&6; }
|
|
||||||
|
|
||||||
cat >>confdefs.h <<_ACEOF
|
|
||||||
#define MCCTRL_KSYM_vdso_image_64 $mcctrl_addr
|
|
||||||
_ACEOF
|
|
||||||
|
|
||||||
fi
|
|
||||||
|
|
||||||
|
|
||||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking System.map for symbol vdso_start" >&5
|
|
||||||
$as_echo_n "checking System.map for symbol vdso_start... " >&6; }
|
|
||||||
mcctrl_addr=`eval $MCCTRL_LINUX_SYMTAB_CMD | grep " vdso_start\$" | cut -d\ -f1`
|
|
||||||
if test -z $mcctrl_addr; then
|
|
||||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: not found" >&5
|
|
||||||
$as_echo "not found" >&6; }
|
|
||||||
else
|
|
||||||
mcctrl_result=$mcctrl_addr
|
|
||||||
mcctrl_addr="0x$mcctrl_addr"
|
|
||||||
|
|
||||||
if `eval $MCCTRL_LINUX_SYMTAB_CMD | grep " __ksymtab_vdso_start\$" >/dev/null`; then
|
|
||||||
mcctrl_result="exported"
|
|
||||||
mcctrl_addr="0"
|
|
||||||
fi
|
|
||||||
|
|
||||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $mcctrl_result" >&5
|
|
||||||
$as_echo "$mcctrl_result" >&6; }
|
|
||||||
|
|
||||||
cat >>confdefs.h <<_ACEOF
|
|
||||||
#define MCCTRL_KSYM_vdso_start $mcctrl_addr
|
|
||||||
_ACEOF
|
|
||||||
|
|
||||||
fi
|
|
||||||
|
|
||||||
|
|
||||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking System.map for symbol vdso_end" >&5
|
|
||||||
$as_echo_n "checking System.map for symbol vdso_end... " >&6; }
|
|
||||||
mcctrl_addr=`eval $MCCTRL_LINUX_SYMTAB_CMD | grep " vdso_end\$" | cut -d\ -f1`
|
|
||||||
if test -z $mcctrl_addr; then
|
|
||||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: not found" >&5
|
|
||||||
$as_echo "not found" >&6; }
|
|
||||||
else
|
|
||||||
mcctrl_result=$mcctrl_addr
|
|
||||||
mcctrl_addr="0x$mcctrl_addr"
|
|
||||||
|
|
||||||
if `eval $MCCTRL_LINUX_SYMTAB_CMD | grep " __ksymtab_vdso_end\$" >/dev/null`; then
|
|
||||||
mcctrl_result="exported"
|
|
||||||
mcctrl_addr="0"
|
|
||||||
fi
|
|
||||||
|
|
||||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $mcctrl_result" >&5
|
|
||||||
$as_echo "$mcctrl_result" >&6; }
|
|
||||||
|
|
||||||
cat >>confdefs.h <<_ACEOF
|
|
||||||
#define MCCTRL_KSYM_vdso_end $mcctrl_addr
|
|
||||||
_ACEOF
|
|
||||||
|
|
||||||
fi
|
|
||||||
|
|
||||||
|
|
||||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking System.map for symbol vdso_pages" >&5
|
|
||||||
$as_echo_n "checking System.map for symbol vdso_pages... " >&6; }
|
|
||||||
mcctrl_addr=`eval $MCCTRL_LINUX_SYMTAB_CMD | grep " vdso_pages\$" | cut -d\ -f1`
|
|
||||||
if test -z $mcctrl_addr; then
|
|
||||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: not found" >&5
|
|
||||||
$as_echo "not found" >&6; }
|
|
||||||
else
|
|
||||||
mcctrl_result=$mcctrl_addr
|
|
||||||
mcctrl_addr="0x$mcctrl_addr"
|
|
||||||
|
|
||||||
if `eval $MCCTRL_LINUX_SYMTAB_CMD | grep " __ksymtab_vdso_pages\$" >/dev/null`; then
|
|
||||||
mcctrl_result="exported"
|
|
||||||
mcctrl_addr="0"
|
|
||||||
fi
|
|
||||||
|
|
||||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $mcctrl_result" >&5
|
|
||||||
$as_echo "$mcctrl_result" >&6; }
|
|
||||||
|
|
||||||
cat >>confdefs.h <<_ACEOF
|
|
||||||
#define MCCTRL_KSYM_vdso_pages $mcctrl_addr
|
|
||||||
_ACEOF
|
|
||||||
|
|
||||||
fi
|
|
||||||
|
|
||||||
|
|
||||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking System.map for symbol __vvar_page" >&5
|
|
||||||
$as_echo_n "checking System.map for symbol __vvar_page... " >&6; }
|
|
||||||
mcctrl_addr=`eval $MCCTRL_LINUX_SYMTAB_CMD | grep " __vvar_page\$" | cut -d\ -f1`
|
|
||||||
if test -z $mcctrl_addr; then
|
|
||||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: not found" >&5
|
|
||||||
$as_echo "not found" >&6; }
|
|
||||||
else
|
|
||||||
mcctrl_result=$mcctrl_addr
|
|
||||||
mcctrl_addr="0x$mcctrl_addr"
|
|
||||||
|
|
||||||
if `eval $MCCTRL_LINUX_SYMTAB_CMD | grep " __ksymtab___vvar_page\$" >/dev/null`; then
|
|
||||||
mcctrl_result="exported"
|
|
||||||
mcctrl_addr="0"
|
|
||||||
fi
|
|
||||||
|
|
||||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $mcctrl_result" >&5
|
|
||||||
$as_echo "$mcctrl_result" >&6; }
|
|
||||||
|
|
||||||
cat >>confdefs.h <<_ACEOF
|
|
||||||
#define MCCTRL_KSYM___vvar_page $mcctrl_addr
|
|
||||||
_ACEOF
|
|
||||||
|
|
||||||
fi
|
|
||||||
|
|
||||||
|
|
||||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking System.map for symbol hpet_address" >&5
|
|
||||||
$as_echo_n "checking System.map for symbol hpet_address... " >&6; }
|
|
||||||
mcctrl_addr=`eval $MCCTRL_LINUX_SYMTAB_CMD | grep " hpet_address\$" | cut -d\ -f1`
|
|
||||||
if test -z $mcctrl_addr; then
|
|
||||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: not found" >&5
|
|
||||||
$as_echo "not found" >&6; }
|
|
||||||
else
|
|
||||||
mcctrl_result=$mcctrl_addr
|
|
||||||
mcctrl_addr="0x$mcctrl_addr"
|
|
||||||
|
|
||||||
if `eval $MCCTRL_LINUX_SYMTAB_CMD | grep " __ksymtab_hpet_address\$" >/dev/null`; then
|
|
||||||
mcctrl_result="exported"
|
|
||||||
mcctrl_addr="0"
|
|
||||||
fi
|
|
||||||
|
|
||||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $mcctrl_result" >&5
|
|
||||||
$as_echo "$mcctrl_result" >&6; }
|
|
||||||
|
|
||||||
cat >>confdefs.h <<_ACEOF
|
|
||||||
#define MCCTRL_KSYM_hpet_address $mcctrl_addr
|
|
||||||
_ACEOF
|
|
||||||
|
|
||||||
fi
|
|
||||||
|
|
||||||
# POSTK_DEBUG_ARCH_DEP_50, add:find kernel symbol.
|
|
||||||
|
|
||||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking System.map for symbol vdso_spec" >&5
|
|
||||||
$as_echo_n "checking System.map for symbol vdso_spec... " >&6; }
|
|
||||||
mcctrl_addr=`eval $MCCTRL_LINUX_SYMTAB_CMD | grep " vdso_spec\$" | cut -d\ -f1`
|
|
||||||
if test -z $mcctrl_addr; then
|
|
||||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: not found" >&5
|
|
||||||
$as_echo "not found" >&6; }
|
|
||||||
else
|
|
||||||
mcctrl_result=$mcctrl_addr
|
|
||||||
mcctrl_addr="0x$mcctrl_addr"
|
|
||||||
|
|
||||||
if `eval $MCCTRL_LINUX_SYMTAB_CMD | grep " __ksymtab_vdso_spec\$" >/dev/null`; then
|
|
||||||
mcctrl_result="exported"
|
|
||||||
mcctrl_addr="0"
|
|
||||||
fi
|
|
||||||
|
|
||||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $mcctrl_result" >&5
|
|
||||||
$as_echo "$mcctrl_result" >&6; }
|
|
||||||
|
|
||||||
cat >>confdefs.h <<_ACEOF
|
|
||||||
#define MCCTRL_KSYM_vdso_spec $mcctrl_addr
|
|
||||||
_ACEOF
|
|
||||||
|
|
||||||
fi
|
|
||||||
|
|
||||||
|
|
||||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking System.map for symbol hv_clock" >&5
|
|
||||||
$as_echo_n "checking System.map for symbol hv_clock... " >&6; }
|
|
||||||
mcctrl_addr=`eval $MCCTRL_LINUX_SYMTAB_CMD | grep " hv_clock\$" | cut -d\ -f1`
|
|
||||||
if test -z $mcctrl_addr; then
|
|
||||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: not found" >&5
|
|
||||||
$as_echo "not found" >&6; }
|
|
||||||
else
|
|
||||||
mcctrl_result=$mcctrl_addr
|
|
||||||
mcctrl_addr="0x$mcctrl_addr"
|
|
||||||
|
|
||||||
if `eval $MCCTRL_LINUX_SYMTAB_CMD | grep " __ksymtab_hv_clock\$" >/dev/null`; then
|
|
||||||
mcctrl_result="exported"
|
|
||||||
mcctrl_addr="0"
|
|
||||||
fi
|
|
||||||
|
|
||||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $mcctrl_result" >&5
|
|
||||||
$as_echo "$mcctrl_result" >&6; }
|
|
||||||
|
|
||||||
cat >>confdefs.h <<_ACEOF
|
|
||||||
#define MCCTRL_KSYM_hv_clock $mcctrl_addr
|
|
||||||
_ACEOF
|
|
||||||
|
|
||||||
fi
|
|
||||||
|
|
||||||
|
|
||||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking System.map for symbol sys_readlink" >&5
|
|
||||||
$as_echo_n "checking System.map for symbol sys_readlink... " >&6; }
|
|
||||||
mcctrl_addr=`eval $MCCTRL_LINUX_SYMTAB_CMD | grep " sys_readlink\$" | cut -d\ -f1`
|
|
||||||
if test -z $mcctrl_addr; then
|
|
||||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: not found" >&5
|
|
||||||
$as_echo "not found" >&6; }
|
|
||||||
else
|
|
||||||
mcctrl_result=$mcctrl_addr
|
|
||||||
mcctrl_addr="0x$mcctrl_addr"
|
|
||||||
|
|
||||||
if `eval $MCCTRL_LINUX_SYMTAB_CMD | grep " __ksymtab_sys_readlink\$" >/dev/null`; then
|
|
||||||
mcctrl_result="exported"
|
|
||||||
mcctrl_addr="0"
|
|
||||||
fi
|
|
||||||
|
|
||||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $mcctrl_result" >&5
|
|
||||||
$as_echo "$mcctrl_result" >&6; }
|
|
||||||
|
|
||||||
cat >>confdefs.h <<_ACEOF
|
|
||||||
#define MCCTRL_KSYM_sys_readlink $mcctrl_addr
|
|
||||||
_ACEOF
|
|
||||||
|
|
||||||
fi
|
|
||||||
|
|
||||||
|
|
||||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking System.map for symbol walk_page_range" >&5
|
|
||||||
$as_echo_n "checking System.map for symbol walk_page_range... " >&6; }
|
|
||||||
mcctrl_addr=`eval $MCCTRL_LINUX_SYMTAB_CMD | grep " walk_page_range\$" | cut -d\ -f1`
|
|
||||||
if test -z $mcctrl_addr; then
|
|
||||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: not found" >&5
|
|
||||||
$as_echo "not found" >&6; }
|
|
||||||
else
|
|
||||||
mcctrl_result=$mcctrl_addr
|
|
||||||
mcctrl_addr="0x$mcctrl_addr"
|
|
||||||
|
|
||||||
if `eval $MCCTRL_LINUX_SYMTAB_CMD | grep " __ksymtab_walk_page_range\$" >/dev/null`; then
|
|
||||||
mcctrl_result="exported"
|
|
||||||
mcctrl_addr="0"
|
|
||||||
fi
|
|
||||||
|
|
||||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $mcctrl_result" >&5
|
|
||||||
$as_echo "$mcctrl_result" >&6; }
|
|
||||||
|
|
||||||
cat >>confdefs.h <<_ACEOF
|
|
||||||
#define MCCTRL_KSYM_walk_page_range $mcctrl_addr
|
|
||||||
_ACEOF
|
|
||||||
|
|
||||||
fi
|
|
||||||
|
|
||||||
|
|
||||||
case $ENABLE_MEMDUMP in
|
case $ENABLE_MEMDUMP in
|
||||||
yes|no|auto)
|
yes|no|auto)
|
||||||
;;
|
;;
|
||||||
|
|||||||
72
configure.ac
72
configure.ac
@ -339,78 +339,6 @@ KDIR="$WITH_KERNELSRC"
|
|||||||
UNAME_R="$WITH_UNAME_R"
|
UNAME_R="$WITH_UNAME_R"
|
||||||
TARGET="$WITH_TARGET"
|
TARGET="$WITH_TARGET"
|
||||||
|
|
||||||
MCCTRL_LINUX_SYMTAB=""
|
|
||||||
case "X$WITH_SYSTEM_MAP" in
|
|
||||||
Xyes | Xno | X)
|
|
||||||
MCCTRL_LINUX_SYMTAB=""
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
MCCTRL_LINUX_SYMTAB="$WITH_SYSTEM_MAP"
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
AC_MSG_CHECKING([[for System.map]])
|
|
||||||
if test -r "$MCCTRL_LINUX_SYMTAB"; then
|
|
||||||
MCCTRL_LINUX_SYMTAB="$MCCTRL_LINUX_SYMTAB"
|
|
||||||
elif test -r "/boot/System.map-`uname -r`"; then
|
|
||||||
MCCTRL_LINUX_SYMTAB="/boot/System.map-`uname -r`"
|
|
||||||
elif test -r "$KDIR/System.map"; then
|
|
||||||
MCCTRL_LINUX_SYMTAB="$KDIR/System.map"
|
|
||||||
fi
|
|
||||||
|
|
||||||
if test "$MCCTRL_LINUX_SYMTAB" == ""; then
|
|
||||||
AC_MSG_ERROR([could not find])
|
|
||||||
fi
|
|
||||||
|
|
||||||
if test -z "`eval cat $MCCTRL_LINUX_SYMTAB`"; then
|
|
||||||
AC_MSG_ERROR([could not read System.map file, no read permission?])
|
|
||||||
fi
|
|
||||||
AC_MSG_RESULT([$MCCTRL_LINUX_SYMTAB])
|
|
||||||
|
|
||||||
MCCTRL_LINUX_SYMTAB_CMD="cat $MCCTRL_LINUX_SYMTAB"
|
|
||||||
|
|
||||||
# MCCTRL_FIND_KSYM(SYMBOL)
|
|
||||||
# ------------------------------------------------------
|
|
||||||
# Search System.map for address of the given symbol and
|
|
||||||
# do one of three things in config.h:
|
|
||||||
# If not found, leave MCCTRL_KSYM_foo undefined
|
|
||||||
# If found to be exported, "#define MCCTRL_KSYM_foo 0"
|
|
||||||
# If found not to be exported, "#define MCCTRL_KSYM_foo 0x<value>"
|
|
||||||
AC_DEFUN([MCCTRL_FIND_KSYM],[
|
|
||||||
AC_MSG_CHECKING([[System.map for symbol $1]])
|
|
||||||
mcctrl_addr=`eval $MCCTRL_LINUX_SYMTAB_CMD | grep " $1\$" | cut -d\ -f1`
|
|
||||||
if test -z $mcctrl_addr; then
|
|
||||||
AC_MSG_RESULT([not found])
|
|
||||||
else
|
|
||||||
mcctrl_result=$mcctrl_addr
|
|
||||||
mcctrl_addr="0x$mcctrl_addr"
|
|
||||||
m4_ifval([$2],[],[
|
|
||||||
if `eval $MCCTRL_LINUX_SYMTAB_CMD | grep " __ksymtab_$1\$" >/dev/null`; then
|
|
||||||
mcctrl_result="exported"
|
|
||||||
mcctrl_addr="0"
|
|
||||||
fi
|
|
||||||
])
|
|
||||||
AC_MSG_RESULT([$mcctrl_result])
|
|
||||||
AC_DEFINE_UNQUOTED(MCCTRL_KSYM_[]$1,$mcctrl_addr,[Define to address of kernel symbol $1, or 0 if exported])
|
|
||||||
fi
|
|
||||||
])
|
|
||||||
|
|
||||||
MCCTRL_FIND_KSYM([sys_mount])
|
|
||||||
MCCTRL_FIND_KSYM([sys_umount])
|
|
||||||
MCCTRL_FIND_KSYM([sys_unshare])
|
|
||||||
MCCTRL_FIND_KSYM([zap_page_range])
|
|
||||||
MCCTRL_FIND_KSYM([vdso_image_64])
|
|
||||||
MCCTRL_FIND_KSYM([vdso_start])
|
|
||||||
MCCTRL_FIND_KSYM([vdso_end])
|
|
||||||
MCCTRL_FIND_KSYM([vdso_pages])
|
|
||||||
MCCTRL_FIND_KSYM([__vvar_page])
|
|
||||||
MCCTRL_FIND_KSYM([hpet_address])
|
|
||||||
# POSTK_DEBUG_ARCH_DEP_50, add:find kernel symbol.
|
|
||||||
MCCTRL_FIND_KSYM([vdso_spec])
|
|
||||||
MCCTRL_FIND_KSYM([hv_clock])
|
|
||||||
MCCTRL_FIND_KSYM([sys_readlink])
|
|
||||||
MCCTRL_FIND_KSYM([walk_page_range])
|
|
||||||
|
|
||||||
case $ENABLE_MEMDUMP in
|
case $ENABLE_MEMDUMP in
|
||||||
yes|no|auto)
|
yes|no|auto)
|
||||||
;;
|
;;
|
||||||
|
|||||||
@ -1,6 +1,7 @@
|
|||||||
/* archdeps.c COPYRIGHT FUJITSU LIMITED 2016 */
|
/* archdeps.c COPYRIGHT FUJITSU LIMITED 2016 */
|
||||||
#include <linux/version.h>
|
#include <linux/version.h>
|
||||||
#include <linux/mm_types.h>
|
#include <linux/mm_types.h>
|
||||||
|
#include <linux/kallsyms.h>
|
||||||
#include <asm/vdso.h>
|
#include <asm/vdso.h>
|
||||||
#include "../../../config.h"
|
#include "../../../config.h"
|
||||||
#include "../../mcctrl.h"
|
#include "../../mcctrl.h"
|
||||||
@ -17,29 +18,31 @@
|
|||||||
|
|
||||||
#define D(fmt, ...) printk("%s(%d) " fmt, __func__, __LINE__, ##__VA_ARGS__)
|
#define D(fmt, ...) printk("%s(%d) " fmt, __func__, __LINE__, ##__VA_ARGS__)
|
||||||
|
|
||||||
#ifdef MCCTRL_KSYM_vdso_start
|
#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 0, 0)
|
||||||
# if MCCTRL_KSYM_vdso_start
|
void *vdso_start;
|
||||||
void *vdso_start = (void *)MCCTRL_KSYM_vdso_start;
|
void *vdso_end;
|
||||||
# endif
|
static struct vm_special_mapping (*vdso_spec)[2];
|
||||||
#else
|
|
||||||
# error missing address of vdso_start.
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef MCCTRL_KSYM_vdso_end
|
int arch_symbols_init(void)
|
||||||
# if MCCTRL_KSYM_vdso_end
|
{
|
||||||
void *vdso_end = (void *)MCCTRL_KSYM_vdso_end;
|
#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 0, 0)
|
||||||
# endif
|
vdso_start = (void *) kallsyms_lookup_name("vdso_start");
|
||||||
#else
|
if (WARN_ON(!vdso_start))
|
||||||
# error missing address of vdso_end.
|
return -EFAULT;
|
||||||
|
|
||||||
|
vdso_end = (void *) kallsyms_lookup_name("vdso_end");
|
||||||
|
if (WARN_ON(!vdso_end))
|
||||||
|
return -EFAULT;
|
||||||
|
|
||||||
|
vdso_spec = (void *) kallsyms_lookup_name("vdso_spec");
|
||||||
|
if (WARN_ON(!vdso_spec))
|
||||||
|
return -EFAULT;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef MCCTRL_KSYM_vdso_spec
|
return 0;
|
||||||
# if MCCTRL_KSYM_vdso_spec
|
}
|
||||||
static struct vm_special_mapping (*vdso_spec)[2] = (void*)MCCTRL_KSYM_vdso_spec;
|
|
||||||
# endif
|
|
||||||
#else
|
|
||||||
# error missing address of vdso_spec.
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef POSTK_DEBUG_ARCH_DEP_52
|
#ifdef POSTK_DEBUG_ARCH_DEP_52
|
||||||
#define VDSO_MAXPAGES 1
|
#define VDSO_MAXPAGES 1
|
||||||
|
|||||||
@ -1,5 +1,6 @@
|
|||||||
/* archdeps.c COPYRIGHT FUJITSU LIMITED 2016 */
|
/* archdeps.c COPYRIGHT FUJITSU LIMITED 2016 */
|
||||||
#include <linux/version.h>
|
#include <linux/version.h>
|
||||||
|
#include <linux/kallsyms.h>
|
||||||
#include "../../../config.h"
|
#include "../../../config.h"
|
||||||
#include "../../mcctrl.h"
|
#include "../../mcctrl.h"
|
||||||
|
|
||||||
@ -13,57 +14,46 @@
|
|||||||
#endif
|
#endif
|
||||||
#endif /* POSTK_DEBUG_ARCH_DEP_83 */
|
#endif /* POSTK_DEBUG_ARCH_DEP_83 */
|
||||||
|
|
||||||
#ifdef MCCTRL_KSYM_vdso_image_64
|
#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 16, 0)
|
||||||
#if MCCTRL_KSYM_vdso_image_64
|
static struct vdso_image *vdso_image_64;
|
||||||
struct vdso_image *vdso_image = (void *)MCCTRL_KSYM_vdso_image_64;
|
#elif LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 23)
|
||||||
|
static void *vdso_start;
|
||||||
|
static void *vdso_end;
|
||||||
|
static struct page **vdso_pages;
|
||||||
#endif
|
#endif
|
||||||
|
static void *__vvar_page;
|
||||||
|
static long *hpet_address;
|
||||||
|
static void **hv_clock;
|
||||||
|
|
||||||
|
int arch_symbols_init(void)
|
||||||
|
{
|
||||||
|
#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 16, 0)
|
||||||
|
vdso_image_64 = (void *) kallsyms_lookup_name("vdso_image_64");
|
||||||
|
if (WARN_ON(!vdso_image_64))
|
||||||
|
return -EFAULT;
|
||||||
|
#elif LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 23)
|
||||||
|
vdso_start = (void *) kallsyms_lookup_name("vdso_start");
|
||||||
|
if (WARN_ON(!vdso_start))
|
||||||
|
return -EFAULT;
|
||||||
|
|
||||||
|
vdso_end = (void *) kallsyms_lookup_name("vdso_end");
|
||||||
|
if (WARN_ON(!vdso_end))
|
||||||
|
return -EFAULT;
|
||||||
|
|
||||||
|
vdso_pages = (void *) kallsyms_lookup_name("vdso_pages");
|
||||||
|
if (WARN_ON(!vdso_pages))
|
||||||
|
return -EFAULT;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef MCCTRL_KSYM_vdso_start
|
__vvar_page = (void *) kallsyms_lookup_name("__vvar_page");
|
||||||
#if MCCTRL_KSYM_vdso_start
|
if (WARN_ON(!__vvar_page))
|
||||||
void *vdso_start = (void *)MCCTRL_KSYM_vdso_start;
|
return -EFAULT;
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef MCCTRL_KSYM_vdso_end
|
hpet_address = (void *) kallsyms_lookup_name("hpet_address");
|
||||||
#if MCCTRL_KSYM_vdso_end
|
hv_clock = (void *) kallsyms_lookup_name("hv_clock");
|
||||||
void *vdso_end = (void *)MCCTRL_KSYM_vdso_end;
|
return 0;
|
||||||
#endif
|
}
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef MCCTRL_KSYM_vdso_pages
|
|
||||||
#if MCCTRL_KSYM_vdso_pages
|
|
||||||
struct page **vdso_pages = (void *)MCCTRL_KSYM_vdso_pages;
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef MCCTRL_KSYM___vvar_page
|
|
||||||
#if MCCTRL_KSYM___vvar_page
|
|
||||||
void *__vvar_page = (void *)MCCTRL_KSYM___vvar_page;
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
long *hpet_addressp
|
|
||||||
#ifdef MCCTRL_KSYM_hpet_address
|
|
||||||
#if MCCTRL_KSYM_hpet_address
|
|
||||||
= (void *)MCCTRL_KSYM_hpet_address;
|
|
||||||
#else
|
|
||||||
= &hpet_address;
|
|
||||||
#endif
|
|
||||||
#else
|
|
||||||
= NULL;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
void **hv_clockp
|
|
||||||
#ifdef MCCTRL_KSYM_hv_clock
|
|
||||||
#if MCCTRL_KSYM_hv_clock
|
|
||||||
= (void *)MCCTRL_KSYM_hv_clock;
|
|
||||||
#else
|
|
||||||
= &hv_clock;
|
|
||||||
#endif
|
|
||||||
#else
|
|
||||||
= NULL;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef POSTK_DEBUG_ARCH_DEP_52
|
#ifdef POSTK_DEBUG_ARCH_DEP_52
|
||||||
#define VDSO_MAXPAGES 2
|
#define VDSO_MAXPAGES 2
|
||||||
@ -138,7 +128,7 @@ void get_vdso_info(ihk_os_t os, long vdso_rpa)
|
|||||||
|
|
||||||
/* VDSO pages */
|
/* VDSO pages */
|
||||||
#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,16,0)
|
#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,16,0)
|
||||||
size = vdso_image->size;
|
size = vdso_image_64->size;
|
||||||
vdso->vdso_npages = size >> PAGE_SHIFT;
|
vdso->vdso_npages = size >> PAGE_SHIFT;
|
||||||
|
|
||||||
if (vdso->vdso_npages > VDSO_MAXPAGES) {
|
if (vdso->vdso_npages > VDSO_MAXPAGES) {
|
||||||
@ -148,7 +138,7 @@ void get_vdso_info(ihk_os_t os, long vdso_rpa)
|
|||||||
|
|
||||||
for (i = 0; i < vdso->vdso_npages; ++i) {
|
for (i = 0; i < vdso->vdso_npages; ++i) {
|
||||||
vdso->vdso_physlist[i] = virt_to_phys(
|
vdso->vdso_physlist[i] = virt_to_phys(
|
||||||
vdso_image->data + (i * PAGE_SIZE));
|
vdso_image_64->data + (i * PAGE_SIZE));
|
||||||
}
|
}
|
||||||
#elif LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,23)
|
#elif LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,23)
|
||||||
size = vdso_end - vdso_start;
|
size = vdso_end - vdso_start;
|
||||||
@ -185,36 +175,36 @@ void get_vdso_info(ihk_os_t os, long vdso_rpa)
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* HPET page */
|
/* HPET page */
|
||||||
if (hpet_addressp && *hpet_addressp) {
|
if (hpet_address && *hpet_address) {
|
||||||
#if LINUX_VERSION_CODE >= KERNEL_VERSION(4,5,0)
|
#if LINUX_VERSION_CODE >= KERNEL_VERSION(4,5,0)
|
||||||
vdso->hpet_is_global = 0;
|
vdso->hpet_is_global = 0;
|
||||||
vdso->hpet_virt = (void *)(-2 * PAGE_SIZE);
|
vdso->hpet_virt = (void *)(-2 * PAGE_SIZE);
|
||||||
vdso->hpet_phys = *hpet_addressp;
|
vdso->hpet_phys = *hpet_address;
|
||||||
#elif LINUX_VERSION_CODE >= KERNEL_VERSION(3,17,0)
|
#elif LINUX_VERSION_CODE >= KERNEL_VERSION(3,17,0)
|
||||||
vdso->hpet_is_global = 0;
|
vdso->hpet_is_global = 0;
|
||||||
vdso->hpet_virt = (void *)(-1 * PAGE_SIZE);
|
vdso->hpet_virt = (void *)(-1 * PAGE_SIZE);
|
||||||
vdso->hpet_phys = *hpet_addressp;
|
vdso->hpet_phys = *hpet_address;
|
||||||
#elif LINUX_VERSION_CODE >= KERNEL_VERSION(3,16,0)
|
#elif LINUX_VERSION_CODE >= KERNEL_VERSION(3,16,0)
|
||||||
vdso->hpet_is_global = 0;
|
vdso->hpet_is_global = 0;
|
||||||
vdso->hpet_virt = (void *)((vdso->vdso_npages + 1) * PAGE_SIZE);
|
vdso->hpet_virt = (void *)((vdso->vdso_npages + 1) * PAGE_SIZE);
|
||||||
vdso->hpet_phys = *hpet_addressp;
|
vdso->hpet_phys = *hpet_address;
|
||||||
#elif LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,23)
|
#elif LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,23)
|
||||||
vdso->hpet_is_global = 1;
|
vdso->hpet_is_global = 1;
|
||||||
vdso->hpet_virt = (void *)fix_to_virt(VSYSCALL_HPET);
|
vdso->hpet_virt = (void *)fix_to_virt(VSYSCALL_HPET);
|
||||||
vdso->hpet_phys = *hpet_addressp;
|
vdso->hpet_phys = *hpet_address;
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
/* struct pvlock_vcpu_time_info table */
|
/* struct pvlock_vcpu_time_info table */
|
||||||
if (hv_clockp && *hv_clockp) {
|
if (hv_clock && *hv_clock) {
|
||||||
#if LINUX_VERSION_CODE >= KERNEL_VERSION(4,5,0)
|
#if LINUX_VERSION_CODE >= KERNEL_VERSION(4,5,0)
|
||||||
vdso->pvti_is_global = 0;
|
vdso->pvti_is_global = 0;
|
||||||
vdso->pvti_virt = (void *)(-1 * PAGE_SIZE);
|
vdso->pvti_virt = (void *)(-1 * PAGE_SIZE);
|
||||||
vdso->pvti_phys = virt_to_phys(*hv_clockp);
|
vdso->pvti_phys = virt_to_phys(*hv_clock);
|
||||||
#elif LINUX_VERSION_CODE >= KERNEL_VERSION(3,8,0)
|
#elif LINUX_VERSION_CODE >= KERNEL_VERSION(3,8,0)
|
||||||
vdso->pvti_is_global = 1;
|
vdso->pvti_is_global = 1;
|
||||||
vdso->pvti_virt = (void *)fix_to_virt(PVCLOCK_FIXMAP_BEGIN);
|
vdso->pvti_virt = (void *)fix_to_virt(PVCLOCK_FIXMAP_BEGIN);
|
||||||
vdso->pvti_phys = virt_to_phys(*hv_clockp);
|
vdso->pvti_phys = virt_to_phys(*hv_clock);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -39,7 +39,6 @@
|
|||||||
#include <asm/uaccess.h>
|
#include <asm/uaccess.h>
|
||||||
#include <asm/delay.h>
|
#include <asm/delay.h>
|
||||||
#include <asm/io.h>
|
#include <asm/io.h>
|
||||||
#include <linux/kallsyms.h>
|
|
||||||
#include <linux/syscalls.h>
|
#include <linux/syscalls.h>
|
||||||
#include <trace/events/sched.h>
|
#include <trace/events/sched.h>
|
||||||
#include <config.h>
|
#include <config.h>
|
||||||
@ -56,39 +55,6 @@
|
|||||||
#define dprintk(...)
|
#define dprintk(...)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef MCCTRL_KSYM_sys_unshare
|
|
||||||
#if MCCTRL_KSYM_sys_unshare
|
|
||||||
typedef int (*int_star_fn_ulong_t)(unsigned long);
|
|
||||||
int (*mcctrl_sys_unshare)(unsigned long unshare_flags) =
|
|
||||||
(int_star_fn_ulong_t)
|
|
||||||
MCCTRL_KSYM_sys_unshare;
|
|
||||||
#else // exported
|
|
||||||
int (*mcctrl_sys_unshare)(unsigned long unshare_flags) = NULL;
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef MCCTRL_KSYM_sys_mount
|
|
||||||
#if MCCTRL_KSYM_sys_mount
|
|
||||||
typedef int (*int_star_fn_char_char_char_ulong_void_t)(char *, char *, char *, unsigned long, void *);
|
|
||||||
int (*mcctrl_sys_mount)(char *dev_name,char *dir_name, char *type, unsigned long flags, void *data) =
|
|
||||||
(int_star_fn_char_char_char_ulong_void_t)
|
|
||||||
MCCTRL_KSYM_sys_mount;
|
|
||||||
#else // exported
|
|
||||||
int (*mcctrl_sys_mount)(char *dev_name,char *dir_name, char *type, unsigned long flags, void *data) = sys_mount;
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef MCCTRL_KSYM_sys_umount
|
|
||||||
#if MCCTRL_KSYM_sys_umount
|
|
||||||
typedef int (*int_fn_char_star_int_t)(char *, int);
|
|
||||||
int (*mcctrl_sys_umount)(char *dir_name, int flags) =
|
|
||||||
(int_fn_char_star_int_t)
|
|
||||||
MCCTRL_KSYM_sys_umount;
|
|
||||||
#else // exported
|
|
||||||
int (*mcctrl_sys_umount)(char *dir_name, int flags) = sys_umount;
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
//extern struct mcctrl_channel *channels;
|
//extern struct mcctrl_channel *channels;
|
||||||
int mcctrl_ikc_set_recv_cpu(ihk_os_t os, int cpu);
|
int mcctrl_ikc_set_recv_cpu(ihk_os_t os, int cpu);
|
||||||
int syscall_backward(struct mcctrl_usrdata *, int, unsigned long, unsigned long,
|
int syscall_backward(struct mcctrl_usrdata *, int, unsigned long, unsigned long,
|
||||||
@ -1925,12 +1891,8 @@ long mcexec_sys_mount(struct sys_mount_desc *__user arg)
|
|||||||
cap_raise(promoted->cap_effective, CAP_SYS_ADMIN);
|
cap_raise(promoted->cap_effective, CAP_SYS_ADMIN);
|
||||||
original = override_creds(promoted);
|
original = override_creds(promoted);
|
||||||
|
|
||||||
#ifdef MCCTRL_KSYM_sys_mount
|
|
||||||
ret = mcctrl_sys_mount(desc.dev_name, desc.dir_name, desc.type,
|
ret = mcctrl_sys_mount(desc.dev_name, desc.dir_name, desc.type,
|
||||||
desc.flags, desc.data);
|
desc.flags, desc.data);
|
||||||
#else
|
|
||||||
ret = -EFAULT;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
revert_creds(original);
|
revert_creds(original);
|
||||||
put_cred(promoted);
|
put_cred(promoted);
|
||||||
@ -1956,11 +1918,7 @@ long mcexec_sys_umount(struct sys_mount_desc *__user arg)
|
|||||||
cap_raise(promoted->cap_effective, CAP_SYS_ADMIN);
|
cap_raise(promoted->cap_effective, CAP_SYS_ADMIN);
|
||||||
original = override_creds(promoted);
|
original = override_creds(promoted);
|
||||||
|
|
||||||
#ifdef MCCTRL_KSYM_sys_umount
|
|
||||||
ret = mcctrl_sys_umount(desc.dir_name, MNT_FORCE);
|
ret = mcctrl_sys_umount(desc.dir_name, MNT_FORCE);
|
||||||
#else
|
|
||||||
ret = -EFAULT;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
revert_creds(original);
|
revert_creds(original);
|
||||||
put_cred(promoted);
|
put_cred(promoted);
|
||||||
@ -1986,11 +1944,7 @@ long mcexec_sys_unshare(struct sys_unshare_desc *__user arg)
|
|||||||
cap_raise(promoted->cap_effective, CAP_SYS_ADMIN);
|
cap_raise(promoted->cap_effective, CAP_SYS_ADMIN);
|
||||||
original = override_creds(promoted);
|
original = override_creds(promoted);
|
||||||
|
|
||||||
#if MCCTRL_KSYM_sys_unshare
|
|
||||||
ret = mcctrl_sys_unshare(desc.unshare_flags);
|
ret = mcctrl_sys_unshare(desc.unshare_flags);
|
||||||
#else
|
|
||||||
ret = -EFAULT;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
revert_creds(original);
|
revert_creds(original);
|
||||||
put_cred(promoted);
|
put_cred(promoted);
|
||||||
@ -2510,9 +2464,6 @@ cache_topo_search(struct ihk_cpu_topology *cpu_topo, int level)
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
static long (*setaffinity)(pid_t pid, const struct cpumask *in_mask);
|
|
||||||
static int (*setscheduler_nocheck)(struct task_struct *p, int policy,
|
|
||||||
const struct sched_param *param);
|
|
||||||
static unsigned int *uti_rr;
|
static unsigned int *uti_rr;
|
||||||
static int max_cpu;
|
static int max_cpu;
|
||||||
|
|
||||||
@ -2526,20 +2477,6 @@ uti_attr_init(void)
|
|||||||
if (uti_rr)
|
if (uti_rr)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
if (!setaffinity) {
|
|
||||||
setaffinity = (long (*)(pid_t, const struct cpumask *))
|
|
||||||
kallsyms_lookup_name("sched_setaffinity");
|
|
||||||
if (!setaffinity)
|
|
||||||
return -ENOSYS;
|
|
||||||
}
|
|
||||||
if (!setscheduler_nocheck) {
|
|
||||||
setscheduler_nocheck = (int (*)(struct task_struct *, int,
|
|
||||||
const struct sched_param *))
|
|
||||||
kallsyms_lookup_name("sched_setscheduler_nocheck");
|
|
||||||
if (!setscheduler_nocheck)
|
|
||||||
return -ENOSYS;
|
|
||||||
}
|
|
||||||
|
|
||||||
for_each_possible_cpu(i) {
|
for_each_possible_cpu(i) {
|
||||||
max_cpu = i;
|
max_cpu = i;
|
||||||
}
|
}
|
||||||
@ -2757,29 +2694,29 @@ mcexec_uti_attr(ihk_os_t os, struct uti_attr_desc __user *arg)
|
|||||||
else if (kattr->attr.flags & UTI_FLAG_EXCLUSIVE_CPU) {
|
else if (kattr->attr.flags & UTI_FLAG_EXCLUSIVE_CPU) {
|
||||||
struct sched_param sp;
|
struct sched_param sp;
|
||||||
|
|
||||||
setaffinity(0, uti_cpu_select(cpuset));
|
mcctrl_sched_setaffinity(0, uti_cpu_select(cpuset));
|
||||||
sp.sched_priority = 1;
|
sp.sched_priority = 1;
|
||||||
setscheduler_nocheck(current, SCHED_FIFO, &sp);
|
mcctrl_sched_setscheduler_nocheck(current, SCHED_FIFO, &sp);
|
||||||
rc = 1;
|
rc = 1;
|
||||||
}
|
}
|
||||||
else if (kattr->attr.flags & UTI_FLAG_CPU_INTENSIVE) {
|
else if (kattr->attr.flags & UTI_FLAG_CPU_INTENSIVE) {
|
||||||
setaffinity(0, uti_cpu_select(cpuset));
|
mcctrl_sched_setaffinity(0, uti_cpu_select(cpuset));
|
||||||
rc = 1;
|
rc = 1;
|
||||||
}
|
}
|
||||||
else if (kattr->attr.flags & UTI_FLAG_HIGH_PRIORITY) {
|
else if (kattr->attr.flags & UTI_FLAG_HIGH_PRIORITY) {
|
||||||
struct sched_param sp;
|
struct sched_param sp;
|
||||||
|
|
||||||
setaffinity(0, uti_cpu_select(cpuset));
|
mcctrl_sched_setaffinity(0, uti_cpu_select(cpuset));
|
||||||
sp.sched_priority = 1;
|
sp.sched_priority = 1;
|
||||||
setscheduler_nocheck(current, SCHED_FIFO, &sp);
|
mcctrl_sched_setscheduler_nocheck(current, SCHED_FIFO, &sp);
|
||||||
rc = 1;
|
rc = 1;
|
||||||
}
|
}
|
||||||
else if (kattr->attr.flags & UTI_FLAG_NON_COOPERATIVE) {
|
else if (kattr->attr.flags & UTI_FLAG_NON_COOPERATIVE) {
|
||||||
setaffinity(0, uti_cpu_select(cpuset));
|
mcctrl_sched_setaffinity(0, uti_cpu_select(cpuset));
|
||||||
rc = 1;
|
rc = 1;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
setaffinity(0, cpuset);
|
mcctrl_sched_setaffinity(0, cpuset);
|
||||||
}
|
}
|
||||||
|
|
||||||
kfree(cpuset);
|
kfree(cpuset);
|
||||||
|
|||||||
@ -28,6 +28,7 @@
|
|||||||
#include <linux/slab.h>
|
#include <linux/slab.h>
|
||||||
#include <linux/device.h>
|
#include <linux/device.h>
|
||||||
#include <linux/delay.h>
|
#include <linux/delay.h>
|
||||||
|
#include <linux/kallsyms.h>
|
||||||
#include "mcctrl.h"
|
#include "mcctrl.h"
|
||||||
#include <ihk/ihk_host_user.h>
|
#include <ihk/ihk_host_user.h>
|
||||||
|
|
||||||
@ -214,6 +215,60 @@ static struct ihk_os_notifier mcctrl_os_notifier = {
|
|||||||
.ops = &mcctrl_os_notifier_ops,
|
.ops = &mcctrl_os_notifier_ops,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
int (*mcctrl_sys_mount)(char *dev_name, char *dir_name, char *type,
|
||||||
|
unsigned long flags, void *data);
|
||||||
|
int (*mcctrl_sys_umount)(char *dir_name, int flags);
|
||||||
|
int (*mcctrl_sys_unshare)(unsigned long unshare_flags);
|
||||||
|
long (*mcctrl_sched_setaffinity)(pid_t pid, const struct cpumask *in_mask);
|
||||||
|
int (*mcctrl_sched_setscheduler_nocheck)(struct task_struct *p, int policy,
|
||||||
|
const struct sched_param *param);
|
||||||
|
|
||||||
|
ssize_t (*mcctrl_sys_readlink)(const char *path, char *buf,
|
||||||
|
size_t bufsiz);
|
||||||
|
void (*mcctrl_zap_page_range)(struct vm_area_struct *vma,
|
||||||
|
unsigned long start,
|
||||||
|
unsigned long size,
|
||||||
|
struct zap_details *details);
|
||||||
|
|
||||||
|
static int symbols_init(void)
|
||||||
|
{
|
||||||
|
mcctrl_sys_mount = (void *) kallsyms_lookup_name("sys_mount");
|
||||||
|
if (WARN_ON(!mcctrl_sys_mount))
|
||||||
|
return -EFAULT;
|
||||||
|
|
||||||
|
mcctrl_sys_umount = (void *) kallsyms_lookup_name("sys_umount");
|
||||||
|
if (WARN_ON(!mcctrl_sys_umount))
|
||||||
|
return -EFAULT;
|
||||||
|
|
||||||
|
mcctrl_sys_unshare = (void *) kallsyms_lookup_name("sys_unshare");
|
||||||
|
if (WARN_ON(!mcctrl_sys_unshare))
|
||||||
|
return -EFAULT;
|
||||||
|
|
||||||
|
mcctrl_sched_setaffinity =
|
||||||
|
(void *) kallsyms_lookup_name("sched_setaffinity");
|
||||||
|
if (WARN_ON(!mcctrl_sched_setaffinity))
|
||||||
|
return -EFAULT;
|
||||||
|
|
||||||
|
mcctrl_sched_setscheduler_nocheck =
|
||||||
|
(void *) kallsyms_lookup_name("sched_setscheduler_nocheck");
|
||||||
|
if (WARN_ON(!mcctrl_sched_setscheduler_nocheck))
|
||||||
|
return -EFAULT;
|
||||||
|
|
||||||
|
mcctrl_sys_readlink =
|
||||||
|
(void *) kallsyms_lookup_name("sys_readlink");
|
||||||
|
if (WARN_ON(!mcctrl_sys_readlink))
|
||||||
|
return -EFAULT;
|
||||||
|
|
||||||
|
mcctrl_zap_page_range =
|
||||||
|
(void *) kallsyms_lookup_name("zap_page_range");
|
||||||
|
if (WARN_ON(!mcctrl_zap_page_range))
|
||||||
|
return -EFAULT;
|
||||||
|
|
||||||
|
return arch_symbols_init();
|
||||||
|
}
|
||||||
|
|
||||||
static int __init mcctrl_init(void)
|
static int __init mcctrl_init(void)
|
||||||
{
|
{
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
@ -231,6 +286,9 @@ static int __init mcctrl_init(void)
|
|||||||
|
|
||||||
binfmt_mcexec_init();
|
binfmt_mcexec_init();
|
||||||
|
|
||||||
|
if ((ret = symbols_init()))
|
||||||
|
goto error;
|
||||||
|
|
||||||
if ((ret = ihk_host_register_os_notifier(&mcctrl_os_notifier)) != 0) {
|
if ((ret = ihk_host_register_os_notifier(&mcctrl_os_notifier)) != 0) {
|
||||||
printk("mcctrl: error: registering OS notifier\n");
|
printk("mcctrl: error: registering OS notifier\n");
|
||||||
goto error;
|
goto error;
|
||||||
|
|||||||
@ -400,6 +400,23 @@ int mcctrl_ikc_send_wait(ihk_os_t os, int cpu, struct ikc_scd_packet *pisp,
|
|||||||
|
|
||||||
ihk_os_t osnum_to_os(int n);
|
ihk_os_t osnum_to_os(int n);
|
||||||
|
|
||||||
|
/* look up symbols, plus arch-specific ones */
|
||||||
|
extern int (*mcctrl_sys_mount)(char *dev_name, char *dir_name, char *type,
|
||||||
|
unsigned long flags, void *data);
|
||||||
|
extern int (*mcctrl_sys_umount)(char *dir_name, int flags);
|
||||||
|
extern int (*mcctrl_sys_unshare)(unsigned long unshare_flags);
|
||||||
|
extern long (*mcctrl_sched_setaffinity)(pid_t pid,
|
||||||
|
const struct cpumask *in_mask);
|
||||||
|
extern int (*mcctrl_sched_setscheduler_nocheck)(struct task_struct *p,
|
||||||
|
int policy,
|
||||||
|
const struct sched_param *param);
|
||||||
|
extern ssize_t (*mcctrl_sys_readlink)(const char *path, char *buf,
|
||||||
|
size_t bufsiz);
|
||||||
|
extern void (*mcctrl_zap_page_range)(struct vm_area_struct *vma,
|
||||||
|
unsigned long start,
|
||||||
|
unsigned long size,
|
||||||
|
struct zap_details *details);
|
||||||
|
|
||||||
/* syscall.c */
|
/* syscall.c */
|
||||||
void pager_add_process(void);
|
void pager_add_process(void);
|
||||||
void pager_remove_process(struct mcctrl_per_proc_data *ppd);
|
void pager_remove_process(struct mcctrl_per_proc_data *ppd);
|
||||||
@ -504,6 +521,7 @@ struct vdso {
|
|||||||
int reserve_user_space(struct mcctrl_usrdata *usrdata, unsigned long *startp,
|
int reserve_user_space(struct mcctrl_usrdata *usrdata, unsigned long *startp,
|
||||||
unsigned long *endp);
|
unsigned long *endp);
|
||||||
void get_vdso_info(ihk_os_t os, long vdso_pa);
|
void get_vdso_info(ihk_os_t os, long vdso_pa);
|
||||||
|
int arch_symbols_init(void);
|
||||||
|
|
||||||
struct get_cpu_mapping_req {
|
struct get_cpu_mapping_req {
|
||||||
int busy; /* INOUT: */
|
int busy; /* INOUT: */
|
||||||
|
|||||||
@ -63,16 +63,6 @@
|
|||||||
#define dprintk(...)
|
#define dprintk(...)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef MCCTRL_KSYM_zap_page_range
|
|
||||||
static void
|
|
||||||
(*mcctrl_zap_page_range)(struct vm_area_struct *vma, unsigned long start,
|
|
||||||
unsigned long size, struct zap_details *details)
|
|
||||||
#if MCCTRL_KSYM_zap_page_range
|
|
||||||
= (void *)MCCTRL_KSYM_zap_page_range;
|
|
||||||
#else
|
|
||||||
= &zap_page_range;
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
static long pager_call(ihk_os_t os, struct syscall_request *req);
|
static long pager_call(ihk_os_t os, struct syscall_request *req);
|
||||||
|
|
||||||
|
|||||||
@ -892,16 +892,6 @@ out:
|
|||||||
return error;
|
return error;
|
||||||
} /* read_long() */
|
} /* read_long() */
|
||||||
|
|
||||||
#ifdef MCCTRL_KSYM_sys_readlink
|
|
||||||
static ssize_t (*mcctrl_sys_readlink)(const char *path, char *buf,
|
|
||||||
size_t bufsiz)
|
|
||||||
#if MCCTRL_KSYM_sys_readlink
|
|
||||||
= (void *)MCCTRL_KSYM_sys_readlink;
|
|
||||||
#else
|
|
||||||
= &sys_readlink;
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
static int read_link(char *buf, size_t bufsize, char *fmt, ...)
|
static int read_link(char *buf, size_t bufsize, char *fmt, ...)
|
||||||
{
|
{
|
||||||
int error;
|
int error;
|
||||||
|
|||||||
Reference in New Issue
Block a user