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
@ -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
|
* Redistribution and use in source and binary forms, with or without
|
||||||
* modification, are permitted provided that the following conditions are met:
|
* 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
|
* Redistribution and use in source and binary forms, with or without
|
||||||
* modification, are permitted provided that the following conditions are met:
|
* 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
|
* Redistribution and use in source and binary forms, with or without
|
||||||
* modification, are permitted provided that the following conditions are met:
|
* modification, are permitted provided that the following conditions are met:
|
||||||
@ -26,26 +26,63 @@
|
|||||||
* POSSIBILITY OF SUCH DAMAGE.
|
* 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;
|
if (version.build) {
|
||||||
(void) reserved;
|
if (version.ext && version.ext[0])
|
||||||
|
return fprintf(file, "%" PRIu8 ".%" PRIu8 ".%" PRIu16
|
||||||
switch (reason) {
|
"-%" PRIu32 "-%s", version.major,
|
||||||
case DLL_PROCESS_ATTACH:
|
version.minor, version.patch,
|
||||||
/* Initialize the Intel(R) Processor Trace instruction
|
version.build, version.ext);
|
||||||
decoder. */
|
else
|
||||||
pt_ild_init();
|
return fprintf(file, "%" PRIu8 ".%" PRIu8 ".%" PRIu16
|
||||||
break;
|
"-%" PRIu32 "", version.major,
|
||||||
|
version.minor, version.patch,
|
||||||
default:
|
version.build);
|
||||||
break;
|
} 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
|
* Redistribution and use in source and binary forms, with or without
|
||||||
* modification, are permitted provided that the following conditions are met:
|
* 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
|
* Redistribution and use in source and binary forms, with or without
|
||||||
* modification, are permitted provided that the following conditions are met:
|
* 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
|
# Redistribution and use in source and binary forms, with or without
|
||||||
# modification, are permitted provided that the following conditions are met:
|
# modification, are permitted provided that the following conditions are met:
|
||||||
@ -64,28 +64,28 @@ if (CMAKE_HOST_UNIX)
|
|||||||
internal/include/posix
|
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)
|
set(LIBIPT_SECTION_FILES ${LIBIPT_SECTION_FILES} src/posix/pt_section_posix.c)
|
||||||
endif (CMAKE_HOST_UNIX)
|
endif (CMAKE_HOST_UNIX)
|
||||||
|
|
||||||
if (CMAKE_HOST_WIN32)
|
if (CMAKE_HOST_WIN32)
|
||||||
add_definitions(
|
if (BUILD_SHARED_LIBS)
|
||||||
# export libipt symbols
|
add_definitions(
|
||||||
#
|
# export libipt symbols
|
||||||
/Dpt_export=__declspec\(dllexport\)
|
#
|
||||||
)
|
/Dpt_export=__declspec\(dllexport\)
|
||||||
|
)
|
||||||
|
endif (BUILD_SHARED_LIBS)
|
||||||
|
|
||||||
include_directories(
|
include_directories(
|
||||||
internal/include/windows
|
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)
|
set(LIBIPT_SECTION_FILES ${LIBIPT_SECTION_FILES} src/windows/pt_section_windows.c)
|
||||||
endif (CMAKE_HOST_WIN32)
|
endif (CMAKE_HOST_WIN32)
|
||||||
|
|
||||||
set(LIBIPT_FILES ${LIBIPT_FILES} ${LIBIPT_SECTION_FILES})
|
set(LIBIPT_FILES ${LIBIPT_FILES} ${LIBIPT_SECTION_FILES})
|
||||||
|
|
||||||
add_library(libipt SHARED
|
add_library(libipt
|
||||||
${LIBIPT_FILES}
|
${LIBIPT_FILES}
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -167,6 +167,24 @@ add_ptunit_c_test(fetch
|
|||||||
src/pt_encoder.c
|
src/pt_encoder.c
|
||||||
src/pt_config.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_cpp_test(cpp)
|
||||||
add_ptunit_libraries(cpp libipt)
|
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
|
* Redistribution and use in source and binary forms, with or without
|
||||||
* modification, are permitted provided that the following conditions are met:
|
* modification, are permitted provided that the following conditions are met:
|
||||||
@ -80,6 +80,7 @@ struct pt_block_decoder;
|
|||||||
/** The header version. */
|
/** The header version. */
|
||||||
#define LIBIPT_VERSION_MAJOR ${PT_VERSION_MAJOR}
|
#define LIBIPT_VERSION_MAJOR ${PT_VERSION_MAJOR}
|
||||||
#define LIBIPT_VERSION_MINOR ${PT_VERSION_MINOR}
|
#define LIBIPT_VERSION_MINOR ${PT_VERSION_MINOR}
|
||||||
|
#define LIBIPT_VERSION_PATCH ${PT_VERSION_PATCH}
|
||||||
|
|
||||||
#define LIBIPT_VERSION ((LIBIPT_VERSION_MAJOR << 8) + LIBIPT_VERSION_MINOR)
|
#define LIBIPT_VERSION ((LIBIPT_VERSION_MAJOR << 8) + LIBIPT_VERSION_MINOR)
|
||||||
|
|
||||||
@ -92,8 +93,8 @@ struct pt_version {
|
|||||||
/** Minor version number. */
|
/** Minor version number. */
|
||||||
uint8_t minor;
|
uint8_t minor;
|
||||||
|
|
||||||
/** Reserved bits. */
|
/** Patch level. */
|
||||||
uint16_t reserved;
|
uint16_t patch;
|
||||||
|
|
||||||
/** Build number. */
|
/** Build number. */
|
||||||
uint32_t build;
|
uint32_t build;
|
||||||
@ -330,6 +331,16 @@ struct pt_errata {
|
|||||||
*/
|
*/
|
||||||
uint32_t apl11:1;
|
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. */
|
/* Reserve a few bytes for the future. */
|
||||||
uint32_t reserved[15];
|
uint32_t reserved[15];
|
||||||
};
|
};
|
||||||
@ -348,14 +359,26 @@ struct pt_conf_flags {
|
|||||||
|
|
||||||
/** End a block after a jump instruction. */
|
/** End a block after a jump instruction. */
|
||||||
uint32_t end_on_jump:1;
|
uint32_t end_on_jump:1;
|
||||||
|
|
||||||
|
/** Preserve timing calibration on overflow. */
|
||||||
|
uint32_t keep_tcal_on_ovf:1;
|
||||||
} block;
|
} block;
|
||||||
|
|
||||||
/** Flags for the instruction flow decoder. */
|
/** Flags for the instruction flow decoder. */
|
||||||
struct {
|
struct {
|
||||||
/** Enable tick events for timing updates. */
|
/** Enable tick events for timing updates. */
|
||||||
uint32_t enable_tick_events:1;
|
uint32_t enable_tick_events:1;
|
||||||
|
|
||||||
|
/** Preserve timing calibration on overflow. */
|
||||||
|
uint32_t keep_tcal_on_ovf:1;
|
||||||
} insn;
|
} 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. */
|
/* Reserve a few bytes for future extensions. */
|
||||||
uint32_t reserved[4];
|
uint32_t reserved[4];
|
||||||
} variant;
|
} 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
|
* Redistribution and use in source and binary forms, with or without
|
||||||
* modification, are permitted provided that the following conditions are met:
|
* modification, are permitted provided that the following conditions are met:
|
||||||
@ -80,6 +80,7 @@ struct pt_block_decoder;
|
|||||||
/** The header version. */
|
/** The header version. */
|
||||||
#define LIBIPT_VERSION_MAJOR ${PT_VERSION_MAJOR}
|
#define LIBIPT_VERSION_MAJOR ${PT_VERSION_MAJOR}
|
||||||
#define LIBIPT_VERSION_MINOR ${PT_VERSION_MINOR}
|
#define LIBIPT_VERSION_MINOR ${PT_VERSION_MINOR}
|
||||||
|
#define LIBIPT_VERSION_PATCH ${PT_VERSION_PATCH}
|
||||||
|
|
||||||
#define LIBIPT_VERSION ((LIBIPT_VERSION_MAJOR << 8) + LIBIPT_VERSION_MINOR)
|
#define LIBIPT_VERSION ((LIBIPT_VERSION_MAJOR << 8) + LIBIPT_VERSION_MINOR)
|
||||||
|
|
||||||
@ -92,8 +93,8 @@ struct pt_version {
|
|||||||
/** Minor version number. */
|
/** Minor version number. */
|
||||||
uint8_t minor;
|
uint8_t minor;
|
||||||
|
|
||||||
/** Reserved bits. */
|
/** Patch level. */
|
||||||
uint16_t reserved;
|
uint16_t patch;
|
||||||
|
|
||||||
/** Build number. */
|
/** Build number. */
|
||||||
uint32_t build;
|
uint32_t build;
|
||||||
@ -330,6 +331,16 @@ struct pt_errata {
|
|||||||
*/
|
*/
|
||||||
uint32_t apl11:1;
|
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. */
|
/* Reserve a few bytes for the future. */
|
||||||
uint32_t reserved[15];
|
uint32_t reserved[15];
|
||||||
};
|
};
|
||||||
@ -348,14 +359,26 @@ struct pt_conf_flags {
|
|||||||
|
|
||||||
/** End a block after a jump instruction. */
|
/** End a block after a jump instruction. */
|
||||||
uint32_t end_on_jump:1;
|
uint32_t end_on_jump:1;
|
||||||
|
|
||||||
|
/** Preserve timing calibration on overflow. */
|
||||||
|
uint32_t keep_tcal_on_ovf:1;
|
||||||
} block;
|
} block;
|
||||||
|
|
||||||
/** Flags for the instruction flow decoder. */
|
/** Flags for the instruction flow decoder. */
|
||||||
struct {
|
struct {
|
||||||
/** Enable tick events for timing updates. */
|
/** Enable tick events for timing updates. */
|
||||||
uint32_t enable_tick_events:1;
|
uint32_t enable_tick_events:1;
|
||||||
|
|
||||||
|
/** Preserve timing calibration on overflow. */
|
||||||
|
uint32_t keep_tcal_on_ovf:1;
|
||||||
} insn;
|
} 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. */
|
/* Reserve a few bytes for future extensions. */
|
||||||
uint32_t reserved[4];
|
uint32_t reserved[4];
|
||||||
} variant;
|
} 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
|
* Redistribution and use in source and binary forms, with or without
|
||||||
* modification, are permitted provided that the following conditions are met:
|
* 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
|
* Redistribution and use in source and binary forms, with or without
|
||||||
* modification, are permitted provided that the following conditions are met:
|
* 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
|
* Redistribution and use in source and binary forms, with or without
|
||||||
* modification, are permitted provided that the following conditions are met:
|
* 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
|
* Redistribution and use in source and binary forms, with or without
|
||||||
* modification, are permitted provided that the following conditions are met:
|
* 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
|
* Redistribution and use in source and binary forms, with or without
|
||||||
* modification, are permitted provided that the following conditions are met:
|
* 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
|
* Redistribution and use in source and binary forms, with or without
|
||||||
* modification, are permitted provided that the following conditions are met:
|
* 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
|
* Redistribution and use in source and binary forms, with or without
|
||||||
* modification, are permitted provided that the following conditions are met:
|
* 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
|
* Redistribution and use in source and binary forms, with or without
|
||||||
* modification, are permitted provided that the following conditions are met:
|
* 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
|
* Redistribution and use in source and binary forms, with or without
|
||||||
* modification, are permitted provided that the following conditions are met:
|
* 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
|
* Redistribution and use in source and binary forms, with or without
|
||||||
* modification, are permitted provided that the following conditions are met:
|
* 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
|
* Redistribution and use in source and binary forms, with or without
|
||||||
* modification, are permitted provided that the following conditions are met:
|
* 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;
|
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. */
|
/* all decoding is multithread safe. */
|
||||||
|
|
||||||
/* Decode one instruction.
|
/* 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
|
* Redistribution and use in source and binary forms, with or without
|
||||||
* modification, are permitted provided that the following conditions are met:
|
* 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
|
* Redistribution and use in source and binary forms, with or without
|
||||||
* modification, are permitted provided that the following conditions are met:
|
* 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
|
* Redistribution and use in source and binary forms, with or without
|
||||||
* modification, are permitted provided that the following conditions are met:
|
* 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
|
* Redistribution and use in source and binary forms, with or without
|
||||||
* modification, are permitted provided that the following conditions are met:
|
* 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
|
* Redistribution and use in source and binary forms, with or without
|
||||||
* modification, are permitted provided that the following conditions are met:
|
* 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
|
* Redistribution and use in source and binary forms, with or without
|
||||||
* modification, are permitted provided that the following conditions are met:
|
* 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
|
* Redistribution and use in source and binary forms, with or without
|
||||||
* modification, are permitted provided that the following conditions are met:
|
* 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
|
* Redistribution and use in source and binary forms, with or without
|
||||||
* modification, are permitted provided that the following conditions are met:
|
* 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
|
* Redistribution and use in source and binary forms, with or without
|
||||||
* modification, are permitted provided that the following conditions are met:
|
* 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
|
* Redistribution and use in source and binary forms, with or without
|
||||||
* modification, are permitted provided that the following conditions are met:
|
* 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
|
* Redistribution and use in source and binary forms, with or without
|
||||||
* modification, are permitted provided that the following conditions are met:
|
* 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
|
* Redistribution and use in source and binary forms, with or without
|
||||||
* modification, are permitted provided that the following conditions are met:
|
* 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
|
* Redistribution and use in source and binary forms, with or without
|
||||||
* modification, are permitted provided that the following conditions are met:
|
* 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
|
* The returned section is not mapped and starts with a user count of one and
|
||||||
* instruction caching enabled.
|
* 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,
|
extern int pt_mk_section(struct pt_section **psection, const char *filename,
|
||||||
uint64_t size);
|
uint64_t offset, uint64_t size);
|
||||||
|
|
||||||
/* Lock a section.
|
/* 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
|
* Redistribution and use in source and binary forms, with or without
|
||||||
* modification, are permitted provided that the following conditions are met:
|
* 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
|
* Redistribution and use in source and binary forms, with or without
|
||||||
* modification, are permitted provided that the following conditions are met:
|
* 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
|
* Redistribution and use in source and binary forms, with or without
|
||||||
* modification, are permitted provided that the following conditions are met:
|
* 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. */
|
/* A flag saying whether we have seen a MTC packet. */
|
||||||
uint32_t have_mtc:1;
|
uint32_t have_mtc:1;
|
||||||
|
|
||||||
|
/* A flag saying whether we need to check for erratum SKL168. */
|
||||||
|
uint32_t check_skl168:1;
|
||||||
};
|
};
|
||||||
|
|
||||||
enum {
|
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 *,
|
extern int pt_tcal_update_cyc(struct pt_time_cal *,
|
||||||
const struct pt_packet_cyc *,
|
const struct pt_packet_cyc *,
|
||||||
const struct pt_config *);
|
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 */
|
#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
|
* Redistribution and use in source and binary forms, with or without
|
||||||
* modification, are permitted provided that the following conditions are met:
|
* 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
|
* Redistribution and use in source and binary forms, with or without
|
||||||
* modification, are permitted provided that the following conditions are met:
|
* 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
|
* Redistribution and use in source and binary forms, with or without
|
||||||
* modification, are permitted provided that the following conditions are met:
|
* 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
|
* Redistribution and use in source and binary forms, with or without
|
||||||
* modification, are permitted provided that the following conditions are met:
|
* 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
|
* Redistribution and use in source and binary forms, with or without
|
||||||
* modification, are permitted provided that the following conditions are met:
|
* 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
|
* Redistribution and use in source and binary forms, with or without
|
||||||
* modification, are permitted provided that the following conditions are met:
|
* 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
|
* Redistribution and use in source and binary forms, with or without
|
||||||
* modification, are permitted provided that the following conditions are met:
|
* 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
|
* Redistribution and use in source and binary forms, with or without
|
||||||
* modification, are permitted provided that the following conditions are met:
|
* 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
|
* Redistribution and use in source and binary forms, with or without
|
||||||
* modification, are permitted provided that the following conditions are met:
|
* 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
|
* Redistribution and use in source and binary forms, with or without
|
||||||
* modification, are permitted provided that the following conditions are met:
|
* 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);
|
errcode = stat(filename, &buffer);
|
||||||
if (errcode < 0)
|
if (errcode < 0)
|
||||||
return errcode;
|
return -pte_bad_file;
|
||||||
|
|
||||||
if (buffer.st_size < 0)
|
if (buffer.st_size < 0)
|
||||||
return -pte_bad_image;
|
return -pte_bad_image;
|
||||||
@ -65,7 +65,7 @@ int pt_section_mk_status(void **pstatus, uint64_t *psize, const char *filename)
|
|||||||
status->stat = buffer;
|
status->stat = buffer;
|
||||||
|
|
||||||
*pstatus = status;
|
*pstatus = status;
|
||||||
*psize = buffer.st_size;
|
*psize = (uint64_t) buffer.st_size;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -81,7 +81,7 @@ static int check_file_status(struct pt_section *section, int fd)
|
|||||||
|
|
||||||
errcode = fstat(fd, &stat);
|
errcode = fstat(fd, &stat);
|
||||||
if (errcode)
|
if (errcode)
|
||||||
return -pte_bad_image;
|
return -pte_bad_file;
|
||||||
|
|
||||||
status = section->status;
|
status = section->status;
|
||||||
if (!status)
|
if (!status)
|
||||||
@ -101,6 +101,7 @@ int pt_sec_posix_map(struct pt_section *section, int fd)
|
|||||||
struct pt_sec_posix_mapping *mapping;
|
struct pt_sec_posix_mapping *mapping;
|
||||||
uint64_t offset, size, adjustment;
|
uint64_t offset, size, adjustment;
|
||||||
uint8_t *base;
|
uint8_t *base;
|
||||||
|
long page_size;
|
||||||
int errcode;
|
int errcode;
|
||||||
|
|
||||||
if (!section)
|
if (!section)
|
||||||
@ -109,7 +110,11 @@ int pt_sec_posix_map(struct pt_section *section, int fd)
|
|||||||
offset = section->offset;
|
offset = section->offset;
|
||||||
size = section->size;
|
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;
|
offset -= adjustment;
|
||||||
size += adjustment;
|
size += adjustment;
|
||||||
@ -213,7 +218,7 @@ int pt_section_map(struct pt_section *section)
|
|||||||
if (!filename)
|
if (!filename)
|
||||||
goto out_unlock;
|
goto out_unlock;
|
||||||
|
|
||||||
errcode = -pte_bad_image;
|
errcode = -pte_bad_file;
|
||||||
fd = open(filename, O_RDONLY);
|
fd = open(filename, O_RDONLY);
|
||||||
if (fd == -1)
|
if (fd == -1)
|
||||||
goto out_unlock;
|
goto out_unlock;
|
||||||
@ -234,8 +239,10 @@ int pt_section_map(struct pt_section *section)
|
|||||||
* if we fail to convert the file descriptor.
|
* if we fail to convert the file descriptor.
|
||||||
*/
|
*/
|
||||||
file = fdopen(fd, "rb");
|
file = fdopen(fd, "rb");
|
||||||
if (!file)
|
if (!file) {
|
||||||
|
errcode = -pte_bad_file;
|
||||||
goto out_fd;
|
goto out_fd;
|
||||||
|
}
|
||||||
|
|
||||||
/* We need to keep the file open on success. It will be closed when
|
/* We need to keep the file open on success. It will be closed when
|
||||||
* the section is unmapped.
|
* 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
|
* Redistribution and use in source and binary forms, with or without
|
||||||
* modification, are permitted provided that the following conditions are met:
|
* 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
|
* Redistribution and use in source and binary forms, with or without
|
||||||
* modification, are permitted provided that the following conditions are met:
|
* 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
|
* Redistribution and use in source and binary forms, with or without
|
||||||
* modification, are permitted provided that the following conditions are met:
|
* 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;
|
return -pte_internal;
|
||||||
|
|
||||||
memset(qflags, 0, sizeof(*qflags));
|
memset(qflags, 0, sizeof(*qflags));
|
||||||
|
qflags->variant.query.keep_tcal_on_ovf =
|
||||||
|
flags->variant.block.keep_tcal_on_ovf;
|
||||||
|
|
||||||
return 0;
|
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;
|
ip = insn->ip + insn->size;
|
||||||
if (taken)
|
if (taken)
|
||||||
ip += iext->variant.branch.displacement;
|
ip += (uint64_t) (int64_t)
|
||||||
|
iext->variant.branch.displacement;
|
||||||
|
|
||||||
*pip = ip;
|
*pip = ip;
|
||||||
return status;
|
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_bcache_entry bce;
|
||||||
struct pt_insn_ext iext;
|
struct pt_insn_ext iext;
|
||||||
struct pt_insn insn;
|
struct pt_insn insn;
|
||||||
uint64_t nip, dip;
|
uint64_t nip, dip, ioff, noff;
|
||||||
int64_t disp, ioff, noff;
|
int64_t disp;
|
||||||
int status;
|
int status;
|
||||||
|
|
||||||
if (!decoder || !steps)
|
if (!decoder || !steps)
|
||||||
@ -2002,7 +2005,7 @@ pt_blk_proceed_no_event_fill_cache(struct pt_block_decoder *decoder,
|
|||||||
return -pte_internal;
|
return -pte_internal;
|
||||||
|
|
||||||
/* The decision point IP and the displacement from @insn.ip. */
|
/* 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);
|
disp = (int64_t) (dip - insn.ip);
|
||||||
|
|
||||||
/* We may have switched sections if the section was split. See
|
/* 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.
|
* 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))
|
if (!pt_blk_is_in_section(msec, nip))
|
||||||
return pt_blk_proceed_no_event_uncached(decoder, block);
|
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)
|
if (status < 0)
|
||||||
return status;
|
return status;
|
||||||
|
|
||||||
ip += iext.variant.branch.displacement;
|
ip += (uint64_t) (int64_t)
|
||||||
|
iext.variant.branch.displacement;
|
||||||
}
|
}
|
||||||
|
|
||||||
decoder->ip = ip + bce.isize;
|
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
|
* Redistribution and use in source and binary forms, with or without
|
||||||
* modification, are permitted provided that the following conditions are met:
|
* 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 0x4e:
|
||||||
case 0x5e:
|
case 0x5e:
|
||||||
errata->bdm70 = 1;
|
|
||||||
errata->skd007 = 1;
|
|
||||||
errata->skd022 = 1;
|
|
||||||
errata->skd010 = 1;
|
|
||||||
errata->skl014 = 1;
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
case 0x8e:
|
case 0x8e:
|
||||||
case 0x9e:
|
case 0x9e:
|
||||||
errata->bdm70 = 1;
|
errata->bdm70 = 1;
|
||||||
errata->skl014 = 1;
|
errata->skd007 = 1;
|
||||||
errata->skd022 = 1;
|
errata->skd022 = 1;
|
||||||
errata->skd010 = 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;
|
return 0;
|
||||||
|
|
||||||
case 0x5c:
|
case 0x5c:
|
||||||
@ -80,6 +83,11 @@ int pt_cpu_errata(struct pt_errata *errata, const struct pt_cpu *cpu)
|
|||||||
errata->apl12 = 1;
|
errata->apl12 = 1;
|
||||||
errata->apl11 = 1;
|
errata->apl11 = 1;
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
case 0x7a:
|
||||||
|
case 0x86:
|
||||||
|
errata->apl11 = 1;
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
break;
|
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
|
* Redistribution and use in source and binary forms, with or without
|
||||||
* modification, are permitted provided that the following conditions are met:
|
* 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
|
* Redistribution and use in source and binary forms, with or without
|
||||||
* modification, are permitted provided that the following conditions are met:
|
* 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
|
* Redistribution and use in source and binary forms, with or without
|
||||||
* modification, are permitted provided that the following conditions are met:
|
* 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)
|
if (!begin)
|
||||||
return -pte_internal;
|
return -pte_internal;
|
||||||
|
|
||||||
*offset = raw - begin;
|
*offset = (uint64_t) (int64_t) (raw - begin);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -230,7 +230,8 @@ static int pt_encode_ip(struct pt_encoder *encoder, enum pt_opcode op,
|
|||||||
if (size < 0)
|
if (size < 0)
|
||||||
return size;
|
return size;
|
||||||
|
|
||||||
errcode = pt_reserve(encoder, /* opc size = */ 1 + size);
|
errcode = pt_reserve(encoder,
|
||||||
|
/* opc size = */ 1u + (unsigned int) size);
|
||||||
if (errcode < 0)
|
if (errcode < 0)
|
||||||
return errcode;
|
return errcode;
|
||||||
|
|
||||||
@ -661,7 +662,8 @@ int pt_enc_next(struct pt_encoder *encoder, const struct pt_packet *packet)
|
|||||||
if (size < 0)
|
if (size < 0)
|
||||||
return size;
|
return size;
|
||||||
|
|
||||||
errcode = pt_reserve(encoder, pt_opcs_ptw + size);
|
errcode = pt_reserve(encoder,
|
||||||
|
(unsigned int) (pt_opcs_ptw + size));
|
||||||
if (errcode < 0)
|
if (errcode < 0)
|
||||||
return errcode;
|
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
|
* Redistribution and use in source and binary forms, with or without
|
||||||
* modification, are permitted provided that the following conditions are met:
|
* 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
|
* Redistribution and use in source and binary forms, with or without
|
||||||
* modification, are permitted provided that the following conditions are met:
|
* 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
|
* Redistribution and use in source and binary forms, with or without
|
||||||
* modification, are permitted provided that the following conditions are met:
|
* modification, are permitted provided that the following conditions are met:
|
||||||
@ -33,66 +33,27 @@
|
|||||||
#include "pti-modrm.h"
|
#include "pti-modrm.h"
|
||||||
#include "pti-disp-defs.h"
|
#include "pti-disp-defs.h"
|
||||||
#include "pti-disp.h"
|
#include "pti-disp.h"
|
||||||
|
#include "pti-disp_default.h"
|
||||||
|
#include "pti-sib.h"
|
||||||
|
|
||||||
#include <string.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)
|
/* With Address-size prefix (0x67): */ {
|
||||||
{
|
/* ptem_unknown = */ ptem_unknown,
|
||||||
uint8_t mod, rm;
|
/* ptem_16bit = */ ptem_32bit,
|
||||||
|
/* ptem_32bit = */ ptem_16bit,
|
||||||
memset(has_disp_regular, 0, sizeof(has_disp_regular));
|
/* ptem_64bit = */ ptem_32bit
|
||||||
|
|
||||||
/*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;
|
|
||||||
}
|
}
|
||||||
}
|
};
|
||||||
|
|
||||||
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 */
|
/* 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 eamode = eamode_table[ild->u.s.asz][ild->mode];
|
||||||
uint8_t mod = (uint8_t) pti_get_modrm_mod(ild);
|
uint8_t mod = (uint8_t) pti_get_modrm_mod(ild);
|
||||||
uint8_t rm = (uint8_t) pti_get_modrm_rm(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];
|
sib = has_sib[eamode][mod][rm];
|
||||||
if (has_sib)
|
if (sib)
|
||||||
return sib_dec(ild, length + 1);
|
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);
|
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)
|
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);
|
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)
|
static int decode(struct pt_ild *ild)
|
||||||
{
|
{
|
||||||
return prefix_decode(ild, 0, 0);
|
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;
|
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)
|
static int pt_instruction_length_decode(struct pt_ild *ild)
|
||||||
{
|
{
|
||||||
if (!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
|
* Redistribution and use in source and binary forms, with or without
|
||||||
* modification, are permitted provided that the following conditions are met:
|
* modification, are permitted provided that the following conditions are met:
|
||||||
@ -43,12 +43,16 @@ static char *dupstr(const char *str)
|
|||||||
if (!str)
|
if (!str)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
len = strlen(str);
|
/* Silently truncate the name if it gets too big. */
|
||||||
|
len = strnlen(str, 4096ul);
|
||||||
|
|
||||||
dup = malloc(len + 1);
|
dup = malloc(len + 1);
|
||||||
if (!dup)
|
if (!dup)
|
||||||
return NULL;
|
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,
|
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)
|
if (errcode < 0)
|
||||||
return errcode;
|
return errcode;
|
||||||
|
|
||||||
section = pt_mk_section(filename, offset, size);
|
section = NULL;
|
||||||
if (!section)
|
errcode = pt_mk_section(§ion, filename, offset, size);
|
||||||
return -pte_invalid;
|
if (errcode < 0)
|
||||||
|
return errcode;
|
||||||
|
|
||||||
errcode = pt_image_add(image, section, &asid, vaddr, 0);
|
errcode = pt_image_add(image, section, &asid, vaddr, 0);
|
||||||
if (errcode < 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
|
* Redistribution and use in source and binary forms, with or without
|
||||||
* modification, are permitted provided that the following conditions are met:
|
* modification, are permitted provided that the following conditions are met:
|
||||||
@ -42,12 +42,16 @@ static char *dupstr(const char *str)
|
|||||||
if (!str)
|
if (!str)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
len = strlen(str);
|
/* Silently truncate the name if it gets too big. */
|
||||||
|
len = strnlen(str, 4096ul);
|
||||||
|
|
||||||
dup = malloc(len + 1);
|
dup = malloc(len + 1);
|
||||||
if (!dup)
|
if (!dup)
|
||||||
return NULL;
|
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)
|
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)
|
if (errcode < 0)
|
||||||
return errcode;
|
return errcode;
|
||||||
|
|
||||||
section = pt_mk_section(filename, offset, size);
|
section = NULL;
|
||||||
if (!section)
|
errcode = pt_mk_section(§ion, filename, offset, size);
|
||||||
return -pte_invalid;
|
if (errcode < 0)
|
||||||
|
return errcode;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* We unlocked @iscache and hold a reference to @section. */
|
/* 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
|
* Redistribution and use in source and binary forms, with or without
|
||||||
* modification, are permitted provided that the following conditions are met:
|
* 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_call:
|
||||||
case ptic_jump:
|
case ptic_jump:
|
||||||
if (iext->variant.branch.is_direct) {
|
if (iext->variant.branch.is_direct) {
|
||||||
ip += iext->variant.branch.displacement;
|
ip += (uint64_t) (int64_t)
|
||||||
|
iext->variant.branch.displacement;
|
||||||
break;
|
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
|
* Redistribution and use in source and binary forms, with or without
|
||||||
* modification, are permitted provided that the following conditions are met:
|
* 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;
|
return -pte_internal;
|
||||||
|
|
||||||
memset(qflags, 0, sizeof(*qflags));
|
memset(qflags, 0, sizeof(*qflags));
|
||||||
|
qflags->variant.query.keep_tcal_on_ovf =
|
||||||
|
flags->variant.insn.keep_tcal_on_ovf;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -598,7 +600,8 @@ static int pt_insn_proceed(struct pt_insn_decoder *decoder,
|
|||||||
* and all flavors of far transfers.
|
* and all flavors of far transfers.
|
||||||
*/
|
*/
|
||||||
if (iext->variant.branch.is_direct)
|
if (iext->variant.branch.is_direct)
|
||||||
decoder->ip += iext->variant.branch.displacement;
|
decoder->ip += (uint64_t) (int64_t)
|
||||||
|
iext->variant.branch.displacement;
|
||||||
else {
|
else {
|
||||||
int status;
|
int status;
|
||||||
|
|
||||||
@ -641,7 +644,7 @@ static int pt_insn_at_skl014(const struct pt_event *ev,
|
|||||||
/* Check the filter against the branch target. */
|
/* Check the filter against the branch target. */
|
||||||
ip = insn->ip;
|
ip = insn->ip;
|
||||||
ip += insn->size;
|
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);
|
status = pt_filter_addr_check(&config->addr_filter, ip);
|
||||||
if (status <= 0) {
|
if (status <= 0) {
|
||||||
@ -698,7 +701,8 @@ static int pt_insn_at_disabled_event(const struct pt_event *ev,
|
|||||||
|
|
||||||
ip = insn->ip;
|
ip = insn->ip;
|
||||||
ip += insn->size;
|
ip += insn->size;
|
||||||
ip += iext->variant.branch.displacement;
|
ip += (uint64_t) (int64_t)
|
||||||
|
iext->variant.branch.displacement;
|
||||||
|
|
||||||
if (ip != ev->variant.disabled.ip)
|
if (ip != ev->variant.disabled.ip)
|
||||||
break;
|
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
|
* Redistribution and use in source and binary forms, with or without
|
||||||
* modification, are permitted provided that the following conditions are met:
|
* 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
|
* Redistribution and use in source and binary forms, with or without
|
||||||
* modification, are permitted provided that the following conditions are met:
|
* 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
|
* Redistribution and use in source and binary forms, with or without
|
||||||
* modification, are permitted provided that the following conditions are met:
|
* 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
|
* Redistribution and use in source and binary forms, with or without
|
||||||
* modification, are permitted provided that the following conditions are met:
|
* modification, are permitted provided that the following conditions are met:
|
||||||
@ -35,6 +35,7 @@
|
|||||||
|
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
#include <stddef.h>
|
||||||
|
|
||||||
|
|
||||||
int pt_pkt_decoder_init(struct pt_packet_decoder *decoder,
|
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)
|
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;
|
int errcode;
|
||||||
|
|
||||||
if (!decoder)
|
if (!decoder)
|
||||||
return -pte_invalid;
|
return -pte_invalid;
|
||||||
|
|
||||||
|
begin = decoder->config.begin;
|
||||||
sync = decoder->sync;
|
sync = decoder->sync;
|
||||||
pos = decoder->pos;
|
pos = decoder->pos;
|
||||||
if (!pos)
|
if (!pos)
|
||||||
pos = decoder->config.begin;
|
pos = begin;
|
||||||
|
|
||||||
if (pos == sync)
|
if (pos == sync)
|
||||||
pos += ptps_psb;
|
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);
|
errcode = pt_sync_forward(&sync, pos, &decoder->config);
|
||||||
if (errcode < 0)
|
if (errcode < 0)
|
||||||
return errcode;
|
return errcode;
|
||||||
@ -166,7 +181,7 @@ int pt_pkt_get_offset(const struct pt_packet_decoder *decoder, uint64_t *offset)
|
|||||||
if (!pos)
|
if (!pos)
|
||||||
return -pte_nosync;
|
return -pte_nosync;
|
||||||
|
|
||||||
*offset = pos - begin;
|
*offset = (uint64_t) (int64_t) (pos - begin);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -184,7 +199,7 @@ int pt_pkt_get_sync_offset(const struct pt_packet_decoder *decoder,
|
|||||||
if (!sync)
|
if (!sync)
|
||||||
return -pte_nosync;
|
return -pte_nosync;
|
||||||
|
|
||||||
*offset = sync - begin;
|
*offset = (uint64_t) (int64_t) (sync - begin);
|
||||||
return 0;
|
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
|
* Redistribution and use in source and binary forms, with or without
|
||||||
* modification, are permitted provided that the following conditions are met:
|
* 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)
|
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;
|
int errcode;
|
||||||
|
|
||||||
if (!decoder)
|
if (!decoder)
|
||||||
return -pte_invalid;
|
return -pte_invalid;
|
||||||
|
|
||||||
|
begin = decoder->config.begin;
|
||||||
sync = decoder->sync;
|
sync = decoder->sync;
|
||||||
pos = decoder->pos;
|
pos = decoder->pos;
|
||||||
if (!pos)
|
if (!pos)
|
||||||
pos = decoder->config.begin;
|
pos = begin;
|
||||||
|
|
||||||
if (pos == sync)
|
if (pos == sync)
|
||||||
pos += ptps_psb;
|
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);
|
errcode = pt_sync_forward(&sync, pos, &decoder->config);
|
||||||
if (errcode < 0)
|
if (errcode < 0)
|
||||||
return errcode;
|
return errcode;
|
||||||
@ -653,7 +667,7 @@ int pt_qry_get_offset(const struct pt_query_decoder *decoder, uint64_t *offset)
|
|||||||
if (!pos)
|
if (!pos)
|
||||||
return -pte_nosync;
|
return -pte_nosync;
|
||||||
|
|
||||||
*offset = pos - begin;
|
*offset = (uint64_t) (int64_t) (pos - begin);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -671,7 +685,7 @@ int pt_qry_get_sync_offset(const struct pt_query_decoder *decoder,
|
|||||||
if (!sync)
|
if (!sync)
|
||||||
return -pte_nosync;
|
return -pte_nosync;
|
||||||
|
|
||||||
*offset = sync - begin;
|
*offset = (uint64_t) (int64_t) (sync - begin);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1043,6 +1057,10 @@ int pt_qry_decode_psb(struct pt_query_decoder *decoder)
|
|||||||
if (size < 0)
|
if (size < 0)
|
||||||
return size;
|
return size;
|
||||||
|
|
||||||
|
errcode = pt_tcal_update_psb(&decoder->tcal, &decoder->config);
|
||||||
|
if (errcode < 0)
|
||||||
|
return errcode;
|
||||||
|
|
||||||
decoder->pos += size;
|
decoder->pos += size;
|
||||||
|
|
||||||
errcode = pt_qry_read_psb_header(decoder);
|
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)
|
int pt_qry_decode_ovf(struct pt_query_decoder *decoder)
|
||||||
{
|
{
|
||||||
|
struct pt_time_cal tcal;
|
||||||
struct pt_time time;
|
struct pt_time time;
|
||||||
int status, offset;
|
int status, offset;
|
||||||
|
|
||||||
@ -2851,8 +2870,18 @@ int pt_qry_decode_ovf(struct pt_query_decoder *decoder)
|
|||||||
|
|
||||||
/* Reset the decoder state but preserve timing. */
|
/* Reset the decoder state but preserve timing. */
|
||||||
time = decoder->time;
|
time = decoder->time;
|
||||||
|
tcal = decoder->tcal;
|
||||||
|
|
||||||
pt_qry_reset(decoder);
|
pt_qry_reset(decoder);
|
||||||
|
|
||||||
decoder->time = time;
|
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. */
|
/* We must consume the OVF before we search for the binding packet. */
|
||||||
decoder->pos += ptps_ovf;
|
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
|
* Redistribution and use in source and binary forms, with or without
|
||||||
* modification, are permitted provided that the following conditions are met:
|
* 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
|
* Redistribution and use in source and binary forms, with or without
|
||||||
* modification, are permitted provided that the following conditions are met:
|
* modification, are permitted provided that the following conditions are met:
|
||||||
@ -37,37 +37,40 @@
|
|||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
|
|
||||||
static char *dupstr(const char *str)
|
int pt_mk_section(struct pt_section **psection, const char *filename,
|
||||||
{
|
uint64_t offset, uint64_t size)
|
||||||
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)
|
|
||||||
{
|
{
|
||||||
struct pt_section *section;
|
struct pt_section *section;
|
||||||
uint64_t fsize;
|
uint64_t fsize;
|
||||||
|
size_t flen;
|
||||||
void *status;
|
void *status;
|
||||||
|
char *fname;
|
||||||
int errcode;
|
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)
|
if (errcode < 0)
|
||||||
return NULL;
|
goto out_fname;
|
||||||
|
|
||||||
/* Fail if the requested @offset lies beyond the end of @file. */
|
/* Fail if the requested @offset lies beyond the end of @file. */
|
||||||
if (fsize <= offset)
|
if (fsize <= offset) {
|
||||||
|
errcode = -pte_invalid;
|
||||||
goto out_status;
|
goto out_status;
|
||||||
|
}
|
||||||
|
|
||||||
/* Truncate @size so the entire range lies within @file. */
|
/* Truncate @size so the entire range lies within @file. */
|
||||||
fsize -= offset;
|
fsize -= offset;
|
||||||
@ -75,12 +78,14 @@ struct pt_section *pt_mk_section(const char *filename, uint64_t offset,
|
|||||||
size = fsize;
|
size = fsize;
|
||||||
|
|
||||||
section = malloc(sizeof(*section));
|
section = malloc(sizeof(*section));
|
||||||
if (!section)
|
if (!section) {
|
||||||
|
errcode = -pte_nomem;
|
||||||
goto out_status;
|
goto out_status;
|
||||||
|
}
|
||||||
|
|
||||||
memset(section, 0, sizeof(*section));
|
memset(section, 0, sizeof(*section));
|
||||||
|
|
||||||
section->filename = dupstr(filename);
|
section->filename = fname;
|
||||||
section->status = status;
|
section->status = status;
|
||||||
section->offset = offset;
|
section->offset = offset;
|
||||||
section->size = size;
|
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);
|
errcode = mtx_init(§ion->lock, mtx_plain);
|
||||||
if (errcode != thrd_success) {
|
if (errcode != thrd_success) {
|
||||||
free(section->filename);
|
|
||||||
free(section);
|
free(section);
|
||||||
|
|
||||||
|
errcode = -pte_bad_lock;
|
||||||
goto out_status;
|
goto out_status;
|
||||||
}
|
}
|
||||||
|
|
||||||
errcode = mtx_init(§ion->alock, mtx_plain);
|
errcode = mtx_init(§ion->alock, mtx_plain);
|
||||||
if (errcode != thrd_success) {
|
if (errcode != thrd_success) {
|
||||||
mtx_destroy(§ion->lock);
|
mtx_destroy(§ion->lock);
|
||||||
free(section->filename);
|
|
||||||
free(section);
|
free(section);
|
||||||
|
|
||||||
|
errcode = -pte_bad_lock;
|
||||||
goto out_status;
|
goto out_status;
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif /* defined(FEATURE_THREADS) */
|
#endif /* defined(FEATURE_THREADS) */
|
||||||
|
|
||||||
return section;
|
*psection = section;
|
||||||
|
return 0;
|
||||||
|
|
||||||
out_status:
|
out_status:
|
||||||
free(status);
|
free(status);
|
||||||
return NULL;
|
|
||||||
|
out_fname:
|
||||||
|
free(fname);
|
||||||
|
return errcode;
|
||||||
}
|
}
|
||||||
|
|
||||||
int pt_section_lock(struct pt_section *section)
|
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
|
* Redistribution and use in source and binary forms, with or without
|
||||||
* modification, are permitted provided that the following conditions are met:
|
* 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
|
* Redistribution and use in source and binary forms, with or without
|
||||||
* modification, are permitted provided that the following conditions are met:
|
* 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,
|
int pt_sync_forward(const uint8_t **sync, const uint8_t *pos,
|
||||||
const struct pt_config *config)
|
const struct pt_config *config)
|
||||||
{
|
{
|
||||||
const uint8_t *begin, *end;
|
const uint8_t *begin, *end, *start;
|
||||||
|
|
||||||
if (!sync || !pos || !config)
|
if (!sync || !pos || !config)
|
||||||
return -pte_internal;
|
return -pte_internal;
|
||||||
|
|
||||||
|
start = pos;
|
||||||
begin = config->begin;
|
begin = config->begin;
|
||||||
end = config->end;
|
end = config->end;
|
||||||
|
|
||||||
@ -194,6 +195,12 @@ int pt_sync_forward(const uint8_t **sync, const uint8_t *pos,
|
|||||||
if (!current)
|
if (!current)
|
||||||
continue;
|
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;
|
*sync = current;
|
||||||
return 0;
|
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
|
* Redistribution and use in source and binary forms, with or without
|
||||||
* modification, are permitted provided that the following conditions are met:
|
* 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_packet_cbr *packet,
|
||||||
const struct pt_config *config)
|
const struct pt_config *config)
|
||||||
{
|
{
|
||||||
|
uint8_t cbr;
|
||||||
|
|
||||||
(void) config;
|
(void) config;
|
||||||
|
|
||||||
if (!time || !packet)
|
if (!time || !packet)
|
||||||
return -pte_internal;
|
return -pte_internal;
|
||||||
|
|
||||||
|
cbr = packet->ratio;
|
||||||
|
if (!cbr)
|
||||||
|
return -pte_bad_packet;
|
||||||
|
|
||||||
time->have_cbr = 1;
|
time->have_cbr = 1;
|
||||||
time->cbr = packet->ratio;
|
time->cbr = cbr;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -254,7 +260,7 @@ int pt_time_update_mtc(struct pt_time *time,
|
|||||||
last_ctc = time->ctc;
|
last_ctc = time->ctc;
|
||||||
mtc_freq = config->mtc_freq;
|
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. */
|
/* Store our CTC value if we have or would have reset FC. */
|
||||||
if (time->fc || time->lost_cyc || !have_mtc)
|
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,
|
/* The TMA's CTC value didn't provide enough bits - otherwise,
|
||||||
* we would have treated the TMA as an MTC.
|
* 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;
|
return -pte_internal;
|
||||||
|
|
||||||
/* Split this MTC's CTC value into low and high parts with
|
/* Split this MTC's CTC value into low and high parts with
|
||||||
* respect to the bits provided by TMA.
|
* respect to the bits provided by TMA.
|
||||||
*/
|
*/
|
||||||
ctc_lo = ctc & pt_pl_tma_ctc_mask;
|
ctc_lo = ctc & (uint32_t) pt_pl_tma_ctc_mask;
|
||||||
ctc_hi = ctc & ~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
|
/* We estimate the high-order CTC bits that are not provided by
|
||||||
* TMA based on the CTC bits provided by this MTC.
|
* 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) {
|
if (ctc_lo < last_ctc) {
|
||||||
ctc_hi -= 1u << pt_pl_tma_ctc_bit_size;
|
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;
|
last_ctc |= ctc_hi;
|
||||||
@ -478,6 +484,18 @@ int pt_tcal_set_fcr(struct pt_time_cal *tcal, uint64_t fcr)
|
|||||||
return 0;
|
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,
|
int pt_tcal_update_tsc(struct pt_time_cal *tcal,
|
||||||
const struct pt_packet_tsc *packet,
|
const struct pt_packet_tsc *packet,
|
||||||
const struct pt_config *config)
|
const struct pt_config *config)
|
||||||
@ -519,6 +537,10 @@ int pt_tcal_header_tsc(struct pt_time_cal *tcal,
|
|||||||
if (!last_tsc || !cyc)
|
if (!last_tsc || !cyc)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
/* Prefer MTC over TSC for calibration. */
|
||||||
|
if (tcal->have_mtc)
|
||||||
|
return 0;
|
||||||
|
|
||||||
/* Correct a single wrap-around. */
|
/* Correct a single wrap-around. */
|
||||||
if (tsc < last_tsc) {
|
if (tsc < last_tsc) {
|
||||||
tsc += 1ull << pt_pl_tsc_bit_size;
|
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. */
|
/* If we know the nominal frequency, we can use it for calibration. */
|
||||||
cbr = packet->ratio;
|
cbr = packet->ratio;
|
||||||
|
if (!cbr)
|
||||||
|
return -pte_bad_packet;
|
||||||
|
|
||||||
fcr = (p1 << pt_tcal_fcr_shr) / cbr;
|
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_packet_mtc *packet,
|
||||||
const struct pt_config *config)
|
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;
|
uint64_t cyc, fc, fcr;
|
||||||
int errcode;
|
int errcode;
|
||||||
|
|
||||||
@ -601,8 +625,12 @@ int pt_tcal_update_mtc(struct pt_time_cal *tcal,
|
|||||||
last_ctc = tcal->ctc;
|
last_ctc = tcal->ctc;
|
||||||
have_mtc = tcal->have_mtc;
|
have_mtc = tcal->have_mtc;
|
||||||
cyc = tcal->cyc_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). */
|
/* We need at least two MTC (including this). */
|
||||||
if (!have_mtc) {
|
if (!have_mtc) {
|
||||||
@ -645,6 +673,49 @@ int pt_tcal_update_mtc(struct pt_time_cal *tcal,
|
|||||||
|
|
||||||
fcr = (fc << pt_tcal_fcr_shr) / cyc;
|
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);
|
errcode = pt_tcal_set_fcr(tcal, fcr);
|
||||||
if (errcode < 0)
|
if (errcode < 0)
|
||||||
return errcode;
|
return errcode;
|
||||||
@ -672,3 +743,18 @@ int pt_tcal_update_cyc(struct pt_time_cal *tcal,
|
|||||||
|
|
||||||
return 0;
|
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
|
* Redistribution and use in source and binary forms, with or without
|
||||||
* modification, are permitted provided that the following conditions are met:
|
* 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
|
* Redistribution and use in source and binary forms, with or without
|
||||||
* modification, are permitted provided that the following conditions are met:
|
* modification, are permitted provided that the following conditions are met:
|
||||||
@ -32,9 +32,9 @@
|
|||||||
struct pt_version pt_library_version(void)
|
struct pt_version pt_library_version(void)
|
||||||
{
|
{
|
||||||
struct pt_version v = {
|
struct pt_version v = {
|
||||||
/* .major = */ PT_VERSION_MAJOR,
|
/* .major = */ PT_VERSION_MAJOR,
|
||||||
/* .minor = */ PT_VERSION_MINOR,
|
/* .minor = */ PT_VERSION_MINOR,
|
||||||
/* .reserved = */ 0,
|
/* .patch = */ PT_VERSION_PATCH,
|
||||||
/* .build = */ PT_VERSION_BUILD,
|
/* .build = */ PT_VERSION_BUILD,
|
||||||
/* .ext = */ PT_VERSION_EXT
|
/* .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
|
* Redistribution and use in source and binary forms, with or without
|
||||||
* modification, are permitted provided that the following conditions are met:
|
* 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
|
* Redistribution and use in source and binary forms, with or without
|
||||||
* modification, are permitted provided that the following conditions are met:
|
* 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);
|
fd = _open(filename, _O_RDONLY);
|
||||||
if (fd == -1)
|
if (fd == -1)
|
||||||
return -pte_bad_image;
|
return -pte_bad_file;
|
||||||
|
|
||||||
errcode = _fstat(fd, stat);
|
errcode = _fstat(fd, stat);
|
||||||
|
|
||||||
_close(fd);
|
_close(fd);
|
||||||
|
|
||||||
if (errcode)
|
if (errcode)
|
||||||
return -pte_bad_image;
|
return -pte_bad_file;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -98,7 +98,7 @@ static int check_file_status(struct pt_section *section, int fd)
|
|||||||
|
|
||||||
errcode = _fstat(fd, &stat);
|
errcode = _fstat(fd, &stat);
|
||||||
if (errcode)
|
if (errcode)
|
||||||
return -pte_bad_image;
|
return -pte_bad_file;
|
||||||
|
|
||||||
status = section->status;
|
status = section->status;
|
||||||
if (!status)
|
if (!status)
|
||||||
@ -256,8 +256,8 @@ int pt_section_map(struct pt_section *section)
|
|||||||
goto out_unlock;
|
goto out_unlock;
|
||||||
}
|
}
|
||||||
|
|
||||||
fh = CreateFile(filename, GENERIC_READ, FILE_SHARE_READ, NULL,
|
fh = CreateFileA(filename, GENERIC_READ, FILE_SHARE_READ, NULL,
|
||||||
OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
|
OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
|
||||||
if (fh == INVALID_HANDLE_VALUE) {
|
if (fh == INVALID_HANDLE_VALUE) {
|
||||||
/* We failed to open the file read-only. Let's try to open it
|
/* 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.
|
* 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().
|
* We will detect changes to the file via fstat().
|
||||||
*/
|
*/
|
||||||
|
|
||||||
fh = CreateFile(filename, GENERIC_READ, FILE_SHARE_WRITE, NULL,
|
fh = CreateFileA(filename, GENERIC_READ, FILE_SHARE_WRITE,
|
||||||
OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
|
NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL,
|
||||||
|
NULL);
|
||||||
if (fh == INVALID_HANDLE_VALUE) {
|
if (fh == INVALID_HANDLE_VALUE) {
|
||||||
errcode = -pte_bad_image;
|
errcode = -pte_bad_file;
|
||||||
goto out_unlock;
|
goto out_unlock;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fd = _open_osfhandle((intptr_t) fh, _O_RDONLY);
|
fd = _open_osfhandle((intptr_t) fh, _O_RDONLY);
|
||||||
if (fd == -1) {
|
if (fd == -1) {
|
||||||
errcode = -pte_bad_image;
|
errcode = -pte_bad_file;
|
||||||
goto out_fh;
|
goto out_fh;
|
||||||
}
|
}
|
||||||
|
|
||||||
errcode = check_file_status(section, fd);
|
errcode = check_file_status(section, fd);
|
||||||
if (errcode < 0) {
|
if (errcode < 0)
|
||||||
errcode = -pte_bad_image;
|
|
||||||
goto out_fd;
|
goto out_fd;
|
||||||
}
|
|
||||||
|
|
||||||
/* We leave the file open on success. It will be closed when the
|
/* We leave the file open on success. It will be closed when the
|
||||||
* section is unmapped.
|
* section is unmapped.
|
||||||
@ -297,7 +296,7 @@ int pt_section_map(struct pt_section *section)
|
|||||||
*/
|
*/
|
||||||
file = _fdopen(fd, "rb");
|
file = _fdopen(fd, "rb");
|
||||||
if (!file) {
|
if (!file) {
|
||||||
errcode = -pte_bad_image;
|
errcode = -pte_bad_file;
|
||||||
goto out_fd;
|
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
|
* Redistribution and use in source and binary forms, with or without
|
||||||
* modification, are permitted provided that the following conditions are met:
|
* 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
|
* Redistribution and use in source and binary forms, with or without
|
||||||
* modification, are permitted provided that the following conditions are met:
|
* 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
|
* Redistribution and use in source and binary forms, with or without
|
||||||
* modification, are permitted provided that the following conditions are met:
|
* 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();
|
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)
|
int main(int argc, char **argv)
|
||||||
{
|
{
|
||||||
struct ptunit_suite suite;
|
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_out_stop_in);
|
||||||
ptu_run(suite, addr_filter_ip_in_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);
|
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
|
* Redistribution and use in source and binary forms, with or without
|
||||||
* modification, are permitted provided that the following conditions are met:
|
* 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
|
* Redistribution and use in source and binary forms, with or without
|
||||||
* modification, are permitted provided that the following conditions are met:
|
* 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
|
* Redistribution and use in source and binary forms, with or without
|
||||||
* modification, are permitted provided that the following conditions are met:
|
* 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
|
* Redistribution and use in source and binary forms, with or without
|
||||||
* modification, are permitted provided that the following conditions are met:
|
* 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
|
* Redistribution and use in source and binary forms, with or without
|
||||||
* modification, are permitted provided that the following conditions are met:
|
* modification, are permitted provided that the following conditions are met:
|
||||||
@ -690,8 +690,6 @@ int main(int argc, char **argv)
|
|||||||
{
|
{
|
||||||
struct ptunit_suite suite;
|
struct ptunit_suite suite;
|
||||||
|
|
||||||
pt_ild_init();
|
|
||||||
|
|
||||||
suite = ptunit_mk_suite(argc, argv);
|
suite = ptunit_mk_suite(argc, argv);
|
||||||
|
|
||||||
ptu_run(suite, push);
|
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
|
* Redistribution and use in source and binary forms, with or without
|
||||||
* modification, are permitted provided that the following conditions are met:
|
* 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;
|
return section->size;
|
||||||
}
|
}
|
||||||
|
|
||||||
struct pt_section *pt_mk_section(const char *file, uint64_t offset,
|
int pt_mk_section(struct pt_section **psection, const char *filename,
|
||||||
uint64_t size)
|
uint64_t offset, uint64_t size)
|
||||||
{
|
{
|
||||||
(void) file;
|
(void) psection;
|
||||||
|
(void) filename;
|
||||||
(void) offset;
|
(void) offset;
|
||||||
(void) size;
|
(void) size;
|
||||||
|
|
||||||
/* This function is not used by our tests. */
|
/* This function is not used by our tests. */
|
||||||
return NULL;
|
return -pte_not_supported;
|
||||||
}
|
}
|
||||||
|
|
||||||
int pt_section_get(struct pt_section *section)
|
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
|
* Redistribution and use in source and binary forms, with or without
|
||||||
* modification, are permitted provided that the following conditions are met:
|
* modification, are permitted provided that the following conditions are met:
|
||||||
@ -69,8 +69,8 @@ struct pt_section {
|
|||||||
#endif /* defined(FEATURE_THREADS) */
|
#endif /* defined(FEATURE_THREADS) */
|
||||||
};
|
};
|
||||||
|
|
||||||
extern struct pt_section *pt_mk_section(const char *filename, uint64_t offset,
|
extern int pt_mk_section(struct pt_section **psection, const char *filename,
|
||||||
uint64_t size);
|
uint64_t offset, uint64_t size);
|
||||||
|
|
||||||
extern int pt_section_get(struct pt_section *section);
|
extern int pt_section_get(struct pt_section *section);
|
||||||
extern int pt_section_put(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);
|
uint16_t size, uint64_t offset);
|
||||||
|
|
||||||
|
|
||||||
struct pt_section *pt_mk_section(const char *filename, uint64_t offset,
|
int pt_mk_section(struct pt_section **psection, const char *filename,
|
||||||
uint64_t size)
|
uint64_t offset, uint64_t size)
|
||||||
{
|
{
|
||||||
struct pt_section *section;
|
struct pt_section *section;
|
||||||
|
uint8_t idx;
|
||||||
|
|
||||||
section = malloc(sizeof(*section));
|
section = malloc(sizeof(*section));
|
||||||
if (section) {
|
if (!section)
|
||||||
uint8_t idx;
|
return -pte_nomem;
|
||||||
|
|
||||||
memset(section, 0, sizeof(*section));
|
memset(section, 0, sizeof(*section));
|
||||||
section->filename = filename;
|
section->filename = filename;
|
||||||
section->offset = offset;
|
section->offset = offset;
|
||||||
section->size = size;
|
section->size = size;
|
||||||
section->ucount = 1;
|
section->ucount = 1;
|
||||||
|
|
||||||
for (idx = 0; idx < sizeof(section->content); ++idx)
|
for (idx = 0; idx < sizeof(section->content); ++idx)
|
||||||
section->content[idx] = idx;
|
section->content[idx] = idx;
|
||||||
|
|
||||||
#if defined(FEATURE_THREADS)
|
#if defined(FEATURE_THREADS)
|
||||||
{
|
{
|
||||||
int errcode;
|
int errcode;
|
||||||
|
|
||||||
errcode = mtx_init(§ion->lock, mtx_plain);
|
errcode = mtx_init(§ion->lock, mtx_plain);
|
||||||
if (errcode != thrd_success) {
|
if (errcode != thrd_success) {
|
||||||
free(section);
|
free(section);
|
||||||
section = NULL;
|
return -pte_bad_lock;
|
||||||
}
|
|
||||||
|
|
||||||
errcode = mtx_init(§ion->alock, mtx_plain);
|
|
||||||
if (errcode != thrd_success) {
|
|
||||||
mtx_destroy(§ion->lock);
|
|
||||||
free(section);
|
|
||||||
section = NULL;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
#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)
|
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) {
|
for (idx = 0; idx < num_sections; ++idx) {
|
||||||
struct pt_section *section;
|
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 % 3 == 0 ? 0x1000 : 0x2000,
|
||||||
idx % 2 == 0 ? 0x1000 : 0x2000);
|
idx % 2 == 0 ? 0x1000 : 0x2000);
|
||||||
|
ptu_int_eq(errcode, 0);
|
||||||
ptu_ptr(section);
|
ptu_ptr(section);
|
||||||
|
|
||||||
cfix->section[idx] = 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
|
* Redistribution and use in source and binary forms, with or without
|
||||||
* modification, are permitted provided that the following conditions are met:
|
* 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
|
* Redistribution and use in source and binary forms, with or without
|
||||||
* modification, are permitted provided that the following conditions are met:
|
* 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
|
* Redistribution and use in source and binary forms, with or without
|
||||||
* modification, are permitted provided that the following conditions are met:
|
* 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
|
* Redistribution and use in source and binary forms, with or without
|
||||||
* modification, are permitted provided that the following conditions are met:
|
* 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
|
* Redistribution and use in source and binary forms, with or without
|
||||||
* modification, are permitted provided that the following conditions are met:
|
* modification, are permitted provided that the following conditions are met:
|
||||||
@ -60,16 +60,16 @@ struct ptu_decoder_fixture {
|
|||||||
};
|
};
|
||||||
|
|
||||||
/* An invalid address. */
|
/* 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. */
|
/* A sign-extended address. */
|
||||||
static const uint64_t pt_dfix_sext_ip = 0xffffff00ff00ff00ull;
|
static const uint64_t pt_dfix_sext_ip = 0xffffff00ff00ff00ull;
|
||||||
|
|
||||||
/* The highest possible address. */
|
/* 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. */
|
/* 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
|
/* Synchronize the decoder at the beginning of the trace stream, avoiding the
|
||||||
* initial PSB header.
|
* 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
|
* Redistribution and use in source and binary forms, with or without
|
||||||
* modification, are permitted provided that the following conditions are met:
|
* 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
|
* Redistribution and use in source and binary forms, with or without
|
||||||
* modification, are permitted provided that the following conditions are met:
|
* 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
|
* Redistribution and use in source and binary forms, with or without
|
||||||
* modification, are permitted provided that the following conditions are met:
|
* 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;
|
const char *name;
|
||||||
uint8_t bytes[] = { 0xcc, 0xcc, 0xcc, 0xcc, 0xcc };
|
uint8_t bytes[] = { 0xcc, 0xcc, 0xcc, 0xcc, 0xcc };
|
||||||
uint64_t offset, size;
|
uint64_t offset, size;
|
||||||
|
int errcode;
|
||||||
|
|
||||||
sfix_write(sfix, bytes);
|
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);
|
ptu_ptr(sfix->section);
|
||||||
|
|
||||||
name = pt_section_filename(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)
|
static struct ptunit_result create_bad_offset(struct section_fixture *sfix)
|
||||||
{
|
{
|
||||||
sfix->section = pt_mk_section(sfix->name, 0x10ull, 0x0ull);
|
int errcode;
|
||||||
ptu_null(sfix->section);
|
|
||||||
|
errcode = pt_mk_section(&sfix->section, sfix->name, 0x10ull, 0x0ull);
|
||||||
|
ptu_int_eq(errcode, -pte_invalid);
|
||||||
|
|
||||||
return ptu_passed();
|
return ptu_passed();
|
||||||
}
|
}
|
||||||
@ -193,10 +197,12 @@ static struct ptunit_result create_truncated(struct section_fixture *sfix)
|
|||||||
const char *name;
|
const char *name;
|
||||||
uint8_t bytes[] = { 0xcc, 0xcc, 0xcc, 0xcc, 0xcc };
|
uint8_t bytes[] = { 0xcc, 0xcc, 0xcc, 0xcc, 0xcc };
|
||||||
uint64_t offset, size;
|
uint64_t offset, size;
|
||||||
|
int errcode;
|
||||||
|
|
||||||
sfix_write(sfix, bytes);
|
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);
|
ptu_ptr(sfix->section);
|
||||||
|
|
||||||
name = pt_section_filename(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)
|
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);
|
ptu_null(sfix->section);
|
||||||
|
|
||||||
return ptu_passed();
|
return ptu_passed();
|
||||||
@ -359,7 +368,8 @@ static struct ptunit_result get_overflow(struct section_fixture *sfix)
|
|||||||
|
|
||||||
sfix_write(sfix, bytes);
|
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);
|
ptu_ptr(sfix->section);
|
||||||
|
|
||||||
sfix->section->ucount = UINT16_MAX;
|
sfix->section->ucount = UINT16_MAX;
|
||||||
@ -380,7 +390,8 @@ static struct ptunit_result attach_overflow(struct section_fixture *sfix)
|
|||||||
|
|
||||||
sfix_write(sfix, bytes);
|
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);
|
ptu_ptr(sfix->section);
|
||||||
|
|
||||||
sfix->section->acount = UINT16_MAX;
|
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_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);
|
ptu_ptr(sfix->section);
|
||||||
|
|
||||||
sfix->section->acount = 2;
|
sfix->section->acount = 2;
|
||||||
@ -421,7 +433,8 @@ static struct ptunit_result map_change(struct section_fixture *sfix)
|
|||||||
|
|
||||||
sfix_write(sfix, bytes);
|
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);
|
ptu_ptr(sfix->section);
|
||||||
|
|
||||||
sfix_write(sfix, bytes);
|
sfix_write(sfix, bytes);
|
||||||
@ -439,7 +452,8 @@ static struct ptunit_result map_put(struct section_fixture *sfix)
|
|||||||
|
|
||||||
sfix_write(sfix, bytes);
|
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);
|
ptu_ptr(sfix->section);
|
||||||
|
|
||||||
errcode = pt_section_map(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_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);
|
ptu_ptr(sfix->section);
|
||||||
|
|
||||||
errcode = pt_section_unmap(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_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);
|
ptu_ptr(sfix->section);
|
||||||
|
|
||||||
sfix->section->mcount = UINT16_MAX;
|
sfix->section->mcount = UINT16_MAX;
|
||||||
@ -497,7 +513,8 @@ static struct ptunit_result get_put(struct section_fixture *sfix)
|
|||||||
|
|
||||||
sfix_write(sfix, bytes);
|
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);
|
ptu_ptr(sfix->section);
|
||||||
|
|
||||||
errcode = pt_section_get(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_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);
|
ptu_ptr(sfix->section);
|
||||||
|
|
||||||
sfix->section->ucount += 2;
|
sfix->section->ucount += 2;
|
||||||
@ -553,7 +571,8 @@ static struct ptunit_result attach_bad_iscache(struct section_fixture *sfix)
|
|||||||
|
|
||||||
sfix_write(sfix, bytes);
|
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);
|
ptu_ptr(sfix->section);
|
||||||
|
|
||||||
sfix->section->ucount += 2;
|
sfix->section->ucount += 2;
|
||||||
@ -580,7 +599,8 @@ static struct ptunit_result detach_bad_iscache(struct section_fixture *sfix)
|
|||||||
|
|
||||||
sfix_write(sfix, bytes);
|
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);
|
ptu_ptr(sfix->section);
|
||||||
|
|
||||||
errcode = pt_section_attach(sfix->section, &iscache);
|
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_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);
|
ptu_ptr(sfix->section);
|
||||||
|
|
||||||
errcode = pt_section_map(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_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);
|
ptu_ptr(sfix->section);
|
||||||
|
|
||||||
errcode = pt_section_attach(sfix->section, &iscache);
|
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_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);
|
ptu_ptr(sfix->section);
|
||||||
|
|
||||||
errcode = pt_section_attach(sfix->section, &iscache);
|
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_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);
|
ptu_ptr(sfix->section);
|
||||||
|
|
||||||
errcode = pt_section_attach(sfix->section, &iscache);
|
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_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);
|
ptu_ptr(sfix->section);
|
||||||
|
|
||||||
status = pt_section_map(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_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);
|
ptu_ptr(sfix->section);
|
||||||
|
|
||||||
status = pt_section_map(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_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);
|
ptu_ptr(sfix->section);
|
||||||
|
|
||||||
status = pt_section_map(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_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);
|
ptu_ptr(sfix->section);
|
||||||
|
|
||||||
status = pt_section_map(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_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);
|
ptu_ptr(sfix->section);
|
||||||
|
|
||||||
status = pt_section_map(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_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);
|
ptu_ptr(sfix->section);
|
||||||
|
|
||||||
status = pt_section_map(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_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);
|
ptu_ptr(sfix->section);
|
||||||
|
|
||||||
status = pt_section_map(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_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);
|
ptu_ptr(sfix->section);
|
||||||
|
|
||||||
status = pt_section_map(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_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);
|
ptu_ptr(sfix->section);
|
||||||
|
|
||||||
status = pt_section_read(sfix->section, buffer, 1, 0x0ull);
|
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_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);
|
ptu_ptr(sfix->section);
|
||||||
|
|
||||||
status = pt_section_map(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_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);
|
ptu_ptr(sfix->section);
|
||||||
|
|
||||||
#if defined(FEATURE_THREADS)
|
#if defined(FEATURE_THREADS)
|
||||||
@ -1097,7 +1132,8 @@ static struct ptunit_result init_no_bcache(struct section_fixture *sfix)
|
|||||||
|
|
||||||
sfix_write(sfix, bytes);
|
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);
|
ptu_ptr(sfix->section);
|
||||||
|
|
||||||
errcode = pt_section_map(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_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);
|
ptu_ptr(sfix->section);
|
||||||
|
|
||||||
errcode = pt_section_map(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_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);
|
ptu_ptr(sfix->section);
|
||||||
|
|
||||||
errcode = pt_section_map(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_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);
|
ptu_ptr(sfix->section);
|
||||||
|
|
||||||
errcode = pt_section_alloc_bcache(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_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);
|
ptu_ptr(sfix->section);
|
||||||
|
|
||||||
errcode = pt_section_memsize(sfix->section, &memsize);
|
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_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);
|
ptu_ptr(sfix->section);
|
||||||
|
|
||||||
errcode = pt_section_map(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_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);
|
ptu_ptr(sfix->section);
|
||||||
|
|
||||||
errcode = pt_section_map(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_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);
|
ptu_ptr(sfix->section);
|
||||||
|
|
||||||
errcode = pt_section_map(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)
|
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);
|
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) {
|
if (sfix->section) {
|
||||||
pt_section_put(sfix->section);
|
pt_section_put(sfix->section);
|
||||||
sfix->section = NULL;
|
sfix->section = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (sfix->file) {
|
filename = sfix->name;
|
||||||
fclose(sfix->file);
|
file = sfix->file;
|
||||||
sfix->file = NULL;
|
sfix->name = NULL;
|
||||||
|
sfix->file = NULL;
|
||||||
|
|
||||||
if (sfix->name)
|
/* Try removing the file while we still have it open to avoid races
|
||||||
remove(sfix->name);
|
* 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) {
|
if (file)
|
||||||
free(sfix->name);
|
fclose(file);
|
||||||
sfix->name = NULL;
|
|
||||||
|
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();
|
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
|
* Redistribution and use in source and binary forms, with or without
|
||||||
* modification, are permitted provided that the following conditions are met:
|
* 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
|
* Redistribution and use in source and binary forms, with or without
|
||||||
* modification, are permitted provided that the following conditions are met:
|
* 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();
|
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)
|
static struct ptunit_result tcal_mtc_null(struct time_fixture *tfix)
|
||||||
{
|
{
|
||||||
struct pt_packet_mtc packet;
|
struct pt_packet_mtc packet;
|
||||||
@ -279,6 +295,19 @@ static struct ptunit_result cbr(struct time_fixture *tfix)
|
|||||||
return ptu_passed();
|
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)
|
static struct ptunit_result tma(struct time_fixture *tfix)
|
||||||
{
|
{
|
||||||
struct pt_packet_tma packet;
|
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, query_cbr_none, tfix);
|
||||||
|
|
||||||
ptu_run_f(suite, tcal_cbr_null, 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_mtc_null, tfix);
|
||||||
ptu_run_f(suite, tcal_cyc_null, tfix);
|
ptu_run_f(suite, tcal_cyc_null, tfix);
|
||||||
|
|
||||||
ptu_run_f(suite, tsc, tfix);
|
ptu_run_f(suite, tsc, tfix);
|
||||||
ptu_run_f(suite, cbr, tfix);
|
ptu_run_f(suite, cbr, tfix);
|
||||||
|
ptu_run_f(suite, cbr_zero, tfix);
|
||||||
ptu_run_f(suite, tma, tfix);
|
ptu_run_f(suite, tma, tfix);
|
||||||
ptu_run_f(suite, mtc, tfix);
|
ptu_run_f(suite, mtc, tfix);
|
||||||
ptu_run_f(suite, cyc, 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