Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net
Fun set of conflict resolutions here...
For the mac80211 stuff, these were fortunately just parallel
adds. Trivially resolved.
In drivers/net/phy/phy.c we had a bug fix in 'net' that moved the
function phy_disable_interrupts() earlier in the file, whilst in
'net-next' the phy_error() call from this function was removed.
In net/ipv4/xfrm4_policy.c, David Ahern's changes to remove the
'rt_table_id' member of rtable collided with a bug fix in 'net' that
added a new struct member "rt_mtu_locked" which needs to be copied
over here.
The mlxsw driver conflict consisted of net-next separating
the span code and definitions into separate files, whilst
a 'net' bug fix made some changes to that moved code.
The mlx5 infiniband conflict resolution was quite non-trivial,
the RDMA tree's merge commit was used as a guide here, and
here are their notes:
====================
Due to bug fixes found by the syzkaller bot and taken into the for-rc
branch after development for the 4.17 merge window had already started
being taken into the for-next branch, there were fairly non-trivial
merge issues that would need to be resolved between the for-rc branch
and the for-next branch. This merge resolves those conflicts and
provides a unified base upon which ongoing development for 4.17 can
be based.
Conflicts:
drivers/infiniband/hw/mlx5/main.c - Commit 42cea83f95
(IB/mlx5: Fix cleanup order on unload) added to for-rc and
commit b5ca15ad7e (IB/mlx5: Add proper representors support)
add as part of the devel cycle both needed to modify the
init/de-init functions used by mlx5. To support the new
representors, the new functions added by the cleanup patch
needed to be made non-static, and the init/de-init list
added by the representors patch needed to be modified to
match the init/de-init list changes made by the cleanup
patch.
Updates:
drivers/infiniband/hw/mlx5/mlx5_ib.h - Update function
prototypes added by representors patch to reflect new function
names as changed by cleanup patch
drivers/infiniband/hw/mlx5/ib_rep.c - Update init/de-init
stage list to match new order from cleanup patch
====================
Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
@@ -213,6 +213,7 @@
|
||||
#define X86_FEATURE_SEV ( 7*32+20) /* AMD Secure Encrypted Virtualization */
|
||||
|
||||
#define X86_FEATURE_USE_IBPB ( 7*32+21) /* "" Indirect Branch Prediction Barrier enabled */
|
||||
#define X86_FEATURE_USE_IBRS_FW ( 7*32+22) /* "" Use IBRS during runtime firmware calls */
|
||||
|
||||
/* Virtualization flags: Linux defined, word 8 */
|
||||
#define X86_FEATURE_TPR_SHADOW ( 8*32+ 0) /* Intel TPR Shadow */
|
||||
|
||||
@@ -55,6 +55,10 @@
|
||||
|
||||
#include "main.h"
|
||||
|
||||
#ifndef BPF_FS_MAGIC
|
||||
#define BPF_FS_MAGIC 0xcafe4a11
|
||||
#endif
|
||||
|
||||
void p_err(const char *fmt, ...)
|
||||
{
|
||||
va_list ap;
|
||||
|
||||
@@ -761,6 +761,7 @@ struct kvm_ppc_resize_hpt {
|
||||
#define KVM_TRACE_PAUSE __KVM_DEPRECATED_MAIN_0x07
|
||||
#define KVM_TRACE_DISABLE __KVM_DEPRECATED_MAIN_0x08
|
||||
#define KVM_GET_EMULATED_CPUID _IOWR(KVMIO, 0x09, struct kvm_cpuid2)
|
||||
#define KVM_GET_MSR_FEATURE_INDEX_LIST _IOWR(KVMIO, 0x0a, struct kvm_msr_list)
|
||||
|
||||
/*
|
||||
* Extension capability list.
|
||||
@@ -934,6 +935,7 @@ struct kvm_ppc_resize_hpt {
|
||||
#define KVM_CAP_S390_AIS_MIGRATION 150
|
||||
#define KVM_CAP_PPC_GET_CPU_CHAR 151
|
||||
#define KVM_CAP_S390_BPB 152
|
||||
#define KVM_CAP_GET_MSR_FEATURES 153
|
||||
|
||||
#ifdef KVM_CAP_IRQ_ROUTING
|
||||
|
||||
|
||||
@@ -1116,42 +1116,29 @@ static int read_unwind_hints(struct objtool_file *file)
|
||||
|
||||
static int read_retpoline_hints(struct objtool_file *file)
|
||||
{
|
||||
struct section *sec, *relasec;
|
||||
struct section *sec;
|
||||
struct instruction *insn;
|
||||
struct rela *rela;
|
||||
int i;
|
||||
|
||||
sec = find_section_by_name(file->elf, ".discard.retpoline_safe");
|
||||
sec = find_section_by_name(file->elf, ".rela.discard.retpoline_safe");
|
||||
if (!sec)
|
||||
return 0;
|
||||
|
||||
relasec = sec->rela;
|
||||
if (!relasec) {
|
||||
WARN("missing .rela.discard.retpoline_safe section");
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (sec->len % sizeof(unsigned long)) {
|
||||
WARN("retpoline_safe size mismatch: %d %ld", sec->len, sizeof(unsigned long));
|
||||
return -1;
|
||||
}
|
||||
|
||||
for (i = 0; i < sec->len / sizeof(unsigned long); i++) {
|
||||
rela = find_rela_by_dest(sec, i * sizeof(unsigned long));
|
||||
if (!rela) {
|
||||
WARN("can't find rela for retpoline_safe[%d]", i);
|
||||
list_for_each_entry(rela, &sec->rela_list, list) {
|
||||
if (rela->sym->type != STT_SECTION) {
|
||||
WARN("unexpected relocation symbol type in %s", sec->name);
|
||||
return -1;
|
||||
}
|
||||
|
||||
insn = find_insn(file, rela->sym->sec, rela->addend);
|
||||
if (!insn) {
|
||||
WARN("can't find insn for retpoline_safe[%d]", i);
|
||||
WARN("bad .discard.retpoline_safe entry");
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (insn->type != INSN_JUMP_DYNAMIC &&
|
||||
insn->type != INSN_CALL_DYNAMIC) {
|
||||
WARN_FUNC("retpoline_safe hint not a indirect jump/call",
|
||||
WARN_FUNC("retpoline_safe hint not an indirect jump/call",
|
||||
insn->sec, insn->offset);
|
||||
return -1;
|
||||
}
|
||||
|
||||
@@ -8,7 +8,7 @@ perf-kallsyms - Searches running kernel for symbols
|
||||
SYNOPSIS
|
||||
--------
|
||||
[verse]
|
||||
'perf kallsyms <options> symbol_name[,symbol_name...]'
|
||||
'perf kallsyms' [<options>] symbol_name[,symbol_name...]
|
||||
|
||||
DESCRIPTION
|
||||
-----------
|
||||
|
||||
@@ -881,6 +881,15 @@ static int __cmd_record(struct record *rec, int argc, const char **argv)
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* If we have just single event and are sending data
|
||||
* through pipe, we need to force the ids allocation,
|
||||
* because we synthesize event name through the pipe
|
||||
* and need the id for that.
|
||||
*/
|
||||
if (data->is_pipe && rec->evlist->nr_entries == 1)
|
||||
rec->opts.sample_id = true;
|
||||
|
||||
if (record__open(rec) != 0) {
|
||||
err = -1;
|
||||
goto out_child;
|
||||
|
||||
@@ -917,7 +917,7 @@ static void print_metric_csv(void *ctx,
|
||||
char buf[64], *vals, *ends;
|
||||
|
||||
if (unit == NULL || fmt == NULL) {
|
||||
fprintf(out, "%s%s%s%s", csv_sep, csv_sep, csv_sep, csv_sep);
|
||||
fprintf(out, "%s%s", csv_sep, csv_sep);
|
||||
return;
|
||||
}
|
||||
snprintf(buf, sizeof(buf), fmt, val);
|
||||
|
||||
@@ -991,7 +991,7 @@ static int perf_top_overwrite_fallback(struct perf_top *top,
|
||||
evlist__for_each_entry(evlist, counter)
|
||||
counter->attr.write_backward = false;
|
||||
opts->overwrite = false;
|
||||
ui__warning("fall back to non-overwrite mode\n");
|
||||
pr_debug2("fall back to non-overwrite mode\n");
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
@@ -61,6 +61,7 @@ struct record_opts {
|
||||
bool tail_synthesize;
|
||||
bool overwrite;
|
||||
bool ignore_missing_thread;
|
||||
bool sample_id;
|
||||
unsigned int freq;
|
||||
unsigned int mmap_pages;
|
||||
unsigned int auxtrace_mmap_pages;
|
||||
|
||||
@@ -327,7 +327,32 @@ static void annotate_browser__draw_current_jump(struct ui_browser *browser)
|
||||
if (!disasm_line__is_valid_jump(cursor, sym))
|
||||
return;
|
||||
|
||||
/*
|
||||
* This first was seen with a gcc function, _cpp_lex_token, that
|
||||
* has the usual jumps:
|
||||
*
|
||||
* │1159e6c: ↓ jne 115aa32 <_cpp_lex_token@@Base+0xf92>
|
||||
*
|
||||
* I.e. jumps to a label inside that function (_cpp_lex_token), and
|
||||
* those works, but also this kind:
|
||||
*
|
||||
* │1159e8b: ↓ jne c469be <cpp_named_operator2name@@Base+0xa72>
|
||||
*
|
||||
* I.e. jumps to another function, outside _cpp_lex_token, which
|
||||
* are not being correctly handled generating as a side effect references
|
||||
* to ab->offset[] entries that are set to NULL, so to make this code
|
||||
* more robust, check that here.
|
||||
*
|
||||
* A proper fix for will be put in place, looking at the function
|
||||
* name right after the '<' token and probably treating this like a
|
||||
* 'call' instruction.
|
||||
*/
|
||||
target = ab->offsets[cursor->ops.target.offset];
|
||||
if (target == NULL) {
|
||||
ui_helpline__printf("WARN: jump target inconsistency, press 'o', ab->offsets[%#x] = NULL\n",
|
||||
cursor->ops.target.offset);
|
||||
return;
|
||||
}
|
||||
|
||||
bcursor = browser_line(&cursor->al);
|
||||
btarget = browser_line(target);
|
||||
|
||||
@@ -60,6 +60,12 @@
|
||||
#include "sane_ctype.h"
|
||||
#include "symbol/kallsyms.h"
|
||||
|
||||
static bool auxtrace__dont_decode(struct perf_session *session)
|
||||
{
|
||||
return !session->itrace_synth_opts ||
|
||||
session->itrace_synth_opts->dont_decode;
|
||||
}
|
||||
|
||||
int auxtrace_mmap__mmap(struct auxtrace_mmap *mm,
|
||||
struct auxtrace_mmap_params *mp,
|
||||
void *userpg, int fd)
|
||||
@@ -762,6 +768,9 @@ int auxtrace_queues__process_index(struct auxtrace_queues *queues,
|
||||
size_t i;
|
||||
int err;
|
||||
|
||||
if (auxtrace__dont_decode(session))
|
||||
return 0;
|
||||
|
||||
list_for_each_entry(auxtrace_index, &session->auxtrace_index, list) {
|
||||
for (i = 0; i < auxtrace_index->nr; i++) {
|
||||
ent = &auxtrace_index->entries[i];
|
||||
@@ -892,12 +901,6 @@ out_free:
|
||||
return err;
|
||||
}
|
||||
|
||||
static bool auxtrace__dont_decode(struct perf_session *session)
|
||||
{
|
||||
return !session->itrace_synth_opts ||
|
||||
session->itrace_synth_opts->dont_decode;
|
||||
}
|
||||
|
||||
int perf_event__process_auxtrace_info(struct perf_tool *tool __maybe_unused,
|
||||
union perf_event *event,
|
||||
struct perf_session *session)
|
||||
|
||||
@@ -137,6 +137,7 @@ void perf_evlist__config(struct perf_evlist *evlist, struct record_opts *opts,
|
||||
struct perf_evsel *evsel;
|
||||
bool use_sample_identifier = false;
|
||||
bool use_comm_exec;
|
||||
bool sample_id = opts->sample_id;
|
||||
|
||||
/*
|
||||
* Set the evsel leader links before we configure attributes,
|
||||
@@ -163,8 +164,7 @@ void perf_evlist__config(struct perf_evlist *evlist, struct record_opts *opts,
|
||||
* match the id.
|
||||
*/
|
||||
use_sample_identifier = perf_can_sample_identifier();
|
||||
evlist__for_each_entry(evlist, evsel)
|
||||
perf_evsel__set_sample_id(evsel, use_sample_identifier);
|
||||
sample_id = true;
|
||||
} else if (evlist->nr_entries > 1) {
|
||||
struct perf_evsel *first = perf_evlist__first(evlist);
|
||||
|
||||
@@ -174,6 +174,10 @@ void perf_evlist__config(struct perf_evlist *evlist, struct record_opts *opts,
|
||||
use_sample_identifier = perf_can_sample_identifier();
|
||||
break;
|
||||
}
|
||||
sample_id = true;
|
||||
}
|
||||
|
||||
if (sample_id) {
|
||||
evlist__for_each_entry(evlist, evsel)
|
||||
perf_evsel__set_sample_id(evsel, use_sample_identifier);
|
||||
}
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
* States and transits:
|
||||
*
|
||||
*
|
||||
* OFF--(on)--> READY --(hit)--> HIT
|
||||
* OFF--> ON --> READY --(hit)--> HIT
|
||||
* ^ |
|
||||
* | (ready)
|
||||
* | |
|
||||
@@ -27,8 +27,9 @@ struct trigger {
|
||||
volatile enum {
|
||||
TRIGGER_ERROR = -2,
|
||||
TRIGGER_OFF = -1,
|
||||
TRIGGER_READY = 0,
|
||||
TRIGGER_HIT = 1,
|
||||
TRIGGER_ON = 0,
|
||||
TRIGGER_READY = 1,
|
||||
TRIGGER_HIT = 2,
|
||||
} state;
|
||||
const char *name;
|
||||
};
|
||||
@@ -50,7 +51,7 @@ static inline bool trigger_is_error(struct trigger *t)
|
||||
static inline void trigger_on(struct trigger *t)
|
||||
{
|
||||
TRIGGER_WARN_ONCE(t, TRIGGER_OFF);
|
||||
t->state = TRIGGER_READY;
|
||||
t->state = TRIGGER_ON;
|
||||
}
|
||||
|
||||
static inline void trigger_ready(struct trigger *t)
|
||||
|
||||
@@ -135,6 +135,16 @@ static int run_test(void *addr, unsigned long size)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int syscall_available(void)
|
||||
{
|
||||
int rc;
|
||||
|
||||
errno = 0;
|
||||
rc = syscall(__NR_subpage_prot, 0, 0, 0);
|
||||
|
||||
return rc == 0 || (errno != ENOENT && errno != ENOSYS);
|
||||
}
|
||||
|
||||
int test_anon(void)
|
||||
{
|
||||
unsigned long align;
|
||||
@@ -145,6 +155,8 @@ int test_anon(void)
|
||||
void *mallocblock;
|
||||
unsigned long mallocsize;
|
||||
|
||||
SKIP_IF(!syscall_available());
|
||||
|
||||
if (getpagesize() != 0x10000) {
|
||||
fprintf(stderr, "Kernel page size must be 64K!\n");
|
||||
return 1;
|
||||
@@ -180,6 +192,8 @@ int test_file(void)
|
||||
off_t filesize;
|
||||
int fd;
|
||||
|
||||
SKIP_IF(!syscall_available());
|
||||
|
||||
fd = open(file_name, O_RDWR);
|
||||
if (fd == -1) {
|
||||
perror("failed to open file");
|
||||
|
||||
@@ -16,7 +16,7 @@ $(OUTPUT)/tm-syscall: tm-syscall-asm.S
|
||||
$(OUTPUT)/tm-syscall: CFLAGS += -I../../../../../usr/include
|
||||
$(OUTPUT)/tm-tmspr: CFLAGS += -pthread
|
||||
$(OUTPUT)/tm-vmx-unavail: CFLAGS += -pthread -m64
|
||||
$(OUTPUT)/tm-resched-dscr: ../pmu/lib.o
|
||||
$(OUTPUT)/tm-resched-dscr: ../pmu/lib.c
|
||||
$(OUTPUT)/tm-unavailable: CFLAGS += -O0 -pthread -m64 -Wno-error=uninitialized -mvsx
|
||||
$(OUTPUT)/tm-trap: CFLAGS += -O0 -pthread -m64
|
||||
|
||||
|
||||
@@ -255,6 +255,8 @@ int tm_trap_test(void)
|
||||
|
||||
struct sigaction trap_sa;
|
||||
|
||||
SKIP_IF(!have_htm());
|
||||
|
||||
trap_sa.sa_flags = SA_SIGINFO;
|
||||
trap_sa.sa_sigaction = trap_signal_handler;
|
||||
sigaction(SIGTRAP, &trap_sa, NULL);
|
||||
|
||||
@@ -2,25 +2,33 @@
|
||||
# SPDX-License-Identifier: GPL-2.0
|
||||
#please run as root
|
||||
|
||||
#we need 256M, below is the size in kB
|
||||
needmem=262144
|
||||
mnt=./huge
|
||||
exitcode=0
|
||||
|
||||
#get pagesize and freepages from /proc/meminfo
|
||||
#get huge pagesize and freepages from /proc/meminfo
|
||||
while read name size unit; do
|
||||
if [ "$name" = "HugePages_Free:" ]; then
|
||||
freepgs=$size
|
||||
fi
|
||||
if [ "$name" = "Hugepagesize:" ]; then
|
||||
pgsize=$size
|
||||
hpgsize_KB=$size
|
||||
fi
|
||||
done < /proc/meminfo
|
||||
|
||||
# Simple hugetlbfs tests have a hardcoded minimum requirement of
|
||||
# huge pages totaling 256MB (262144KB) in size. The userfaultfd
|
||||
# hugetlb test requires a minimum of 2 * nr_cpus huge pages. Take
|
||||
# both of these requirements into account and attempt to increase
|
||||
# number of huge pages available.
|
||||
nr_cpus=$(nproc)
|
||||
hpgsize_MB=$((hpgsize_KB / 1024))
|
||||
half_ufd_size_MB=$((((nr_cpus * hpgsize_MB + 127) / 128) * 128))
|
||||
needmem_KB=$((half_ufd_size_MB * 2 * 1024))
|
||||
|
||||
#set proper nr_hugepages
|
||||
if [ -n "$freepgs" ] && [ -n "$pgsize" ]; then
|
||||
if [ -n "$freepgs" ] && [ -n "$hpgsize_KB" ]; then
|
||||
nr_hugepgs=`cat /proc/sys/vm/nr_hugepages`
|
||||
needpgs=`expr $needmem / $pgsize`
|
||||
needpgs=$((needmem_KB / hpgsize_KB))
|
||||
tries=2
|
||||
while [ $tries -gt 0 ] && [ $freepgs -lt $needpgs ]; do
|
||||
lackpgs=$(( $needpgs - $freepgs ))
|
||||
@@ -107,8 +115,9 @@ fi
|
||||
echo "---------------------------"
|
||||
echo "running userfaultfd_hugetlb"
|
||||
echo "---------------------------"
|
||||
# 256MB total huge pages == 128MB src and 128MB dst
|
||||
./userfaultfd hugetlb 128 32 $mnt/ufd_test_file
|
||||
# Test requires source and destination huge pages. Size of source
|
||||
# (half_ufd_size_MB) is passed as argument to test.
|
||||
./userfaultfd hugetlb $half_ufd_size_MB 32 $mnt/ufd_test_file
|
||||
if [ $? -ne 0 ]; then
|
||||
echo "[FAIL]"
|
||||
exitcode=1
|
||||
|
||||
@@ -95,6 +95,10 @@ asm (
|
||||
"int3\n\t"
|
||||
"vmcode_int80:\n\t"
|
||||
"int $0x80\n\t"
|
||||
"vmcode_popf_hlt:\n\t"
|
||||
"push %ax\n\t"
|
||||
"popf\n\t"
|
||||
"hlt\n\t"
|
||||
"vmcode_umip:\n\t"
|
||||
/* addressing via displacements */
|
||||
"smsw (2052)\n\t"
|
||||
@@ -124,8 +128,8 @@ asm (
|
||||
|
||||
extern unsigned char vmcode[], end_vmcode[];
|
||||
extern unsigned char vmcode_bound[], vmcode_sysenter[], vmcode_syscall[],
|
||||
vmcode_sti[], vmcode_int3[], vmcode_int80[], vmcode_umip[],
|
||||
vmcode_umip_str[], vmcode_umip_sldt[];
|
||||
vmcode_sti[], vmcode_int3[], vmcode_int80[], vmcode_popf_hlt[],
|
||||
vmcode_umip[], vmcode_umip_str[], vmcode_umip_sldt[];
|
||||
|
||||
/* Returns false if the test was skipped. */
|
||||
static bool do_test(struct vm86plus_struct *v86, unsigned long eip,
|
||||
@@ -175,7 +179,7 @@ static bool do_test(struct vm86plus_struct *v86, unsigned long eip,
|
||||
(VM86_TYPE(ret) == rettype && VM86_ARG(ret) == retarg)) {
|
||||
printf("[OK]\tReturned correctly\n");
|
||||
} else {
|
||||
printf("[FAIL]\tIncorrect return reason\n");
|
||||
printf("[FAIL]\tIncorrect return reason (started at eip = 0x%lx, ended at eip = 0x%lx)\n", eip, v86->regs.eip);
|
||||
nerrs++;
|
||||
}
|
||||
|
||||
@@ -264,6 +268,9 @@ int main(void)
|
||||
v86.regs.ds = load_addr / 16;
|
||||
v86.regs.es = load_addr / 16;
|
||||
|
||||
/* Use the end of the page as our stack. */
|
||||
v86.regs.esp = 4096;
|
||||
|
||||
assert((v86.regs.cs & 3) == 0); /* Looks like RPL = 0 */
|
||||
|
||||
/* #BR -- should deliver SIG??? */
|
||||
@@ -295,6 +302,23 @@ int main(void)
|
||||
v86.regs.eflags &= ~X86_EFLAGS_IF;
|
||||
do_test(&v86, vmcode_sti - vmcode, VM86_STI, 0, "STI with VIP set");
|
||||
|
||||
/* POPF with VIP set but IF clear: should not trap */
|
||||
v86.regs.eflags = X86_EFLAGS_VIP;
|
||||
v86.regs.eax = 0;
|
||||
do_test(&v86, vmcode_popf_hlt - vmcode, VM86_UNKNOWN, 0, "POPF with VIP set and IF clear");
|
||||
|
||||
/* POPF with VIP set and IF set: should trap */
|
||||
v86.regs.eflags = X86_EFLAGS_VIP;
|
||||
v86.regs.eax = X86_EFLAGS_IF;
|
||||
do_test(&v86, vmcode_popf_hlt - vmcode, VM86_STI, 0, "POPF with VIP and IF set");
|
||||
|
||||
/* POPF with VIP clear and IF set: should not trap */
|
||||
v86.regs.eflags = 0;
|
||||
v86.regs.eax = X86_EFLAGS_IF;
|
||||
do_test(&v86, vmcode_popf_hlt - vmcode, VM86_UNKNOWN, 0, "POPF with VIP clear and IF set");
|
||||
|
||||
v86.regs.eflags = 0;
|
||||
|
||||
/* INT3 -- should cause #BP */
|
||||
do_test(&v86, vmcode_int3 - vmcode, VM86_TRAP, 3, "INT3");
|
||||
|
||||
@@ -318,7 +342,7 @@ int main(void)
|
||||
clearhandler(SIGSEGV);
|
||||
|
||||
/* Make sure nothing explodes if we fork. */
|
||||
if (fork() > 0)
|
||||
if (fork() == 0)
|
||||
return 0;
|
||||
|
||||
return (nerrs == 0 ? 0 : 1);
|
||||
|
||||
@@ -450,7 +450,7 @@ static void sigtrap(int sig, siginfo_t *info, void *ctx_void)
|
||||
num_vsyscall_traps++;
|
||||
}
|
||||
|
||||
static int test_native_vsyscall(void)
|
||||
static int test_emulation(void)
|
||||
{
|
||||
time_t tmp;
|
||||
bool is_native;
|
||||
@@ -458,7 +458,7 @@ static int test_native_vsyscall(void)
|
||||
if (!vtime)
|
||||
return 0;
|
||||
|
||||
printf("[RUN]\tchecking for native vsyscall\n");
|
||||
printf("[RUN]\tchecking that vsyscalls are emulated\n");
|
||||
sethandler(SIGTRAP, sigtrap, 0);
|
||||
set_eflags(get_eflags() | X86_EFLAGS_TF);
|
||||
vtime(&tmp);
|
||||
@@ -474,11 +474,12 @@ static int test_native_vsyscall(void)
|
||||
*/
|
||||
is_native = (num_vsyscall_traps > 1);
|
||||
|
||||
printf("\tvsyscalls are %s (%d instructions in vsyscall page)\n",
|
||||
printf("[%s]\tvsyscalls are %s (%d instructions in vsyscall page)\n",
|
||||
(is_native ? "FAIL" : "OK"),
|
||||
(is_native ? "native" : "emulated"),
|
||||
(int)num_vsyscall_traps);
|
||||
|
||||
return 0;
|
||||
return is_native;
|
||||
}
|
||||
#endif
|
||||
|
||||
@@ -498,7 +499,7 @@ int main(int argc, char **argv)
|
||||
nerrs += test_vsys_r();
|
||||
|
||||
#ifdef __x86_64__
|
||||
nerrs += test_native_vsyscall();
|
||||
nerrs += test_emulation();
|
||||
#endif
|
||||
|
||||
return nerrs ? 1 : 0;
|
||||
|
||||
Reference in New Issue
Block a user