1766f5c51SRuslan Bukin /* 285f87cf4SRuslan Bukin * Copyright (c) 2013-2019, Intel Corporation 3766f5c51SRuslan Bukin * 4766f5c51SRuslan Bukin * Redistribution and use in source and binary forms, with or without 5766f5c51SRuslan Bukin * modification, are permitted provided that the following conditions are met: 6766f5c51SRuslan Bukin * 7766f5c51SRuslan Bukin * * Redistributions of source code must retain the above copyright notice, 8766f5c51SRuslan Bukin * this list of conditions and the following disclaimer. 9766f5c51SRuslan Bukin * * Redistributions in binary form must reproduce the above copyright notice, 10766f5c51SRuslan Bukin * this list of conditions and the following disclaimer in the documentation 11766f5c51SRuslan Bukin * and/or other materials provided with the distribution. 12766f5c51SRuslan Bukin * * Neither the name of Intel Corporation nor the names of its contributors 13766f5c51SRuslan Bukin * may be used to endorse or promote products derived from this software 14766f5c51SRuslan Bukin * without specific prior written permission. 15766f5c51SRuslan Bukin * 16766f5c51SRuslan Bukin * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 17766f5c51SRuslan Bukin * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 18766f5c51SRuslan Bukin * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 19766f5c51SRuslan Bukin * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE 20766f5c51SRuslan Bukin * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 21766f5c51SRuslan Bukin * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 22766f5c51SRuslan Bukin * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 23766f5c51SRuslan Bukin * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 24766f5c51SRuslan Bukin * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 25766f5c51SRuslan Bukin * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 26766f5c51SRuslan Bukin * POSSIBILITY OF SUCH DAMAGE. 27766f5c51SRuslan Bukin */ 28766f5c51SRuslan Bukin 29766f5c51SRuslan Bukin #ifndef PT_EVENT_QUEUE_H 30766f5c51SRuslan Bukin #define PT_EVENT_QUEUE_H 31766f5c51SRuslan Bukin 32766f5c51SRuslan Bukin #include "intel-pt.h" 33766f5c51SRuslan Bukin 34766f5c51SRuslan Bukin #include <stdint.h> 35766f5c51SRuslan Bukin 36766f5c51SRuslan Bukin 37766f5c51SRuslan Bukin /* Events are grouped by the packet the event binds to. */ 38766f5c51SRuslan Bukin enum pt_event_binding { 39766f5c51SRuslan Bukin evb_psbend, 40766f5c51SRuslan Bukin evb_tip, 41766f5c51SRuslan Bukin evb_fup, 42766f5c51SRuslan Bukin 43766f5c51SRuslan Bukin evb_max 44766f5c51SRuslan Bukin }; 45766f5c51SRuslan Bukin 46766f5c51SRuslan Bukin enum { 47766f5c51SRuslan Bukin /* The maximal number of pending events - should be a power of two. */ 48766f5c51SRuslan Bukin evq_max = 8 49766f5c51SRuslan Bukin }; 50766f5c51SRuslan Bukin 51766f5c51SRuslan Bukin /* A queue of events. */ 52766f5c51SRuslan Bukin struct pt_event_queue { 53766f5c51SRuslan Bukin /* A collection of event queues, one per binding. */ 54766f5c51SRuslan Bukin struct pt_event queue[evb_max][evq_max]; 55766f5c51SRuslan Bukin 56766f5c51SRuslan Bukin /* The begin and end indices for the above event queues. */ 57766f5c51SRuslan Bukin uint8_t begin[evb_max]; 58766f5c51SRuslan Bukin uint8_t end[evb_max]; 59766f5c51SRuslan Bukin 60766f5c51SRuslan Bukin /* A standalone event to be published immediately. */ 61766f5c51SRuslan Bukin struct pt_event standalone; 62766f5c51SRuslan Bukin }; 63766f5c51SRuslan Bukin 64766f5c51SRuslan Bukin 65766f5c51SRuslan Bukin /* Initialize (or reset) an event queue. */ 66766f5c51SRuslan Bukin extern void pt_evq_init(struct pt_event_queue *); 67766f5c51SRuslan Bukin 68766f5c51SRuslan Bukin /* Get a standalone event. 69766f5c51SRuslan Bukin * 70766f5c51SRuslan Bukin * Returns a pointer to the standalone event on success. 71766f5c51SRuslan Bukin * Returns NULL if @evq is NULL. 72766f5c51SRuslan Bukin */ 73766f5c51SRuslan Bukin extern struct pt_event *pt_evq_standalone(struct pt_event_queue *evq); 74766f5c51SRuslan Bukin 75766f5c51SRuslan Bukin /* Enqueue an event. 76766f5c51SRuslan Bukin * 77766f5c51SRuslan Bukin * Adds a new event to @evq for binding @evb. 78766f5c51SRuslan Bukin * 79766f5c51SRuslan Bukin * Returns a pointer to the new event on success. 80766f5c51SRuslan Bukin * Returns NULL if @evq is NULL or @evb is invalid. 81766f5c51SRuslan Bukin * Returns NULL if @evq is full. 82766f5c51SRuslan Bukin */ 83766f5c51SRuslan Bukin extern struct pt_event *pt_evq_enqueue(struct pt_event_queue *evq, 84766f5c51SRuslan Bukin enum pt_event_binding evb); 85766f5c51SRuslan Bukin 86766f5c51SRuslan Bukin 87766f5c51SRuslan Bukin /* Dequeue an event. 88766f5c51SRuslan Bukin * 89766f5c51SRuslan Bukin * Removes the first event for binding @evb from @evq. 90766f5c51SRuslan Bukin * 91766f5c51SRuslan Bukin * Returns a pointer to the dequeued event on success. 92766f5c51SRuslan Bukin * Returns NULL if @evq is NULL or @evb is invalid. 93766f5c51SRuslan Bukin * Returns NULL if @evq is empty. 94766f5c51SRuslan Bukin */ 95766f5c51SRuslan Bukin extern struct pt_event *pt_evq_dequeue(struct pt_event_queue *evq, 96766f5c51SRuslan Bukin enum pt_event_binding evb); 97766f5c51SRuslan Bukin 98766f5c51SRuslan Bukin /* Clear a queue and discard events. 99766f5c51SRuslan Bukin * 100766f5c51SRuslan Bukin * Removes all events for binding @evb from @evq. 101766f5c51SRuslan Bukin * 102766f5c51SRuslan Bukin * Returns zero on success, a negative error code otherwise. 103766f5c51SRuslan Bukin * Returns -pte_internal if @evq is NULL or @evb is invalid. 104766f5c51SRuslan Bukin */ 105766f5c51SRuslan Bukin extern int pt_evq_clear(struct pt_event_queue *evq, 106766f5c51SRuslan Bukin enum pt_event_binding evb); 107766f5c51SRuslan Bukin 108766f5c51SRuslan Bukin /* Check for emptiness. 109766f5c51SRuslan Bukin * 110766f5c51SRuslan Bukin * Check if @evq for binding @evb is empty. 111766f5c51SRuslan Bukin * 112766f5c51SRuslan Bukin * Returns a positive number if @evq is empty. 113766f5c51SRuslan Bukin * Returns zero if @evq is not empty. 114766f5c51SRuslan Bukin * Returns -pte_internal if @evq is NULL or @evb is invalid. 115766f5c51SRuslan Bukin */ 116766f5c51SRuslan Bukin extern int pt_evq_empty(const struct pt_event_queue *evq, 117766f5c51SRuslan Bukin enum pt_event_binding evb); 118766f5c51SRuslan Bukin 119766f5c51SRuslan Bukin /* Check for non-emptiness. 120766f5c51SRuslan Bukin * 121766f5c51SRuslan Bukin * Check if @evq for binding @evb contains pending events. 122766f5c51SRuslan Bukin * 123766f5c51SRuslan Bukin * Returns a positive number if @evq is not empty. 124766f5c51SRuslan Bukin * Returns zero if @evq is empty. 125766f5c51SRuslan Bukin * Returns -pte_internal if @evq is NULL or @evb is invalid. 126766f5c51SRuslan Bukin */ 127766f5c51SRuslan Bukin extern int pt_evq_pending(const struct pt_event_queue *evq, 128766f5c51SRuslan Bukin enum pt_event_binding evb); 129766f5c51SRuslan Bukin 130766f5c51SRuslan Bukin /* Find an event by type. 131766f5c51SRuslan Bukin * 132766f5c51SRuslan Bukin * Searches @evq for binding @evb for an event of type @evt. 133766f5c51SRuslan Bukin * 134766f5c51SRuslan Bukin * Returns a pointer to the first matching event on success. 135766f5c51SRuslan Bukin * Returns NULL if there is no such event. 136766f5c51SRuslan Bukin * Returns NULL if @evq is NULL. 137766f5c51SRuslan Bukin * Returns NULL if @evb or @evt is invalid. 138766f5c51SRuslan Bukin */ 139766f5c51SRuslan Bukin extern struct pt_event *pt_evq_find(struct pt_event_queue *evq, 140766f5c51SRuslan Bukin enum pt_event_binding evb, 141766f5c51SRuslan Bukin enum pt_event_type evt); 142766f5c51SRuslan Bukin 143766f5c51SRuslan Bukin #endif /* PT_EVENT_QUEUE_H */ 144