| /* | 
 |  * 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 <inttypes.h> | 
 | #include <stdio.h> | 
 | #include <stdlib.h> | 
 |  | 
 | /* 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 */ |