mirror of
https://git.FreeBSD.org/src.git
synced 2024-12-26 11:47:31 +00:00
Update Intel Processor Trace decoder library.
Its latest version merged from: ^/vendor/processor-trace/892e12c5a27bda5806d1e63269986bb4171b5a8b Sponsored by: DARPA, AFRL
This commit is contained in:
parent
93d9a79816
commit
85f87cf491
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=353390
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2014-2018, Intel Corporation
|
||||
* Copyright (c) 2014-2019, Intel Corporation
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2017-2018, Intel Corporation
|
||||
* Copyright (c) 2017-2019, Intel Corporation
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2013-2018, Intel Corporation
|
||||
* Copyright (c) 2018-2019, Intel Corporation
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
@ -26,26 +26,63 @@
|
||||
* POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#include "pt_ild.h"
|
||||
#ifndef PT_VERSION_H
|
||||
#define PT_VERSION_H
|
||||
|
||||
#include <windows.h>
|
||||
#include "intel-pt.h"
|
||||
|
||||
#include <stdio.h>
|
||||
#include <inttypes.h>
|
||||
|
||||
|
||||
BOOLEAN WINAPI DllMain(HINSTANCE handle, DWORD reason, LPVOID reserved)
|
||||
static inline int pt_fprint_version(FILE *file, struct pt_version version)
|
||||
{
|
||||
(void) handle;
|
||||
(void) reserved;
|
||||
|
||||
switch (reason) {
|
||||
case DLL_PROCESS_ATTACH:
|
||||
/* Initialize the Intel(R) Processor Trace instruction
|
||||
decoder. */
|
||||
pt_ild_init();
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
if (version.build) {
|
||||
if (version.ext && version.ext[0])
|
||||
return fprintf(file, "%" PRIu8 ".%" PRIu8 ".%" PRIu16
|
||||
"-%" PRIu32 "-%s", version.major,
|
||||
version.minor, version.patch,
|
||||
version.build, version.ext);
|
||||
else
|
||||
return fprintf(file, "%" PRIu8 ".%" PRIu8 ".%" PRIu16
|
||||
"-%" PRIu32 "", version.major,
|
||||
version.minor, version.patch,
|
||||
version.build);
|
||||
} else {
|
||||
if (version.ext && version.ext[0])
|
||||
return fprintf(file, "%" PRIu8 ".%" PRIu8 ".%" PRIu16
|
||||
"-%s", version.major, version.minor,
|
||||
version.patch, version.ext);
|
||||
else
|
||||
return fprintf(file, "%" PRIu8 ".%" PRIu8 ".%" PRIu16,
|
||||
version.major, version.minor,
|
||||
version.patch);
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static inline int pt_print_version(struct pt_version version)
|
||||
{
|
||||
return pt_fprint_version(stdout, version);
|
||||
}
|
||||
|
||||
static inline void pt_print_tool_version(const char *name)
|
||||
{
|
||||
struct pt_version v = {
|
||||
/* .major = */ PT_VERSION_MAJOR,
|
||||
/* .minor = */ PT_VERSION_MINOR,
|
||||
/* .patch = */ PT_VERSION_PATCH,
|
||||
/* .build = */ PT_VERSION_BUILD,
|
||||
/* .ext = */ PT_VERSION_EXT
|
||||
};
|
||||
|
||||
if (!name)
|
||||
name = "<unknown>";
|
||||
|
||||
printf("%s-", name);
|
||||
pt_print_version(v);
|
||||
printf(" / libipt-");
|
||||
pt_print_version(pt_library_version());
|
||||
printf("\n");
|
||||
}
|
||||
|
||||
#endif /* PT_VERSION_H */
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2013-2018, Intel Corporation
|
||||
* Copyright (c) 2013-2019, Intel Corporation
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2014-2018, Intel Corporation
|
||||
* Copyright (c) 2014-2019, Intel Corporation
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
|
@ -1,4 +1,4 @@
|
||||
# Copyright (c) 2013-2018, Intel Corporation
|
||||
# Copyright (c) 2013-2019, Intel Corporation
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are met:
|
||||
@ -64,28 +64,28 @@ if (CMAKE_HOST_UNIX)
|
||||
internal/include/posix
|
||||
)
|
||||
|
||||
set(LIBIPT_FILES ${LIBIPT_FILES} src/posix/init.c)
|
||||
set(LIBIPT_SECTION_FILES ${LIBIPT_SECTION_FILES} src/posix/pt_section_posix.c)
|
||||
endif (CMAKE_HOST_UNIX)
|
||||
|
||||
if (CMAKE_HOST_WIN32)
|
||||
add_definitions(
|
||||
# export libipt symbols
|
||||
#
|
||||
/Dpt_export=__declspec\(dllexport\)
|
||||
)
|
||||
if (BUILD_SHARED_LIBS)
|
||||
add_definitions(
|
||||
# export libipt symbols
|
||||
#
|
||||
/Dpt_export=__declspec\(dllexport\)
|
||||
)
|
||||
endif (BUILD_SHARED_LIBS)
|
||||
|
||||
include_directories(
|
||||
internal/include/windows
|
||||
)
|
||||
|
||||
set(LIBIPT_FILES ${LIBIPT_FILES} src/windows/init.c)
|
||||
set(LIBIPT_SECTION_FILES ${LIBIPT_SECTION_FILES} src/windows/pt_section_windows.c)
|
||||
endif (CMAKE_HOST_WIN32)
|
||||
|
||||
set(LIBIPT_FILES ${LIBIPT_FILES} ${LIBIPT_SECTION_FILES})
|
||||
|
||||
add_library(libipt SHARED
|
||||
add_library(libipt
|
||||
${LIBIPT_FILES}
|
||||
)
|
||||
|
||||
@ -167,6 +167,24 @@ add_ptunit_c_test(fetch
|
||||
src/pt_encoder.c
|
||||
src/pt_config.c
|
||||
)
|
||||
add_ptunit_c_test(encoder
|
||||
src/pt_encoder.c
|
||||
src/pt_config.c
|
||||
)
|
||||
add_ptunit_c_test(packet_decoder
|
||||
src/pt_packet_decoder.c
|
||||
src/pt_packet.c
|
||||
src/pt_config.c
|
||||
src/pt_sync.c
|
||||
src/pt_decoder_function.c
|
||||
src/pt_query_decoder.c
|
||||
src/pt_event_queue.c
|
||||
src/pt_last_ip.c
|
||||
src/pt_tnt_cache.c
|
||||
src/pt_time.c
|
||||
)
|
||||
add_ptunit_c_test(insn_decoder ${LIBIPT_FILES})
|
||||
add_ptunit_c_test(block_decoder ${LIBIPT_FILES})
|
||||
|
||||
add_ptunit_cpp_test(cpp)
|
||||
add_ptunit_libraries(cpp libipt)
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2013-2018, Intel Corporation
|
||||
* Copyright (c) 2013-2019, Intel Corporation
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
@ -80,6 +80,7 @@ struct pt_block_decoder;
|
||||
/** The header version. */
|
||||
#define LIBIPT_VERSION_MAJOR ${PT_VERSION_MAJOR}
|
||||
#define LIBIPT_VERSION_MINOR ${PT_VERSION_MINOR}
|
||||
#define LIBIPT_VERSION_PATCH ${PT_VERSION_PATCH}
|
||||
|
||||
#define LIBIPT_VERSION ((LIBIPT_VERSION_MAJOR << 8) + LIBIPT_VERSION_MINOR)
|
||||
|
||||
@ -92,8 +93,8 @@ struct pt_version {
|
||||
/** Minor version number. */
|
||||
uint8_t minor;
|
||||
|
||||
/** Reserved bits. */
|
||||
uint16_t reserved;
|
||||
/** Patch level. */
|
||||
uint16_t patch;
|
||||
|
||||
/** Build number. */
|
||||
uint32_t build;
|
||||
@ -330,6 +331,16 @@ struct pt_errata {
|
||||
*/
|
||||
uint32_t apl11:1;
|
||||
|
||||
/** SKL168: Intel(R) PT CYC Packets Can be Dropped When Immediately
|
||||
* Preceding PSB
|
||||
*
|
||||
* Due to a rare microarchitectural condition, generation of an Intel
|
||||
* PT (Processor Trace) PSB (Packet Stream Boundary) packet can cause a
|
||||
* single CYC (Cycle Count) packet, possibly along with an associated
|
||||
* MTC (Mini Time Counter) packet, to be dropped.
|
||||
*/
|
||||
uint32_t skl168:1;
|
||||
|
||||
/* Reserve a few bytes for the future. */
|
||||
uint32_t reserved[15];
|
||||
};
|
||||
@ -348,14 +359,26 @@ struct pt_conf_flags {
|
||||
|
||||
/** End a block after a jump instruction. */
|
||||
uint32_t end_on_jump:1;
|
||||
|
||||
/** Preserve timing calibration on overflow. */
|
||||
uint32_t keep_tcal_on_ovf:1;
|
||||
} block;
|
||||
|
||||
/** Flags for the instruction flow decoder. */
|
||||
struct {
|
||||
/** Enable tick events for timing updates. */
|
||||
uint32_t enable_tick_events:1;
|
||||
|
||||
/** Preserve timing calibration on overflow. */
|
||||
uint32_t keep_tcal_on_ovf:1;
|
||||
} insn;
|
||||
|
||||
/** Flags for the query decoder. */
|
||||
struct {
|
||||
/** Preserve timing calibration on overflow. */
|
||||
uint32_t keep_tcal_on_ovf:1;
|
||||
} query;
|
||||
|
||||
/* Reserve a few bytes for future extensions. */
|
||||
uint32_t reserved[4];
|
||||
} variant;
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2013-2018, Intel Corporation
|
||||
* Copyright (c) 2013-2019, Intel Corporation
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
@ -80,6 +80,7 @@ struct pt_block_decoder;
|
||||
/** The header version. */
|
||||
#define LIBIPT_VERSION_MAJOR ${PT_VERSION_MAJOR}
|
||||
#define LIBIPT_VERSION_MINOR ${PT_VERSION_MINOR}
|
||||
#define LIBIPT_VERSION_PATCH ${PT_VERSION_PATCH}
|
||||
|
||||
#define LIBIPT_VERSION ((LIBIPT_VERSION_MAJOR << 8) + LIBIPT_VERSION_MINOR)
|
||||
|
||||
@ -92,8 +93,8 @@ struct pt_version {
|
||||
/** Minor version number. */
|
||||
uint8_t minor;
|
||||
|
||||
/** Reserved bits. */
|
||||
uint16_t reserved;
|
||||
/** Patch level. */
|
||||
uint16_t patch;
|
||||
|
||||
/** Build number. */
|
||||
uint32_t build;
|
||||
@ -330,6 +331,16 @@ struct pt_errata {
|
||||
*/
|
||||
uint32_t apl11:1;
|
||||
|
||||
/** SKL168: Intel(R) PT CYC Packets Can be Dropped When Immediately
|
||||
* Preceding PSB
|
||||
*
|
||||
* Due to a rare microarchitectural condition, generation of an Intel
|
||||
* PT (Processor Trace) PSB (Packet Stream Boundary) packet can cause a
|
||||
* single CYC (Cycle Count) packet, possibly along with an associated
|
||||
* MTC (Mini Time Counter) packet, to be dropped.
|
||||
*/
|
||||
uint32_t skl168:1;
|
||||
|
||||
/* Reserve a few bytes for the future. */
|
||||
uint32_t reserved[15];
|
||||
};
|
||||
@ -348,14 +359,26 @@ struct pt_conf_flags {
|
||||
|
||||
/** End a block after a jump instruction. */
|
||||
uint32_t end_on_jump:1;
|
||||
|
||||
/** Preserve timing calibration on overflow. */
|
||||
uint32_t keep_tcal_on_ovf:1;
|
||||
} block;
|
||||
|
||||
/** Flags for the instruction flow decoder. */
|
||||
struct {
|
||||
/** Enable tick events for timing updates. */
|
||||
uint32_t enable_tick_events:1;
|
||||
|
||||
/** Preserve timing calibration on overflow. */
|
||||
uint32_t keep_tcal_on_ovf:1;
|
||||
} insn;
|
||||
|
||||
/** Flags for the query decoder. */
|
||||
struct {
|
||||
/** Preserve timing calibration on overflow. */
|
||||
uint32_t keep_tcal_on_ovf:1;
|
||||
} query;
|
||||
|
||||
/* Reserve a few bytes for future extensions. */
|
||||
uint32_t reserved[4];
|
||||
} variant;
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2015-2018, Intel Corporation
|
||||
* Copyright (c) 2015-2019, Intel Corporation
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2014-2018, Intel Corporation
|
||||
* Copyright (c) 2014-2019, Intel Corporation
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2016-2018, Intel Corporation
|
||||
* Copyright (c) 2016-2019, Intel Corporation
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2016-2018, Intel Corporation
|
||||
* Copyright (c) 2016-2019, Intel Corporation
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2015-2018, Intel Corporation
|
||||
* Copyright (c) 2015-2019, Intel Corporation
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2013-2018, Intel Corporation
|
||||
* Copyright (c) 2013-2019, Intel Corporation
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2013-2018, Intel Corporation
|
||||
* Copyright (c) 2013-2019, Intel Corporation
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2013-2018, Intel Corporation
|
||||
* Copyright (c) 2013-2019, Intel Corporation
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2014-2018, Intel Corporation
|
||||
* Copyright (c) 2014-2019, Intel Corporation
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2013-2018, Intel Corporation
|
||||
* Copyright (c) 2013-2019, Intel Corporation
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2013-2018, Intel Corporation
|
||||
* Copyright (c) 2013-2019, Intel Corporation
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
@ -97,11 +97,6 @@ static inline uint8_t pti_get_modrm_rm(const struct pt_ild *ild)
|
||||
return ild->modrm_byte & 7;
|
||||
}
|
||||
|
||||
/* MAIN ENTRANCE POINTS */
|
||||
|
||||
/* one time call. not thread safe init. call when single threaded. */
|
||||
extern void pt_ild_init(void);
|
||||
|
||||
/* all decoding is multithread safe. */
|
||||
|
||||
/* Decode one instruction.
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2013-2018, Intel Corporation
|
||||
* Copyright (c) 2013-2019, Intel Corporation
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2016-2018, Intel Corporation
|
||||
* Copyright (c) 2016-2019, Intel Corporation
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2016-2018, Intel Corporation
|
||||
* Copyright (c) 2016-2019, Intel Corporation
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2013-2018, Intel Corporation
|
||||
* Copyright (c) 2013-2019, Intel Corporation
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2013-2018, Intel Corporation
|
||||
* Copyright (c) 2013-2019, Intel Corporation
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2014-2018, Intel Corporation
|
||||
* Copyright (c) 2014-2019, Intel Corporation
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2017-2018, Intel Corporation
|
||||
* Copyright (c) 2017-2019, Intel Corporation
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2013-2018, Intel Corporation
|
||||
* Copyright (c) 2013-2019, Intel Corporation
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2014-2018, Intel Corporation
|
||||
* Copyright (c) 2014-2019, Intel Corporation
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2014-2018, Intel Corporation
|
||||
* Copyright (c) 2014-2019, Intel Corporation
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2014-2018, Intel Corporation
|
||||
* Copyright (c) 2014-2019, Intel Corporation
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2013-2018, Intel Corporation
|
||||
* Copyright (c) 2013-2019, Intel Corporation
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2013-2018, Intel Corporation
|
||||
* Copyright (c) 2013-2019, Intel Corporation
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
@ -162,10 +162,15 @@ struct pt_section {
|
||||
* The returned section is not mapped and starts with a user count of one and
|
||||
* instruction caching enabled.
|
||||
*
|
||||
* Returns a new section on success, NULL otherwise.
|
||||
* Returns zero on success, a negative pt_error_code otherwise.
|
||||
* Returns -pte_internal if @psection is NULL.
|
||||
* Returns -pte_nomem when running out of memory.
|
||||
* Returns -pte_bad_file if @filename cannot be opened.
|
||||
* Returns -pte_invalid if @offset lies beyond @file.
|
||||
* Returns -pte_invalid if @filename is too long.
|
||||
*/
|
||||
extern struct pt_section *pt_mk_section(const char *file, uint64_t offset,
|
||||
uint64_t size);
|
||||
extern int pt_mk_section(struct pt_section **psection, const char *filename,
|
||||
uint64_t offset, uint64_t size);
|
||||
|
||||
/* Lock a section.
|
||||
*
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2013-2018, Intel Corporation
|
||||
* Copyright (c) 2013-2019, Intel Corporation
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2014-2018, Intel Corporation
|
||||
* Copyright (c) 2014-2019, Intel Corporation
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2014-2018, Intel Corporation
|
||||
* Copyright (c) 2014-2019, Intel Corporation
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
@ -166,6 +166,9 @@ struct pt_time_cal {
|
||||
|
||||
/* A flag saying whether we have seen a MTC packet. */
|
||||
uint32_t have_mtc:1;
|
||||
|
||||
/* A flag saying whether we need to check for erratum SKL168. */
|
||||
uint32_t check_skl168:1;
|
||||
};
|
||||
|
||||
enum {
|
||||
@ -228,5 +231,9 @@ extern int pt_tcal_update_mtc(struct pt_time_cal *,
|
||||
extern int pt_tcal_update_cyc(struct pt_time_cal *,
|
||||
const struct pt_packet_cyc *,
|
||||
const struct pt_config *);
|
||||
extern int pt_tcal_update_psb(struct pt_time_cal *,
|
||||
const struct pt_config *);
|
||||
extern int pt_tcal_update_ovf(struct pt_time_cal *,
|
||||
const struct pt_config *);
|
||||
|
||||
#endif /* PT_TIME_H */
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2013-2018, Intel Corporation
|
||||
* Copyright (c) 2013-2019, Intel Corporation
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2013-2018, Intel Corporation
|
||||
* Copyright (c) 2013-2019, Intel Corporation
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2013-2018, Intel Corporation
|
||||
* Copyright (c) 2013-2019, Intel Corporation
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
|
@ -0,0 +1,209 @@
|
||||
/*
|
||||
* Copyright (c) 2017-2019, Intel Corporation
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
*
|
||||
* * Redistributions of source code must retain the above copyright notice,
|
||||
* this list of conditions and the following disclaimer.
|
||||
* * Redistributions in binary form must reproduce the above copyright notice,
|
||||
* this list of conditions and the following disclaimer in the documentation
|
||||
* and/or other materials provided with the distribution.
|
||||
* * Neither the name of Intel Corporation nor the names of its contributors
|
||||
* may be used to endorse or promote products derived from this software
|
||||
* without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
* POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#ifndef PTI_DISP_DEFAULT_H
|
||||
#define PTI_DISP_DEFAULT_H
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
|
||||
static const uint8_t disp_default[4][4][8] = {
|
||||
/* Effective Addressing Mode: ptem_unknown. */ {
|
||||
/* MOD: 0 */ {
|
||||
/* RM: 0 */ 0,
|
||||
/* RM: 1 */ 0,
|
||||
/* RM: 2 */ 0,
|
||||
/* RM: 3 */ 0,
|
||||
/* RM: 4 */ 0,
|
||||
/* RM: 5 */ 0,
|
||||
/* RM: 6 */ 0,
|
||||
/* RM: 7 */ 0
|
||||
},
|
||||
/* MOD: 1 */ {
|
||||
/* RM: 0 */ 0,
|
||||
/* RM: 1 */ 0,
|
||||
/* RM: 2 */ 0,
|
||||
/* RM: 3 */ 0,
|
||||
/* RM: 4 */ 0,
|
||||
/* RM: 5 */ 0,
|
||||
/* RM: 6 */ 0,
|
||||
/* RM: 7 */ 0
|
||||
},
|
||||
/* MOD: 2 */ {
|
||||
/* RM: 0 */ 0,
|
||||
/* RM: 1 */ 0,
|
||||
/* RM: 2 */ 0,
|
||||
/* RM: 3 */ 0,
|
||||
/* RM: 4 */ 0,
|
||||
/* RM: 5 */ 0,
|
||||
/* RM: 6 */ 0,
|
||||
/* RM: 7 */ 0
|
||||
},
|
||||
/* MOD: 3 */ {
|
||||
/* RM: 0 */ 0,
|
||||
/* RM: 1 */ 0,
|
||||
/* RM: 2 */ 0,
|
||||
/* RM: 3 */ 0,
|
||||
/* RM: 4 */ 0,
|
||||
/* RM: 5 */ 0,
|
||||
/* RM: 6 */ 0,
|
||||
/* RM: 7 */ 0
|
||||
}
|
||||
},
|
||||
|
||||
/* Effective Addressing Mode: ptem_16bit. */ {
|
||||
/* MOD: 0 */ {
|
||||
/* RM: 0 */ 0,
|
||||
/* RM: 1 */ 0,
|
||||
/* RM: 2 */ 0,
|
||||
/* RM: 3 */ 0,
|
||||
/* RM: 4 */ 0,
|
||||
/* RM: 5 */ 0,
|
||||
/* RM: 6 */ 2,
|
||||
/* RM: 7 */ 0
|
||||
},
|
||||
/* MOD: 1 */ {
|
||||
/* RM: 0 */ 1,
|
||||
/* RM: 1 */ 1,
|
||||
/* RM: 2 */ 1,
|
||||
/* RM: 3 */ 1,
|
||||
/* RM: 4 */ 1,
|
||||
/* RM: 5 */ 1,
|
||||
/* RM: 6 */ 1,
|
||||
/* RM: 7 */ 1
|
||||
},
|
||||
/* MOD: 2 */ {
|
||||
/* RM: 0 */ 2,
|
||||
/* RM: 1 */ 2,
|
||||
/* RM: 2 */ 2,
|
||||
/* RM: 3 */ 2,
|
||||
/* RM: 4 */ 2,
|
||||
/* RM: 5 */ 2,
|
||||
/* RM: 6 */ 2,
|
||||
/* RM: 7 */ 2
|
||||
},
|
||||
/* MOD: 3 */ {
|
||||
/* RM: 0 */ 0,
|
||||
/* RM: 1 */ 0,
|
||||
/* RM: 2 */ 0,
|
||||
/* RM: 3 */ 0,
|
||||
/* RM: 4 */ 0,
|
||||
/* RM: 5 */ 0,
|
||||
/* RM: 6 */ 0,
|
||||
/* RM: 7 */ 0
|
||||
}
|
||||
},
|
||||
|
||||
/* Effective Addressing Mode: ptem_32bit. */ {
|
||||
/* MOD: 0 */ {
|
||||
/* RM: 0 */ 0,
|
||||
/* RM: 1 */ 0,
|
||||
/* RM: 2 */ 0,
|
||||
/* RM: 3 */ 0,
|
||||
/* RM: 4 */ 0,
|
||||
/* RM: 5 */ 4,
|
||||
/* RM: 6 */ 0,
|
||||
/* RM: 7 */ 0
|
||||
},
|
||||
/* MOD: 1 */ {
|
||||
/* RM: 0 */ 1,
|
||||
/* RM: 1 */ 1,
|
||||
/* RM: 2 */ 1,
|
||||
/* RM: 3 */ 1,
|
||||
/* RM: 4 */ 1,
|
||||
/* RM: 5 */ 1,
|
||||
/* RM: 6 */ 1,
|
||||
/* RM: 7 */ 1
|
||||
},
|
||||
/* MOD: 2 */ {
|
||||
/* RM: 0 */ 4,
|
||||
/* RM: 1 */ 4,
|
||||
/* RM: 2 */ 4,
|
||||
/* RM: 3 */ 4,
|
||||
/* RM: 4 */ 4,
|
||||
/* RM: 5 */ 4,
|
||||
/* RM: 6 */ 4,
|
||||
/* RM: 7 */ 4
|
||||
},
|
||||
/* MOD: 3 */ {
|
||||
/* RM: 0 */ 0,
|
||||
/* RM: 1 */ 0,
|
||||
/* RM: 2 */ 0,
|
||||
/* RM: 3 */ 0,
|
||||
/* RM: 4 */ 0,
|
||||
/* RM: 5 */ 0,
|
||||
/* RM: 6 */ 0,
|
||||
/* RM: 7 */ 0
|
||||
}
|
||||
},
|
||||
|
||||
/* Effective Addressing Mode: ptem_64bit. */ {
|
||||
/* MOD: 0 */ {
|
||||
/* RM: 0 */ 0,
|
||||
/* RM: 1 */ 0,
|
||||
/* RM: 2 */ 0,
|
||||
/* RM: 3 */ 0,
|
||||
/* RM: 4 */ 0,
|
||||
/* RM: 5 */ 4,
|
||||
/* RM: 6 */ 0,
|
||||
/* RM: 7 */ 0
|
||||
},
|
||||
/* MOD: 1 */ {
|
||||
/* RM: 0 */ 1,
|
||||
/* RM: 1 */ 1,
|
||||
/* RM: 2 */ 1,
|
||||
/* RM: 3 */ 1,
|
||||
/* RM: 4 */ 1,
|
||||
/* RM: 5 */ 1,
|
||||
/* RM: 6 */ 1,
|
||||
/* RM: 7 */ 1
|
||||
},
|
||||
/* MOD: 2 */ {
|
||||
/* RM: 0 */ 4,
|
||||
/* RM: 1 */ 4,
|
||||
/* RM: 2 */ 4,
|
||||
/* RM: 3 */ 4,
|
||||
/* RM: 4 */ 4,
|
||||
/* RM: 5 */ 4,
|
||||
/* RM: 6 */ 4,
|
||||
/* RM: 7 */ 4
|
||||
},
|
||||
/* MOD: 3 */ {
|
||||
/* RM: 0 */ 0,
|
||||
/* RM: 1 */ 0,
|
||||
/* RM: 2 */ 0,
|
||||
/* RM: 3 */ 0,
|
||||
/* RM: 4 */ 0,
|
||||
/* RM: 5 */ 0,
|
||||
/* RM: 6 */ 0,
|
||||
/* RM: 7 */ 0
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
#endif /* PTI_DISP_DEFAULT_H */
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2013-2018, Intel Corporation
|
||||
* Copyright (c) 2013-2019, Intel Corporation
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2013-2018, Intel Corporation
|
||||
* Copyright (c) 2013-2019, Intel Corporation
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2013-2018, Intel Corporation
|
||||
* Copyright (c) 2013-2019, Intel Corporation
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2013-2018, Intel Corporation
|
||||
* Copyright (c) 2013-2019, Intel Corporation
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
|
209
contrib/processor-trace/libipt/internal/include/pti-sib.h
Normal file
209
contrib/processor-trace/libipt/internal/include/pti-sib.h
Normal file
@ -0,0 +1,209 @@
|
||||
/*
|
||||
* Copyright (c) 2017-2019, Intel Corporation
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
*
|
||||
* * Redistributions of source code must retain the above copyright notice,
|
||||
* this list of conditions and the following disclaimer.
|
||||
* * Redistributions in binary form must reproduce the above copyright notice,
|
||||
* this list of conditions and the following disclaimer in the documentation
|
||||
* and/or other materials provided with the distribution.
|
||||
* * Neither the name of Intel Corporation nor the names of its contributors
|
||||
* may be used to endorse or promote products derived from this software
|
||||
* without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
* POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#ifndef PTI_SIB_H
|
||||
#define PTI_SIB_H
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
|
||||
static const uint8_t has_sib[4][4][8] = {
|
||||
/* Effective Addressing Mode: ptem_unknown. */ {
|
||||
/* MOD: 0 */ {
|
||||
/* RM: 0 */ 0,
|
||||
/* RM: 1 */ 0,
|
||||
/* RM: 2 */ 0,
|
||||
/* RM: 3 */ 0,
|
||||
/* RM: 4 */ 0,
|
||||
/* RM: 5 */ 0,
|
||||
/* RM: 6 */ 0,
|
||||
/* RM: 7 */ 0
|
||||
},
|
||||
/* MOD: 1 */ {
|
||||
/* RM: 0 */ 0,
|
||||
/* RM: 1 */ 0,
|
||||
/* RM: 2 */ 0,
|
||||
/* RM: 3 */ 0,
|
||||
/* RM: 4 */ 0,
|
||||
/* RM: 5 */ 0,
|
||||
/* RM: 6 */ 0,
|
||||
/* RM: 7 */ 0
|
||||
},
|
||||
/* MOD: 2 */ {
|
||||
/* RM: 0 */ 0,
|
||||
/* RM: 1 */ 0,
|
||||
/* RM: 2 */ 0,
|
||||
/* RM: 3 */ 0,
|
||||
/* RM: 4 */ 0,
|
||||
/* RM: 5 */ 0,
|
||||
/* RM: 6 */ 0,
|
||||
/* RM: 7 */ 0
|
||||
},
|
||||
/* MOD: 3 */ {
|
||||
/* RM: 0 */ 0,
|
||||
/* RM: 1 */ 0,
|
||||
/* RM: 2 */ 0,
|
||||
/* RM: 3 */ 0,
|
||||
/* RM: 4 */ 0,
|
||||
/* RM: 5 */ 0,
|
||||
/* RM: 6 */ 0,
|
||||
/* RM: 7 */ 0
|
||||
}
|
||||
},
|
||||
|
||||
/* Effective Addressing Mode: ptem_16bit. */ {
|
||||
/* MOD: 0 */ {
|
||||
/* RM: 0 */ 0,
|
||||
/* RM: 1 */ 0,
|
||||
/* RM: 2 */ 0,
|
||||
/* RM: 3 */ 0,
|
||||
/* RM: 4 */ 0,
|
||||
/* RM: 5 */ 0,
|
||||
/* RM: 6 */ 0,
|
||||
/* RM: 7 */ 0
|
||||
},
|
||||
/* MOD: 1 */ {
|
||||
/* RM: 0 */ 0,
|
||||
/* RM: 1 */ 0,
|
||||
/* RM: 2 */ 0,
|
||||
/* RM: 3 */ 0,
|
||||
/* RM: 4 */ 0,
|
||||
/* RM: 5 */ 0,
|
||||
/* RM: 6 */ 0,
|
||||
/* RM: 7 */ 0
|
||||
},
|
||||
/* MOD: 2 */ {
|
||||
/* RM: 0 */ 0,
|
||||
/* RM: 1 */ 0,
|
||||
/* RM: 2 */ 0,
|
||||
/* RM: 3 */ 0,
|
||||
/* RM: 4 */ 0,
|
||||
/* RM: 5 */ 0,
|
||||
/* RM: 6 */ 0,
|
||||
/* RM: 7 */ 0
|
||||
},
|
||||
/* MOD: 3 */ {
|
||||
/* RM: 0 */ 0,
|
||||
/* RM: 1 */ 0,
|
||||
/* RM: 2 */ 0,
|
||||
/* RM: 3 */ 0,
|
||||
/* RM: 4 */ 0,
|
||||
/* RM: 5 */ 0,
|
||||
/* RM: 6 */ 0,
|
||||
/* RM: 7 */ 0
|
||||
}
|
||||
},
|
||||
|
||||
/* Effective Addressing Mode: ptem_32bit. */ {
|
||||
/* MOD: 0 */ {
|
||||
/* RM: 0 */ 0,
|
||||
/* RM: 1 */ 0,
|
||||
/* RM: 2 */ 0,
|
||||
/* RM: 3 */ 0,
|
||||
/* RM: 4 */ 1,
|
||||
/* RM: 5 */ 0,
|
||||
/* RM: 6 */ 0,
|
||||
/* RM: 7 */ 0
|
||||
},
|
||||
/* MOD: 1 */ {
|
||||
/* RM: 0 */ 0,
|
||||
/* RM: 1 */ 0,
|
||||
/* RM: 2 */ 0,
|
||||
/* RM: 3 */ 0,
|
||||
/* RM: 4 */ 1,
|
||||
/* RM: 5 */ 0,
|
||||
/* RM: 6 */ 0,
|
||||
/* RM: 7 */ 0
|
||||
},
|
||||
/* MOD: 2 */ {
|
||||
/* RM: 0 */ 0,
|
||||
/* RM: 1 */ 0,
|
||||
/* RM: 2 */ 0,
|
||||
/* RM: 3 */ 0,
|
||||
/* RM: 4 */ 1,
|
||||
/* RM: 5 */ 0,
|
||||
/* RM: 6 */ 0,
|
||||
/* RM: 7 */ 0
|
||||
},
|
||||
/* MOD: 3 */ {
|
||||
/* RM: 0 */ 0,
|
||||
/* RM: 1 */ 0,
|
||||
/* RM: 2 */ 0,
|
||||
/* RM: 3 */ 0,
|
||||
/* RM: 4 */ 0,
|
||||
/* RM: 5 */ 0,
|
||||
/* RM: 6 */ 0,
|
||||
/* RM: 7 */ 0
|
||||
}
|
||||
},
|
||||
|
||||
/* Effective Addressing Mode: ptem_64bit. */ {
|
||||
/* MOD: 0 */ {
|
||||
/* RM: 0 */ 0,
|
||||
/* RM: 1 */ 0,
|
||||
/* RM: 2 */ 0,
|
||||
/* RM: 3 */ 0,
|
||||
/* RM: 4 */ 1,
|
||||
/* RM: 5 */ 0,
|
||||
/* RM: 6 */ 0,
|
||||
/* RM: 7 */ 0
|
||||
},
|
||||
/* MOD: 1 */ {
|
||||
/* RM: 0 */ 0,
|
||||
/* RM: 1 */ 0,
|
||||
/* RM: 2 */ 0,
|
||||
/* RM: 3 */ 0,
|
||||
/* RM: 4 */ 1,
|
||||
/* RM: 5 */ 0,
|
||||
/* RM: 6 */ 0,
|
||||
/* RM: 7 */ 0
|
||||
},
|
||||
/* MOD: 2 */ {
|
||||
/* RM: 0 */ 0,
|
||||
/* RM: 1 */ 0,
|
||||
/* RM: 2 */ 0,
|
||||
/* RM: 3 */ 0,
|
||||
/* RM: 4 */ 1,
|
||||
/* RM: 5 */ 0,
|
||||
/* RM: 6 */ 0,
|
||||
/* RM: 7 */ 0
|
||||
},
|
||||
/* MOD: 3 */ {
|
||||
/* RM: 0 */ 0,
|
||||
/* RM: 1 */ 0,
|
||||
/* RM: 2 */ 0,
|
||||
/* RM: 3 */ 0,
|
||||
/* RM: 4 */ 0,
|
||||
/* RM: 5 */ 0,
|
||||
/* RM: 6 */ 0,
|
||||
/* RM: 7 */ 0
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
#endif /* PTI_SIB_H */
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2015-2018, Intel Corporation
|
||||
* Copyright (c) 2015-2019, Intel Corporation
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
|
@ -1,36 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) 2013-2018, Intel Corporation
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
*
|
||||
* * Redistributions of source code must retain the above copyright notice,
|
||||
* this list of conditions and the following disclaimer.
|
||||
* * Redistributions in binary form must reproduce the above copyright notice,
|
||||
* this list of conditions and the following disclaimer in the documentation
|
||||
* and/or other materials provided with the distribution.
|
||||
* * Neither the name of Intel Corporation nor the names of its contributors
|
||||
* may be used to endorse or promote products derived from this software
|
||||
* without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
* POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#include "pt_ild.h"
|
||||
|
||||
|
||||
static void __attribute__((constructor)) init(void)
|
||||
{
|
||||
/* Initialize the Intel(R) Processor Trace instruction decoder. */
|
||||
pt_ild_init();
|
||||
}
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2013-2018, Intel Corporation
|
||||
* Copyright (c) 2013-2019, Intel Corporation
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2013-2018, Intel Corporation
|
||||
* Copyright (c) 2013-2019, Intel Corporation
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
@ -53,7 +53,7 @@ int pt_section_mk_status(void **pstatus, uint64_t *psize, const char *filename)
|
||||
|
||||
errcode = stat(filename, &buffer);
|
||||
if (errcode < 0)
|
||||
return errcode;
|
||||
return -pte_bad_file;
|
||||
|
||||
if (buffer.st_size < 0)
|
||||
return -pte_bad_image;
|
||||
@ -65,7 +65,7 @@ int pt_section_mk_status(void **pstatus, uint64_t *psize, const char *filename)
|
||||
status->stat = buffer;
|
||||
|
||||
*pstatus = status;
|
||||
*psize = buffer.st_size;
|
||||
*psize = (uint64_t) buffer.st_size;
|
||||
|
||||
return 0;
|
||||
}
|
||||
@ -81,7 +81,7 @@ static int check_file_status(struct pt_section *section, int fd)
|
||||
|
||||
errcode = fstat(fd, &stat);
|
||||
if (errcode)
|
||||
return -pte_bad_image;
|
||||
return -pte_bad_file;
|
||||
|
||||
status = section->status;
|
||||
if (!status)
|
||||
@ -101,6 +101,7 @@ int pt_sec_posix_map(struct pt_section *section, int fd)
|
||||
struct pt_sec_posix_mapping *mapping;
|
||||
uint64_t offset, size, adjustment;
|
||||
uint8_t *base;
|
||||
long page_size;
|
||||
int errcode;
|
||||
|
||||
if (!section)
|
||||
@ -109,7 +110,11 @@ int pt_sec_posix_map(struct pt_section *section, int fd)
|
||||
offset = section->offset;
|
||||
size = section->size;
|
||||
|
||||
adjustment = offset % sysconf(_SC_PAGESIZE);
|
||||
page_size = sysconf(_SC_PAGESIZE);
|
||||
if (page_size < 0)
|
||||
return -pte_bad_config;
|
||||
|
||||
adjustment = offset % (uint64_t) page_size;
|
||||
|
||||
offset -= adjustment;
|
||||
size += adjustment;
|
||||
@ -213,7 +218,7 @@ int pt_section_map(struct pt_section *section)
|
||||
if (!filename)
|
||||
goto out_unlock;
|
||||
|
||||
errcode = -pte_bad_image;
|
||||
errcode = -pte_bad_file;
|
||||
fd = open(filename, O_RDONLY);
|
||||
if (fd == -1)
|
||||
goto out_unlock;
|
||||
@ -234,8 +239,10 @@ int pt_section_map(struct pt_section *section)
|
||||
* if we fail to convert the file descriptor.
|
||||
*/
|
||||
file = fdopen(fd, "rb");
|
||||
if (!file)
|
||||
if (!file) {
|
||||
errcode = -pte_bad_file;
|
||||
goto out_fd;
|
||||
}
|
||||
|
||||
/* We need to keep the file open on success. It will be closed when
|
||||
* the section is unmapped.
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2014-2018, Intel Corporation
|
||||
* Copyright (c) 2014-2019, Intel Corporation
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2016-2018, Intel Corporation
|
||||
* Copyright (c) 2016-2019, Intel Corporation
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2016-2018, Intel Corporation
|
||||
* Copyright (c) 2016-2019, Intel Corporation
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
@ -102,6 +102,8 @@ static int pt_blk_init_qry_flags(struct pt_conf_flags *qflags,
|
||||
return -pte_internal;
|
||||
|
||||
memset(qflags, 0, sizeof(*qflags));
|
||||
qflags->variant.query.keep_tcal_on_ovf =
|
||||
flags->variant.block.keep_tcal_on_ovf;
|
||||
|
||||
return 0;
|
||||
}
|
||||
@ -568,7 +570,8 @@ static int pt_blk_next_ip(uint64_t *pip, struct pt_block_decoder *decoder,
|
||||
|
||||
ip = insn->ip + insn->size;
|
||||
if (taken)
|
||||
ip += iext->variant.branch.displacement;
|
||||
ip += (uint64_t) (int64_t)
|
||||
iext->variant.branch.displacement;
|
||||
|
||||
*pip = ip;
|
||||
return status;
|
||||
@ -1778,8 +1781,8 @@ pt_blk_proceed_no_event_fill_cache(struct pt_block_decoder *decoder,
|
||||
struct pt_bcache_entry bce;
|
||||
struct pt_insn_ext iext;
|
||||
struct pt_insn insn;
|
||||
uint64_t nip, dip;
|
||||
int64_t disp, ioff, noff;
|
||||
uint64_t nip, dip, ioff, noff;
|
||||
int64_t disp;
|
||||
int status;
|
||||
|
||||
if (!decoder || !steps)
|
||||
@ -2002,7 +2005,7 @@ pt_blk_proceed_no_event_fill_cache(struct pt_block_decoder *decoder,
|
||||
return -pte_internal;
|
||||
|
||||
/* The decision point IP and the displacement from @insn.ip. */
|
||||
dip = nip + bce.displacement;
|
||||
dip = nip + (uint64_t) (int64_t) bce.displacement;
|
||||
disp = (int64_t) (dip - insn.ip);
|
||||
|
||||
/* We may have switched sections if the section was split. See
|
||||
@ -2166,7 +2169,7 @@ static int pt_blk_proceed_no_event_cached(struct pt_block_decoder *decoder,
|
||||
*
|
||||
* Switch to the slow path until we reach the end of this section.
|
||||
*/
|
||||
nip = decoder->ip + bce.displacement;
|
||||
nip = decoder->ip + (uint64_t) (int64_t) bce.displacement;
|
||||
if (!pt_blk_is_in_section(msec, nip))
|
||||
return pt_blk_proceed_no_event_uncached(decoder, block);
|
||||
|
||||
@ -2262,7 +2265,8 @@ static int pt_blk_proceed_no_event_cached(struct pt_block_decoder *decoder,
|
||||
if (status < 0)
|
||||
return status;
|
||||
|
||||
ip += iext.variant.branch.displacement;
|
||||
ip += (uint64_t) (int64_t)
|
||||
iext.variant.branch.displacement;
|
||||
}
|
||||
|
||||
decoder->ip = ip + bce.isize;
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2013-2018, Intel Corporation
|
||||
* Copyright (c) 2013-2019, Intel Corporation
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
@ -59,20 +59,23 @@ int pt_cpu_errata(struct pt_errata *errata, const struct pt_cpu *cpu)
|
||||
|
||||
case 0x4e:
|
||||
case 0x5e:
|
||||
errata->bdm70 = 1;
|
||||
errata->skd007 = 1;
|
||||
errata->skd022 = 1;
|
||||
errata->skd010 = 1;
|
||||
errata->skl014 = 1;
|
||||
return 0;
|
||||
|
||||
case 0x8e:
|
||||
case 0x9e:
|
||||
errata->bdm70 = 1;
|
||||
errata->skl014 = 1;
|
||||
errata->skd007 = 1;
|
||||
errata->skd022 = 1;
|
||||
errata->skd010 = 1;
|
||||
errata->skd007 = 1;
|
||||
errata->skl014 = 1;
|
||||
errata->skl168 = 1;
|
||||
return 0;
|
||||
|
||||
case 0x55:
|
||||
case 0x66:
|
||||
case 0x7d:
|
||||
case 0x7e:
|
||||
errata->bdm70 = 1;
|
||||
errata->skl014 = 1;
|
||||
errata->skd022 = 1;
|
||||
return 0;
|
||||
|
||||
case 0x5c:
|
||||
@ -80,6 +83,11 @@ int pt_cpu_errata(struct pt_errata *errata, const struct pt_cpu *cpu)
|
||||
errata->apl12 = 1;
|
||||
errata->apl11 = 1;
|
||||
return 0;
|
||||
|
||||
case 0x7a:
|
||||
case 0x86:
|
||||
errata->apl11 = 1;
|
||||
return 0;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2013-2018, Intel Corporation
|
||||
* Copyright (c) 2013-2019, Intel Corporation
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2013-2018, Intel Corporation
|
||||
* Copyright (c) 2013-2019, Intel Corporation
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2014-2018, Intel Corporation
|
||||
* Copyright (c) 2014-2019, Intel Corporation
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
@ -117,7 +117,7 @@ int pt_enc_get_offset(const struct pt_encoder *encoder, uint64_t *offset)
|
||||
if (!begin)
|
||||
return -pte_internal;
|
||||
|
||||
*offset = raw - begin;
|
||||
*offset = (uint64_t) (int64_t) (raw - begin);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -230,7 +230,8 @@ static int pt_encode_ip(struct pt_encoder *encoder, enum pt_opcode op,
|
||||
if (size < 0)
|
||||
return size;
|
||||
|
||||
errcode = pt_reserve(encoder, /* opc size = */ 1 + size);
|
||||
errcode = pt_reserve(encoder,
|
||||
/* opc size = */ 1u + (unsigned int) size);
|
||||
if (errcode < 0)
|
||||
return errcode;
|
||||
|
||||
@ -661,7 +662,8 @@ int pt_enc_next(struct pt_encoder *encoder, const struct pt_packet *packet)
|
||||
if (size < 0)
|
||||
return size;
|
||||
|
||||
errcode = pt_reserve(encoder, pt_opcs_ptw + size);
|
||||
errcode = pt_reserve(encoder,
|
||||
(unsigned int) (pt_opcs_ptw + size));
|
||||
if (errcode < 0)
|
||||
return errcode;
|
||||
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2013-2018, Intel Corporation
|
||||
* Copyright (c) 2013-2019, Intel Corporation
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2013-2018, Intel Corporation
|
||||
* Copyright (c) 2013-2019, Intel Corporation
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2013-2018, Intel Corporation
|
||||
* Copyright (c) 2013-2019, Intel Corporation
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
@ -33,66 +33,27 @@
|
||||
#include "pti-modrm.h"
|
||||
#include "pti-disp-defs.h"
|
||||
#include "pti-disp.h"
|
||||
#include "pti-disp_default.h"
|
||||
#include "pti-sib.h"
|
||||
|
||||
#include <string.h>
|
||||
|
||||
/* SET UP 3 TABLES */
|
||||
|
||||
static uint8_t has_disp_regular[4][4][8];
|
||||
static const uint8_t eamode_table[2][4] = {
|
||||
/* Default: */ {
|
||||
/* ptem_unknown = */ ptem_unknown,
|
||||
/* ptem_16bit = */ ptem_16bit,
|
||||
/* ptem_32bit = */ ptem_32bit,
|
||||
/* ptem_64bit = */ ptem_64bit
|
||||
},
|
||||
|
||||
static void init_has_disp_regular_table(void)
|
||||
{
|
||||
uint8_t mod, rm;
|
||||
|
||||
memset(has_disp_regular, 0, sizeof(has_disp_regular));
|
||||
|
||||
/*fill eamode16 */
|
||||
has_disp_regular[ptem_16bit][0][6] = 2;
|
||||
for (rm = 0; rm < 8; rm++)
|
||||
for (mod = 1; mod <= 2; mod++)
|
||||
has_disp_regular[ptem_16bit][mod][rm] = mod;
|
||||
|
||||
/*fill eamode32/64 */
|
||||
has_disp_regular[ptem_32bit][0][5] = 4;
|
||||
has_disp_regular[ptem_64bit][0][5] = 4;
|
||||
for (rm = 0; rm < 8; rm++) {
|
||||
has_disp_regular[ptem_32bit][1][rm] = 1;
|
||||
has_disp_regular[ptem_32bit][2][rm] = 4;
|
||||
|
||||
has_disp_regular[ptem_64bit][1][rm] = 1;
|
||||
has_disp_regular[ptem_64bit][2][rm] = 4;
|
||||
/* With Address-size prefix (0x67): */ {
|
||||
/* ptem_unknown = */ ptem_unknown,
|
||||
/* ptem_16bit = */ ptem_32bit,
|
||||
/* ptem_32bit = */ ptem_16bit,
|
||||
/* ptem_64bit = */ ptem_32bit
|
||||
}
|
||||
}
|
||||
|
||||
static uint8_t eamode_table[2][4];
|
||||
|
||||
static void init_eamode_table(void)
|
||||
{
|
||||
eamode_table[0][ptem_unknown] = ptem_unknown;
|
||||
eamode_table[0][ptem_16bit] = ptem_16bit;
|
||||
eamode_table[0][ptem_32bit] = ptem_32bit;
|
||||
eamode_table[0][ptem_64bit] = ptem_64bit;
|
||||
|
||||
eamode_table[1][ptem_unknown] = ptem_unknown;
|
||||
eamode_table[1][ptem_16bit] = ptem_32bit;
|
||||
eamode_table[1][ptem_32bit] = ptem_16bit;
|
||||
eamode_table[1][ptem_64bit] = ptem_32bit;
|
||||
}
|
||||
|
||||
static uint8_t has_sib_table[4][4][8];
|
||||
|
||||
static void init_has_sib_table(void)
|
||||
{
|
||||
uint8_t mod;
|
||||
|
||||
memset(has_sib_table, 0, sizeof(has_sib_table));
|
||||
|
||||
/*for eamode32/64 there is sib byte for mod!=3 and rm==4 */
|
||||
for (mod = 0; mod <= 2; mod++) {
|
||||
has_sib_table[ptem_32bit][mod][4] = 1;
|
||||
has_sib_table[ptem_64bit][mod][4] = 1;
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
/* SOME ACCESSORS */
|
||||
|
||||
@ -479,12 +440,12 @@ static int modrm_dec(struct pt_ild *ild, uint8_t length)
|
||||
uint8_t eamode = eamode_table[ild->u.s.asz][ild->mode];
|
||||
uint8_t mod = (uint8_t) pti_get_modrm_mod(ild);
|
||||
uint8_t rm = (uint8_t) pti_get_modrm_rm(ild);
|
||||
uint8_t has_sib;
|
||||
uint8_t sib;
|
||||
|
||||
ild->disp_bytes = has_disp_regular[eamode][mod][rm];
|
||||
ild->disp_bytes = disp_default[eamode][mod][rm];
|
||||
|
||||
has_sib = has_sib_table[eamode][mod][rm];
|
||||
if (has_sib)
|
||||
sib = has_sib[eamode][mod][rm];
|
||||
if (sib)
|
||||
return sib_dec(ild, length + 1);
|
||||
}
|
||||
|
||||
@ -557,7 +518,292 @@ static int opcode_dec(struct pt_ild *ild, uint8_t length)
|
||||
}
|
||||
|
||||
typedef int (*prefix_decoder)(struct pt_ild *ild, uint8_t length, uint8_t rex);
|
||||
static prefix_decoder prefix_table[256];
|
||||
|
||||
static int prefix_osz(struct pt_ild *ild, uint8_t length, uint8_t rex);
|
||||
static int prefix_asz(struct pt_ild *ild, uint8_t length, uint8_t rex);
|
||||
static int prefix_lock(struct pt_ild *ild, uint8_t length, uint8_t rex);
|
||||
static int prefix_f2(struct pt_ild *ild, uint8_t length, uint8_t rex);
|
||||
static int prefix_f3(struct pt_ild *ild, uint8_t length, uint8_t rex);
|
||||
static int prefix_rex(struct pt_ild *ild, uint8_t length, uint8_t rex);
|
||||
static int prefix_vex_c4(struct pt_ild *ild, uint8_t length, uint8_t rex);
|
||||
static int prefix_vex_c5(struct pt_ild *ild, uint8_t length, uint8_t rex);
|
||||
static int prefix_evex(struct pt_ild *ild, uint8_t length, uint8_t rex);
|
||||
static int prefix_ignore(struct pt_ild *ild, uint8_t length, uint8_t rex);
|
||||
static int prefix_done(struct pt_ild *ild, uint8_t length, uint8_t rex);
|
||||
|
||||
static const prefix_decoder prefix_table[256] = {
|
||||
/* 00 = */ prefix_done,
|
||||
/* 01 = */ prefix_done,
|
||||
/* 02 = */ prefix_done,
|
||||
/* 03 = */ prefix_done,
|
||||
/* 04 = */ prefix_done,
|
||||
/* 05 = */ prefix_done,
|
||||
/* 06 = */ prefix_done,
|
||||
/* 07 = */ prefix_done,
|
||||
/* 08 = */ prefix_done,
|
||||
/* 09 = */ prefix_done,
|
||||
/* 0a = */ prefix_done,
|
||||
/* 0b = */ prefix_done,
|
||||
/* 0c = */ prefix_done,
|
||||
/* 0d = */ prefix_done,
|
||||
/* 0e = */ prefix_done,
|
||||
/* 0f = */ prefix_done,
|
||||
|
||||
/* 10 = */ prefix_done,
|
||||
/* 11 = */ prefix_done,
|
||||
/* 12 = */ prefix_done,
|
||||
/* 13 = */ prefix_done,
|
||||
/* 14 = */ prefix_done,
|
||||
/* 15 = */ prefix_done,
|
||||
/* 16 = */ prefix_done,
|
||||
/* 17 = */ prefix_done,
|
||||
/* 18 = */ prefix_done,
|
||||
/* 19 = */ prefix_done,
|
||||
/* 1a = */ prefix_done,
|
||||
/* 1b = */ prefix_done,
|
||||
/* 1c = */ prefix_done,
|
||||
/* 1d = */ prefix_done,
|
||||
/* 1e = */ prefix_done,
|
||||
/* 1f = */ prefix_done,
|
||||
|
||||
/* 20 = */ prefix_done,
|
||||
/* 21 = */ prefix_done,
|
||||
/* 22 = */ prefix_done,
|
||||
/* 23 = */ prefix_done,
|
||||
/* 24 = */ prefix_done,
|
||||
/* 25 = */ prefix_done,
|
||||
/* 26 = */ prefix_ignore,
|
||||
/* 27 = */ prefix_done,
|
||||
/* 28 = */ prefix_done,
|
||||
/* 29 = */ prefix_done,
|
||||
/* 2a = */ prefix_done,
|
||||
/* 2b = */ prefix_done,
|
||||
/* 2c = */ prefix_done,
|
||||
/* 2d = */ prefix_done,
|
||||
/* 2e = */ prefix_ignore,
|
||||
/* 2f = */ prefix_done,
|
||||
|
||||
/* 30 = */ prefix_done,
|
||||
/* 31 = */ prefix_done,
|
||||
/* 32 = */ prefix_done,
|
||||
/* 33 = */ prefix_done,
|
||||
/* 34 = */ prefix_done,
|
||||
/* 35 = */ prefix_done,
|
||||
/* 36 = */ prefix_ignore,
|
||||
/* 37 = */ prefix_done,
|
||||
/* 38 = */ prefix_done,
|
||||
/* 39 = */ prefix_done,
|
||||
/* 3a = */ prefix_done,
|
||||
/* 3b = */ prefix_done,
|
||||
/* 3c = */ prefix_done,
|
||||
/* 3d = */ prefix_done,
|
||||
/* 3e = */ prefix_ignore,
|
||||
/* 3f = */ prefix_done,
|
||||
|
||||
/* 40 = */ prefix_rex,
|
||||
/* 41 = */ prefix_rex,
|
||||
/* 42 = */ prefix_rex,
|
||||
/* 43 = */ prefix_rex,
|
||||
/* 44 = */ prefix_rex,
|
||||
/* 45 = */ prefix_rex,
|
||||
/* 46 = */ prefix_rex,
|
||||
/* 47 = */ prefix_rex,
|
||||
/* 48 = */ prefix_rex,
|
||||
/* 49 = */ prefix_rex,
|
||||
/* 4a = */ prefix_rex,
|
||||
/* 4b = */ prefix_rex,
|
||||
/* 4c = */ prefix_rex,
|
||||
/* 4d = */ prefix_rex,
|
||||
/* 4e = */ prefix_rex,
|
||||
/* 4f = */ prefix_rex,
|
||||
|
||||
/* 50 = */ prefix_done,
|
||||
/* 51 = */ prefix_done,
|
||||
/* 52 = */ prefix_done,
|
||||
/* 53 = */ prefix_done,
|
||||
/* 54 = */ prefix_done,
|
||||
/* 55 = */ prefix_done,
|
||||
/* 56 = */ prefix_done,
|
||||
/* 57 = */ prefix_done,
|
||||
/* 58 = */ prefix_done,
|
||||
/* 59 = */ prefix_done,
|
||||
/* 5a = */ prefix_done,
|
||||
/* 5b = */ prefix_done,
|
||||
/* 5c = */ prefix_done,
|
||||
/* 5d = */ prefix_done,
|
||||
/* 5e = */ prefix_done,
|
||||
/* 5f = */ prefix_done,
|
||||
|
||||
/* 60 = */ prefix_done,
|
||||
/* 61 = */ prefix_done,
|
||||
/* 62 = */ prefix_evex,
|
||||
/* 63 = */ prefix_done,
|
||||
/* 64 = */ prefix_ignore,
|
||||
/* 65 = */ prefix_ignore,
|
||||
/* 66 = */ prefix_osz,
|
||||
/* 67 = */ prefix_asz,
|
||||
/* 68 = */ prefix_done,
|
||||
/* 69 = */ prefix_done,
|
||||
/* 6a = */ prefix_done,
|
||||
/* 6b = */ prefix_done,
|
||||
/* 6c = */ prefix_done,
|
||||
/* 6d = */ prefix_done,
|
||||
/* 6e = */ prefix_done,
|
||||
/* 6f = */ prefix_done,
|
||||
|
||||
/* 70 = */ prefix_done,
|
||||
/* 71 = */ prefix_done,
|
||||
/* 72 = */ prefix_done,
|
||||
/* 73 = */ prefix_done,
|
||||
/* 74 = */ prefix_done,
|
||||
/* 75 = */ prefix_done,
|
||||
/* 76 = */ prefix_done,
|
||||
/* 77 = */ prefix_done,
|
||||
/* 78 = */ prefix_done,
|
||||
/* 79 = */ prefix_done,
|
||||
/* 7a = */ prefix_done,
|
||||
/* 7b = */ prefix_done,
|
||||
/* 7c = */ prefix_done,
|
||||
/* 7d = */ prefix_done,
|
||||
/* 7e = */ prefix_done,
|
||||
/* 7f = */ prefix_done,
|
||||
|
||||
/* 80 = */ prefix_done,
|
||||
/* 81 = */ prefix_done,
|
||||
/* 82 = */ prefix_done,
|
||||
/* 83 = */ prefix_done,
|
||||
/* 84 = */ prefix_done,
|
||||
/* 85 = */ prefix_done,
|
||||
/* 86 = */ prefix_done,
|
||||
/* 87 = */ prefix_done,
|
||||
/* 88 = */ prefix_done,
|
||||
/* 89 = */ prefix_done,
|
||||
/* 8a = */ prefix_done,
|
||||
/* 8b = */ prefix_done,
|
||||
/* 8c = */ prefix_done,
|
||||
/* 8d = */ prefix_done,
|
||||
/* 8e = */ prefix_done,
|
||||
/* 8f = */ prefix_done,
|
||||
|
||||
/* 90 = */ prefix_done,
|
||||
/* 91 = */ prefix_done,
|
||||
/* 92 = */ prefix_done,
|
||||
/* 93 = */ prefix_done,
|
||||
/* 94 = */ prefix_done,
|
||||
/* 95 = */ prefix_done,
|
||||
/* 96 = */ prefix_done,
|
||||
/* 97 = */ prefix_done,
|
||||
/* 98 = */ prefix_done,
|
||||
/* 99 = */ prefix_done,
|
||||
/* 9a = */ prefix_done,
|
||||
/* 9b = */ prefix_done,
|
||||
/* 9c = */ prefix_done,
|
||||
/* 9d = */ prefix_done,
|
||||
/* 9e = */ prefix_done,
|
||||
/* 9f = */ prefix_done,
|
||||
|
||||
/* a0 = */ prefix_done,
|
||||
/* a1 = */ prefix_done,
|
||||
/* a2 = */ prefix_done,
|
||||
/* a3 = */ prefix_done,
|
||||
/* a4 = */ prefix_done,
|
||||
/* a5 = */ prefix_done,
|
||||
/* a6 = */ prefix_done,
|
||||
/* a7 = */ prefix_done,
|
||||
/* a8 = */ prefix_done,
|
||||
/* a9 = */ prefix_done,
|
||||
/* aa = */ prefix_done,
|
||||
/* ab = */ prefix_done,
|
||||
/* ac = */ prefix_done,
|
||||
/* ad = */ prefix_done,
|
||||
/* ae = */ prefix_done,
|
||||
/* af = */ prefix_done,
|
||||
|
||||
/* b0 = */ prefix_done,
|
||||
/* b1 = */ prefix_done,
|
||||
/* b2 = */ prefix_done,
|
||||
/* b3 = */ prefix_done,
|
||||
/* b4 = */ prefix_done,
|
||||
/* b5 = */ prefix_done,
|
||||
/* b6 = */ prefix_done,
|
||||
/* b7 = */ prefix_done,
|
||||
/* b8 = */ prefix_done,
|
||||
/* b9 = */ prefix_done,
|
||||
/* ba = */ prefix_done,
|
||||
/* bb = */ prefix_done,
|
||||
/* bc = */ prefix_done,
|
||||
/* bd = */ prefix_done,
|
||||
/* be = */ prefix_done,
|
||||
/* bf = */ prefix_done,
|
||||
|
||||
/* c0 = */ prefix_done,
|
||||
/* c1 = */ prefix_done,
|
||||
/* c2 = */ prefix_done,
|
||||
/* c3 = */ prefix_done,
|
||||
/* c4 = */ prefix_vex_c4,
|
||||
/* c5 = */ prefix_vex_c5,
|
||||
/* c6 = */ prefix_done,
|
||||
/* c7 = */ prefix_done,
|
||||
/* c8 = */ prefix_done,
|
||||
/* c9 = */ prefix_done,
|
||||
/* ca = */ prefix_done,
|
||||
/* cb = */ prefix_done,
|
||||
/* cc = */ prefix_done,
|
||||
/* cd = */ prefix_done,
|
||||
/* ce = */ prefix_done,
|
||||
/* cf = */ prefix_done,
|
||||
|
||||
/* d0 = */ prefix_done,
|
||||
/* d1 = */ prefix_done,
|
||||
/* d2 = */ prefix_done,
|
||||
/* d3 = */ prefix_done,
|
||||
/* d4 = */ prefix_done,
|
||||
/* d5 = */ prefix_done,
|
||||
/* d6 = */ prefix_done,
|
||||
/* d7 = */ prefix_done,
|
||||
/* d8 = */ prefix_done,
|
||||
/* d9 = */ prefix_done,
|
||||
/* da = */ prefix_done,
|
||||
/* db = */ prefix_done,
|
||||
/* dc = */ prefix_done,
|
||||
/* dd = */ prefix_done,
|
||||
/* de = */ prefix_done,
|
||||
/* df = */ prefix_done,
|
||||
|
||||
/* e0 = */ prefix_done,
|
||||
/* e1 = */ prefix_done,
|
||||
/* e2 = */ prefix_done,
|
||||
/* e3 = */ prefix_done,
|
||||
/* e4 = */ prefix_done,
|
||||
/* e5 = */ prefix_done,
|
||||
/* e6 = */ prefix_done,
|
||||
/* e7 = */ prefix_done,
|
||||
/* e8 = */ prefix_done,
|
||||
/* e9 = */ prefix_done,
|
||||
/* ea = */ prefix_done,
|
||||
/* eb = */ prefix_done,
|
||||
/* ec = */ prefix_done,
|
||||
/* ed = */ prefix_done,
|
||||
/* ee = */ prefix_done,
|
||||
/* ef = */ prefix_done,
|
||||
|
||||
/* f0 = */ prefix_lock,
|
||||
/* f1 = */ prefix_done,
|
||||
/* f2 = */ prefix_f2,
|
||||
/* f3 = */ prefix_f3,
|
||||
/* f4 = */ prefix_done,
|
||||
/* f5 = */ prefix_done,
|
||||
/* f6 = */ prefix_done,
|
||||
/* f7 = */ prefix_done,
|
||||
/* f8 = */ prefix_done,
|
||||
/* f9 = */ prefix_done,
|
||||
/* fa = */ prefix_done,
|
||||
/* fb = */ prefix_done,
|
||||
/* fc = */ prefix_done,
|
||||
/* fd = */ prefix_done,
|
||||
/* fe = */ prefix_done,
|
||||
/* ff = */ prefix_done
|
||||
};
|
||||
|
||||
static inline int prefix_decode(struct pt_ild *ild, uint8_t length, uint8_t rex)
|
||||
{
|
||||
@ -822,36 +1068,6 @@ static int prefix_evex(struct pt_ild *ild, uint8_t length, uint8_t rex)
|
||||
return prefix_vex_done(ild, length);
|
||||
}
|
||||
|
||||
static void init_prefix_table(void)
|
||||
{
|
||||
unsigned int byte;
|
||||
|
||||
for (byte = 0; byte <= 0xff; ++byte)
|
||||
prefix_table[byte] = prefix_done;
|
||||
|
||||
prefix_table[0x66] = prefix_osz;
|
||||
prefix_table[0x67] = prefix_asz;
|
||||
|
||||
/* Segment prefixes. */
|
||||
prefix_table[0x2e] = prefix_ignore;
|
||||
prefix_table[0x3e] = prefix_ignore;
|
||||
prefix_table[0x26] = prefix_ignore;
|
||||
prefix_table[0x36] = prefix_ignore;
|
||||
prefix_table[0x64] = prefix_ignore;
|
||||
prefix_table[0x65] = prefix_ignore;
|
||||
|
||||
prefix_table[0xf0] = prefix_lock;
|
||||
prefix_table[0xf2] = prefix_f2;
|
||||
prefix_table[0xf3] = prefix_f3;
|
||||
|
||||
for (byte = 0x40; byte <= 0x4f; ++byte)
|
||||
prefix_table[byte] = prefix_rex;
|
||||
|
||||
prefix_table[0xc4] = prefix_vex_c4;
|
||||
prefix_table[0xc5] = prefix_vex_c5;
|
||||
prefix_table[0x62] = prefix_evex;
|
||||
}
|
||||
|
||||
static int decode(struct pt_ild *ild)
|
||||
{
|
||||
return prefix_decode(ild, 0, 0);
|
||||
@ -885,16 +1101,6 @@ static int set_branch_target(struct pt_insn_ext *iext, const struct pt_ild *ild)
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* MAIN ENTRY POINTS */
|
||||
|
||||
void pt_ild_init(void)
|
||||
{ /* initialization */
|
||||
init_has_disp_regular_table();
|
||||
init_has_sib_table();
|
||||
init_eamode_table();
|
||||
init_prefix_table();
|
||||
}
|
||||
|
||||
static int pt_instruction_length_decode(struct pt_ild *ild)
|
||||
{
|
||||
if (!ild)
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2013-2018, Intel Corporation
|
||||
* Copyright (c) 2013-2019, Intel Corporation
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
@ -43,12 +43,16 @@ static char *dupstr(const char *str)
|
||||
if (!str)
|
||||
return NULL;
|
||||
|
||||
len = strlen(str);
|
||||
/* Silently truncate the name if it gets too big. */
|
||||
len = strnlen(str, 4096ul);
|
||||
|
||||
dup = malloc(len + 1);
|
||||
if (!dup)
|
||||
return NULL;
|
||||
|
||||
return strcpy(dup, str);
|
||||
dup[len] = 0;
|
||||
|
||||
return memcpy(dup, str, len);
|
||||
}
|
||||
|
||||
static struct pt_section_list *pt_mk_section_list(struct pt_section *section,
|
||||
@ -315,9 +319,10 @@ int pt_image_add_file(struct pt_image *image, const char *filename,
|
||||
if (errcode < 0)
|
||||
return errcode;
|
||||
|
||||
section = pt_mk_section(filename, offset, size);
|
||||
if (!section)
|
||||
return -pte_invalid;
|
||||
section = NULL;
|
||||
errcode = pt_mk_section(§ion, filename, offset, size);
|
||||
if (errcode < 0)
|
||||
return errcode;
|
||||
|
||||
errcode = pt_image_add(image, section, &asid, vaddr, 0);
|
||||
if (errcode < 0) {
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2016-2018, Intel Corporation
|
||||
* Copyright (c) 2016-2019, Intel Corporation
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
@ -42,12 +42,16 @@ static char *dupstr(const char *str)
|
||||
if (!str)
|
||||
return NULL;
|
||||
|
||||
len = strlen(str);
|
||||
/* Silently truncate the name if it gets too big. */
|
||||
len = strnlen(str, 4096ul);
|
||||
|
||||
dup = malloc(len + 1);
|
||||
if (!dup)
|
||||
return NULL;
|
||||
|
||||
return strcpy(dup, str);
|
||||
dup[len] = 0;
|
||||
|
||||
return memcpy(dup, str, len);
|
||||
}
|
||||
|
||||
int pt_iscache_init(struct pt_image_section_cache *iscache, const char *name)
|
||||
@ -975,9 +979,10 @@ int pt_iscache_add_file(struct pt_image_section_cache *iscache,
|
||||
if (errcode < 0)
|
||||
return errcode;
|
||||
|
||||
section = pt_mk_section(filename, offset, size);
|
||||
if (!section)
|
||||
return -pte_invalid;
|
||||
section = NULL;
|
||||
errcode = pt_mk_section(§ion, filename, offset, size);
|
||||
if (errcode < 0)
|
||||
return errcode;
|
||||
}
|
||||
|
||||
/* We unlocked @iscache and hold a reference to @section. */
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2016-2018, Intel Corporation
|
||||
* Copyright (c) 2016-2019, Intel Corporation
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
@ -187,7 +187,8 @@ int pt_insn_next_ip(uint64_t *pip, const struct pt_insn *insn,
|
||||
case ptic_call:
|
||||
case ptic_jump:
|
||||
if (iext->variant.branch.is_direct) {
|
||||
ip += iext->variant.branch.displacement;
|
||||
ip += (uint64_t) (int64_t)
|
||||
iext->variant.branch.displacement;
|
||||
break;
|
||||
}
|
||||
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2013-2018, Intel Corporation
|
||||
* Copyright (c) 2013-2019, Intel Corporation
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
@ -99,6 +99,8 @@ static int pt_insn_init_qry_flags(struct pt_conf_flags *qflags,
|
||||
return -pte_internal;
|
||||
|
||||
memset(qflags, 0, sizeof(*qflags));
|
||||
qflags->variant.query.keep_tcal_on_ovf =
|
||||
flags->variant.insn.keep_tcal_on_ovf;
|
||||
|
||||
return 0;
|
||||
}
|
||||
@ -598,7 +600,8 @@ static int pt_insn_proceed(struct pt_insn_decoder *decoder,
|
||||
* and all flavors of far transfers.
|
||||
*/
|
||||
if (iext->variant.branch.is_direct)
|
||||
decoder->ip += iext->variant.branch.displacement;
|
||||
decoder->ip += (uint64_t) (int64_t)
|
||||
iext->variant.branch.displacement;
|
||||
else {
|
||||
int status;
|
||||
|
||||
@ -641,7 +644,7 @@ static int pt_insn_at_skl014(const struct pt_event *ev,
|
||||
/* Check the filter against the branch target. */
|
||||
ip = insn->ip;
|
||||
ip += insn->size;
|
||||
ip += iext->variant.branch.displacement;
|
||||
ip += (uint64_t) (int64_t) iext->variant.branch.displacement;
|
||||
|
||||
status = pt_filter_addr_check(&config->addr_filter, ip);
|
||||
if (status <= 0) {
|
||||
@ -698,7 +701,8 @@ static int pt_insn_at_disabled_event(const struct pt_event *ev,
|
||||
|
||||
ip = insn->ip;
|
||||
ip += insn->size;
|
||||
ip += iext->variant.branch.displacement;
|
||||
ip += (uint64_t) (int64_t)
|
||||
iext->variant.branch.displacement;
|
||||
|
||||
if (ip != ev->variant.disabled.ip)
|
||||
break;
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2013-2018, Intel Corporation
|
||||
* Copyright (c) 2013-2019, Intel Corporation
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2017-2018, Intel Corporation
|
||||
* Copyright (c) 2017-2019, Intel Corporation
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2013-2018, Intel Corporation
|
||||
* Copyright (c) 2013-2019, Intel Corporation
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2014-2018, Intel Corporation
|
||||
* Copyright (c) 2014-2019, Intel Corporation
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
@ -35,6 +35,7 @@
|
||||
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
#include <stddef.h>
|
||||
|
||||
|
||||
int pt_pkt_decoder_init(struct pt_packet_decoder *decoder,
|
||||
@ -87,20 +88,34 @@ void pt_pkt_free_decoder(struct pt_packet_decoder *decoder)
|
||||
|
||||
int pt_pkt_sync_forward(struct pt_packet_decoder *decoder)
|
||||
{
|
||||
const uint8_t *pos, *sync;
|
||||
const uint8_t *pos, *sync, *begin;
|
||||
ptrdiff_t space;
|
||||
int errcode;
|
||||
|
||||
if (!decoder)
|
||||
return -pte_invalid;
|
||||
|
||||
begin = decoder->config.begin;
|
||||
sync = decoder->sync;
|
||||
pos = decoder->pos;
|
||||
if (!pos)
|
||||
pos = decoder->config.begin;
|
||||
pos = begin;
|
||||
|
||||
if (pos == sync)
|
||||
pos += ptps_psb;
|
||||
|
||||
if (pos < begin)
|
||||
return -pte_internal;
|
||||
|
||||
/* Start a bit earlier so we find PSB that have been partially consumed
|
||||
* by a preceding packet.
|
||||
*/
|
||||
space = pos - begin;
|
||||
if (ptps_psb <= space)
|
||||
space = ptps_psb - 1;
|
||||
|
||||
pos -= space;
|
||||
|
||||
errcode = pt_sync_forward(&sync, pos, &decoder->config);
|
||||
if (errcode < 0)
|
||||
return errcode;
|
||||
@ -166,7 +181,7 @@ int pt_pkt_get_offset(const struct pt_packet_decoder *decoder, uint64_t *offset)
|
||||
if (!pos)
|
||||
return -pte_nosync;
|
||||
|
||||
*offset = pos - begin;
|
||||
*offset = (uint64_t) (int64_t) (pos - begin);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -184,7 +199,7 @@ int pt_pkt_get_sync_offset(const struct pt_packet_decoder *decoder,
|
||||
if (!sync)
|
||||
return -pte_nosync;
|
||||
|
||||
*offset = sync - begin;
|
||||
*offset = (uint64_t) (int64_t) (sync - begin);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2014-2018, Intel Corporation
|
||||
* Copyright (c) 2014-2019, Intel Corporation
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
@ -560,20 +560,34 @@ static int pt_qry_apply_cyc(struct pt_time *time, struct pt_time_cal *tcal,
|
||||
|
||||
int pt_qry_sync_forward(struct pt_query_decoder *decoder, uint64_t *ip)
|
||||
{
|
||||
const uint8_t *pos, *sync;
|
||||
const uint8_t *pos, *sync, *begin;
|
||||
ptrdiff_t space;
|
||||
int errcode;
|
||||
|
||||
if (!decoder)
|
||||
return -pte_invalid;
|
||||
|
||||
begin = decoder->config.begin;
|
||||
sync = decoder->sync;
|
||||
pos = decoder->pos;
|
||||
if (!pos)
|
||||
pos = decoder->config.begin;
|
||||
pos = begin;
|
||||
|
||||
if (pos == sync)
|
||||
pos += ptps_psb;
|
||||
|
||||
if (pos < begin)
|
||||
return -pte_internal;
|
||||
|
||||
/* Start a bit earlier so we find PSB that have been partially consumed
|
||||
* by a preceding packet.
|
||||
*/
|
||||
space = pos - begin;
|
||||
if (ptps_psb <= space)
|
||||
space = ptps_psb - 1;
|
||||
|
||||
pos -= space;
|
||||
|
||||
errcode = pt_sync_forward(&sync, pos, &decoder->config);
|
||||
if (errcode < 0)
|
||||
return errcode;
|
||||
@ -653,7 +667,7 @@ int pt_qry_get_offset(const struct pt_query_decoder *decoder, uint64_t *offset)
|
||||
if (!pos)
|
||||
return -pte_nosync;
|
||||
|
||||
*offset = pos - begin;
|
||||
*offset = (uint64_t) (int64_t) (pos - begin);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -671,7 +685,7 @@ int pt_qry_get_sync_offset(const struct pt_query_decoder *decoder,
|
||||
if (!sync)
|
||||
return -pte_nosync;
|
||||
|
||||
*offset = sync - begin;
|
||||
*offset = (uint64_t) (int64_t) (sync - begin);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -1043,6 +1057,10 @@ int pt_qry_decode_psb(struct pt_query_decoder *decoder)
|
||||
if (size < 0)
|
||||
return size;
|
||||
|
||||
errcode = pt_tcal_update_psb(&decoder->tcal, &decoder->config);
|
||||
if (errcode < 0)
|
||||
return errcode;
|
||||
|
||||
decoder->pos += size;
|
||||
|
||||
errcode = pt_qry_read_psb_header(decoder);
|
||||
@ -2835,6 +2853,7 @@ static int pt_qry_find_ovf_fup(const struct pt_query_decoder *decoder)
|
||||
|
||||
int pt_qry_decode_ovf(struct pt_query_decoder *decoder)
|
||||
{
|
||||
struct pt_time_cal tcal;
|
||||
struct pt_time time;
|
||||
int status, offset;
|
||||
|
||||
@ -2851,8 +2870,18 @@ int pt_qry_decode_ovf(struct pt_query_decoder *decoder)
|
||||
|
||||
/* Reset the decoder state but preserve timing. */
|
||||
time = decoder->time;
|
||||
tcal = decoder->tcal;
|
||||
|
||||
pt_qry_reset(decoder);
|
||||
|
||||
decoder->time = time;
|
||||
if (decoder->config.flags.variant.query.keep_tcal_on_ovf) {
|
||||
status = pt_tcal_update_ovf(&tcal, &decoder->config);
|
||||
if (status < 0)
|
||||
return status;
|
||||
|
||||
decoder->tcal = tcal;
|
||||
}
|
||||
|
||||
/* We must consume the OVF before we search for the binding packet. */
|
||||
decoder->pos += ptps_ovf;
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2013-2018, Intel Corporation
|
||||
* Copyright (c) 2013-2019, Intel Corporation
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2013-2018, Intel Corporation
|
||||
* Copyright (c) 2013-2019, Intel Corporation
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
@ -37,37 +37,40 @@
|
||||
#include <string.h>
|
||||
|
||||
|
||||
static char *dupstr(const char *str)
|
||||
{
|
||||
char *dup;
|
||||
size_t len;
|
||||
|
||||
if (!str)
|
||||
return NULL;
|
||||
|
||||
len = strlen(str);
|
||||
dup = malloc(len + 1);
|
||||
if (!dup)
|
||||
return NULL;
|
||||
|
||||
return strcpy(dup, str);
|
||||
}
|
||||
|
||||
struct pt_section *pt_mk_section(const char *filename, uint64_t offset,
|
||||
uint64_t size)
|
||||
int pt_mk_section(struct pt_section **psection, const char *filename,
|
||||
uint64_t offset, uint64_t size)
|
||||
{
|
||||
struct pt_section *section;
|
||||
uint64_t fsize;
|
||||
size_t flen;
|
||||
void *status;
|
||||
char *fname;
|
||||
int errcode;
|
||||
|
||||
errcode = pt_section_mk_status(&status, &fsize, filename);
|
||||
if (!psection)
|
||||
return -pte_internal;
|
||||
|
||||
flen = strnlen(filename, FILENAME_MAX);
|
||||
if (FILENAME_MAX <= flen)
|
||||
return -pte_invalid;
|
||||
|
||||
flen += 1;
|
||||
|
||||
fname = malloc(flen);
|
||||
if (!fname)
|
||||
return -pte_nomem;
|
||||
|
||||
memcpy(fname, filename, flen);
|
||||
|
||||
errcode = pt_section_mk_status(&status, &fsize, fname);
|
||||
if (errcode < 0)
|
||||
return NULL;
|
||||
goto out_fname;
|
||||
|
||||
/* Fail if the requested @offset lies beyond the end of @file. */
|
||||
if (fsize <= offset)
|
||||
if (fsize <= offset) {
|
||||
errcode = -pte_invalid;
|
||||
goto out_status;
|
||||
}
|
||||
|
||||
/* Truncate @size so the entire range lies within @file. */
|
||||
fsize -= offset;
|
||||
@ -75,12 +78,14 @@ struct pt_section *pt_mk_section(const char *filename, uint64_t offset,
|
||||
size = fsize;
|
||||
|
||||
section = malloc(sizeof(*section));
|
||||
if (!section)
|
||||
if (!section) {
|
||||
errcode = -pte_nomem;
|
||||
goto out_status;
|
||||
}
|
||||
|
||||
memset(section, 0, sizeof(*section));
|
||||
|
||||
section->filename = dupstr(filename);
|
||||
section->filename = fname;
|
||||
section->status = status;
|
||||
section->offset = offset;
|
||||
section->size = size;
|
||||
@ -90,26 +95,32 @@ struct pt_section *pt_mk_section(const char *filename, uint64_t offset,
|
||||
|
||||
errcode = mtx_init(§ion->lock, mtx_plain);
|
||||
if (errcode != thrd_success) {
|
||||
free(section->filename);
|
||||
free(section);
|
||||
|
||||
errcode = -pte_bad_lock;
|
||||
goto out_status;
|
||||
}
|
||||
|
||||
errcode = mtx_init(§ion->alock, mtx_plain);
|
||||
if (errcode != thrd_success) {
|
||||
mtx_destroy(§ion->lock);
|
||||
free(section->filename);
|
||||
free(section);
|
||||
|
||||
errcode = -pte_bad_lock;
|
||||
goto out_status;
|
||||
}
|
||||
|
||||
#endif /* defined(FEATURE_THREADS) */
|
||||
|
||||
return section;
|
||||
*psection = section;
|
||||
return 0;
|
||||
|
||||
out_status:
|
||||
free(status);
|
||||
return NULL;
|
||||
|
||||
out_fname:
|
||||
free(fname);
|
||||
return errcode;
|
||||
}
|
||||
|
||||
int pt_section_lock(struct pt_section *section)
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2013-2018, Intel Corporation
|
||||
* Copyright (c) 2013-2019, Intel Corporation
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2013-2018, Intel Corporation
|
||||
* Copyright (c) 2013-2019, Intel Corporation
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
@ -161,11 +161,12 @@ int pt_sync_set(const uint8_t **sync, const uint8_t *pos,
|
||||
int pt_sync_forward(const uint8_t **sync, const uint8_t *pos,
|
||||
const struct pt_config *config)
|
||||
{
|
||||
const uint8_t *begin, *end;
|
||||
const uint8_t *begin, *end, *start;
|
||||
|
||||
if (!sync || !pos || !config)
|
||||
return -pte_internal;
|
||||
|
||||
start = pos;
|
||||
begin = config->begin;
|
||||
end = config->end;
|
||||
|
||||
@ -194,6 +195,12 @@ int pt_sync_forward(const uint8_t **sync, const uint8_t *pos,
|
||||
if (!current)
|
||||
continue;
|
||||
|
||||
/* If @start points inside a PSB, we may find that one. Ignore
|
||||
* it unless @start points to its beginning.
|
||||
*/
|
||||
if (current < start)
|
||||
continue;
|
||||
|
||||
*sync = current;
|
||||
return 0;
|
||||
}
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2014-2018, Intel Corporation
|
||||
* Copyright (c) 2014-2019, Intel Corporation
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
@ -154,13 +154,19 @@ int pt_time_update_cbr(struct pt_time *time,
|
||||
const struct pt_packet_cbr *packet,
|
||||
const struct pt_config *config)
|
||||
{
|
||||
uint8_t cbr;
|
||||
|
||||
(void) config;
|
||||
|
||||
if (!time || !packet)
|
||||
return -pte_internal;
|
||||
|
||||
cbr = packet->ratio;
|
||||
if (!cbr)
|
||||
return -pte_bad_packet;
|
||||
|
||||
time->have_cbr = 1;
|
||||
time->cbr = packet->ratio;
|
||||
time->cbr = cbr;
|
||||
|
||||
return 0;
|
||||
}
|
||||
@ -254,7 +260,7 @@ int pt_time_update_mtc(struct pt_time *time,
|
||||
last_ctc = time->ctc;
|
||||
mtc_freq = config->mtc_freq;
|
||||
|
||||
ctc = packet->ctc << mtc_freq;
|
||||
ctc = (uint32_t) packet->ctc << mtc_freq;
|
||||
|
||||
/* Store our CTC value if we have or would have reset FC. */
|
||||
if (time->fc || time->lost_cyc || !have_mtc)
|
||||
@ -288,14 +294,14 @@ int pt_time_update_mtc(struct pt_time *time,
|
||||
/* The TMA's CTC value didn't provide enough bits - otherwise,
|
||||
* we would have treated the TMA as an MTC.
|
||||
*/
|
||||
if (last_ctc & ~pt_pl_tma_ctc_mask)
|
||||
if (last_ctc & ~(uint32_t) pt_pl_tma_ctc_mask)
|
||||
return -pte_internal;
|
||||
|
||||
/* Split this MTC's CTC value into low and high parts with
|
||||
* respect to the bits provided by TMA.
|
||||
*/
|
||||
ctc_lo = ctc & pt_pl_tma_ctc_mask;
|
||||
ctc_hi = ctc & ~pt_pl_tma_ctc_mask;
|
||||
ctc_lo = ctc & (uint32_t) pt_pl_tma_ctc_mask;
|
||||
ctc_hi = ctc & ~(uint32_t) pt_pl_tma_ctc_mask;
|
||||
|
||||
/* We estimate the high-order CTC bits that are not provided by
|
||||
* TMA based on the CTC bits provided by this MTC.
|
||||
@ -310,7 +316,7 @@ int pt_time_update_mtc(struct pt_time *time,
|
||||
*/
|
||||
if (ctc_lo < last_ctc) {
|
||||
ctc_hi -= 1u << pt_pl_tma_ctc_bit_size;
|
||||
ctc_hi &= pt_pl_mtc_mask << mtc_freq;
|
||||
ctc_hi &= (uint32_t) pt_pl_mtc_mask << mtc_freq;
|
||||
}
|
||||
|
||||
last_ctc |= ctc_hi;
|
||||
@ -478,6 +484,18 @@ int pt_tcal_set_fcr(struct pt_time_cal *tcal, uint64_t fcr)
|
||||
return 0;
|
||||
}
|
||||
|
||||
int pt_tcal_update_psb(struct pt_time_cal *tcal,
|
||||
const struct pt_config *config)
|
||||
{
|
||||
if (!tcal || !config)
|
||||
return -pte_internal;
|
||||
|
||||
if (config->errata.skl168)
|
||||
tcal->check_skl168 = 1;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int pt_tcal_update_tsc(struct pt_time_cal *tcal,
|
||||
const struct pt_packet_tsc *packet,
|
||||
const struct pt_config *config)
|
||||
@ -519,6 +537,10 @@ int pt_tcal_header_tsc(struct pt_time_cal *tcal,
|
||||
if (!last_tsc || !cyc)
|
||||
return 0;
|
||||
|
||||
/* Prefer MTC over TSC for calibration. */
|
||||
if (tcal->have_mtc)
|
||||
return 0;
|
||||
|
||||
/* Correct a single wrap-around. */
|
||||
if (tsc < last_tsc) {
|
||||
tsc += 1ull << pt_pl_tsc_bit_size;
|
||||
@ -569,6 +591,8 @@ int pt_tcal_header_cbr(struct pt_time_cal *tcal,
|
||||
|
||||
/* If we know the nominal frequency, we can use it for calibration. */
|
||||
cbr = packet->ratio;
|
||||
if (!cbr)
|
||||
return -pte_bad_packet;
|
||||
|
||||
fcr = (p1 << pt_tcal_fcr_shr) / cbr;
|
||||
|
||||
@ -591,7 +615,7 @@ int pt_tcal_update_mtc(struct pt_time_cal *tcal,
|
||||
const struct pt_packet_mtc *packet,
|
||||
const struct pt_config *config)
|
||||
{
|
||||
uint32_t last_ctc, ctc, ctc_delta, have_mtc;
|
||||
uint32_t last_ctc, ctc, ctc_delta, have_mtc, check_skl168;
|
||||
uint64_t cyc, fc, fcr;
|
||||
int errcode;
|
||||
|
||||
@ -601,8 +625,12 @@ int pt_tcal_update_mtc(struct pt_time_cal *tcal,
|
||||
last_ctc = tcal->ctc;
|
||||
have_mtc = tcal->have_mtc;
|
||||
cyc = tcal->cyc_mtc;
|
||||
check_skl168 = tcal->check_skl168;
|
||||
|
||||
ctc = packet->ctc << config->mtc_freq;
|
||||
/* This only affects the first MTC after PSB. */
|
||||
tcal->check_skl168 = 0;
|
||||
|
||||
ctc = (uint32_t) packet->ctc << config->mtc_freq;
|
||||
|
||||
/* We need at least two MTC (including this). */
|
||||
if (!have_mtc) {
|
||||
@ -645,6 +673,49 @@ int pt_tcal_update_mtc(struct pt_time_cal *tcal,
|
||||
|
||||
fcr = (fc << pt_tcal_fcr_shr) / cyc;
|
||||
|
||||
/* SKL168: Intel(R) PT CYC Packets Can be Dropped When Immediately
|
||||
* Preceding PSB.
|
||||
*
|
||||
* We skip this MTC if we lost one or more MTC since the last PSB or if
|
||||
* it looks like we lost a wrap CYC packet.
|
||||
*
|
||||
* This is not an error but we count that MTC as lost.
|
||||
*/
|
||||
if (check_skl168) {
|
||||
/* If we lost one or more MTC, the case is clear. */
|
||||
if ((1u << config->mtc_freq) < ctc_delta)
|
||||
return 0;
|
||||
|
||||
/* The case is less clear for a lost wrap CYC packet since we do
|
||||
* have some variation in the number of cycles.
|
||||
*
|
||||
* The CYC counter wraps on the affected processors every 4096
|
||||
* cycles. For low MTC frequencies (high values), losing one
|
||||
* may not be noticeable.
|
||||
*
|
||||
* We restrict the workaround to higher MTC frequencies (lower
|
||||
* values).
|
||||
*
|
||||
* We also need a previous FCR so we know how many cycles to
|
||||
* expect.
|
||||
*/
|
||||
if ((config->mtc_freq < 10) && pt_tcal_have_fcr(tcal)) {
|
||||
uint64_t dfc;
|
||||
|
||||
/* We choose a slightly lower adjustment to account for
|
||||
* some normal variation.
|
||||
*/
|
||||
dfc = (tcal->fcr * (cyc + 0xf00)) >> pt_tcal_fcr_shr;
|
||||
|
||||
/* If we didn't drop a wrap CYC, @dfc should be way
|
||||
* bigger than @fc. If it isn't, we assume that the
|
||||
* erratum applied.
|
||||
*/
|
||||
if (dfc < fc)
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
errcode = pt_tcal_set_fcr(tcal, fcr);
|
||||
if (errcode < 0)
|
||||
return errcode;
|
||||
@ -672,3 +743,18 @@ int pt_tcal_update_cyc(struct pt_time_cal *tcal,
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int pt_tcal_update_ovf(struct pt_time_cal *tcal,
|
||||
const struct pt_config *config)
|
||||
{
|
||||
if (!tcal || !config)
|
||||
return -pte_internal;
|
||||
|
||||
tcal->tsc = 0ull;
|
||||
tcal->cyc_tsc = 0ull;
|
||||
tcal->cyc_mtc = 0ull;
|
||||
tcal->ctc = 0;
|
||||
tcal->have_mtc = 0;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2013-2018, Intel Corporation
|
||||
* Copyright (c) 2013-2019, Intel Corporation
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2013-2018, Intel Corporation
|
||||
* Copyright (c) 2013-2019, Intel Corporation
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
@ -32,9 +32,9 @@
|
||||
struct pt_version pt_library_version(void)
|
||||
{
|
||||
struct pt_version v = {
|
||||
/* .major = */ PT_VERSION_MAJOR,
|
||||
/* .major = */ PT_VERSION_MAJOR,
|
||||
/* .minor = */ PT_VERSION_MINOR,
|
||||
/* .reserved = */ 0,
|
||||
/* .patch = */ PT_VERSION_PATCH,
|
||||
/* .build = */ PT_VERSION_BUILD,
|
||||
/* .ext = */ PT_VERSION_EXT
|
||||
};
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2013-2018, Intel Corporation
|
||||
* Copyright (c) 2013-2019, Intel Corporation
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2015-2018, Intel Corporation
|
||||
* Copyright (c) 2015-2019, Intel Corporation
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
@ -47,14 +47,14 @@ static int pt_sec_windows_fstat(const char *filename, struct _stat *stat)
|
||||
|
||||
fd = _open(filename, _O_RDONLY);
|
||||
if (fd == -1)
|
||||
return -pte_bad_image;
|
||||
return -pte_bad_file;
|
||||
|
||||
errcode = _fstat(fd, stat);
|
||||
|
||||
_close(fd);
|
||||
|
||||
if (errcode)
|
||||
return -pte_bad_image;
|
||||
return -pte_bad_file;
|
||||
|
||||
return 0;
|
||||
}
|
||||
@ -98,7 +98,7 @@ static int check_file_status(struct pt_section *section, int fd)
|
||||
|
||||
errcode = _fstat(fd, &stat);
|
||||
if (errcode)
|
||||
return -pte_bad_image;
|
||||
return -pte_bad_file;
|
||||
|
||||
status = section->status;
|
||||
if (!status)
|
||||
@ -256,8 +256,8 @@ int pt_section_map(struct pt_section *section)
|
||||
goto out_unlock;
|
||||
}
|
||||
|
||||
fh = CreateFile(filename, GENERIC_READ, FILE_SHARE_READ, NULL,
|
||||
OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
|
||||
fh = CreateFileA(filename, GENERIC_READ, FILE_SHARE_READ, NULL,
|
||||
OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
|
||||
if (fh == INVALID_HANDLE_VALUE) {
|
||||
/* We failed to open the file read-only. Let's try to open it
|
||||
* read-write; maybe our user has the file open for writing.
|
||||
@ -265,25 +265,24 @@ int pt_section_map(struct pt_section *section)
|
||||
* We will detect changes to the file via fstat().
|
||||
*/
|
||||
|
||||
fh = CreateFile(filename, GENERIC_READ, FILE_SHARE_WRITE, NULL,
|
||||
OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
|
||||
fh = CreateFileA(filename, GENERIC_READ, FILE_SHARE_WRITE,
|
||||
NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL,
|
||||
NULL);
|
||||
if (fh == INVALID_HANDLE_VALUE) {
|
||||
errcode = -pte_bad_image;
|
||||
errcode = -pte_bad_file;
|
||||
goto out_unlock;
|
||||
}
|
||||
}
|
||||
|
||||
fd = _open_osfhandle((intptr_t) fh, _O_RDONLY);
|
||||
if (fd == -1) {
|
||||
errcode = -pte_bad_image;
|
||||
errcode = -pte_bad_file;
|
||||
goto out_fh;
|
||||
}
|
||||
|
||||
errcode = check_file_status(section, fd);
|
||||
if (errcode < 0) {
|
||||
errcode = -pte_bad_image;
|
||||
if (errcode < 0)
|
||||
goto out_fd;
|
||||
}
|
||||
|
||||
/* We leave the file open on success. It will be closed when the
|
||||
* section is unmapped.
|
||||
@ -297,7 +296,7 @@ int pt_section_map(struct pt_section *section)
|
||||
*/
|
||||
file = _fdopen(fd, "rb");
|
||||
if (!file) {
|
||||
errcode = -pte_bad_image;
|
||||
errcode = -pte_bad_file;
|
||||
goto out_fd;
|
||||
}
|
||||
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2014-2018, Intel Corporation
|
||||
* Copyright (c) 2014-2019, Intel Corporation
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2016-2018, Intel Corporation
|
||||
* Copyright (c) 2016-2019, Intel Corporation
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
|
351
contrib/processor-trace/libipt/test/src/ptunit-block_decoder.c
Normal file
351
contrib/processor-trace/libipt/test/src/ptunit-block_decoder.c
Normal file
@ -0,0 +1,351 @@
|
||||
/*
|
||||
* Copyright (c) 2019, Intel Corporation
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
*
|
||||
* * Redistributions of source code must retain the above copyright notice,
|
||||
* this list of conditions and the following disclaimer.
|
||||
* * Redistributions in binary form must reproduce the above copyright notice,
|
||||
* this list of conditions and the following disclaimer in the documentation
|
||||
* and/or other materials provided with the distribution.
|
||||
* * Neither the name of Intel Corporation nor the names of its contributors
|
||||
* may be used to endorse or promote products derived from this software
|
||||
* without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
* POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#include "ptunit.h"
|
||||
|
||||
#include "pt_block_decoder.h"
|
||||
|
||||
#include "intel-pt.h"
|
||||
|
||||
|
||||
/* A test fixture providing a decoder operating on a small buffer. */
|
||||
struct test_fixture {
|
||||
/* The packet_decoder. */
|
||||
struct pt_block_decoder decoder;
|
||||
|
||||
/* The configuration. */
|
||||
struct pt_config config;
|
||||
|
||||
/* The buffer it operates on. */
|
||||
uint8_t buffer[24];
|
||||
|
||||
/* The test fixture initialization and finalization functions. */
|
||||
struct ptunit_result (*init)(struct test_fixture *tfix);
|
||||
struct ptunit_result (*fini)(struct test_fixture *tfix);
|
||||
};
|
||||
|
||||
static struct ptunit_result tfix_init(struct test_fixture *tfix)
|
||||
{
|
||||
struct pt_config *config;
|
||||
uint8_t *buffer;
|
||||
int errcode;
|
||||
|
||||
config = &tfix->config;
|
||||
buffer = tfix->buffer;
|
||||
|
||||
memset(buffer, 0, sizeof(tfix->buffer));
|
||||
|
||||
pt_config_init(config);
|
||||
config->begin = buffer;
|
||||
config->end = buffer + sizeof(tfix->buffer);
|
||||
|
||||
errcode = pt_blk_decoder_init(&tfix->decoder, config);
|
||||
ptu_int_eq(errcode, 0);
|
||||
|
||||
return ptu_passed();
|
||||
}
|
||||
|
||||
static struct ptunit_result decoder_init_null(void)
|
||||
{
|
||||
struct pt_block_decoder decoder;
|
||||
struct pt_config config;
|
||||
int errcode;
|
||||
|
||||
errcode = pt_blk_decoder_init(NULL, &config);
|
||||
ptu_int_eq(errcode, -pte_internal);
|
||||
|
||||
errcode = pt_blk_decoder_init(&decoder, NULL);
|
||||
ptu_int_eq(errcode, -pte_invalid);
|
||||
|
||||
return ptu_passed();
|
||||
}
|
||||
|
||||
static struct ptunit_result decoder_fini_null(void)
|
||||
{
|
||||
pt_blk_decoder_fini(NULL);
|
||||
|
||||
return ptu_passed();
|
||||
}
|
||||
|
||||
static struct ptunit_result alloc_decoder_null(void)
|
||||
{
|
||||
struct pt_block_decoder *decoder;
|
||||
|
||||
decoder = pt_blk_alloc_decoder(NULL);
|
||||
ptu_null(decoder);
|
||||
|
||||
return ptu_passed();
|
||||
}
|
||||
|
||||
static struct ptunit_result free_decoder_null(void)
|
||||
{
|
||||
pt_blk_free_decoder(NULL);
|
||||
|
||||
return ptu_passed();
|
||||
}
|
||||
|
||||
static struct ptunit_result sync_forward_null(void)
|
||||
{
|
||||
int errcode;
|
||||
|
||||
errcode = pt_blk_sync_forward(NULL);
|
||||
ptu_int_eq(errcode, -pte_invalid);
|
||||
|
||||
return ptu_passed();
|
||||
}
|
||||
|
||||
static struct ptunit_result sync_backward_null(void)
|
||||
{
|
||||
int errcode;
|
||||
|
||||
errcode = pt_blk_sync_backward(NULL);
|
||||
ptu_int_eq(errcode, -pte_invalid);
|
||||
|
||||
return ptu_passed();
|
||||
}
|
||||
|
||||
static struct ptunit_result sync_set_null(void)
|
||||
{
|
||||
int errcode;
|
||||
|
||||
errcode = pt_blk_sync_set(NULL, 0ull);
|
||||
ptu_int_eq(errcode, -pte_invalid);
|
||||
|
||||
return ptu_passed();
|
||||
}
|
||||
|
||||
static struct ptunit_result sync_set_eos(struct test_fixture *tfix)
|
||||
{
|
||||
int errcode;
|
||||
|
||||
errcode = pt_blk_sync_set(&tfix->decoder, sizeof(tfix->buffer) + 1);
|
||||
ptu_int_eq(errcode, -pte_eos);
|
||||
|
||||
return ptu_passed();
|
||||
}
|
||||
|
||||
static struct ptunit_result get_offset_null(void)
|
||||
{
|
||||
struct pt_block_decoder decoder;
|
||||
uint64_t offset;
|
||||
int errcode;
|
||||
|
||||
errcode = pt_blk_get_offset(NULL, &offset);
|
||||
ptu_int_eq(errcode, -pte_invalid);
|
||||
|
||||
errcode = pt_blk_get_offset(&decoder, NULL);
|
||||
ptu_int_eq(errcode, -pte_invalid);
|
||||
|
||||
return ptu_passed();
|
||||
}
|
||||
|
||||
static struct ptunit_result get_offset_init(struct test_fixture *tfix)
|
||||
{
|
||||
uint64_t offset;
|
||||
int errcode;
|
||||
|
||||
errcode = pt_blk_get_offset(&tfix->decoder, &offset);
|
||||
ptu_int_eq(errcode, -pte_nosync);
|
||||
|
||||
return ptu_passed();
|
||||
}
|
||||
|
||||
static struct ptunit_result get_sync_offset_null(void)
|
||||
{
|
||||
struct pt_block_decoder decoder;
|
||||
uint64_t offset;
|
||||
int errcode;
|
||||
|
||||
errcode = pt_blk_get_sync_offset(NULL, &offset);
|
||||
ptu_int_eq(errcode, -pte_invalid);
|
||||
|
||||
errcode = pt_blk_get_sync_offset(&decoder, NULL);
|
||||
ptu_int_eq(errcode, -pte_invalid);
|
||||
|
||||
return ptu_passed();
|
||||
}
|
||||
|
||||
static struct ptunit_result get_image_null(void)
|
||||
{
|
||||
const struct pt_image *image;
|
||||
|
||||
image = pt_blk_get_image(NULL);
|
||||
ptu_null(image);
|
||||
|
||||
return ptu_passed();
|
||||
}
|
||||
|
||||
static struct ptunit_result set_image_null(void)
|
||||
{
|
||||
struct pt_image image;
|
||||
int errcode;
|
||||
|
||||
errcode = pt_blk_set_image(NULL, &image);
|
||||
ptu_int_eq(errcode, -pte_invalid);
|
||||
|
||||
errcode = pt_blk_set_image(NULL, NULL);
|
||||
ptu_int_eq(errcode, -pte_invalid);
|
||||
|
||||
return ptu_passed();
|
||||
}
|
||||
|
||||
static struct ptunit_result get_config_null(void)
|
||||
{
|
||||
const struct pt_config *config;
|
||||
|
||||
config = pt_blk_get_config(NULL);
|
||||
ptu_null(config);
|
||||
|
||||
return ptu_passed();
|
||||
}
|
||||
|
||||
static struct ptunit_result get_config(struct test_fixture *tfix)
|
||||
{
|
||||
const struct pt_config *config;
|
||||
|
||||
config = pt_blk_get_config(&tfix->decoder);
|
||||
ptu_ptr(config);
|
||||
|
||||
return ptu_passed();
|
||||
}
|
||||
|
||||
static struct ptunit_result time_null(void)
|
||||
{
|
||||
struct pt_block_decoder decoder;
|
||||
uint64_t time;
|
||||
uint32_t lost_mtc, lost_cyc;
|
||||
int errcode;
|
||||
|
||||
errcode = pt_blk_time(NULL, &time, &lost_mtc, &lost_cyc);
|
||||
ptu_int_eq(errcode, -pte_invalid);
|
||||
|
||||
errcode = pt_blk_time(&decoder, NULL, &lost_mtc, &lost_cyc);
|
||||
ptu_int_eq(errcode, -pte_invalid);
|
||||
|
||||
return ptu_passed();
|
||||
}
|
||||
|
||||
static struct ptunit_result cbr_null(void)
|
||||
{
|
||||
struct pt_block_decoder decoder;
|
||||
uint32_t cbr;
|
||||
int errcode;
|
||||
|
||||
errcode = pt_blk_core_bus_ratio(NULL, &cbr);
|
||||
ptu_int_eq(errcode, -pte_invalid);
|
||||
|
||||
errcode = pt_blk_core_bus_ratio(&decoder, NULL);
|
||||
ptu_int_eq(errcode, -pte_invalid);
|
||||
|
||||
return ptu_passed();
|
||||
}
|
||||
|
||||
static struct ptunit_result asid_null(void)
|
||||
{
|
||||
struct pt_block_decoder decoder;
|
||||
struct pt_asid asid;
|
||||
int errcode;
|
||||
|
||||
errcode = pt_blk_asid(NULL, &asid, sizeof(asid));
|
||||
ptu_int_eq(errcode, -pte_invalid);
|
||||
|
||||
errcode = pt_blk_asid(&decoder, NULL, sizeof(asid));
|
||||
ptu_int_eq(errcode, -pte_invalid);
|
||||
|
||||
return ptu_passed();
|
||||
}
|
||||
|
||||
static struct ptunit_result next_null(void)
|
||||
{
|
||||
struct pt_block_decoder decoder;
|
||||
struct pt_block block;
|
||||
int errcode;
|
||||
|
||||
errcode = pt_blk_next(NULL, &block, sizeof(block));
|
||||
ptu_int_eq(errcode, -pte_invalid);
|
||||
|
||||
errcode = pt_blk_next(&decoder, NULL, sizeof(block));
|
||||
ptu_int_eq(errcode, -pte_invalid);
|
||||
|
||||
return ptu_passed();
|
||||
}
|
||||
|
||||
static struct ptunit_result event_null(void)
|
||||
{
|
||||
struct pt_block_decoder decoder;
|
||||
struct pt_event event;
|
||||
int errcode;
|
||||
|
||||
errcode = pt_blk_event(NULL, &event, sizeof(event));
|
||||
ptu_int_eq(errcode, -pte_invalid);
|
||||
|
||||
errcode = pt_blk_event(&decoder, NULL, sizeof(event));
|
||||
ptu_int_eq(errcode, -pte_invalid);
|
||||
|
||||
return ptu_passed();
|
||||
}
|
||||
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
struct test_fixture tfix;
|
||||
struct ptunit_suite suite;
|
||||
|
||||
tfix.init = tfix_init;
|
||||
tfix.fini = NULL;
|
||||
|
||||
suite = ptunit_mk_suite(argc, argv);
|
||||
|
||||
ptu_run(suite, decoder_init_null);
|
||||
ptu_run(suite, decoder_fini_null);
|
||||
ptu_run(suite, alloc_decoder_null);
|
||||
ptu_run(suite, free_decoder_null);
|
||||
|
||||
ptu_run(suite, sync_forward_null);
|
||||
ptu_run(suite, sync_backward_null);
|
||||
ptu_run(suite, sync_set_null);
|
||||
ptu_run_f(suite, sync_set_eos, tfix);
|
||||
|
||||
ptu_run(suite, get_offset_null);
|
||||
ptu_run_f(suite, get_offset_init, tfix);
|
||||
ptu_run(suite, get_sync_offset_null);
|
||||
|
||||
ptu_run(suite, get_image_null);
|
||||
ptu_run(suite, set_image_null);
|
||||
|
||||
ptu_run(suite, get_config_null);
|
||||
ptu_run_f(suite, get_config, tfix);
|
||||
|
||||
ptu_run(suite, time_null);
|
||||
ptu_run(suite, cbr_null);
|
||||
ptu_run(suite, asid_null);
|
||||
|
||||
ptu_run(suite, next_null);
|
||||
ptu_run(suite, event_null);
|
||||
|
||||
return ptunit_report(&suite);
|
||||
}
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2015-2018, Intel Corporation
|
||||
* Copyright (c) 2015-2019, Intel Corporation
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
@ -464,6 +464,67 @@ static struct ptunit_result addr_filter_ip_in_stop_in(void)
|
||||
return ptu_passed();
|
||||
}
|
||||
|
||||
static struct ptunit_result cpu_errata_null(void)
|
||||
{
|
||||
struct pt_errata errata;
|
||||
struct pt_cpu cpu;
|
||||
int errcode;
|
||||
|
||||
errcode = pt_cpu_errata(&errata, NULL);
|
||||
ptu_int_eq(errcode, -pte_invalid);
|
||||
|
||||
errcode = pt_cpu_errata(NULL, &cpu);
|
||||
ptu_int_eq(errcode, -pte_invalid);
|
||||
|
||||
return ptu_passed();
|
||||
}
|
||||
|
||||
static struct ptunit_result cpu_errata_unknown(void)
|
||||
{
|
||||
struct pt_errata errata;
|
||||
struct pt_cpu cpu;
|
||||
int errcode;
|
||||
|
||||
memset(&cpu, 0, sizeof(cpu));
|
||||
|
||||
errcode = pt_cpu_errata(&errata, &cpu);
|
||||
ptu_int_eq(errcode, -pte_bad_cpu);
|
||||
|
||||
return ptu_passed();
|
||||
}
|
||||
|
||||
static struct ptunit_result cpu_errata_bad_vendor(void)
|
||||
{
|
||||
struct pt_errata errata;
|
||||
struct pt_cpu cpu;
|
||||
int errcode;
|
||||
|
||||
memset(&cpu, 0, sizeof(cpu));
|
||||
cpu.vendor = (enum pt_cpu_vendor) 0xffff;
|
||||
|
||||
errcode = pt_cpu_errata(&errata, &cpu);
|
||||
ptu_int_eq(errcode, -pte_bad_cpu);
|
||||
|
||||
return ptu_passed();
|
||||
}
|
||||
|
||||
static struct ptunit_result cpu_errata_bad_cpuid(void)
|
||||
{
|
||||
struct pt_errata errata;
|
||||
struct pt_cpu cpu;
|
||||
int errcode;
|
||||
|
||||
memset(&cpu, 0, sizeof(cpu));
|
||||
cpu.vendor = pcv_intel;
|
||||
cpu.family = 6;
|
||||
cpu.model = 63;
|
||||
|
||||
errcode = pt_cpu_errata(&errata, &cpu);
|
||||
ptu_int_eq(errcode, -pte_bad_cpu);
|
||||
|
||||
return ptu_passed();
|
||||
}
|
||||
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
struct ptunit_suite suite;
|
||||
@ -492,5 +553,10 @@ int main(int argc, char **argv)
|
||||
ptu_run(suite, addr_filter_ip_out_stop_in);
|
||||
ptu_run(suite, addr_filter_ip_in_stop_in);
|
||||
|
||||
ptu_run(suite, cpu_errata_null);
|
||||
ptu_run(suite, cpu_errata_unknown);
|
||||
ptu_run(suite, cpu_errata_bad_vendor);
|
||||
ptu_run(suite, cpu_errata_bad_cpuid);
|
||||
|
||||
return ptunit_report(&suite);
|
||||
}
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2013-2018, Intel Corporation
|
||||
* Copyright (c) 2013-2019, Intel Corporation
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2013-2018, Intel Corporation
|
||||
* Copyright (c) 2013-2019, Intel Corporation
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
|
237
contrib/processor-trace/libipt/test/src/ptunit-encoder.c
Normal file
237
contrib/processor-trace/libipt/test/src/ptunit-encoder.c
Normal file
@ -0,0 +1,237 @@
|
||||
/*
|
||||
* Copyright (c) 2019, Intel Corporation
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
*
|
||||
* * Redistributions of source code must retain the above copyright notice,
|
||||
* this list of conditions and the following disclaimer.
|
||||
* * Redistributions in binary form must reproduce the above copyright notice,
|
||||
* this list of conditions and the following disclaimer in the documentation
|
||||
* and/or other materials provided with the distribution.
|
||||
* * Neither the name of Intel Corporation nor the names of its contributors
|
||||
* may be used to endorse or promote products derived from this software
|
||||
* without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
* POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#include "ptunit.h"
|
||||
|
||||
#include "pt_encoder.h"
|
||||
|
||||
#include "intel-pt.h"
|
||||
|
||||
|
||||
/* A test fixture providing a decoder operating on a small buffer. */
|
||||
struct test_fixture {
|
||||
/* The encoder. */
|
||||
struct pt_encoder encoder;
|
||||
|
||||
/* The configuration. */
|
||||
struct pt_config config;
|
||||
|
||||
/* The buffer it operates on. */
|
||||
uint8_t buffer[24];
|
||||
|
||||
/* The test fixture initialization and finalization functions. */
|
||||
struct ptunit_result (*init)(struct test_fixture *tfix);
|
||||
struct ptunit_result (*fini)(struct test_fixture *tfix);
|
||||
};
|
||||
|
||||
static struct ptunit_result tfix_init(struct test_fixture *tfix)
|
||||
{
|
||||
struct pt_config *config;
|
||||
uint8_t *buffer;
|
||||
int errcode;
|
||||
|
||||
config = &tfix->config;
|
||||
buffer = tfix->buffer;
|
||||
|
||||
memset(buffer, 0, sizeof(tfix->buffer));
|
||||
|
||||
pt_config_init(config);
|
||||
config->begin = buffer;
|
||||
config->end = buffer + sizeof(tfix->buffer);
|
||||
|
||||
errcode = pt_encoder_init(&tfix->encoder, config);
|
||||
ptu_int_eq(errcode, 0);
|
||||
|
||||
return ptu_passed();
|
||||
}
|
||||
|
||||
static struct ptunit_result encoder_init_null(void)
|
||||
{
|
||||
struct pt_encoder encoder;
|
||||
struct pt_config config;
|
||||
int errcode;
|
||||
|
||||
errcode = pt_encoder_init(NULL, &config);
|
||||
ptu_int_eq(errcode, -pte_invalid);
|
||||
|
||||
errcode = pt_encoder_init(&encoder, NULL);
|
||||
ptu_int_eq(errcode, -pte_invalid);
|
||||
|
||||
return ptu_passed();
|
||||
}
|
||||
|
||||
static struct ptunit_result encoder_fini_null(void)
|
||||
{
|
||||
pt_encoder_fini(NULL);
|
||||
|
||||
return ptu_passed();
|
||||
}
|
||||
|
||||
static struct ptunit_result alloc_encoder_null(void)
|
||||
{
|
||||
struct pt_encoder *encoder;
|
||||
|
||||
encoder = pt_alloc_encoder(NULL);
|
||||
ptu_null(encoder);
|
||||
|
||||
return ptu_passed();
|
||||
}
|
||||
|
||||
static struct ptunit_result free_encoder_null(void)
|
||||
{
|
||||
pt_free_encoder(NULL);
|
||||
|
||||
return ptu_passed();
|
||||
}
|
||||
|
||||
static struct ptunit_result sync_set_null(void)
|
||||
{
|
||||
int errcode;
|
||||
|
||||
errcode = pt_enc_sync_set(NULL, 0ull);
|
||||
ptu_int_eq(errcode, -pte_invalid);
|
||||
|
||||
return ptu_passed();
|
||||
}
|
||||
|
||||
static struct ptunit_result sync_set_eos(struct test_fixture *tfix)
|
||||
{
|
||||
int errcode;
|
||||
|
||||
errcode = pt_enc_sync_set(&tfix->encoder, sizeof(tfix->buffer) + 1);
|
||||
ptu_int_eq(errcode, -pte_eos);
|
||||
|
||||
return ptu_passed();
|
||||
}
|
||||
|
||||
static struct ptunit_result get_offset_null(void)
|
||||
{
|
||||
struct pt_encoder encoder;
|
||||
uint64_t offset;
|
||||
int errcode;
|
||||
|
||||
errcode = pt_enc_get_offset(NULL, &offset);
|
||||
ptu_int_eq(errcode, -pte_invalid);
|
||||
|
||||
errcode = pt_enc_get_offset(&encoder, NULL);
|
||||
ptu_int_eq(errcode, -pte_invalid);
|
||||
|
||||
return ptu_passed();
|
||||
}
|
||||
|
||||
static struct ptunit_result get_offset_init(struct test_fixture *tfix)
|
||||
{
|
||||
uint64_t offset;
|
||||
int errcode;
|
||||
|
||||
errcode = pt_enc_get_offset(&tfix->encoder, &offset);
|
||||
ptu_int_eq(errcode, 0);
|
||||
ptu_uint_eq(offset, 0ull);
|
||||
|
||||
return ptu_passed();
|
||||
}
|
||||
|
||||
static struct ptunit_result sync_set_get_offset(struct test_fixture *tfix)
|
||||
{
|
||||
uint64_t offset;
|
||||
int errcode;
|
||||
|
||||
errcode = pt_enc_sync_set(&tfix->encoder, 1ull);
|
||||
ptu_int_eq(errcode, 0);
|
||||
|
||||
errcode = pt_enc_get_offset(&tfix->encoder, &offset);
|
||||
ptu_int_eq(errcode, 0);
|
||||
ptu_uint_eq(offset, 1ull);
|
||||
|
||||
return ptu_passed();
|
||||
}
|
||||
|
||||
static struct ptunit_result get_config_null(void)
|
||||
{
|
||||
const struct pt_config *config;
|
||||
|
||||
config = pt_enc_get_config(NULL);
|
||||
ptu_null(config);
|
||||
|
||||
return ptu_passed();
|
||||
}
|
||||
|
||||
static struct ptunit_result get_config(struct test_fixture *tfix)
|
||||
{
|
||||
const struct pt_config *config;
|
||||
|
||||
config = pt_enc_get_config(&tfix->encoder);
|
||||
ptu_ptr(config);
|
||||
|
||||
return ptu_passed();
|
||||
}
|
||||
|
||||
static struct ptunit_result next_null(void)
|
||||
{
|
||||
struct pt_encoder encoder;
|
||||
struct pt_packet packet;
|
||||
int errcode;
|
||||
|
||||
errcode = pt_enc_next(NULL, &packet);
|
||||
ptu_int_eq(errcode, -pte_invalid);
|
||||
|
||||
errcode = pt_enc_next(&encoder, NULL);
|
||||
ptu_int_eq(errcode, -pte_invalid);
|
||||
|
||||
return ptu_passed();
|
||||
}
|
||||
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
struct test_fixture tfix;
|
||||
struct ptunit_suite suite;
|
||||
|
||||
tfix.init = tfix_init;
|
||||
tfix.fini = NULL;
|
||||
|
||||
suite = ptunit_mk_suite(argc, argv);
|
||||
|
||||
ptu_run(suite, encoder_init_null);
|
||||
ptu_run(suite, encoder_fini_null);
|
||||
ptu_run(suite, alloc_encoder_null);
|
||||
ptu_run(suite, free_encoder_null);
|
||||
|
||||
ptu_run(suite, sync_set_null);
|
||||
ptu_run_f(suite, sync_set_eos, tfix);
|
||||
|
||||
ptu_run(suite, get_offset_null);
|
||||
ptu_run_f(suite, get_offset_init, tfix);
|
||||
ptu_run_f(suite, sync_set_get_offset, tfix);
|
||||
|
||||
ptu_run(suite, get_config_null);
|
||||
ptu_run_f(suite, get_config, tfix);
|
||||
|
||||
ptu_run(suite, next_null);
|
||||
|
||||
return ptunit_report(&suite);
|
||||
}
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2014-2018, Intel Corporation
|
||||
* Copyright (c) 2014-2019, Intel Corporation
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2014-2018, Intel Corporation
|
||||
* Copyright (c) 2014-2019, Intel Corporation
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2013-2018, Intel Corporation
|
||||
* Copyright (c) 2013-2019, Intel Corporation
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
@ -690,8 +690,6 @@ int main(int argc, char **argv)
|
||||
{
|
||||
struct ptunit_suite suite;
|
||||
|
||||
pt_ild_init();
|
||||
|
||||
suite = ptunit_mk_suite(argc, argv);
|
||||
|
||||
ptu_run(suite, push);
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2013-2018, Intel Corporation
|
||||
* Copyright (c) 2013-2019, Intel Corporation
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
@ -208,15 +208,16 @@ uint64_t pt_section_size(const struct pt_section *section)
|
||||
return section->size;
|
||||
}
|
||||
|
||||
struct pt_section *pt_mk_section(const char *file, uint64_t offset,
|
||||
uint64_t size)
|
||||
int pt_mk_section(struct pt_section **psection, const char *filename,
|
||||
uint64_t offset, uint64_t size)
|
||||
{
|
||||
(void) file;
|
||||
(void) psection;
|
||||
(void) filename;
|
||||
(void) offset;
|
||||
(void) size;
|
||||
|
||||
/* This function is not used by our tests. */
|
||||
return NULL;
|
||||
return -pte_not_supported;
|
||||
}
|
||||
|
||||
int pt_section_get(struct pt_section *section)
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2016-2018, Intel Corporation
|
||||
* Copyright (c) 2016-2019, Intel Corporation
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
@ -69,8 +69,8 @@ struct pt_section {
|
||||
#endif /* defined(FEATURE_THREADS) */
|
||||
};
|
||||
|
||||
extern struct pt_section *pt_mk_section(const char *filename, uint64_t offset,
|
||||
uint64_t size);
|
||||
extern int pt_mk_section(struct pt_section **psection, const char *filename,
|
||||
uint64_t offset, uint64_t size);
|
||||
|
||||
extern int pt_section_get(struct pt_section *section);
|
||||
extern int pt_section_put(struct pt_section *section);
|
||||
@ -93,45 +93,47 @@ extern int pt_section_read(const struct pt_section *section, uint8_t *buffer,
|
||||
uint16_t size, uint64_t offset);
|
||||
|
||||
|
||||
struct pt_section *pt_mk_section(const char *filename, uint64_t offset,
|
||||
uint64_t size)
|
||||
int pt_mk_section(struct pt_section **psection, const char *filename,
|
||||
uint64_t offset, uint64_t size)
|
||||
{
|
||||
struct pt_section *section;
|
||||
uint8_t idx;
|
||||
|
||||
section = malloc(sizeof(*section));
|
||||
if (section) {
|
||||
uint8_t idx;
|
||||
if (!section)
|
||||
return -pte_nomem;
|
||||
|
||||
memset(section, 0, sizeof(*section));
|
||||
section->filename = filename;
|
||||
section->offset = offset;
|
||||
section->size = size;
|
||||
section->ucount = 1;
|
||||
memset(section, 0, sizeof(*section));
|
||||
section->filename = filename;
|
||||
section->offset = offset;
|
||||
section->size = size;
|
||||
section->ucount = 1;
|
||||
|
||||
for (idx = 0; idx < sizeof(section->content); ++idx)
|
||||
section->content[idx] = idx;
|
||||
for (idx = 0; idx < sizeof(section->content); ++idx)
|
||||
section->content[idx] = idx;
|
||||
|
||||
#if defined(FEATURE_THREADS)
|
||||
{
|
||||
int errcode;
|
||||
{
|
||||
int errcode;
|
||||
|
||||
errcode = mtx_init(§ion->lock, mtx_plain);
|
||||
if (errcode != thrd_success) {
|
||||
free(section);
|
||||
section = NULL;
|
||||
}
|
||||
|
||||
errcode = mtx_init(§ion->alock, mtx_plain);
|
||||
if (errcode != thrd_success) {
|
||||
mtx_destroy(§ion->lock);
|
||||
free(section);
|
||||
section = NULL;
|
||||
}
|
||||
errcode = mtx_init(§ion->lock, mtx_plain);
|
||||
if (errcode != thrd_success) {
|
||||
free(section);
|
||||
return -pte_bad_lock;
|
||||
}
|
||||
#endif /* defined(FEATURE_THREADS) */
|
||||
}
|
||||
|
||||
return section;
|
||||
errcode = mtx_init(§ion->alock, mtx_plain);
|
||||
if (errcode != thrd_success) {
|
||||
mtx_destroy(§ion->lock);
|
||||
free(section);
|
||||
return -pte_bad_lock;
|
||||
}
|
||||
}
|
||||
#endif /* defined(FEATURE_THREADS) */
|
||||
|
||||
*psection = section;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int pt_section_lock(struct pt_section *section)
|
||||
@ -552,10 +554,12 @@ static struct ptunit_result dfix_init(struct iscache_fixture *cfix)
|
||||
|
||||
for (idx = 0; idx < num_sections; ++idx) {
|
||||
struct pt_section *section;
|
||||
int errcode;
|
||||
|
||||
section = pt_mk_section("some-filename",
|
||||
errcode = pt_mk_section(§ion, "some-filename",
|
||||
idx % 3 == 0 ? 0x1000 : 0x2000,
|
||||
idx % 2 == 0 ? 0x1000 : 0x2000);
|
||||
ptu_int_eq(errcode, 0);
|
||||
ptu_ptr(section);
|
||||
|
||||
cfix->section[idx] = section;
|
||||
|
351
contrib/processor-trace/libipt/test/src/ptunit-insn_decoder.c
Normal file
351
contrib/processor-trace/libipt/test/src/ptunit-insn_decoder.c
Normal file
@ -0,0 +1,351 @@
|
||||
/*
|
||||
* Copyright (c) 2019, Intel Corporation
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
*
|
||||
* * Redistributions of source code must retain the above copyright notice,
|
||||
* this list of conditions and the following disclaimer.
|
||||
* * Redistributions in binary form must reproduce the above copyright notice,
|
||||
* this list of conditions and the following disclaimer in the documentation
|
||||
* and/or other materials provided with the distribution.
|
||||
* * Neither the name of Intel Corporation nor the names of its contributors
|
||||
* may be used to endorse or promote products derived from this software
|
||||
* without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
* POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#include "ptunit.h"
|
||||
|
||||
#include "pt_insn_decoder.h"
|
||||
|
||||
#include "intel-pt.h"
|
||||
|
||||
|
||||
/* A test fixture providing a decoder operating on a small buffer. */
|
||||
struct test_fixture {
|
||||
/* The packet_decoder. */
|
||||
struct pt_insn_decoder decoder;
|
||||
|
||||
/* The configuration. */
|
||||
struct pt_config config;
|
||||
|
||||
/* The buffer it operates on. */
|
||||
uint8_t buffer[24];
|
||||
|
||||
/* The test fixture initialization and finalization functions. */
|
||||
struct ptunit_result (*init)(struct test_fixture *tfix);
|
||||
struct ptunit_result (*fini)(struct test_fixture *tfix);
|
||||
};
|
||||
|
||||
static struct ptunit_result tfix_init(struct test_fixture *tfix)
|
||||
{
|
||||
struct pt_config *config;
|
||||
uint8_t *buffer;
|
||||
int errcode;
|
||||
|
||||
config = &tfix->config;
|
||||
buffer = tfix->buffer;
|
||||
|
||||
memset(buffer, 0, sizeof(tfix->buffer));
|
||||
|
||||
pt_config_init(config);
|
||||
config->begin = buffer;
|
||||
config->end = buffer + sizeof(tfix->buffer);
|
||||
|
||||
errcode = pt_insn_decoder_init(&tfix->decoder, config);
|
||||
ptu_int_eq(errcode, 0);
|
||||
|
||||
return ptu_passed();
|
||||
}
|
||||
|
||||
static struct ptunit_result decoder_init_null(void)
|
||||
{
|
||||
struct pt_insn_decoder decoder;
|
||||
struct pt_config config;
|
||||
int errcode;
|
||||
|
||||
errcode = pt_insn_decoder_init(NULL, &config);
|
||||
ptu_int_eq(errcode, -pte_internal);
|
||||
|
||||
errcode = pt_insn_decoder_init(&decoder, NULL);
|
||||
ptu_int_eq(errcode, -pte_invalid);
|
||||
|
||||
return ptu_passed();
|
||||
}
|
||||
|
||||
static struct ptunit_result decoder_fini_null(void)
|
||||
{
|
||||
pt_insn_decoder_fini(NULL);
|
||||
|
||||
return ptu_passed();
|
||||
}
|
||||
|
||||
static struct ptunit_result alloc_decoder_null(void)
|
||||
{
|
||||
struct pt_insn_decoder *decoder;
|
||||
|
||||
decoder = pt_insn_alloc_decoder(NULL);
|
||||
ptu_null(decoder);
|
||||
|
||||
return ptu_passed();
|
||||
}
|
||||
|
||||
static struct ptunit_result free_decoder_null(void)
|
||||
{
|
||||
pt_insn_free_decoder(NULL);
|
||||
|
||||
return ptu_passed();
|
||||
}
|
||||
|
||||
static struct ptunit_result sync_forward_null(void)
|
||||
{
|
||||
int errcode;
|
||||
|
||||
errcode = pt_insn_sync_forward(NULL);
|
||||
ptu_int_eq(errcode, -pte_invalid);
|
||||
|
||||
return ptu_passed();
|
||||
}
|
||||
|
||||
static struct ptunit_result sync_backward_null(void)
|
||||
{
|
||||
int errcode;
|
||||
|
||||
errcode = pt_insn_sync_backward(NULL);
|
||||
ptu_int_eq(errcode, -pte_invalid);
|
||||
|
||||
return ptu_passed();
|
||||
}
|
||||
|
||||
static struct ptunit_result sync_set_null(void)
|
||||
{
|
||||
int errcode;
|
||||
|
||||
errcode = pt_insn_sync_set(NULL, 0ull);
|
||||
ptu_int_eq(errcode, -pte_invalid);
|
||||
|
||||
return ptu_passed();
|
||||
}
|
||||
|
||||
static struct ptunit_result sync_set_eos(struct test_fixture *tfix)
|
||||
{
|
||||
int errcode;
|
||||
|
||||
errcode = pt_insn_sync_set(&tfix->decoder, sizeof(tfix->buffer) + 1);
|
||||
ptu_int_eq(errcode, -pte_eos);
|
||||
|
||||
return ptu_passed();
|
||||
}
|
||||
|
||||
static struct ptunit_result get_offset_null(void)
|
||||
{
|
||||
struct pt_insn_decoder decoder;
|
||||
uint64_t offset;
|
||||
int errcode;
|
||||
|
||||
errcode = pt_insn_get_offset(NULL, &offset);
|
||||
ptu_int_eq(errcode, -pte_invalid);
|
||||
|
||||
errcode = pt_insn_get_offset(&decoder, NULL);
|
||||
ptu_int_eq(errcode, -pte_invalid);
|
||||
|
||||
return ptu_passed();
|
||||
}
|
||||
|
||||
static struct ptunit_result get_offset_init(struct test_fixture *tfix)
|
||||
{
|
||||
uint64_t offset;
|
||||
int errcode;
|
||||
|
||||
errcode = pt_insn_get_offset(&tfix->decoder, &offset);
|
||||
ptu_int_eq(errcode, -pte_nosync);
|
||||
|
||||
return ptu_passed();
|
||||
}
|
||||
|
||||
static struct ptunit_result get_sync_offset_null(void)
|
||||
{
|
||||
struct pt_insn_decoder decoder;
|
||||
uint64_t offset;
|
||||
int errcode;
|
||||
|
||||
errcode = pt_insn_get_sync_offset(NULL, &offset);
|
||||
ptu_int_eq(errcode, -pte_invalid);
|
||||
|
||||
errcode = pt_insn_get_sync_offset(&decoder, NULL);
|
||||
ptu_int_eq(errcode, -pte_invalid);
|
||||
|
||||
return ptu_passed();
|
||||
}
|
||||
|
||||
static struct ptunit_result get_config_null(void)
|
||||
{
|
||||
const struct pt_config *config;
|
||||
|
||||
config = pt_insn_get_config(NULL);
|
||||
ptu_null(config);
|
||||
|
||||
return ptu_passed();
|
||||
}
|
||||
|
||||
static struct ptunit_result get_image_null(void)
|
||||
{
|
||||
const struct pt_image *image;
|
||||
|
||||
image = pt_insn_get_image(NULL);
|
||||
ptu_null(image);
|
||||
|
||||
return ptu_passed();
|
||||
}
|
||||
|
||||
static struct ptunit_result set_image_null(void)
|
||||
{
|
||||
struct pt_image image;
|
||||
int errcode;
|
||||
|
||||
errcode = pt_insn_set_image(NULL, &image);
|
||||
ptu_int_eq(errcode, -pte_invalid);
|
||||
|
||||
errcode = pt_insn_set_image(NULL, NULL);
|
||||
ptu_int_eq(errcode, -pte_invalid);
|
||||
|
||||
return ptu_passed();
|
||||
}
|
||||
|
||||
static struct ptunit_result get_config(struct test_fixture *tfix)
|
||||
{
|
||||
const struct pt_config *config;
|
||||
|
||||
config = pt_insn_get_config(&tfix->decoder);
|
||||
ptu_ptr(config);
|
||||
|
||||
return ptu_passed();
|
||||
}
|
||||
|
||||
static struct ptunit_result time_null(void)
|
||||
{
|
||||
struct pt_insn_decoder decoder;
|
||||
uint64_t time;
|
||||
uint32_t lost_mtc, lost_cyc;
|
||||
int errcode;
|
||||
|
||||
errcode = pt_insn_time(NULL, &time, &lost_mtc, &lost_cyc);
|
||||
ptu_int_eq(errcode, -pte_invalid);
|
||||
|
||||
errcode = pt_insn_time(&decoder, NULL, &lost_mtc, &lost_cyc);
|
||||
ptu_int_eq(errcode, -pte_invalid);
|
||||
|
||||
return ptu_passed();
|
||||
}
|
||||
|
||||
static struct ptunit_result cbr_null(void)
|
||||
{
|
||||
struct pt_insn_decoder decoder;
|
||||
uint32_t cbr;
|
||||
int errcode;
|
||||
|
||||
errcode = pt_insn_core_bus_ratio(NULL, &cbr);
|
||||
ptu_int_eq(errcode, -pte_invalid);
|
||||
|
||||
errcode = pt_insn_core_bus_ratio(&decoder, NULL);
|
||||
ptu_int_eq(errcode, -pte_invalid);
|
||||
|
||||
return ptu_passed();
|
||||
}
|
||||
|
||||
static struct ptunit_result asid_null(void)
|
||||
{
|
||||
struct pt_insn_decoder decoder;
|
||||
struct pt_asid asid;
|
||||
int errcode;
|
||||
|
||||
errcode = pt_insn_asid(NULL, &asid, sizeof(asid));
|
||||
ptu_int_eq(errcode, -pte_invalid);
|
||||
|
||||
errcode = pt_insn_asid(&decoder, NULL, sizeof(asid));
|
||||
ptu_int_eq(errcode, -pte_invalid);
|
||||
|
||||
return ptu_passed();
|
||||
}
|
||||
|
||||
static struct ptunit_result next_null(void)
|
||||
{
|
||||
struct pt_insn_decoder decoder;
|
||||
struct pt_insn insn;
|
||||
int errcode;
|
||||
|
||||
errcode = pt_insn_next(NULL, &insn, sizeof(insn));
|
||||
ptu_int_eq(errcode, -pte_invalid);
|
||||
|
||||
errcode = pt_insn_next(&decoder, NULL, sizeof(insn));
|
||||
ptu_int_eq(errcode, -pte_invalid);
|
||||
|
||||
return ptu_passed();
|
||||
}
|
||||
|
||||
static struct ptunit_result event_null(void)
|
||||
{
|
||||
struct pt_insn_decoder decoder;
|
||||
struct pt_event event;
|
||||
int errcode;
|
||||
|
||||
errcode = pt_insn_event(NULL, &event, sizeof(event));
|
||||
ptu_int_eq(errcode, -pte_invalid);
|
||||
|
||||
errcode = pt_insn_event(&decoder, NULL, sizeof(event));
|
||||
ptu_int_eq(errcode, -pte_invalid);
|
||||
|
||||
return ptu_passed();
|
||||
}
|
||||
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
struct test_fixture tfix;
|
||||
struct ptunit_suite suite;
|
||||
|
||||
tfix.init = tfix_init;
|
||||
tfix.fini = NULL;
|
||||
|
||||
suite = ptunit_mk_suite(argc, argv);
|
||||
|
||||
ptu_run(suite, decoder_init_null);
|
||||
ptu_run(suite, decoder_fini_null);
|
||||
ptu_run(suite, alloc_decoder_null);
|
||||
ptu_run(suite, free_decoder_null);
|
||||
|
||||
ptu_run(suite, sync_forward_null);
|
||||
ptu_run(suite, sync_backward_null);
|
||||
ptu_run(suite, sync_set_null);
|
||||
ptu_run_f(suite, sync_set_eos, tfix);
|
||||
|
||||
ptu_run(suite, get_offset_null);
|
||||
ptu_run_f(suite, get_offset_init, tfix);
|
||||
ptu_run(suite, get_sync_offset_null);
|
||||
|
||||
ptu_run(suite, get_image_null);
|
||||
ptu_run(suite, set_image_null);
|
||||
|
||||
ptu_run(suite, get_config_null);
|
||||
ptu_run_f(suite, get_config, tfix);
|
||||
|
||||
ptu_run(suite, time_null);
|
||||
ptu_run(suite, cbr_null);
|
||||
ptu_run(suite, asid_null);
|
||||
|
||||
ptu_run(suite, next_null);
|
||||
ptu_run(suite, event_null);
|
||||
|
||||
return ptunit_report(&suite);
|
||||
}
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2013-2018, Intel Corporation
|
||||
* Copyright (c) 2013-2019, Intel Corporation
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2014-2018, Intel Corporation
|
||||
* Copyright (c) 2014-2019, Intel Corporation
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2017-2018, Intel Corporation
|
||||
* Copyright (c) 2017-2019, Intel Corporation
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2014-2018, Intel Corporation
|
||||
* Copyright (c) 2014-2019, Intel Corporation
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
|
274
contrib/processor-trace/libipt/test/src/ptunit-packet_decoder.c
Normal file
274
contrib/processor-trace/libipt/test/src/ptunit-packet_decoder.c
Normal file
@ -0,0 +1,274 @@
|
||||
/*
|
||||
* Copyright (c) 2019, Intel Corporation
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
*
|
||||
* * Redistributions of source code must retain the above copyright notice,
|
||||
* this list of conditions and the following disclaimer.
|
||||
* * Redistributions in binary form must reproduce the above copyright notice,
|
||||
* this list of conditions and the following disclaimer in the documentation
|
||||
* and/or other materials provided with the distribution.
|
||||
* * Neither the name of Intel Corporation nor the names of its contributors
|
||||
* may be used to endorse or promote products derived from this software
|
||||
* without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
* POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#include "ptunit.h"
|
||||
|
||||
#include "pt_packet_decoder.h"
|
||||
|
||||
#include "intel-pt.h"
|
||||
|
||||
|
||||
/* A test fixture providing a decoder operating on a small buffer. */
|
||||
struct test_fixture {
|
||||
/* The packet_decoder. */
|
||||
struct pt_packet_decoder decoder;
|
||||
|
||||
/* The configuration. */
|
||||
struct pt_config config;
|
||||
|
||||
/* The buffer it operates on. */
|
||||
uint8_t buffer[24];
|
||||
|
||||
/* The test fixture initialization and finalization functions. */
|
||||
struct ptunit_result (*init)(struct test_fixture *tfix);
|
||||
struct ptunit_result (*fini)(struct test_fixture *tfix);
|
||||
};
|
||||
|
||||
static struct ptunit_result tfix_init(struct test_fixture *tfix)
|
||||
{
|
||||
struct pt_config *config;
|
||||
uint8_t *buffer;
|
||||
int errcode;
|
||||
|
||||
config = &tfix->config;
|
||||
buffer = tfix->buffer;
|
||||
|
||||
memset(buffer, 0, sizeof(tfix->buffer));
|
||||
|
||||
pt_config_init(config);
|
||||
config->begin = buffer;
|
||||
config->end = buffer + sizeof(tfix->buffer);
|
||||
|
||||
errcode = pt_pkt_decoder_init(&tfix->decoder, config);
|
||||
ptu_int_eq(errcode, 0);
|
||||
|
||||
return ptu_passed();
|
||||
}
|
||||
|
||||
static struct ptunit_result decoder_init_null(void)
|
||||
{
|
||||
struct pt_packet_decoder decoder;
|
||||
struct pt_config config;
|
||||
int errcode;
|
||||
|
||||
errcode = pt_pkt_decoder_init(NULL, &config);
|
||||
ptu_int_eq(errcode, -pte_invalid);
|
||||
|
||||
errcode = pt_pkt_decoder_init(&decoder, NULL);
|
||||
ptu_int_eq(errcode, -pte_invalid);
|
||||
|
||||
return ptu_passed();
|
||||
}
|
||||
|
||||
static struct ptunit_result decoder_fini_null(void)
|
||||
{
|
||||
pt_pkt_decoder_fini(NULL);
|
||||
|
||||
return ptu_passed();
|
||||
}
|
||||
|
||||
static struct ptunit_result alloc_decoder_null(void)
|
||||
{
|
||||
struct pt_packet_decoder *decoder;
|
||||
|
||||
decoder = pt_pkt_alloc_decoder(NULL);
|
||||
ptu_null(decoder);
|
||||
|
||||
return ptu_passed();
|
||||
}
|
||||
|
||||
static struct ptunit_result free_decoder_null(void)
|
||||
{
|
||||
pt_pkt_free_decoder(NULL);
|
||||
|
||||
return ptu_passed();
|
||||
}
|
||||
|
||||
static struct ptunit_result sync_forward_null(void)
|
||||
{
|
||||
int errcode;
|
||||
|
||||
errcode = pt_pkt_sync_forward(NULL);
|
||||
ptu_int_eq(errcode, -pte_invalid);
|
||||
|
||||
return ptu_passed();
|
||||
}
|
||||
|
||||
static struct ptunit_result sync_backward_null(void)
|
||||
{
|
||||
int errcode;
|
||||
|
||||
errcode = pt_pkt_sync_backward(NULL);
|
||||
ptu_int_eq(errcode, -pte_invalid);
|
||||
|
||||
return ptu_passed();
|
||||
}
|
||||
|
||||
static struct ptunit_result sync_set_null(void)
|
||||
{
|
||||
int errcode;
|
||||
|
||||
errcode = pt_pkt_sync_set(NULL, 0ull);
|
||||
ptu_int_eq(errcode, -pte_invalid);
|
||||
|
||||
return ptu_passed();
|
||||
}
|
||||
|
||||
static struct ptunit_result sync_set_eos(struct test_fixture *tfix)
|
||||
{
|
||||
int errcode;
|
||||
|
||||
errcode = pt_pkt_sync_set(&tfix->decoder, sizeof(tfix->buffer) + 1);
|
||||
ptu_int_eq(errcode, -pte_eos);
|
||||
|
||||
return ptu_passed();
|
||||
}
|
||||
|
||||
static struct ptunit_result get_offset_null(void)
|
||||
{
|
||||
struct pt_packet_decoder decoder;
|
||||
uint64_t offset;
|
||||
int errcode;
|
||||
|
||||
errcode = pt_pkt_get_offset(NULL, &offset);
|
||||
ptu_int_eq(errcode, -pte_invalid);
|
||||
|
||||
errcode = pt_pkt_get_offset(&decoder, NULL);
|
||||
ptu_int_eq(errcode, -pte_invalid);
|
||||
|
||||
return ptu_passed();
|
||||
}
|
||||
|
||||
static struct ptunit_result get_offset_init(struct test_fixture *tfix)
|
||||
{
|
||||
uint64_t offset;
|
||||
int errcode;
|
||||
|
||||
errcode = pt_pkt_get_offset(&tfix->decoder, &offset);
|
||||
ptu_int_eq(errcode, -pte_nosync);
|
||||
|
||||
return ptu_passed();
|
||||
}
|
||||
|
||||
static struct ptunit_result sync_set_get_offset(struct test_fixture *tfix)
|
||||
{
|
||||
uint64_t offset;
|
||||
int errcode;
|
||||
|
||||
errcode = pt_pkt_sync_set(&tfix->decoder, 1ull);
|
||||
ptu_int_eq(errcode, 0);
|
||||
|
||||
errcode = pt_pkt_get_offset(&tfix->decoder, &offset);
|
||||
ptu_int_eq(errcode, 0);
|
||||
ptu_uint_eq(offset, 1ull);
|
||||
|
||||
return ptu_passed();
|
||||
}
|
||||
|
||||
static struct ptunit_result get_sync_offset_null(void)
|
||||
{
|
||||
struct pt_packet_decoder decoder;
|
||||
uint64_t offset;
|
||||
int errcode;
|
||||
|
||||
errcode = pt_pkt_get_sync_offset(NULL, &offset);
|
||||
ptu_int_eq(errcode, -pte_invalid);
|
||||
|
||||
errcode = pt_pkt_get_sync_offset(&decoder, NULL);
|
||||
ptu_int_eq(errcode, -pte_invalid);
|
||||
|
||||
return ptu_passed();
|
||||
}
|
||||
|
||||
static struct ptunit_result get_config_null(void)
|
||||
{
|
||||
const struct pt_config *config;
|
||||
|
||||
config = pt_pkt_get_config(NULL);
|
||||
ptu_null(config);
|
||||
|
||||
return ptu_passed();
|
||||
}
|
||||
|
||||
static struct ptunit_result get_config(struct test_fixture *tfix)
|
||||
{
|
||||
const struct pt_config *config;
|
||||
|
||||
config = pt_pkt_get_config(&tfix->decoder);
|
||||
ptu_ptr(config);
|
||||
|
||||
return ptu_passed();
|
||||
}
|
||||
|
||||
static struct ptunit_result next_null(void)
|
||||
{
|
||||
struct pt_packet_decoder decoder;
|
||||
struct pt_packet packet;
|
||||
int errcode;
|
||||
|
||||
errcode = pt_pkt_next(NULL, &packet, sizeof(packet));
|
||||
ptu_int_eq(errcode, -pte_invalid);
|
||||
|
||||
errcode = pt_pkt_next(&decoder, NULL, sizeof(packet));
|
||||
ptu_int_eq(errcode, -pte_invalid);
|
||||
|
||||
return ptu_passed();
|
||||
}
|
||||
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
struct test_fixture tfix;
|
||||
struct ptunit_suite suite;
|
||||
|
||||
tfix.init = tfix_init;
|
||||
tfix.fini = NULL;
|
||||
|
||||
suite = ptunit_mk_suite(argc, argv);
|
||||
|
||||
ptu_run(suite, decoder_init_null);
|
||||
ptu_run(suite, decoder_fini_null);
|
||||
ptu_run(suite, alloc_decoder_null);
|
||||
ptu_run(suite, free_decoder_null);
|
||||
|
||||
ptu_run(suite, sync_forward_null);
|
||||
ptu_run(suite, sync_backward_null);
|
||||
ptu_run(suite, sync_set_null);
|
||||
ptu_run_f(suite, sync_set_eos, tfix);
|
||||
|
||||
ptu_run(suite, get_offset_null);
|
||||
ptu_run_f(suite, get_offset_init, tfix);
|
||||
ptu_run_f(suite, sync_set_get_offset, tfix);
|
||||
ptu_run(suite, get_sync_offset_null);
|
||||
|
||||
ptu_run(suite, get_config_null);
|
||||
ptu_run_f(suite, get_config, tfix);
|
||||
|
||||
ptu_run(suite, next_null);
|
||||
|
||||
return ptunit_report(&suite);
|
||||
}
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2013-2018, Intel Corporation
|
||||
* Copyright (c) 2013-2019, Intel Corporation
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
@ -60,16 +60,16 @@ struct ptu_decoder_fixture {
|
||||
};
|
||||
|
||||
/* An invalid address. */
|
||||
static const uint64_t pt_dfix_bad_ip = (1ull << 62) - 1;
|
||||
static const uint64_t pt_dfix_bad_ip = (1ull << 62) - 1ull;
|
||||
|
||||
/* A sign-extended address. */
|
||||
static const uint64_t pt_dfix_sext_ip = 0xffffff00ff00ff00ull;
|
||||
|
||||
/* The highest possible address. */
|
||||
static const uint64_t pt_dfix_max_ip = (1ull << 47) - 1;
|
||||
static const uint64_t pt_dfix_max_ip = (1ull << 47) - 1ull;
|
||||
|
||||
/* The highest possible cr3 value. */
|
||||
static const uint64_t pt_dfix_max_cr3 = ((1ull << 47) - 1) & ~0x1f;
|
||||
static const uint64_t pt_dfix_max_cr3 = ((1ull << 47) - 1ull) & ~0x1full;
|
||||
|
||||
/* Synchronize the decoder at the beginning of the trace stream, avoiding the
|
||||
* initial PSB header.
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2013-2018, Intel Corporation
|
||||
* Copyright (c) 2013-2019, Intel Corporation
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2015-2018, Intel Corporation
|
||||
* Copyright (c) 2015-2019, Intel Corporation
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2013-2018, Intel Corporation
|
||||
* Copyright (c) 2013-2019, Intel Corporation
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
@ -162,10 +162,12 @@ static struct ptunit_result create(struct section_fixture *sfix)
|
||||
const char *name;
|
||||
uint8_t bytes[] = { 0xcc, 0xcc, 0xcc, 0xcc, 0xcc };
|
||||
uint64_t offset, size;
|
||||
int errcode;
|
||||
|
||||
sfix_write(sfix, bytes);
|
||||
|
||||
sfix->section = pt_mk_section(sfix->name, 0x1ull, 0x3ull);
|
||||
errcode = pt_mk_section(&sfix->section, sfix->name, 0x1ull, 0x3ull);
|
||||
ptu_int_eq(errcode, 0);
|
||||
ptu_ptr(sfix->section);
|
||||
|
||||
name = pt_section_filename(sfix->section);
|
||||
@ -182,8 +184,10 @@ static struct ptunit_result create(struct section_fixture *sfix)
|
||||
|
||||
static struct ptunit_result create_bad_offset(struct section_fixture *sfix)
|
||||
{
|
||||
sfix->section = pt_mk_section(sfix->name, 0x10ull, 0x0ull);
|
||||
ptu_null(sfix->section);
|
||||
int errcode;
|
||||
|
||||
errcode = pt_mk_section(&sfix->section, sfix->name, 0x10ull, 0x0ull);
|
||||
ptu_int_eq(errcode, -pte_invalid);
|
||||
|
||||
return ptu_passed();
|
||||
}
|
||||
@ -193,10 +197,12 @@ static struct ptunit_result create_truncated(struct section_fixture *sfix)
|
||||
const char *name;
|
||||
uint8_t bytes[] = { 0xcc, 0xcc, 0xcc, 0xcc, 0xcc };
|
||||
uint64_t offset, size;
|
||||
int errcode;
|
||||
|
||||
sfix_write(sfix, bytes);
|
||||
|
||||
sfix->section = pt_mk_section(sfix->name, 0x1ull, UINT64_MAX);
|
||||
errcode = pt_mk_section(&sfix->section, sfix->name, 0x1ull, UINT64_MAX);
|
||||
ptu_int_eq(errcode, 0);
|
||||
ptu_ptr(sfix->section);
|
||||
|
||||
name = pt_section_filename(sfix->section);
|
||||
@ -213,7 +219,10 @@ static struct ptunit_result create_truncated(struct section_fixture *sfix)
|
||||
|
||||
static struct ptunit_result create_empty(struct section_fixture *sfix)
|
||||
{
|
||||
sfix->section = pt_mk_section(sfix->name, 0x0ull, 0x10ull);
|
||||
int errcode;
|
||||
|
||||
errcode = pt_mk_section(&sfix->section, sfix->name, 0x0ull, 0x10ull);
|
||||
ptu_int_eq(errcode, -pte_invalid);
|
||||
ptu_null(sfix->section);
|
||||
|
||||
return ptu_passed();
|
||||
@ -359,7 +368,8 @@ static struct ptunit_result get_overflow(struct section_fixture *sfix)
|
||||
|
||||
sfix_write(sfix, bytes);
|
||||
|
||||
sfix->section = pt_mk_section(sfix->name, 0x1ull, 0x3ull);
|
||||
errcode = pt_mk_section(&sfix->section, sfix->name, 0x1ull, 0x3ull);
|
||||
ptu_int_eq(errcode, 0);
|
||||
ptu_ptr(sfix->section);
|
||||
|
||||
sfix->section->ucount = UINT16_MAX;
|
||||
@ -380,7 +390,8 @@ static struct ptunit_result attach_overflow(struct section_fixture *sfix)
|
||||
|
||||
sfix_write(sfix, bytes);
|
||||
|
||||
sfix->section = pt_mk_section(sfix->name, 0x1ull, 0x3ull);
|
||||
errcode = pt_mk_section(&sfix->section, sfix->name, 0x1ull, 0x3ull);
|
||||
ptu_int_eq(errcode, 0);
|
||||
ptu_ptr(sfix->section);
|
||||
|
||||
sfix->section->acount = UINT16_MAX;
|
||||
@ -401,7 +412,8 @@ static struct ptunit_result attach_bad_ucount(struct section_fixture *sfix)
|
||||
|
||||
sfix_write(sfix, bytes);
|
||||
|
||||
sfix->section = pt_mk_section(sfix->name, 0x1ull, 0x3ull);
|
||||
errcode = pt_mk_section(&sfix->section, sfix->name, 0x1ull, 0x3ull);
|
||||
ptu_int_eq(errcode, 0);
|
||||
ptu_ptr(sfix->section);
|
||||
|
||||
sfix->section->acount = 2;
|
||||
@ -421,7 +433,8 @@ static struct ptunit_result map_change(struct section_fixture *sfix)
|
||||
|
||||
sfix_write(sfix, bytes);
|
||||
|
||||
sfix->section = pt_mk_section(sfix->name, 0x1ull, 0x3ull);
|
||||
errcode = pt_mk_section(&sfix->section, sfix->name, 0x1ull, 0x3ull);
|
||||
ptu_int_eq(errcode, 0);
|
||||
ptu_ptr(sfix->section);
|
||||
|
||||
sfix_write(sfix, bytes);
|
||||
@ -439,7 +452,8 @@ static struct ptunit_result map_put(struct section_fixture *sfix)
|
||||
|
||||
sfix_write(sfix, bytes);
|
||||
|
||||
sfix->section = pt_mk_section(sfix->name, 0x1ull, 0x3ull);
|
||||
errcode = pt_mk_section(&sfix->section, sfix->name, 0x1ull, 0x3ull);
|
||||
ptu_int_eq(errcode, 0);
|
||||
ptu_ptr(sfix->section);
|
||||
|
||||
errcode = pt_section_map(sfix->section);
|
||||
@ -461,7 +475,8 @@ static struct ptunit_result unmap_nomap(struct section_fixture *sfix)
|
||||
|
||||
sfix_write(sfix, bytes);
|
||||
|
||||
sfix->section = pt_mk_section(sfix->name, 0x1ull, 0x3ull);
|
||||
errcode = pt_mk_section(&sfix->section, sfix->name, 0x1ull, 0x3ull);
|
||||
ptu_int_eq(errcode, 0);
|
||||
ptu_ptr(sfix->section);
|
||||
|
||||
errcode = pt_section_unmap(sfix->section);
|
||||
@ -477,7 +492,8 @@ static struct ptunit_result map_overflow(struct section_fixture *sfix)
|
||||
|
||||
sfix_write(sfix, bytes);
|
||||
|
||||
sfix->section = pt_mk_section(sfix->name, 0x1ull, 0x3ull);
|
||||
errcode = pt_mk_section(&sfix->section, sfix->name, 0x1ull, 0x3ull);
|
||||
ptu_int_eq(errcode, 0);
|
||||
ptu_ptr(sfix->section);
|
||||
|
||||
sfix->section->mcount = UINT16_MAX;
|
||||
@ -497,7 +513,8 @@ static struct ptunit_result get_put(struct section_fixture *sfix)
|
||||
|
||||
sfix_write(sfix, bytes);
|
||||
|
||||
sfix->section = pt_mk_section(sfix->name, 0x1ull, 0x3ull);
|
||||
errcode = pt_mk_section(&sfix->section, sfix->name, 0x1ull, 0x3ull);
|
||||
ptu_int_eq(errcode, 0);
|
||||
ptu_ptr(sfix->section);
|
||||
|
||||
errcode = pt_section_get(sfix->section);
|
||||
@ -523,7 +540,8 @@ static struct ptunit_result attach_detach(struct section_fixture *sfix)
|
||||
|
||||
sfix_write(sfix, bytes);
|
||||
|
||||
sfix->section = pt_mk_section(sfix->name, 0x1ull, 0x3ull);
|
||||
errcode = pt_mk_section(&sfix->section, sfix->name, 0x1ull, 0x3ull);
|
||||
ptu_int_eq(errcode, 0);
|
||||
ptu_ptr(sfix->section);
|
||||
|
||||
sfix->section->ucount += 2;
|
||||
@ -553,7 +571,8 @@ static struct ptunit_result attach_bad_iscache(struct section_fixture *sfix)
|
||||
|
||||
sfix_write(sfix, bytes);
|
||||
|
||||
sfix->section = pt_mk_section(sfix->name, 0x1ull, 0x3ull);
|
||||
errcode = pt_mk_section(&sfix->section, sfix->name, 0x1ull, 0x3ull);
|
||||
ptu_int_eq(errcode, 0);
|
||||
ptu_ptr(sfix->section);
|
||||
|
||||
sfix->section->ucount += 2;
|
||||
@ -580,7 +599,8 @@ static struct ptunit_result detach_bad_iscache(struct section_fixture *sfix)
|
||||
|
||||
sfix_write(sfix, bytes);
|
||||
|
||||
sfix->section = pt_mk_section(sfix->name, 0x1ull, 0x3ull);
|
||||
errcode = pt_mk_section(&sfix->section, sfix->name, 0x1ull, 0x3ull);
|
||||
ptu_int_eq(errcode, 0);
|
||||
ptu_ptr(sfix->section);
|
||||
|
||||
errcode = pt_section_attach(sfix->section, &iscache);
|
||||
@ -602,7 +622,8 @@ static struct ptunit_result map_unmap(struct section_fixture *sfix)
|
||||
|
||||
sfix_write(sfix, bytes);
|
||||
|
||||
sfix->section = pt_mk_section(sfix->name, 0x1ull, 0x3ull);
|
||||
errcode = pt_mk_section(&sfix->section, sfix->name, 0x1ull, 0x3ull);
|
||||
ptu_int_eq(errcode, 0);
|
||||
ptu_ptr(sfix->section);
|
||||
|
||||
errcode = pt_section_map(sfix->section);
|
||||
@ -630,7 +651,8 @@ static struct ptunit_result attach_map(struct section_fixture *sfix)
|
||||
|
||||
sfix_write(sfix, bytes);
|
||||
|
||||
sfix->section = pt_mk_section(sfix->name, 0x1ull, 0x3ull);
|
||||
errcode = pt_mk_section(&sfix->section, sfix->name, 0x1ull, 0x3ull);
|
||||
ptu_int_eq(errcode, 0);
|
||||
ptu_ptr(sfix->section);
|
||||
|
||||
errcode = pt_section_attach(sfix->section, &iscache);
|
||||
@ -666,7 +688,8 @@ static struct ptunit_result attach_bad_map(struct section_fixture *sfix)
|
||||
|
||||
sfix_write(sfix, bytes);
|
||||
|
||||
sfix->section = pt_mk_section(sfix->name, 0x1ull, 0x3ull);
|
||||
errcode = pt_mk_section(&sfix->section, sfix->name, 0x1ull, 0x3ull);
|
||||
ptu_int_eq(errcode, 0);
|
||||
ptu_ptr(sfix->section);
|
||||
|
||||
errcode = pt_section_attach(sfix->section, &iscache);
|
||||
@ -691,7 +714,8 @@ static struct ptunit_result attach_map_overflow(struct section_fixture *sfix)
|
||||
|
||||
sfix_write(sfix, bytes);
|
||||
|
||||
sfix->section = pt_mk_section(sfix->name, 0x1ull, 0x3ull);
|
||||
errcode = pt_mk_section(&sfix->section, sfix->name, 0x1ull, 0x3ull);
|
||||
ptu_int_eq(errcode, 0);
|
||||
ptu_ptr(sfix->section);
|
||||
|
||||
errcode = pt_section_attach(sfix->section, &iscache);
|
||||
@ -716,7 +740,8 @@ static struct ptunit_result read(struct section_fixture *sfix)
|
||||
|
||||
sfix_write(sfix, bytes);
|
||||
|
||||
sfix->section = pt_mk_section(sfix->name, 0x1ull, 0x3ull);
|
||||
status = pt_mk_section(&sfix->section, sfix->name, 0x1ull, 0x3ull);
|
||||
ptu_int_eq(status, 0);
|
||||
ptu_ptr(sfix->section);
|
||||
|
||||
status = pt_section_map(sfix->section);
|
||||
@ -742,7 +767,8 @@ static struct ptunit_result read_null(struct section_fixture *sfix)
|
||||
|
||||
sfix_write(sfix, bytes);
|
||||
|
||||
sfix->section = pt_mk_section(sfix->name, 0x1ull, 0x3ull);
|
||||
status = pt_mk_section(&sfix->section, sfix->name, 0x1ull, 0x3ull);
|
||||
ptu_int_eq(status, 0);
|
||||
ptu_ptr(sfix->section);
|
||||
|
||||
status = pt_section_map(sfix->section);
|
||||
@ -770,7 +796,8 @@ static struct ptunit_result read_offset(struct section_fixture *sfix)
|
||||
|
||||
sfix_write(sfix, bytes);
|
||||
|
||||
sfix->section = pt_mk_section(sfix->name, 0x1ull, 0x3ull);
|
||||
status = pt_mk_section(&sfix->section, sfix->name, 0x1ull, 0x3ull);
|
||||
ptu_int_eq(status, 0);
|
||||
ptu_ptr(sfix->section);
|
||||
|
||||
status = pt_section_map(sfix->section);
|
||||
@ -795,7 +822,8 @@ static struct ptunit_result read_truncated(struct section_fixture *sfix)
|
||||
|
||||
sfix_write(sfix, bytes);
|
||||
|
||||
sfix->section = pt_mk_section(sfix->name, 0x1ull, 0x3ull);
|
||||
status = pt_mk_section(&sfix->section, sfix->name, 0x1ull, 0x3ull);
|
||||
ptu_int_eq(status, 0);
|
||||
ptu_ptr(sfix->section);
|
||||
|
||||
status = pt_section_map(sfix->section);
|
||||
@ -819,7 +847,8 @@ static struct ptunit_result read_from_truncated(struct section_fixture *sfix)
|
||||
|
||||
sfix_write(sfix, bytes);
|
||||
|
||||
sfix->section = pt_mk_section(sfix->name, 0x2ull, 0x10ull);
|
||||
status = pt_mk_section(&sfix->section, sfix->name, 0x2ull, 0x10ull);
|
||||
ptu_int_eq(status, 0);
|
||||
ptu_ptr(sfix->section);
|
||||
|
||||
status = pt_section_map(sfix->section);
|
||||
@ -843,7 +872,8 @@ static struct ptunit_result read_nomem(struct section_fixture *sfix)
|
||||
|
||||
sfix_write(sfix, bytes);
|
||||
|
||||
sfix->section = pt_mk_section(sfix->name, 0x1ull, 0x3ull);
|
||||
status = pt_mk_section(&sfix->section, sfix->name, 0x1ull, 0x3ull);
|
||||
ptu_int_eq(status, 0);
|
||||
ptu_ptr(sfix->section);
|
||||
|
||||
status = pt_section_map(sfix->section);
|
||||
@ -866,7 +896,8 @@ static struct ptunit_result read_overflow(struct section_fixture *sfix)
|
||||
|
||||
sfix_write(sfix, bytes);
|
||||
|
||||
sfix->section = pt_mk_section(sfix->name, 0x1ull, 0x3ull);
|
||||
status = pt_mk_section(&sfix->section, sfix->name, 0x1ull, 0x3ull);
|
||||
ptu_int_eq(status, 0);
|
||||
ptu_ptr(sfix->section);
|
||||
|
||||
status = pt_section_map(sfix->section);
|
||||
@ -890,7 +921,8 @@ static struct ptunit_result read_overflow_32bit(struct section_fixture *sfix)
|
||||
|
||||
sfix_write(sfix, bytes);
|
||||
|
||||
sfix->section = pt_mk_section(sfix->name, 0x1ull, 0x3ull);
|
||||
status = pt_mk_section(&sfix->section, sfix->name, 0x1ull, 0x3ull);
|
||||
ptu_int_eq(status, 0);
|
||||
ptu_ptr(sfix->section);
|
||||
|
||||
status = pt_section_map(sfix->section);
|
||||
@ -914,7 +946,8 @@ static struct ptunit_result read_nomap(struct section_fixture *sfix)
|
||||
|
||||
sfix_write(sfix, bytes);
|
||||
|
||||
sfix->section = pt_mk_section(sfix->name, 0x1ull, 0x3ull);
|
||||
status = pt_mk_section(&sfix->section, sfix->name, 0x1ull, 0x3ull);
|
||||
ptu_int_eq(status, 0);
|
||||
ptu_ptr(sfix->section);
|
||||
|
||||
status = pt_section_read(sfix->section, buffer, 1, 0x0ull);
|
||||
@ -932,7 +965,8 @@ static struct ptunit_result read_unmap_map(struct section_fixture *sfix)
|
||||
|
||||
sfix_write(sfix, bytes);
|
||||
|
||||
sfix->section = pt_mk_section(sfix->name, 0x1ull, 0x3ull);
|
||||
status = pt_mk_section(&sfix->section, sfix->name, 0x1ull, 0x3ull);
|
||||
ptu_int_eq(status, 0);
|
||||
ptu_ptr(sfix->section);
|
||||
|
||||
status = pt_section_map(sfix->section);
|
||||
@ -1071,7 +1105,8 @@ static struct ptunit_result stress(struct section_fixture *sfix,
|
||||
|
||||
sfix_write(sfix, bytes);
|
||||
|
||||
sfix->section = pt_mk_section(sfix->name, 0x1ull, 0x3ull);
|
||||
errcode = pt_mk_section(&sfix->section, sfix->name, 0x1ull, 0x3ull);
|
||||
ptu_int_eq(errcode, 0);
|
||||
ptu_ptr(sfix->section);
|
||||
|
||||
#if defined(FEATURE_THREADS)
|
||||
@ -1097,7 +1132,8 @@ static struct ptunit_result init_no_bcache(struct section_fixture *sfix)
|
||||
|
||||
sfix_write(sfix, bytes);
|
||||
|
||||
sfix->section = pt_mk_section(sfix->name, 0x1ull, 0x3ull);
|
||||
errcode = pt_mk_section(&sfix->section, sfix->name, 0x1ull, 0x3ull);
|
||||
ptu_int_eq(errcode, 0);
|
||||
ptu_ptr(sfix->section);
|
||||
|
||||
errcode = pt_section_map(sfix->section);
|
||||
@ -1120,7 +1156,8 @@ static struct ptunit_result bcache_alloc_free(struct section_fixture *sfix)
|
||||
|
||||
sfix_write(sfix, bytes);
|
||||
|
||||
sfix->section = pt_mk_section(sfix->name, 0x1ull, 0x3ull);
|
||||
errcode = pt_mk_section(&sfix->section, sfix->name, 0x1ull, 0x3ull);
|
||||
ptu_int_eq(errcode, 0);
|
||||
ptu_ptr(sfix->section);
|
||||
|
||||
errcode = pt_section_map(sfix->section);
|
||||
@ -1149,7 +1186,8 @@ static struct ptunit_result bcache_alloc_twice(struct section_fixture *sfix)
|
||||
|
||||
sfix_write(sfix, bytes);
|
||||
|
||||
sfix->section = pt_mk_section(sfix->name, 0x1ull, 0x3ull);
|
||||
errcode = pt_mk_section(&sfix->section, sfix->name, 0x1ull, 0x3ull);
|
||||
ptu_int_eq(errcode, 0);
|
||||
ptu_ptr(sfix->section);
|
||||
|
||||
errcode = pt_section_map(sfix->section);
|
||||
@ -1174,7 +1212,8 @@ static struct ptunit_result bcache_alloc_nomap(struct section_fixture *sfix)
|
||||
|
||||
sfix_write(sfix, bytes);
|
||||
|
||||
sfix->section = pt_mk_section(sfix->name, 0x1ull, 0x3ull);
|
||||
errcode = pt_mk_section(&sfix->section, sfix->name, 0x1ull, 0x3ull);
|
||||
ptu_int_eq(errcode, 0);
|
||||
ptu_ptr(sfix->section);
|
||||
|
||||
errcode = pt_section_alloc_bcache(sfix->section);
|
||||
@ -1191,7 +1230,8 @@ static struct ptunit_result memsize_nomap(struct section_fixture *sfix)
|
||||
|
||||
sfix_write(sfix, bytes);
|
||||
|
||||
sfix->section = pt_mk_section(sfix->name, 0x1ull, 0x3ull);
|
||||
errcode = pt_mk_section(&sfix->section, sfix->name, 0x1ull, 0x3ull);
|
||||
ptu_int_eq(errcode, 0);
|
||||
ptu_ptr(sfix->section);
|
||||
|
||||
errcode = pt_section_memsize(sfix->section, &memsize);
|
||||
@ -1209,7 +1249,8 @@ static struct ptunit_result memsize_unmap(struct section_fixture *sfix)
|
||||
|
||||
sfix_write(sfix, bytes);
|
||||
|
||||
sfix->section = pt_mk_section(sfix->name, 0x1ull, 0x3ull);
|
||||
errcode = pt_mk_section(&sfix->section, sfix->name, 0x1ull, 0x3ull);
|
||||
ptu_int_eq(errcode, 0);
|
||||
ptu_ptr(sfix->section);
|
||||
|
||||
errcode = pt_section_map(sfix->section);
|
||||
@ -1233,7 +1274,8 @@ static struct ptunit_result memsize_map_nobcache(struct section_fixture *sfix)
|
||||
|
||||
sfix_write(sfix, bytes);
|
||||
|
||||
sfix->section = pt_mk_section(sfix->name, 0x1ull, 0x3ull);
|
||||
errcode = pt_mk_section(&sfix->section, sfix->name, 0x1ull, 0x3ull);
|
||||
ptu_int_eq(errcode, 0);
|
||||
ptu_ptr(sfix->section);
|
||||
|
||||
errcode = pt_section_map(sfix->section);
|
||||
@ -1260,7 +1302,8 @@ static struct ptunit_result memsize_map_bcache(struct section_fixture *sfix)
|
||||
|
||||
sfix_write(sfix, bytes);
|
||||
|
||||
sfix->section = pt_mk_section(sfix->name, 0x1ull, 0x3ull);
|
||||
errcode = pt_mk_section(&sfix->section, sfix->name, 0x1ull, 0x3ull);
|
||||
ptu_int_eq(errcode, 0);
|
||||
ptu_ptr(sfix->section);
|
||||
|
||||
errcode = pt_section_map(sfix->section);
|
||||
@ -1298,31 +1341,55 @@ static struct ptunit_result sfix_init(struct section_fixture *sfix)
|
||||
|
||||
static struct ptunit_result sfix_fini(struct section_fixture *sfix)
|
||||
{
|
||||
int thrd;
|
||||
char *filename;
|
||||
FILE *file;
|
||||
int thrd, errcode;
|
||||
|
||||
ptu_test(ptunit_thrd_fini, &sfix->thrd);
|
||||
|
||||
for (thrd = 0; thrd < sfix->thrd.nthreads; ++thrd)
|
||||
ptu_int_eq(sfix->thrd.result[thrd], 0);
|
||||
|
||||
if (sfix->section) {
|
||||
pt_section_put(sfix->section);
|
||||
sfix->section = NULL;
|
||||
}
|
||||
|
||||
if (sfix->file) {
|
||||
fclose(sfix->file);
|
||||
sfix->file = NULL;
|
||||
filename = sfix->name;
|
||||
file = sfix->file;
|
||||
sfix->name = NULL;
|
||||
sfix->file = NULL;
|
||||
|
||||
if (sfix->name)
|
||||
remove(sfix->name);
|
||||
/* Try removing the file while we still have it open to avoid races
|
||||
* with others re-using the temporary filename.
|
||||
*
|
||||
* On some systems that may not be possible and we can choose between:
|
||||
*
|
||||
* - guaranteed leaking files or
|
||||
* - running the risk of removing someone elses file
|
||||
*
|
||||
* We choose the latter. Assuming those systems behave consistently,
|
||||
* removing someone elses file should only succeed if it isn't open at
|
||||
* the moment we try removing it. Given that this is a temporary file,
|
||||
* we should be able to rule out accidental name clashes with
|
||||
* non-termporary files.
|
||||
*/
|
||||
if (filename && file) {
|
||||
errcode = remove(filename);
|
||||
if (!errcode) {
|
||||
free(filename);
|
||||
filename = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
if (sfix->name) {
|
||||
free(sfix->name);
|
||||
sfix->name = NULL;
|
||||
if (file)
|
||||
fclose(file);
|
||||
|
||||
if (filename) {
|
||||
(void) remove(filename);
|
||||
free(filename);
|
||||
}
|
||||
|
||||
for (thrd = 0; thrd < sfix->thrd.nthreads; ++thrd)
|
||||
ptu_int_eq(sfix->thrd.result[thrd], 0);
|
||||
|
||||
return ptu_passed();
|
||||
}
|
||||
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2014-2018, Intel Corporation
|
||||
* Copyright (c) 2014-2019, Intel Corporation
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2014-2018, Intel Corporation
|
||||
* Copyright (c) 2014-2019, Intel Corporation
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
@ -207,6 +207,22 @@ static struct ptunit_result tcal_cbr_null(struct time_fixture *tfix)
|
||||
return ptu_passed();
|
||||
}
|
||||
|
||||
static struct ptunit_result tcal_cbr_zero(struct time_fixture *tfix)
|
||||
{
|
||||
struct pt_packet_cbr packet;
|
||||
struct pt_config config;
|
||||
int errcode;
|
||||
|
||||
config = tfix->config;
|
||||
config.nom_freq = 1;
|
||||
packet.ratio = 0;
|
||||
|
||||
errcode = pt_tcal_update_cbr(&tfix->tcal, &packet, &config);
|
||||
ptu_int_eq(errcode, -pte_bad_packet);
|
||||
|
||||
return ptu_passed();
|
||||
}
|
||||
|
||||
static struct ptunit_result tcal_mtc_null(struct time_fixture *tfix)
|
||||
{
|
||||
struct pt_packet_mtc packet;
|
||||
@ -279,6 +295,19 @@ static struct ptunit_result cbr(struct time_fixture *tfix)
|
||||
return ptu_passed();
|
||||
}
|
||||
|
||||
static struct ptunit_result cbr_zero(struct time_fixture *tfix)
|
||||
{
|
||||
struct pt_packet_cbr packet;
|
||||
int errcode;
|
||||
|
||||
packet.ratio = 0;
|
||||
|
||||
errcode = pt_time_update_cbr(&tfix->time, &packet, &tfix->config);
|
||||
ptu_int_eq(errcode, -pte_bad_packet);
|
||||
|
||||
return ptu_passed();
|
||||
}
|
||||
|
||||
static struct ptunit_result tma(struct time_fixture *tfix)
|
||||
{
|
||||
struct pt_packet_tma packet;
|
||||
@ -353,11 +382,13 @@ int main(int argc, char **argv)
|
||||
ptu_run_f(suite, query_cbr_none, tfix);
|
||||
|
||||
ptu_run_f(suite, tcal_cbr_null, tfix);
|
||||
ptu_run_f(suite, tcal_cbr_zero, tfix);
|
||||
ptu_run_f(suite, tcal_mtc_null, tfix);
|
||||
ptu_run_f(suite, tcal_cyc_null, tfix);
|
||||
|
||||
ptu_run_f(suite, tsc, tfix);
|
||||
ptu_run_f(suite, cbr, tfix);
|
||||
ptu_run_f(suite, cbr_zero, tfix);
|
||||
ptu_run_f(suite, tma, tfix);
|
||||
ptu_run_f(suite, mtc, tfix);
|
||||
ptu_run_f(suite, cyc, tfix);
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user