/*
 * Copyright (c) 2013-2019, Intel Corporation
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are met:
 *
 *  * 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 YASM_H
#define YASM_H

#include "file.h"
#include "util.h"

#include <stdint.h>

/* Parses all labels in @t and appends them to @l.
 *
 * Returns 0 on success; a negative enum errcode otherwise.
 * Returns -err_section if @t contains a "[section]" yasm directive.
 * Sections are currently not supported.
 * Returns -err_label_addr if the address for a label could not be
 * determined.
 */
extern int parse_yasm_labels(struct label *l, const struct text *t);

/* Modifies @s, so it can be used as a label, if @s actually looks like
 * a label.
 *
 * Returns true if @s looks like a label; false otherwise.
 * Returns -err_internal if @l or @name is the NULL pointer.
 */
extern int make_label(char *s);

/* Represents the state of the pt directive parser.  The parser uses the
 * canonical yasm lst file syntax to follow all asm source files that
 * were used during a yasm run.  The lst file stores information about
 * these files in terms of line numbers and line increments.  With this
 * information the contents of the lst file can be correlated to the
 * actual source files.
 */
struct state {
	/* Current line number.  */
	int n;

	/* Current line increment for this file.  */
	int inc;

	/* Current filename.  */
	char *filename;

	/* Pointer to the current line.  */
	char *line;
};

/* Allocates new state.
 *
 * Returns a non-NULL state object on success; NULL otherwise.
 */
extern struct state *st_alloc(void);

/* Deallocates and clears all fields of @st.
 * If @st is the NULL pointer, nothing happens.
 */
extern void st_free(struct state *st);

/* Prints @s to stderr enriched with @st's file and line information.
 *
 * Returns @errcode on success.
 * Returns -err_internal if @st is the NULL pointer or @errcode is
 * not negative.
 */
extern int st_print_err(const struct state *st, const char *s, int errcode);

/* The kind of directive: Intel PT or sideband. */
enum pt_directive_kind {
	pdk_pt,
#if defined(FEATURE_SIDEBAND)
	pdk_sb,
#endif
};

/* Represents a pt directive with name and payload.  */
struct pt_directive {
	/* The kind of the directive. */
	enum pt_directive_kind kind;

	/* Name of the directive.  */
	char *name;

	/* Length of name.  */
	size_t nlen;

	/* Everything between the '(' and ')' in the directive.  */
	char *payload;

	/* Length of payoad.  */
	size_t plen;
};

/* Allocates a new pt directive that can hold a directive name and
 * payload of no more than @n characters.
 *
 * Returns a non-NULL pt directive object on success; NULL otherwise.
 */
extern struct pt_directive *pd_alloc(size_t n);

/* Deallocates and clears all fields of @pd.
 * If @pd is the NULL pointer, nothing happens.
 */
extern void pd_free(struct pt_directive *pd);

/* Copies @kind, @name and @payload to the corresponding fields in @pd.
 *
 * Returns 0 on success; a negative enum errcode otherwise.
 * Returns -err_internal if @pd or @name or @payload is the NULL
 * pointer.
 */
extern int pd_set(struct pt_directive *pd, enum pt_directive_kind kind,
		  const char *name, const char *payload);

/* Parses a pt directive from @st and stores it in @pd.
 *
 * Returns 0 on success; a negative enum errcode otherwise.
 * Returns -err_internal if @pd or @st is the NULL pointer.
 */
extern int pd_parse(struct pt_directive *pd, struct state *st);

/* Represents a yasm assembled file.  */
struct yasm {
	/* Filename of the .asm file.  */
	char *pttfile;

	/* Filename of the .lst file.  It is the concatenation of
	 * fileroot and ".lst".
	 */
	char *lstfile;

	/* Filename of the .bin file.  It is the concatenation of
	 * fileroot and ".bin".
	 */
	char *binfile;

	/* Fileroot is the pttfile filename, but with a trailing file
	 * extension removed.  It is used to create files based on the
	 * pttfile and is also used to create the .pt and .exp files
	 * during the parsing step.
	 */
	char *fileroot;

	/* The list of files that are encountered while parsing the
	 * lstfile.
	 */
	struct file_list *fl;

	/* State of the current assembly file, while parsing the
	 * lstfile.
	 */
	struct state *st_asm;

	/* Current line number in the lstfile.  */
	int lst_curr_line;

	/* The list of labels found in the lstfile.  */
	struct label *l;
};

/* Allocates a new yasm container with @pttfile.
 *
 * Returns a non-NULL yasm container object on success; NULL otherwise.
 */
extern struct yasm *yasm_alloc(const char *pttfile);

/* Deallocates and clears all field of @y.
 * If @y is the NULL pointer, nothing happens.
 */
extern void yasm_free(struct yasm *y);

/* Assembles the pttfile with yasm and parses all labels.
 *
 * Returns 0 on success; a negative enum errcode otherwise.
 */
extern int yasm_parse(struct yasm *y);

/* Looks up @labelname and stores its address in @addr if found.
 *
 * Returns 0 on success; a negative enum errcode otherwise.
 */
extern int yasm_lookup_label(const struct yasm *y, uint64_t *addr,
			     const char *labelname);

/* Looks up the special section label "section_@name_@attribute" and stores
 * its value in @value if found.
 *
 * Valid attributes are:
 *
 * - start    the section's start address in the binary file
 * - vstart   the section's virtual load address
 * - length   the section's size in bytes
 *
 * Returns 0 on success; a negative enum errcode otherwise.
 */
extern int yasm_lookup_section_label(const struct yasm *y, const char *name,
				     const char *attribute, uint64_t *value);

/* Stores the next pt directive in @pd.
 *
 * Returns 0 on success; a negative enum errcode otherwise.
 * Returns -err_internal if @y or @pd is the NULL pointer.
 * Returns -err_no_directive if there is no pt directive left.
 */
extern int yasm_next_pt_directive(struct yasm *y, struct pt_directive *pd);

/* Calls pd_parse for the current file and line.
 *
 * Returns 0 on success; a negative enum errcode otherwise.
 * Returns -err_no_directive if the current source line contains no PT
 * directive.
 */
extern int yasm_pd_parse(struct yasm *y, struct pt_directive *pd);

/* Stores the next line in the asm file into @dest.  The memory behind
 * @dest must be large enough to store @destlen bytes.
 *
 * Returns 0 on success; a negative enum errcode otherwise.
 * Returns -err_internal if @y is the NULL pointer or @dest is NULL, but
 * @destlen is non-zero.
 */
extern int yasm_next_line(struct yasm *y, char *dest, size_t destlen);

/* Prints the error message @s together with errstr[@errcode].  File and
 * line information are printed regarding the current state of @y.
 *
 * Returns 0 on success; a negative enum errcode otherwise.
 * Returns -err_internal if @errcode is not negative.
 */
extern int yasm_print_err(const struct yasm *y, const char *s, int errcode);

#endif /* YASM_H */
