/* * Copyright (c) 2013-2017, 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 PARSE_H #define PARSE_H #include "yasm.h" #include "intel-pt.h" #include #include #include /* Represents the parser. */ struct parser { /* File pointer to the trace output file. */ FILE *ptfile; /* Filename of the trace output file. The filename is * determined from the .asm file given during p_alloc. */ char *ptfilename; /* The yasm structure, initialized with pttfile in p_alloc. */ struct yasm *y; /* Current pt directive. */ struct pt_directive *pd; /* The encoder configuration, passed during p_alloc. */ const struct pt_config *conf; /* Labels for @pt directives. */ struct label *pt_labels; /* Number of bytes written to pt file. */ int pt_bytes_written; }; /* Instantiates a parser and starts parsing of @pttfile and writes PT * stream using @conf. * * Returns 0 on success; a negative enum errcode otherwise. */ extern int parse(const char *pttfile, const struct pt_config *conf); /* Parses an empty payload. * * Returns 0 on success; a negative enum errcode othewise. * Returns -err_parse_trailing_tokens if @payload has non whitespace * characters. */ extern int parse_empty(char *payload); /* Parses tnt @payload. Takens are expressed with 't' and Not-Takens * with 'n'. The t's and n's can be separated with spaces, periods or * directly concatenated. * * On success the TNT bitfield will be stored in the location of @tnt; the * number of T's and N's is stored in the location of @size. * * Returns 0 on success; a negative enum errcode otherwise. * Returns -err_internal if @payload or @tnt or @size is the NULL * pointer. * Returns -err_parse_unknown_char if there is an unrecognized character * in the payload. */ extern int parse_tnt(uint64_t *tnt, uint8_t *size, char *payload); /* Parses an address and a ipc from @payload and stores it in the * location of @ip and @ipc respectively. The ipc is separated from the * address with space or comma. * * Returns 0 on success; a negative enum errcode otherwise. * Returns -err_internal if @p or @ip or @ipc is the NULL pointer. * Returns -err_parse_int if ip or ipc in the @payload could not be * parsed as integer. * Returns -err_parse_ipc if the ipc argument is missing or malformed. * Returns -err_parse_trailing_tokens if the @payload contains more than * 2 arguments. */ extern int parse_ip(struct parser *p, uint64_t *ip, enum pt_ip_compression *ipc, char *payload); /* Parses a uint64_t value from @payload and stores it in the memory * location where @x points to. * * Returns 0 on success; a negative enum errcode otherwise. * Returns -err_internal if @x is the NULL pointer. * Returns -err_parse_no_args if @payload contains no arguments. * Returns -err_parse_int if @payload cannot be parsed as integer. */ extern int parse_uint64(uint64_t *x, char *payload); /* Parses a uint8_t value from @payload and stores it in the memory * location where @x points to. * * Returns 0 on success; a negative enum errcode otherwise. * Returns -err_internal if @x is the NULL pointer. * Returns -err_parse_no_args if @payload contains no arguments. * Returns -err_parse_int if @payload cannot be parsed as integer. * Returns -err_parse_int_too_big if the integer parsed from @payload * cannot be represented in uint8_t. */ extern int parse_uint8(uint8_t *x, char *payload); /* Parses a uint16_t value from @payload and stores it in the memory * location where @x points to. * * Returns 0 on success; a negative enum errcode otherwise. * Returns -err_internal if @x is the NULL pointer. * Returns -err_parse_no_args if @payload contains no arguments. * Returns -err_parse_int if @payload cannot be parsed as integer. * Returns -err_parse_int_too_big if the integer parsed from @payload * cannot be represented in uint16_t. */ extern int parse_uint16(uint16_t *x, char *payload); /* Parses a uint32_t value from @payload and stores it in the memory * location where @x points to. * * Returns 0 on success; a negative enum errcode otherwise. * Returns -err_internal if @x is the NULL pointer. * Returns -err_parse_no_args if @payload contains no arguments. * Returns -err_parse_int if @payload cannot be parsed as integer. * Returns -err_parse_int_too_big if the integer parsed from @payload * cannot be represented in uint32_t. */ extern int parse_uint32(uint32_t *x, char *payload); /* Parses the comma-separated ctc and fc arguments of a tma packet. * * Returns 0 on success; a negative enum errcode otherwise. * Returns -err_internal if @ctc or @fc is the NULL pointer. * Returns -err_parse_int if ctc or fc in the @payload could not be * parsed as integer. * Returns -err_parse_trailing_tokens if the @payload contains more than * 2 arguments. */ extern int parse_tma(uint16_t *ctc, uint16_t *fc, char *payload); #endif /* PARSE_H */